@hydra-acp/cli 0.1.187 → 0.1.188

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -23,7 +23,7 @@ var oO=Object.defineProperty;var q=(n,e)=>()=>(n&&(e=n(n=0)),e);var zi=(n,e)=>{f
23
23
  `),process.exit(2)),o[l.slice(0,u)]=l.slice(u+1),d+=2;continue}if(c==="--extends"&&e==="agent"){let l=n[d+1];l===void 0&&(process.stderr.write(`--extends requires an agent id
24
24
  `),process.exit(2)),a=l,d+=2;continue}if(c==="--disabled"&&e!=="agent"){i=!1,d+=1;continue}process.stderr.write(`Unknown flag: ${c}
25
25
  `),process.exit(2)}return{command:r,args:s,env:o,enabled:i,extendsBase:a}}function cF(n){return n.split(/\s+/).filter(e=>e.length>0)}async function Hd(){let n=await tp.readFile(D.config(),"utf8");return JSON.parse(n)}async function My(n){await tp.writeFile(D.config(),JSON.stringify(n,null,2)+`
26
- `,{encoding:"utf8",mode:384})}var vr=q(()=>{"use strict";st();mo();ve();Ld();Nd()});function mt(n){if(!Number.isInteger(n)||n<0||n>15)throw new Error(`ansi() takes 0-15, got ${n}`);return{kind:"ansi",index:n}}function Nn(n,e,t){return{kind:"rgb",r:_y(n),g:_y(e),b:_y(t)}}function Xo(n){let e=n.trim().toLowerCase(),t=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(e);if(t){let s=t[1];return s.length===3?Nn(parseInt(s[0]+s[0],16),parseInt(s[1]+s[1],16),parseInt(s[2]+s[2],16)):Nn(parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16))}let r=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(e);return r?Nn(Number(r[1]),Number(r[2]),Number(r[3])):null}function Ix(n){let e=f=>{let p=[0,95,135,175,215,255],m=0;for(let h=1;h<p.length;h++)Math.abs(p[h]-f)<Math.abs(p[m]-f)&&(m=h);return m},t=[0,95,135,175,215,255],r=e(n.r),s=e(n.g),o=e(n.b),i=16+36*r+6*s+o,a=(t[r]-n.r)**2+(t[s]-n.g)**2+(t[o]-n.b)**2,d=(n.r+n.g+n.b)/3,c=Math.round((d-8)/10);c=Math.max(0,Math.min(23,c));let l=8+c*10;return(l-n.r)**2+(l-n.g)**2+(l-n.b)**2<a?232+c:i}function lF(n){let e=(n.r+n.g+n.b)/3;return e<=4?16:e>=247?231:232+Math.max(0,Math.min(23,Math.round((e-8)/10)))}function Cx(n){if(n===void 0||n.size===0){El=void 0;return}let e=new Map;for(let[t,r]of n)r.kind==="rgb"&&e.set(t,r);El=e.size>0?e:void 0}function Ly(n){let e=El?.get(n);if(e!==void 0)return e;let[t,r,s]=Fy[n];return{kind:"rgb",r:t,g:r,b:s}}function Rx(n,e){let t=Ly(n);return(t.r-e.r)**2+(t.g-e.g)**2+(t.b-e.b)**2}function Ax(n){let e=uF;if(El!==void 0){let s=Fy.map((o,i)=>i).filter(o=>{let i=Ly(o);return Math.max(i.r,i.g,i.b)-Math.min(i.r,i.g,i.b)<=$y});s.length>0&&(e=s)}let t=e[0],r=1/0;for(let s of e){let o=Rx(s,n);o<r&&(r=o,t=s)}return t}function Tx(n){let e=Math.max(n.r,n.g,n.b),t=Math.min(n.r,n.g,n.b);if(e-t<=$y)return Ax(n);if(El!==void 0){let o=Fy.map((i,a)=>a).filter(i=>{let a=Ly(i);return Math.max(a.r,a.g,a.b)-Math.min(a.r,a.g,a.b)>$y});if(o.length>0){let i=o[0],a=1/0;for(let d of o){let c=Rx(d,n);c<a&&(a=c,i=d)}return i}}let r=(e+t)/2,s=(n.r>=r?1:0)|(n.g>=r?2:0)|(n.b>=r?4:0);return e>=fF?s+8:s}function pF(n,e){let t=r=>String(r<8?30+r:90+(r-8));return n.kind==="ansi"?t(n.index):e==="truecolor"?`38;2;${n.r};${n.g};${n.b}`:e==="ansi256"?`38;5;${Ix(n)}`:t(Tx(n))}function hF(n,e,t=!1){let r=s=>String(s<8?40+s:100+(s-8));return n.kind==="ansi"?r(n.index):e==="truecolor"?`48;2;${n.r};${n.g};${n.b}`:e==="ansi256"?`48;5;${t?lF(n):Ix(n)}`:r(t?Ax(n):Tx(n))}function Oy(n){if(n.kind==="ansi")return null;let e=t=>{let r=t/255;return r<=.03928?r/12.92:((r+.055)/1.055)**2.4};return .2126*e(n.r)+.7152*e(n.g)+.0722*e(n.b)}function Ud(n,e=!0){let t=Oy(n);return t===null?e:t<mF}function By(n,e){let t=Oy(n),r=Oy(e);return t===null||r===null?null:(Math.max(t,r)+.05)/(Math.min(t,r)+.05)}function gF(n,e){return n.kind==="ansi"?n:Nn(n.r+(255-n.r)*e,n.g+(255-n.g)*e,n.b+(255-n.b)*e)}function yF(n,e){return n.kind==="ansi"?n:Nn(n.r*(1-e),n.g*(1-e),n.b*(1-e))}function Wd(n,e,t){if(n.kind==="ansi")return n;let r=s=>Ud(n)?gF(n,s):yF(n,s);if(t===void 0)return r(e);for(let s=e;s>.005;s-=.01){let o=r(s),i=By(o,t);if(i===null||i>=wF)return o}return n}var _y,rp,Fy,uF,$y,fF,El,Ny,ea,Ex,Dy,mF,wF,jd=q(()=>{"use strict";_y=n=>Math.max(0,Math.min(255,Math.round(n)));rp="\x1B[";Fy=[[0,0,0],[128,0,0],[0,128,0],[128,128,0],[0,0,128],[128,0,128],[0,128,128],[192,192,192],[128,128,128],[255,0,0],[0,255,0],[255,255,0],[0,0,255],[255,0,255],[0,255,255],[255,255,255]],uF=[0,8,7,15],$y=24,fF=170;Ny=`${rp}39m`,ea=`${rp}49m`,Ex=(n,e)=>`${rp}${pF(n,e)}m`,Dy=(n,e,t=!1)=>`${rp}${hF(n,e,t)}m`;mF=.179;wF=4});function Px(n){let e=n.NO_COLOR;return e!==void 0&&e!==""}function bF(n){let e=n.FORCE_COLOR;if(e!==void 0)switch(e){case"0":case"false":return"none";case"1":return"ansi16";case"2":return"ansi256";case"3":return"truecolor";default:return}}function kF(n){let e=n.FORCE_COLOR;return e!==void 0&&e!=="0"&&e!=="false"}function Hy(n){let e=(n.COLORTERM??"").toLowerCase();if(e==="truecolor"||e==="24bit")return"truecolor";let t=(n.TERM??"").toLowerCase();return t.includes("truecolor")||t.includes("direct")?"truecolor":t.includes("256")?"ansi256":"ansi16"}function Pl(n=process.stdout,e=process.env){if(Px(e))return"none";let t=bF(e);return t!==void 0?t:kF(e)?Hy(e):(e.TERM??"").toLowerCase()==="dumb"||n.isTTY!==!0?"none":Hy(e)}function Mx(n=process.stdout,e=process.env){return Pl(n,e)!=="none"}function vF(n){return _x(n)?(n.TERM??"").toLowerCase().startsWith("screen"):!1}function _x(n){return n.TMUX!==void 0&&n.TMUX!==""}function qd(n,e=process.env){if(Px(e))return"none";let t=n?.esc,r=l=>l!==void 0&&!l.na&&!l.fb,s=r(t?.color24bits)?"truecolor":r(t?.color256)?"ansi256":"ansi16",o=t?.color256?.na===!0?"ansi16":"truecolor",i=Hy(e),a=i==="truecolor"&&vF(e)||_x(e)&&i==="ansi16"?"ansi256":i,d=["none","ansi16","ansi256","truecolor"],c=l=>d.indexOf(l);return d[Math.min(Math.max(c(s),c(a)),c(o))]}function $x(n=process.env){let e=n.COLORFGBG;if(e===void 0||e==="")return;let t=e.split(";").pop()?.trim()??"";if(!/^\d+$/.test(t))return;let r=Number(t);if(!(r>15))return r<=6||r===8?"dark":"light"}var ta=q(()=>{"use strict"});function xF(n,e){let t=`${Ps}49m`;if(e==="truecolor")return{open:`${Ps}48;2;${n};${n};${n}m`,close:t};let r=Math.round(n*25/255),s=r===0?16:r===25?231:r+231;return{open:`${Ps}48;5;${s}m`,close:t}}function Dx(){return xe.fg===void 0?Nx:void 0}function Bx(){return Lx??xe.bg}function Hx(){let n=Bx();if(n===void 0)return IF;let e=Dx();return{user:Wd(n,Ml.user,e),code:Wd(n,Ml.code,e),hoverThought:Wd(n,Ml.hoverThought,e),hoverCode:Wd(n,Ml.hoverCode,e)}}function Uy(n,e){return et(RF(n,e))}function RF(n,e){if(n.kind!=="rgb")return e;let t=[xe.bg,xe.fg,e].filter(i=>i!==void 0),r=i=>{let a=e,d=-1;for(let c of i){let l=By(n,c)??-1;l>d&&(d=l,a=c)}return{color:a,ratio:d}},s=r(t);if(s.ratio>=AF)return s.color;let o=r([...t,Nn(0,0,0),Nn(255,255,255)]);return o.ratio>s.ratio?o.color:s.color}function ip(){return{fg:xe.fg===void 0?[]:[et(xe.fg)],fgStrong:[et(xe.brightWhite)],muted:xe.fg===void 0?[sp]:[sp,et(xe.brightBlack)],subtle:[et(xe.brightBlack)],emphasis:[jy],active:[et(xe.brightYellow)],warn:[et(xe.yellow)],ok:[et(xe.green)],error:[et(xe.brightRed)],errorSoft:[et(xe.red)],cold:[et(xe.brightMagenta)],gitStaged:[et(xe.green)],gitDirty:[et(xe.brightBlue)],gitUntracked:xe.fg===void 0?[sp]:[sp,et(xe.brightBlack)],accent:[et(xe.brightCyan)],info:[et(xe.cyan)],reference:[et(xe.brightBlue)],focus:[et(xe.brightBlue)],selectionBand:[Es(xe.blue)],selection:[Es(xe.blue),Uy(xe.blue,xe.brightWhite)],cursor:[Es(xe.white)],promptCursor:[Es(xe.brightYellow)],match:[Es(xe.brightYellow),Uy(xe.brightYellow,xe.black)],matchActive:[Es(xe.red),Uy(xe.red,xe.brightWhite)],invert:[EF],codeText:[et(xe.white)],syntaxKeyword:[et(xe.brightBlue)],syntaxType:[et(xe.brightCyan)],syntaxBuiltin:[et(xe.cyan)],syntaxLiteral:[et(xe.blue)],syntaxNumber:[et(xe.brightGreen)],syntaxString:[et(xe.yellow)],syntaxRegexp:[et(xe.red)],syntaxComment:[et(xe.brightBlack)],syntaxClass:[et(xe.brightYellow)],syntaxMeta:[et(xe.magenta)],syntaxVariable:[et(xe.white)],diffAdded:[et(xe.brightGreen)],diffRemoved:[et(xe.brightRed)],syntaxDoctag:[et(xe.green)],syntaxEmphasis:[PF],syntaxStrong:[jy],syntaxLink:[MF]}}function Ux(n,e){let t=!1,r=!1,s=n.map(o=>o.kind==="fg"&&e.fg!==void 0?(t=!0,et(e.fg)):o.kind==="bg"&&e.bg!==void 0?(r=!0,Es(e.bg)):(o.kind==="fg"&&(t=!0),o.kind==="bg"&&(r=!0),o));return e.fg!==void 0&&!t&&s.push(et(e.fg)),e.bg!==void 0&&!r&&s.unshift(Es(e.bg)),s}function Wx(n){return n.some(e=>e.kind==="fg")||!n.some(e=>e.kind==="bg")}function qx(n){if(Object.keys(qy).length===0)return n;let e={...n};for(let[t,r]of Object.entries(qy))r===void 0||e[t]===void 0||(e[t]=Ux(e[t],r));return e}function zx(n){n!==$l&&($l=n,Ms=Gy(),op=void 0,na={prose:Jy(),thought:Vy(),revision:na.revision+1})}function zd(n){return n.map(e=>e.open($l)).join("")}function Gy(){let n=zd(z.accent);return{code:n,codeQuiet:zd(z.info),link:n+Kd,thoughtBase:zd(z.subtle)}}function Jy(){return{codeOpen:Ms.code,linkOpen:Ms.link,base:zd(z.fg)}}function Vy(){return{codeOpen:Ms.codeQuiet,linkOpen:Ms.link,base:Ms.thoughtBase}}function Kx(){return na.prose}function Gx(){return na.thought}function ap(n){return{codeOpen:n==="heading-2"?zd(z.active):Ms.code,linkOpen:Ms.link,base:Gd(n,$l).open}}function Ox(n,e){return{open:n.map(t=>t.open(e)).join(""),close:n.slice().reverse().map(t=>t.close).join("")}}function Jx(){return{user:{band:_l.user,layers:[...z.emphasis]},agent:{layers:[...z.fg],inlineSgr:!0},thought:{layers:[...z.subtle],inlineSgr:!0},tool:{layers:[...z.reference]},"tool-status-ok":{layers:[...z.muted]},"tool-status-pending":{layers:[...z.muted]},"tool-status-cancelled":{layers:[...z.muted]},"tool-status-running":{layers:[...z.active]},"tool-status-fail":{layers:[...z.emphasis,...z.errorSoft]},plan:{layers:[...z.active],inlineSgr:!0},"plan-done":{layers:[...z.ok],inlineSgr:!0},"plan-pending":{layers:[...z.muted],inlineSgr:!0},"local-heading":{layers:[...z.emphasis]},"local-item":{layers:[...z.info]},notice:{layers:[...z.info]},"notice-ok":{layers:[...z.ok]},"notice-error":{layers:[...z.errorSoft]},metric:{layers:[...z.info]},muted:{layers:[...z.muted]},"tool-output":{layers:[...z.muted]},"status-ready":{layers:[...z.fg]},"status-active":{layers:[...z.active]},"status-blocked":{layers:[...z.warn]},"status-queued":{layers:[...z.active]},"status-alert":{layers:[...z.error]},"status-cold":{layers:[...z.cold]},"git-staged":{layers:[...z.gitStaged]},"git-dirty":{layers:[...z.gitDirty]},"git-untracked":{layers:[...z.gitUntracked]},"file-path":{layers:[...z.reference]},"meter-fill":{layers:[...z.ok]},"meter-warn":{layers:[...z.emphasis,...z.errorSoft]},"sidebar-rule":{layers:[...z.muted]},"sidebar-title":{layers:[...z.muted]},"sidebar-value":{layers:[...z.fg]},"status-idle":{layers:[...z.muted]},"box-border":{layers:[...z.muted]},"box-border-focused":{layers:[...z.focus]},"box-border-hover":{layers:[...z.muted,...z.emphasis]},"box-border-focused-hover":{layers:[...z.focus,...z.emphasis]},"box-title":{layers:[...z.accent]},"modal-title":{layers:[...z.fgStrong,...z.emphasis]},"modal-label":{layers:[...z.muted]},"modal-value":{layers:[...z.fgStrong]},"modal-note":{layers:[...z.active]},"modal-error":{layers:[...z.error]},"modal-hint":{layers:[...z.muted]},"modal-status":{layers:[...z.muted]},"modal-key":{layers:[...z.accent]},"input-error":{layers:[...z.errorSoft]},"input-cursor":{layers:[...z.cursor]},"prompt-text":{layers:[...z.active]},"prompt-cursor":{layers:[...z.promptCursor]},"prompt-destructive":{layers:[...z.error]},"list-selected":{layers:[...z.selection]},"list-description":{layers:[...z.muted]},"list-header":{layers:[...z.muted]},"modal-option":{layers:[...z.muted]},"modal-option-selected":{layers:[...z.active]},"bar-text":{layers:[...z.emphasis]},"bar-indicator":{layers:[...z.accent]},rule:{layers:[...z.emphasis]},"rule-pad":{layers:[...z.muted]},"rule-meta":{layers:[...z.muted]},"hint-hover":{layers:[...z.fg]},"completion-name":{layers:[...z.accent]},"completion-desc":{layers:[...z.muted]},attachment:{layers:[...z.warn]},"queue-row":{layers:[...z.selection]},"queue-cursor":{layers:[...z.selection,jy]},"queue-blank":{layers:[...z.selectionBand]},"composer-gutter":{layers:[...z.fgStrong]},"composer-inactive":{layers:[...z.muted]},"composer-continuation":{layers:[...z.muted]},"syntax-addition":{layers:[...z.diffAdded]},"syntax-attr":{layers:[...z.syntaxBuiltin]},"syntax-attribute":{layers:[...z.syntaxBuiltin]},"syntax-built_in":{layers:[...z.syntaxBuiltin]},"syntax-builtin-name":{layers:[...z.fg]},"syntax-bullet":{layers:[...z.fg]},"syntax-class":{layers:[...z.syntaxClass]},"syntax-code":{layers:[...z.fg]},"syntax-comment":{layers:[...z.syntaxComment]},"syntax-default":{layers:[...z.fg]},"syntax-deletion":{layers:[...z.diffRemoved]},"syntax-doctag":{layers:[...z.syntaxDoctag]},"syntax-emphasis":{layers:[...z.syntaxEmphasis]},"syntax-formula":{layers:[...z.fg]},"syntax-function":{layers:[...z.syntaxString]},"syntax-keyword":{layers:[...z.syntaxKeyword]},"syntax-link":{layers:[...z.syntaxLink]},"syntax-literal":{layers:[...z.syntaxLiteral]},"syntax-meta":{layers:[...z.syntaxMeta]},"syntax-meta-keyword":{layers:[...z.fg]},"syntax-meta-string":{layers:[...z.fg]},"syntax-name":{layers:[...z.syntaxType]},"syntax-number":{layers:[...z.syntaxNumber]},"syntax-params":{layers:[...z.syntaxVariable]},"syntax-quote":{layers:[...z.fg]},"syntax-regexp":{layers:[...z.syntaxRegexp]},"syntax-section":{layers:[...z.syntaxBuiltin]},"syntax-selector-attr":{layers:[...z.fg]},"syntax-selector-class":{layers:[...z.fg]},"syntax-selector-id":{layers:[...z.fg]},"syntax-selector-pseudo":{layers:[...z.fg]},"syntax-selector-tag":{layers:[...z.fg]},"syntax-string":{layers:[...z.syntaxString]},"syntax-strong":{layers:[...z.syntaxStrong]},"syntax-subst":{layers:[...z.fg]},"syntax-symbol":{layers:[...z.syntaxMeta]},"syntax-tag":{layers:[...z.syntaxBuiltin]},"syntax-template-tag":{layers:[...z.fg]},"syntax-template-variable":{layers:[...z.fg]},"syntax-title":{layers:[...z.syntaxString]},"syntax-type":{layers:[...z.syntaxType]},"syntax-variable":{layers:[...z.syntaxVariable]},content:{layers:[...z.fg]},"cli-warn":{layers:[...z.warn]},code:{band:_l.code,layers:[...z.codeText]},"heading-1":{layers:[...z.emphasis,...z.active],inlineSgr:!0},"heading-2":{layers:[...z.emphasis,...z.accent],inlineSgr:!0},"heading-3":{layers:[...z.emphasis],inlineSgr:!0},"search-highlight":{layers:[...z.match]},"search-highlight-active":{layers:[...z.matchActive]},"selection-highlight":{layers:[...z.invert]}}}function Yy(n,e={}){xe=n,qy=e.roles??{},jx=e.elements??{},Lx=e.background,Nx=e.foreground,_l=Hx(),z=qx(ip()),Ms=Gy(),Fl=Jx(),op=void 0,na={prose:Jy(),thought:Vy(),revision:na.revision+1}}function Vx(){return Object.keys(ip()).sort()}function Yx(){return Object.keys(Fl).sort()}function Qx(n){let t=ip()[n];return t===void 0?!0:Wx(t)}function Xx(n){let e=Fl[n];return e===void 0||e.band!==void 0?!0:Wx(e.layers??[])}function Zx(){return na.revision}function eI(){return op??=$F(),op}function zy(n){return typeof n=="number"?{open:e=>xF(n,e).open,close:ea,kind:"bg"}:TF(n)}function Gd(n,e){if(e==="none")return Wy;if(n===void 0)return z.fg.length===0?Wy:{...Ox(z.fg,e),inlineSgr:!1};let t=Fl[n];if(t===void 0)return Wy;let r=[],s=jx[n];return t.band!==void 0&&r.push(s?.bg!==void 0?Es(s.bg):zy(t.band)),t.layers&&r.push(...t.layers),s!==void 0&&(r=Ux(r,t.band!==void 0?{fg:s.fg}:s)),z.fg.length>0&&!r.some(o=>o.kind==="fg")&&((t.layers??[]).some(i=>i.kind==="bg")||r.push(...z.fg)),{...Ox(r,e),inlineSgr:t.inlineSgr===!0}}function tI(n){return n===void 0?!1:Fl[n]?.inlineSgr===!0}function B(n,e,t){t.length!==0&&n.noFormat(sa(e,t,qd(n)))}function sa(n,e,t="ansi256"){let r=Gd(n,t);return r.open+e+r.close}function $F(){let n=zd(z.codeText),e={};for(let t of _F){let{open:r,close:s}=Gd(t,$l),o=t.slice(7);if(r===""){e[o]=a=>a;continue}let i=s.split(Ny).join(n);e[o]=a=>r+a+i}return e}function FF(n){let e=Bx();if(e===void 0)return CF;let t=Es(Wd(e,Ml.hoverRow,Dx()));return{open:t.open(n),close:t.close}}function Fx(n,e){return n.split(ns).join(ns+e)}function nI(n,e){if(n===void 0)return;if(n==="thought"){let s=zy(_l.hoverThought).open(e);return{open:s,close:ea,inlineSgr:!0,transform:o=>Fx(o.split(Ms.thoughtBase).join(`${Ps}39m`),s)}}if(n==="code")return{open:zy(_l.hoverCode).open(e),close:ea,inlineSgr:!1};if(!OF.has(n))return;let t=Gd(n,e),r=FF(e);return{open:r.open+t.open,close:t.close+r.close,inlineSgr:t.inlineSgr,transform:t.inlineSgr?s=>Fx(s,r.open):void 0}}var SF,Ps,ra,xe,Ml,IF,Lx,Nx,CF,_l,AF,et,Es,TF,Ol,jy,sp,EF,PF,MF,qy,jx,z,$l,ns,Ky,Kd,Ms,Fl,na,op,Wy,_F,OF,Tn=q(()=>{"use strict";jd();ta();SF="\x1B",Ps=`${SF}[`;ra={black:mt(0),red:mt(1),green:mt(2),yellow:mt(3),blue:mt(4),magenta:mt(5),cyan:mt(6),white:mt(7),brightBlack:mt(8),brightRed:mt(9),brightGreen:mt(10),brightYellow:mt(11),brightBlue:mt(12),brightMagenta:mt(13),brightCyan:mt(14),brightWhite:mt(15)},xe=ra,Ml={user:.17,code:.11,hoverThought:.1,hoverRow:.19,hoverCode:.2},IF={user:43,code:28,hoverThought:25,hoverCode:48};CF={open:`${Ps}48;5;236m`,close:ea},_l=Hx();AF=3,et=n=>({open:e=>Ex(n,e),close:Ny,kind:"fg"}),Es=n=>({open:e=>Dy(n,e),close:ea,kind:"bg"}),TF=n=>({open:e=>Dy(n,e,!0),close:ea,kind:"bg"}),Ol=(n,e)=>({open:()=>`${Ps}${n}m`,close:`${Ps}${e}m`,kind:"attr"}),jy=Ol(1,22),sp=Ol(2,22),EF=Ol(7,27),PF=Ol(3,23),MF=Ol(4,24);qy={},jx={};z=qx(ip()),$l="ansi256";ns=`${Ps}0m`,Ky=`${Ps}1m`,Kd=`${Ps}4m`;Ms=Gy();Fl=Jx(),na={prose:Jy(),thought:Vy(),revision:0};Wy={open:"",close:"",inlineSgr:!1};_F=["syntax-addition","syntax-attr","syntax-attribute","syntax-built_in","syntax-builtin-name","syntax-bullet","syntax-class","syntax-code","syntax-comment","syntax-default","syntax-deletion","syntax-doctag","syntax-emphasis","syntax-formula","syntax-function","syntax-keyword","syntax-link","syntax-literal","syntax-meta","syntax-meta-keyword","syntax-meta-string","syntax-name","syntax-number","syntax-params","syntax-quote","syntax-regexp","syntax-section","syntax-selector-attr","syntax-selector-class","syntax-selector-id","syntax-selector-pseudo","syntax-selector-tag","syntax-string","syntax-strong","syntax-subst","syntax-symbol","syntax-tag","syntax-template-tag","syntax-template-variable","syntax-title","syntax-type","syntax-variable"];OF=new Set(["muted","tool-output","status-idle","tool","tool-status-ok","tool-status-pending","tool-status-cancelled","tool-status-running","tool-status-fail","plan","plan-done","plan-pending"])});function dp(n,e){return n?{...e??{},[oI]:n}:e}function Ll(n){iI=n?[...n]:[]}function BF(n,e){return e.endsWith("*")?n.startsWith(e.slice(0,-1)):n===e}function HF(){return[...DF,...iI]}function Jd(n=process.env){let e=HF(),t={};for(let[r,s]of Object.entries(n))s!==void 0&&(e.some(o=>BF(r,o))||(t[r]=s));return t}var LF,oI,NF,DF,iI,Vd=q(()=>{"use strict";LF={herdr:["HERDR_PANE_ID","HERDR_TAB_ID","HERDR_WORKSPACE_ID","HERDR_STARTUP_CWD"],tmux:["TMUX_PANE"],zellij:["ZELLIJ_PANE_ID","ZELLIJ_SESSION_NAME"],wezterm:["WEZTERM_PANE"],kitty:["KITTY_WINDOW_ID"],screen:["STY"],iterm2:["ITERM_SESSION_ID"],paseo:["PASEO_TERMINAL_ID","PASEO_ACTIVITY_TOKEN"],hydra:["HYDRA_TAB_LABEL"]},oI="HYDRA_ACP_SESSION",NF=[oI],DF=[...Object.values(LF).flat(),...NF];iI=[]});import*as mI from"fs";import*as Dn from"fs/promises";import*as Zo from"path";import{spawn as gI}from"child_process";import{Readable as KF}from"stream";function Sr(){let n=process.platform==="darwin"?"darwin":process.platform==="linux"?"linux":process.platform==="win32"?"windows":void 0,e=process.arch==="arm64"?"aarch64":process.arch==="x64"?"x86_64":void 0;if(!(!n||!e))return`${n}-${e}`}function tw(n,e=Sr()){if(e)return n[e]}function nw(n){Yd=n??(e=>process.stderr.write(e+`
26
+ `,{encoding:"utf8",mode:384})}var vr=q(()=>{"use strict";st();mo();ve();Ld();Nd()});function mt(n){if(!Number.isInteger(n)||n<0||n>15)throw new Error(`ansi() takes 0-15, got ${n}`);return{kind:"ansi",index:n}}function Nn(n,e,t){return{kind:"rgb",r:_y(n),g:_y(e),b:_y(t)}}function Xo(n){let e=n.trim().toLowerCase(),t=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(e);if(t){let s=t[1];return s.length===3?Nn(parseInt(s[0]+s[0],16),parseInt(s[1]+s[1],16),parseInt(s[2]+s[2],16)):Nn(parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16))}let r=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(e);return r?Nn(Number(r[1]),Number(r[2]),Number(r[3])):null}function Ix(n){let e=f=>{let p=[0,95,135,175,215,255],m=0;for(let h=1;h<p.length;h++)Math.abs(p[h]-f)<Math.abs(p[m]-f)&&(m=h);return m},t=[0,95,135,175,215,255],r=e(n.r),s=e(n.g),o=e(n.b),i=16+36*r+6*s+o,a=(t[r]-n.r)**2+(t[s]-n.g)**2+(t[o]-n.b)**2,d=(n.r+n.g+n.b)/3,c=Math.round((d-8)/10);c=Math.max(0,Math.min(23,c));let l=8+c*10;return(l-n.r)**2+(l-n.g)**2+(l-n.b)**2<a?232+c:i}function lF(n){let e=(n.r+n.g+n.b)/3;return e<=4?16:e>=247?231:232+Math.max(0,Math.min(23,Math.round((e-8)/10)))}function Cx(n){if(n===void 0||n.size===0){El=void 0;return}let e=new Map;for(let[t,r]of n)r.kind==="rgb"&&e.set(t,r);El=e.size>0?e:void 0}function Ly(n){let e=El?.get(n);if(e!==void 0)return e;let[t,r,s]=Fy[n];return{kind:"rgb",r:t,g:r,b:s}}function Rx(n,e){let t=Ly(n);return(t.r-e.r)**2+(t.g-e.g)**2+(t.b-e.b)**2}function Ax(n){let e=uF;if(El!==void 0){let s=Fy.map((o,i)=>i).filter(o=>{let i=Ly(o);return Math.max(i.r,i.g,i.b)-Math.min(i.r,i.g,i.b)<=$y});s.length>0&&(e=s)}let t=e[0],r=1/0;for(let s of e){let o=Rx(s,n);o<r&&(r=o,t=s)}return t}function Tx(n){let e=Math.max(n.r,n.g,n.b),t=Math.min(n.r,n.g,n.b);if(e-t<=$y)return Ax(n);if(El!==void 0){let o=Fy.map((i,a)=>a).filter(i=>{let a=Ly(i);return Math.max(a.r,a.g,a.b)-Math.min(a.r,a.g,a.b)>$y});if(o.length>0){let i=o[0],a=1/0;for(let d of o){let c=Rx(d,n);c<a&&(a=c,i=d)}return i}}let r=(e+t)/2,s=(n.r>=r?1:0)|(n.g>=r?2:0)|(n.b>=r?4:0);return e>=fF?s+8:s}function pF(n,e){let t=r=>String(r<8?30+r:90+(r-8));return n.kind==="ansi"?t(n.index):e==="truecolor"?`38;2;${n.r};${n.g};${n.b}`:e==="ansi256"?`38;5;${Ix(n)}`:t(Tx(n))}function hF(n,e,t=!1){let r=s=>String(s<8?40+s:100+(s-8));return n.kind==="ansi"?r(n.index):e==="truecolor"?`48;2;${n.r};${n.g};${n.b}`:e==="ansi256"?`48;5;${t?lF(n):Ix(n)}`:r(t?Ax(n):Tx(n))}function Oy(n){if(n.kind==="ansi")return null;let e=t=>{let r=t/255;return r<=.03928?r/12.92:((r+.055)/1.055)**2.4};return .2126*e(n.r)+.7152*e(n.g)+.0722*e(n.b)}function Ud(n,e=!0){let t=Oy(n);return t===null?e:t<mF}function By(n,e){let t=Oy(n),r=Oy(e);return t===null||r===null?null:(Math.max(t,r)+.05)/(Math.min(t,r)+.05)}function gF(n,e){return n.kind==="ansi"?n:Nn(n.r+(255-n.r)*e,n.g+(255-n.g)*e,n.b+(255-n.b)*e)}function yF(n,e){return n.kind==="ansi"?n:Nn(n.r*(1-e),n.g*(1-e),n.b*(1-e))}function Wd(n,e,t){if(n.kind==="ansi")return n;let r=s=>Ud(n)?gF(n,s):yF(n,s);if(t===void 0)return r(e);for(let s=e;s>.005;s-=.01){let o=r(s),i=By(o,t);if(i===null||i>=wF)return o}return n}var _y,rp,Fy,uF,$y,fF,El,Ny,ea,Ex,Dy,mF,wF,jd=q(()=>{"use strict";_y=n=>Math.max(0,Math.min(255,Math.round(n)));rp="\x1B[";Fy=[[0,0,0],[128,0,0],[0,128,0],[128,128,0],[0,0,128],[128,0,128],[0,128,128],[192,192,192],[128,128,128],[255,0,0],[0,255,0],[255,255,0],[0,0,255],[255,0,255],[0,255,255],[255,255,255]],uF=[0,8,7,15],$y=24,fF=170;Ny=`${rp}39m`,ea=`${rp}49m`,Ex=(n,e)=>`${rp}${pF(n,e)}m`,Dy=(n,e,t=!1)=>`${rp}${hF(n,e,t)}m`;mF=.179;wF=4});function Px(n){let e=n.NO_COLOR;return e!==void 0&&e!==""}function bF(n){let e=n.FORCE_COLOR;if(e!==void 0)switch(e){case"0":case"false":return"none";case"1":return"ansi16";case"2":return"ansi256";case"3":return"truecolor";default:return}}function kF(n){let e=n.FORCE_COLOR;return e!==void 0&&e!=="0"&&e!=="false"}function Hy(n){let e=(n.COLORTERM??"").toLowerCase();if(e==="truecolor"||e==="24bit")return"truecolor";let t=(n.TERM??"").toLowerCase();return t.includes("truecolor")||t.includes("direct")?"truecolor":t.includes("256")?"ansi256":"ansi16"}function Pl(n=process.stdout,e=process.env){if(Px(e))return"none";let t=bF(e);return t!==void 0?t:kF(e)?Hy(e):(e.TERM??"").toLowerCase()==="dumb"||n.isTTY!==!0?"none":Hy(e)}function Mx(n=process.stdout,e=process.env){return Pl(n,e)!=="none"}function vF(n){return _x(n)?(n.TERM??"").toLowerCase().startsWith("screen"):!1}function _x(n){return n.TMUX!==void 0&&n.TMUX!==""}function qd(n,e=process.env){if(Px(e))return"none";let t=n?.esc,r=l=>l!==void 0&&!l.na&&!l.fb,s=r(t?.color24bits)?"truecolor":r(t?.color256)?"ansi256":"ansi16",o=t?.color256?.na===!0?"ansi16":"truecolor",i=Hy(e),a=i==="truecolor"&&vF(e)||_x(e)&&i==="ansi16"?"ansi256":i,d=["none","ansi16","ansi256","truecolor"],c=l=>d.indexOf(l);return d[Math.min(Math.max(c(s),c(a)),c(o))]}function $x(n=process.env){let e=n.COLORFGBG;if(e===void 0||e==="")return;let t=e.split(";").pop()?.trim()??"";if(!/^\d+$/.test(t))return;let r=Number(t);if(!(r>15))return r<=6||r===8?"dark":"light"}var ta=q(()=>{"use strict"});function xF(n,e){let t=`${Ps}49m`;if(e==="truecolor")return{open:`${Ps}48;2;${n};${n};${n}m`,close:t};let r=Math.round(n*25/255),s=r===0?16:r===25?231:r+231;return{open:`${Ps}48;5;${s}m`,close:t}}function Dx(){return Ie.fg===void 0?Nx:void 0}function Bx(){return Lx??Ie.bg}function Hx(){let n=Bx();if(n===void 0)return IF;let e=Dx();return{user:Wd(n,Ml.user,e),code:Wd(n,Ml.code,e),hoverThought:Wd(n,Ml.hoverThought,e),hoverCode:Wd(n,Ml.hoverCode,e)}}function Uy(n,e){return et(RF(n,e))}function RF(n,e){if(n.kind!=="rgb")return e;let t=[Ie.bg,Ie.fg,e].filter(i=>i!==void 0),r=i=>{let a=e,d=-1;for(let c of i){let l=By(n,c)??-1;l>d&&(d=l,a=c)}return{color:a,ratio:d}},s=r(t);if(s.ratio>=AF)return s.color;let o=r([...t,Nn(0,0,0),Nn(255,255,255)]);return o.ratio>s.ratio?o.color:s.color}function ip(){return{fg:Ie.fg===void 0?[]:[et(Ie.fg)],fgStrong:[et(Ie.brightWhite)],muted:Ie.fg===void 0?[sp]:[sp,et(Ie.brightBlack)],subtle:[et(Ie.brightBlack)],emphasis:[jy],active:[et(Ie.brightYellow)],warn:[et(Ie.yellow)],ok:[et(Ie.green)],error:[et(Ie.brightRed)],errorSoft:[et(Ie.red)],cold:[et(Ie.brightMagenta)],gitStaged:[et(Ie.green)],gitDirty:[et(Ie.brightBlue)],gitUntracked:Ie.fg===void 0?[sp]:[sp,et(Ie.brightBlack)],accent:[et(Ie.brightCyan)],info:[et(Ie.cyan)],reference:[et(Ie.brightBlue)],focus:[et(Ie.brightBlue)],selectionBand:[Es(Ie.blue)],selection:[Es(Ie.blue),Uy(Ie.blue,Ie.brightWhite)],cursor:[Es(Ie.white)],promptCursor:[Es(Ie.brightYellow)],match:[Es(Ie.brightYellow),Uy(Ie.brightYellow,Ie.black)],matchActive:[Es(Ie.red),Uy(Ie.red,Ie.brightWhite)],invert:[EF],codeText:[et(Ie.white)],syntaxKeyword:[et(Ie.brightBlue)],syntaxType:[et(Ie.brightCyan)],syntaxBuiltin:[et(Ie.cyan)],syntaxLiteral:[et(Ie.blue)],syntaxNumber:[et(Ie.brightGreen)],syntaxString:[et(Ie.yellow)],syntaxRegexp:[et(Ie.red)],syntaxComment:[et(Ie.brightBlack)],syntaxClass:[et(Ie.brightYellow)],syntaxMeta:[et(Ie.magenta)],syntaxVariable:[et(Ie.white)],diffAdded:[et(Ie.brightGreen)],diffRemoved:[et(Ie.brightRed)],syntaxDoctag:[et(Ie.green)],syntaxEmphasis:[PF],syntaxStrong:[jy],syntaxLink:[MF]}}function Ux(n,e){let t=!1,r=!1,s=n.map(o=>o.kind==="fg"&&e.fg!==void 0?(t=!0,et(e.fg)):o.kind==="bg"&&e.bg!==void 0?(r=!0,Es(e.bg)):(o.kind==="fg"&&(t=!0),o.kind==="bg"&&(r=!0),o));return e.fg!==void 0&&!t&&s.push(et(e.fg)),e.bg!==void 0&&!r&&s.unshift(Es(e.bg)),s}function Wx(n){return n.some(e=>e.kind==="fg")||!n.some(e=>e.kind==="bg")}function qx(n){if(Object.keys(qy).length===0)return n;let e={...n};for(let[t,r]of Object.entries(qy))r===void 0||e[t]===void 0||(e[t]=Ux(e[t],r));return e}function zx(n){n!==$l&&($l=n,Ms=Gy(),op=void 0,na={prose:Jy(),thought:Vy(),revision:na.revision+1})}function zd(n){return n.map(e=>e.open($l)).join("")}function Gy(){let n=zd(z.accent);return{code:n,codeQuiet:zd(z.info),link:n+Kd,thoughtBase:zd(z.subtle)}}function Jy(){return{codeOpen:Ms.code,linkOpen:Ms.link,base:zd(z.fg)}}function Vy(){return{codeOpen:Ms.codeQuiet,linkOpen:Ms.link,base:Ms.thoughtBase}}function Kx(){return na.prose}function Gx(){return na.thought}function ap(n){return{codeOpen:n==="heading-2"?zd(z.active):Ms.code,linkOpen:Ms.link,base:Gd(n,$l).open}}function Ox(n,e){return{open:n.map(t=>t.open(e)).join(""),close:n.slice().reverse().map(t=>t.close).join("")}}function Jx(){return{user:{band:_l.user,layers:[...z.emphasis]},agent:{layers:[...z.fg],inlineSgr:!0},thought:{layers:[...z.subtle],inlineSgr:!0},tool:{layers:[...z.reference]},"tool-status-ok":{layers:[...z.muted]},"tool-status-pending":{layers:[...z.muted]},"tool-status-cancelled":{layers:[...z.muted]},"tool-status-running":{layers:[...z.active]},"tool-status-fail":{layers:[...z.emphasis,...z.errorSoft]},plan:{layers:[...z.active],inlineSgr:!0},"plan-done":{layers:[...z.ok],inlineSgr:!0},"plan-pending":{layers:[...z.muted],inlineSgr:!0},"local-heading":{layers:[...z.emphasis]},"local-item":{layers:[...z.info]},notice:{layers:[...z.info]},"notice-ok":{layers:[...z.ok]},"notice-error":{layers:[...z.errorSoft]},metric:{layers:[...z.info]},muted:{layers:[...z.muted]},"tool-output":{layers:[...z.muted]},"status-ready":{layers:[...z.fg]},"status-active":{layers:[...z.active]},"status-blocked":{layers:[...z.warn]},"status-queued":{layers:[...z.active]},"status-alert":{layers:[...z.error]},"status-cold":{layers:[...z.cold]},"git-staged":{layers:[...z.gitStaged]},"git-dirty":{layers:[...z.gitDirty]},"git-untracked":{layers:[...z.gitUntracked]},"file-path":{layers:[...z.reference]},"meter-fill":{layers:[...z.ok]},"meter-warn":{layers:[...z.emphasis,...z.errorSoft]},"sidebar-rule":{layers:[...z.muted]},"sidebar-title":{layers:[...z.muted]},"sidebar-value":{layers:[...z.fg]},"status-idle":{layers:[...z.muted]},"box-border":{layers:[...z.muted]},"box-border-focused":{layers:[...z.focus]},"box-border-hover":{layers:[...z.muted,...z.emphasis]},"box-border-focused-hover":{layers:[...z.focus,...z.emphasis]},"box-title":{layers:[...z.accent]},"modal-title":{layers:[...z.fgStrong,...z.emphasis]},"modal-label":{layers:[...z.muted]},"modal-value":{layers:[...z.fgStrong]},"modal-note":{layers:[...z.active]},"modal-error":{layers:[...z.error]},"modal-hint":{layers:[...z.muted]},"modal-status":{layers:[...z.muted]},"modal-key":{layers:[...z.accent]},"input-error":{layers:[...z.errorSoft]},"input-cursor":{layers:[...z.cursor]},"prompt-text":{layers:[...z.active]},"prompt-cursor":{layers:[...z.promptCursor]},"prompt-destructive":{layers:[...z.error]},"list-selected":{layers:[...z.selection]},"list-description":{layers:[...z.muted]},"list-header":{layers:[...z.muted]},"modal-option":{layers:[...z.muted]},"modal-option-selected":{layers:[...z.active]},"bar-text":{layers:[...z.emphasis]},"bar-indicator":{layers:[...z.accent]},rule:{layers:[...z.emphasis]},"rule-pad":{layers:[...z.muted]},"rule-meta":{layers:[...z.muted]},"hint-hover":{layers:[...z.fg]},"completion-name":{layers:[...z.accent]},"completion-desc":{layers:[...z.muted]},attachment:{layers:[...z.warn]},"queue-row":{layers:[...z.selection]},"queue-cursor":{layers:[...z.selection,jy]},"queue-blank":{layers:[...z.selectionBand]},"composer-gutter":{layers:[...z.fgStrong]},"composer-inactive":{layers:[...z.muted]},"composer-continuation":{layers:[...z.muted]},"syntax-addition":{layers:[...z.diffAdded]},"syntax-attr":{layers:[...z.syntaxBuiltin]},"syntax-attribute":{layers:[...z.syntaxBuiltin]},"syntax-built_in":{layers:[...z.syntaxBuiltin]},"syntax-builtin-name":{layers:[...z.fg]},"syntax-bullet":{layers:[...z.fg]},"syntax-class":{layers:[...z.syntaxClass]},"syntax-code":{layers:[...z.fg]},"syntax-comment":{layers:[...z.syntaxComment]},"syntax-default":{layers:[...z.fg]},"syntax-deletion":{layers:[...z.diffRemoved]},"syntax-doctag":{layers:[...z.syntaxDoctag]},"syntax-emphasis":{layers:[...z.syntaxEmphasis]},"syntax-formula":{layers:[...z.fg]},"syntax-function":{layers:[...z.syntaxString]},"syntax-keyword":{layers:[...z.syntaxKeyword]},"syntax-link":{layers:[...z.syntaxLink]},"syntax-literal":{layers:[...z.syntaxLiteral]},"syntax-meta":{layers:[...z.syntaxMeta]},"syntax-meta-keyword":{layers:[...z.fg]},"syntax-meta-string":{layers:[...z.fg]},"syntax-name":{layers:[...z.syntaxType]},"syntax-number":{layers:[...z.syntaxNumber]},"syntax-params":{layers:[...z.syntaxVariable]},"syntax-quote":{layers:[...z.fg]},"syntax-regexp":{layers:[...z.syntaxRegexp]},"syntax-section":{layers:[...z.syntaxBuiltin]},"syntax-selector-attr":{layers:[...z.fg]},"syntax-selector-class":{layers:[...z.fg]},"syntax-selector-id":{layers:[...z.fg]},"syntax-selector-pseudo":{layers:[...z.fg]},"syntax-selector-tag":{layers:[...z.fg]},"syntax-string":{layers:[...z.syntaxString]},"syntax-strong":{layers:[...z.syntaxStrong]},"syntax-subst":{layers:[...z.fg]},"syntax-symbol":{layers:[...z.syntaxMeta]},"syntax-tag":{layers:[...z.syntaxBuiltin]},"syntax-template-tag":{layers:[...z.fg]},"syntax-template-variable":{layers:[...z.fg]},"syntax-title":{layers:[...z.syntaxString]},"syntax-type":{layers:[...z.syntaxType]},"syntax-variable":{layers:[...z.syntaxVariable]},content:{layers:[...z.fg]},"cli-warn":{layers:[...z.warn]},code:{band:_l.code,layers:[...z.codeText]},"heading-1":{layers:[...z.emphasis,...z.active],inlineSgr:!0},"heading-2":{layers:[...z.emphasis,...z.accent],inlineSgr:!0},"heading-3":{layers:[...z.emphasis],inlineSgr:!0},"search-highlight":{layers:[...z.match]},"search-highlight-active":{layers:[...z.matchActive]},"selection-highlight":{layers:[...z.invert]}}}function Yy(n,e={}){Ie=n,qy=e.roles??{},jx=e.elements??{},Lx=e.background,Nx=e.foreground,_l=Hx(),z=qx(ip()),Ms=Gy(),Fl=Jx(),op=void 0,na={prose:Jy(),thought:Vy(),revision:na.revision+1}}function Vx(){return Object.keys(ip()).sort()}function Yx(){return Object.keys(Fl).sort()}function Qx(n){let t=ip()[n];return t===void 0?!0:Wx(t)}function Xx(n){let e=Fl[n];return e===void 0||e.band!==void 0?!0:Wx(e.layers??[])}function Zx(){return na.revision}function eI(){return op??=$F(),op}function zy(n){return typeof n=="number"?{open:e=>xF(n,e).open,close:ea,kind:"bg"}:TF(n)}function Gd(n,e){if(e==="none")return Wy;if(n===void 0)return z.fg.length===0?Wy:{...Ox(z.fg,e),inlineSgr:!1};let t=Fl[n];if(t===void 0)return Wy;let r=[],s=jx[n];return t.band!==void 0&&r.push(s?.bg!==void 0?Es(s.bg):zy(t.band)),t.layers&&r.push(...t.layers),s!==void 0&&(r=Ux(r,t.band!==void 0?{fg:s.fg}:s)),z.fg.length>0&&!r.some(o=>o.kind==="fg")&&((t.layers??[]).some(i=>i.kind==="bg")||r.push(...z.fg)),{...Ox(r,e),inlineSgr:t.inlineSgr===!0}}function tI(n){return n===void 0?!1:Fl[n]?.inlineSgr===!0}function B(n,e,t){t.length!==0&&n.noFormat(sa(e,t,qd(n)))}function sa(n,e,t="ansi256"){let r=Gd(n,t);return r.open+e+r.close}function $F(){let n=zd(z.codeText),e={};for(let t of _F){let{open:r,close:s}=Gd(t,$l),o=t.slice(7);if(r===""){e[o]=a=>a;continue}let i=s.split(Ny).join(n);e[o]=a=>r+a+i}return e}function FF(n){let e=Bx();if(e===void 0)return CF;let t=Es(Wd(e,Ml.hoverRow,Dx()));return{open:t.open(n),close:t.close}}function Fx(n,e){return n.split(ns).join(ns+e)}function nI(n,e){if(n===void 0)return;if(n==="thought"){let s=zy(_l.hoverThought).open(e);return{open:s,close:ea,inlineSgr:!0,transform:o=>Fx(o.split(Ms.thoughtBase).join(`${Ps}39m`),s)}}if(n==="code")return{open:zy(_l.hoverCode).open(e),close:ea,inlineSgr:!1};if(!OF.has(n))return;let t=Gd(n,e),r=FF(e);return{open:r.open+t.open,close:t.close+r.close,inlineSgr:t.inlineSgr,transform:t.inlineSgr?s=>Fx(s,r.open):void 0}}var SF,Ps,ra,Ie,Ml,IF,Lx,Nx,CF,_l,AF,et,Es,TF,Ol,jy,sp,EF,PF,MF,qy,jx,z,$l,ns,Ky,Kd,Ms,Fl,na,op,Wy,_F,OF,Tn=q(()=>{"use strict";jd();ta();SF="\x1B",Ps=`${SF}[`;ra={black:mt(0),red:mt(1),green:mt(2),yellow:mt(3),blue:mt(4),magenta:mt(5),cyan:mt(6),white:mt(7),brightBlack:mt(8),brightRed:mt(9),brightGreen:mt(10),brightYellow:mt(11),brightBlue:mt(12),brightMagenta:mt(13),brightCyan:mt(14),brightWhite:mt(15)},Ie=ra,Ml={user:.17,code:.11,hoverThought:.1,hoverRow:.19,hoverCode:.2},IF={user:43,code:28,hoverThought:25,hoverCode:48};CF={open:`${Ps}48;5;236m`,close:ea},_l=Hx();AF=3,et=n=>({open:e=>Ex(n,e),close:Ny,kind:"fg"}),Es=n=>({open:e=>Dy(n,e),close:ea,kind:"bg"}),TF=n=>({open:e=>Dy(n,e,!0),close:ea,kind:"bg"}),Ol=(n,e)=>({open:()=>`${Ps}${n}m`,close:`${Ps}${e}m`,kind:"attr"}),jy=Ol(1,22),sp=Ol(2,22),EF=Ol(7,27),PF=Ol(3,23),MF=Ol(4,24);qy={},jx={};z=qx(ip()),$l="ansi256";ns=`${Ps}0m`,Ky=`${Ps}1m`,Kd=`${Ps}4m`;Ms=Gy();Fl=Jx(),na={prose:Jy(),thought:Vy(),revision:0};Wy={open:"",close:"",inlineSgr:!1};_F=["syntax-addition","syntax-attr","syntax-attribute","syntax-built_in","syntax-builtin-name","syntax-bullet","syntax-class","syntax-code","syntax-comment","syntax-default","syntax-deletion","syntax-doctag","syntax-emphasis","syntax-formula","syntax-function","syntax-keyword","syntax-link","syntax-literal","syntax-meta","syntax-meta-keyword","syntax-meta-string","syntax-name","syntax-number","syntax-params","syntax-quote","syntax-regexp","syntax-section","syntax-selector-attr","syntax-selector-class","syntax-selector-id","syntax-selector-pseudo","syntax-selector-tag","syntax-string","syntax-strong","syntax-subst","syntax-symbol","syntax-tag","syntax-template-tag","syntax-template-variable","syntax-title","syntax-type","syntax-variable"];OF=new Set(["muted","tool-output","status-idle","tool","tool-status-ok","tool-status-pending","tool-status-cancelled","tool-status-running","tool-status-fail","plan","plan-done","plan-pending"])});function dp(n,e){return n?{...e??{},[oI]:n}:e}function Ll(n){iI=n?[...n]:[]}function BF(n,e){return e.endsWith("*")?n.startsWith(e.slice(0,-1)):n===e}function HF(){return[...DF,...iI]}function Jd(n=process.env){let e=HF(),t={};for(let[r,s]of Object.entries(n))s!==void 0&&(e.some(o=>BF(r,o))||(t[r]=s));return t}var LF,oI,NF,DF,iI,Vd=q(()=>{"use strict";LF={herdr:["HERDR_PANE_ID","HERDR_TAB_ID","HERDR_WORKSPACE_ID","HERDR_STARTUP_CWD"],tmux:["TMUX_PANE"],zellij:["ZELLIJ_PANE_ID","ZELLIJ_SESSION_NAME"],wezterm:["WEZTERM_PANE"],kitty:["KITTY_WINDOW_ID"],screen:["STY"],iterm2:["ITERM_SESSION_ID"],paseo:["PASEO_TERMINAL_ID","PASEO_ACTIVITY_TOKEN"],hydra:["HYDRA_TAB_LABEL"]},oI="HYDRA_ACP_SESSION",NF=[oI],DF=[...Object.values(LF).flat(),...NF];iI=[]});import*as mI from"fs";import*as Dn from"fs/promises";import*as Zo from"path";import{spawn as gI}from"child_process";import{Readable as KF}from"stream";function Sr(){let n=process.platform==="darwin"?"darwin":process.platform==="linux"?"linux":process.platform==="win32"?"windows":void 0,e=process.arch==="arm64"?"aarch64":process.arch==="x64"?"x86_64":void 0;if(!(!n||!e))return`${n}-${e}`}function tw(n,e=Sr()){if(e)return n[e]}function nw(n){Yd=n??(e=>process.stderr.write(e+`
27
27
  `))}async function yI(n){if(!n.target.archive)throw new Error(`Agent ${n.agentId} has no archive URL for ${Sr()??"this platform"}`);if(!n.target.cmd)throw new Error(`Agent ${n.agentId} has no cmd in its binary target`);let e=Sr();if(!e)throw new Error(`Agent ${n.agentId}: cannot determine platform key for ${process.platform}/${process.arch}`);let t=D.agentInstallDir(n.agentId,e,n.version),r=Zo.resolve(t,n.target.cmd);if(await ew(r))return r;if(await GF({agentId:n.agentId,version:n.version,archiveUrl:n.target.archive,installDir:t,onProgress:n.onProgress}),!await ew(r))throw new Error(`Agent ${n.agentId}: extracted archive did not contain ${n.target.cmd} (looked in ${t})`);return process.platform!=="win32"&&await Dn.chmod(r,493).catch(()=>{}),r}async function GF(n){await Dn.mkdir(Zo.dirname(n.installDir),{recursive:!0});let e=await Dn.mkdtemp(`${n.installDir}.partial-`);try{Yd(`hydra-acp: downloading ${n.agentId} from ${n.archiveUrl}`);let t=await JF({url:n.archiveUrl,dir:e,agentId:n.agentId,version:n.version,onProgress:n.onProgress});Yd(`hydra-acp: extracting ${n.agentId}`),Qd(n.onProgress,{phase:"extract",agentId:n.agentId,version:n.version}),await YF(t,e),await Dn.unlink(t).catch(()=>{});try{await Dn.rename(e,n.installDir)}catch(r){let s=r;if((s.code==="EEXIST"||s.code==="ENOTEMPTY")&&await ew(n.installDir)){await Dn.rm(e,{recursive:!0,force:!0}).catch(()=>{}),Qd(n.onProgress,{phase:"installed",agentId:n.agentId,version:n.version});return}throw r}Yd(`hydra-acp: installed ${n.agentId} to ${n.installDir}`),Qd(n.onProgress,{phase:"installed",agentId:n.agentId,version:n.version})}catch(t){throw await Dn.rm(e,{recursive:!0,force:!0}).catch(()=>{}),t}}function Qd(n,e){if(n)try{n(e)}catch{}}async function JF(n){let e=VF(n.url),t=Zo.join(n.dir,e),r=await fetch(n.url,{redirect:"follow"});if(!r.ok||!r.body)throw new Error(`Failed to download ${n.url}: HTTP ${r.status} ${r.statusText}`);let s=Number(r.headers.get("content-length")??"0"),o=mI.createWriteStream(t),i=KF.fromWeb(r.body);Qd(n.onProgress,{phase:"download_start",agentId:n.agentId,version:n.version,totalBytes:s});let a=0,d=Date.now(),c=0,l=2e3,u=150;return i.on("data",f=>{a+=f.length;let p=Date.now();p-c>=u&&(c=p,Qd(n.onProgress,{phase:"download_progress",agentId:n.agentId,version:n.version,receivedBytes:a,totalBytes:s})),p-d>=l&&(d=p,Yd(hI(n.agentId,a,s)))}),await new Promise((f,p)=>{i.on("error",p),o.on("error",p),o.on("finish",()=>f()),i.pipe(o)}),Yd(hI(n.agentId,a,s,!0)),Qd(n.onProgress,{phase:"download_done",agentId:n.agentId,version:n.version,receivedBytes:a,totalBytes:s}),t}function hI(n,e,t,r=!1){let s=(e/1e6).toFixed(1);if(t>0){let i=(t/1e6).toFixed(1),a=Math.min(100,Math.floor(e/t*100));return`hydra-acp: ${r?"downloaded":"downloading"} ${n} ${s}/${i} MB (${a}%)`}return`hydra-acp: ${r?"downloaded":"downloading"} ${n} ${s} MB`}function VF(n){let e=new URL(n);return Zo.posix.basename(e.pathname)||"archive"}async function YF(n,e){let t=n.toLowerCase();if(t.endsWith(".tar.gz")||t.endsWith(".tgz")||t.endsWith(".tar")){await Zy("tar",["-xf",n,"-C",e]);return}if(t.endsWith(".zip")){if(await QF("unzip")){await Zy("unzip",["-q",n,"-d",e]);return}await Zy("tar",["-xf",n,"-C",e]);return}throw new Error(`Unsupported archive format: ${n}`)}function Zy(n,e){return new Promise((t,r)=>{let s=gI(n,e,{stdio:["ignore","ignore","inherit"]});s.on("error",r),s.on("exit",(o,i)=>{if(o===0){t();return}r(new Error(`${n} ${e.join(" ")} exited with ${o!==null?`code ${o}`:`signal ${i}`}`))})})}async function QF(n){return new Promise(e=>{let t=process.platform==="win32"?"where":"which",r=gI(t,[n],{stdio:"ignore"});r.on("error",()=>e(!1)),r.on("exit",s=>e(s===0))})}async function ew(n){try{return await Dn.access(n),!0}catch{return!1}}var Yd,Xd=q(()=>{"use strict";ve();Yd=n=>{process.stderr.write(n+`
28
28
  `)}});import{statSync as XF}from"fs";import{delimiter as ZF,join as eL}from"path";function wI(n){try{return XF(n).isFile()}catch{return!1}}function nL(n){let e=(n.PATHEXT??tL).split(";").map(r=>r.trim()).filter(r=>r.length>0),t=[];for(let r of e)for(let s of[r,r.toLowerCase(),r.toUpperCase()])t.includes(s)||t.push(s);return t}function rL(n,e){let t=n.toLowerCase();return e.some(r=>t.endsWith(r.toLowerCase()))}function sL(n,e={}){if((e.platform??process.platform)!=="win32")return n;let r=e.env??process.env,s=nL(r);if(rL(n,s))return n;if(/[\\/]/.test(n)){for(let i of s){let a=n+i;if(wI(a))return a}return n}let o=r.PATH??r.Path??"";for(let i of o.split(ZF).filter(a=>a.length>0))for(let a of s){let d=eL(i,n+a);if(wI(d))return d}return n}function bI(n){if(oL.test(n))throw new Error(`cannot pass ${JSON.stringify(n)} through cmd.exe: it contains a quote, a percent sign, or a newline, none of which can be escaped unambiguously`);return/[\s&|<>^()]/.test(n)?`"${n}"`:n}function Zd(n,e,t={}){let r=t.platform??process.platform,s=sL(n,t);return r!=="win32"||!/\.(cmd|bat)$/i.test(s)?{command:s,args:[...e],shell:!1}:{command:bI(s),args:e.map(bI),shell:!0}}var tL,oL,up=q(()=>{"use strict";tL=".COM;.EXE;.BAT;.CMD";oL=/["%\r\n]/});import*as or from"fs/promises";import*as _s from"path";import{delimiter as iL}from"path";import{spawn as aL}from"child_process";function ow(n){sw=n??(e=>process.stderr.write(e+`
29
29
  `))}async function vI(n){let e=Sr();if(!e)throw new Error(`Agent ${n.agentId}: cannot determine platform key for ${process.platform}/${process.arch}`);let t=D.agentNpmInstallDir(n.agentId,e,n.version),r=fL(n.packageSpec),s=pL(r),o={installDir:t,packageName:r,hint:n.bin,basename:s},i=_s.join(t,"node_modules",".bin",n.bin);if(await oa(i))return i;if(await oa(t)){let u=await kI(o);if(u)return u.binPath}await dL({agentId:n.agentId,version:n.version,packageSpec:n.packageSpec,installDir:t,registry:n.registry,onProgress:n.onProgress});let a=await kI(o);if(a)return a.binPath;let d=await xI(t,r),c=typeof d=="object"&&d!==null?Object.keys(d):typeof d=="string"?[s]:[],l=c.length>0?` (package declares bins: ${c.join(", ")})`:"";throw new Error(`Agent ${n.agentId}: npm install of ${n.packageSpec} did not produce bin ${n.bin} (looked in ${t}/node_modules/.bin/)${l}`)}async function dL(n){await or.mkdir(_s.dirname(n.installDir),{recursive:!0});let e=await or.mkdtemp(`${n.installDir}.partial-`);try{sw(`hydra-acp: installing ${n.packageSpec} for ${n.agentId} into ${e}`),rw(n.onProgress,{phase:"install_start",agentId:n.agentId,version:n.version,packageSpec:n.packageSpec}),await uL({packageSpec:n.packageSpec,cwd:e,registry:n.registry});try{await or.rename(e,n.installDir)}catch(t){let r=t;if((r.code==="EEXIST"||r.code==="ENOTEMPTY")&&await oa(n.installDir)){await or.rm(e,{recursive:!0,force:!0}).catch(()=>{}),rw(n.onProgress,{phase:"installed",agentId:n.agentId,version:n.version});return}throw t}sw(`hydra-acp: installed ${n.agentId} to ${n.installDir}`),rw(n.onProgress,{phase:"installed",agentId:n.agentId,version:n.version})}catch(t){throw await or.rm(e,{recursive:!0,force:!0}).catch(()=>{}),t}}function rw(n,e){if(n)try{n(e)}catch{}}function uL(n){return SI(n,0)}async function SI(n,e){try{await new Promise((t,r)=>{let s=n.registry?["--registry",n.registry]:[],o=Zd("npm",["install","--no-audit","--no-fund","--silent",...s,n.packageSpec]),i;try{i=aL(o.command,o.args,{cwd:n.cwd,stdio:["ignore","pipe","pipe"],shell:o.shell,windowsHide:!0})}catch(d){r(d);return}let a="";i.stdout?.on("data",d=>{}),i.stderr?.setEncoding("utf8"),i.stderr?.on("data",d=>{a=(a+d).slice(-4096)}),i.on("error",d=>{if(d.code==="ENOENT"){let l=(process.env.PATH??process.env.Path??"").split(iL).filter(u=>u.length>0);r(new Error(`npm not found on PATH: tried to run ${JSON.stringify(o.command)}${o.shell?" through a shell":""} against ${l.length} PATH entries. Install Node.js / npm, or use a binary-distributed agent.`));return}r(d)}),i.on("exit",(d,c)=>{if(d===0){t();return}let l=d!==null?`exit code ${d}`:`signal ${c??"unknown"}`,u=a.trim();r(new Error(u?`npm install ${n.packageSpec} failed (${l})
@@ -43,7 +43,7 @@ stderr: ${u}`:`npm install ${n.packageSpec} failed (${l})`))})})}catch(t){if(t.c
43
43
  `;await Ds.writeFile(t,r,"utf8")}async function RC(n){let e=D.queueFile(n),t;try{t=await Ds.readFile(e,"utf8")}catch(s){if(s.code==="ENOENT")return[];throw s}let r=[];for(let s of t.split(`
44
44
  `))if(s.trim())try{let o=JSON.parse(s);o&&typeof o.messageId=="string"&&Array.isArray(o.prompt)&&typeof o.enqueuedAt=="number"&&r.push(o)}catch{}return r}async function AC(n){let e=D.queueFile(n);await Ds.unlink(e).catch(()=>{})}var Mw=q(()=>{"use strict";ve()});import{customAlphabet as FC}from"nanoid";import*as DC from"fs/promises";function Bs(){return`m_${NC()}`}function ot(n){let e=Ns(n)?.localId??n;return e.startsWith(on)?e.slice(on.length):e}function y1(n){let e=n?.update;if(!e||typeof e!="object"||e.sessionUpdate!=="usage_update")return!1;let t=e._meta;if(!t||typeof t!="object")return!1;let r=t["_claude/origin"];if(!r||typeof r!="object")return!1;let s=r.kind;return typeof s=="string"&&g1.has(s)}function EC(n){let e=n?.update;return!!e&&typeof e=="object"&&e.sessionUpdate==="usage_update"}function w1(n,e){return e===void 0?!1:n.some(t=>{if(!t||typeof t!="object")return!1;let r=t.id;return typeof r=="string"&&r.trim()!==""&&r.trim()!==e})}function BC(n){let e=n;if(e?.code!==G.InternalError)return;let t=e.data?.details;return`${typeof e.message=="string"?e.message:""} ${typeof t=="string"?t:""}`.toLowerCase()}function x1(n){let e=BC(n);return e!==void 0&&S1.some(t=>e.includes(t))}function C1(n){let e=BC(n);return e!==void 0&&I1.some(t=>e.includes(t))}function Qn(n,e){return n.code=e,n}function A1(n,e,t){return t?.run_in_background===!0?!1:e?.toolName==="Monitor"||n==="Monitor"||typeof e?.toolResponse?.taskId=="string"}function T1(n){return typeof n!="string"?void 0:/Command running in background with ID: ([A-Za-z0-9_-]+)/.exec(n)?.[1]}function E1(n){if(!n||typeof n!="object"||Array.isArray(n))return;let e=n.claudeCode;if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r={};return t.toolName!==void 0&&(r.toolName=t.toolName),t.toolResponse&&typeof t.toolResponse=="object"&&(r.toolResponse=t.toolResponse),r}function $w(n,e){if(n!=="session/update")return!1;let r=(e??{}).update?.sessionUpdate;return typeof r=="string"&&R1.has(r)}function P1(n,e){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(n[t]?.name!==e[t]?.name||n[t]?.description!==e[t]?.description)return!1;return!0}function M1(n,e){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(n[t]?.id!==e[t]?.id||n[t]?.name!==e[t]?.name||n[t]?.description!==e[t]?.description)return!1;return!0}function _1(n,e){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++)if(n[t]?.modelId!==e[t]?.modelId||n[t]?.name!==e[t]?.name||n[t]?.description!==e[t]?.description)return!1;return!0}function Jl(n){if(!Array.isArray(n))return[];let e=[];for(let t of n){if(!t||typeof t!="object"||Array.isArray(t))continue;let r=t,s=typeof r.modelId=="string"&&r.modelId.trim()||typeof r.value=="string"&&r.value.trim()||typeof r.id=="string"&&r.id.trim()||void 0;if(!s)continue;let o={modelId:s};typeof r.name=="string"&&r.name.length>0&&(o.name=r.name),typeof r.description=="string"&&r.description.length>0&&(o.description=r.description),e.push(o)}return e}function Tp(n){if(!Array.isArray(n))return[];let e=[];for(let t of n){if(!t||typeof t!="object"||Array.isArray(t))continue;let r=t,s=typeof r.value=="string"&&r.value.trim()||typeof r.id=="string"&&r.id.trim()||void 0;if(!s)continue;let o={id:s};typeof r.name=="string"&&r.name.length>0&&(o.name=r.name),typeof r.description=="string"&&r.description.length>0&&(o.description=r.description),e.push(o)}return e}function Lw(n){if(!Array.isArray(n))return[];let e=[];for(let t of n){if(!t||typeof t!="object"||Array.isArray(t))continue;let r=t,s=typeof r.value=="string"&&r.value.trim()||typeof r.id=="string"&&r.id.trim()||void 0;if(!s)continue;let o=typeof r.name=="string"&&r.name.trim()?r.name.trim():s,i={value:s,name:o};typeof r.description=="string"&&r.description.length>0&&(i.description=r.description),e.push(i)}return e}function $1(n){let t=(n??{}).update??{};if(t.sessionUpdate!=="_hydra_available_modes_update")return null;let r=t.availableModes;if(!Array.isArray(r))return[];let s=[];for(let o of r){if(!o||typeof o!="object")continue;let i=o;if(typeof i.id!="string"||i.id.length===0)continue;let a={id:i.id};typeof i.name=="string"&&(a.name=i.name),typeof i.description=="string"&&(a.description=i.description),s.push(a)}return s}function O1(n,e){let r=(e??{}).update??{},s=r.sessionUpdate;if(s==="agent_message_chunk"){let o=r.content??{};typeof o.text=="string"&&(n.chunks.push(o.text),n.messageChars+=o.text.length);return}if(s==="agent_thought_chunk"){let o=r.content??{};typeof o.text=="string"&&(n.thinkingChars+=o.text.length);return}if(s==="tool_call"){n.toolCalls++;return}if(s==="usage_update"){typeof r.used=="number"&&(n.lastUsed=r.used),typeof r.size=="number"&&(n.lastSize=r.size);return}}function F1(n){let t=(n??{}).update??{};if(t.sessionUpdate!=="available_commands_update")return null;let r=t.availableCommands??t.commands;if(!Array.isArray(r))return[];let s=[];for(let o of r){if(!o||typeof o!="object")continue;let i=o;if(typeof i.name!="string"||i.name.length===0)continue;let a={name:i.name};typeof i.description=="string"&&(a.description=i.description),s.push(a)}return s}function L1(n,e){if(n!=="session/update"||!e||typeof e!="object")return e;let t=e;return!t.update||typeof t.update!="object"||Array.isArray(t.update)||typeof t.update.messageId=="string"?e:{...e,update:{...t.update,messageId:Bs()}}}function N1(n,e){if(n.length<=e)return n;let t=n.length-e;for(let r=t;r>=0;r--)if(n[r]?.params?.update?.sessionUpdate==="prompt_received")return n.slice(r);return n.slice(t)}function D1(n,e){for(let t=n.length-1;t>=0;t--)if(n[t]?.seq===e)return t;return-1}function Ep(n,e){for(let t=n.length-1;t>=0;t--){let r=n[t];if(!r||r.method!=="session/update")continue;if(r.params?.update?.messageId===e)return t}return-1}function _C(n){if(!n||typeof n!="object")return;let e=n.toolCall;if(!e||typeof e!="object")return;let t=e.toolCallId;return typeof t=="string"?t:void 0}function B1(n){let e=H1(n.result),t={sessionUpdate:"permission_resolved"};return n.toolCallId!==void 0&&(t.toolCallId=n.toolCallId),e&&(t.outcome=e,e.kind==="selected"&&typeof e.optionId=="string"&&(t.chosenOptionId=e.optionId)),t.resolvedBy=U1(n.resolver),t}function H1(n){if(!n||typeof n!="object")return;let e=n.outcome;if(!e||typeof e!="object")return;let t=e.kind;if(typeof t!="string")return;let r={kind:t},s=e.optionId;typeof s=="string"&&(r.optionId=s);let o=e.reason;return typeof o=="string"&&(r.reason=o),r}function U1(n){let e={clientId:n.clientId};return n.clientInfo?.name&&(e.name=n.clientInfo.name),n.clientInfo?.version&&(e.version=n.clientInfo.version),e}function da(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>e&&typeof e=="object"&&typeof e.text=="string"?e.text:"").join(""):""}function $C(n,e){return n.map(t=>{if(t&&typeof t=="object"&&typeof t.text=="string"){let r=t;return{...r,text:e(r.text)}}return t})}function Ow(n,e){let t=n.findIndex(o=>o&&typeof o=="object"&&typeof o.text=="string");if(t<0)return n;let r=n[t],s=[...n];return s[t]={...r,text:`${e}${r.text}`},s}function Fw(n){return n==="session/prompt"?{stopReason:"stopped"}:{}}function j1(n){return n==="session/request_permission"?{outcome:{outcome:"cancelled"}}:{}}function OC(n){let e=n.name&&n.name!==n.id?`${n.id} (${n.name}) \u2014 \u25B6 ${n.currentValue}`:`${n.id} \u2014 \u25B6 ${n.currentValue}`;if(n.options.length===0)return e;let t=Math.max(...n.options.map(s=>s.value.length)),r=n.options.map(s=>{let o=s.value===n.currentValue?"\u25B6":"\xB7",i=s.name&&s.name!==s.value,a=i?s.value.padEnd(t):s.value;return i?` ${o} ${a} ${s.name}`:` ${o} ${a}`});return`${e}
45
45
  ${r.join(`
46
- `)}`}function Nw(n,e){for(let t of n.split(/\r?\n/)){let r=t.trim();if(r)return r.length>e?`${r.slice(0,e)}\u2026`:r}}var LC,NC,_w,l1,u1,f1,p1,on,TC,h1,Ap,m1,g1,PC,b1,k1,v1,cc,S1,I1,MC,R1,W1,ir=q(()=>{"use strict";Wl();ww();tC();jl();iC();aC();xp();Ul();uC();yC();vC();CC();Mw();fn();nc();LC="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",NC=FC(LC,16),_w=FC(LC,16),l1=20,u1=20,f1=5,p1=32,on="hydra_session_";TC=["start","merge","apply","sync","stop","detach","discard","clean","status"],h1=1e3,Ap=300*1e3,m1=64,g1=new Set(["task-notification","peer","coordinator","observer","observer-activity"]);PC=120,b1=128,k1=new Set(["local_bash"]),v1=1e3,cc=class n{sessionId;cwd;agentId;agent;upstreamSessionId;agentMeta;agentCapabilities;modelVerb=Ls;modelVerbConfirmed=!1;agentArgs;parentSessionId;forkedFromSessionId;forkedFromMessageId;forkSynthesisState;originatingClient;_interactive;get interactive(){return this._interactive}_priority;get priority(){return this._priority}title;_summarizedThroughEntry;get summarizedThroughEntry(){return this._summarizedThroughEntry}set summarizedThroughEntry(e){this._summarizedThroughEntry=e}currentModel;currentMode;compactionState;_currentUsage;updatedAt;createdAt;clients=new Map;historyStore;promptQueue=[];currentEntry;promptInFlight=!1;agentTurnInFlight=!1;swapInFlight=!1;modeChangeInFlight=!1;modelChangeInFlight=!1;queueWriteChain=Promise.resolve();closed=!1;closing=!1;closeInFlight;deleteRecordIntent=!1;closeHandlers=[];titleHandlers=[];scheduleSynopsisHook;scheduleWorkspaceSnapshotHook;scheduleCompactionHook;resolveAgentIdHook;getCompactionStateHook;getUpstreamGenerationsHook;getPendingAgentSwapHook;_liveCompactionPhase;broadcastHandlers=[];lastCancelAt=0;static CANCEL_ERROR_WINDOW_MS=2e3;forceCancelling=!1;_firstPromptSeeded=!1;get firstPromptSeeded(){return this._firstPromptSeeded}_titleSeedPending=!0;_upstreamRespawned=!1;promptStartedAt;turnRanTool=!1;unsolicitedTurn;pendingSteerDetach;supersededAutonomousTurn;autonomousSalvage;lastBackgroundTask;toolLabels=new Map;armedTasks=new Map;lastArmedBroadcast;liveBackgroundTasks=new Map;sawBackgroundTaskLevel=!1;sawTurnComplete=!1;appendCount=0;historyMaxEntries;compactEvery;permissionCallbacks=new Map;attentionFlags=new Map;get hasPermissionFlag(){for(let e of this.attentionFlags.values())if(e.source==="daemon"&&e.reason.startsWith("permission:"))return!0;return!1}attentionFlagsChangeHandlers=[];internalPromptCapture;idleTimeoutMs;idleTimer;orphanTimeoutMs;orphanTimer;idleEventTimeoutMs;idleHandlers=[];lastRecordedAt;lastSeq=0;spawnReplacementAgent;mintMcpServersForSwap;loadExistingAgentSession;clearRollbackBreadcrumbHook;onCompactionSwapHook;persistWatermarkHook;uncompactHook;forkHook;mcpServersConfig;forwardedEnv;workspace;workspaceError;workspaceNotes=[];workspaceHook;workspacePreambleSent=!1;formerWorkspace;departureNoteSent=!1;listSessions;logger;transformChain;extensionCommands;extensionCommandsUnsub;pendingClaims=new Map;toolCompletionSeen=new Map;toolCallKind=new kp;filesEditedSeen=new Set;openToolCalls=new Set;agentChangeHandlers=[];retiringGenerationCost;retiringGenerationUsed;rotationLifetimeCost;agentAdvertisedCommands=[];agentAdvertisedModes=[];agentAdvertisedModels=[];agentAdvertisedConfigOptions=[];agentCommandsHandlers=[];agentModesHandlers=[];agentModelsHandlers=[];availableAgentsFn;modelHandlers=[];modeHandlers=[];interactiveHandlers=[];priorityHandlers=[];usageHandlers=[];cumulativeCost=0;costLedgerProbe;get persistableUsage(){if(!(!this._currentUsage&&!this.cumulativeCost))return{...this._currentUsage??{},...this.cumulativeCost?{cumulativeCost:this.cumulativeCost}:{cumulativeCost:void 0}}}get currentUsage(){if(!this._currentUsage&&!this.cumulativeCost)return;let e=this._currentUsage??{},t=this.cumulativeCost+(e.costAmount??0);return{...e,costAmount:t||void 0,cumulativeCost:void 0}}amendInProgress;inFlightExtensionDispatches=new Map;recentlyTerminal=new Map;pendingTurnNotifiers=new Map;streamBuffer;streamFilePath;constructor(e){if(this.sessionId=e.sessionId??`${on}${NC()}`,this.cwd=e.cwd,this.workspace=e.workspace,this.workspaceError=e.workspaceError,this.workspaceHook=e.workspaceHook,this.agentId=e.agentId,this.agent=e.agent,this.upstreamSessionId=e.upstreamSessionId,this.agentMeta=e.agentMeta,this.agentCapabilities=e.agentCapabilities,this.agentArgs=e.agentArgs,this.parentSessionId=e.parentSessionId,this.forkedFromSessionId=e.forkedFromSessionId,this.forkedFromMessageId=e.forkedFromMessageId,this.forkSynthesisState=e.forkSynthesisState,this.originatingClient=e.originatingClient,this.title=e.title,this.scheduleSynopsisHook=e.scheduleSynopsis,this.scheduleWorkspaceSnapshotHook=e.scheduleWorkspaceSnapshot,this.scheduleCompactionHook=e.scheduleCompaction,this.resolveAgentIdHook=e.resolveAgentId,this.getCompactionStateHook=e.getCompactionState,this.getUpstreamGenerationsHook=e.getUpstreamGenerations,this.getPendingAgentSwapHook=e.getPendingAgentSwap,this.currentModel=e.currentModel,this.currentMode=e.currentMode,this._currentUsage=e.currentUsage,this.cumulativeCost=e.currentUsage?.cumulativeCost??0,e.reloadsUpstreamLedger&&this.armCostLedgerProbe(),e.agentCommands&&e.agentCommands.length>0&&(this.agentAdvertisedCommands=[...e.agentCommands]),e.agentModes&&e.agentModes.length>0&&(this.agentAdvertisedModes=[...e.agentModes]),e.agentModels&&e.agentModels.length>0&&(this.agentAdvertisedModels=[...e.agentModels]),e.agentConfigOptions&&e.agentConfigOptions.length>0&&(this.agentAdvertisedConfigOptions=[...e.agentConfigOptions]),this.idleTimeoutMs=e.idleTimeoutMs??0,this.orphanTimeoutMs=e.orphanTimeoutMs??0,this.idleEventTimeoutMs=e.idleEventTimeoutMs??3e4,this.idleEventTimeoutMs>0&&this.onIdle(t=>t.notifyChain("session.idle",{}),{debounceMs:this.idleEventTimeoutMs}),this.spawnReplacementAgent=e.spawnReplacementAgent,this.mintMcpServersForSwap=e.mintMcpServersForSwap,this.loadExistingAgentSession=e.loadExistingAgentSession,this.clearRollbackBreadcrumbHook=e.clearRollbackBreadcrumbHook,this.onCompactionSwapHook=e.onCompactionSwapHook,this.persistWatermarkHook=e.persistWatermarkHook,this.uncompactHook=e.uncompactHook,this.forkHook=e.forkHook,this.mcpServersConfig=e.mcpServers,this.forwardedEnv=e.forwardedEnv,this.availableAgentsFn=e.availableAgents,this.listSessions=e.listSessions,this.logger=e.logger,this.transformChain=e.transformChain??[],this.extensionCommands=e.extensionCommands,this.extensionCommands&&(this.extensionCommandsUnsub=this.extensionCommands.onChange(()=>{this.closed||this.broadcastMergedCommands()})),e.firstPromptSeeded&&(this._firstPromptSeeded=!0,this._titleSeedPending=!1),e.upstreamRespawned&&(this._upstreamRespawned=!0),this._interactive=e.interactive,this._priority=e.priority,this._summarizedThroughEntry=e.summarizedThroughEntry,this.compactionState=e.compactionState,e.compactionState){let t=e.compactionState;(t.status==="requested"||t.status==="running"||t.status==="swap_pending"||t.status==="swap_deferred")&&(t.status==="swap_deferred"?this._liveCompactionPhase={phase:"deferred",attempts:t.attempts}:this._liveCompactionPhase={phase:t.status==="requested"?"started":"iteration",iter:t.iter})}if(e.attentionFlags&&e.attentionFlags.length>0)for(let t of e.attentionFlags)this.attentionFlags.set(`${t.source}::${t.reason}`,t);this.historyStore=e.historyStore,this.historyMaxEntries=e.historyMaxEntries??h1,this.compactEvery=Math.max(1,Math.floor(this.historyMaxEntries*.2)),this.updatedAt=Date.now(),this.createdAt=e.createdAt??this.updatedAt,this.lastRecordedAt=this.updatedAt,this.resetModelVerb(e.modelVerb),this.wireAgent(this.agent),this.scheduleIdleCheck(),this.notifyChain("session.opened",{})}broadcastMergedCommands(){this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"available_commands_update",availableCommands:this.mergedAvailableCommands()}})}broadcastAvailableModes(){this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"_hydra_available_modes_update",availableModes:this.agentAdvertisedModes}})}broadcastAvailableModels(){let e={sessionUpdate:"_hydra_current_model_update",availableModels:[...this.agentAdvertisedModels]};this.currentModel!==void 0&&this.currentModel.length>0&&(e.currentModel=this.currentModel),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:e})}wireAgent(e,t){this.resetBackgroundTaskLevel(),t?.respawn&&(this._upstreamRespawned=!0),e.connection.onNotification("session/update",r=>{if(this.internalPromptCapture){O1(this.internalPromptCapture,r);return}this.maybeEmitToolEdges(r),this.runResponseChain(r)}),e.connection.onNotification("_claude/sdkMessage",r=>{this.applyBackgroundTaskLevel(r)}),e.connection.onRequest("session/request_permission",async r=>{let s=await this.runAgentRequestChain("session/request_permission",r),o=_C(s.shortCircuit?r:s.envelope);if(s.shortCircuit)return this.notifyChain("permission.replied",{toolCallId:o??null,outcome:s.payload,sourceWasTransformer:!0}),s.payload;let i=await this.handlePermissionRequest(s.envelope);return this.notifyChain("permission.replied",{toolCallId:o??null,outcome:i,sourceWasTransformer:!1}),i}),typeof e.connection.onOrphanError=="function"&&e.connection.onOrphanError(r=>{this.handleOrphanError(r)}),e.onExit(()=>{this.agent===e&&this.markClosed({deleteRecord:!1})})}handleOrphanError(e){let t=Date.now()-this.lastCancelAt;if(this.lastCancelAt===0||t>n.CANCEL_ERROR_WINDOW_MS){this.logger?.warn(`agent ${this.agentId} sent uncorrelated error frame code=${e.code} message=${e.message}`);return}this.lastCancelAt=0,this.logger?.warn(`agent ${this.agentId} rejected session/cancel code=${e.code} message=${e.message}`),this.broadcastQueueNotification("hydra-acp/cancel_failed",{sessionId:this.sessionId,code:e.code,message:e.message})}async runResponseChain(e,t=new Set,r=0,s="session/update"){let o=e,i=s==="session/update"?this.injectCumulativeCost(e):e,a=`response:${s}`;for(let l=r;l<this.transformChain.length;l++){let u=this.transformChain[l];if(t.has(u.name)||!u.intercepts.has(a))continue;let f=`t_${_w()}`,p;try{p=await u.connection.request("hydra-acp/transformer/message",{token:f,phase:"response",method:s,direction:"agent\u2192client",sessionId:this.sessionId,envelope:i})}catch(h){this.logger?.warn(`transformer ${u.name} error on ${a}: ${h.message}`);continue}let m=p?.action??"continue";if(m==="stop")return;if(m==="processing"){let h=l,g=i,w=new Set(t),b=s;await new Promise(k=>{let S=setTimeout(()=>{this.pendingClaims.delete(f)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:f,transformerName:u.name}),this.runResponseChain(g,new Set([...w,u.name]),h+1,b).then(()=>k()).catch(()=>k()))},Ap);typeof S.unref=="function"&&S.unref(),this.pendingClaims.set(f,{resolve:()=>k(),timer:S,transformerName:u.name,method:b,envelope:g,chainIdx:h,originatedBy:w,side:"response"})});return}p?.payload&&typeof p.payload=="object"&&(i=p.payload),t.add(u.name)}if(s!=="session/update")return;this.noteAgentActivity(i);let d=F1(i);if(d!==null){this.setAgentAdvertisedCommands(d);return}let c=$1(i);if(c!==null){this.setAgentAdvertisedModes(c);return}if(this.noteModelVerbHint(eC(i.update),"session/update"),this.maybeApplyAgentModel(i)){this.recordAndBroadcast("session/update",i);return}if(this.maybeApplyAgentMode(i)){this.recordAndBroadcast("session/update",i);return}if(this.maybeApplyAgentConfigOption(i)){this.recordAndBroadcast("session/update",this.mergeAgentOptionIntoEnvelope(i));return}if(this.maybeApplyAgentUsage(o)){this.recordAndBroadcast("session/update",i);return}this.maybeApplyAgentSessionInfo(i),this.recordAndBroadcast("session/update",i)}onAgentChange(e){this.agentChangeHandlers.push(e)}get attachedCount(){return this.clients.size}connectedClients(e){let t=[];for(let r of this.clients.values()){if(e&&r.clientId===e)continue;let s={clientId:r.clientId};r.clientInfo?.name&&(s.name=r.clientInfo.name),r.clientInfo?.version&&(s.version=r.clientInfo.version),t.push(s)}return t}get turnStartedAt(){return this.promptStartedAt}get inUnsolicitedTurn(){return this.unsolicitedTurn!==void 0}get agentPid(){return this.agent.pid}get awaitingInput(){return this.attentionFlags.size>0}async isQuiescedForSwap(){return await this.quiesceBlocker()===void 0}async quiesceBlocker(){if(this.agentTurnInFlight)return"the agent is still working; wait for the current turn to finish, then try again";if(this.unsolicitedTurn!==void 0)return"the agent is part-way through a turn it started by itself; wait for it to finish or interrupt it (^C), then try again";if(this.internalPromptCapture!==void 0)return"hydra is driving the agent right now (compaction seed or transcript injection); this clears by itself, so try again in a moment";if(this.modelChangeInFlight)return"a model change is still settling; try again in a moment";if(this.modeChangeInFlight)return"a mode change is still settling; try again in a moment";let e=this.pendingOneShotBackgroundTasks();if(e.length>0)return`${e.length} background task(s) still running (${e.join(", ")}); a swap would kill the agent process and abandon them. Wait for them to finish, or cancel them, then try again`;let t=await this.openToolCallIdsInHistory();if(t.length>0)return`${t.length} tool call(s) from an earlier turn never reported a result, so the session still reads as busy. ^C closes an abandoned chain; failing that it clears as new history accumulates`}isQuiescedSync(){return!(this.promptInFlight||this.unsolicitedTurn!==void 0||this.modeChangeInFlight||this.modelChangeInFlight)}async swapIntoWorkspace(e){await this.swapUpstream({...e.synopsis!==void 0?{artifact:e.synopsis}:{},note:e.note,framing:"swap",...e.title!==void 0?{title:e.title}:{},tailK:8,tailFloor:4,summarizedThroughEntry:e.historyLength,newCwd:e.cwd,reason:e.workspace!==void 0?"workspace-enter":"workspace-leave"}),this.workspace=e.workspace,e.left!==void 0?(this.formerWorkspace={path:e.left.path,sourceCwd:e.cwd,removed:e.left.removed},this.departureNoteSent=!1):this.formerWorkspace=void 0}async swapUpstream(e){let t=await this.quiesceBlocker();if(t!==void 0)throw new Error(`session is not quiesced for swap: ${t}`);if(this.swapInFlight)throw new Error("a swap is already in progress for this session");this.swapInFlight=!0;try{await this.doSwapUpstream(e)}finally{this.swapInFlight=!1}}async doSwapUpstream(e){this.notifyChain("agent.swap",{phase:"pre",previousUpstreamSessionId:this.upstreamSessionId,agentId:this.agentId});let t=this.agentId,r=e.newAgentId??this.agentId,s=r!==this.agentId,o=e.reason!==void 0&&e.reason!=="compaction"?e.reason:s?"agent-swap":"compaction",i=e.newCwd??this.cwd,a=this.agentArgs,d=this.forwardedEnv,c=this.currentModel,l=this.currentMode,u=this.spawnReplacementAgent;if(!u)throw new Error("agent spawning not configured for this session");let f=this.mintMcpServersForSwap?await this.mintMcpServersForSwap(this):this.mcpServersConfig??[],p=await u({agentId:r,cwd:i,agentArgs:a,...d?{forwardedEnv:d}:{},mcpServers:f});if(this.accumulateAndResetCost(),this.cwd=i,this.wireAgent(p.agent,{respawn:!0}),!s){let F=await aa({agent:p.agent,upstreamSessionId:p.upstreamSessionId,persistedModel:c,agentReportedModel:p.initialModel,logger:this.logger});this.applyAgentConfigOptionResponse(F.result,"model"),await ia({agent:p.agent,upstreamSessionId:p.upstreamSessionId,persistedMode:l,agentReportedMode:p.initialMode,logger:this.logger})}p.agent.connection.drainBuffered("session/update");let m=[];if(this.historyStore)try{m=await this.historyStore.load(this.sessionId)}catch(F){this.logger?.warn(`swapUpstream: historyStore.load failed: ${F.message}`)}let h=Tw({...e.artifact!==void 0?{synopsis:e.artifact}:{},...e.note!==void 0?{note:e.note}:{},...e.framing!==void 0?{framing:e.framing}:{},title:e.title,tail:m,tailK:e.tailK,tailFloor:e.tailFloor,...e.summarizedThroughEntry!==void 0?{watermark:e.summarizedThroughEntry}:{},recallArmed:(e.summarizedThroughEntry??this._summarizedThroughEntry??0)>0});if(this.internalPromptCapture)throw new Error("swapUpstream: internal prompt already in flight");this.internalPromptCapture={chunks:[],toolCalls:0,thinkingChars:0,messageChars:0};let g,w;try{await p.agent.connection.request("session/prompt",{sessionId:p.upstreamSessionId,prompt:[{type:"text",text:h}]});let F=this.internalPromptCapture;g=F.lastUsed,w=F.lastSize,this.logger?.info(`swapUpstream: seed processed sessionId=${this.sessionId} seedChars=${h.length} toolCalls=${F.toolCalls} thinkingChars=${F.thinkingChars} messageChars=${F.messageChars} used=${F.lastUsed??"?"} size=${F.lastSize??"?"} reply=${JSON.stringify(F.chunks.join("").slice(0,200))}`)}finally{this.internalPromptCapture=void 0}g!==void 0&&(this.maybeApplyAgentUsage({update:{sessionUpdate:"usage_update",used:g,...w!==void 0?{size:w}:{}}}),this.broadcastCurrentUsage());let b=this.upstreamSessionId,k=this._summarizedThroughEntry;e.summarizedThroughEntry!==void 0&&(this._summarizedThroughEntry=e.summarizedThroughEntry);let S=this.agent;if(this.agent=p.agent,this.upstreamSessionId=p.upstreamSessionId,this.agentMeta=p.agentMeta,this.agentCapabilities=p.agentCapabilities,this.resetModelVerb(p.modelVerb),s&&(this.agentId=r,this.agentAdvertisedCommands=[],this.currentModel=p.initialModel,this.currentMode=p.initialMode,this.setAgentAdvertisedModels(p.initialModels??[]),this.setAgentAdvertisedModes(p.initialModes??[]),this.agentAdvertisedConfigOptions=p.initialConfigOptions??[]),this.broadcastMergedCommands(),this.broadcastConfigOptions(),this.notifyAgentChange("swapUpstream",o,e.runId,g),e.summarizedThroughEntry!==void 0&&this.persistWatermarkHook)try{this.persistWatermarkHook(e.summarizedThroughEntry)}catch(F){this.logger?.warn(`swapUpstream: persistWatermarkHook failed: ${F.message}`)}if(!s&&this.onCompactionSwapHook)try{this.onCompactionSwapHook({previousUpstreamSessionId:b,...k!==void 0?{previousSummarizedThroughEntry:k}:{},...e.runId!==void 0?{runId:e.runId}:{}})}catch(F){this.logger?.warn(`swapUpstream: onCompactionSwapHook failed: ${F.message}`)}let I=await this.retireAgent(S,s?"agent switch":e.reason==="workspace-enter"||e.reason==="workspace-leave"?"workspace move":"compaction swap");this.notifyChain("agent.swap",{phase:"post",previousUpstreamSessionId:b,upstreamSessionId:this.upstreamSessionId,agentId:this.agentId}),s||this.broadcastCompactionPhase({phase:"swapped",...this.title!==void 0?{title:this.title}:{},summarizedThroughEntry:e.summarizedThroughEntry??this._summarizedThroughEntry??0}),s&&this.broadcastAgentSwitch(t,r);let x=I.length>0?`
46
+ `)}`}function Nw(n,e){for(let t of n.split(/\r?\n/)){let r=t.trim();if(r)return r.length>e?`${r.slice(0,e)}\u2026`:r}}var LC,NC,_w,l1,u1,f1,p1,on,TC,h1,Ap,m1,g1,PC,b1,k1,v1,cc,S1,I1,MC,R1,W1,ir=q(()=>{"use strict";Wl();ww();tC();jl();iC();aC();xp();Ul();uC();yC();vC();CC();Mw();fn();nc();LC="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",NC=FC(LC,16),_w=FC(LC,16),l1=20,u1=20,f1=5,p1=32,on="hydra_session_";TC=["start","merge","apply","sync","stop","detach","discard","clean","status"],h1=1e3,Ap=300*1e3,m1=64,g1=new Set(["task-notification","peer","coordinator","observer","observer-activity"]);PC=120,b1=128,k1=new Set(["local_bash"]),v1=1e3,cc=class n{sessionId;cwd;agentId;agent;upstreamSessionId;agentMeta;agentCapabilities;modelVerb=Ls;modelVerbConfirmed=!1;agentArgs;parentSessionId;forkedFromSessionId;forkedFromMessageId;forkSynthesisState;originatingClient;_interactive;get interactive(){return this._interactive}_priority;get priority(){return this._priority}title;_summarizedThroughEntry;get summarizedThroughEntry(){return this._summarizedThroughEntry}set summarizedThroughEntry(e){this._summarizedThroughEntry=e}currentModel;currentMode;compactionState;_currentUsage;updatedAt;createdAt;clients=new Map;historyStore;promptQueue=[];currentEntry;promptInFlight=!1;agentTurnInFlight=!1;swapInFlight=!1;modeChangeInFlight=!1;modelChangeInFlight=!1;queueWriteChain=Promise.resolve();closed=!1;closing=!1;closeInFlight;deleteRecordIntent=!1;closeHandlers=[];titleHandlers=[];scheduleSynopsisHook;scheduleWorkspaceSnapshotHook;scheduleCompactionHook;resolveAgentIdHook;getCompactionStateHook;getUpstreamGenerationsHook;getPendingAgentSwapHook;_liveCompactionPhase;broadcastHandlers=[];lastCancelAt=0;static CANCEL_ERROR_WINDOW_MS=2e3;lastUnsolicitedCancelAt=0;cancelReopenStreak=0;static UNSOLICITED_REOPEN_WINDOW_MS=1e4;static UNSOLICITED_REOPEN_LIMIT=3;forceCancelling=!1;_firstPromptSeeded=!1;get firstPromptSeeded(){return this._firstPromptSeeded}_titleSeedPending=!0;_upstreamRespawned=!1;promptStartedAt;turnRanTool=!1;unsolicitedTurn;pendingSteerDetach;supersededAutonomousTurn;autonomousSalvage;lastBackgroundTask;toolLabels=new Map;armedTasks=new Map;lastArmedBroadcast;liveBackgroundTasks=new Map;sawBackgroundTaskLevel=!1;sawTurnComplete=!1;appendCount=0;historyMaxEntries;compactEvery;permissionCallbacks=new Map;attentionFlags=new Map;get hasPermissionFlag(){for(let e of this.attentionFlags.values())if(e.source==="daemon"&&e.reason.startsWith("permission:"))return!0;return!1}attentionFlagsChangeHandlers=[];internalPromptCapture;idleTimeoutMs;idleTimer;orphanTimeoutMs;orphanTimer;idleEventTimeoutMs;idleHandlers=[];lastRecordedAt;lastSeq=0;spawnReplacementAgent;mintMcpServersForSwap;loadExistingAgentSession;clearRollbackBreadcrumbHook;onCompactionSwapHook;persistWatermarkHook;uncompactHook;forkHook;mcpServersConfig;forwardedEnv;workspace;workspaceError;workspaceNotes=[];workspaceHook;workspacePreambleSent=!1;formerWorkspace;departureNoteSent=!1;listSessions;logger;transformChain;extensionCommands;extensionCommandsUnsub;pendingClaims=new Map;toolCompletionSeen=new Map;toolCallKind=new kp;filesEditedSeen=new Set;openToolCalls=new Set;agentChangeHandlers=[];retiringGenerationCost;retiringGenerationUsed;rotationLifetimeCost;agentAdvertisedCommands=[];agentAdvertisedModes=[];agentAdvertisedModels=[];agentAdvertisedConfigOptions=[];agentCommandsHandlers=[];agentModesHandlers=[];agentModelsHandlers=[];availableAgentsFn;modelHandlers=[];modeHandlers=[];interactiveHandlers=[];priorityHandlers=[];usageHandlers=[];cumulativeCost=0;costLedgerProbe;get persistableUsage(){if(!(!this._currentUsage&&!this.cumulativeCost))return{...this._currentUsage??{},...this.cumulativeCost?{cumulativeCost:this.cumulativeCost}:{cumulativeCost:void 0}}}get currentUsage(){if(!this._currentUsage&&!this.cumulativeCost)return;let e=this._currentUsage??{},t=this.cumulativeCost+(e.costAmount??0);return{...e,costAmount:t||void 0,cumulativeCost:void 0}}amendInProgress;inFlightExtensionDispatches=new Map;recentlyTerminal=new Map;pendingTurnNotifiers=new Map;streamBuffer;streamFilePath;constructor(e){if(this.sessionId=e.sessionId??`${on}${NC()}`,this.cwd=e.cwd,this.workspace=e.workspace,this.workspaceError=e.workspaceError,this.workspaceHook=e.workspaceHook,this.agentId=e.agentId,this.agent=e.agent,this.upstreamSessionId=e.upstreamSessionId,this.agentMeta=e.agentMeta,this.agentCapabilities=e.agentCapabilities,this.agentArgs=e.agentArgs,this.parentSessionId=e.parentSessionId,this.forkedFromSessionId=e.forkedFromSessionId,this.forkedFromMessageId=e.forkedFromMessageId,this.forkSynthesisState=e.forkSynthesisState,this.originatingClient=e.originatingClient,this.title=e.title,this.scheduleSynopsisHook=e.scheduleSynopsis,this.scheduleWorkspaceSnapshotHook=e.scheduleWorkspaceSnapshot,this.scheduleCompactionHook=e.scheduleCompaction,this.resolveAgentIdHook=e.resolveAgentId,this.getCompactionStateHook=e.getCompactionState,this.getUpstreamGenerationsHook=e.getUpstreamGenerations,this.getPendingAgentSwapHook=e.getPendingAgentSwap,this.currentModel=e.currentModel,this.currentMode=e.currentMode,this._currentUsage=e.currentUsage,this.cumulativeCost=e.currentUsage?.cumulativeCost??0,e.reloadsUpstreamLedger&&this.armCostLedgerProbe(),e.agentCommands&&e.agentCommands.length>0&&(this.agentAdvertisedCommands=[...e.agentCommands]),e.agentModes&&e.agentModes.length>0&&(this.agentAdvertisedModes=[...e.agentModes]),e.agentModels&&e.agentModels.length>0&&(this.agentAdvertisedModels=[...e.agentModels]),e.agentConfigOptions&&e.agentConfigOptions.length>0&&(this.agentAdvertisedConfigOptions=[...e.agentConfigOptions]),this.idleTimeoutMs=e.idleTimeoutMs??0,this.orphanTimeoutMs=e.orphanTimeoutMs??0,this.idleEventTimeoutMs=e.idleEventTimeoutMs??3e4,this.idleEventTimeoutMs>0&&this.onIdle(t=>t.notifyChain("session.idle",{}),{debounceMs:this.idleEventTimeoutMs}),this.spawnReplacementAgent=e.spawnReplacementAgent,this.mintMcpServersForSwap=e.mintMcpServersForSwap,this.loadExistingAgentSession=e.loadExistingAgentSession,this.clearRollbackBreadcrumbHook=e.clearRollbackBreadcrumbHook,this.onCompactionSwapHook=e.onCompactionSwapHook,this.persistWatermarkHook=e.persistWatermarkHook,this.uncompactHook=e.uncompactHook,this.forkHook=e.forkHook,this.mcpServersConfig=e.mcpServers,this.forwardedEnv=e.forwardedEnv,this.availableAgentsFn=e.availableAgents,this.listSessions=e.listSessions,this.logger=e.logger,this.transformChain=e.transformChain??[],this.extensionCommands=e.extensionCommands,this.extensionCommands&&(this.extensionCommandsUnsub=this.extensionCommands.onChange(()=>{this.closed||this.broadcastMergedCommands()})),e.firstPromptSeeded&&(this._firstPromptSeeded=!0,this._titleSeedPending=!1),e.upstreamRespawned&&(this._upstreamRespawned=!0),this._interactive=e.interactive,this._priority=e.priority,this._summarizedThroughEntry=e.summarizedThroughEntry,this.compactionState=e.compactionState,e.compactionState){let t=e.compactionState;(t.status==="requested"||t.status==="running"||t.status==="swap_pending"||t.status==="swap_deferred")&&(t.status==="swap_deferred"?this._liveCompactionPhase={phase:"deferred",attempts:t.attempts}:this._liveCompactionPhase={phase:t.status==="requested"?"started":"iteration",iter:t.iter})}if(e.attentionFlags&&e.attentionFlags.length>0)for(let t of e.attentionFlags)this.attentionFlags.set(`${t.source}::${t.reason}`,t);this.historyStore=e.historyStore,this.historyMaxEntries=e.historyMaxEntries??h1,this.compactEvery=Math.max(1,Math.floor(this.historyMaxEntries*.2)),this.updatedAt=Date.now(),this.createdAt=e.createdAt??this.updatedAt,this.lastRecordedAt=this.updatedAt,this.resetModelVerb(e.modelVerb),this.wireAgent(this.agent),this.scheduleIdleCheck(),this.notifyChain("session.opened",{})}broadcastMergedCommands(){this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"available_commands_update",availableCommands:this.mergedAvailableCommands()}})}broadcastAvailableModes(){this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"_hydra_available_modes_update",availableModes:this.agentAdvertisedModes}})}broadcastAvailableModels(){let e={sessionUpdate:"_hydra_current_model_update",availableModels:[...this.agentAdvertisedModels]};this.currentModel!==void 0&&this.currentModel.length>0&&(e.currentModel=this.currentModel),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:e})}wireAgent(e,t){this.resetBackgroundTaskLevel(),t?.respawn&&(this._upstreamRespawned=!0),e.connection.onNotification("session/update",r=>{if(this.internalPromptCapture){O1(this.internalPromptCapture,r);return}this.maybeEmitToolEdges(r),this.runResponseChain(r)}),e.connection.onNotification("_claude/sdkMessage",r=>{this.applyBackgroundTaskLevel(r)}),e.connection.onRequest("session/request_permission",async r=>{let s=await this.runAgentRequestChain("session/request_permission",r),o=_C(s.shortCircuit?r:s.envelope);if(s.shortCircuit)return this.notifyChain("permission.replied",{toolCallId:o??null,outcome:s.payload,sourceWasTransformer:!0}),s.payload;let i=await this.handlePermissionRequest(s.envelope);return this.notifyChain("permission.replied",{toolCallId:o??null,outcome:i,sourceWasTransformer:!1}),i}),typeof e.connection.onOrphanError=="function"&&e.connection.onOrphanError(r=>{this.handleOrphanError(r)}),e.onExit(()=>{this.agent===e&&this.markClosed({deleteRecord:!1})})}handleOrphanError(e){let t=Date.now()-this.lastCancelAt;if(this.lastCancelAt===0||t>n.CANCEL_ERROR_WINDOW_MS){this.logger?.warn(`agent ${this.agentId} sent uncorrelated error frame code=${e.code} message=${e.message}`);return}this.lastCancelAt=0,this.logger?.warn(`agent ${this.agentId} rejected session/cancel code=${e.code} message=${e.message}`),this.broadcastQueueNotification("hydra-acp/cancel_failed",{sessionId:this.sessionId,code:e.code,message:e.message})}async runResponseChain(e,t=new Set,r=0,s="session/update"){let o=e,i=s==="session/update"?this.injectCumulativeCost(e):e,a=`response:${s}`;for(let l=r;l<this.transformChain.length;l++){let u=this.transformChain[l];if(t.has(u.name)||!u.intercepts.has(a))continue;let f=`t_${_w()}`,p;try{p=await u.connection.request("hydra-acp/transformer/message",{token:f,phase:"response",method:s,direction:"agent\u2192client",sessionId:this.sessionId,envelope:i})}catch(h){this.logger?.warn(`transformer ${u.name} error on ${a}: ${h.message}`);continue}let m=p?.action??"continue";if(m==="stop")return;if(m==="processing"){let h=l,g=i,w=new Set(t),b=s;await new Promise(k=>{let S=setTimeout(()=>{this.pendingClaims.delete(f)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:f,transformerName:u.name}),this.runResponseChain(g,new Set([...w,u.name]),h+1,b).then(()=>k()).catch(()=>k()))},Ap);typeof S.unref=="function"&&S.unref(),this.pendingClaims.set(f,{resolve:()=>k(),timer:S,transformerName:u.name,method:b,envelope:g,chainIdx:h,originatedBy:w,side:"response"})});return}p?.payload&&typeof p.payload=="object"&&(i=p.payload),t.add(u.name)}if(s!=="session/update")return;this.noteAgentActivity(i);let d=F1(i);if(d!==null){this.setAgentAdvertisedCommands(d);return}let c=$1(i);if(c!==null){this.setAgentAdvertisedModes(c);return}if(this.noteModelVerbHint(eC(i.update),"session/update"),this.maybeApplyAgentModel(i)){this.recordAndBroadcast("session/update",i);return}if(this.maybeApplyAgentMode(i)){this.recordAndBroadcast("session/update",i);return}if(this.maybeApplyAgentConfigOption(i)){this.recordAndBroadcast("session/update",this.mergeAgentOptionIntoEnvelope(i));return}if(this.maybeApplyAgentUsage(o)){this.recordAndBroadcast("session/update",i);return}this.maybeApplyAgentSessionInfo(i),this.recordAndBroadcast("session/update",i)}onAgentChange(e){this.agentChangeHandlers.push(e)}get attachedCount(){return this.clients.size}connectedClients(e){let t=[];for(let r of this.clients.values()){if(e&&r.clientId===e)continue;let s={clientId:r.clientId};r.clientInfo?.name&&(s.name=r.clientInfo.name),r.clientInfo?.version&&(s.version=r.clientInfo.version),t.push(s)}return t}get turnStartedAt(){return this.promptStartedAt}get inUnsolicitedTurn(){return this.unsolicitedTurn!==void 0}get agentPid(){return this.agent.pid}get awaitingInput(){return this.attentionFlags.size>0}async isQuiescedForSwap(){return await this.quiesceBlocker()===void 0}async quiesceBlocker(){if(this.agentTurnInFlight)return"the agent is still working; wait for the current turn to finish, then try again";if(this.unsolicitedTurn!==void 0)return"the agent is part-way through a turn it started by itself; wait for it to finish or interrupt it (^C), then try again";if(this.internalPromptCapture!==void 0)return"hydra is driving the agent right now (compaction seed or transcript injection); this clears by itself, so try again in a moment";if(this.modelChangeInFlight)return"a model change is still settling; try again in a moment";if(this.modeChangeInFlight)return"a mode change is still settling; try again in a moment";let e=this.pendingOneShotBackgroundTasks();if(e.length>0)return`${e.length} background task(s) still running (${e.join(", ")}); a swap would kill the agent process and abandon them. Wait for them to finish, or cancel them, then try again`;let t=await this.openToolCallIdsInHistory();if(t.length>0)return`${t.length} tool call(s) from an earlier turn never reported a result, so the session still reads as busy. ^C closes an abandoned chain; failing that it clears as new history accumulates`}isQuiescedSync(){return!(this.promptInFlight||this.unsolicitedTurn!==void 0||this.modeChangeInFlight||this.modelChangeInFlight)}async swapIntoWorkspace(e){await this.swapUpstream({...e.synopsis!==void 0?{artifact:e.synopsis}:{},note:e.note,framing:"swap",...e.title!==void 0?{title:e.title}:{},tailK:8,tailFloor:4,summarizedThroughEntry:e.historyLength,newCwd:e.cwd,reason:e.workspace!==void 0?"workspace-enter":"workspace-leave"}),this.workspace=e.workspace,e.left!==void 0?(this.formerWorkspace={path:e.left.path,sourceCwd:e.cwd,removed:e.left.removed},this.departureNoteSent=!1):this.formerWorkspace=void 0}async swapUpstream(e){let t=await this.quiesceBlocker();if(t!==void 0)throw new Error(`session is not quiesced for swap: ${t}`);if(this.swapInFlight)throw new Error("a swap is already in progress for this session");this.swapInFlight=!0;try{await this.doSwapUpstream(e)}finally{this.swapInFlight=!1}}async doSwapUpstream(e){this.notifyChain("agent.swap",{phase:"pre",previousUpstreamSessionId:this.upstreamSessionId,agentId:this.agentId});let t=this.agentId,r=e.newAgentId??this.agentId,s=r!==this.agentId,o=e.reason!==void 0&&e.reason!=="compaction"?e.reason:s?"agent-swap":"compaction",i=e.newCwd??this.cwd,a=this.agentArgs,d=this.forwardedEnv,c=this.currentModel,l=this.currentMode,u=this.spawnReplacementAgent;if(!u)throw new Error("agent spawning not configured for this session");let f=this.mintMcpServersForSwap?await this.mintMcpServersForSwap(this):this.mcpServersConfig??[],p=await u({agentId:r,cwd:i,agentArgs:a,...d?{forwardedEnv:d}:{},mcpServers:f});if(this.accumulateAndResetCost(),this.cwd=i,this.wireAgent(p.agent,{respawn:!0}),!s){let F=await aa({agent:p.agent,upstreamSessionId:p.upstreamSessionId,persistedModel:c,agentReportedModel:p.initialModel,logger:this.logger});this.applyAgentConfigOptionResponse(F.result,"model"),await ia({agent:p.agent,upstreamSessionId:p.upstreamSessionId,persistedMode:l,agentReportedMode:p.initialMode,logger:this.logger})}p.agent.connection.drainBuffered("session/update");let m=[];if(this.historyStore)try{m=await this.historyStore.load(this.sessionId)}catch(F){this.logger?.warn(`swapUpstream: historyStore.load failed: ${F.message}`)}let h=Tw({...e.artifact!==void 0?{synopsis:e.artifact}:{},...e.note!==void 0?{note:e.note}:{},...e.framing!==void 0?{framing:e.framing}:{},title:e.title,tail:m,tailK:e.tailK,tailFloor:e.tailFloor,...e.summarizedThroughEntry!==void 0?{watermark:e.summarizedThroughEntry}:{},recallArmed:(e.summarizedThroughEntry??this._summarizedThroughEntry??0)>0});if(this.internalPromptCapture)throw new Error("swapUpstream: internal prompt already in flight");this.internalPromptCapture={chunks:[],toolCalls:0,thinkingChars:0,messageChars:0};let g,w;try{await p.agent.connection.request("session/prompt",{sessionId:p.upstreamSessionId,prompt:[{type:"text",text:h}]});let F=this.internalPromptCapture;g=F.lastUsed,w=F.lastSize,this.logger?.info(`swapUpstream: seed processed sessionId=${this.sessionId} seedChars=${h.length} toolCalls=${F.toolCalls} thinkingChars=${F.thinkingChars} messageChars=${F.messageChars} used=${F.lastUsed??"?"} size=${F.lastSize??"?"} reply=${JSON.stringify(F.chunks.join("").slice(0,200))}`)}finally{this.internalPromptCapture=void 0}g!==void 0&&(this.maybeApplyAgentUsage({update:{sessionUpdate:"usage_update",used:g,...w!==void 0?{size:w}:{}}}),this.broadcastCurrentUsage());let b=this.upstreamSessionId,k=this._summarizedThroughEntry;e.summarizedThroughEntry!==void 0&&(this._summarizedThroughEntry=e.summarizedThroughEntry);let S=this.agent;if(this.agent=p.agent,this.upstreamSessionId=p.upstreamSessionId,this.agentMeta=p.agentMeta,this.agentCapabilities=p.agentCapabilities,this.resetModelVerb(p.modelVerb),s&&(this.agentId=r,this.agentAdvertisedCommands=[],this.currentModel=p.initialModel,this.currentMode=p.initialMode,this.setAgentAdvertisedModels(p.initialModels??[]),this.setAgentAdvertisedModes(p.initialModes??[]),this.agentAdvertisedConfigOptions=p.initialConfigOptions??[]),this.broadcastMergedCommands(),this.broadcastConfigOptions(),this.notifyAgentChange("swapUpstream",o,e.runId,g),e.summarizedThroughEntry!==void 0&&this.persistWatermarkHook)try{this.persistWatermarkHook(e.summarizedThroughEntry)}catch(F){this.logger?.warn(`swapUpstream: persistWatermarkHook failed: ${F.message}`)}if(!s&&this.onCompactionSwapHook)try{this.onCompactionSwapHook({previousUpstreamSessionId:b,...k!==void 0?{previousSummarizedThroughEntry:k}:{},...e.runId!==void 0?{runId:e.runId}:{}})}catch(F){this.logger?.warn(`swapUpstream: onCompactionSwapHook failed: ${F.message}`)}let I=await this.retireAgent(S,s?"agent switch":e.reason==="workspace-enter"||e.reason==="workspace-leave"?"workspace move":"compaction swap");this.notifyChain("agent.swap",{phase:"post",previousUpstreamSessionId:b,upstreamSessionId:this.upstreamSessionId,agentId:this.agentId}),s||this.broadcastCompactionPhase({phase:"swapped",...this.title!==void 0?{title:this.title}:{},summarizedThroughEntry:e.summarizedThroughEntry??this._summarizedThroughEntry??0}),s&&this.broadcastAgentSwitch(t,r);let x=I.length>0?`
47
47
  Stopped ${I.length} background task(s) with the previous agent: ${I.join(", ")}. Re-arm anything still needed.
48
48
  `:"",P=(e.reason==="workspace-enter"||e.reason==="workspace-leave"?"":s?`
49
49
  Switched to ${r}.
@@ -53,7 +53,7 @@ Compaction completed.
53
53
 
54
54
  `),this.departureNoteSent=!0}return s}applyWorkspacePromptRewrite(e){let t=this.workspace;if(t===void 0)return this.applyDepartedPromptRewrite(e);let r=!1,s=$C(e,i=>Pw(i,t.sourceCwd)?(r=!0,Ew(i,t.sourceCwd,t.path).text):i);if(!this.workspacePreambleSent||r){let i=xC({workspacePath:t.path,sourceCwd:t.sourceCwd,notes:this.workspaceNotes,...this.workspacePreambleSent?{reassert:!0}:{}});s=Ow(s,`${i}
55
55
 
56
- `),this.workspacePreambleSent=!0}return s}async prompt(e,t,r,s){let o=this.clients.get(e);if(!o)throw Qn(new Error("client not attached"),G.SessionNotFound);if(this.closing)throw Qn(new Error("session is closing; new prompts cannot be accepted"),G.SessionClosing);let i=Bs();if(this.maybeSeedTitleFromPrompt(t),this._firstPromptSeeded=!0,!(Pn((t??{})._meta).ancillary===!0)&&this._interactive!==!0){this._interactive=!0,this.cancelOrphanTimer();for(let d of this.interactiveHandlers)try{d(!0)}catch{}}return this.enqueueUserPrompt(o,t,i,r,s)}broadcastPromptReceived(e){this.closeUnsolicitedTurn("superseded",`prompt:${e.messageId}`);let t={clientId:e.originator.clientId};e.originator.name&&(t.name=e.originator.name),e.originator.version&&(t.version=e.originator.version),e.originator.fromSession&&(t.fromSession=e.originator.fromSession),e.originator.fromSessionTitle&&(t.fromSessionTitle=e.originator.fromSessionTitle),e.originator.fromLabel&&(t.fromLabel=e.originator.fromLabel),e.originator.depth!==void 0&&(t.depth=e.originator.depth),this.promptStartedAt=Date.now(),this.turnRanTool=!1,this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"prompt_received",messageId:e.messageId,prompt:e.prompt,sentBy:t}},e.clientId);let r=da(e.prompt);r.length>0&&this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"user_message_chunk",content:{type:"text",text:r},_meta:{"hydra-acp":{compatFor:"prompt_received"}}}},e.clientId)}recordCurrentUsageSnapshot(){if(this.historyStore===void 0)return;let e=this.currentUsage;if(e===void 0)return;let t={sessionUpdate:"usage_update"};if(typeof e.used=="number"&&(t.used=e.used),typeof e.size=="number"&&(t.size=e.size),typeof e.costAmount=="number"||typeof e.costCurrency=="string"){let s={};typeof e.costAmount=="number"&&(s.amount=e.costAmount),typeof e.costCurrency=="string"&&(s.currency=e.costCurrency),t.cost=s}if(Object.keys(t).length<=1)return;t._meta={"hydra-acp":{upstreamSessionId:this.upstreamSessionId,agentId:this.agentId}};let r={sessionId:this.sessionId,update:t};this.historyStore.append(this.sessionId,{method:"session/update",params:r,recordedAt:Date.now()}).catch(()=>{})}originatorNeedsTurnComplete(e){return e.wasAmend===!0||e.wasSteer===!0}broadcastTurnComplete(e,t,r,s){let o=t&&typeof t=="object"&&"stopReason"in t&&typeof t.stopReason=="string"?t.stopReason:void 0,i={sessionUpdate:"turn_complete",messageId:Bs()};o!==void 0&&(i.stopReason=o);let a=Pn(t?._meta).salvaged;a!==void 0&&(i._meta={[ft]:{salvaged:a}}),this.supersededAutonomousTurn=void 0;let d=this.amendInProgress;if(d&&r!==void 0&&d.cancelledMessageId===r&&(i._meta={[ft]:{...a!==void 0?{salvaged:a}:{},amended:{cancelledMessageId:d.cancelledMessageId,newMessageId:d.newMessageId}}}),this.promptStartedAt=void 0,this.sawTurnComplete=!0,this.scheduleWorkspaceSnapshotHook?.(),r!==void 0&&o!==void 0){this.recordTerminal(r,o);let c=this.pendingTurnNotifiers.get(r);c&&(this.pendingTurnNotifiers.delete(r),bw(c,{sessionId:this.sessionId,messageId:c.originalMessageId,stopReason:o,deliveredAt:Date.now(),...r!==c.originalMessageId?{amendedTo:r}:{}}))}(o==="cancelled"||o==="error"||o==="refusal")&&this.closeOpenToolCalls(o),this.recordCurrentUsageSnapshot(),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:i},s?void 0:e),d&&r!==void 0&&d.cancelledMessageId===r&&this.broadcastPromptAmended(d)}noteAgentActivity(e){if(!(this.closing||this.closed)){if(y1(e)||this.steerCausedTurnTerminal(e)){if(this.unsolicitedTurn!==void 0){this.closeUnsolicitedTurn("completed");return}this.salvageSupersededTerminal();return}this.pendingSteerDetach!==void 0&&this.currentEntry?.messageId===this.pendingSteerDetach.messageId&&EC(e)&&(this.pendingSteerDetach=void 0),!$w("session/update",e)&&(this.noteBackgroundTaskArming(e),this.unsolicitedTurn===void 0&&(this.promptInFlight||!this.sawTurnComplete||this.openUnsolicitedTurn()))}}steerCausedTurnTerminal(e){return this.unsolicitedTurn?.steerCaused!==!0?!1:EC(e)}noteBackgroundTaskArming(e){let t=e?.update;if(!t||typeof t!="object")return;let r=typeof t.toolCallId=="string"?t.toolCallId:void 0;if(r===void 0)return;let s=t.rawInput,o=E1(t._meta);this.rememberToolLabel(r,t,s,o),this.noteBackgroundTaskStopped(t,s,o);let i=typeof o?.toolResponse?.taskId=="string"?o.toolResponse.taskId:T1(t.rawOutput);if(!(i!==void 0||s!==void 0&&s.run_in_background===!0))return;let d=this.toolLabels.get(r)?.label??"background task";this.lastBackgroundTask={toolCallId:r,label:d};let c=Date.now(),l=this.armedTasks.get(r),u=i??l?.taskId,f=A1(t.title,o,s)||l?.repeating===!0;this.armedTasks.set(r,{label:d,...u!==void 0?{taskId:u}:{},repeating:f,armedAt:l?.armedAt??c}),this.onArmedTasksChanged()}applyBackgroundTaskLevel(e){let t=e?.message;if(!t||t.subtype!=="background_tasks_changed")return;let r=t.tasks;if(!Array.isArray(r))return;let s=Date.now(),o=new Map;for(let a of r){let d=a,c=typeof d?.task_id=="string"?d.task_id:void 0;c!==void 0&&o.set(c,{taskType:typeof d?.task_type=="string"?d.task_type:"unknown",description:typeof d?.description=="string"?d.description:"",firstSeen:this.liveBackgroundTasks.get(c)?.firstSeen??s})}let i=[...this.liveBackgroundTasks.keys()].filter(a=>!o.has(a));this.liveBackgroundTasks=o,this.sawBackgroundTaskLevel=!0,this.logger?.info(`session ${this.sessionId} background level: ${o.size} live`+(i.length>0?` (ended: ${i.join(", ")})`:"")),this.onArmedTasksChanged()}get armedBackgroundTasks(){return this.sawBackgroundTaskLevel?[...this.liveBackgroundTasks.entries()].map(([e,t])=>({taskId:e,label:t.description||t.taskType,taskType:t.taskType,since:t.firstSeen})):[...this.armedTasks.entries()].map(([e,t])=>({toolCallId:e,label:t.label,...t.taskId!==void 0?{taskId:t.taskId}:{},since:t.armedAt}))}pendingOneShotBackgroundTasks(){return this.sawBackgroundTaskLevel?[...this.liveBackgroundTasks.values()].filter(e=>k1.has(e.taskType)).map(e=>e.description||e.taskType):[...this.armedTasks.values()].filter(e=>!e.repeating).map(e=>e.label)}get armedSince(){let e;if(this.sawBackgroundTaskLevel){for(let t of this.liveBackgroundTasks.values())(e===void 0||t.firstSeen<e)&&(e=t.firstSeen);return e}for(let t of this.armedTasks.values())(e===void 0||t.armedAt<e)&&(e=t.armedAt);return e}onArmedTasksChanged(){let e=this.armedBackgroundTasks,t=e.length,r=this.armedSince,s=e.map(o=>o.taskId??o.toolCallId??o.label).sort().join("\0");s===this.lastArmedBroadcast?.key&&r===this.lastArmedBroadcast?.since||this.closed||(this.lastArmedBroadcast={key:s,since:r},this.broadcastQueueNotification("hydra-acp/session/armed_tasks_updated",{sessionId:this.sessionId,count:t,...r!==void 0?{since:r}:{},tasks:e}),this.dispatchIdle())}async retireAgent(e,t){return await e.kill().catch(()=>{}),this.resetBackgroundTaskLevel(),this.discardArmedTasks(t)}resetBackgroundTaskLevel(){this.liveBackgroundTasks.clear(),this.sawBackgroundTaskLevel=!1}discardArmedTasks(e){if(this.armedTasks.size===0)return[];let t=[...this.armedTasks.values()].map(r=>r.label);return this.armedTasks.clear(),this.logger?.info(`session ${this.sessionId} discarded ${t.length} armed task(s) on ${e}: ${t.join(", ")}`),this.onArmedTasksChanged(),t}noteBackgroundTaskStopped(e,t,r){if(!(r?.toolName==="TaskStop"||e.title==="TaskStop"))return;let o=t?.task_id;if(typeof o!="string"||o.length===0)return;let i=!1;for(let[a,d]of this.armedTasks)d.taskId===o&&(this.armedTasks.delete(a),i=!0);i&&this.onArmedTasksChanged()}rememberToolLabel(e,t,r,s){let o=r!==void 0&&typeof r.description=="string"&&r.description?r.description:void 0;if(o!==void 0)this.toolLabels.set(e,{label:o.slice(0,PC),fromDescription:!0});else if(this.toolLabels.get(e)?.fromDescription!==!0){let i=typeof t.title=="string"&&t.title?t.title:typeof s?.toolName=="string"&&s.toolName?s.toolName:void 0;i!==void 0&&this.toolLabels.set(e,{label:i.slice(0,PC),fromDescription:!1})}for(;this.toolLabels.size>b1;){let i=this.toolLabels.keys().next().value;if(i===void 0)break;this.toolLabels.delete(i)}}openUnsolicitedTurn(){let e=Date.now(),t=this.lastBackgroundTask,r=!1;for(let[i,a]of this.armedTasks)a.repeating||(this.armedTasks.delete(i),r=!0);r&&this.onArmedTasksChanged();let s={messageId:Bs(),startedAt:e,cause:t,steerCaused:this.pendingSteerDetach!==void 0};this.pendingSteerDetach=void 0,this.unsolicitedTurn=s,this.promptStartedAt=e,this.logger?.info(`session ${this.sessionId} agent resumed with no prompt in flight`+(t?` (after ${t.label})`:""));let o={unsolicited:!0};t&&(o.cause=t),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"_hydra_turn_started",messageId:s.messageId,_meta:{"hydra-acp":o}}})}async holdForUnsolicitedTurn(e){if(this.unsolicitedTurn===void 0){this.logger?.info(`session ${this.sessionId} queue hold skipped for ${e.messageId} (no unsolicited turn open)`);return}let t=Date.now(),r=this.unsolicitedTurn.cause;this.logger?.info(`session ${this.sessionId} holding ${e.messageId} behind unsolicited turn ${this.unsolicitedTurn.messageId}`+(r?` cause=${JSON.stringify(r.label)}`:"")),this.broadcastQueueNotification("hydra-acp/prompt_queue/held",{sessionId:this.sessionId,messageId:e.messageId,reason:"agent_resumed",...r?{cause:r}:{}});let s="turn_ended";for(;;){if(this.closing||this.closed){s="closing";break}if(e.cancelled){s="cancelled";break}if(this.unsolicitedTurn===void 0){s="turn_ended";break}await new Promise(i=>{let a=setTimeout(i,v1);typeof a.unref=="function"&&a.unref()})}let o=Date.now()-t;this.logger?.info(`session ${this.sessionId} released ${e.messageId} reason=${s} heldMs=${o}`),this.broadcastQueueNotification("hydra-acp/prompt_queue/released",{sessionId:this.sessionId,messageId:e.messageId,reason:s,heldMs:o})}closeUnsolicitedTurn(e,t){let r=this.unsolicitedTurn;if(r===void 0)return;let s=Date.now()-r.startedAt;this.unsolicitedTurn=void 0,this.promptStartedAt=void 0,this.logger?.info(`session ${this.sessionId} unsolicited turn ${r.messageId} closed reason=${e} durationMs=${s}`+(t?` by=${t}`:"")+(r.cause?` cause=${JSON.stringify(r.cause.label)}`:"")),e==="superseded"&&(this.supersededAutonomousTurn={turnMessageId:r.messageId,cause:r.cause,supersededAt:Date.now()}),this.recordCurrentUsageSnapshot(),!this.closed&&(e==="cancelled"&&this.closeOpenToolCalls("cancelled"),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"_hydra_turn_ended",messageId:Bs(),startedMessageId:r.messageId,durationMs:s,_meta:{"hydra-acp":{unsolicited:!0,reason:e}}}}))}salvageSupersededTerminal(){let e=this.supersededAutonomousTurn;if(e===void 0)return;this.supersededAutonomousTurn=void 0;let t=this.autonomousSalvage;t!==void 0&&(this.autonomousSalvage=void 0,this.logger?.warn(`session ${this.sessionId} salvaged session/prompt from autonomous terminal (superseded turn ${e.turnMessageId}, ${Date.now()-e.supersededAt}ms earlier)`+(e.cause?` cause=${JSON.stringify(e.cause.label)}`:"")),t({stopReason:"end_turn",_meta:{[ft]:{salvaged:{reason:"autonomous_terminal",supersededMessageId:e.turnMessageId}}}}))}async awaitPromptResponse(e){if(this.supersededAutonomousTurn===void 0)return e;try{return await new Promise((t,r)=>{this.autonomousSalvage=t,e.then(t,r)})}finally{this.autonomousSalvage=void 0}}recordTerminal(e,t){for(this.recentlyTerminal.set(e,{stopReason:t,terminatedAt:Date.now()});this.recentlyTerminal.size>m1;){let r=this.recentlyTerminal.keys().next().value;if(r===void 0)break;this.recentlyTerminal.delete(r)}}registerTurnNotify(e,t,r){let s=this.recentlyTerminal.get(e);if(s)return{alreadyTerminal:!0,stopReason:s.stopReason};for(this.pendingTurnNotifiers.set(e,{callbackUrl:t,secret:r,registeredAt:Date.now(),originalMessageId:e});this.pendingTurnNotifiers.size>p1;){let o=this.pendingTurnNotifiers.keys().next().value;if(o===void 0)break;this.pendingTurnNotifiers.delete(o)}return{alreadyTerminal:!1}}broadcastPromptAmended(e){let t=this.findUserEntry(e.newMessageId);if(!t)return;let r={sessionId:this.sessionId,cancelledMessageId:e.cancelledMessageId,newMessageId:e.newMessageId,prompt:t.prompt,originator:t.originator,amendedAt:Date.now()};this.broadcastQueueNotification("hydra-acp/prompt/amended",r)}findUserEntry(e){if(this.currentEntry?.messageId===e&&this.currentEntry.kind==="user")return this.currentEntry;let t=this.promptQueue.find(r=>r.messageId===e&&r.kind==="user");return t?.kind==="user"?t:void 0}visibleQueueDepth(){let e=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled?1:0;for(let t of this.promptQueue)t.kind==="user"&&!t.cancelled&&(e+=1);return e}broadcastQueueAdded(e,t){let r=this.visibleQueueDepth(),s=t?.position??Math.max(0,r-1),o={sessionId:this.sessionId,messageId:e.messageId,originator:e.originator,prompt:e.prompt,position:s,queueDepth:r,enqueuedAt:e.enqueuedAt};t?.amending!==void 0&&(o._meta={"hydra-acp":{amending:t.amending}}),this.broadcastQueueNotification("hydra-acp/prompt_queue/added",o)}broadcastQueueUpdated(e,t){this.broadcastQueueNotification("hydra-acp/prompt_queue/updated",{sessionId:this.sessionId,messageId:e,prompt:t})}broadcastQueueRemoved(e,t){this.broadcastQueueNotification("hydra-acp/prompt_queue/removed",{sessionId:this.sessionId,messageId:e,reason:t})}broadcastQueueNotification(e,t){for(let r of this.clients.values())r.connection.notify(e,t).catch(()=>{})}queueSnapshot(){let e=[],t=0;this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled&&e.push({messageId:this.currentEntry.messageId,originator:this.currentEntry.originator,prompt:this.currentEntry.prompt,position:t++,enqueuedAt:this.currentEntry.enqueuedAt});for(let r of this.promptQueue)r.kind!=="user"||r.cancelled||e.push({messageId:r.messageId,originator:r.originator,prompt:r.prompt,position:t++,enqueuedAt:r.enqueuedAt});return e}async flushPersistWrites(){await this.queueWriteChain.catch(()=>{})}replayPersistedQueue(e){for(let t of e){let r={clientId:`hydra-resurrected_${t.messageId}`};t.originator.clientInfo.name!==void 0&&(r.name=t.originator.clientInfo.name),t.originator.clientInfo.version!==void 0&&(r.version=t.originator.clientInfo.version);let s={kind:"user",messageId:t.messageId,originator:r,clientId:r.clientId,prompt:t.prompt,enqueuedAt:t.enqueuedAt,cancelled:!1,resolve:()=>{},reject:()=>{}};this.promptQueue.push(s),this.broadcastQueueAdded(s)}this.drainQueue()}cancelQueuedPrompt(e){if(this.currentEntry?.messageId===e)return{cancelled:!1,reason:"already_running"};let t=this.promptQueue.findIndex(s=>s.messageId===e);if(t<0)return{cancelled:!1,reason:"not_found"};let r=this.promptQueue[t];return r.cancelled=!0,this.promptQueue.splice(t,1),r.kind==="user"&&(this.broadcastQueueRemoved(e,"cancelled"),this.persistRewrite()),this.amendInProgress?.newMessageId===e&&(this.amendInProgress=void 0),r.resolve({stopReason:"cancelled"}),{cancelled:!0,reason:"ok"}}updateQueuedPrompt(e,t){if(this.currentEntry?.messageId===e)return{updated:!1,reason:"already_running"};let r=this.promptQueue.find(s=>s.messageId===e);return!r||r.kind!=="user"?{updated:!1,reason:"not_found"}:(r.prompt=t,this.broadcastQueueUpdated(e,t),this.persistRewrite(),{updated:!0,reason:"ok"})}amendPrompt(e,t){let r=this.clients.get(e);if(!r)throw Qn(new Error("client not attached"),G.SessionNotFound);let{targetMessageId:s,prompt:o,replaceQueue:i,onTargetCompleted:a}=t;if(this.currentEntry?.messageId===s&&this.currentEntry.kind==="user"&&!this.currentEntry.cancelled&&this.amendInProgress===void 0)return this.amendOnHead(r,o,s,i);let d=this.promptQueue.find(l=>l.messageId===s&&l.kind==="user");if(d&&d.kind==="user"&&!d.cancelled)return d.prompt=o,this.broadcastQueueUpdated(s,o),this.persistRewrite(),{amended:!0,reason:"ok",messageId:s};let c=this.recentlyTerminal.get(s);return c?c.stopReason==="cancelled"?{amended:!1,reason:"target_cancelled"}:a==="send_anyway"?{amended:!1,reason:"target_completed",messageId:this.enqueueAmendmentAsFollowUp(r,o)}:{amended:!1,reason:"target_completed"}:{amended:!1,reason:"target_not_found"}}amendOnHead(e,t,r,s){let o=Bs(),i={clientId:e.clientId};if(e.clientInfo?.name&&(i.name=e.clientInfo.name),e.clientInfo?.version&&(i.version=e.clientInfo.version),s){let c=[];for(let l of this.promptQueue){if(l.kind==="user"&&!l.cancelled){l.cancelled=!0,this.broadcastQueueRemoved(l.messageId,"cancelled"),l.resolve({stopReason:"cancelled"});continue}c.push(l)}this.promptQueue=c}let a={kind:"user",messageId:o,originator:i,clientId:e.clientId,prompt:t,enqueuedAt:Date.now(),cancelled:!1,wasAmend:!0,resolve:()=>{},reject:()=>{}};this.promptQueue.unshift(a),this.persistRewrite(),this.broadcastQueueAdded(a,{amending:r,position:1}),this.amendInProgress={cancelledMessageId:r,newMessageId:o};let d=this.pendingTurnNotifiers.get(r);return d&&(this.pendingTurnNotifiers.delete(r),this.pendingTurnNotifiers.set(o,d)),this.cancelExtensionDispatch(r,"amended"),this.agent.connection.notify("session/cancel",{sessionId:this.upstreamSessionId}).catch(()=>{}),{amended:!0,reason:"ok",messageId:o}}async steer(e,t){let r=this.clients.get(e);if(!r)throw Qn(new Error("client not attached"),G.SessionNotFound);let s=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled;if(s&&this.agent.steeringSupported){this.pendingSteerDetach={messageId:this.currentEntry.messageId};let o;try{o=await this.forwardRequest("_session/steering",t)}catch(d){throw this.pendingSteerDetach=void 0,d}let i=o?.outcome,a=i==="injected"||i==="startedNewTurn"||i==="promptRequired"||i==="failed"?o:{outcome:"failed"};return a.outcome!=="startedNewTurn"&&(this.pendingSteerDetach=void 0),a.outcome==="injected"&&this.recordSteerAsUserMessageChunk(t.prompt,e),a.outcome==="startedNewTurn"?{...a,detached:!0}:a}return s?(this.amendOnHead(r,t.prompt,this.currentEntry.messageId,!1),{outcome:"startedNewTurn"}):t._meta?.steering?.idleBehavior==="promptRequired"?{outcome:"promptRequired",reason:"noRunningTurn"}:(this.prompt(e,{sessionId:t.sessionId,prompt:t.prompt},void 0,{steerOriginated:!0}).catch(o=>{this.logger?.warn(`steer-originated prompt failed to enqueue: ${o.message}`)}),{outcome:"startedNewTurn"})}recordSteerAsUserMessageChunk(e,t){let r=da(e);r.length!==0&&this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"user_message_chunk",content:{type:"text",text:r},_meta:{"hydra-acp":{steered:!0}}}},t)}enqueueAmendmentAsFollowUp(e,t){let r=Bs(),s={clientId:e.clientId};e.clientInfo?.name&&(s.name=e.clientInfo.name),e.clientInfo?.version&&(s.version=e.clientInfo.version);let o={kind:"user",messageId:r,originator:s,clientId:e.clientId,prompt:t,enqueuedAt:Date.now(),cancelled:!1,resolve:()=>{},reject:()=>{}};return this.promptQueue.push(o),this.persistRewrite(),this.broadcastQueueAdded(o),this.drainQueue(),r}async cancel(e){if(!this.clients.get(e))throw Qn(new Error("client not attached"),G.SessionNotFound);this.logger?.info(`session ${this.sessionId} session/cancel from ${e} promptInFlight=${this.promptInFlight} agentTurnInFlight=${this.agentTurnInFlight} unsolicitedTurn=${this.unsolicitedTurn!==void 0} queued=${this.promptQueue.length}`),this.lastCancelAt=Date.now(),this.currentEntry?.kind==="user"&&this.currentEntry.messageId!==void 0&&this.cancelExtensionDispatch(this.currentEntry.messageId,"cancelled"),this.closeUnsolicitedTurn("cancelled"),this.agentTurnInFlight||this.closeOpenToolCalls("cancelled"),await this.forwardRequest("session/cancel",{sessionId:this.sessionId},new Set,0,"notification")}addTransformer(e){let t=this.transformChain.findIndex(r=>r.name===e.name);t>=0?this.transformChain[t]=e:this.transformChain.push(e),e.intercepts.has("lifecycle:session.opened")&&e.connection.notify("hydra-acp/transformer/session_event",{event:"session.opened",sessionId:this.sessionId}).catch(()=>{})}async forwardRequest(e,t,r=new Set,s=0,o="request"){let i=this.rewriteForAgent(t);for(let a=s;a<this.transformChain.length;a++){let d=this.transformChain[a];if(r.has(d.name))continue;let c=`request:${e}`;if(!d.intercepts.has(c))continue;let l=`t_${_w()}`,u;try{u=await d.connection.request("hydra-acp/transformer/message",{token:l,phase:"request",method:e,direction:"client\u2192agent",sessionId:this.sessionId,envelope:i})}catch(p){this.logger?.warn(`transformer ${d.name} error on ${c}: ${p.message}`);continue}let f=u?.action??"continue";if(f==="stop")return o==="notification"?void 0:u?.payload??Fw(e);if(f==="continue"){u?.payload&&typeof u.payload=="object"&&(i=u.payload),r.add(d.name);continue}if(f==="processing"){let p=a,m=i,h=new Set(r);return new Promise(g=>{let w=setTimeout(()=>{this.pendingClaims.delete(l)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:l,transformerName:d.name}),this.forwardRequest(e,m,new Set([...h,d.name]),p+1,o).then(g).catch(()=>g(o==="notification"?void 0:Fw(e))))},Ap);typeof w.unref=="function"&&w.unref(),this.pendingClaims.set(l,{resolve:g,timer:w,transformerName:d.name,method:e,envelope:m,chainIdx:p,originatedBy:h,side:"request",tailKind:o})})}r.add(d.name)}if(o==="notification"){await this.agent.connection.notify(e,i);return}return this.agent.connection.request(e,i)}async forwardModelChange(e,t){let r=await ri({request:(s,o)=>this.forwardRequest(s,o),sessionId:this.sessionId,modelId:e,verb:this.modelVerb,extraParams:t,logger:this.logger});return this.modelVerb=r.verb,this.modelVerbConfirmed=!0,r.result}noteModelVerbHint(e,t){e===void 0||this.modelVerbConfirmed||e===this.modelVerb||(this.logger?.info(`model verb for agent ${this.agentId} inferred as ${e} from ${t} (was ${this.modelVerb})`),this.modelVerb=e)}resetModelVerb(e){this.modelVerb=e??Ls,this.modelVerbConfirmed=!1}async runAgentRequestChain(e,t,r=new Set,s=0){let o=t,i=`request:${e}`;for(let a=s;a<this.transformChain.length;a++){let d=this.transformChain[a];if(r.has(d.name)||!d.intercepts.has(i))continue;let c=`t_${_w()}`,l;try{l=await d.connection.request("hydra-acp/transformer/message",{token:c,phase:"request",method:e,direction:"agent\u2192client",sessionId:this.sessionId,envelope:o})}catch(f){this.logger?.warn(`transformer ${d.name} error on ${i}: ${f.message}`);continue}let u=l?.action??"continue";if(u==="stop")return{shortCircuit:!0,payload:l?.payload??j1(e)};if(u==="continue"){l?.payload&&typeof l.payload=="object"&&(o=l.payload),r.add(d.name);continue}if(u==="processing"){let f=a,p=o,m=new Set(r),h=e;return new Promise(g=>{let w=setTimeout(()=>{this.pendingClaims.delete(c)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:c,transformerName:d.name}),this.runAgentRequestChain(h,p,new Set([...m,d.name]),f+1).then(g).catch(()=>g({shortCircuit:!1,envelope:p})))},Ap);typeof w.unref=="function"&&w.unref(),this.pendingClaims.set(c,{resolve:b=>g({shortCircuit:!0,payload:b}),timer:w,transformerName:d.name,method:h,envelope:p,chainIdx:f,originatedBy:m,side:"agent-request"})})}r.add(d.name)}return{shortCircuit:!1,envelope:o}}dischargeClaim(e,t){let r=this.pendingClaims.get(e);return r?(clearTimeout(r.timer),this.pendingClaims.delete(e),r.resolve(t),!0):!1}keepAliveClaim(e,t){let r=this.pendingClaims.get(e);if(!r)return!1;clearTimeout(r.timer);let s=typeof t=="number"&&t>0?Math.min(t*1.5,1800*1e3):Ap,o=setTimeout(()=>{if(this.pendingClaims.delete(e))if(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:e,transformerName:r.transformerName}),r.side==="response")this.runResponseChain(r.envelope,new Set([...r.originatedBy,r.transformerName]),r.chainIdx+1).then(()=>r.resolve(void 0)).catch(()=>r.resolve(void 0));else if(r.side==="agent-request")this.runAgentRequestChain(r.method,r.envelope,new Set([...r.originatedBy,r.transformerName]),r.chainIdx+1).then(r.resolve).catch(()=>r.resolve({shortCircuit:!1,envelope:r.envelope}));else{let i=r.tailKind??"request";this.forwardRequest(r.method,r.envelope,new Set([...r.originatedBy,r.transformerName]),r.chainIdx+1,i).then(r.resolve).catch(()=>r.resolve(i==="notification"?void 0:Fw(r.method)))}},s);return typeof o.unref=="function"&&o.unref(),r.timer=o,!0}async emitToChain(e,t,r){let s=this.transformChain.findIndex(a=>a.name===e),o=s>=0?s+1:0,i=new Set([e]);if(t==="session/update"){await this.runResponseChain(r,i,o);return}return this.forwardRequest(t,r,i,o)}async emitToQueue(e,t){let r=this.transformChain.findIndex(c=>c.name===e),s=r>=0?r+1:0,o=(t??{}).prompt??[],i=Bs(),a=`transformer:${e}`,d={clientId:a,name:e};return new Promise((c,l)=>{let u={kind:"user",messageId:i,originator:d,clientId:a,prompt:o,enqueuedAt:Date.now(),cancelled:!1,emitterName:e,chainStartIdx:s,resolve:c,reject:l},f=this.insertEntryAt(u,"tail");this.persistRewrite(),this.broadcastQueueAdded(u,{position:f}),this.drainQueue()})}rewriteForAgent(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e;if(t.sessionId===this.sessionId)return{...t,sessionId:this.upstreamSessionId}}return e}async close(e={}){if(e.deleteRecord&&(this.deleteRecordIntent=!0),!this.closed)return this.closeInFlight?this.closeInFlight:(this.closing=!0,this.closeInFlight=this.doClose(e),this.closeInFlight)}async doClose(e){let t=this.turnStartedAt!==void 0;this.logger?.info(`session ${this.sessionId} closing deleteRecord=${e.deleteRecord??!1} by=${e.by??"unknown"} midTurn=${t} unsolicitedTurn=${this.unsolicitedTurn!==void 0} queued=${this.promptQueue.length} awaitingPermission=${this.hasPermissionFlag}`),t&&this.logger?.warn(`session ${this.sessionId} closed mid-turn by=${e.by??"unknown"}; the in-flight turn will not settle and the agent is being killed`),this.cancelIdleTimer(),this.cancelOrphanTimer();for(let r of this.pendingClaims.values())clearTimeout(r.timer);this.pendingClaims.clear(),await this.agent.kill().catch(()=>{}),this.markClosed({deleteRecord:e.deleteRecord??!1})}onClose(e){return this.closeHandlers.push(e),()=>{let t=this.closeHandlers.indexOf(e);t>=0&&this.closeHandlers.splice(t,1)}}onTitleChange(e){this.titleHandlers.push(e)}retitle(e){return this.runTitleCommand(e)}retitleFromAgent(){return this.runTitleCommand("")}setTitle(e){let t=e.trim();if(!(!t||t===this.title)){this._titleSeedPending=!1,this.title=t,this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",title:t,updatedAt:new Date().toISOString()}});for(let r of this.titleHandlers)try{r(t)}catch{}}}maybeSeedTitleFromPrompt(e){if(!this._titleSeedPending||Pn((e??{})._meta).ancillary===!0||this.promptCarriesSentBy(e))return;let s=da((e??{}).prompt),o=Nw(s,200);!o||o.startsWith("/")||(this._titleSeedPending=!1,this.setTitle(o))}maybeApplyAgentModel(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="_hydra_current_model_update")return!1;let s=Jl(r.availableModels);s.length>0&&this.setAgentAdvertisedModels(s);let o=typeof r.currentModel=="string"?r.currentModel:typeof r.model=="string"?r.model:void 0;if(o===void 0)return!0;let i=o.trim();if(!i||i===this.currentModel)return!0;this.logger?.info(`live current_model_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(i)}`),this.currentModel=i;for(let a of this.modelHandlers)try{a(i)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentConfigOption(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="config_option_update")return!1;let s=r.configOptions;if(!Array.isArray(s))return!0;for(let i of s)this.applyOneConfigOptionEntry(i);let o=new Set(s.filter(i=>!!i&&typeof i=="object").map(i=>typeof i.id=="string"?i.id.trim():void 0).filter(i=>!!i&&i!=="model"&&i!=="mode"&&i!=="agent"));return this.agentAdvertisedConfigOptions=this.agentAdvertisedConfigOptions.filter(i=>o.has(i.id)),!0}applyAgentConfigOptionResponse(e,t){let r=e?.configOptions;if(!Array.isArray(r))return!1;let s=JSON.stringify(this.agentAdvertisedConfigOptions);for(let o of r){let i=o?.id;i==="model"||i==="mode"||i==="agent"||this.applyOneConfigOptionEntry(o)}if(w1(r,t)){let o=new Set(r.filter(i=>!!i&&typeof i=="object").map(i=>typeof i.id=="string"?i.id.trim():void 0).filter(i=>!!i));this.agentAdvertisedConfigOptions=this.agentAdvertisedConfigOptions.filter(i=>o.has(i.id))}return JSON.stringify(this.agentAdvertisedConfigOptions)!==s}applyOneConfigOptionEntry(e){if(!e||typeof e!="object")return;let t=e;if(t.id==="model"){let h=Jl(t.options);h.length>0&&this.setAgentAdvertisedModels(h);let g=t.currentValue;if(typeof g=="string"){let w=g.trim();w&&w!==this.currentModel&&(this.logger?.info(`live config_option_update(model): sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(w)}`),this.applyModelChange(w))}return}if(t.id==="mode"){let h=Tp(t.options);h.length>0&&this.setAgentAdvertisedModes(h);let g=t.currentValue;if(typeof g=="string"){let w=g.trim();w&&w!==this.currentMode&&(this.logger?.info(`live config_option_update(mode): sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(w)}`),this.applyModeChange(w))}return}if(typeof t.id!="string"||!t.id.trim())return;let r=t.id.trim(),s=Lw(t.options);if(s.length===0)return;let o=t.name,i=typeof o=="string"&&o.trim()?o.trim():r,a=t.category,d=typeof a=="string"&&a.trim()?a.trim():"other",c=t.description,l=typeof c=="string"&&c.trim()?c.trim():void 0,u=t.currentValue,f=typeof u=="string"&&u.trim()?u.trim():s[0].value,p={id:r,name:i,category:d,type:"select",currentValue:f,options:s,...l?{description:l}:{}},m=this.agentAdvertisedConfigOptions.findIndex(h=>h.id===r);m>=0?this.agentAdvertisedConfigOptions[m]=p:this.agentAdvertisedConfigOptions.push(p)}maybeApplyAgentMode(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="current_mode_update")return!1;let s=typeof r.currentModeId=="string"?r.currentModeId:typeof r.currentMode=="string"?r.currentMode:typeof r.mode=="string"?r.mode:void 0;if(s===void 0)return!0;let o=s.trim();if(!o||o===this.currentMode)return!0;this.logger?.info(`current_mode_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(o)}`),this.currentMode=o;for(let i of this.modeHandlers)try{i(o)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentUsage(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="usage_update")return!1;let s={...this._currentUsage??{}},o=!1;if(typeof r.used=="number"&&s.used!==r.used&&(s.used=r.used,o=!0),typeof r.size=="number"&&s.size!==r.size&&(s.size=r.size,o=!0),r.cost&&typeof r.cost=="object"){let a=r.cost;typeof a.amount=="number"&&(this.reconcileCostLedger(a.amount)&&(o=!0),s.costAmount!==a.amount&&(s.costAmount=a.amount,o=!0)),typeof a.currency=="string"&&s.costCurrency!==a.currency&&(s.costCurrency=a.currency,o=!0)}if(!o)return!0;this._currentUsage=s;let i=this.persistableUsage??s;for(let a of this.usageHandlers)try{a(i)}catch{}return!0}armCostLedgerProbe(){let e=this._currentUsage?.costAmount;typeof e=="number"&&e>0&&(this.costLedgerProbe=e)}reconcileCostLedger(e){let t=this.costLedgerProbe;return t===void 0||(this.costLedgerProbe=void 0,e>=t-1e-6)?!1:(this.cumulativeCost+=t,!0)}notifyAgentChange(e,t,r,s){let o=this.retiringGenerationCost;this.retiringGenerationCost=void 0;let i=this.retiringGenerationUsed;this.retiringGenerationUsed=void 0;let a=this.rotationLifetimeCost;this.rotationLifetimeCost=void 0;for(let d of this.agentChangeHandlers)try{d({agentId:this.agentId,upstreamSessionId:this.upstreamSessionId,...o!==void 0?{retiredCost:o}:{},...a!==void 0?{lifetimeCost:a}:{},...i!==void 0?{retiredUsed:i}:{},...s!==void 0?{startedUsed:s}:{},...t!==void 0?{reason:t}:{},...r!==void 0?{runId:r}:{}})}catch(c){this.logger?.warn(`${e}: agentChange handler failed: ${c.message}`)}}accumulateAndResetCost(){let e=this._currentUsage?.costAmount;e&&(this.cumulativeCost+=e,this.retiringGenerationCost=e);let t=this._currentUsage?.used;typeof t=="number"&&t>0&&(this.retiringGenerationUsed=t),this.rotationLifetimeCost=this.cumulativeCost;let r={used:0,cumulativeCost:this.cumulativeCost,...typeof this._currentUsage?.size=="number"?{size:this._currentUsage.size}:{},...this._currentUsage?.costCurrency?{costCurrency:this._currentUsage.costCurrency}:{}};this._currentUsage=r;for(let s of this.usageHandlers)try{s(r)}catch{}this.broadcastCurrentUsage()}broadcastCurrentUsage(){let e=this.currentUsage;if(e===void 0)return;let t={sessionUpdate:"usage_update"};if(typeof e.used=="number"&&(t.used=e.used),typeof e.size=="number"&&(t.size=e.size),typeof e.costAmount=="number"||typeof e.costCurrency=="string"){let r={};typeof e.costAmount=="number"&&(r.amount=e.costAmount),typeof e.costCurrency=="string"&&(r.currency=e.costCurrency),t.cost=r}this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:t})}injectCumulativeCost(e){if(!this.cumulativeCost||!e||typeof e!="object")return e;let t=e;if(!t.update||typeof t.update!="object")return e;let r=t.update;if(r.sessionUpdate!=="usage_update"||!r.cost||typeof r.cost!="object")return e;let s=r.cost;return typeof s.amount!="number"?e:{...t,update:{...r,cost:{...s,amount:this.cumulativeCost+s.amount}}}}get totalUsage(){return this.currentUsage}setAgentAdvertisedCommands(e){if(P1(this.agentAdvertisedCommands,e)){this.broadcastMergedCommands();return}this.agentAdvertisedCommands=e;for(let t of this.agentCommandsHandlers)try{t(e)}catch{}this.broadcastMergedCommands()}setAgentAdvertisedModes(e){if(M1(this.agentAdvertisedModes,e)){this.broadcastAvailableModes();return}this.agentAdvertisedModes=e;for(let t of this.agentModesHandlers)try{t(e)}catch{}this.broadcastAvailableModes()}setAgentAdvertisedModels(e){if(this.logger?.info(`setAgentAdvertisedModels: sessionId=${this.sessionId} currentModel=${JSON.stringify(this.currentModel)} newList=[${e.map(t=>t.modelId).join(",")}]`),_1(this.agentAdvertisedModels,e)){this.broadcastAvailableModels();return}this.agentAdvertisedModels=e;for(let t of this.agentModelsHandlers)try{t(e)}catch{}this.broadcastAvailableModels()}onAgentCommandsChange(e){this.agentCommandsHandlers.push(e)}onAgentModesChange(e){this.agentModesHandlers.push(e)}onAgentModelsChange(e){this.agentModelsHandlers.push(e)}onModelChange(e){this.modelHandlers.push(e)}onModeChange(e){this.modeHandlers.push(e)}onInteractiveChange(e){this.interactiveHandlers.push(e)}onPriorityChange(e){this.priorityHandlers.push(e)}setPriority(e){let t=e===void 0||e<=0?void 0:Math.floor(e);if(t!==this._priority){this._priority=t,this.updatedAt=Date.now();for(let r of this.priorityHandlers)try{r(t)}catch{}}}applyModelChange(e){let t=e.trim();if(t){this.modelChangeInFlight=!0;try{if(t!==this.currentModel){this.logger?.info(`applyModelChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(t)}`),this.currentModel=t;for(let s of this.modelHandlers)try{s(t)}catch{}}let r={sessionUpdate:"_hydra_current_model_update",currentModel:t};this.agentAdvertisedModels.length>0&&(r.availableModels=[...this.agentAdvertisedModels]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:r}),this.broadcastConfigOptions()}finally{this.modelChangeInFlight=!1}}}applyModeChange(e){let t=e.trim();if(t){this.modeChangeInFlight=!0;try{if(t!==this.currentMode){this.logger?.info(`applyModeChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(t)}`),this.currentMode=t;for(let s of this.modeHandlers)try{s(t)}catch{}}let r={sessionUpdate:"current_mode_update",currentModeId:t};this.agentAdvertisedModes.length>0&&(r.availableModes=[...this.agentAdvertisedModes]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:r}),this.broadcastConfigOptions()}finally{this.modeChangeInFlight=!1}}}buildConfigOptions(){let e=[];if(this.agentAdvertisedModels.length>0){let s=this.agentAdvertisedModels.map(i=>({value:i.modelId,name:i.name??i.modelId,...i.description!==void 0?{description:i.description}:{}})),o=this.currentModel&&s.some(i=>i.value===this.currentModel)?this.currentModel:s[0].value;e.push({id:"model",name:"Model",category:"model",type:"select",currentValue:o,options:s})}if(this.agentAdvertisedModes.length>0){let s=this.agentAdvertisedModes.map(i=>({value:i.id,name:i.name??i.id,...i.description!==void 0?{description:i.description}:{}})),o=this.currentMode&&s.some(i=>i.value===this.currentMode)?this.currentMode:s[0].value;e.push({id:"mode",name:"Session Mode",category:"mode",type:"select",currentValue:o,options:s})}let r=(this.availableAgentsFn?.()??[]).map(s=>({value:s.id,name:s.name??s.id,...s.description!==void 0?{description:s.description}:{}}));return r.some(s=>s.value===this.agentId)||r.unshift({value:this.agentId,name:this.agentId}),e.push({id:"agent",name:"Agent",category:"_hydra_agent",type:"select",currentValue:this.agentId,options:r}),e.push(...this.agentAdvertisedConfigOptions),e}broadcastConfigOptions(){this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"config_option_update",configOptions:this.buildConfigOptions()}})}mergeAgentOptionIntoEnvelope(e){if(!e||typeof e!="object")return e;let t=e;if(!t.update||typeof t.update!="object")return e;let r=t.update,s=Array.isArray(r.configOptions)?[...r.configOptions]:[];if(s.some(a=>a&&typeof a=="object"&&a.id==="agent"))return e;let i=this.buildConfigOptions().find(a=>a.id==="agent");return i?{...t,update:{...r,configOptions:[...s,i]}}:e}onUsageChange(e){this.usageHandlers.push(e)}mergedAvailableCommands(){let e=this.daemonTopLevelCommands(),t=this.aliasableBareVerbs();for(let r of ic){if(t.get(r.verb)!=="__hydra__")continue;let s=r.argsHint?`${r.verb} ${r.argsHint}`:r.verb;e.push({name:s,description:`Alias for '/hydra ${r.verb}': ${r.description}`})}if(this.extensionCommands)for(let{name:r,command:s}of this.extensionCommands.list()){let o=s.verb?`hydra ${r} ${s.verb}`:`hydra ${r}`,a={name:s.argsHint?`${o} ${s.argsHint}`:o};s.description&&(a.description=s.description),e.push(a);let d=r.startsWith("hydra-acp-")?r.slice(10):r;if(r.startsWith("hydra-acp-")&&d.length>0){let c=s.verb?`hydra ${d} ${s.verb}`:`hydra ${d}`,u={name:s.argsHint?`${c} ${s.argsHint}`:c};s.description&&(u.description=s.description),e.push(u)}if(d.length>0&&t.get(d)===r){let c=s.verb?`${d} ${s.verb}`:d,u={name:s.argsHint?`${c} ${s.argsHint}`:c};s.description&&(u.description=s.description),e.push(u)}}return e.push(...this.agentAdvertisedCommands),e}daemonTopLevelCommands(){return[{name:"hydra",description:"Hydra session command (kill, restart, title, agent <agent>)"},{name:"model",description:"Switch model; omit arg to list available models"},{name:"mode",description:"Switch mode; omit arg to list available modes"},{name:"sessions",description:"List all sessions"},{name:"help",description:"Show available commands"}]}aliasableBareVerbs(){let e=new Set,t=i=>i.split(/\s+/)[0]??"";for(let i of this.daemonTopLevelCommands()){let a=t(i.name);a&&e.add(a)}for(let i of this.agentAdvertisedCommands){let a=t(i.name),d=a.startsWith("/")?a.slice(1):a;d&&e.add(d)}let r=new Map;for(let i of ic)e.has(i.verb)||r.set(i.verb,"__hydra__");if(!this.extensionCommands)return r;let s=new Map,o=new Set;for(let{name:i}of this.extensionCommands.list()){if(o.has(i))continue;o.add(i);let a=i.startsWith("hydra-acp-")?i.slice(10):i;if(!a||e.has(a)||r.has(a))continue;let d=s.get(a);d===void 0?s.set(a,i):d!==i&&s.set(a,"__conflict__")}for(let[i,a]of s)a!=="__conflict__"&&r.set(i,a);return r}agentOnlyAdvertisedCommands(){return[...this.agentAdvertisedCommands]}agentKnowsSlashCommand(e){let t=s=>s.startsWith("/")?s.slice(1):s,r=t(e);if(!r)return!1;for(let s of this.agentAdvertisedCommands)if(t(s.name.split(/\s+/)[0]??"")===r)return!0;return!1}availableModes(){return[...this.agentAdvertisedModes]}availableModels(){return[...this.agentAdvertisedModels]}maybeApplyAgentSessionInfo(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="session_info_update"||typeof r.title!="string"||this._upstreamRespawned)return;let s=r.title.trim();if(!(!s||s===this.title)){this.title=s,this._firstPromptSeeded=!0,this._titleSeedPending=!1;for(let o of this.titleHandlers)try{o(s)}catch{}}}async handleSlashCommand(e,t){let s=e.slice(6).trim().match(/^(\S+)(?:\s+([\s\S]*))?$/),o=s?.[1]??"",i=(s?.[2]??"").trim();if(o==="")return{stopReason:"end_turn"};let a=t!==void 0;if(ic.some(u=>u.verb===o))switch(o){case"title":return a?this.runTitleCommandInline(i):this.runTitleCommand(i);case"agent":return this.runAgentCommandInline(i);case"config":return this.handleConfigCommand(`/config ${i}`);case"kill":return this.runKillCommand();case"workspace":return this.runWorkspaceCommand(i);case"restart":return a?this.runRestartCommandInline():this.runRestartCommand();case"compact":return a?this.runCompactCommandInline(i):this.runCompactCommand(i);case"uncompact":return a?this.runUncompactCommandInline():this.runUncompactCommand();case"fork":return a?this.runForkCommandInline(i,t):this.runForkCommand(i);default:{let u=new Error(`no dispatcher for /hydra verb ${o}`);throw u.code=G.InternalError,u}}if(this.extensionCommands?.has(o))return a?this.runExtensionCommandInline(o,i,t):this.runExtensionCommand(o,i);let d=`hydra-acp-${o}`;if(this.extensionCommands?.has(d))return a?this.runExtensionCommandInline(d,i,t):this.runExtensionCommand(d,i);let c=ic.map(u=>u.verb);if(this.extensionCommands){let u=new Set;for(let{name:f}of this.extensionCommands.list())u.has(f)||(c.push(f),u.add(f))}let l=new Error(`unknown /hydra verb: ${o} (known: ${c.join(", ")})`);throw l.code=G.InvalidParams,l}runExtensionCommand(e,t){return this.enqueuePrompt(`extension:${e}`,()=>this.runExtensionCommandInline(e,t,void 0))}async runExtensionCommandInline(e,t,r){let s=this.extensionCommands?.get(e);if(!s)return this.emitExtensionReply(`extension "${e}" is no longer connected`);let o=t.match(/^(\S+)(?:\s+([\s\S]*))?$/),i=o?.[1]??"",a=(o?.[2]??"").trim();if(!s.commands.some(m=>m.verb===i)){let m=s.commands.map(h=>h.verb).join(", ");return this.emitExtensionReply(`/hydra ${e}${i?` ${i}`:""}: unknown verb (known: ${m||"(none)"})`)}let d={sessionId:this.sessionId,verb:i,args:a};r!==void 0&&(d.messageId=r);let c=()=>{},l=new Promise(m=>{c=m});r!==void 0&&this.inFlightExtensionDispatches.set(r,{extensionName:e,connection:s.connection,cancel:m=>c({stopReason:"cancelled",reason:m})});let u,f=!1;try{let m=s.connection.request("hydra-acp/commands/invoke",d),h=await Promise.race([m,l]);if(h&&typeof h=="object"&&h.stopReason==="cancelled"&&"reason"in h)return f=!0,this.logger?.info(`extension ${e} ${i} cancelled (cancelExtensionDispatch); abandoning in-flight commands/invoke`),{stopReason:"cancelled"};u=h}catch(m){return this.emitExtensionReply(`${e} ${i}: ${m.message}`)}finally{r!==void 0&&!f&&this.inFlightExtensionDispatches.delete(r)}let p=u&&typeof u=="object"&&typeof u.text=="string"?u.text:"";return p.length>0?this.emitExtensionReply(p):{stopReason:"end_turn"}}cancelExtensionDispatch(e,t){let r=this.inFlightExtensionDispatches.get(e);if(!r)return!1;this.inFlightExtensionDispatches.delete(e);try{r.connection.notify("hydra-acp/commands/cancel",{sessionId:this.sessionId,messageId:e,reason:t})}catch(s){this.logger?.warn(`notify commands/cancel to ${r.extensionName} failed: ${s.message}`)}return r.cancel(t),!0}emitExtensionReply(e){return this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
56
+ `),this.workspacePreambleSent=!0}return s}async prompt(e,t,r,s){let o=this.clients.get(e);if(!o)throw Qn(new Error("client not attached"),G.SessionNotFound);if(this.closing)throw Qn(new Error("session is closing; new prompts cannot be accepted"),G.SessionClosing);let i=Bs();if(this.maybeSeedTitleFromPrompt(t),this._firstPromptSeeded=!0,!(Pn((t??{})._meta).ancillary===!0)&&this._interactive!==!0){this._interactive=!0,this.cancelOrphanTimer();for(let d of this.interactiveHandlers)try{d(!0)}catch{}}return this.enqueueUserPrompt(o,t,i,r,s)}broadcastPromptReceived(e){this.closeUnsolicitedTurn("superseded",`prompt:${e.messageId}`);let t={clientId:e.originator.clientId};e.originator.name&&(t.name=e.originator.name),e.originator.version&&(t.version=e.originator.version),e.originator.fromSession&&(t.fromSession=e.originator.fromSession),e.originator.fromSessionTitle&&(t.fromSessionTitle=e.originator.fromSessionTitle),e.originator.fromLabel&&(t.fromLabel=e.originator.fromLabel),e.originator.depth!==void 0&&(t.depth=e.originator.depth),this.promptStartedAt=Date.now(),this.turnRanTool=!1,this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"prompt_received",messageId:e.messageId,prompt:e.prompt,sentBy:t}},e.clientId);let r=da(e.prompt);r.length>0&&this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"user_message_chunk",content:{type:"text",text:r},_meta:{"hydra-acp":{compatFor:"prompt_received"}}}},e.clientId)}recordCurrentUsageSnapshot(){if(this.historyStore===void 0)return;let e=this.currentUsage;if(e===void 0)return;let t={sessionUpdate:"usage_update"};if(typeof e.used=="number"&&(t.used=e.used),typeof e.size=="number"&&(t.size=e.size),typeof e.costAmount=="number"||typeof e.costCurrency=="string"){let s={};typeof e.costAmount=="number"&&(s.amount=e.costAmount),typeof e.costCurrency=="string"&&(s.currency=e.costCurrency),t.cost=s}if(Object.keys(t).length<=1)return;t._meta={"hydra-acp":{upstreamSessionId:this.upstreamSessionId,agentId:this.agentId}};let r={sessionId:this.sessionId,update:t};this.historyStore.append(this.sessionId,{method:"session/update",params:r,recordedAt:Date.now()}).catch(()=>{})}originatorNeedsTurnComplete(e){return e.wasAmend===!0||e.wasSteer===!0}broadcastTurnComplete(e,t,r,s){let o=t&&typeof t=="object"&&"stopReason"in t&&typeof t.stopReason=="string"?t.stopReason:void 0,i={sessionUpdate:"turn_complete",messageId:Bs()};o!==void 0&&(i.stopReason=o);let a=Pn(t?._meta).salvaged;a!==void 0&&(i._meta={[ft]:{salvaged:a}}),this.supersededAutonomousTurn=void 0;let d=this.amendInProgress;if(d&&r!==void 0&&d.cancelledMessageId===r&&(i._meta={[ft]:{...a!==void 0?{salvaged:a}:{},amended:{cancelledMessageId:d.cancelledMessageId,newMessageId:d.newMessageId}}}),this.promptStartedAt=void 0,this.sawTurnComplete=!0,this.scheduleWorkspaceSnapshotHook?.(),r!==void 0&&o!==void 0){this.recordTerminal(r,o);let c=this.pendingTurnNotifiers.get(r);c&&(this.pendingTurnNotifiers.delete(r),bw(c,{sessionId:this.sessionId,messageId:c.originalMessageId,stopReason:o,deliveredAt:Date.now(),...r!==c.originalMessageId?{amendedTo:r}:{}}))}(o==="cancelled"||o==="error"||o==="refusal")&&this.closeOpenToolCalls(o),this.recordCurrentUsageSnapshot(),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:i},s?void 0:e),d&&r!==void 0&&d.cancelledMessageId===r&&this.broadcastPromptAmended(d)}noteAgentActivity(e){if(!(this.closing||this.closed)){if(y1(e)||this.steerCausedTurnTerminal(e)){if(this.unsolicitedTurn!==void 0){this.closeUnsolicitedTurn("completed");return}this.salvageSupersededTerminal();return}this.pendingSteerDetach!==void 0&&this.currentEntry?.messageId===this.pendingSteerDetach.messageId&&EC(e)&&(this.pendingSteerDetach=void 0),!$w("session/update",e)&&(this.noteBackgroundTaskArming(e),this.unsolicitedTurn===void 0&&(this.promptInFlight||!this.sawTurnComplete||this.openUnsolicitedTurn()))}}steerCausedTurnTerminal(e){return this.unsolicitedTurn?.steerCaused!==!0?!1:EC(e)}noteBackgroundTaskArming(e){let t=e?.update;if(!t||typeof t!="object")return;let r=typeof t.toolCallId=="string"?t.toolCallId:void 0;if(r===void 0)return;let s=t.rawInput,o=E1(t._meta);this.rememberToolLabel(r,t,s,o),this.noteBackgroundTaskStopped(t,s,o);let i=typeof o?.toolResponse?.taskId=="string"?o.toolResponse.taskId:T1(t.rawOutput);if(!(i!==void 0||s!==void 0&&s.run_in_background===!0))return;let d=this.toolLabels.get(r)?.label??"background task";this.lastBackgroundTask={toolCallId:r,label:d};let c=Date.now(),l=this.armedTasks.get(r),u=i??l?.taskId,f=A1(t.title,o,s)||l?.repeating===!0;this.armedTasks.set(r,{label:d,...u!==void 0?{taskId:u}:{},repeating:f,armedAt:l?.armedAt??c}),this.onArmedTasksChanged()}applyBackgroundTaskLevel(e){let t=e?.message;if(!t||t.subtype!=="background_tasks_changed")return;let r=t.tasks;if(!Array.isArray(r))return;let s=Date.now(),o=new Map;for(let a of r){let d=a,c=typeof d?.task_id=="string"?d.task_id:void 0;c!==void 0&&o.set(c,{taskType:typeof d?.task_type=="string"?d.task_type:"unknown",description:typeof d?.description=="string"?d.description:"",firstSeen:this.liveBackgroundTasks.get(c)?.firstSeen??s})}let i=[...this.liveBackgroundTasks.keys()].filter(a=>!o.has(a));this.liveBackgroundTasks=o,this.sawBackgroundTaskLevel=!0,this.logger?.info(`session ${this.sessionId} background level: ${o.size} live`+(i.length>0?` (ended: ${i.join(", ")})`:"")),this.onArmedTasksChanged()}get armedBackgroundTasks(){return this.sawBackgroundTaskLevel?[...this.liveBackgroundTasks.entries()].map(([e,t])=>({taskId:e,label:t.description||t.taskType,taskType:t.taskType,since:t.firstSeen})):[...this.armedTasks.entries()].map(([e,t])=>({toolCallId:e,label:t.label,...t.taskId!==void 0?{taskId:t.taskId}:{},since:t.armedAt}))}pendingOneShotBackgroundTasks(){return this.sawBackgroundTaskLevel?[...this.liveBackgroundTasks.values()].filter(e=>k1.has(e.taskType)).map(e=>e.description||e.taskType):[...this.armedTasks.values()].filter(e=>!e.repeating).map(e=>e.label)}get armedSince(){let e;if(this.sawBackgroundTaskLevel){for(let t of this.liveBackgroundTasks.values())(e===void 0||t.firstSeen<e)&&(e=t.firstSeen);return e}for(let t of this.armedTasks.values())(e===void 0||t.armedAt<e)&&(e=t.armedAt);return e}onArmedTasksChanged(){let e=this.armedBackgroundTasks,t=e.length,r=this.armedSince,s=e.map(o=>o.taskId??o.toolCallId??o.label).sort().join("\0");s===this.lastArmedBroadcast?.key&&r===this.lastArmedBroadcast?.since||this.closed||(this.lastArmedBroadcast={key:s,since:r},this.broadcastQueueNotification("hydra-acp/session/armed_tasks_updated",{sessionId:this.sessionId,count:t,...r!==void 0?{since:r}:{},tasks:e}),this.dispatchIdle())}async retireAgent(e,t){return await e.kill().catch(()=>{}),this.resetBackgroundTaskLevel(),this.discardArmedTasks(t)}resetBackgroundTaskLevel(){this.liveBackgroundTasks.clear(),this.sawBackgroundTaskLevel=!1}discardArmedTasks(e){if(this.armedTasks.size===0)return[];let t=[...this.armedTasks.values()].map(r=>r.label);return this.armedTasks.clear(),this.logger?.info(`session ${this.sessionId} discarded ${t.length} armed task(s) on ${e}: ${t.join(", ")}`),this.onArmedTasksChanged(),t}noteBackgroundTaskStopped(e,t,r){if(!(r?.toolName==="TaskStop"||e.title==="TaskStop"))return;let o=t?.task_id;if(typeof o!="string"||o.length===0)return;let i=!1;for(let[a,d]of this.armedTasks)d.taskId===o&&(this.armedTasks.delete(a),i=!0);i&&this.onArmedTasksChanged()}rememberToolLabel(e,t,r,s){let o=r!==void 0&&typeof r.description=="string"&&r.description?r.description:void 0;if(o!==void 0)this.toolLabels.set(e,{label:o.slice(0,PC),fromDescription:!0});else if(this.toolLabels.get(e)?.fromDescription!==!0){let i=typeof t.title=="string"&&t.title?t.title:typeof s?.toolName=="string"&&s.toolName?s.toolName:void 0;i!==void 0&&this.toolLabels.set(e,{label:i.slice(0,PC),fromDescription:!1})}for(;this.toolLabels.size>b1;){let i=this.toolLabels.keys().next().value;if(i===void 0)break;this.toolLabels.delete(i)}}openUnsolicitedTurn(){let e=Date.now();if(this.lastUnsolicitedCancelAt!==0&&e-this.lastUnsolicitedCancelAt<=n.UNSOLICITED_REOPEN_WINDOW_MS?this.cancelReopenStreak+=1:this.cancelReopenStreak=0,this.lastUnsolicitedCancelAt=0,this.cancelReopenStreak>=n.UNSOLICITED_REOPEN_LIMIT){this.escalateUnresponsiveCancel();return}let t=this.lastBackgroundTask,r=!1;for(let[i,a]of this.armedTasks)a.repeating||(this.armedTasks.delete(i),r=!0);r&&this.onArmedTasksChanged();let s={messageId:Bs(),startedAt:e,cause:t,steerCaused:this.pendingSteerDetach!==void 0};this.pendingSteerDetach=void 0,this.unsolicitedTurn=s,this.promptStartedAt=e,this.logger?.info(`session ${this.sessionId} agent resumed with no prompt in flight`+(t?` (after ${t.label})`:""));let o={unsolicited:!0};t&&(o.cause=t),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"_hydra_turn_started",messageId:s.messageId,_meta:{"hydra-acp":o}}})}async holdForUnsolicitedTurn(e){if(this.unsolicitedTurn===void 0){this.logger?.info(`session ${this.sessionId} queue hold skipped for ${e.messageId} (no unsolicited turn open)`);return}let t=Date.now(),r=this.unsolicitedTurn.cause;this.logger?.info(`session ${this.sessionId} holding ${e.messageId} behind unsolicited turn ${this.unsolicitedTurn.messageId}`+(r?` cause=${JSON.stringify(r.label)}`:"")),this.broadcastQueueNotification("hydra-acp/prompt_queue/held",{sessionId:this.sessionId,messageId:e.messageId,reason:"agent_resumed",...r?{cause:r}:{}});let s="turn_ended";for(;;){if(this.closing||this.closed){s="closing";break}if(e.cancelled){s="cancelled";break}if(this.unsolicitedTurn===void 0){s="turn_ended";break}await new Promise(i=>{let a=setTimeout(i,v1);typeof a.unref=="function"&&a.unref()})}let o=Date.now()-t;this.logger?.info(`session ${this.sessionId} released ${e.messageId} reason=${s} heldMs=${o}`),this.broadcastQueueNotification("hydra-acp/prompt_queue/released",{sessionId:this.sessionId,messageId:e.messageId,reason:s,heldMs:o})}closeUnsolicitedTurn(e,t){let r=this.unsolicitedTurn;if(r===void 0)return;let s=Date.now()-r.startedAt;this.unsolicitedTurn=void 0,this.promptStartedAt=void 0,e==="cancelled"?this.lastUnsolicitedCancelAt=Date.now():(this.lastUnsolicitedCancelAt=0,this.cancelReopenStreak=0),this.logger?.info(`session ${this.sessionId} unsolicited turn ${r.messageId} closed reason=${e} durationMs=${s}`+(t?` by=${t}`:"")+(r.cause?` cause=${JSON.stringify(r.cause.label)}`:"")),e==="superseded"&&(this.supersededAutonomousTurn={turnMessageId:r.messageId,cause:r.cause,supersededAt:Date.now()}),this.recordCurrentUsageSnapshot(),!this.closed&&(e==="cancelled"&&this.closeOpenToolCalls("cancelled"),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"_hydra_turn_ended",messageId:Bs(),startedMessageId:r.messageId,durationMs:s,_meta:{"hydra-acp":{unsolicited:!0,reason:e}}}}))}salvageSupersededTerminal(){let e=this.supersededAutonomousTurn;if(e===void 0)return;this.supersededAutonomousTurn=void 0;let t=this.autonomousSalvage;t!==void 0&&(this.autonomousSalvage=void 0,this.logger?.warn(`session ${this.sessionId} salvaged session/prompt from autonomous terminal (superseded turn ${e.turnMessageId}, ${Date.now()-e.supersededAt}ms earlier)`+(e.cause?` cause=${JSON.stringify(e.cause.label)}`:"")),t({stopReason:"end_turn",_meta:{[ft]:{salvaged:{reason:"autonomous_terminal",supersededMessageId:e.turnMessageId}}}}))}async awaitPromptResponse(e){if(this.supersededAutonomousTurn===void 0)return e;try{return await new Promise((t,r)=>{this.autonomousSalvage=t,e.then(t,r)})}finally{this.autonomousSalvage=void 0}}recordTerminal(e,t){for(this.recentlyTerminal.set(e,{stopReason:t,terminatedAt:Date.now()});this.recentlyTerminal.size>m1;){let r=this.recentlyTerminal.keys().next().value;if(r===void 0)break;this.recentlyTerminal.delete(r)}}registerTurnNotify(e,t,r){let s=this.recentlyTerminal.get(e);if(s)return{alreadyTerminal:!0,stopReason:s.stopReason};for(this.pendingTurnNotifiers.set(e,{callbackUrl:t,secret:r,registeredAt:Date.now(),originalMessageId:e});this.pendingTurnNotifiers.size>p1;){let o=this.pendingTurnNotifiers.keys().next().value;if(o===void 0)break;this.pendingTurnNotifiers.delete(o)}return{alreadyTerminal:!1}}broadcastPromptAmended(e){let t=this.findUserEntry(e.newMessageId);if(!t)return;let r={sessionId:this.sessionId,cancelledMessageId:e.cancelledMessageId,newMessageId:e.newMessageId,prompt:t.prompt,originator:t.originator,amendedAt:Date.now()};this.broadcastQueueNotification("hydra-acp/prompt/amended",r)}findUserEntry(e){if(this.currentEntry?.messageId===e&&this.currentEntry.kind==="user")return this.currentEntry;let t=this.promptQueue.find(r=>r.messageId===e&&r.kind==="user");return t?.kind==="user"?t:void 0}visibleQueueDepth(){let e=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled?1:0;for(let t of this.promptQueue)t.kind==="user"&&!t.cancelled&&(e+=1);return e}broadcastQueueAdded(e,t){let r=this.visibleQueueDepth(),s=t?.position??Math.max(0,r-1),o={sessionId:this.sessionId,messageId:e.messageId,originator:e.originator,prompt:e.prompt,position:s,queueDepth:r,enqueuedAt:e.enqueuedAt};t?.amending!==void 0&&(o._meta={"hydra-acp":{amending:t.amending}}),this.broadcastQueueNotification("hydra-acp/prompt_queue/added",o)}broadcastQueueUpdated(e,t){this.broadcastQueueNotification("hydra-acp/prompt_queue/updated",{sessionId:this.sessionId,messageId:e,prompt:t})}broadcastQueueRemoved(e,t){this.broadcastQueueNotification("hydra-acp/prompt_queue/removed",{sessionId:this.sessionId,messageId:e,reason:t})}broadcastQueueNotification(e,t){for(let r of this.clients.values())r.connection.notify(e,t).catch(()=>{})}queueSnapshot(){let e=[],t=0;this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled&&e.push({messageId:this.currentEntry.messageId,originator:this.currentEntry.originator,prompt:this.currentEntry.prompt,position:t++,enqueuedAt:this.currentEntry.enqueuedAt});for(let r of this.promptQueue)r.kind!=="user"||r.cancelled||e.push({messageId:r.messageId,originator:r.originator,prompt:r.prompt,position:t++,enqueuedAt:r.enqueuedAt});return e}async flushPersistWrites(){await this.queueWriteChain.catch(()=>{})}replayPersistedQueue(e){for(let t of e){let r={clientId:`hydra-resurrected_${t.messageId}`};t.originator.clientInfo.name!==void 0&&(r.name=t.originator.clientInfo.name),t.originator.clientInfo.version!==void 0&&(r.version=t.originator.clientInfo.version);let s={kind:"user",messageId:t.messageId,originator:r,clientId:r.clientId,prompt:t.prompt,enqueuedAt:t.enqueuedAt,cancelled:!1,resolve:()=>{},reject:()=>{}};this.promptQueue.push(s),this.broadcastQueueAdded(s)}this.drainQueue()}cancelQueuedPrompt(e){if(this.currentEntry?.messageId===e)return{cancelled:!1,reason:"already_running"};let t=this.promptQueue.findIndex(s=>s.messageId===e);if(t<0)return{cancelled:!1,reason:"not_found"};let r=this.promptQueue[t];return r.cancelled=!0,this.promptQueue.splice(t,1),r.kind==="user"&&(this.broadcastQueueRemoved(e,"cancelled"),this.persistRewrite()),this.amendInProgress?.newMessageId===e&&(this.amendInProgress=void 0),r.resolve({stopReason:"cancelled"}),{cancelled:!0,reason:"ok"}}updateQueuedPrompt(e,t){if(this.currentEntry?.messageId===e)return{updated:!1,reason:"already_running"};let r=this.promptQueue.find(s=>s.messageId===e);return!r||r.kind!=="user"?{updated:!1,reason:"not_found"}:(r.prompt=t,this.broadcastQueueUpdated(e,t),this.persistRewrite(),{updated:!0,reason:"ok"})}amendPrompt(e,t){let r=this.clients.get(e);if(!r)throw Qn(new Error("client not attached"),G.SessionNotFound);let{targetMessageId:s,prompt:o,replaceQueue:i,onTargetCompleted:a}=t;if(this.currentEntry?.messageId===s&&this.currentEntry.kind==="user"&&!this.currentEntry.cancelled&&this.amendInProgress===void 0)return this.amendOnHead(r,o,s,i);let d=this.promptQueue.find(l=>l.messageId===s&&l.kind==="user");if(d&&d.kind==="user"&&!d.cancelled)return d.prompt=o,this.broadcastQueueUpdated(s,o),this.persistRewrite(),{amended:!0,reason:"ok",messageId:s};let c=this.recentlyTerminal.get(s);return c?c.stopReason==="cancelled"?{amended:!1,reason:"target_cancelled"}:a==="send_anyway"?{amended:!1,reason:"target_completed",messageId:this.enqueueAmendmentAsFollowUp(r,o)}:{amended:!1,reason:"target_completed"}:{amended:!1,reason:"target_not_found"}}amendOnHead(e,t,r,s){let o=Bs(),i={clientId:e.clientId};if(e.clientInfo?.name&&(i.name=e.clientInfo.name),e.clientInfo?.version&&(i.version=e.clientInfo.version),s){let c=[];for(let l of this.promptQueue){if(l.kind==="user"&&!l.cancelled){l.cancelled=!0,this.broadcastQueueRemoved(l.messageId,"cancelled"),l.resolve({stopReason:"cancelled"});continue}c.push(l)}this.promptQueue=c}let a={kind:"user",messageId:o,originator:i,clientId:e.clientId,prompt:t,enqueuedAt:Date.now(),cancelled:!1,wasAmend:!0,resolve:()=>{},reject:()=>{}};this.promptQueue.unshift(a),this.persistRewrite(),this.broadcastQueueAdded(a,{amending:r,position:1}),this.amendInProgress={cancelledMessageId:r,newMessageId:o};let d=this.pendingTurnNotifiers.get(r);return d&&(this.pendingTurnNotifiers.delete(r),this.pendingTurnNotifiers.set(o,d)),this.cancelExtensionDispatch(r,"amended"),this.agent.connection.notify("session/cancel",{sessionId:this.upstreamSessionId}).catch(()=>{}),{amended:!0,reason:"ok",messageId:o}}async steer(e,t){let r=this.clients.get(e);if(!r)throw Qn(new Error("client not attached"),G.SessionNotFound);let s=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled;if(s&&this.agent.steeringSupported){this.pendingSteerDetach={messageId:this.currentEntry.messageId};let o;try{o=await this.forwardRequest("_session/steering",t)}catch(d){throw this.pendingSteerDetach=void 0,d}let i=o?.outcome,a=i==="injected"||i==="startedNewTurn"||i==="promptRequired"||i==="failed"?o:{outcome:"failed"};return a.outcome!=="startedNewTurn"&&(this.pendingSteerDetach=void 0),a.outcome==="injected"&&this.recordSteerAsUserMessageChunk(t.prompt,e),a.outcome==="startedNewTurn"?{...a,detached:!0}:a}return s?(this.amendOnHead(r,t.prompt,this.currentEntry.messageId,!1),{outcome:"startedNewTurn"}):t._meta?.steering?.idleBehavior==="promptRequired"?{outcome:"promptRequired",reason:"noRunningTurn"}:(this.prompt(e,{sessionId:t.sessionId,prompt:t.prompt},void 0,{steerOriginated:!0}).catch(o=>{this.logger?.warn(`steer-originated prompt failed to enqueue: ${o.message}`)}),{outcome:"startedNewTurn"})}recordSteerAsUserMessageChunk(e,t){let r=da(e);r.length!==0&&this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"user_message_chunk",content:{type:"text",text:r},_meta:{"hydra-acp":{steered:!0}}}},t)}enqueueAmendmentAsFollowUp(e,t){let r=Bs(),s={clientId:e.clientId};e.clientInfo?.name&&(s.name=e.clientInfo.name),e.clientInfo?.version&&(s.version=e.clientInfo.version);let o={kind:"user",messageId:r,originator:s,clientId:e.clientId,prompt:t,enqueuedAt:Date.now(),cancelled:!1,resolve:()=>{},reject:()=>{}};return this.promptQueue.push(o),this.persistRewrite(),this.broadcastQueueAdded(o),this.drainQueue(),r}async cancel(e){if(!this.clients.get(e))throw Qn(new Error("client not attached"),G.SessionNotFound);this.logger?.info(`session ${this.sessionId} session/cancel from ${e} promptInFlight=${this.promptInFlight} agentTurnInFlight=${this.agentTurnInFlight} unsolicitedTurn=${this.unsolicitedTurn!==void 0} queued=${this.promptQueue.length}`),this.lastCancelAt=Date.now(),this.currentEntry?.kind==="user"&&this.currentEntry.messageId!==void 0&&this.cancelExtensionDispatch(this.currentEntry.messageId,"cancelled"),this.closeUnsolicitedTurn("cancelled"),this.agentTurnInFlight||this.closeOpenToolCalls("cancelled"),await this.forwardRequest("session/cancel",{sessionId:this.sessionId},new Set,0,"notification")}addTransformer(e){let t=this.transformChain.findIndex(r=>r.name===e.name);t>=0?this.transformChain[t]=e:this.transformChain.push(e),e.intercepts.has("lifecycle:session.opened")&&e.connection.notify("hydra-acp/transformer/session_event",{event:"session.opened",sessionId:this.sessionId}).catch(()=>{})}async forwardRequest(e,t,r=new Set,s=0,o="request"){let i=this.rewriteForAgent(t);for(let a=s;a<this.transformChain.length;a++){let d=this.transformChain[a];if(r.has(d.name))continue;let c=`request:${e}`;if(!d.intercepts.has(c))continue;let l=`t_${_w()}`,u;try{u=await d.connection.request("hydra-acp/transformer/message",{token:l,phase:"request",method:e,direction:"client\u2192agent",sessionId:this.sessionId,envelope:i})}catch(p){this.logger?.warn(`transformer ${d.name} error on ${c}: ${p.message}`);continue}let f=u?.action??"continue";if(f==="stop")return o==="notification"?void 0:u?.payload??Fw(e);if(f==="continue"){u?.payload&&typeof u.payload=="object"&&(i=u.payload),r.add(d.name);continue}if(f==="processing"){let p=a,m=i,h=new Set(r);return new Promise(g=>{let w=setTimeout(()=>{this.pendingClaims.delete(l)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:l,transformerName:d.name}),this.forwardRequest(e,m,new Set([...h,d.name]),p+1,o).then(g).catch(()=>g(o==="notification"?void 0:Fw(e))))},Ap);typeof w.unref=="function"&&w.unref(),this.pendingClaims.set(l,{resolve:g,timer:w,transformerName:d.name,method:e,envelope:m,chainIdx:p,originatedBy:h,side:"request",tailKind:o})})}r.add(d.name)}if(o==="notification"){await this.agent.connection.notify(e,i);return}return this.agent.connection.request(e,i)}async forwardModelChange(e,t){let r=await ri({request:(s,o)=>this.forwardRequest(s,o),sessionId:this.sessionId,modelId:e,verb:this.modelVerb,extraParams:t,logger:this.logger});return this.modelVerb=r.verb,this.modelVerbConfirmed=!0,r.result}noteModelVerbHint(e,t){e===void 0||this.modelVerbConfirmed||e===this.modelVerb||(this.logger?.info(`model verb for agent ${this.agentId} inferred as ${e} from ${t} (was ${this.modelVerb})`),this.modelVerb=e)}resetModelVerb(e){this.modelVerb=e??Ls,this.modelVerbConfirmed=!1}async runAgentRequestChain(e,t,r=new Set,s=0){let o=t,i=`request:${e}`;for(let a=s;a<this.transformChain.length;a++){let d=this.transformChain[a];if(r.has(d.name)||!d.intercepts.has(i))continue;let c=`t_${_w()}`,l;try{l=await d.connection.request("hydra-acp/transformer/message",{token:c,phase:"request",method:e,direction:"agent\u2192client",sessionId:this.sessionId,envelope:o})}catch(f){this.logger?.warn(`transformer ${d.name} error on ${i}: ${f.message}`);continue}let u=l?.action??"continue";if(u==="stop")return{shortCircuit:!0,payload:l?.payload??j1(e)};if(u==="continue"){l?.payload&&typeof l.payload=="object"&&(o=l.payload),r.add(d.name);continue}if(u==="processing"){let f=a,p=o,m=new Set(r),h=e;return new Promise(g=>{let w=setTimeout(()=>{this.pendingClaims.delete(c)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:c,transformerName:d.name}),this.runAgentRequestChain(h,p,new Set([...m,d.name]),f+1).then(g).catch(()=>g({shortCircuit:!1,envelope:p})))},Ap);typeof w.unref=="function"&&w.unref(),this.pendingClaims.set(c,{resolve:b=>g({shortCircuit:!0,payload:b}),timer:w,transformerName:d.name,method:h,envelope:p,chainIdx:f,originatedBy:m,side:"agent-request"})})}r.add(d.name)}return{shortCircuit:!1,envelope:o}}dischargeClaim(e,t){let r=this.pendingClaims.get(e);return r?(clearTimeout(r.timer),this.pendingClaims.delete(e),r.resolve(t),!0):!1}keepAliveClaim(e,t){let r=this.pendingClaims.get(e);if(!r)return!1;clearTimeout(r.timer);let s=typeof t=="number"&&t>0?Math.min(t*1.5,1800*1e3):Ap,o=setTimeout(()=>{if(this.pendingClaims.delete(e))if(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:e,transformerName:r.transformerName}),r.side==="response")this.runResponseChain(r.envelope,new Set([...r.originatedBy,r.transformerName]),r.chainIdx+1).then(()=>r.resolve(void 0)).catch(()=>r.resolve(void 0));else if(r.side==="agent-request")this.runAgentRequestChain(r.method,r.envelope,new Set([...r.originatedBy,r.transformerName]),r.chainIdx+1).then(r.resolve).catch(()=>r.resolve({shortCircuit:!1,envelope:r.envelope}));else{let i=r.tailKind??"request";this.forwardRequest(r.method,r.envelope,new Set([...r.originatedBy,r.transformerName]),r.chainIdx+1,i).then(r.resolve).catch(()=>r.resolve(i==="notification"?void 0:Fw(r.method)))}},s);return typeof o.unref=="function"&&o.unref(),r.timer=o,!0}async emitToChain(e,t,r){let s=this.transformChain.findIndex(a=>a.name===e),o=s>=0?s+1:0,i=new Set([e]);if(t==="session/update"){await this.runResponseChain(r,i,o);return}return this.forwardRequest(t,r,i,o)}async emitToQueue(e,t){let r=this.transformChain.findIndex(c=>c.name===e),s=r>=0?r+1:0,o=(t??{}).prompt??[],i=Bs(),a=`transformer:${e}`,d={clientId:a,name:e};return new Promise((c,l)=>{let u={kind:"user",messageId:i,originator:d,clientId:a,prompt:o,enqueuedAt:Date.now(),cancelled:!1,emitterName:e,chainStartIdx:s,resolve:c,reject:l},f=this.insertEntryAt(u,"tail");this.persistRewrite(),this.broadcastQueueAdded(u,{position:f}),this.drainQueue()})}rewriteForAgent(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e;if(t.sessionId===this.sessionId)return{...t,sessionId:this.upstreamSessionId}}return e}async close(e={}){if(e.deleteRecord&&(this.deleteRecordIntent=!0),!this.closed)return this.closeInFlight?this.closeInFlight:(this.closing=!0,this.closeInFlight=this.doClose(e),this.closeInFlight)}async doClose(e){let t=this.turnStartedAt!==void 0;this.logger?.info(`session ${this.sessionId} closing deleteRecord=${e.deleteRecord??!1} by=${e.by??"unknown"} midTurn=${t} unsolicitedTurn=${this.unsolicitedTurn!==void 0} queued=${this.promptQueue.length} awaitingPermission=${this.hasPermissionFlag}`),t&&this.logger?.warn(`session ${this.sessionId} closed mid-turn by=${e.by??"unknown"}; the in-flight turn will not settle and the agent is being killed`),this.cancelIdleTimer(),this.cancelOrphanTimer();for(let r of this.pendingClaims.values())clearTimeout(r.timer);this.pendingClaims.clear(),await this.agent.kill().catch(()=>{}),this.markClosed({deleteRecord:e.deleteRecord??!1})}onClose(e){return this.closeHandlers.push(e),()=>{let t=this.closeHandlers.indexOf(e);t>=0&&this.closeHandlers.splice(t,1)}}onTitleChange(e){this.titleHandlers.push(e)}retitle(e){return this.runTitleCommand(e)}retitleFromAgent(){return this.runTitleCommand("")}setTitle(e){let t=e.trim();if(!(!t||t===this.title)){this._titleSeedPending=!1,this.title=t,this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",title:t,updatedAt:new Date().toISOString()}});for(let r of this.titleHandlers)try{r(t)}catch{}}}maybeSeedTitleFromPrompt(e){if(!this._titleSeedPending||Pn((e??{})._meta).ancillary===!0||this.promptCarriesSentBy(e))return;let s=da((e??{}).prompt),o=Nw(s,200);!o||o.startsWith("/")||(this._titleSeedPending=!1,this.setTitle(o))}maybeApplyAgentModel(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="_hydra_current_model_update")return!1;let s=Jl(r.availableModels);s.length>0&&this.setAgentAdvertisedModels(s);let o=typeof r.currentModel=="string"?r.currentModel:typeof r.model=="string"?r.model:void 0;if(o===void 0)return!0;let i=o.trim();if(!i||i===this.currentModel)return!0;this.logger?.info(`live current_model_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(i)}`),this.currentModel=i;for(let a of this.modelHandlers)try{a(i)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentConfigOption(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="config_option_update")return!1;let s=r.configOptions;if(!Array.isArray(s))return!0;for(let i of s)this.applyOneConfigOptionEntry(i);let o=new Set(s.filter(i=>!!i&&typeof i=="object").map(i=>typeof i.id=="string"?i.id.trim():void 0).filter(i=>!!i&&i!=="model"&&i!=="mode"&&i!=="agent"));return this.agentAdvertisedConfigOptions=this.agentAdvertisedConfigOptions.filter(i=>o.has(i.id)),!0}applyAgentConfigOptionResponse(e,t){let r=e?.configOptions;if(!Array.isArray(r))return!1;let s=JSON.stringify(this.agentAdvertisedConfigOptions);for(let o of r){let i=o?.id;i==="model"||i==="mode"||i==="agent"||this.applyOneConfigOptionEntry(o)}if(w1(r,t)){let o=new Set(r.filter(i=>!!i&&typeof i=="object").map(i=>typeof i.id=="string"?i.id.trim():void 0).filter(i=>!!i));this.agentAdvertisedConfigOptions=this.agentAdvertisedConfigOptions.filter(i=>o.has(i.id))}return JSON.stringify(this.agentAdvertisedConfigOptions)!==s}applyOneConfigOptionEntry(e){if(!e||typeof e!="object")return;let t=e;if(t.id==="model"){let h=Jl(t.options);h.length>0&&this.setAgentAdvertisedModels(h);let g=t.currentValue;if(typeof g=="string"){let w=g.trim();w&&w!==this.currentModel&&(this.logger?.info(`live config_option_update(model): sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(w)}`),this.applyModelChange(w))}return}if(t.id==="mode"){let h=Tp(t.options);h.length>0&&this.setAgentAdvertisedModes(h);let g=t.currentValue;if(typeof g=="string"){let w=g.trim();w&&w!==this.currentMode&&(this.logger?.info(`live config_option_update(mode): sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(w)}`),this.applyModeChange(w))}return}if(typeof t.id!="string"||!t.id.trim())return;let r=t.id.trim(),s=Lw(t.options);if(s.length===0)return;let o=t.name,i=typeof o=="string"&&o.trim()?o.trim():r,a=t.category,d=typeof a=="string"&&a.trim()?a.trim():"other",c=t.description,l=typeof c=="string"&&c.trim()?c.trim():void 0,u=t.currentValue,f=typeof u=="string"&&u.trim()?u.trim():s[0].value,p={id:r,name:i,category:d,type:"select",currentValue:f,options:s,...l?{description:l}:{}},m=this.agentAdvertisedConfigOptions.findIndex(h=>h.id===r);m>=0?this.agentAdvertisedConfigOptions[m]=p:this.agentAdvertisedConfigOptions.push(p)}maybeApplyAgentMode(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="current_mode_update")return!1;let s=typeof r.currentModeId=="string"?r.currentModeId:typeof r.currentMode=="string"?r.currentMode:typeof r.mode=="string"?r.mode:void 0;if(s===void 0)return!0;let o=s.trim();if(!o||o===this.currentMode)return!0;this.logger?.info(`current_mode_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(o)}`),this.currentMode=o;for(let i of this.modeHandlers)try{i(o)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentUsage(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="usage_update")return!1;let s={...this._currentUsage??{}},o=!1;if(typeof r.used=="number"&&s.used!==r.used&&(s.used=r.used,o=!0),typeof r.size=="number"&&s.size!==r.size&&(s.size=r.size,o=!0),r.cost&&typeof r.cost=="object"){let a=r.cost;typeof a.amount=="number"&&(this.reconcileCostLedger(a.amount)&&(o=!0),s.costAmount!==a.amount&&(s.costAmount=a.amount,o=!0)),typeof a.currency=="string"&&s.costCurrency!==a.currency&&(s.costCurrency=a.currency,o=!0)}if(!o)return!0;this._currentUsage=s;let i=this.persistableUsage??s;for(let a of this.usageHandlers)try{a(i)}catch{}return!0}armCostLedgerProbe(){let e=this._currentUsage?.costAmount;typeof e=="number"&&e>0&&(this.costLedgerProbe=e)}reconcileCostLedger(e){let t=this.costLedgerProbe;return t===void 0||(this.costLedgerProbe=void 0,e>=t-1e-6)?!1:(this.cumulativeCost+=t,!0)}notifyAgentChange(e,t,r,s){let o=this.retiringGenerationCost;this.retiringGenerationCost=void 0;let i=this.retiringGenerationUsed;this.retiringGenerationUsed=void 0;let a=this.rotationLifetimeCost;this.rotationLifetimeCost=void 0;for(let d of this.agentChangeHandlers)try{d({agentId:this.agentId,upstreamSessionId:this.upstreamSessionId,...o!==void 0?{retiredCost:o}:{},...a!==void 0?{lifetimeCost:a}:{},...i!==void 0?{retiredUsed:i}:{},...s!==void 0?{startedUsed:s}:{},...t!==void 0?{reason:t}:{},...r!==void 0?{runId:r}:{}})}catch(c){this.logger?.warn(`${e}: agentChange handler failed: ${c.message}`)}}accumulateAndResetCost(){let e=this._currentUsage?.costAmount;e&&(this.cumulativeCost+=e,this.retiringGenerationCost=e);let t=this._currentUsage?.used;typeof t=="number"&&t>0&&(this.retiringGenerationUsed=t),this.rotationLifetimeCost=this.cumulativeCost;let r={used:0,cumulativeCost:this.cumulativeCost,...typeof this._currentUsage?.size=="number"?{size:this._currentUsage.size}:{},...this._currentUsage?.costCurrency?{costCurrency:this._currentUsage.costCurrency}:{}};this._currentUsage=r;for(let s of this.usageHandlers)try{s(r)}catch{}this.broadcastCurrentUsage()}broadcastCurrentUsage(){let e=this.currentUsage;if(e===void 0)return;let t={sessionUpdate:"usage_update"};if(typeof e.used=="number"&&(t.used=e.used),typeof e.size=="number"&&(t.size=e.size),typeof e.costAmount=="number"||typeof e.costCurrency=="string"){let r={};typeof e.costAmount=="number"&&(r.amount=e.costAmount),typeof e.costCurrency=="string"&&(r.currency=e.costCurrency),t.cost=r}this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:t})}injectCumulativeCost(e){if(!this.cumulativeCost||!e||typeof e!="object")return e;let t=e;if(!t.update||typeof t.update!="object")return e;let r=t.update;if(r.sessionUpdate!=="usage_update"||!r.cost||typeof r.cost!="object")return e;let s=r.cost;return typeof s.amount!="number"?e:{...t,update:{...r,cost:{...s,amount:this.cumulativeCost+s.amount}}}}get totalUsage(){return this.currentUsage}setAgentAdvertisedCommands(e){if(P1(this.agentAdvertisedCommands,e)){this.broadcastMergedCommands();return}this.agentAdvertisedCommands=e;for(let t of this.agentCommandsHandlers)try{t(e)}catch{}this.broadcastMergedCommands()}setAgentAdvertisedModes(e){if(M1(this.agentAdvertisedModes,e)){this.broadcastAvailableModes();return}this.agentAdvertisedModes=e;for(let t of this.agentModesHandlers)try{t(e)}catch{}this.broadcastAvailableModes()}setAgentAdvertisedModels(e){if(this.logger?.info(`setAgentAdvertisedModels: sessionId=${this.sessionId} currentModel=${JSON.stringify(this.currentModel)} newList=[${e.map(t=>t.modelId).join(",")}]`),_1(this.agentAdvertisedModels,e)){this.broadcastAvailableModels();return}this.agentAdvertisedModels=e;for(let t of this.agentModelsHandlers)try{t(e)}catch{}this.broadcastAvailableModels()}onAgentCommandsChange(e){this.agentCommandsHandlers.push(e)}onAgentModesChange(e){this.agentModesHandlers.push(e)}onAgentModelsChange(e){this.agentModelsHandlers.push(e)}onModelChange(e){this.modelHandlers.push(e)}onModeChange(e){this.modeHandlers.push(e)}onInteractiveChange(e){this.interactiveHandlers.push(e)}onPriorityChange(e){this.priorityHandlers.push(e)}setPriority(e){let t=e===void 0||e<=0?void 0:Math.floor(e);if(t!==this._priority){this._priority=t,this.updatedAt=Date.now();for(let r of this.priorityHandlers)try{r(t)}catch{}}}applyModelChange(e){let t=e.trim();if(t){this.modelChangeInFlight=!0;try{if(t!==this.currentModel){this.logger?.info(`applyModelChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(t)}`),this.currentModel=t;for(let s of this.modelHandlers)try{s(t)}catch{}}let r={sessionUpdate:"_hydra_current_model_update",currentModel:t};this.agentAdvertisedModels.length>0&&(r.availableModels=[...this.agentAdvertisedModels]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:r}),this.broadcastConfigOptions()}finally{this.modelChangeInFlight=!1}}}applyModeChange(e){let t=e.trim();if(t){this.modeChangeInFlight=!0;try{if(t!==this.currentMode){this.logger?.info(`applyModeChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(t)}`),this.currentMode=t;for(let s of this.modeHandlers)try{s(t)}catch{}}let r={sessionUpdate:"current_mode_update",currentModeId:t};this.agentAdvertisedModes.length>0&&(r.availableModes=[...this.agentAdvertisedModes]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:r}),this.broadcastConfigOptions()}finally{this.modeChangeInFlight=!1}}}buildConfigOptions(){let e=[];if(this.agentAdvertisedModels.length>0){let s=this.agentAdvertisedModels.map(i=>({value:i.modelId,name:i.name??i.modelId,...i.description!==void 0?{description:i.description}:{}}));this.currentModel&&!s.some(i=>i.value===this.currentModel)&&s.unshift({value:this.currentModel,name:this.currentModel});let o=this.currentModel||s[0].value;e.push({id:"model",name:"Model",category:"model",type:"select",currentValue:o,options:s})}if(this.agentAdvertisedModes.length>0){let s=this.agentAdvertisedModes.map(i=>({value:i.id,name:i.name??i.id,...i.description!==void 0?{description:i.description}:{}}));this.currentMode&&!s.some(i=>i.value===this.currentMode)&&s.unshift({value:this.currentMode,name:this.currentMode});let o=this.currentMode||s[0].value;e.push({id:"mode",name:"Session Mode",category:"mode",type:"select",currentValue:o,options:s})}let r=(this.availableAgentsFn?.()??[]).map(s=>({value:s.id,name:s.name??s.id,...s.description!==void 0?{description:s.description}:{}}));return r.some(s=>s.value===this.agentId)||r.unshift({value:this.agentId,name:this.agentId}),e.push({id:"agent",name:"Agent",category:"_hydra_agent",type:"select",currentValue:this.agentId,options:r}),e.push(...this.agentAdvertisedConfigOptions),e}broadcastConfigOptions(){this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"config_option_update",configOptions:this.buildConfigOptions()}})}mergeAgentOptionIntoEnvelope(e){if(!e||typeof e!="object")return e;let t=e;if(!t.update||typeof t.update!="object")return e;let r=t.update,s=Array.isArray(r.configOptions)?[...r.configOptions]:[];if(s.some(a=>a&&typeof a=="object"&&a.id==="agent"))return e;let i=this.buildConfigOptions().find(a=>a.id==="agent");return i?{...t,update:{...r,configOptions:[...s,i]}}:e}onUsageChange(e){this.usageHandlers.push(e)}mergedAvailableCommands(){let e=this.daemonTopLevelCommands(),t=this.aliasableBareVerbs();for(let r of ic){if(t.get(r.verb)!=="__hydra__")continue;let s=r.argsHint?`${r.verb} ${r.argsHint}`:r.verb;e.push({name:s,description:`Alias for '/hydra ${r.verb}': ${r.description}`})}if(this.extensionCommands)for(let{name:r,command:s}of this.extensionCommands.list()){let o=s.verb?`hydra ${r} ${s.verb}`:`hydra ${r}`,a={name:s.argsHint?`${o} ${s.argsHint}`:o};s.description&&(a.description=s.description),e.push(a);let d=r.startsWith("hydra-acp-")?r.slice(10):r;if(r.startsWith("hydra-acp-")&&d.length>0){let c=s.verb?`hydra ${d} ${s.verb}`:`hydra ${d}`,u={name:s.argsHint?`${c} ${s.argsHint}`:c};s.description&&(u.description=s.description),e.push(u)}if(d.length>0&&t.get(d)===r){let c=s.verb?`${d} ${s.verb}`:d,u={name:s.argsHint?`${c} ${s.argsHint}`:c};s.description&&(u.description=s.description),e.push(u)}}return e.push(...this.agentAdvertisedCommands),e}daemonTopLevelCommands(){return[{name:"hydra",description:"Hydra session command (kill, restart, title, agent <agent>)"},{name:"model",description:"Switch model; omit arg to list available models"},{name:"mode",description:"Switch mode; omit arg to list available modes"},{name:"sessions",description:"List all sessions"},{name:"help",description:"Show available commands"}]}aliasableBareVerbs(){let e=new Set,t=i=>i.split(/\s+/)[0]??"";for(let i of this.daemonTopLevelCommands()){let a=t(i.name);a&&e.add(a)}for(let i of this.agentAdvertisedCommands){let a=t(i.name),d=a.startsWith("/")?a.slice(1):a;d&&e.add(d)}let r=new Map;for(let i of ic)e.has(i.verb)||r.set(i.verb,"__hydra__");if(!this.extensionCommands)return r;let s=new Map,o=new Set;for(let{name:i}of this.extensionCommands.list()){if(o.has(i))continue;o.add(i);let a=i.startsWith("hydra-acp-")?i.slice(10):i;if(!a||e.has(a)||r.has(a))continue;let d=s.get(a);d===void 0?s.set(a,i):d!==i&&s.set(a,"__conflict__")}for(let[i,a]of s)a!=="__conflict__"&&r.set(i,a);return r}agentOnlyAdvertisedCommands(){return[...this.agentAdvertisedCommands]}agentKnowsSlashCommand(e){let t=s=>s.startsWith("/")?s.slice(1):s,r=t(e);if(!r)return!1;for(let s of this.agentAdvertisedCommands)if(t(s.name.split(/\s+/)[0]??"")===r)return!0;return!1}availableModes(){return[...this.agentAdvertisedModes]}availableModels(){return[...this.agentAdvertisedModels]}maybeApplyAgentSessionInfo(e){let r=(e??{}).update??{};if(r.sessionUpdate!=="session_info_update"||typeof r.title!="string"||this._upstreamRespawned)return;let s=r.title.trim();if(!(!s||s===this.title)){this.title=s,this._firstPromptSeeded=!0,this._titleSeedPending=!1;for(let o of this.titleHandlers)try{o(s)}catch{}}}async handleSlashCommand(e,t){let s=e.slice(6).trim().match(/^(\S+)(?:\s+([\s\S]*))?$/),o=s?.[1]??"",i=(s?.[2]??"").trim();if(o==="")return{stopReason:"end_turn"};let a=t!==void 0;if(ic.some(u=>u.verb===o))switch(o){case"title":return a?this.runTitleCommandInline(i):this.runTitleCommand(i);case"agent":return this.runAgentCommandInline(i);case"config":return this.handleConfigCommand(`/config ${i}`);case"kill":return this.runKillCommand();case"workspace":return this.runWorkspaceCommand(i);case"restart":return a?this.runRestartCommandInline():this.runRestartCommand();case"compact":return a?this.runCompactCommandInline(i):this.runCompactCommand(i);case"uncompact":return a?this.runUncompactCommandInline():this.runUncompactCommand();case"fork":return a?this.runForkCommandInline(i,t):this.runForkCommand(i);default:{let u=new Error(`no dispatcher for /hydra verb ${o}`);throw u.code=G.InternalError,u}}if(this.extensionCommands?.has(o))return a?this.runExtensionCommandInline(o,i,t):this.runExtensionCommand(o,i);let d=`hydra-acp-${o}`;if(this.extensionCommands?.has(d))return a?this.runExtensionCommandInline(d,i,t):this.runExtensionCommand(d,i);let c=ic.map(u=>u.verb);if(this.extensionCommands){let u=new Set;for(let{name:f}of this.extensionCommands.list())u.has(f)||(c.push(f),u.add(f))}let l=new Error(`unknown /hydra verb: ${o} (known: ${c.join(", ")})`);throw l.code=G.InvalidParams,l}runExtensionCommand(e,t){return this.enqueuePrompt(`extension:${e}`,()=>this.runExtensionCommandInline(e,t,void 0))}async runExtensionCommandInline(e,t,r){let s=this.extensionCommands?.get(e);if(!s)return this.emitExtensionReply(`extension "${e}" is no longer connected`);let o=t.match(/^(\S+)(?:\s+([\s\S]*))?$/),i=o?.[1]??"",a=(o?.[2]??"").trim();if(!s.commands.some(m=>m.verb===i)){let m=s.commands.map(h=>h.verb).join(", ");return this.emitExtensionReply(`/hydra ${e}${i?` ${i}`:""}: unknown verb (known: ${m||"(none)"})`)}let d={sessionId:this.sessionId,verb:i,args:a};r!==void 0&&(d.messageId=r);let c=()=>{},l=new Promise(m=>{c=m});r!==void 0&&this.inFlightExtensionDispatches.set(r,{extensionName:e,connection:s.connection,cancel:m=>c({stopReason:"cancelled",reason:m})});let u,f=!1;try{let m=s.connection.request("hydra-acp/commands/invoke",d),h=await Promise.race([m,l]);if(h&&typeof h=="object"&&h.stopReason==="cancelled"&&"reason"in h)return f=!0,this.logger?.info(`extension ${e} ${i} cancelled (cancelExtensionDispatch); abandoning in-flight commands/invoke`),{stopReason:"cancelled"};u=h}catch(m){return this.emitExtensionReply(`${e} ${i}: ${m.message}`)}finally{r!==void 0&&!f&&this.inFlightExtensionDispatches.delete(r)}let p=u&&typeof u=="object"&&typeof u.text=="string"?u.text:"";return p.length>0?this.emitExtensionReply(p):{stopReason:"end_turn"}}cancelExtensionDispatch(e,t){let r=this.inFlightExtensionDispatches.get(e);if(!r)return!1;this.inFlightExtensionDispatches.delete(e);try{r.connection.notify("hydra-acp/commands/cancel",{sessionId:this.sessionId,messageId:e,reason:t})}catch(s){this.logger?.warn(`notify commands/cancel to ${r.extensionName} failed: ${s.message}`)}return r.cancel(t),!0}emitExtensionReply(e){return this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
57
57
  ${e}
58
58
  `},_meta:{"hydra-acp":{synthetic:!0}}}}),{stopReason:"end_turn"}}async handleSessionsCommand(){let e;if(!this.listSessions)e="_(session listing not available)_";else{let t=await this.listSessions();if(t.length===0)e="_(no sessions)_";else{let r=t.map(s=>{let o=s.sessionId.replace(/^hydra_session_/,"").slice(0,12),i=s.currentModel?` \xB7 ${s.currentModel}`:"",a=s.sessionId===this.sessionId?" \u25C0":"",d=s.title?` ${s.title}`:"";return`\`${o}\` ${s.cwd}${i}${a}${d}`});e=`Sessions (${t.length}):
59
59
  ${r.join(`
@@ -93,7 +93,7 @@ ${h}:
93
93
  ${p.join(`
94
94
  `)}
95
95
  `},_meta:{"hydra-acp":{synthetic:!0}}}}),{stopReason:"end_turn"}}if(r==="model"){if(c!==this.currentModel){let u=await this.forwardModelChange(c);this.applyAgentConfigOptionResponse(u,"model")}return this.applyModelChange(c),{stopReason:"end_turn"}}if(r==="mode")return c!==this.currentMode&&await this.forwardRequest("session/set_mode",{sessionId:this.sessionId,modeId:c}),this.applyModeChange(c),{stopReason:"end_turn"};if(r==="agent")return c!==this.agentId&&await this.runAgentCommandInline(c),{stopReason:"end_turn"};let l=await this.forwardRequest("session/set_config_option",{sessionId:this.sessionId,configId:r,value:c});return this.applyAgentConfigOptionResponse(l,r)&&this.broadcastConfigOptions(),{stopReason:"end_turn"}}runTitleCommand(e){return this.enqueuePrompt("title",()=>this.runTitleCommandInline(e))}async runTitleCommandInline(e){return e?(this.setTitle(e),{stopReason:"end_turn"}):(this.scheduleSynopsisHook?.(),{stopReason:"end_turn"})}async runInternalPrompt(e){if(this.internalPromptCapture)throw new Error("internal prompt already in flight");let t={chunks:[],toolCalls:0,thinkingChars:0,messageChars:0};this.internalPromptCapture=t;try{return await this.agent.connection.request("session/prompt",{sessionId:this.upstreamSessionId,prompt:[{type:"text",text:e}]}),t.chunks.join("")}finally{this.internalPromptCapture=void 0}}setAgent(e){return this.runAgentCommandInline(e)}async runAgentCommandInline(e){if(e==="status")return this.runAgentStatusCommandInline();let t=e;if(!t)throw Qn(new Error("/hydra agent requires an agent id"),G.InvalidParams);let s=(this.resolveAgentIdHook?await this.resolveAgentIdHook(t):void 0)??t;if(s===this.agentId)throw Qn(new Error(`already on agent ${s}`),G.InvalidParams);if(!this.scheduleCompactionHook)return this.emitExtensionReply("agent switching not configured for this session"),{stopReason:"end_turn"};this.scheduleCompactionHook({targetAgentId:s});let o=this.promptInFlight||this.unsolicitedTurn!==void 0;return this.emitExtensionReply(o?`Agent switch to ${s} scheduled. A turn is still in flight \u2014 the rotation lands on the next idle edge; cancel the turn to make that happen now.`:`Agent switch to ${s} scheduled. The session will rotate to ${s} once synthesis completes.`),{stopReason:"end_turn"}}async runAgentStatusCommandInline(){let e=await this.getPendingAgentSwapHook?.();return e?(this.emitExtensionReply(`Agent switch to ${e} pending \u2014 will rotate on the next idle edge.`),{stopReason:"end_turn"}):(this.emitExtensionReply("No agent switch pending."),{stopReason:"end_turn"})}async runKillCommand(){return await this.close({deleteRecord:!1,by:"/hydra kill"}),{stopReason:"end_turn"}}runRestartCommand(){return this.enqueuePrompt("restart",()=>this.runRestartCommandInline())}async runRestartCommandInline(){if(!this.spawnReplacementAgent)throw Qn(new Error("agent restart not configured for this session"),G.InternalError);return await this.respawnAgent(),{stopReason:"end_turn"}}runCompactCommand(e){return this.enqueuePrompt("compact",()=>this.runCompactCommandInline(e))}async runCompactCommandInline(e){return e==="status"?this.runCompactStatusCommandInline():this.scheduleCompactionHook?(this.scheduleCompactionHook(),this.emitExtensionReply("Compaction scheduled. The session will rotate to a fresh upstream once summarization completes."),{stopReason:"end_turn"}):(this.emitExtensionReply("compaction scheduling not configured for this session"),{stopReason:"end_turn"})}async runCompactStatusCommandInline(){let e=await this.getCompactionStateHook?.(),t=this._summarizedThroughEntry,r=await this.getUpstreamGenerationsHook?.()??[],s=bC(r,t),o=kC(s);if(e==null&&t==null&&o.length===0)return this.emitExtensionReply("This session has never been compacted."),{stopReason:"end_turn"};let i=[];return e==null?i.push(`No compaction in progress. Last summarized through entry: ${t??0}`):(i.push(`Compaction state: ${e.status}${e.iter!=null?` (iteration ${e.iter})`:""}`,`Summarized through entry: ${t??0}`,`Pending attempts: ${e.attempts??0}`),e.lastError!==void 0&&i.push(`Last error: ${e.lastError}`)),i.push(`Current upstream: ${this.upstreamSessionId}`),o.length>0&&i.push("",...o),this.emitExtensionReply(i.join(`
96
- `)),{stopReason:"end_turn"}}runUncompactCommand(){return this.enqueuePrompt("uncompact",()=>this.runUncompactCommandInline())}async runWorkspaceCommand(e){if(!this.workspaceHook)return this.emitExtensionReply("Workspaces are not available on this session (no workspace hook configured)."),{stopReason:"end_turn"};let[t="status",...r]=e.split(/\s+/).filter(d=>d.length>0);if(!TC.includes(t))return this.emitExtensionReply(`Unknown workspace verb "${t}". Use one of: ${TC.join(", ")}.`),{stopReason:"end_turn"};let s=r.filter(d=>d.startsWith("--")),o=s.filter(d=>d!=="--clean"&&d!=="--deep");if(o.length>0)return this.emitExtensionReply(`Unknown workspace flag(s) ${o.join(", ")}. Supported: --clean (start), --deep (clean).`),{stopReason:"end_turn"};let i={clean:s.includes("--clean"),deep:s.includes("--deep")};if(i.clean&&t!=="start")return this.emitExtensionReply(`--clean applies to \`start\`, not to \`${t}\`.`),{stopReason:"end_turn"};if(i.deep&&t!=="clean")return this.emitExtensionReply(`--deep applies to \`clean\`, not to \`${t}\`.`),{stopReason:"end_turn"};let a=r.filter(d=>!d.startsWith("--")).join(" ").trim();try{let d=await this.workspaceHook(t,a.length>0?a:void 0,i);this.emitExtensionReply(d)}catch(d){this.emitExtensionReply(`Workspace ${t} failed: ${d instanceof Error?d.message:String(d)}`)}return{stopReason:"end_turn"}}async runUncompactCommandInline(){if(!this.uncompactHook)return this.emitExtensionReply("Rollback not available: uncompact hook not configured for this session."),{stopReason:"end_turn"};try{await this.uncompactHook(),this.emitExtensionReply("Rolled back to pre-compaction upstream. The session is now using the previous agent context.")}catch(e){this.emitExtensionReply(`Rollback failed: ${e instanceof Error?e.message:String(e)}`)}return{stopReason:"end_turn"}}runForkCommand(e){return this.enqueuePrompt("fork",()=>this.runForkCommandInline(e,void 0))}async findMessageIdBefore(e){if(!this.historyStore)return;let t=await this.historyStore.load(this.sessionId),r;for(let s of t){if(s.method!=="session/update")continue;let i=s.params?.update?.messageId;if(typeof i=="string"){if(i===e)return r;r=i}}}async runForkCommandInline(e,t){if(!this.forkHook)return this.emitExtensionReply("Fork not configured for this session."),{stopReason:"end_turn"};let r=(e??"").trim(),s=r.match(/^--verbatim(?:\s+([\s\S]*))?$/),o=s?"verbatim":void 0,i=(s?s[1]??"":r).trim();try{let a={};if(o&&(a.mode=o),i!==""&&(a.prompt=i),t&&this.historyStore){let l=await this.findMessageIdBefore(t).catch(()=>{});l&&(a.forkAt=l)}let c=(await this.forkHook(Object.keys(a).length>0?a:void 0)).sessionId.replace(/^hydra_session_/,"");this.emitExtensionReply(i!==""?`Forked to [\`${c}\`](hydra://sessions/${c}) and sent the prompt.`:`Forked to [\`${c}\`](hydra://sessions/${c}).`)}catch(a){this.emitExtensionReply(`Fork failed: ${a instanceof Error?a.message:String(a)}`)}return{stopReason:"end_turn"}}async forceCancel(){if(this.closed||this.closing)throw Qn(new Error("session is closing"),G.SessionClosing);return this.lastCancelAt=0,this.forceCancelling=!0,await this.close({deleteRecord:!1,by:"force-cancel"}),{stopReason:"cancelled"}}async respawnAgent(){let e=this.spawnReplacementAgent,t=this.agentId,r=await this.buildSwitchTranscript(t),s=await e({agentId:t,cwd:this.cwd,agentArgs:this.agentArgs,...this.forwardedEnv?{forwardedEnv:this.forwardedEnv}:{}});this.accumulateAndResetCost(),this.wireAgent(s.agent,{respawn:!0});let o=this.agent;this.agent=s.agent,this.upstreamSessionId=s.upstreamSessionId,this.agentMeta=s.agentMeta,this.agentCapabilities=s.agentCapabilities,this.resetModelVerb(s.modelVerb),this.agentAdvertisedCommands=[],this.broadcastMergedCommands(),this.currentModel=s.initialModel,this.currentMode=s.initialMode,this.setAgentAdvertisedModels(s.initialModels??[]),this.setAgentAdvertisedModes(s.initialModes??[]),this.agentAdvertisedConfigOptions=s.initialConfigOptions??[],await this.retireAgent(o,"agent restart"),r&&await this.runInternalPrompt(r).catch(()=>{}),this.broadcastAgentSwitch(t,t),this.notifyAgentChange("respawnAgent","restart")}async buildSwitchTranscript(e,t){let r=[],s=await this.getHistorySnapshot();for(let c of s){if(c.method!=="session/update")continue;let u=(c.params??{}).update;if(!u||u._meta?.["hydra-acp"]?.synthetic)continue;let p=u.sessionUpdate;if(p==="prompt_received"){let m=da(u.prompt);m&&r.push({speaker:"user",text:m})}else if(p==="agent_message_chunk"){let h=u.content?.text;h&&r.push({speaker:`agent: ${e}`,text:h})}else if(p==="tool_call"||p==="tool_call_update"){let m=u.status,h=u.title;(m==="completed"||m==="failed")&&r.push({speaker:"tool",text:`${h??"?"} ${m}`})}}if(r.length===0)return"";let o=[],i;for(let c of r)i&&i.speaker===c.speaker?i.text+=c.text:(i&&o.push(`<${i.speaker}>: ${i.text.trim()}`),i={speaker:c.speaker,text:c.text});i&&o.push(`<${i.speaker}>: ${i.text.trim()}`);let a=t?.intro??`You are taking over this conversation from ${e}. Below is the transcript so far.`,d=t?.followup??`Each line is prefixed with its speaker. Continue from where ${e} left off, responding to the user's most recent message.`;return[a,d,"","--- begin transcript ---",...o,"--- end transcript ---"].join(`
96
+ `)),{stopReason:"end_turn"}}runUncompactCommand(){return this.enqueuePrompt("uncompact",()=>this.runUncompactCommandInline())}async runWorkspaceCommand(e){if(!this.workspaceHook)return this.emitExtensionReply("Workspaces are not available on this session (no workspace hook configured)."),{stopReason:"end_turn"};let[t="status",...r]=e.split(/\s+/).filter(d=>d.length>0);if(!TC.includes(t))return this.emitExtensionReply(`Unknown workspace verb "${t}". Use one of: ${TC.join(", ")}.`),{stopReason:"end_turn"};let s=r.filter(d=>d.startsWith("--")),o=s.filter(d=>d!=="--clean"&&d!=="--deep");if(o.length>0)return this.emitExtensionReply(`Unknown workspace flag(s) ${o.join(", ")}. Supported: --clean (start), --deep (clean).`),{stopReason:"end_turn"};let i={clean:s.includes("--clean"),deep:s.includes("--deep")};if(i.clean&&t!=="start")return this.emitExtensionReply(`--clean applies to \`start\`, not to \`${t}\`.`),{stopReason:"end_turn"};if(i.deep&&t!=="clean")return this.emitExtensionReply(`--deep applies to \`clean\`, not to \`${t}\`.`),{stopReason:"end_turn"};let a=r.filter(d=>!d.startsWith("--")).join(" ").trim();try{let d=await this.workspaceHook(t,a.length>0?a:void 0,i);this.emitExtensionReply(d)}catch(d){this.emitExtensionReply(`Workspace ${t} failed: ${d instanceof Error?d.message:String(d)}`)}return{stopReason:"end_turn"}}async runUncompactCommandInline(){if(!this.uncompactHook)return this.emitExtensionReply("Rollback not available: uncompact hook not configured for this session."),{stopReason:"end_turn"};try{await this.uncompactHook(),this.emitExtensionReply("Rolled back to pre-compaction upstream. The session is now using the previous agent context.")}catch(e){this.emitExtensionReply(`Rollback failed: ${e instanceof Error?e.message:String(e)}`)}return{stopReason:"end_turn"}}runForkCommand(e){return this.enqueuePrompt("fork",()=>this.runForkCommandInline(e,void 0))}async findMessageIdBefore(e){if(!this.historyStore)return;let t=await this.historyStore.load(this.sessionId),r;for(let s of t){if(s.method!=="session/update")continue;let i=s.params?.update?.messageId;if(typeof i=="string"){if(i===e)return r;r=i}}}async runForkCommandInline(e,t){if(!this.forkHook)return this.emitExtensionReply("Fork not configured for this session."),{stopReason:"end_turn"};let r=(e??"").trim(),s=r.match(/^--verbatim(?:\s+([\s\S]*))?$/),o=s?"verbatim":void 0,i=(s?s[1]??"":r).trim();try{let a={};if(o&&(a.mode=o),i!==""&&(a.prompt=i),t&&this.historyStore){let l=await this.findMessageIdBefore(t).catch(()=>{});l&&(a.forkAt=l)}let c=(await this.forkHook(Object.keys(a).length>0?a:void 0)).sessionId.replace(/^hydra_session_/,"");this.emitExtensionReply(i!==""?`Forked to [\`${c}\`](hydra://sessions/${c}) and sent the prompt.`:`Forked to [\`${c}\`](hydra://sessions/${c}).`)}catch(a){this.emitExtensionReply(`Fork failed: ${a instanceof Error?a.message:String(a)}`)}return{stopReason:"end_turn"}}escalateUnresponsiveCancel(){this.cancelReopenStreak=0,this.logger?.warn(`session ${this.sessionId} agent ${this.agentId} reopened an unsolicited turn right after cancel ${n.UNSOLICITED_REOPEN_LIMIT} times in a row; forcing a restart`),this.broadcastQueueNotification("hydra-acp/cancel_failed",{sessionId:this.sessionId,reason:"unresponsive",message:`${this.agentId} kept resuming after repeated cancels; restarting the agent`}),this.forceCancel().catch(e=>{this.logger?.warn(`session ${this.sessionId} forceCancel after unresponsive-cancel escalation failed: ${e instanceof Error?e.message:String(e)}`)})}async forceCancel(){if(this.closed||this.closing)throw Qn(new Error("session is closing"),G.SessionClosing);return this.lastCancelAt=0,this.forceCancelling=!0,await this.close({deleteRecord:!1,by:"force-cancel"}),{stopReason:"cancelled"}}async respawnAgent(){let e=this.spawnReplacementAgent,t=this.agentId,r=await this.buildSwitchTranscript(t),s=await e({agentId:t,cwd:this.cwd,agentArgs:this.agentArgs,...this.forwardedEnv?{forwardedEnv:this.forwardedEnv}:{}});this.accumulateAndResetCost(),this.wireAgent(s.agent,{respawn:!0});let o=this.agent;this.agent=s.agent,this.upstreamSessionId=s.upstreamSessionId,this.agentMeta=s.agentMeta,this.agentCapabilities=s.agentCapabilities,this.resetModelVerb(s.modelVerb),this.agentAdvertisedCommands=[],this.broadcastMergedCommands(),this.currentModel=s.initialModel,this.currentMode=s.initialMode,this.setAgentAdvertisedModels(s.initialModels??[]),this.setAgentAdvertisedModes(s.initialModes??[]),this.agentAdvertisedConfigOptions=s.initialConfigOptions??[],await this.retireAgent(o,"agent restart"),r&&await this.runInternalPrompt(r).catch(()=>{}),this.broadcastAgentSwitch(t,t),this.notifyAgentChange("respawnAgent","restart")}async buildSwitchTranscript(e,t){let r=[],s=await this.getHistorySnapshot();for(let c of s){if(c.method!=="session/update")continue;let u=(c.params??{}).update;if(!u||u._meta?.["hydra-acp"]?.synthetic)continue;let p=u.sessionUpdate;if(p==="prompt_received"){let m=da(u.prompt);m&&r.push({speaker:"user",text:m})}else if(p==="agent_message_chunk"){let h=u.content?.text;h&&r.push({speaker:`agent: ${e}`,text:h})}else if(p==="tool_call"||p==="tool_call_update"){let m=u.status,h=u.title;(m==="completed"||m==="failed")&&r.push({speaker:"tool",text:`${h??"?"} ${m}`})}}if(r.length===0)return"";let o=[],i;for(let c of r)i&&i.speaker===c.speaker?i.text+=c.text:(i&&o.push(`<${i.speaker}>: ${i.text.trim()}`),i={speaker:c.speaker,text:c.text});i&&o.push(`<${i.speaker}>: ${i.text.trim()}`);let a=t?.intro??`You are taking over this conversation from ${e}. Below is the transcript so far.`,d=t?.followup??`Each line is prefixed with its speaker. Continue from where ${e} left off, responding to the user's most recent message.`;return[a,d,"","--- begin transcript ---",...o,"--- end transcript ---"].join(`
97
97
  `)}async seedFromImport(){await this.enqueuePrompt("seed:import",async()=>{let e=await this.buildSwitchTranscript(this.agentId,{intro:"You are continuing a conversation that was imported from another hydra. Below is the transcript so far.",followup:"Each line is prefixed with its speaker. Treat this as context for the next user message; do not re-respond to earlier turns."});e&&await this.runInternalPrompt(e).catch(()=>{})})}async seedFromFork(e){await this.enqueuePrompt("seed:fork",async()=>{let t=this.title??"(untitled)",r=[];if(this.historyStore)try{r=await this.historyStore.load(this.sessionId)}catch(o){this.logger?.warn(`seedFromFork: historyStore.load failed: ${o.message}`)}let s=Tw({synopsis:e,title:t,tail:r,tailK:u1,tailFloor:f1,watermark:this._summarizedThroughEntry,recallArmed:(this._summarizedThroughEntry??0)>0});if(this.internalPromptCapture)throw new Error("seedFromFork: internal prompt already in flight");this.internalPromptCapture={chunks:[],toolCalls:0,thinkingChars:0,messageChars:0};try{await this.agent.connection.request("session/prompt",{sessionId:this.upstreamSessionId,prompt:[{type:"text",text:s}]});let o=this.internalPromptCapture;this.logger?.info(`seedFromFork: seed processed sessionId=${this.sessionId} seedChars=${s.length} toolCalls=${o.toolCalls} thinkingChars=${o.thinkingChars} messageChars=${o.messageChars}`)}finally{this.internalPromptCapture=void 0}})}broadcastAgentSwitch(e,t){this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",_meta:{"hydra-acp":{synthetic:!0,agentId:t,pendingAgentSwap:null}}}}),this.broadcastConfigOptions()}broadcastPendingAgentSwap(e){this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",_meta:{"hydra-acp":{synthetic:!0,pendingAgentSwap:e}}}})}hasStreamBuffer(){return this.streamBuffer!==void 0}get streamPath(){return this.streamFilePath}openStream(e){if(this.streamBuffer!==void 0)throw new Error(`stream buffer already open for session ${this.sessionId}`);let r=(e.mode??"memory")==="file"&&e.filePathFor!==void 0?e.filePathFor(this.sessionId):void 0,s={};e.capacityBytes!==void 0&&(s.capacityBytes=e.capacityBytes),r!==void 0&&(s.filePath=r),e.fileCapBytes!==void 0&&(s.fileCapBytes=e.fileCapBytes),s.onFileCapReached=()=>{this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"_hydra_stream_truncated",...r!==void 0?{filePath:r}:{},fileCapBytes:e.fileCapBytes}})};let o=new Sp(s);this.streamBuffer=o,this.streamFilePath=r;let i={capacityBytes:o.capacity};return r!==void 0&&(i.filePath=r),e.fileCapBytes!==void 0&&(i.fileCapBytes=e.fileCapBytes),i}streamWrite(e,t){let r=this.requireStreamBuffer();if(e.length>0){let s=Buffer.from(e,"base64");r.append(s)}return t===!0&&r.close(),{writeCursor:r.writeCursorPos}}async streamRead(e,t,r){let s=this.requireStreamBuffer(),o=Math.max(0,Math.min(t??oc,oc)),i=s.read(e,o);if(i.bytes.length===0&&i.eof!==!0&&r!==void 0&&r>0){let d=await s.waitForData(i.nextCursor,r);(d==="data"||d==="eof")&&(i=s.read(i.nextCursor,o))}let a={bytes:i.bytes.toString("base64"),nextCursor:i.nextCursor};return i.gap!==void 0&&(a.gap=i.gap),i.eof===!0&&(a.eof=!0),a}streamTail(e){let r=this.requireStreamBuffer().tail(e);return{bytes:r.bytes.toString("base64"),startCursor:r.startCursor,endCursor:r.endCursor,truncated:r.truncated}}streamHead(e){let r=this.requireStreamBuffer().head(e);return{bytes:r.bytes.toString("base64"),startCursor:r.startCursor,endCursor:r.endCursor,truncated:r.truncated}}async streamWaitFor(e,t){return this.requireStreamBuffer().waitForData(e,t)}streamGrep(e){return this.requireStreamBuffer().grep(e)}streamInfo(){let e=this.requireStreamBuffer();return{writeCursor:e.writeCursorPos,oldestAvailable:e.oldestAvailable,capacity:e.capacity,closed:e.isClosed}}requireStreamBuffer(){if(this.streamBuffer===void 0){let e=new Error(`session ${this.sessionId} has no stream buffer; POST /v1/sessions/:id/stdin/open first`);throw e.code=G.StreamNotEnabled,e}return this.streamBuffer}markClosed(e){if(this.closed)return;this.closeUnsolicitedTurn("closed"),e={deleteRecord:e.deleteRecord||this.deleteRecordIntent},this.closing=!0,this.closed=!0,this.cancelIdleTimer(),this.cancelOrphanTimer(),this.extensionCommandsUnsub&&(this.extensionCommandsUnsub(),this.extensionCommandsUnsub=void 0);for(let o of[...this.inFlightExtensionDispatches.keys()])this.cancelExtensionDispatch(o,"abandoned");this.currentEntry?.kind==="user"&&!this.recentlyTerminal.has(this.currentEntry.messageId)&&this.broadcastTurnComplete(this.currentEntry.clientId,{stopReason:"interrupted"},this.currentEntry.messageId,this.originatorNeedsTurnComplete(this.currentEntry)),this.currentEntry=void 0;let r=this.promptQueue;this.promptQueue=[];for(let o of r){o.cancelled=!0,o.kind==="user"&&this.broadcastQueueRemoved(o.messageId,"abandoned");let i=this.pendingTurnNotifiers.get(o.messageId);i&&(this.pendingTurnNotifiers.delete(o.messageId),bw(i,{sessionId:this.sessionId,messageId:i.originalMessageId,stopReason:"cancelled",deliveredAt:Date.now(),...o.messageId!==i.originalMessageId?{amendedTo:o.messageId}:{}}));try{o.resolve({stopReason:"cancelled"})}catch{}}this.notifyChain("session.closed",{}),this.toolCompletionSeen.clear(),this.toolCallKind.clear(),this.filesEditedSeen.clear(),this.openToolCalls.clear();let s=this.sessionId;this.queueWriteChain=this.queueWriteChain.catch(()=>{}).then(()=>AC(s).catch(()=>{}));for(let o of this.clients.values())o.connection.notify("hydra-acp/session/closed",{sessionId:this.sessionId}).catch(()=>{});if(this.clients.clear(),this.streamBuffer!==void 0){let o=this.streamBuffer,i=this.streamFilePath;this.streamBuffer=void 0,this.streamFilePath=void 0,o.close(),i!==void 0&&o.drainFileWrites().then(()=>DC.unlink(i).catch(()=>{}))}for(let o of this.closeHandlers)o(e)}get lastActivityAt(){return this.lastRecordedAt}setAttentionFlag(e,t,r){this._setAttentionFlag(e,t,r,!0)}_setAttentionFlag(e,t,r,s){let o=`${e}::${t}`,i=this.attentionFlags.get(o);if(i){if(JSON.stringify(i.payload)===JSON.stringify(r))return;this.attentionFlags.set(o,{...i,payload:r,raisedAt:i.raisedAt})}else this.attentionFlags.set(o,{source:e,reason:t,raisedAt:Date.now(),payload:r});s&&(this.broadcastAttentionUpdated(),this.fireAttentionFlagsChange())}clearAttentionFlag(e,t){this._clearAttentionFlag(e,t,!0)}_clearAttentionFlag(e,t,r){let s=`${e}::${t}`;this.attentionFlags.delete(s)&&r&&(this.broadcastAttentionUpdated(),this.fireAttentionFlagsChange())}listAttentionFlags(){return Array.from(this.attentionFlags.values()).sort((e,t)=>e.raisedAt-t.raisedAt)}listAttentionFlagsBySource(e){return this.listAttentionFlags().filter(t=>t.source===e)}onAttentionFlagsChange(e){this.attentionFlagsChangeHandlers.push(e)}fireAttentionFlagsChange(){let e=this.listAttentionFlags();for(let t of this.attentionFlagsChangeHandlers)try{t(e)}catch{}}broadcastAttentionUpdated(){for(let e of this.clients.values())e.connection.notify("hydra-acp/session/attention_updated",{sessionId:this.sessionId,flags:this.listAttentionFlags()}).catch(()=>{})}scheduleIdleCheck(){if(this.closed||this.idleTimeoutMs<=0)return;let e=this.lastActivityAt+this.idleTimeoutMs;this.armIdleTimer(Math.max(0,e-Date.now()))}armIdleTimer(e){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{this.idleTimer=void 0,this.checkIdle()},e),typeof this.idleTimer.unref=="function"&&this.idleTimer.unref()}checkIdle(){if(this.closed||this.idleTimeoutMs<=0)return;if(this.hasWorkInFlight){this.armIdleTimer(this.idleTimeoutMs);return}let e=Date.now()-this.lastActivityAt;if(e<this.idleTimeoutMs){this.armIdleTimer(this.idleTimeoutMs-e);return}let t=this.firstPromptSeeded?{deleteRecord:!1}:{deleteRecord:!0},r=Math.round(e/1e3);this.logger?.info(`session ${this.sessionId} idle timeout fired after ${r}s (window=${Math.round(this.idleTimeoutMs/1e3)}s) \u2014 closing`),this.close(t).catch(()=>{})}cancelIdleTimer(){this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=void 0),this.disposeIdleHandlers()}scheduleOrphanCheck(){this.closed||this.orphanTimeoutMs<=0||this.clients.size>0||this._interactive===!0||this.armOrphanTimer(this.orphanTimeoutMs)}armOrphanTimer(e){this.orphanTimer&&clearTimeout(this.orphanTimer),this.orphanTimer=setTimeout(()=>{this.orphanTimer=void 0,this.checkOrphan()},e),typeof this.orphanTimer.unref=="function"&&this.orphanTimer.unref()}checkOrphan(){if(!this.closed&&!(this.clients.size>0||this._interactive===!0)){if(this.hasWorkInFlight){this.armOrphanTimer(this.orphanTimeoutMs);return}this.logger?.info(`session ${this.sessionId} orphan timeout fired after ${Math.round(this.orphanTimeoutMs/1e3)}s with no attached client and no prompt ever received \u2014 closing`),this.close({deleteRecord:!1,by:"reap-orphaned"}).catch(()=>{})}}cancelOrphanTimer(){this.orphanTimer&&(clearTimeout(this.orphanTimer),this.orphanTimer=void 0)}get currentPromptDepth(){if(this.currentEntry?.kind==="user")return this.currentEntry.originator.depth??0}get hasWorkInFlight(){return this.turnStartedAt!==void 0||this.hasPermissionFlag||this.promptQueue.length>0||this.armedBackgroundTasks.length>0}onIdle(e,t){let r={fn:e,once:!!t?.once,debounceMs:t?.debounceMs??0};return this.idleHandlers.push(r),()=>{let s=this.idleHandlers.indexOf(r);s>=0&&this.idleHandlers.splice(s,1),r.timer&&(clearTimeout(r.timer),r.timer=void 0)}}onceIdle(e){return this.onIdle(e,{once:!0})}dispatchIdle(){if(this.closed)return;if(!this.isQuiescedSync()){for(let r of this.idleHandlers)r.timer&&(clearTimeout(r.timer),r.timer=void 0);return}let t=[...this.idleHandlers];for(let r of t){if(r.debounceMs===0){if(r.once){let s=this.idleHandlers.indexOf(r);s>=0&&this.idleHandlers.splice(s,1)}try{r.fn(this)}catch{}continue}r.timer&&(clearTimeout(r.timer),r.timer=void 0),r.timer=setTimeout(()=>{if(r.timer=void 0,!this.closed&&this.isQuiescedSync()){if(r.once){let s=this.idleHandlers.indexOf(r);s>=0&&this.idleHandlers.splice(s,1)}try{r.fn(this)}catch{}}},r.debounceMs),typeof r.timer.unref=="function"&&r.timer.unref()}}disposeIdleHandlers(){for(let e of this.idleHandlers)e.timer&&(clearTimeout(e.timer),e.timer=void 0);this.idleHandlers.length=0}noteRecordedToolCall(e,t){if(e!=="session/update")return;let r=t?.update;if(r===void 0)return;let s=typeof r.toolCallId=="string"?r.toolCallId:"";if(s.length!==0){if(r.sessionUpdate==="tool_call"){this.turnRanTool=!0,this.openToolCalls.add(s);return}r.sessionUpdate==="tool_call_update"&&(r.status==="completed"||r.status==="failed")&&this.openToolCalls.delete(s)}}closeOpenToolCalls(e){if(this.openToolCalls.size===0||this.closed)return;let t=[...this.openToolCalls];this.openToolCalls.clear();for(let r of t)this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"tool_call_update",toolCallId:r,status:"failed",_meta:{[ft]:{synthetic:!0,closedBy:e}}}});this.logger?.info(`session ${this.sessionId} closed ${t.length} open tool call(s) on ${e}`)}maybeEmitToolEdges(e){if(!e||typeof e!="object")return;let t=e.update;if(!t||typeof t!="object")return;let r=t,s=typeof r.sessionUpdate=="string"?r.sessionUpdate:"";if(s!=="tool_call"&&s!=="tool_call_update")return;let o=typeof r.toolCallId=="string"&&r.toolCallId.length>0?r.toolCallId:void 0;if(!o)return;let i=typeof r.kind=="string"?r.kind:void 0;this.toolCallKind.note(o,i);let a=this.toolCallKind.effective(o,i);if(a===rC&&Array.isArray(r.locations))for(let l of r.locations){if(!l||typeof l!="object")continue;let u=l.path;if(typeof u!="string"||u.length===0||this.filesEditedSeen.has(u))continue;this.filesEditedSeen.add(u);let f=l.line,p={path:u,toolCallId:o};typeof f=="number"&&(p.line=f),this.notifyChain("file.edited",p),this.reportIsolationBreach(u,o)}if(s!=="tool_call_update")return;let d=typeof r.status=="string"?r.status:void 0;if(d!=="completed"&&d!=="failed"||this.toolCompletionSeen.has(o))return;this.toolCompletionSeen.set(o,d);let c={toolCallId:o,status:d};a&&(c.kind=a),r.content!==void 0&&(c.content=r.content),Array.isArray(r.locations)&&(c.locations=r.locations),this.notifyChain("tool.completed",c)}notifyChain(e,t){let r=`lifecycle:${e}`;for(let s of this.transformChain)s.intercepts.has(r)&&s.connection.notify("hydra-acp/transformer/session_event",{event:e,sessionId:this.sessionId,payload:t}).catch(()=>{})}rewriteForClient(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e;if(typeof t.sessionId=="string"&&t.sessionId!==this.sessionId)return{...t,sessionId:this.sessionId}}return e}recordAndBroadcast(e,t,r){let s=this.rewriteForClient(t),o=!$w(e,s),i=o?L1(e,s):s,a=Date.now(),d=o?this.lastSeq=Math.max(this.lastSeq+1,a):void 0,c=o?Fs(Os(i,a),d):i;if(o){this.noteRecordedToolCall(e,i);let l={method:e,params:i,recordedAt:a,seq:d};if(this.lastRecordedAt=l.recordedAt,this.appendCount+=1,this.historyStore){let u=this.historyStore;u.append(this.sessionId,l).catch(()=>{}),this.appendCount>=this.compactEvery&&(this.appendCount=0,u.compact(this.sessionId,this.historyMaxEntries).catch(()=>{}))}for(let u of this.broadcastHandlers)try{u(l)}catch{}this.scheduleIdleCheck(),this.dispatchIdle()}this.updatedAt=Date.now();for(let l of this.clients.values())r&&l.clientId===r||l.connection.notify(e,c).catch(()=>{})}async requestPermissionFromClients(e){return this.handlePermissionRequest(e)}async handlePermissionRequest(e){let t=[...this.clients.values()];if(t.length===0)throw Qn(new Error("no clients attached to handle permission request"),G.PermissionDenied);let r=this.rewriteForClient(e),s=_C(r),o=Bs(),{toolCall:i,options:a}=r??{};return new Promise((d,c)=>{let l=!1,u=[],f=0,p,m=this.sessionId,h=b=>{l||(l=!0,this.clearAttentionFlag("daemon",`permission:${o}`),this.permissionCallbacks.delete(o),b())},g=b=>b?.code===G.MethodNotFound;function w(b){if(l)return;let k=b.connection.request("session/request_permission",r);u.push({client:b}),f++,k.then(S=>{f--,h(()=>{let I=B1({toolCallId:s,result:S,resolver:b});for(let x of u)x.client.clientId!==b.clientId&&x.client.connection.notify("session/update",{sessionId:m,update:I}).catch(()=>{});d(S)})}).catch(S=>{if(f--,g(S)||(p=S),f===0&&!l){let I=p??Qn(new Error("no client handled permission request"),G.PermissionDenied);h(()=>c(I))}})}this.setAttentionFlag("daemon",`permission:${o}`,{kind:"permission",toolCall:i??null,options:a??null}),this.permissionCallbacks.set(o,w);for(let b of t)w(b)})}async enqueuePrompt(e,t){return new Promise((r,s)=>{let o={kind:"internal",messageId:Bs(),label:e,enqueuedAt:Date.now(),cancelled:!1,task:t,resolve:r,reject:s};this.promptQueue.push(o),this.drainQueue()})}async enqueueUserPrompt(e,t,r,s,o){let i=(t??{}).prompt??[],a={clientId:e.clientId};e.clientInfo?.name&&(a.name=e.clientInfo.name),e.clientInfo?.version&&(a.version=e.clientInfo.version),s?.fromSession&&(a.fromSession=s.fromSession),s?.fromSessionTitle&&(a.fromSessionTitle=s.fromSessionTitle),s?.fromLabel&&(a.fromLabel=s.fromLabel),s?.depth!==void 0&&(a.depth=s.depth);let d=this.parseQueuePosition(t);return new Promise((c,l)=>{let u={kind:"user",messageId:r,originator:a,clientId:e.clientId,prompt:i,enqueuedAt:Date.now(),cancelled:!1,resolve:c,reject:l};o?.steerOriginated===!0&&(u.wasSteer=!0);let f=this.insertEntryAt(u,d);this.persistRewrite(),this.broadcastQueueAdded(u,{position:f}),this.drainQueue()})}promptCarriesSentBy(e){if(!e||typeof e!="object")return!1;let t=e._meta;if(!t||typeof t!="object"||Array.isArray(t))return!1;let r=t[ft];if(!r||typeof r!="object"||Array.isArray(r))return!1;let s=r.sentBy;return!!s&&typeof s=="object"}parseQueuePosition(e){if(!e||typeof e!="object")return"tail";let t=e._meta;if(!t||typeof t!="object"||Array.isArray(t))return"tail";let r=t["hydra-acp"];if(!r||typeof r!="object"||Array.isArray(r))return"tail";let s=r.queuePosition;if(s==="head"||s==="tail")return s;if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s.afterMessageId;if(typeof o=="string"&&o.length>0)return{afterMessageId:o}}return"tail"}insertEntryAt(e,t){let r=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled?1:0;if(t==="head")return this.promptQueue.unshift(e),r;if(typeof t=="object"){let s=t.afterMessageId,o=this.promptQueue.findIndex(i=>i.messageId===s);if(o>=0)return this.promptQueue.splice(o+1,0,e),r+o+1}return this.promptQueue.push(e),r+this.promptQueue.length-1}persistRewrite(){let e=[];for(let r of this.promptQueue)r.kind!=="user"||r.cancelled||e.push(this.persistedFromEntry(r));let t=this.sessionId;this.queueWriteChain=this.queueWriteChain.catch(()=>{}).then(()=>Gl(t,e).catch(()=>{}))}persistedFromEntry(e){return{messageId:e.messageId,originator:{clientInfo:{...e.originator.name!==void 0?{name:e.originator.name}:{},...e.originator.version!==void 0?{version:e.originator.version}:{}}},prompt:e.prompt,enqueuedAt:e.enqueuedAt}}async drainQueue(){if(!this.promptInFlight){this.promptInFlight=!0,await new Promise(e=>setImmediate(e));try{for(;this.promptQueue.length>0&&!this.closing;){let e=this.promptQueue[0];if(e?.kind==="user"&&(await this.holdForUnsolicitedTurn(e),this.closing))break;let t=this.promptQueue.shift();if(!t)break;if(!t.cancelled){this.currentEntry=t,t.kind==="user"&&this.persistRewrite(),t.kind==="user"&&this.broadcastQueueRemoved(t.messageId,"started");try{let r=await this.runQueueEntry(t);t.resolve(r),await new Promise(s=>setImmediate(s))}catch(r){t.reject(r)}finally{this.currentEntry=void 0}}}}finally{this.promptInFlight=!1,this.supersededAutonomousTurn=void 0,this.dispatchIdle()}}}async runQueueEntry(e){if(e.kind==="internal")return this.closeUnsolicitedTurn("superseded",`internal:${e.label}`),e.task();this.broadcastPromptReceived(e);let t=da(e.prompt).replace(/\s+$/,""),r=!t.includes(`
98
98
  `)&&t.startsWith("/")?t.split(/\s+/)[0]??"":"",s=r.startsWith("/")?r.slice(1):"",o=s.length>0&&this.aliasableBareVerbs().has(s);if(r==="/model"||r==="/mode"||r==="/sessions"||r==="/help"||r==="/hydra"||o){let d;if(r==="/sessions")d=await this.handleSessionsCommand();else if(r==="/help")d=await this.handleHelpCommand();else if(r==="/mode")d=await this.handleModeCommand(t);else if(r==="/model")d=await this.handleModelCommand(t);else if(o){let c=t.slice(r.length).trim(),l=c?`/hydra ${s} ${c}`:`/hydra ${s}`;d=await this.handleSlashCommand(l,e.messageId)}else d=await this.handleSlashCommand(t,e.messageId);return this.closed||this.broadcastTurnComplete(e.clientId,d,e.messageId,this.originatorNeedsTurnComplete(e)),this.clearAmendIfMatches(e.messageId),d}if(this.clearRollbackBreadcrumbHook)try{this.clearRollbackBreadcrumbHook()}catch{}let i=e.prompt;r&&this.agentAdvertisedCommands.length>0&&!this.agentKnowsSlashCommand(r)&&(i=Ow(e.prompt,W1));let a;this.agentTurnInFlight=!0;try{i=this.applyWorkspacePromptRewrite(i),a=await this.dispatchPrompt(e,i)}catch(d){if(this.forceCancelling)return this.clearAmendIfMatches(e.messageId),{stopReason:"cancelled"};throw this.closed||this.broadcastTurnComplete(e.clientId,{stopReason:"error"},e.messageId,this.originatorNeedsTurnComplete(e)),this.clearAmendIfMatches(e.messageId),d}finally{this.agentTurnInFlight=!1}return this.closed||this.broadcastTurnComplete(e.clientId,a,e.messageId,this.originatorNeedsTurnComplete(e)),this.clearAmendIfMatches(e.messageId),a}async dispatchPrompt(e,t){let r=()=>this.awaitPromptResponse(this.forwardRequest("session/prompt",{sessionId:this.sessionId,prompt:t},e.emitterName?new Set([e.emitterName]):new Set,e.chainStartIdx??0));try{return await r()}catch(s){if(this.loadExistingAgentSession&&x1(s))return this.logger?.warn(`agent ${this.agentId} no longer knows upstream session ${this.upstreamSessionId} for ${this.sessionId}; reloading it onto a fresh process and retrying the prompt once`),await this.reloadUpstreamAfterAgentLoss(),await r();if(!C1(s)||this.turnRanTool||(this.logger?.warn(`agent ${this.agentId} hit a transient auth failure for ${this.sessionId}; retrying the prompt once in ${MC}ms`),await new Promise(o=>setTimeout(o,MC)),e.cancelled))throw s;return await r()}}clearAmendIfMatches(e){this.amendInProgress?.cancelledMessageId===e&&(this.amendInProgress=void 0)}},S1=["session not found","the claude agent session has ended"];I1=["failed to refresh oauth token"],MC=6e4;R1=new Set(["session_info_update","_hydra_current_model_update","current_mode_update","available_commands_update","_hydra_available_modes_update","usage_update","config_option_update","_hydra_compaction"]);W1="\u200B"});import{z as lc}from"zod";var q1,HC,UC=q(()=>{"use strict";q1=lc.object({source:lc.string(),reason:lc.string(),raisedAt:lc.number(),payload:lc.unknown()}),HC=lc.array(q1)});import{z as yt}from"zod";function qC(n){let e=n.trim();if(e.length===0)return;let t=uc(e);if(t===void 0){let o=e.indexOf("{"),i=e.lastIndexOf("}");o>=0&&i>o&&(t=uc(e.slice(o,i+1)))}if(t===void 0){let o=KC(e);o!==void 0&&(t=uc(o))}if(t===void 0||t===null||typeof t!="object")return;let r=t,s={};if(typeof r.title=="string"){let o=r.title.trim();o.length>0&&(s.title=o.slice(0,jC))}if(r.synopsis!==void 0&&r.synopsis!==null){let o=Vl.safeParse(r.synopsis);o.success&&z1(o.data)&&(s.synopsis=o.data)}if(!(s.title===void 0&&s.synopsis===void 0))return s}function zC(n){let e=n.trim();if(e.length===0)return;let t=uc(e);if(t===void 0){let c=e.indexOf("{"),l=e.lastIndexOf("}");c>=0&&l>c&&(t=uc(e.slice(c,l+1)))}if(t===void 0){let c=KC(e);c!==void 0&&(t=uc(c))}if(t===void 0||t===null||typeof t!="object")return;let r=t,s={};if(typeof r.title=="string"){let c=r.title.trim();c.length>0&&(s.title=c.slice(0,jC))}let o={},i=!1,a=["goal","outcome"];for(let c of a)if(typeof r[c]=="string"){let l=r[c].trim();l.length>0&&(o[c]=l,i=!0)}let d=["files_touched","tools_used","rejected_approaches","open_threads","decisions","file_edit_intentions","unresolved_errors","tool_state"];for(let c of d)if(Array.isArray(r[c])){let l=r[c],u=yt.array(yt.string()).safeParse(l);u.success&&l.length>0&&(o[c]=u.data,i=!0)}if(i&&(s.synopsis=o),!(s.title===void 0&&s.synopsis===void 0))return s}function uc(n){try{return JSON.parse(n)}catch{return}}function KC(n){let e=n.indexOf("{");if(e<0)return;let t=0,r=!1,s=!1;for(let o=e;o<n.length;o++){let i=n[o];if(r){s?s=!1:i==="\\"?s=!0:i==='"'&&(r=!1);continue}if(i==='"'){r=!0;continue}if(i==="{")t++;else if(i==="}"&&(t--,t===0))return n.slice(e,o+1)}}function z1(n){return n.goal!==void 0&&n.goal.trim().length>0||n.outcome!==void 0&&n.outcome.trim().length>0||n.files_touched!==void 0&&n.files_touched.length>0||n.tools_used!==void 0&&n.tools_used.length>0||n.rejected_approaches!==void 0&&n.rejected_approaches.length>0||n.open_threads!==void 0&&n.open_threads.length>0||n.decisions!==void 0&&n.decisions.length>0||n.file_edit_intentions!==void 0&&n.file_edit_intentions.length>0||n.unresolved_errors!==void 0&&n.unresolved_errors.length>0||n.tool_state!==void 0&&n.tool_state.length>0}var WC,Vl,jC,Dw,Bw,Pp=q(()=>{"use strict";WC=yt.object({status:yt.enum(["requested","running","swap_pending","swap_deferred","failed"]),requestedAt:yt.number(),runId:yt.string().optional(),iter:yt.number().int().nonnegative().optional(),attempts:yt.number().int().nonnegative().optional(),lastError:yt.string().optional(),worker:yt.object({upstreamSessionId:yt.string(),pid:yt.number().int().nonnegative()}).optional()}),Vl=yt.object({goal:yt.string().optional(),outcome:yt.string().optional(),files_touched:yt.array(yt.string()).optional(),tools_used:yt.array(yt.string()).optional(),rejected_approaches:yt.array(yt.string()).optional(),open_threads:yt.array(yt.string()).optional(),decisions:yt.array(yt.string()).optional(),file_edit_intentions:yt.array(yt.string()).optional(),unresolved_errors:yt.array(yt.string()).optional(),tool_state:yt.array(yt.string()).optional()}),jC=200,Dw=`Reply with ONLY a JSON object with exactly these keys, no prose, no markdown, no code fences:
99
99
  {
@@ -259,8 +259,8 @@ uncaught: ${e.stack??e.message}
259
259
  `)}selectionLineBounds(){let e=this.selection;if(e===null)return null;let t=this.lineIndexById(e.startLineId),r=this.lineIndexById(e.endLineId);if(t===-1||r===-1)return null;let s=t,o=r,i=e.startOffset,a=e.endOffset;t>r&&(s=r,o=t,i=e.endOffset,a=e.startOffset);let d=new Map,c=-1;for(let l=o;l>=s;l--){let u=this.lines[l];if(u&&!this.isHiddenLine(u)){c=l;break}}for(let l=s;l<=o;l++){let u=this.lines[l];if(!u||this.isHiddenLine(u))continue;let f=this.lineIds.get(u);if(f===void 0)continue;let p=(u.body??"").length,m=l===s?Math.max(0,Math.min(p,i)):0,h=l===o?Math.max(0,Math.min(p,a)):p;d.set(f,{start:m,end:h,toEnd:l<c})}return{loIdx:s,hiIdx:o,byId:d}}selectionRangeForChunk(e){if(this.selection===null)return null;let t=this.selectionRenderBounds??this.selectionLineBounds()?.byId??null;if(t===null)return null;let r=this.wrapOrigin.get(e);if(!r)return null;let s=t.get(r.sourceLineId);if(!s)return null;let o=r.sourceColOffset,i=r.bodyDisplayShift??0,a=r.sourceColEnd??o+e.body.length-i,d=Math.max(s.start,o),c=Math.min(s.end,a);if(c<=d)return null;let l,u;if(r.sourceColEnd!==void 0){let f=this.sourceBodyForId(r.sourceLineId);if(f===null)return null;let p=Dv(f,o,d),m=Dv(f,d,c);l=Bv(e.body,i,p),u=Bv(e.body,l,m)}else l=d-o+i,u=c-o+i;return{start:l,end:u,toEndOfLine:s.toEnd||s.end>a}}sourceBodyForId(e){let t=this.lineIndexById(e);return t===-1?null:this.lines[t]?.body??null}setBannerSearchIndicator(e){this.bannerSearchIndicator!==e&&(this.bannerSearchIndicator=e,this.syncedPartialRepaint(()=>this.drawBanner()))}bannerRightContent(){if(this.scrollbackSearch!==null){let e=this.scrollbackSearch,t=e.matches.length>0?` ${e.matchIndex+1}/${e.matches.length}`:e.term.length===0?"":" 0/0";return{text:`\u{1F50D} ${e.term}${t}`,kind:"search"}}return this.bannerSearchIndicator!==null?{text:`\u{1F50D} ${this.bannerSearchIndicator}`,kind:"search"}:this.bannerNotification!==null?{text:this.bannerNotification,kind:"notify"}:this.workspaceIndicator!==null?{text:this.workspaceIndicator,kind:"workspace"}:this.synthesisIndicator!==null?{text:this.synthesisIndicator,kind:"synthesis"}:this.compactionIndicator!==null?{text:this.compactionIndicator,kind:"compaction"}: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 t of e){let r=this.lineIds.get(t);if(r!==void 0&&(r===this.selection.startLineId||r===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 t=this.keyedBlocks.get(e);if(!t)return;let r=t.start+t.count,s=r>=this.lines.length,o=this.wrappedRowsOfMany(this.lines.slice(t.start,r)),i=this.lines.splice(t.start,t.count);for(let a of i)this.forgetLine(a);this.invalidateSelectionIfTouches(i),this.keyedBlocks.delete(e);for(let[a,d]of this.keyedBlocks)a!==e&&d.start>t.start&&(d.start-=t.count);s&&(this.streamingActive=!1),this.adjustScrollForRowChange(-o),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 t=e.start+e.count;if(t>=this.lines.length)return;let r=this.lines.splice(e.start,e.count);for(let[s,o]of this.keyedBlocks)s!==this.stickyBottomKey&&o.start>=t&&(o.start-=e.count);e.start=this.lines.length,this.lines.push(...r),this.streamingActive=!1}removeBlock(e){let t=this.keyedBlocks.get(e);if(!t)return;let r=t.start+t.count>=this.lines.length,s=this.wrappedRowsOfMany(this.lines.slice(t.start,t.start+t.count)),o=this.lines.splice(t.start,t.count);for(let i of o)this.forgetLine(i);this.invalidateSelectionIfTouches(o),this.keyedBlocks.delete(e);for(let[,i]of this.keyedBlocks)i.start>t.start&&(i.start-=t.count);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(-s),this.scheduleRepaint()}contiguousRun(e,t){if(!this.keyedBlocks.has(e))return[];let r=[...t].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),s=r.findIndex(d=>d.key===e);if(s<0)return[];let o=(d,c)=>{for(let[l,u]of this.keyedBlocks)if(!t.has(l)&&u.start>=d&&u.start<c)return!0;return!1},i=s;for(;i>0&&!o(r[i-1].start+r[i-1].count,r[i].start);)i--;let a=s;for(;a<r.length-1&&!o(r[a].start+r[a].count,r[a+1].start);)a++;return r.slice(i,a+1).map(d=>d.key)}setRunCollapsed(e,t,r){if(e.length===0)return;let s=e[0];if(!this.keyedBlocks.has(s))return;this.upsertLines(s,r);let o=this.keyedBlocks.get(s),i=o.start+o.count;for(let a of e){let d=this.keyedBlocks.get(a);d&&(i=Math.max(i,d.start+d.count))}for(let a=o.start+o.count;a<i;a++){let d=this.lines[a];d&&(d.collapsed=t)}this.scheduleRepaint()}redraw(){this.repaint()}fullRedraw(){this.painter.clearCache(),this.lastWindowTitle=null,this.wrapCache.clear(),this.wrapCacheWidth=0,we(hk),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.permissionArmedAt=Date.now()),this.permissionPrompt=e?{...e}:null,e===null&&(this.permissionRowHits.clear(),this.permissionHintHits=[],this.permissionRegion=null,this.permissionPressHit=null),kM(this.permissionPrompt!==null),this.repaint()}setFormPrompt(e){e!==null&&this.formPrompt===null&&this.clearSelection(),this.formPrompt=e?{...e,rows:e.rows.map(t=>({...t}))}:null,e===null&&(this.clearFormHits(),this.formWindowKey=null,this.formWindowTop=0),this.repaint()}clearFormHits(){this.formRowHits.clear(),this.formHintHits=[],this.formRegion=null,this.formPressHit=null}isFormPromptActive(){return this.formPrompt!==null}setConfirmPrompt(e){e!==null&&this.confirmPrompt===null&&this.clearSelection(),this.confirmPrompt=e?{...e}:null,this.repaint()}isCompactionPromptActive(){return this.compactionPrompt!==null}compactionPromptSpec(){return this.compactionPrompt?{...this.compactionPrompt}:null}setCompactionPrompt(e){e!==null&&this.compactionPrompt===null&&(this.clearSelection(),this.compactionArmedAt=Date.now()),this.compactionPrompt=e?{...e}:null,e===null&&(this.compactionRowHits.clear(),this.compactionHintHits=[],this.compactionRegion=null,this.compactionPressHit=null),this.repaint()}setHelpPrompt(e){e!==null&&this.helpPrompt===null&&this.clearSelection(),this.helpPrompt=e?{...e,entries:[...e.entries]}:null,e===null&&(this.helpRegion=null,this.helpPressed=!1),this.repaint()}isHelpPromptActive(){return this.helpPrompt!==null}openBtwOverlay(e){let t=e?.height??12;this.btwOverlayOpen=!0,this.btwOverlayMaxHeight=t,this.focusedPane="btw",this.btwOverlayLines=[],this.btwOverlayScroll=0,this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.scheduleRepaint()}setBtwOverlayMeta(e){let t=!1;if(e.sessionId!==void 0&&this.btwOverlaySessionId!==e.sessionId&&(this.btwOverlaySessionId=e.sessionId,t=!0),e.usage!==void 0){let r=this.btwOverlayUsage,s=e.usage;(!r||r.used!==s.used||r.size!==s.size||r.costAmount!==s.costAmount||r.costCurrency!==s.costCurrency)&&(this.btwOverlayUsage={...s},t=!0)}t&&this.scheduleRepaint()}setBtwOverlayContent(e){if(this.btwOverlayLines.length===e.length){let r=!0;for(let s=0;s<e.length;s++)if(this.btwOverlayLines[s]!==e[s]){r=!1;break}if(r)return}let t=this.btwOverlayLines.length;if(this.btwOverlayLines=[...e],this.btwOverlayScroll>0&&e.length>t){let r=this.term.width,s=0;for(let o=t;o<this.btwOverlayLines.length;o++)s+=r>4?this.wrapOne(this.btwOverlayLines[o],r).length:1;this.btwOverlayScroll+=s}this.scheduleRepaint()}setBtwOverlayStatus(e){let t=this.btwOverlayLabel===e.label,r=this.btwOverlayStatus===e.style;t&&r||(this.btwOverlayLabel=e.label,this.btwOverlayStatus=e.style,this.scheduleRepaint())}closeBtwOverlay(){this.btwOverlayOpen&&(this.btwOverlayOpen=!1,this.btwOverlayRegion=null,this.focusedPane="main",this.scheduleRepaint())}reopenBtwOverlay(){return this.btwOverlayOpen?!0:this.btwOverlayLines.length===0?!1:(this.btwOverlayOpen=!0,this.focusedPane="btw",this.scheduleRepaint(),!0)}hasBtwOverlayHistory(){return this.btwOverlayLines.length>0}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((r,s)=>{let o=this.completions[s];return o!==void 0&&o.name===r.name&&o.description===r.description})||(this.completions=[...e],this.repaint())}ensureSeparator(e){if(this.lines.length===0)return;let t=this.stickyBottomKey!==null?this.keyedBlocks.get(this.stickyBottomKey):void 0,r=t!==void 0&&t.start+t.count===this.lines.length,s=r?t.start-1:this.lines.length-1;if(s<0)return;let o=this.lines[s];if(o&&o.body===""&&(o.prefix===void 0||o.prefix===""))return;let i={body:""};e!==void 0&&(i.bodyStyle=e),r?(this.lines.splice(t.start,0,i),t.start+=1):this.lines.push(i),this.trackLine(i),this.streamingActive=!1,this.adjustScrollForRowChange(this.wrappedRowsOf(i)),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,t){if(process.env.HYDRA_TUI_KEY_TRACE&&ge({tag:"key",name:e,isChar:!!t.isCharacter}),t.isCharacter){this.chordMatcher.clear(),this.onKey([{type:"char",ch:e}]);return}if(e==="PAGE_UP"){this.chordMatcher.clear(),this.scrollBy(this.scrollPageSize());return}if(e==="PAGE_DOWN"){this.chordMatcher.clear(),this.scrollBy(-this.scrollPageSize());return}if(e==="ALT_PAGE_UP"){this.chordMatcher.clear(),this.scrollToPrevTurn();return}if(e==="ALT_PAGE_DOWN"){this.chordMatcher.clear(),this.scrollToNextTurn();return}let r=lg(e);if(r){this.dispatchKeyName(r);return}e.startsWith("CTRL_")&&(this.chordMatcher.clear(),this.revealHints())}dispatchKeyName(e){let t=this.chordMatcher.feed(e);switch(t.kind){case"pass":this.onKey([{type:"key",name:t.token}]);return;case"armed":return;case"aborted":this.revealHints();return}}handleMouse(e,t){if(e==="MOUSE_WHEEL_UP"||e==="MOUSE_WHEEL_DOWN"){let u=e==="MOUSE_WHEEL_UP"?3:-3,f=this.mouseCell(t);if(f!==null&&this.isFormCell(f.y)){this.stepFormCursor(e==="MOUSE_WHEEL_UP"?-3:3);return}if(f!==null&&this.isCompactionCell(f.y)){this.stepCompactionCursor(e==="MOUSE_WHEEL_UP"?-1:1);return}if(f!==null&&this.isSidebarCell(f.x,f.y)&&this.scrollSidebarBy(u)||f!==null&&this.isBtwOverlayCell(f.y)&&this.scrollBtwOverlayBy(u))return;this.scrollBy(u);return}let s=this.terminalFocused&&Date.now()-this.lastFocusInAt<200;if((this.terminalFocused===!1||s)&&(e.endsWith("_PRESSED")||e.endsWith("_RELEASED")||e==="MOUSE_MOTION"||e==="MOUSE_DRAG"))return;let i=this.mouseCell(t),a=xK(e),d=null;e==="MOUSE_DRAG"||e==="MOUSE_MOTION"?d="move":e.endsWith("_PRESSED")?d="press":e.endsWith("_RELEASED")&&(d="release"),d!==null&&i!==null&&this.onMouse&&this.onMouse({kind:d,button:a,x:i.x,y:i.y,name:e});let c=i!==null?this.barHitAt(i.x,i.y):null;if(d==="move"){let u=c?.id??null,f=i!==null&&i.y===this.composerBottomRow&&this.hintZoneStart!==null&&i.x>=this.hintZoneStart,p=this.trackHintHover(f);if((u!==this.hoveredBarHit||p)&&(this.hoveredBarHit=u,this.syncedPartialRepaint(()=>this.drawBars())),c!==null&&this.setPointerShape(c.action!=="none"||c.doubleAction!=="none"?"pointer":"default"),i!==null&&this.isPermissionCell(i.y)){let m=this.permissionHitAt(i.x,i.y);this.setPointerShape(m!==null?"pointer":"default"),m!==null&&m.kind==="option"&&this.permissionPrompt!==null&&m.index!==this.permissionPrompt.selectedIndex&&this.onPermissionClick?.({kind:"option",index:m.index,select:!0})}if(i!==null&&this.isCompactionCell(i.y)){let m=this.compactionHitAt(i.x,i.y);this.setPointerShape(m!==null?"pointer":"default"),m!==null&&m.kind==="option"&&this.compactionPrompt!==null&&m.index!==this.compactionPrompt.selectedIndex&&this.onCompactionClick?.({kind:"option",index:m.index,select:!0})}if(i!==null&&this.isFormCell(i.y)){let m=this.formHitAt(i.x,i.y);this.setPointerShape(m!==null?"pointer":"default"),m!==null&&m.kind==="row"&&this.formPrompt!==null&&m.row!==this.formPrompt.selectedIndex&&this.onFormClick?.({kind:"row",row:m.row,select:!0})}}let l=i!==null&&c===null&&this.barHits.get(i.y)===void 0&&i.x>=1&&i.x<=this.transcriptVisibleWidth();if(i!==null&&l&&d!=="release"){let u=this.keyAndSubAtRow(i.y),f=u!==null&&u.key.startsWith("agent:")?null:u;if(f===null&&d==="move"&&this.hoveredRunKeys!==null&&this.hoveredBlockKey!==null){let p=this.nearestKeyAboveRow(i.y),m=this.nearestKeyBelowRow(i.y);p!==null&&m!==null&&this.hoveredRunKeys.has(p)&&this.hoveredRunKeys.has(m)&&(f={key:this.hoveredBlockKey,sub:null})}if(this.setPointerShape(f!==null?"pointer":"default"),d==="move"){let p=f?.key??null,m=f?.sub??null;(p!==this.hoveredBlockKey||m!==this.hoveredSubKey)&&(this.hoveredBlockKey=p,this.hoveredSubKey=m,this.hoveredRunKeys=p!==null&&this.onHoverRun?this.onHoverRun(p)??null:null,this.syncedPartialRepaint(()=>this.drawScrollback()))}}else d==="move"&&(i!==null&&!l&&this.setPointerShape("default"),(this.hoveredBlockKey!==null||this.hoveredSubKey!==null||this.hoveredRunKeys!==null)&&(this.hoveredBlockKey=null,this.hoveredSubKey=null,this.hoveredRunKeys=null,this.syncedPartialRepaint(()=>this.drawScrollback())));if(e==="MOUSE_LEFT_BUTTON_PRESSED"){let u=this.lastLeftClick;if(u!==null&&i!==null&&Math.abs(i.x-u.x)<=Zc&&Math.abs(i.y-u.y)<=Zc&&Date.now()-u.t<=Xc||this.flushPendingBlockClick(),i!==null&&this.handleBarPress(i)){this.pressCell=null;return}if(i!==null&&this.handlePermissionPress(i)){this.pressCell=null;return}if(i!==null&&this.handleCompactionPress(i)){this.pressCell=null;return}if(i!==null&&this.handleHelpPress(i)){this.pressCell=null;return}if(i!==null&&this.handleFormPress(i)){this.pressCell=null;return}if(this.handleSidebarPress(i)){this.pressCell=null,this.clearSelection();return}if(this.pressCell=i,i!==null&&this.handlePromptSelectionPress(i)){this.lastLeftClick=null;return}this.handleSelectionPress(i,SK(t,"shift"));return}if(e.endsWith("_PRESSED")&&e!=="MOUSE_LEFT_BUTTON_PRESSED"&&this.flushPendingBlockClick(),!(e==="MOUSE_RIGHT_BUTTON_PRESSED"&&i!==null&&this.extendSelectionByClick(i))){if(e==="MOUSE_DRAG"&&i!==null){if(this.promptSelectionAnchor!==null){this.handlePromptSelectionDrag(i);return}this.handleSelectionDrag(i);return}if(e==="MOUSE_LEFT_BUTTON_RELEASED"||e==="MOUSE_RIGHT_BUTTON_RELEASED"||e==="MOUSE_MIDDLE_BUTTON_RELEASED"||e==="MOUSE_OTHER_BUTTON_RELEASED"||e==="MOUSE_BUTTON_RELEASED"){if(this.handleBarRelease(i)){this.pressCell=null;return}if(this.handlePermissionRelease(i)){this.pressCell=null;return}if(this.handleCompactionRelease(i)){this.pressCell=null;return}if(this.handleHelpRelease(i)){this.pressCell=null;return}if(this.handleFormRelease(i)){this.pressCell=null;return}let u=this.pressCell;if(this.pressCell=null,this.promptSelectionAnchor!==null){this.handlePromptSelectionRelease(i);return}let f=this.inAppSelectionEnabled&&(this.selectionDragStarted||this.doubleClickPending);if(u!==null&&i!==null&&i.x===u.x&&i.y===u.y&&!f&&this.onBlockClick){let p=this.keyAndSubAtRow(i.y),m=p?.key??null;if(m!==null){let h=i.y;for(;h>1&&this.keyAtRow(h-1)===m;)h-=1;this.schedulePendingBlockClick(m,i.y-h,p?.sub??null)}}(i===null||!this.isSidebarCell(i.x,i.y))&&this.handleSelectionRelease(i)}}}handleSelectionPress(e,t=!1){if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,this.pendingClickCount=1,this.selectionGranularity="char",this.selectionAnchorWordBounds=null,this.selectionAnchorLineId=null,!this.inAppSelectionEnabled||e===null)return;let r=this.resolveCellToSource(e.x,e.y)??this.resolveNearestSource(e.x,e.y);if(r===null){this.lastLeftClick=null;return}if(t&&this.selection!==null&&this.extendSelectionByClickResolved(r)){this.lastLeftClick=null;return}this.selectionAnchor=r;let s=Date.now(),o=this.lastLeftClick,i=o!==null&&s-o.t<=Xc&&Math.abs(e.x-o.x)<=Zc&&Math.abs(e.y-o.y)<=Zc&&o.sourceLineId!==null&&o.sourceLineId===r.sourceLineId;if(i&&o.count===2&&e.x===o.x&&e.y===o.y){this.pendingClickCount=3,this.cancelPendingBlockClick(),this.selectWholeSourceLine(r.sourceLineId),this.selectionGranularity="line",this.selectionAnchorLineId=r.sourceLineId,this.doubleClickPending=!0;return}if(i&&o.count===1){if(this.pendingClickCount=2,this.cancelPendingBlockClick(),this.tryOpenLinkAt(r,e?.y??null)){this.doubleClickPending=!0,this.lastLeftClick=null;return}if(this.tryOpenFileAt(r)){this.doubleClickPending=!0,this.lastLeftClick=null;return}if(this.tryOpenSessionAt(r)){this.doubleClickPending=!0,this.lastLeftClick=null;return}let c=this.wordBoundsAt(r);c!==null&&(this.setSelection({sourceLineId:r.sourceLineId,offset:c.start},{sourceLineId:r.sourceLineId,offset:c.end}),this.doubleClickPending=!0,this.selectionGranularity="word",this.selectionAnchorWordBounds={sourceLineId:r.sourceLineId,start:c.start,end:c.end})}}selectWholeSourceLine(e){let t=this.lineById(e);if(t===null)return;let r=(t.body??"").length;this.setSelection({sourceLineId:e,offset:0},{sourceLineId:e,offset:r})}handleSelectionDrag(e){if(!this.inAppSelectionEnabled||this.selectionAnchor===null)return;this.extendSelectionForGesture(e);let t=this.scrollbackVisibleRows();e.y<=1&&this.scrollOffset<this.maxScrollOffset()?this.startAutoscroll(e,1):e.y>=t&&this.scrollOffset>0?this.startAutoscroll(e,-1):this.stopAutoscroll()}extendSelectionForGesture(e){this.selectionGranularity==="word"?this.extendWordSelectionToCell(e):this.selectionGranularity==="line"?this.extendLineSelectionToCell(e):this.extendSelectionToCell(e)}extendWordSelectionToCell(e){if(this.selectionAnchorWordBounds===null)return;let t=this.resolveCellToSource(e.x,e.y)??this.resolveNearestSource(e.x,e.y);if(t===null)return;let r=this.selectionAnchorWordBounds,s=this.lineIndexById(r.sourceLineId),o=this.lineIndexById(t.sourceLineId);if(s<0||o<0)return;let i=o<s||o===s&&t.offset<r.start,a=o>s||o===s&&t.offset>r.end,d={sourceLineId:r.sourceLineId,offset:r.start},c={sourceLineId:r.sourceLineId,offset:r.end};if(i){let l=this.wordBoundsAt(t);d=l!==null?{sourceLineId:t.sourceLineId,offset:l.start}:t}else if(a){let l=this.wordBoundsAt(t);c=l!==null?{sourceLineId:t.sourceLineId,offset:l.end}:t}this.selectionDragStarted=!0,this.setSelection(d,c)}extendLineSelectionToCell(e){if(this.selectionAnchorLineId===null)return;let t=this.resolveCellToSource(e.x,e.y)??this.resolveNearestSource(e.x,e.y);if(t===null)return;let r=this.lineIndexById(this.selectionAnchorLineId),s=this.lineIndexById(t.sourceLineId);if(r<0||s<0)return;let o=s<=r?t.sourceLineId:this.selectionAnchorLineId,i=s<=r?this.selectionAnchorLineId:t.sourceLineId,a=this.lineById(i);a!==null&&(this.selectionDragStarted=!0,this.setSelection({sourceLineId:o,offset:0},{sourceLineId:i,offset:(a.body??"").length}))}extendSelectionByClick(e){if(!this.inAppSelectionEnabled||this.selection===null)return!1;let r=this.resolveEdgeSource(e.y)??this.resolveCellToSource(e.x,e.y)??this.resolveNearestSource(e.x,e.y);return r===null?!1:this.extendSelectionByClickResolved(r)}resolveEdgeSource(e){let t=this.scrollbackVisibleRows();if(t<=0||this.lines.length===0)return null;let r=this.contentWidth(),{rows:s}=this.wrapTail(r,t+this.scrollOffset),o=s.length-this.scrollOffset,i=Math.max(0,o-t),a=s.slice(i,o),d=Math.max(0,t-a.length),c=e-1,l=this.scrollOffset<this.maxScrollOffset(),u=this.scrollOffset>0,f=c<d;if(c===0&&l||f){let p=this.lines[0];if(p){let m=this.lineIds.get(p);if(m!==void 0)return{sourceLineId:m,offset:0}}}if(c>=t-1&&u){let p=this.lines[this.lines.length-1];if(p){let m=this.lineIds.get(p);if(m!==void 0)return{sourceLineId:m,offset:(p.body??"").length}}}return null}resolveNearestSource(e,t){let r=this.scrollbackVisibleRows();if(r<=0)return null;let s=Math.max(1,Math.min(this.transcriptVisibleWidth(),e));for(let o=1;o<r;o++){let i=t-o;if(i>=1){let d=this.resolveCellToSource(s,i);if(d!==null){let c=this.lineById(d.sourceLineId);return c?{sourceLineId:d.sourceLineId,offset:(c.body??"").length}:d}}let a=t+o;if(a<=r){let d=this.resolveCellToSource(s,a);if(d!==null)return{sourceLineId:d.sourceLineId,offset:0}}}return null}extendSelectionByClickResolved(e){let t=this.farEndpointFrom(e);return t===null?!1:(this.selectionAnchor=t,this.selectionDragStarted=!0,this.setSelection(t,e),!0)}extendSelectionToCell(e){if(this.selectionAnchor===null)return;let t=this.resolveCellToSource(e.x,e.y);t!==null&&(this.selectionDragStarted=!0,this.setSelection(this.selectionAnchor,t))}static AUTOSCROLL_TICK_MS=60;startAutoscroll(e,t){if(this.autoscrollTimer!==null&&this.autoscrollDir===t){this.autoscrollCell={x:e.x,y:e.y};return}this.stopAutoscroll(),this.autoscrollCell={x:e.x,y:e.y},this.autoscrollDir=t,this.autoscrollTimer=setInterval(()=>{if(this.selectionAnchor===null||this.autoscrollCell===null){this.stopAutoscroll();return}let r=this.scrollOffset;if(this.scrollBy(this.autoscrollDir),this.scrollOffset===r){this.stopAutoscroll();return}this.extendSelectionForGesture(this.autoscrollCell)},n.AUTOSCROLL_TICK_MS)}stopAutoscroll(){this.autoscrollTimer!==null&&(clearInterval(this.autoscrollTimer),this.autoscrollTimer=null),this.autoscrollCell=null}handleSelectionRelease(e){this.stopAutoscroll();let t=this.selectionDragStarted,r=this.doubleClickPending;if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,e!==null){let s=this.resolveCellToSource(e.x,e.y);this.lastLeftClick={x:e.x,y:e.y,t:Date.now(),count:this.pendingClickCount,sourceLineId:s?.sourceLineId??null}}if(this.pendingClickCount=1,!!this.inAppSelectionEnabled){if(t||r){this.finalizeSelection();return}this.selection!==null&&this.clearSelection()}}wordBoundsAt(e){let t=this.lineById(e.sourceLineId);if(t===null)return null;let r=t.body??"";if(r.length===0)return null;let{clean:s,rawToClean:o}=ag(r);if(s.length===0)return null;let i=o[Math.min(e.offset,o.length-1)]??s.length,a=Math.max(0,Math.min(s.length-1,i));if(i>=s.length&&(a=s.length-1),!Ha.test(s[a])&&!Mv.test(s[a]))return null;let d=a;for(;d>0&&Mv.test(s[d-1]);)d--;let c=a+1;for(;c<s.length&&Mv.test(s[c]);)c++;for(;c>d+1&&rK.test(s[c-1]);)c--;if(s.slice(d,c).includes("://")){let p=d,m=c;return this.projectCleanRangeToRaw(o,r.length,p,m)}if(!Ha.test(s[a]))return null;let u=a;for(;u>0&&Ha.test(s[u-1]);)u--;let f=a+1;for(;f<s.length&&Ha.test(s[f]);)f++;for(;f>u+1&&zM.test(s[f-1]);)f--;for(;u<f-1&&zM.test(s[u]);)u++;return this.projectCleanRangeToRaw(o,r.length,u,f)}projectCleanRangeToRaw(e,t,r,s){let o=t,i=t;for(let a=0;a<e.length;a++)if(e[a]===r&&o===t&&(o=a),e[a]===s&&i===t){i=a;break}return{start:o,end:i}}pathTokenAt(e){let t=this.lineById(e.sourceLineId);if(t===null||t.ansi)return null;let r=t.body??"";if(r.length===0)return null;let{clean:s,rawToClean:o}=ag(r);if(s.length===0)return null;let i=o[Math.min(e.offset,o.length-1)]??s.length;if(t.links){for(let p of t.links)if(i>=p.start&&i<p.end){let m=p.url,h=m.startsWith("file://")?m.slice(7):m,g=null,w=h.match(/^(.*?)#L(\d+)(?:-L?\d+)?$/);return w&&(h=w[1],g=Number.parseInt(w[2],10)),{raw:h,line:g}}}let a=Math.max(0,Math.min(s.length-1,i));if(i>=s.length&&(a=s.length-1),!Pv.test(s[a]))return null;let d=a;for(;d>0&&Pv.test(s[d-1]);)d--;let c=a+1;for(;c<s.length&&Pv.test(s[c]);)c++;let l=s.slice(d,c);if(l=l.replace(/[.]+$/,""),l.length===0||l.startsWith("//"))return null;let u=null,f=s.slice(c).match(/^:(\d+)(?::\d+)?/);return f&&(u=Number.parseInt(f[1],10)),{raw:l,line:u}}findLinkUrlAt(e){let t=this.lineById(e.sourceLineId);if(t===null||!t.links||t.ansi)return null;let r=t.body??"";if(r.length===0)return null;let{clean:s,rawToClean:o}=ag(r);if(s.length===0)return null;let i=o[Math.min(e.offset,o.length-1)]??s.length;for(let a of t.links)if(i>=a.start&&i<a.end)return a.url;return null}osc8UrlFor(e){if(KM.test(e))return null;if(e.startsWith("file://"))return Gc(this.sessionbar)?null:e;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e))return e;if(Gc(this.sessionbar))return null;let t=e.indexOf("#"),r=t===-1?e:e.slice(0,t),s=t===-1?"":e.slice(t);if(r.length===0)return null;let o=r;return r==="~"||r.startsWith("~/")?o=r==="~"?rg():`${rg()}/${r.slice(2)}`:sg(r)||(o=qM(this.sessionbar.cwd,r)),Kb(o+s)}linkSpansForWindow(e,t,r,s,o){let i=EK(e),a=[];for(let d of t){let c=this.osc8UrlFor(d.url);if(c===null)continue;let l=i[d.start]??e.length,u=i[d.end]??e.length,f=Math.max(l,r),p=Math.min(u,s);p>f&&a.push({start:f-r+o,end:p-r+o,url:c})}return a.length>0?a:null}resolvePathToken(e){let t=e;(t==="~"||t.startsWith("~/"))&&(t=t==="~"?rg():`${rg()}/${t.slice(2)}`);let r=sg(t)||e.startsWith("~"),s=sg(t)?t:qM(this.sessionbar.cwd,t);if(r)return s;try{if(tf(s).isFile())return s}catch{return null}return null}tryOpenFileAt(e){if(this.openFileCommand===null)return!1;let t=this.pathTokenAt(e);if(t===null)return!1;let r=t.line===null?"":`:${t.line}`;return this.tryOpenPathString(t.raw+r)}tryOpenSessionAt(e){if(!this.onHydraLinkClick)return!1;let t=this.pathTokenAt(e);if(t===null)return!1;let r=t.raw;if(!sK.test(r))return!1;let s=r.startsWith(on)?[r]:[on+r,r],o=null;for(let i of s)try{if(tf(D.sessionFile(i)).isFile()){o=i;break}}catch{}return o===null?!1:this.onHydraLinkClick(o)}dispatchLinkUrl(e){let t=e.match(KM);if(t){let o=t[1]??null;return o!==null&&this.onHydraLinkClick!==void 0?this.onHydraLinkClick(o):!1}if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e)&&!e.startsWith("file://"))return!1;let r=e;if(r.startsWith("file://")){let o=r.slice(7),i=o.indexOf("/");r=i===-1?"":o.slice(i);try{r=decodeURIComponent(r)}catch{}}if(r.length===0)return!1;let s=r.match(/^(.*?)#L(\d+)(?:-L?\d+)?$/);return s?this.tryOpenPathString(`${s[1]}:${s[2]}`):this.tryOpenPathString(r)}tryOpenLinkAt(e,t){let r=this.findLinkUrlAt(e);if(r!==null)return this.dispatchLinkUrl(r);let o=this.lineById(e.sourceLineId)?.links?.[0]?.url;if(o!==void 0)return this.dispatchLinkUrl(o);if(t!==null){let i=this.blockLinkUrlAt(t);if(i!==null)return this.dispatchLinkUrl(i)}return!1}reconcileWorkspacePath(e){let t=jM(D.home(),"workspaces")+og;if(!e.startsWith(t))return e;let s=this.sessionbar.cwd;if(s.length>0&&(e===s||e.startsWith(s+og)))return e;let o=!1;try{tf(e),o=!0}catch{o=!1}if(o)return this.notify("opening a file in a workspace this session left \u2014 edits there will not reach your project",5e3),e;let i=e.slice(t.length).split(og).slice(2).join(og);if(i.length>0&&s.length>0){let a=jM(s,i);try{if(tf(a).isFile())return this.notify("that workspace is gone \u2014 opened the file in your project instead",4e3),a}catch{}}return this.notify("that file was in a workspace that no longer exists",4e3),null}tryOpenPathString(e){if(Gc(this.sessionbar))return this.notify(`can't open \u2014 this session's files are on ${this.sessionbar.remote}`,4e3),!0;if(this.openFileCommand===null)return!1;let t=e,r=null,s=e.match(/^(.*?):(\d+)(?::\d+)?$/);s&&(t=s[1],r=Number.parseInt(s[2],10));let o=this.resolvePathToken(t);if(o===null)return!1;let i=this.reconcileWorkspacePath(o);if(i===null)return!1;let a=MM(this.openFileCommand,i,r);if(a===null)return!1;let d=r===null?i:`${i}:${r}`;if(this.openFileForeground)return this.openInForeground(a,d),!0;try{let c=Xz(a.program,a.args,{detached:!0,stdio:"ignore",cwd:this.spawnCwd()});c.on("error",l=>{this.notify(`open file failed: ${l.message}`)}),c.unref(),this.notify(`opening ${d}`)}catch(c){this.notify(`open file failed: ${c.message}`)}return!0}spawnCwd(){let e=this.sessionbar.cwd;if(!(!e||!sg(e)))try{return tf(e).isDirectory()?e:void 0}catch{return}}openInForeground(e,t){this.foregroundChildActive||(this.foregroundChildActive=!0,this.runForeground({program:e.program,args:e.args,cwd:this.spawnCwd(),banner:`\u2500 ${e.program} ${t} \u2014 quit the editor to return to hydra \u2500
260
260
  `},{suspend:()=>this.stop(),resume:()=>this.start(),notify:r=>this.notify(r)}).finally(()=>{this.foregroundChildActive=!1}))}schedulePendingBlockClick(e,t,r){if(!this.onBlockClick)return;if(this.openFileCommand===null){this.onBlockClick(e,t,r);return}this.cancelPendingBlockClick();let s=this.onBlockClick,o=setTimeout(()=>{this.pendingBlockClick=null,s(e,t,r)},Xc);typeof o.unref=="function"&&o.unref(),this.pendingBlockClick={timer:o,key:e,rowOffset:t,subKey:r}}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,e.subKey))}lineById(e){for(let t of this.lines)if(this.lineIds.get(t)===e)return t;return null}lineIndexById(e){for(let t=0;t<this.lines.length;t++){let r=this.lines[t];if(r&&this.lineIds.get(r)===e)return t}return-1}finalizeSelection(){let e=this.getSelectionText();e.length!==0&&Vc(e,{target:this.selectionClipboard}).then(t=>{if(t.ok){let r=e.length;this.notify(`copied ${r} char${r===1?"":"s"} to clipboard`)}else this.notify(`clipboard copy failed: ${t.reason}`)},t=>{this.notify(`clipboard copy failed: ${t.message}`)})}mouseCell(e){if(!e||typeof e!="object")return null;let t=e,r=Number(t.x),s=Number(t.y);return!Number.isFinite(r)||!Number.isFinite(s)?null:{x:r,y:s}}setPointerShape(e){e!==this.currentPointerShape&&(this.currentPointerShape=e,we(e==="pointer"?oE:gm))}blockLinkUrlAt(e){let t=this.keyAtRow(e);if(t===null||t.startsWith("agent:"))return null;let r=this.contentWidth(),s=1,o=this.scrollbackVisibleRows();if(o<=0)return null;let{rows:i}=this.wrapTail(r,o+this.scrollOffset),a=i.length-this.scrollOffset,d=Math.max(0,a-o),c=i.slice(d,a),l=Math.max(0,o-c.length),u=e-s-l,f=d+u,p=null,m=1/0;for(let h=0;h<i.length;h++){let g=i[h];if(g.blockKey!==t||g.linkSpans===void 0||g.linkSpans.length===0)continue;let w=Math.abs(h-f);w<m&&(m=w,p=g.linkSpans[0]?.url??null)}return p}keyAtRow(e){let t=this.contentWidth(),r=1,s=this.scrollbackVisibleRows();if(s<=0)return null;let o=e-r;if(o<0||o>=s)return null;let{rows:i}=this.wrapTail(t,s+this.scrollOffset),a=i.length-this.scrollOffset,d=Math.max(0,a-s),c=i.slice(d,a),l=Math.max(0,s-c.length),u=o-l;return u<0||u>=c.length?null:c[u]?.blockKey??null}nearestKeyAboveRow(e){for(let t=e-1;t>=1;t--){let r=this.keyAtRow(t);if(r!==null)return r}return null}nearestKeyBelowRow(e){let r=this.scrollbackVisibleRows();for(let s=e+1;s<=r;s++){let o=this.keyAtRow(s);if(o!==null)return o}return null}keyAndSubAtRow(e){let t=this.contentWidth(),r=1,s=this.scrollbackVisibleRows();if(s<=0)return null;let o=e-r;if(o<0||o>=s)return null;let{rows:i}=this.wrapTail(t,s+this.scrollOffset),a=i.length-this.scrollOffset,d=Math.max(0,a-s),c=i.slice(d,a),l=Math.max(0,s-c.length),u=o-l;if(u<0||u>=c.length)return null;let f=c[u];return f?.blockKey?{key:f.blockKey,sub:f.hoverSubKey??null}:null}resolveCellToSource(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))return null;let r=this.contentWidth(),s=1,o=this.scrollbackVisibleRows();if(o<=0)return null;let i=t-s;if(i<0||i>=o||e<1||e>this.transcriptVisibleWidth())return null;let{rows:a}=this.wrapTail(r,o+this.scrollOffset),d=a.length-this.scrollOffset,c=Math.max(0,d-o),l=a.slice(c,d),u=Math.max(0,o-l.length),f=i-u;if(f<0||f>=l.length)return null;let p=l[f];if(!p)return null;let m=this.wrapOrigin.get(p);if(!m)return null;let h=Et(p.prefix??""),g=m.bodyDisplayShift??0,w=e-1-h;if(w<g)return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset};let b=w,S=rf(p.bodyStyle)||p.ansi===!0?EM(jv(p.body),b):TM(p.body,b);if(m.sourceColEnd!==void 0){let I=this.sourceBodyForId(m.sourceLineId);if(I!==null){let x=Dv(p.body,g,S),A=Bv(I,m.sourceColOffset,x);return{sourceLineId:m.sourceLineId,offset:A}}}return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset+S-g}}scrollBy(e){if(e===0)return;this.cancelSlide(),this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let t=this.maxScrollOffset(),r=Math.min(t,Math.max(0,this.scrollOffset+e));r!==this.scrollOffset&&(this.scrollOffset=r,this.repaint())}scrollToBottom(){this.cancelSlide(),this.scrollbackSearch!==null&&this.acceptScrollbackSearch(),this.scrollOffset!==0&&(this.scrollOffset=0,this.repaint())}scrollToTop(){this.cancelSlide(),this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let e=this.maxScrollOffset();this.scrollOffset!==e&&(this.scrollOffset=e,this.repaint())}scrollToPrevTurn(){if(this.pageWhenNoTurns(1))return;let e=this.turnStops(),t=this.settledScrollOffset(),r=e.find(s=>s>t);this.stepToTurnStop(r??this.maxScrollOffset())}scrollToNextTurn(){if(this.pageWhenNoTurns(-1))return;let e=this.turnStops(),t=this.settledScrollOffset(),r=0;for(let s of e){if(s>=t)break;r=s}this.stepToTurnStop(r)}pageWhenNoTurns(e){return this.turnScrollOffsets().length>0?!1:(this.scrollBy(e*this.scrollPageSize()),!0)}settledScrollOffset(){return this.slideTimer!==null?this.slideTarget:this.scrollOffset}stepToTurnStop(e){this.scrollbackSearch!==null&&this.acceptScrollbackSearch(),this.slideScrollTo(e),this.notifyTurnPosition(e)}turnStops(){let e=this.maxScrollOffset(),t=[0,...this.turnScrollOffsets(),e].filter(r=>r>=0&&r<=e).sort((r,s)=>r-s);return t.filter((r,s)=>s===0||r!==t[s-1])}notifyTurnPosition(e){let t=this.turnScrollOffsets();if(t.length===0)return;let r=t.findIndex(o=>o>=e),s=r===-1?1:t.length-r;this.notify(`turn ${s}/${t.length}`,1500)}turnScrollOffsets(){return this.turnAnchors().map(e=>e.offset)}turnAnchors(){let e=this.contentWidth(),t=this.scrollbackVisibleRows();if(t<=0)return[];let r=[],s=0,o=null;for(let i=this.lines.length-1;i>=0;i--){let a=this.lines[i];if(!(!a||this.isHiddenLine(a))){if(s+=this.wrapOne(a,e).length,a.bodyStyle==="user"){o={offset:Math.max(0,s-t),lineIndex:i,recordedAt:a.recordedAt};continue}o!==null&&(r.push(o),o=null)}}return o!==null&&r.push(o),r}scrollToTurnAt(e){let t=this.turnAnchors();if(t.length===0)return;let r=t.find(s=>s.recordedAt!==void 0&&s.recordedAt<=e)??t[t.length-1];this.setScrollOffset(r.offset),this.notifyTurnPosition(r.offset)}slideScrollTo(e){this.cancelSlide();let t=Math.min(this.maxScrollOffset(),Math.max(0,e)),r=Math.abs(t-this.scrollOffset);if(r!==0){if(r<=bK||!this.slideEnabled){this.setScrollOffset(t);return}this.slideTarget=t,this.slideTimer=setInterval(()=>{let s=this.slideTarget-this.scrollOffset,o=Math.sign(s)*Math.max(1,Math.round(Math.abs(s)*wK)),i=Math.abs(s)<=Math.abs(o)?this.slideTarget:this.scrollOffset+o;this.scrollOffset=i,this.syncedPartialRepaint(()=>this.drawScrollback()),i===this.slideTarget&&this.cancelSlide()},yK)}}cancelSlide(e=!1){this.slideTimer!==null&&(clearInterval(this.slideTimer),this.slideTimer=null,e&&this.scrollOffset!==this.slideTarget&&(this.scrollOffset=Math.min(this.maxScrollOffset(),Math.max(0,this.slideTarget)),this.syncedPartialRepaint(()=>this.drawScrollback())))}setScrollOffset(e){this.cancelSlide(),this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let t=Math.min(this.maxScrollOffset(),Math.max(0,e));t!==this.scrollOffset&&(this.scrollOffset=t,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 t=e.toLowerCase(),r=[];if(t.length>0)for(let s=this.lines.length-1;s>=0;s--){let o=this.lines[s];if(!o||o.body.length===0||o.ansi)continue;let i=e_(o.body,t);for(let a=i.length-1;a>=0;a--)r.push({lineIdx:s,col:i[a].start})}this.scrollbackSearch.term=e,this.scrollbackSearch.matches=r,this.scrollbackSearch.matchIndex=0,this.scrollbackHighlight=t.length>0?t:null,r.length>0&&this.scrollToMatch(r[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 t=this.lines[e.lineIdx];if(!t)return null;let r=this.lineIds.get(t);return r===void 0?null:{lineId:r,col:e.col,length:this.scrollbackSearch.term.length}}activeMatchCol(e,t){if(!e||t===null)return null;let r=this.wrapOrigin.get(e);if(!r||r.sourceLineId!==t.lineId)return null;let s=r.bodyDisplayShift??0,o=t.col-r.sourceColOffset+s;return o<s||o>=e.body.length?null:o}scrollToMatch(e){let t=this.contentWidth(),r=this.scrollbackVisibleRows();if(r<=0)return;let s=0;for(let l=this.lines.length-1;l>e.lineIdx;l--){let u=this.lines[l];u&&(s+=this.wrapOne(u,t).length)}let o=this.lines[e.lineIdx],i=0;if(o){let l=this.wrapOne(o,t),u=0;for(let f=0;f<l.length;f++){let p=l[f];if(!p)continue;let m=p.body.length;if(e.col<u+m){i=l.length-1-f;break}u+=m}}let a=s+i,d=Math.max(0,a-Math.floor(r/2)),c=this.maxScrollOffset();this.scrollOffset=Math.min(c,d)}scrollPageSize(){return Math.max(1,this.scrollbackVisibleRows()-2)}scrollbackVisibleRows(){let t=this.term.height-this.promptRows()-_t-Ut-Ht-oK-this.chipRows()-this.queuedRows()-this.completionRows()-this.btwOverlayRows();return Math.max(0,t-1+1)}maxScrollOffset(){let{rows:e}=this.wrapTail(this.contentWidth(),Number.POSITIVE_INFINITY);return Math.max(0,e.length-this.scrollbackVisibleRows())}scheduleRepaint(){this.scheduler.schedule()}paintRow(e,t,r,s){return this.started?this.painter.paintRow(e,t,r,s):!1}repaint(){if(!this.started)return;if(this.repaintPaused>0){this.repaintPending=!0;return}this.scheduler.noteRepaintStart();let e=this.term.width,t=this.term.height;e<20||t<8||(this.painter.ensureSize(e,t),this.barHits.clear(),ht(()=>{this.term.hideCursor(),this.drawScrollback(),this.drawSidebar(1,this.scrollbackVisibleRows()),this.drawBtwOverlay(),this.drawCompletionZone(),this.drawQueuedZone(),this.drawAttachmentChipZone();let r=this.promptRows(),s=t-r-Ht-Ut-_t;this.drawBar("composerTop",s),this.drawPrompt(),this.drawBar("composerBottom",t-_t),this.drawBar("sessionbar",this.term.height),this.placeCursor(),(this.permissionPrompt||this.confirmPrompt||this.compactionPrompt||this.helpPrompt)&&this.term.hideCursor(!1),this.lastPromptRows=r}))}barContext(){return{scope:"session",session:this.sessionbar,banner:this.banner,scrollOffset:this.scrollOffset,transient:this.bannerRightContent(),hovered:this.terminalFocused?this.hoveredBarHit:null,hintsRevealed:this.hintsRevealed(),scriptOutputs:this.scriptOutputs}}trackHintHover(e){return e?(this.cancelHintHoverHide(),this.hintHoverReveal?!1:(this.hintHoverReveal=!0,!0)):(!this.hintHoverReveal||this.hintHoverHideTimer!==null||(this.hintHoverHideTimer=setTimeout(()=>{this.hintHoverHideTimer=null,this.hintHoverReveal=!1,this.syncedPartialRepaint(()=>this.drawBars())},nK)),!1)}cancelHintHoverHide(){this.hintHoverHideTimer!==null&&(clearTimeout(this.hintHoverHideTimer),this.hintHoverHideTimer=null)}hintsRevealed(){return this.terminalFocused?this.hintHoverReveal||this.hintKeyReveal:!1}revealHints(){this.hintKeyReveal||(this.hintKeyReveal=!0,this.syncedPartialRepaint(()=>this.drawBars()))}clearHintReveal(){this.cancelHintHoverHide(),!(!this.hintKeyReveal&&!this.hintHoverReveal)&&(this.hintKeyReveal=!1,this.hintHoverReveal=!1,this.syncedPartialRepaint(()=>this.drawBars()))}btwContext(){let e=this.btwOverlayStatus==="busy"?"busy":this.btwOverlayStatus==="done"?"ready":"disconnected";return{scope:"btw",statusLabel:"By the way",session:{...this.sessionbar,sessionId:this.btwOverlaySessionId??"",...this.btwOverlayUsage!==void 0?{usage:this.btwOverlayUsage}:{usage:void 0}},banner:{status:e,currentMode:void 0,hint:[],queued:0},scrollOffset:0,transient:null,hovered:this.terminalFocused?this.hoveredBarHit:null,hintsRevealed:!1,scriptOutputs:this.scriptOutputs}}drawBar(e,t){let r=ov[e],s=e==="sessionbar"?Math.max(1,this.term.width-1):this.term.width,o=e==="sessionbar"?this.barConfig.sessionbar:e==="composerBottom"?this.barConfig.composer.bottom:this.barConfig.composer.top;e==="composerBottom"&&(this.composerBottomRow=t);let i=e==="btw"?this.btwContext():this.barContext(),a=e==="composerBottom"?zP(i):null,d=a!==null?[a]:Yu(e,o.right,i),c=tv(s,Yu(e,o.left,i),d,r);e==="composerBottom"&&(this.hintZoneStart=this.hintZoneStartFor(s,o,i,a,c));let l=this.terminalFocused?this.hoveredBarHit:null,u=`${e}|${s}|${l??""}|${c.signature}`;this.paintRow(t,u,()=>{for(let f of c.chunks){let p=f.id!==void 0&&f.id===l?"hint-hover":f.token;B(this.term,p,f.text)}}),this.barHits.set(t,c.hits)}hintZoneStartFor(e,t,r,s,o){if(s!==null)return null;if(r.hintsRevealed)return o.rightStart;let i={...r,hintsRevealed:!0};return tv(e,Yu("composerBottom",t.left,i),Yu("composerBottom",t.right,i),ov.composerBottom).rightStart}barHitAt(e,t){let r=this.barHits.get(t);return r===void 0?null:r.find(s=>e>=s.start&&e<=s.end)??null}bannerHitAt(e,t){let r=this.barHitAt(e,t);if(r===null)return null;let s=r.id.slice(r.id.indexOf(":")+1);return zk.some(o=>o.id===s)?s:null}stepFormCursor(e){let t=this.formPrompt;if(t===null||t.rows.length===0)return;let r=Math.max(0,Math.min(t.rows.length-1,t.selectedIndex+e));r!==t.selectedIndex&&this.onFormClick?.({kind:"row",row:r,select:!0})}isFormCell(e){let t=this.formRegion;return this.formPrompt!==null&&t!==null&&e>=t.top&&e<=t.bottom}formHitAt(e,t){if(!this.isFormCell(t))return null;for(let s of this.formHintHits)if(s.row===t&&e>=s.start&&e<=s.end)return{kind:"hint",action:s.action};let r=this.formRowHits.get(t);if(r===void 0)return null;if(r.field!==void 0&&e>=r.field.startCol){let{slice:s,sliceStart:o,startCol:i}=r.field,a=o,d=i;for(let c of s){let l=d+Et(c);if(e<l)break;d=l,a+=c.length}return{kind:"row",row:r.row,caretOffset:a}}return{kind:"row",row:r.row}}handleFormPress(e){return this.isFormCell(e.y)?(this.formPressHit=this.formHitAt(e.x,e.y),!0):(this.formPressHit=null,!1)}handleFormRelease(e){let t=this.formPressHit;if(this.formPressHit=null,t===null||e===null||!this.isFormCell(e.y))return t!==null;let r=this.formHitAt(e.x,e.y);return r===null||r.kind!==t.kind||r.kind==="row"&&t.kind==="row"&&r.row!==t.row||r.kind==="hint"&&t.kind==="hint"&&r.action!==t.action||this.onFormClick?.(r),!0}handleBarPress(e){let t=this.barHitAt(e.x,e.y);if(t===null)return this.barPressHit=null,!1;let r=Date.now(),s=this.lastBarClick;return s!==null&&s.id===t.id&&r-s.t<=Xc&&t.doubleAction!=="none"?(this.lastBarClick=null,this.barPressHit=null,this.dispatchBarAction(t.doubleAction,t.value),!0):(this.lastBarClick={id:t.id,t:r},this.barPressHit=t,!0)}handleBarRelease(e){let t=this.barPressHit;if(this.barPressHit=null,t===null||e===null)return!1;let r=this.barHitAt(e.x,e.y);return r===null||r.id!==t.id?!1:(r.action==="none"||this.dispatchBarAction(r.action,r.value),!0)}dispatchBarAction(e,t){if(e!=="none"){if(e==="copy"){Vc(t,{target:this.selectionClipboard}).then(r=>{this.notify(r.ok?`copied ${t}`:`clipboard copy failed: ${r.reason}`)},r=>{this.notify(`clipboard copy failed: ${r.message}`)});return}if(e==="open-session"){this.onHydraLinkClick?.(t);return}if(e==="open"){this.tryOpenPathString(t)||this.notify(this.hasOpenFileCommand()?`can't open ${t}`:"no tui.openFileCommand configured");return}this.onBarAction?.(e,t)}}drawScrollback(){let e=this.contentWidth(),t=this.sidebarReserved()>0&&!this.sidebarOverlay(),r=this.sidebarBodyWidth()>0,s=1,o=this.scrollbackVisibleRows();if(o<=0)return;let{rows:i,exhausted:a}=this.wrapTail(e,o+this.scrollOffset);if(a){let g=Math.max(0,i.length-o);this.scrollOffset>g&&(this.scrollOffset=g)}let d=i.length-this.scrollOffset,c=Math.max(0,d-o),l=i.slice(c,d),u=Math.max(0,o-l.length),f=this.currentMatchInfo(),p=f?.length??0;this.selectionRenderBounds=this.selectionLineBounds()?.byId??null;let m=-1,h=-1;if(this.hoveredBlockKey!==null||this.hoveredRunKeys!==null)for(let g=0;g<l.length;g++){let w=l[g]?.blockKey;w===void 0||!(w===this.hoveredBlockKey||this.hoveredRunKeys!==null&&this.hoveredRunKeys.has(w))||(m===-1&&(m=g),h=g)}for(let g=0;g<o;g++){let w=s+g,b=g-u,k=b>=0?l[b]:void 0,S=this.activeMatchCol(k,f),I=k?this.selectionRangeForChunk(k):null,x=k!==void 0&&k.blockKey!==void 0&&(k.blockKey===this.hoveredBlockKey||this.hoveredRunKeys!==null&&this.hoveredRunKeys.has(k.blockKey)),A=k!==void 0&&k.blockKey===void 0&&m!==-1&&b>=m&&b<=h,_=x||A,P=this.terminalFocused&&_&&(this.hoveredSubKey===null||(k.hoverSubKey??null)===this.hoveredSubKey),$=Nv("sb",e,k,this.scrollbackHighlight,S,I)+(P?"|H":"");this.paintRow(w,$,()=>{k?this.writeFormattedLine(k,e,S,p,I,P,t,k.linkSpans??null):t&&this.term(" ".repeat(e))},t?{erase:!1}:void 0)&&r&&this.painter.invalidate("sidebar",w)}if(this.onBlockVisible&&this.pendingVisibleKeys.size>0){let g=new Set;for(let b of l)b.blockKey!==void 0&&g.add(b.blockKey);let w=[];for(let b of this.pendingVisibleKeys)g.has(b)&&w.push(b);for(let b of w)this.pendingVisibleKeys.delete(b),this.onBlockVisible(b)}}drawSidebar(e,t){let r=this.sidebarBodyWidth();if(r<=0||t<=0){this.sidebarOverflowRows=0;return}let s=this.sidebarColumnStart(),o={metrics:{cellWidth:Et,truncate:mn},width:r,border:this.sidebarBorder,pages:this.sidebarPages,collapsed:this.sidebarCollapsed,maxRows:t},i={...this.sidebarSnapshot,now:Date.now()},a=this.sidebarRenderer.render(i,o);this.sidebarOverflowRows=Math.max(0,a.length-t),this.sidebarScrollOffset>this.sidebarOverflowRows&&(this.sidebarScrollOffset=this.sidebarOverflowRows);let d=this.sidebarScrollOffset;this.sidebarRowPaths.clear(),this.sidebarRowDoubleActions.clear(),this.sidebarRowActions.clear(),this.sidebarRowLinks.clear();let c=s+nf;for(let l=0;l<t;l++){let u=e+l,f=l+d,p=a[f];p?.openPath!==void 0&&this.sidebarRowPaths.set(u,p.openPath),p?.doubleAction!==void 0&&this.sidebarRowDoubleActions.set(u,p.doubleAction),p?.links!==void 0&&p.links.length>0&&this.sidebarRowLinks.set(u,p.links.map(w=>({start:c+w.start,end:c+w.end,url:w.url}))),p?.actions!==void 0&&p.actions.length>0&&this.sidebarRowActions.set(u,p.actions.map(w=>({start:c+w.start-1,end:c+w.end-1,..."page"in w?{gadget:w.page.gadget,index:w.page.index}:{gadget:w.collapse.gadget,collapse:!0}})));let m=l===0&&d>0?"\u25B2":l===t-1&&d<this.sidebarOverflowRows?"\u25BC":p?.gutter??" ",h=(()=>{let w=[];if(p?.openPath!==void 0&&p.openPath.startsWith("/")&&p.openSpan!==void 0&&w.push({...p.openSpan,url:Kb(p.openPath)}),p?.links!==void 0){let b=this.linkSpansForWindow(p.body,p.links,0,p.body.length,0);b!==null&&w.push(...b)}return w.length>0?w:null})(),g=Nv("sbar",r,p,null,null,null)+`|${m}|${h===null?"":h.map(w=>`${w.start}:${w.end}:${w.url}`).join(",")}`;this.paintRow(u,g,()=>{this.term(" ".repeat(Math.max(0,nf-1))),m===" "?this.term(" "):Zs(this.term,m,"sidebar-rule",!1),p?this.writeFormattedLine(p,r,null,0,null,!1,!0,h):this.term(" ".repeat(r))},{region:"sidebar",column:s})}}scrollSidebarBy(e){if(this.sidebarOverflowRows<=0)return!1;let t=Math.max(0,Math.min(this.sidebarOverflowRows,this.sidebarScrollOffset-e));return t===this.sidebarScrollOffset||(this.sidebarScrollOffset=t,this.repaintNow()),!0}sidebarPageState(){return this.sidebarPages}sidebarScrollState(){return{offset:this.sidebarScrollOffset,overflow:this.sidebarOverflowRows}}isSidebarCell(e,t){let r=this.sidebarColumnStart();return r===0?!1:e>=r&&e<=(this.term.width||0)&&t>=1&&t<=this.scrollbackVisibleRows()}handleSidebarPress(e){if(e===null||!this.isSidebarCell(e.x,e.y))return!1;for(let o of this.sidebarRowActions.get(e.y)??[])if(!(e.x<o.start||e.x>o.end))return o.collapse===!0?this.toggleSidebarGadgetCollapsed(o.gadget):this.sidebarPages={...this.sidebarPages,[o.gadget]:o.index??0},this.lastSidebarClick=null,this.repaintNow(),!0;let t=Date.now(),r=this.lastSidebarClick;if(r!==null&&t-r.t<=Xc&&e.y===r.y){this.lastSidebarClick=null;let o=this.sidebarRowDoubleActions.get(e.y);if(o!==void 0)return this.dispatchBarAction(o.action,o.value),!0;let a=this.sidebarRowLinks.get(e.y)?.find(c=>e.x>=c.start&&e.x<c.end);if(a!==void 0)return this.dispatchLinkUrl(a.url),!0;let d=this.sidebarRowPaths.get(e.y);return d!==void 0&&!this.dispatchLinkUrl(d)&&this.notify(this.hasOpenFileCommand()?`can't open ${d}`:"no tui.openFileCommand configured"),!0}return this.lastSidebarClick={x:e.x,y:e.y,t},!0}hasOpenFileCommand(){return this.openFileCommand!==null}notifyWhenVisible(e){this.onBlockVisible&&(this.pendingVisibleKeys.add(e),this.scheduleRepaint())}queuedRows(){return Math.min($v,this.queuedTexts.length)}chipRows(){return Math.min(Fv,this.attachments.length)}setAttachments(e){this.attachments.length===e.length&&this.attachments.every((t,r)=>t===e[r])||(this.attachments=[...e],this.repaint())}completionRows(){return this.permissionPrompt||this.formPrompt||this.confirmPrompt||this.helpPrompt?0:Math.min(Ov,this.completions.length)}drawCompletionZone(){let e=this.completionRows();if(e===0)return;let t=this.term.width,r=this.promptRows(),s=this.term.height-r-_t-Ut-Ht,o=this.queuedRows(),i=this.chipRows(),d=s-1-o-i-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 u=d+l,f=this.completions[l],p=l===e-1&&this.completions.length>Ov,m=this.completions.length-Ov+1,h=f?p?`comp|${t}|overflow|${m}`:`comp|${t}|${c}|${f.name}|${f.description??""}`:`comp|${t}|empty`;this.paintRow(u,h,()=>{if(!f)return;if(p){B(this.term,"modal-hint",` + ${m} more match(es)`);return}let g=f.name.padEnd(c),w=f.description??"",b=t-g.length-4,k=b>0?mn(w,b):"";this.term.noFormat(" "),B(this.term,"completion-name",g),k.length>0&&(this.term.noFormat(" "),B(this.term,"completion-desc",k))})}}drawAttachmentChipZone(){let e=this.chipRows();if(e===0)return;let t=this.term.width,r=this.promptRows(),i=this.term.height-r-_t-Ut-Ht-1-e+1;for(let a=0;a<e;a++){let d=i+a,c=a===e-1&&this.attachments.length>Fv,l=this.attachments.length-Fv,u=this.attachments[a],f=u?`${u.name??"image"} \xB7 ${Mr(u.sizeBytes)}`:"",p=c?`chip|${t}|overflow|${l}`:u?`chip|${t}|${f}`:`chip|${t}|empty`;this.paintRow(d,p,()=>{if(c){B(this.term,"modal-hint",` \u{1F4CE} + ${l+1} more attached`);return}u&&(this.term.noFormat(" "),B(this.term,"attachment",`\u{1F4CE} ${f}`))})}}drawQueuedZone(){let e=this.queuedRows();if(e===0)return;let t=this.term.width,r=this.promptRows(),s=this.term.height-r-_t-Ut-Ht,o=this.chipRows(),a=s-1-o-e+1,d=this.dispatcher.state().queueIndex;for(let c=0;c<e;c++){let l=a+c,u=this.queuedTexts[c],f=c===e-1&&this.queuedTexts.length>$v,p=this.queuedTexts.length-$v,m=u===void 0?"":f?`+ ${p+1} more queued`:mn(HK(u),t-4),h=!f&&c===d,g=u===void 0?`queued|${t}|empty`:`queued|${t}|${h?"edit":f?"ovf":"row"}|${m}`;this.paintRow(l,g,()=>{if(u===void 0)return;let w=`\u23F3 ${m}`,b=w+" ".repeat(Math.max(0,t-1-w.length));h?B(this.term,"queue-cursor","\u25B8"):B(this.term,"queue-blank"," "),B(this.term,"queue-row",b)})}}promptVisualLayout(){if(this.permissionPrompt||this.formPrompt||this.confirmPrompt||this.compactionPrompt||this.helpPrompt||this.scrollbackSearch||this.readonly)return null;let e=this.term.width,t=Math.max(1,e-2),r=this.dispatcher.state(),s=ms(r.buffer,t),o=eo(s,r,ig);return{top:this.term.height-o.rendered-Ht-Ut-_t+1,layout:o,visualRows:s}}resolveCellToPromptOffset(e,t){let r=this.promptVisualLayout();if(r===null)return null;let{top:s,layout:o,visualRows:i}=r,a=t-s;if(a<0||a>=o.rendered||e<1||e>this.term.width)return null;let d=i[o.windowStart+a];if(!d)return null;let l=Math.max(0,Math.min(d.endCol-d.startCol,e-1-2));return{row:d.bufferIdx,col:d.startCol+l}}setPromptSelection(e,t){let r=e.row<t.row||e.row===t.row&&e.col<=t.col,s=r?e:t,o=r?t:e;if(s.row===o.row&&s.col===o.col){this.clearPromptSelection();return}let i={startRow:s.row,startCol:s.col,endRow:o.row,endCol:o.col},a=this.promptSelection;a&&a.startRow===i.startRow&&a.startCol===i.startCol&&a.endRow===i.endRow&&a.endCol===i.endCol||(this.promptSelection=i,this.syncedPartialRepaint(()=>this.drawPrompt()))}clearPromptSelection(){this.promptSelection!==null&&(this.promptSelection=null,this.syncedPartialRepaint(()=>this.drawPrompt()))}getPromptSelectionText(){if(this.promptSelection===null)return"";let{startRow:e,startCol:t,endRow:r,endCol:s}=this.promptSelection,o=this.dispatcher.state().buffer;if(e===r)return(o[e]??"").slice(t,s);let i=[(o[e]??"").slice(t)];for(let a=e+1;a<r;a++)i.push(o[a]??"");return i.push((o[r]??"").slice(0,s)),i.join(`
261
261
  `)}promptWordBoundsAt(e){let t=this.dispatcher.state().buffer[e.row]??"";if(t.length===0)return null;let r=Math.max(0,Math.min(t.length-1,e.col));if(!Ha.test(t[r]))return null;let s=r;for(;s>0&&Ha.test(t[s-1]);)s--;let o=r+1;for(;o<t.length&&Ha.test(t[o]);)o++;return{start:s,end:o}}selectPromptWholeLine(e){let t=this.dispatcher.state().buffer[e]??"";this.setPromptSelection({row:e,col:0},{row:e,col:t.length})}extendPromptWordSelectionTo(e){let t=this.promptSelectionAnchorWordBounds;if(t===null)return;let r=e.row<t.row||e.row===t.row&&e.col<t.start,s=e.row>t.row||e.row===t.row&&e.col>t.end,o={row:t.row,col:t.start},i={row:t.row,col:t.end};if(r){let a=this.promptWordBoundsAt(e);o=a!==null?{row:e.row,col:a.start}:e}else if(s){let a=this.promptWordBoundsAt(e);i=a!==null?{row:e.row,col:a.end}:e}this.setPromptSelection(o,i)}extendPromptLineSelectionTo(e){let t=this.promptSelectionAnchorLineRow;if(t===null)return;let r=Math.min(t,e.row),s=Math.max(t,e.row),o=this.dispatcher.state().buffer[s]??"";this.setPromptSelection({row:r,col:0},{row:s,col:o.length})}handlePromptSelectionPress(e){if(!this.inAppSelectionEnabled)return!1;let t=this.resolveCellToPromptOffset(e.x,e.y);if(t===null)return!1;this.promptSelectionAnchor=t,this.promptSelectionDragStarted=!1,this.promptDoubleClickPending=!1,this.promptPendingClickCount=1,this.promptSelectionGranularity="char",this.promptSelectionAnchorWordBounds=null,this.promptSelectionAnchorLineRow=null,this.clearPromptSelection();let r=Date.now(),s=this.promptLastLeftClick,o=s!==null&&r-s.t<=Xc&&Math.abs(e.x-s.x)<=Zc&&Math.abs(e.y-s.y)<=Zc&&s.row!==null&&s.row===t.row;if(o&&s.count===2&&e.x===s.x&&e.y===s.y)return this.promptPendingClickCount=3,this.selectPromptWholeLine(t.row),this.promptSelectionGranularity="line",this.promptSelectionAnchorLineRow=t.row,this.promptDoubleClickPending=!0,!0;if(o&&s.count===1){this.promptPendingClickCount=2;let d=this.promptWordBoundsAt(t);d!==null&&(this.setPromptSelection({row:t.row,col:d.start},{row:t.row,col:d.end}),this.promptDoubleClickPending=!0,this.promptSelectionGranularity="word",this.promptSelectionAnchorWordBounds={row:t.row,start:d.start,end:d.end})}return!0}handlePromptSelectionDrag(e){if(this.promptSelectionAnchor===null)return;let t=this.promptVisualLayout();if(t===null)return;let r=Math.max(1,Math.min(this.term.width,e.x)),s=Math.max(t.top,Math.min(t.top+t.layout.rendered-1,e.y)),o=this.resolveCellToPromptOffset(r,s);o!==null&&(this.promptSelectionDragStarted=!0,this.promptSelectionGranularity==="word"?this.extendPromptWordSelectionTo(o):this.promptSelectionGranularity==="line"?this.extendPromptLineSelectionTo(o):this.setPromptSelection(this.promptSelectionAnchor,o))}handlePromptSelectionRelease(e){let t=this.promptSelectionDragStarted,r=this.promptDoubleClickPending;if(this.promptSelectionAnchor=null,this.promptSelectionDragStarted=!1,this.promptDoubleClickPending=!1,e!==null){let s=this.resolveCellToPromptOffset(e.x,e.y);this.promptLastLeftClick={x:e.x,y:e.y,t:Date.now(),count:this.promptPendingClickCount,row:s?.row??null}}if(this.promptPendingClickCount=1,t||r){this.finalizePromptSelection();return}this.clearPromptSelection()}finalizePromptSelection(){let e=this.getPromptSelectionText();e.length!==0&&Vc(e,{target:this.selectionClipboard}).then(t=>{if(t.ok){let r=e.length;this.notify(`copied ${r} char${r===1?"":"s"} to clipboard`)}else this.notify(`clipboard copy failed: ${t.reason}`)},t=>{this.notify(`clipboard copy failed: ${t.message}`)})}drawPrompt(){if((this.permissionPrompt||this.formPrompt||this.confirmPrompt)&&(this.compactionRegion=null),(this.permissionPrompt||this.formPrompt||this.confirmPrompt||this.compactionPrompt)&&(this.helpRegion=null),this.permissionPrompt){this.drawPermissionPrompt();return}if(this.formPrompt){this.drawFormPrompt();return}if(this.confirmPrompt){this.drawConfirmPrompt();return}if(this.compactionPrompt){this.drawCompactionPrompt();return}if(this.helpPrompt){this.drawHelpPrompt();return}if(this.readonly)return;let e=this.term.width,t=Math.max(1,e-2),r=this.dispatcher.state(),s=ms(r.buffer,t),o=eo(s,r,ig),i=this.term.height-o.rendered-Ht-Ut-_t+1,a=!1;for(let d=0;d<o.rendered;d++){let c=s[o.windowStart+d],l=i+d,u="wrap",f="";c&&(c.bufferIdx===0&&c.startCol===0?u="first":c.startCol===0&&(u="newline"),f=(r.buffer[c.bufferIdx]??"").slice(c.startCol,c.endCol));let p=-1,m=-1;if(c&&this.promptSelection!==null){let g=this.promptSelection;if(c.bufferIdx>=g.startRow&&c.bufferIdx<=g.endRow){let w=c.bufferIdx===g.startRow?g.startCol:c.startCol,b=c.bufferIdx===g.endRow?g.endCol:c.endCol,k=Math.max(w,c.startCol),S=Math.min(b,c.endCol);S>k&&(p=k-c.startCol,m=S-c.startCol)}}let h=c?`prompt|${this.term.width}|${u}|${f}|${p}:${m}`:`prompt|${this.term.width}|empty`;this.paintRow(l,h,()=>{c&&(u==="first"?a?B(this.term,"composer-inactive","> "):B(this.term,"composer-gutter","> "):u==="newline"?B(this.term,"composer-continuation","\xB7 "):this.term(" "),a?B(this.term,"composer-inactive",f):p>=0&&m>p?(p>0&&B(this.term,"content",f.slice(0,p)),B(this.term,"selection-highlight",f.slice(p,m)),m<f.length&&B(this.term,"content",f.slice(m))):B(this.term,"content",f))})}}drawConfirmPrompt(){let e=this.confirmPrompt;if(!e)return;let t=this.term.width,r=this.term.height-Lv-Ht-Ut-_t+1;this.paintRow(r,`confirm|q|${t}|${e.question}`,()=>{B(this.term,"prompt-text",` ? ${mn(e.question,t-4)}`)}),this.paintRow(r+1,`confirm|h|${t}|${e.hint}`,()=>{B(this.term,"modal-hint",` ${mn(e.hint,t-2)}`)})}drawCompactionPrompt(){let e=this.compactionPrompt;if(!e)return;let t=this.term.width,r=this.compactionRows(),s=this.term.height-r-Ht-Ut-_t+1,o=s;this.compactionRowHits.clear(),this.compactionHintHits=[],this.compactionRegion={top:s,bottom:s+r-1};let i=(c,l)=>{o>=s+r||(this.paintRow(o,c,l),o+=1)};i(`cpct|msg|${t}|${e.message}`,()=>{B(this.term,"prompt-text",` ${mn(e.message,t-2)}`)}),i(`cpct|q|${t}`,()=>{B(this.term,"content"," Compact now to reduce future per-turn token cost?")});for(let c=0;c<e.options.length&&!(o>=s+r-1);c++){let l=e.options[c];if(!l)continue;let u=c===e.selectedIndex,p=` ${u?"\u276F":" "} ${c+1}. ${mn(l.label,t-8)}`;this.compactionRowHits.set(o,c),i(`cpct|o|${t}|${c}|${u?"1":"0"}|${l.label}`,()=>{u?B(this.term,"modal-option-selected",p):B(this.term,"modal-option",p)})}let a=Hv(fK,t),d=o;for(let c of a.spans)(c.action==="commit"||c.action==="cancel")&&this.compactionHintHits.push({row:d,start:c.start,end:c.end,action:c.action});i(`cpct|hint|${t}|${a.text}`,()=>{B(this.term,"modal-hint",` ${a.text}`)})}isCompactionCell(e){let t=this.compactionRegion;return this.compactionPrompt!==null&&t!==null&&e>=t.top&&e<=t.bottom}compactionHitAt(e,t){if(!this.isCompactionCell(t))return null;for(let s of this.compactionHintHits)if(s.row===t&&e>=s.start&&e<=s.end)return{kind:"hint",action:s.action};let r=this.compactionRowHits.get(t);return r===void 0?null:{kind:"option",index:r}}stepCompactionCursor(e){let t=this.compactionPrompt;if(t===null||t.options.length===0)return;let r=Math.max(0,Math.min(t.options.length-1,t.selectedIndex+e));r!==t.selectedIndex&&this.onCompactionClick?.({kind:"option",index:r,select:!0})}handleCompactionPress(e){return this.isCompactionCell(e.y)?(this.compactionPressHit=this.compactionHitAt(e.x,e.y),!0):(this.compactionPressHit=null,!1)}handleCompactionRelease(e){let t=this.compactionPressHit;if(this.compactionPressHit=null,t===null||e===null||!this.isCompactionCell(e.y))return t!==null;let r=this.compactionHitAt(e.x,e.y);return r===null||r.kind!==t.kind||r.kind==="option"&&t.kind==="option"&&r.index!==t.index||r.kind==="hint"&&t.kind==="hint"&&r.action!==t.action?!0:Date.now()-this.compactionArmedAt<JM?(this.notify("compaction prompt just appeared, click again to confirm"),!0):(this.onCompactionClick?.(r),!0)}compactionRows(){return this.compactionPrompt?3+this.compactionPrompt.options.length:0}drawHelpPrompt(){let e=this.helpPrompt;if(!e)return;let t=this.term.width,r=this.helpRows(),s=this.term.height-r-Ht-Ut-_t+1,o=s;this.helpRegion={top:s,bottom:s+r-1};let i=(d,c)=>{o>=s+r||(this.paintRow(o,d,c),o+=1)};i(`help|t|${t}|${e.title}`,()=>{B(this.term,"prompt-text",` \u2753 ${mn(e.title,t-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(o>=s+r-1)break;if(d===null){i(`help|sep|${t}|${o}`,()=>{});continue}let[c,l]=d,u=c.padEnd(a);i(`help|e|${t}|${c}|${l}`,()=>{this.term(" "),B(this.term,"modal-key",u),B(this.term,"content",` ${mn(l,t-2-a-1)}`)})}i(`help|hint|${t}|${e.hint}`,()=>{B(this.term,"modal-hint",` ${mn(e.hint,t-2)}`)})}helpRows(){return this.helpPrompt?Math.min(hK,2+this.helpPrompt.entries.length):0}isHelpCell(e){let t=this.helpRegion;return this.helpPrompt!==null&&t!==null&&e>=t.top&&e<=t.bottom}handleHelpPress(e){return this.isHelpCell(e.y)?(this.helpPressed=!0,!0):(this.helpPressed=!1,!1)}handleHelpRelease(e){let t=this.helpPressed;return this.helpPressed=!1,t?(e!==null&&this.isHelpCell(e.y)&&this.onHelpClick?.(),!0):!1}drawPermissionPrompt(){let e=this.permissionPrompt;if(!e)return;let t=this.term.width,r=this.permissionRows(),s=this.term.height-r-Ht-Ut-_t+1,o=s;this.permissionRowHits.clear(),this.permissionHintHits=[],this.permissionRegion={top:s,bottom:s+r-1};let i=(l,u)=>{o>=s+r||(this.paintRow(o,l,u),o+=1)};i(`perm|t|${t}|${e.title}`,()=>{B(this.term,"prompt-text",` \u{1F512} ${mn(e.title,t-5)}`)});let a=e.detail&&e.detail.length>0?e.detail:"This action requires approval";i(`perm|sub|${t}|${a}`,()=>{B(this.term,"modal-hint",` ${mn(a,t-2)}`)}),i(`perm|q|${t}`,()=>{B(this.term,"content"," Do you want to proceed?")});for(let l=0;l<e.options.length&&!(o>=s+r-1);l++){let u=e.options[l];if(!u)continue;let f=l===e.selectedIndex,m=` ${f?"\u276F":" "} ${l+1}. ${mn(u.label,t-8)}`;this.permissionRowHits.set(o,l),i(`perm|o|${t}|${l}|${f?"1":"0"}|${u.label}`,()=>{f?B(this.term,"modal-option-selected",m):B(this.term,"modal-option",m)})}let d=Hv(uK,t),c=o;for(let l of d.spans)(l.action==="commit"||l.action==="cancel")&&this.permissionHintHits.push({row:c,start:l.start,end:l.end,action:l.action});i(`perm|hint|${t}|${d.text}`,()=>{B(this.term,"modal-hint",` ${d.text}`)})}isPermissionCell(e){let t=this.permissionRegion;return this.permissionPrompt!==null&&t!==null&&e>=t.top&&e<=t.bottom}permissionHitAt(e,t){if(!this.isPermissionCell(t))return null;for(let s of this.permissionHintHits)if(s.row===t&&e>=s.start&&e<=s.end)return{kind:"hint",action:s.action};let r=this.permissionRowHits.get(t);return r===void 0?null:{kind:"option",index:r}}handlePermissionPress(e){return this.isPermissionCell(e.y)?(this.permissionPressHit=this.permissionHitAt(e.x,e.y),!0):(this.permissionPressHit=null,!1)}handlePermissionRelease(e){let t=this.permissionPressHit;if(this.permissionPressHit=null,t===null||e===null||!this.isPermissionCell(e.y))return t!==null;let r=this.permissionHitAt(e.x,e.y);return r===null||r.kind!==t.kind||r.kind==="option"&&t.kind==="option"&&r.index!==t.index||r.kind==="hint"&&t.kind==="hint"&&r.action!==t.action?!0:Date.now()-this.permissionArmedAt<JM?(this.notify("permission prompt just appeared, click again to confirm"),!0):(this.onPermissionClick?.(r),!0)}computeBannerPrefixText(){let e=[];return this.banner.queued>0&&e.push(`${this.banner.queued} queued`),this.scrollOffset>0&&e.push(`\u2191 ${this.scrollOffset}`),e.length>0?e.join(" \xB7 ")+" \xB7 ":""}drawBanner(){let e=this.term.height,t=this.promptRows(),r=e-t-Ht-Ut-_t;this.drawBar("composerTop",r),this.drawBar("composerBottom",e-_t)}drawBars(){this.drawBanner(),this.drawBar("sessionbar",this.term.height)}placeCursor(){if(!this.started)return;if(this.permissionPrompt){let l=this.permissionRows(),f=this.term.height-l-Ht-Ut-_t+1+3+this.permissionPrompt.selectedIndex,p=this.term.height-Ht-Ut-_t;this.term.moveTo(2,Math.min(f,p));return}if(this.formPrompt){let l=this.formPrompt,u=this.formWindowSize(),f=this.formWindowTop,p=this.formTop()+1+(l.selectedIndex-f),m=this.term.height-Ht-Ut-_t,h=Math.min(p,m),w=QM(l,this.term.width,f,u).find(b=>b.selected);if(w?.kind!=="text"){this.term.hideCursor(!0);return}this.term.hideCursor(!1),this.term.moveTo(Math.min(w.caretCol,this.term.width),h);return}if(this.confirmPrompt){let l=this.term.height-Lv-Ht-Ut-_t+1;this.term.moveTo(2,l);return}if(this.compactionPrompt){let l=this.compactionRows(),f=this.term.height-l-Ht-Ut-_t+1+2+this.compactionPrompt.selectedIndex,p=this.term.height-Ht-Ut-_t;this.term.moveTo(2,Math.min(f,p));return}if(this.helpPrompt){let l=this.helpRows(),u=this.term.height-l-Ht-Ut-_t+1;this.term.moveTo(2,u);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,t=Math.max(1,e-2),r=this.dispatcher.state(),s=ms(r.buffer,t),o=eo(s,r,ig),a=this.term.height-o.rendered-Ht-Ut-_t+1+Math.max(0,o.cursorVisualRow-o.windowStart),d=o.cursorVisualCol+3,c=this.term.height-Ht-Ut-_t;this.term.moveTo(Math.min(d,this.term.width),Math.min(a,c))}promptRows(){if(this.permissionPrompt)return this.permissionRows();if(this.formPrompt)return this.formRows();if(this.confirmPrompt)return Lv;if(this.compactionPrompt)return this.compactionRows();if(this.helpPrompt)return this.helpRows();if(this.readonly)return 0;let e=this.term.width,t=Math.max(1,e-2),r=this.dispatcher.state(),s=ms(r.buffer,t);return Math.min(ig,Math.max(1,s.length))}permissionRows(){return this.permissionPrompt?Math.min(cK,4+this.permissionPrompt.options.length):0}formRows(){return this.formPrompt?Math.min(Math.max(pK,this.formPrompt.maxRows??lK),2+this.formPrompt.rows.length):0}formWindowSize(){return Math.max(1,this.formRows()-2)}formTop(){return this.term.height-this.formRows()-Ht-Ut-_t+1}drawFormPrompt(){let e=this.formPrompt;if(!e)return;let t=this.term.width,r=this.formRows(),s=this.formTop(),o=this.formWindowSize(),i=`${e.title}|${e.rows.length}|${o}`;i!==this.formWindowKey?(this.formWindowKey=i,this.formWindowTop=FK(e.rows.length,e.selectedIndex,o)):this.formWindowTop=LK(this.formWindowTop,e.rows.length,e.selectedIndex,o);let a=this.formWindowTop;this.clearFormHits(),this.formRegion={top:s,bottom:s+r-1};let d=s,c=(h,g)=>{d>=s+r||(this.paintRow(d,h,g),d+=1)},l=e.rows.length>o?` (${e.selectedIndex+1}/${e.rows.length})`:"";c(`form|t|${t}|${e.title}|${l}`,()=>{B(this.term,"prompt-text",` \u2699 ${mn(`${e.title}${l}`,t-5)}`)});let u=QM(e,t,a,o);for(let h of u){if(d>=s+r-1)break;this.formRowHits.set(d,{row:h.index,...h.kind==="text"?{field:{startCol:1+Et(h.prefix),slice:h.field,sliceStart:h.fieldStart}}:{}}),c(h.sig,()=>{if(h.kind==="text"){B(this.term,h.selected?"modal-option-selected":"modal-option",h.prefix),B(this.term,"content",h.field);return}B(this.term,h.selected?"modal-option-selected":"modal-option",h.body)})}let f=e.hints??NK,p=d,m=Hv(f,t);for(let h of m.spans)this.formHintHits.push({row:p,...h});c(`form|hint|${t}|${m.text}`,()=>{B(this.term,"modal-hint",` ${m.text}`)})}btwOverlayRows(){if(!this.btwOverlayOpen||this.btwOverlayLines.length===0)return 0;let e=Math.max(0,this.btwOverlayMaxHeight-1),t=this.term.width,r=this.wrapBtwWindow(t,e,0).rows.length;return Math.min(this.btwOverlayMaxHeight,1+r)}wrapBtwWindow(e,t,r){let s=this.btwOverlayLines.length;if(t<=0||s===0)return{rows:[],offset:0,more:!1};if(e<=4){let f=Math.min(Math.max(0,r),Math.max(0,s-t)),p=s-f,m=Math.max(0,p-t);return{rows:this.btwOverlayLines.slice(m,p),offset:f,more:m>0}}let o=Math.max(0,r),i=[],a=0;for(let f=s-1;f>=0;f--){let p=this.btwOverlayLines[f],m=this.wrapOne(p,e);if(i.push(m),a+=m.length,a>t+o)break}let d=[];for(let f=i.length-1;f>=0;f--)d.push(...i[f]);let c=Math.min(o,Math.max(0,d.length-t)),l=d.length-c,u=Math.max(0,l-t);return{rows:d.slice(u,l),offset:c,more:u>0}}scrollBtwOverlayBy(e){let t=this.btwOverlayRegion;if(!this.btwOverlayOpen||t===null||t.contentRows<=0)return!1;let r=Math.max(0,this.btwOverlayScroll+e),s=this.wrapBtwWindow(this.term.width,t.contentRows,r);return!s.more&&s.offset===0?!1:(s.offset===this.btwOverlayScroll||(this.btwOverlayScroll=s.offset,this.repaintNow()),!0)}isBtwOverlayCell(e){let t=this.btwOverlayRegion;return t!==null&&e>=t.top&&e<=t.bottom}btwOverlayScrollState(){let t=this.btwOverlayRegion?.contentRows??0;return{offset:this.btwOverlayScroll,more:this.wrapBtwWindow(this.term.width,t,this.btwOverlayScroll).more}}drawBtwOverlay(){if(!this.btwOverlayOpen){this.btwOverlayRegion=null;return}let e=this.btwOverlayRows();if(e===0){this.btwOverlayRegion=null;return}let t=this.term.width,s=this.term.height-this.promptRows()-Ht-Ut-_t,o=this.chipRows()+this.queuedRows()+this.completionRows(),i=s-1-o,a=i-e+1,d=e-1,c=a;this.btwOverlayRegion={top:c,bottom:i,contentRows:d},this.drawBar("btw",c);let l=this.wrapBtwWindow(t,d,this.btwOverlayScroll);this.btwOverlayScroll=l.offset;let u=l.rows;for(let f=0;f<d;f++){let p=c+1+f,m=u.length-d+f,h=m>=0?u[m]:void 0,g=Nv(`btw|c${f}`,t,h);this.paintRow(p,g,()=>{h?this.writeFormattedLine(h,t):this.term.noFormat(" ".repeat(t))})}}isHiddenLine(e){return e.collapsed===!0||this.hideThoughts&&e.bodyStyle==="thought"}wrapTail(e,t){if(e<=4){let d=[];for(let l of this.lines)this.isHiddenLine(l)||d.push(l);let c=Math.min(t,d.length);return{rows:d.slice(d.length-c),exhausted:t>=d.length}}if(this.wrapCacheWidth!==e&&(this.wrapCache.clear(),this.wrapCacheWidth=e),t<=0||this.lines.length===0)return{rows:[],exhausted:!0};let r=[],s=0,o=0,i=!1;for(let d=this.lines.length-1;d>=0;d--){let c=this.lines[d];if(this.isHiddenLine(c)){d===0&&(i=!0);continue}let l=this.wrapOne(c,e);if(r.push(l),s+=l.length,o=d,s>=t)break}let a=[];for(let d=r.length-1;d>=0;d--)a.push(...r[d]);return{rows:a,exhausted:o===0||i}}wrapOne(e,t){let r=this.lineIds.get(e);if(r!==void 0){let g=this.wrapCache.get(r);if(g)return g}let s=e.prefix??"",o=Et(s),i=Math.max(1,t-o-1),a=Math.max(0,Math.min(e.hangingIndent??0,i-1)),d=Math.max(1,i-a),c=rf(e.bodyStyle),l=e.ansi?RK(e.body,a>0?d:i):MK(e.body,a>0?d:i,{escapeAware:c}),u=e.ansi?0:e.maxWrapRows??0,f=u>0&&l.length>u;f&&(l.length=u);let p=[],m=0,h=0;for(let g=0;g<l.length;g++){let w=l[g]??"",b=g===0||a===0?w:" ".repeat(a)+w;f&&g===l.length-1&&(b=mn(`${b}\u2026`,i,{escapeAware:c}));let k={prefix:g===0?e.prefix:" ".repeat(o),body:b};if(e.prefixStyle!==void 0&&(k.prefixStyle=e.prefixStyle),e.bodyStyle!==void 0&&(k.bodyStyle=e.bodyStyle),e.blockKey!==void 0&&(k.blockKey=e.blockKey),e.hoverSubKey!==void 0&&(k.hoverSubKey=e.hoverSubKey),e.fillRow&&(k.fillRow=!0),e.ansi&&(k.ansi=!0),r!==void 0&&w.length>0)if(e.ansi){let S=m,I=0;for(let P=0;P<w.length;){let $=$r(w,P);if($){P+=$.text.length,$.width>0&&(I+=1);continue}I+=1,P+=1}let x=I;for(;x>0&&m<e.body.length;){let P=$r(e.body,m);if(P){m+=P.text.length,P.width>0&&(x-=1);continue}m+=1,x-=1}let A=m;if(g===l.length-1){for(;A<e.body.length;){let P=$r(e.body,A);if(!P)break;A+=P.text.length}m=A}let _={sourceLineId:r,sourceColOffset:S,sourceColEnd:A};if(g>0&&a>0&&(_.bodyDisplayShift=a),this.wrapOrigin.set(k,_),e.links!==void 0){let P=this.linkSpansForWindow(e.body,e.links,S,A,g===0||a===0?0:a);P!==null&&(k.linkSpans=P)}}else{let S=e.body.indexOf(w,h),I=S===-1?h:S,x={sourceLineId:r,sourceColOffset:I};if(g>0&&a>0&&(x.bodyDisplayShift=a),this.wrapOrigin.set(k,x),e.links!==void 0){let A=this.linkSpansForWindow(e.body,e.links,I,I+w.length,g===0||a===0?0:a);A!==null&&(k.linkSpans=A)}h=I+w.length}p.push(k)}return r!==void 0&&this.wrapCache.set(r,p),p}writeFormattedLine(e,t,r=null,s=0,o=null,i=!1,a=!1,d=null){e.prefix&&Zs(this.term,e.prefix,e.prefixStyle??e.bodyStyle,i);let c=Math.max(0,t-Et(e.prefix??"")),l=rf(e.bodyStyle),u=e.ansi?e.body:mn(e.body,c,{escapeAware:l}),f=d===null||d.length===0?null:d.map(h=>({start:Math.max(0,Math.min(u.length,h.start)),end:Math.max(0,Math.min(u.length,h.end)),url:h.url})).filter(h=>h.end>h.start).sort((h,g)=>h.start-g.start),p=(h,g,w)=>{if(f===null){w(h,g);return}let b=g+h.length,k=g;for(let S of f){if(S.end<=k||S.start>=b)continue;let I=Math.max(S.start,k),x=Math.min(S.end,b);I>k&&w(h.slice(k-g,I-g),k),process.stdout.write(`\x1B]8;;${S.url}\x1B\\`),w(h.slice(I-g,x-g),I),process.stdout.write("\x1B]8;;\x1B\\"),k=x}k<b&&w(h.slice(k-g),k)},m=(h,g)=>{h.length!==0&&p(h,g,(w,b)=>{if(this.scrollbackHighlight!==null&&!e.ansi){let k=r!==null&&r>=b?r-b:null;CK(this.term,w,e.bodyStyle,this.scrollbackHighlight,k,s,i)}else Zs(this.term,w,e.bodyStyle,i)})};if(o!==null){let h=Math.max(0,Math.min(u.length,o.start)),g=Math.max(h,Math.min(u.length,o.end)),w=rf(e.bodyStyle)||e.ansi===!0;if(m(u.slice(0,h),0),g>h){let k=u.slice(h,g);w&&(k=dg(k)),w?Zs(this.term,k,"selection-highlight",i):p(k,h,S=>{Zs(this.term,S,"selection-highlight",i)})}let b=u.slice(g);if(w&&g>h){let k=PK(u.slice(0,g));k.length>0&&(b=k+b)}m(b,g)}else m(u,0);if(e.fillRow||i||a){let h=e.ansi?ZM(u):Et(l?dg(u):u),g=c-h;if(g>0){let w=o!==null&&o.toEndOfLine?"selection-highlight":e.fillRow||i?e.bodyStyle:void 0;Zs(this.term," ".repeat(g),w,i)}}(e.ansi||e.body.includes("\x1B"))&&this.term.styleReset()}};t_=/[^\x20-\x7e]/,Wv=new Intl.Segmenter(void 0,{granularity:"grapheme"}),n_=!1;NK=[{label:"\u2191/\u2193 choose"},{label:"\u23CE this session",action:"commit"},{label:"s save default",action:"save"},{label:"Esc close",action:"close"}]});function UK(n,e,t=$o){if(e.kind==="cancel")return{kind:"cancel"};if(e.kind==="back")return{kind:"back"};if(e.kind==="enter"){let r=t[n];return r?{kind:"resolve",action:r.key}:{kind:"back"}}if(e.kind==="up")return{kind:"continue",selected:Math.max(0,n-1)};if(e.kind==="down")return{kind:"continue",selected:Math.min(t.length-1,n+1)};if(e.kind==="char"){let r=e.ch.toLowerCase();if(r==="n")return{kind:"continue",selected:Math.min(t.length-1,n+1)};if(r==="p")return{kind:"continue",selected:Math.max(0,n-1)};let s=t.findIndex(o=>o.hotkey.toLowerCase()===r);if(s>=0){let o=t[s];if(o)return{kind:"resolve",action:o.key}}}return{kind:"continue",selected:n}}async function a_(n,e){ls();let t=ot(e.sessionId),r=e.importedFromMachine??"another machine",s=V(e.cwd),o=$o.findIndex(p=>p.key==="view");o<0&&(o=0);let i=null,a=null,d=()=>{let m=7+$o.length*2+2,h=pr(n,{contentHeight:m,title:"Imported session"}),g=h.contentW,w=[{label:"session: ",value:t},{label:"from: ",value:r},{label:"cwd: ",value:s}],b=0;for(let S of w)n.moveTo(h.contentX,h.contentY+b),B(n,"modal-label",` ${S.label}`),B(n,"content",Mt(S.value,g-S.label.length-2)),b++;b++;let k=d_(n,h,b,{intro:"What do you want to do?",choices:$o,selected:o,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 f/v jump \xB7 Esc back"});return i=h,a=k.firstChoiceRow,h},c=()=>{let p=i,m=a;if(!(p===null||m===null))for(let h=0;h<$o.length;h++){let g=$o[h];g&&zv(n,p,m+h*2,g.label,h===o)}},l=p=>{p<0||p>=$o.length||p===o||(o=p,c())},u=null,f=c_({choiceCount:$o.length,layout:()=>i,firstChoiceRow:()=>a,selected:()=>o,select:l,commit:p=>{let m=$o[p];m&&u?.(m.key)},back:()=>u?.("back")});return Vs({term:n,render:d,onKey:(p,m,h,g)=>{let w=WK(p,h);if(!w)return;let b=UK(o,w);if(b.kind==="cancel"){g("cancel");return}if(b.kind==="back"){g("back");return}if(b.kind==="resolve"){g(b.action);return}l(b.selected)},onMouse:(p,m,h)=>{u=h,f(p,m)}})}function d_(n,e,t,r){let s=t;n.moveTo(e.contentX,e.contentY+s),B(n,"content",` ${r.intro}`),s+=2;let o=e.contentY+s;for(let i=0;i<r.choices.length;i++){let a=r.choices[i];a&&(zv(n,e,e.contentY+s,a.label,i===r.selected),s++,n.moveTo(e.contentX,e.contentY+s),B(n,"list-description",` ${a.description}`),s++)}return s++,n.moveTo(e.contentX,e.contentY+s),B(n,"modal-hint",` ${r.footer}`),{firstChoiceRow:o}}function c_(n){let e=null,t=r=>{let s=n.firstChoiceRow();if(s===null)return null;let o=r-s;if(o<0)return null;let i=Math.floor(o/2);return i<n.choiceCount?i:null};return(r,s)=>{if(r==="MOUSE_WHEEL_UP"){n.select(n.selected()-1);return}if(r==="MOUSE_WHEEL_DOWN"){n.select(n.selected()+1);return}if(r==="MOUSE_LEFT_BUTTON_PRESSED"){e={x:s?.x??-1,y:s?.y??-1};return}let o=s?.y;if(typeof o!="number")return;if(r==="MOUSE_MOTION"){let l=t(o);l!==null&&n.select(l);return}if(r!=="MOUSE_LEFT_BUTTON_RELEASED")return;let i=s?.x,a=e!==null&&i===e.x&&o===e.y;if(e=null,!a)return;let d=n.layout();if(d!==null&&typeof i=="number"&&(i<d.x||i>=d.x+d.w||o<d.y||o>=d.y+d.h)){n.back();return}let c=t(o);c!==null&&n.commit(c)}}function zv(n,e,t,r,s){let i=Ma(` ${s?"\u276F":" "} ${r}`,e.contentW);n.moveTo(e.contentX,t),B(n,s?"list-selected":"content",i)}function WK(n,e){return n==="UP"?{kind:"up"}:n==="DOWN"?{kind:"down"}:n==="ENTER"||n==="KP_ENTER"?{kind:"enter"}:n==="ESCAPE"?{kind:"back"}:n==="CTRL_C"||n==="CTRL_D"?{kind:"cancel"}:e?.isCharacter?{kind:"char",ch:n}:null}async function l_(n,e,t){let r=ot(e.sessionId),s=e.title??V(e.cwd),o=1,i=[{key:"launch",label:"Launch",hotkey:"l",description:"start a new agent session"},{key:"view",label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}],a=null,d=null,c=()=>{let f=pr(n,{contentHeight:11,title:"Open session",overlay:!0}),p=f.contentW,m=0;n.moveTo(f.contentX,f.contentY+m),B(n,"modal-label"," session: "),B(n,"content",Mt(r,p-10)),m++,n.moveTo(f.contentX,f.contentY+m),B(n,"content"," "+Mt(s,p-2)),m++,m++;let h=d_(n,f,m,{intro:"What do you want to do?",choices:i,selected:o,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 l/v jump \xB7 Esc back"});a=f,d=h.firstChoiceRow},l=()=>{let f=a,p=d;if(!(f===null||p===null))for(let m=0;m<i.length;m++){let h=i[m];h&&zv(n,f,p+m*2,h.label,m===o)}},u=f=>{f<0||f>=i.length||f===o||(o=f,l())};return c(),n.hideCursor(),await new Promise(f=>{let p=!1,m=()=>{p=!0},h=b=>{m(),t.pop(),f(b)},g=(b,k,S)=>{if(b==="CTRL_C"||b==="CTRL_D"){h("cancel");return}if(b==="ESCAPE"){h("back");return}if(b==="ENTER"||b==="KP_ENTER"){h(i[o]?.key??"view");return}if(b==="UP"||b==="SHIFT_TAB"){u(o-1);return}if(b==="DOWN"||b==="TAB"){u(o+1);return}if(S?.isCharacter){let I=b.toLowerCase();if(I==="l"){h("launch");return}if(I==="v"){h("view");return}if(I==="n"){u(o+1);return}if(I==="p"){u(o-1);return}}},w=c_({choiceCount:i.length,layout:()=>a,firstChoiceRow:()=>d,selected:()=>o,select:u,commit:b=>{let k=i[b];k&&h(k.key)},back:()=>h("back")});t.push({onKey:(b,k,S)=>{p||g(b,k,S)},onMouse:(b,k)=>{p||w(b,k)},onResize:()=>{p||c()}})})}var $o,Kv=q(()=>{"use strict";ve();ir();_a();Tn();$o=[{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 of(n){if(n.length===0)return"";let e=n[0]??"";for(let t=1;t<n.length;t++){let r=n[t]??"",s=0;for(;s<e.length&&s<r.length&&e[s]===r[s];)s+=1;if(e=e.slice(0,s),e.length===0)break}return e}function u_(n){let{matches:e,firstLine:t}=n;if(e.length===0)return null;let r=t.indexOf(" "),s=r===-1?t:t.slice(0,r),o=r===-1?"":t.slice(r);if(e.length===1){let a=e[0]??"",d=o.startsWith(" ")?"":" ";return a+d+o}let i=of(e);return i.length<=s.length?null:i+o}var ug=q(()=>{"use strict"});import*as f_ from"os";async function Wa(n,e,t={}){let r=t.defaultCwd??(e?await hP(e.cwd):void 0)??f_.homedir();ls();let s=t.title??"Fork locally \u2014 choose cwd",o=t.intro??"Pick a local cwd for this session:",i=e?[{label:"session: ",value:ot(e.sessionId)},...e.importedFromMachine?[{label:"from: ",value:e.importedFromMachine}]:[],{label:"cwd: ",value:V(e.cwd)}]:[],a=new bi(r.endsWith("/")?r:r+"/"),d=()=>{let $=fP(a.text);$>0&&a.setText(a.text.slice($))},c=null,l=!1,u=null,f=null,p=null,m=null,h=" Enter accept \xB7 Esc back",g="Enter accept",w="Esc back",b=h.indexOf(g),k=h.indexOf(w),S=()=>{let $=i.length+6;u=pr(n,{contentHeight:$,title:s,overlay:t.overlay===!0});let F=u.contentW,J=0;for(let W of i)n.moveTo(u.contentX,u.contentY+J),B(n,"modal-label",` ${W.label}`),B(n,"content",Mt(W.value,F-W.label.length-2)),J++;J++,n.moveTo(u.contentX,u.contentY+J),B(n,"content",` ${o}`),J+=2,A(J),J+=2;let Y=u.contentY+J;c!==null?(n.moveTo(u.contentX,Y),B(n,"input-error",` ${Mt(c,F-2)}`),f=null,p=null,m=null):(n.moveTo(u.contentX,Y),B(n,"modal-hint",h),f=Y,p={start:u.contentX+b,end:u.contentX+b+g.length-1},m={start:u.contentX+k,end:u.contentX+k+w.length-1})},I=()=>i.length+3,x=0,A=$=>{if(!u)return;let F=$??I();n.moveTo(u.contentX,u.contentY+F).eraseLineAfter(),n.moveTo(u.x+u.w-1,u.contentY+F),B(n,"box-border","\u2502"),n.moveTo(u.contentX,u.contentY+F),n.noFormat(" ");let Y=Math.max(1,u.contentW-1-2),W=a.text,Z=a.cursor;Z<x&&(x=Z),Z-x>=Y&&(x=Z-Y+1),x<0&&(x=0);let ne=W.slice(x,x+Y);x>0&&ne.length>0&&(ne="\u2026"+ne.slice(1));let Se=Bk(W),Le=(Ge,Ae)=>{if(Ae.length===0)return;let de=Ge+Ae.length;if(Se<=Ge)B(n,"content",Ae);else if(Se>=de)B(n,"modal-hint",Ae);else{let Ne=Se-Ge;B(n,"modal-hint",Ae.slice(0,Ne)),B(n,"content",Ae.slice(Ne))}},Re=Z-x;if(l){Le(x,ne);return}Re>=ne.length?(Le(x,ne),B(n,"input-cursor"," ")):(Le(x,ne.slice(0,Re)),B(n,"input-cursor",ne[Re]??" "),Le(x+Re+1,ne.slice(Re+1)))},_=()=>{if(A(),!u)return;let $=I()+2;n.moveTo(u.contentX,u.contentY+$).eraseLineAfter(),n.moveTo(u.x+u.w-1,u.contentY+$),B(n,"box-border","\u2502");let F=u.contentY+$;n.moveTo(u.contentX,F),c!==null?(B(n,"input-error",` ${Mt(c,u.contentW-2)}`),f=null,p=null,m=null):(B(n,"modal-hint",h),f=F,p={start:u.contentX+b,end:u.contentX+b+g.length-1},m={start:u.contentX+k,end:u.contentX+k+w.length-1})},P=$=>{if(l)return;let F=a.text;l=!0,c=null,_(),qu(F).then(J=>{if(l=!1,J.ok){$({kind:"ok",path:J.path});return}c=J.reason,_()})};return Vs({term:n,render:S,overlay:t.overlay===!0,onKey:($,F,J,Y)=>{if(!l){if($==="ENTER"||$==="KP_ENTER"){P(Y);return}if($==="ESCAPE"){Y({kind:"back"});return}if($==="CTRL_C"||$==="CTRL_D"){Y({kind:"cancel"});return}if($==="TAB"){l=!0,mP(a.text).then(W=>{if(l=!1,W.matches.length===0)return;let Z;if(W.matches.length===1)Z=W.prefix+W.matches[0];else{let ne=of(W.matches);if(ne.length<=W.basePrefix.length)return;Z=W.prefix+ne}Z!==a.text&&(a.setText(Z,{recordUndo:!0}),d(),c=null,_())});return}if(a.handleKey($,J?.isCharacter===!0)){d(),c=null,_();return}}},onMouse:($,F,J)=>{if(l||$!=="MOUSE_LEFT_BUTTON_PRESSED")return;let Y=F?.x,W=F?.y;if(!(typeof Y!="number"||typeof W!="number")){if(u!==null&&(Y<u.x||Y>=u.x+u.w||W<u.y||W>=u.y+u.h)){J({kind:"back"});return}if(f!==null&&W===f){if(p!==null&&Y>=p.start&&Y<=p.end){P(J);return}if(m!==null&&Y>=m.start&&Y<=m.end){J({kind:"back"});return}}}}})}var Gv=q(()=>{"use strict";ve();ir();Hk();ug();_a();Fm();Tn()});import*as h_ from"fs";import*as m_ from"os";import*as fg from"path";function pg(n,e){let t=e;for(;t>0;){let r=n[t-1]??"";if(/\s/.test(r)){if(r===" "&&n[t-2]==="\\"){t-=2;continue}break}t-=1}return t===e?null:{token:n.slice(t,e),start:t}}function jK(n){return n.length===0?!1:n.includes("/")?!0:n==="~"||n==="."||n===".."}function qK(n){return n.replace(/\\ /g," ")}function p_(n){return n.replace(/ /g,"\\ ")}function zK(n){let e=n.lastIndexOf("/");return e===-1?{dirPrefix:"",base:n}:{dirPrefix:n.slice(0,e+1),base:n.slice(e+1)}}function KK(n,e){let t=n.length===0?".":n;return(t==="~"||t.startsWith("~/"))&&(t=m_.homedir()+t.slice(1)),fg.isAbsolute(t)?t:fg.resolve(e,t)}function GK(n){let e;try{e=h_.readdirSync(n,{withFileTypes:!0})}catch{return null}return e.map(t=>({name:t.name,isDir:t.isDirectory()}))}function hg(n,e,t=GK){let r=qK(n),{dirPrefix:s,base:o}=zK(r);if(s.length===0&&!jK(n)&&o.length===0)return null;let i=KK(s,e),a=t(i);if(a===null)return null;let d=o.startsWith("."),c=a.filter(f=>f.name.startsWith(o)&&(d||!f.name.startsWith(".")));if(c.length===0)return null;let l=c.map(f=>f.isDir?f.name+"/":f.name);if(c.length===1){let f=c[0],p=f.isDir?f.name+"/":f.name;return{replacement:p_(s+p),candidates:l}}let u=of(c.map(f=>f.name));return{replacement:p_(s+u),candidates:l}}var Jv=q(()=>{"use strict";ug()});import{spawn as JK}from"child_process";function VK(n,e){let t="";for(let r=0;r<n.length;r++){let s=n[r];if(s!=="%"||r===n.length-1){t+=s;continue}switch(n[r+1]){case"%":t+="%",r++;break;case"s":t+=e.sessionId,r++;break;case"c":t+=e.cwd,r++;break;case"a":t+=e.agentId,r++;break;case"u":t+=e.baseUrl,r++;break;case"t":t+=e.tokenFile,r++;break;default:t+=s;break}}return t}function YK(n){if(Array.isArray(n))return[...n];let e=n;return e.trim().length===0?[]:e.trim().split(/\s+/)}function QK(n,e){let t=YK(n.command);if(t.length===0)return null;let r=t.map(a=>kt(VK(a,e))),[s,...o]=r;if(!s)return null;let i={HYDRA_SESSION_ID:e.sessionId,HYDRA_CWD:e.cwd,HYDRA_AGENT:e.agentId,HYDRA_BASE_URL:e.baseUrl,HYDRA_TOKEN_FILE:e.tokenFile};return{program:s,args:o,env:i}}function XK(n){let e={stdout:"",stderr:"",bytes:0,truncated:!1},t=(r,s)=>{if(e.truncated)return;let o=n-e.bytes;if(o<=0){e.truncated=!0;return}let i=r.length<=o?r.toString("utf8"):r.subarray(0,o).toString("utf8");r.length>o&&(e.truncated=!0),e[s]+=i,e.bytes+=Math.min(r.length,o)};return{onStdout:r=>t(r,"stdout"),onStderr:r=>t(r,"stderr"),onExit:(r,s)=>{let o=[],i=(a,d)=>{let c=a.split(/\r?\n/);for(;c.length>0&&c[c.length-1]==="";)c.pop();for(let l of c)o.push({text:l,style:d})};return e.stdout&&i(e.stdout,"stdout"),e.stderr&&i(e.stderr,"stderr"),e.truncated&&o.push({text:`[output truncated at ${n} bytes]`,style:"meta"}),s?o.push({text:`[killed by ${s}]`,style:"error"}):typeof r=="number"&&r!==0&&o.push({text:`[exit ${r}]`,style:"error"}),o}}}function mg(n,e,t){let r=QK(n,e);if(r===null){t.notify("hotkey: empty command");return}let s=XK(t.maxOutputBytes??ZK),o=t.spawnFn??JK,i;try{i=o(r.program,r.args,{cwd:t.cwd,env:{...t.parentEnv??process.env,...r.env},stdio:["ignore","pipe","pipe"]})}catch(a){t.emitLines([{text:`[hotkey spawn failed: ${a.message}]`,style:"error"}]);return}i.stdout?.on("data",s.onStdout),i.stderr?.on("data",s.onStderr),i.on("error",a=>{t.emitLines([{text:`[hotkey spawn error: ${a.message}]`,style:"error"}])}),i.on("close",(a,d)=>{t.emitLines(s.onExit(a,d))})}var ZK,Vv=q(()=>{"use strict";st();ZK=16*1024});function eG(n){process.stdout.write(`\x1B]9;4;${n}\x1B\\`)}function tG(n,e,t){let r=`${t.agentId}@${t.version}`;if(t.source==="npm")return t.phase==="install_start"||t.phase==="download_start"?`${n} installing ${r} via npm\u2026`:t.phase==="installed"?`${n} ${r} installed`:`${n} installing ${r} via npm\u2026`;if(t.phase==="download_start"||t.phase==="download_progress"){let s=t.receivedBytes??0,o=t.totalBytes??0,i=(s/1e6).toFixed(1);if(o>0){let a=(o/1e6).toFixed(1),d=Math.min(100,Math.floor(s/o*100));return`${n} downloading ${r} ${i}/${a} MB (${d}%)`}return`${n} downloading ${r} ${i} MB`}return t.phase==="download_done"?`${n} downloaded ${r}, verifying\u2026`:t.phase==="extract"?`${n} extracting ${r}\u2026`:t.phase==="installed"?`${n} ${r} installed`:e||n}function gg(n,e){let t=!1,r="",s=!1,o=n,i=a=>{t||a===3&&s||a===0&&!s||(s=a===3,eG(a))};return{write(a){t||(o=a,r=a,e.write(a))},applyProgress(a){if(t)return;a.phase==="download_start"||a.phase==="download_progress"||a.phase==="install_start"||a.phase==="extract"||a.phase==="download_done"?i(3):a.phase==="installed"&&i(0);let c=tG(o,r,a);r=c,e.write(c)},finalize(){t||(t=!0,i(0),e.finalize())}}}function g_(n){let e=!1;return{write(t){e||(process.stdout.write("\r"),n.eraseLineAfter(),B(n,"status-active",t))},finalize(){e||(e=!0,process.stdout.write(`
262
- `))}}}var Yv=q(()=>{"use strict";Tn()});function Qv(){return{filters:{cwdOnly:!1,hostFilter:"__local",includeNonInteractive:!1}}}function ja(){return an()?.id??"terminal"}function sG(){if(!Hu())return w_;let n=[];for(let e of w_)n.push(e),e?.[0]==="*"&&n.push(["^t",$m()?"go to selected session's tab (opening one if needed), or send the composer to a new one":"new tab: selected session, or send the composer to a new one"]);return n}async function Xv(n,e){let t=()=>{we(ns),we(Aa),we(Po),we(Ta),we(Ea),we(Dc),we(Bc),we(Hc),we(Ra),we("\x1B>")};t();let r=e.prefs??Qv();if(e.prefs===void 0&&e.currentSessionId!==void 0){let E=e.sessions.find(M=>M.sessionId===e.currentSessionId);(E?.importedFromMachine||E?.remote)&&(r.filters.hostFilter="__all")}let s=e.cwd,o=wg(e.sessions,s),i,a=E=>{let M=E;return r.filters.cwdOnly&&(M=M.filter(H=>H.cwd===s)),r.filters.includeNonInteractive||(M=M.filter(H=>H.interactive===!0)),M=aG(M,r.filters.hostFilter),M},d=a(o),c={columns:e.config.tui.sessionColumns??pi,cwdMaxWidth:e.config.tui.cwdColumnMaxWidth},l=d.map(E=>ds(E,Date.now())),u=Gs(l,c),f=1+d.length,p=0,m=0;if(e.currentSessionId!==void 0){let E=d.findIndex(M=>M.sessionId===e.currentSessionId);E>=0&&(p=E+1)}let h=!1,g="",w=120,b=!1,k=0,S="normal",I=null,x=!1,A="input",_=new Mo({history:[],collapsePastes:!1}),P=[],$=!1,F=0,J=0,Y=null,W=!1,Z=new Map,ne=Gs([],c),Se="",Le=E=>Z.get(E)??null,Re=()=>{let E=Date.now(),M=new Map(d.map(se=>[se.sessionId,se])),H=[];Z=new Map;for(let se of P){let oe=M.get(se.sessionId);if(!oe)continue;let fe=ds(oe,E);Z.set(se.sessionId,fe),H.push(fe)}ne=Gs(H,c);let K=Math.max(20,xn(n)-yg);Se=ur(Co,ne,K,c).padEnd(K)},Ge=null,Ae=null,de=null,Ne=null,at=()=>{if(Ne!==null){let E=Ne;return{plain:E,render:()=>{B(n,"status-active",` ${E}`)}}}if(h){let E=d.length===0?"no matches":`${d.length} match${d.length===1?"":"es"}`;return{plain:`/${g}\u2589 ${E} \xB7 ^c clears`,render:()=>{B(n,"prompt-text",` /${g}`),B(n,"prompt-cursor"," "),B(n,"modal-hint",` ${E} \xB7 ^c clears`)}}}return de!==null?{plain:de,render:()=>{B(n,"modal-hint",` ${de}`)}}:null},Rt=!1,Pe=new Mo({history:[]});if(e.initialPrompt&&Pe.setBuffer(e.initialPrompt),e.initialAttachments)for(let E of e.initialAttachments)Pe.addAttachment(E);let Jt=e.config.tui.promptHistoryMaxEntries;su(D.globalTuiHistoryFile()).then(E=>{let M=E.length>Jt?E.slice(E.length-Jt):E;Pe.setHistory(M)}).catch(()=>{});let Ve=new Yc(n),ys=Il(e.config),Ci=e.config.tui.selectionClipboard,mr=null,ce=!1,Je=null,Ie="char",dn=null,za=null,Lr=!1,Nr=1,Oo=null,Tg=500,el=1,ws=/[A-Za-z0-9_:\-]/,Fo=Js(n),Wt=xn(n),dt=0,Ka="",er=0,Un=[],gn=1,to=0,Ri=0,tl=0,Ga="",no=[],$n=1,wf=0,Ye=[],yn=1,Ai=0,Ti=0,ro=0,Ei=()=>{Fo=Js(n),Wt=xn(n);let E=Math.max(10,Wt-yg-1);er=Math.max(10,Wt-y_);let M=Math.max(10,Wt-8),H=Pe.state().attachments.length,K=H>0?` \xB7 \u{1F4CE}\xD7${H}`:"",se=Math.max(10,M-K.length);Ka=oG(s,se)+K;let oe=Pe.state();Un=ms(oe.buffer,er);let fe=eo(Un,oe,af);gn=fe.rendered,to=fe.windowStart,Ri=fe.cursorVisualRow,tl=fe.cursorVisualCol;let rt=6+gn,Bt=Math.max(3,Fo-rt);dt=Math.min(d.length,Bt),Ga=ur(Co,u,E,c).padEnd(E),no=l.map(nn=>ur(nn,u,E,c).padEnd(E))},Ja=()=>{l=d.map(E=>ds(E,Date.now())),u=Gs(l,c),f=1+d.length,Ei()},In=()=>{let E=a(o);h&&g.length>0?d=E.filter(M=>cG(M,g)):d=E,Ja(),h?(m=0,p=d.length>0?1:0):p>f-1&&(p=Math.max(0,f-1)),m+dt>d.length&&(m=Math.max(0,d.length-dt)),Dr()},so=E=>{if(E!==void 0){let M=d.findIndex(H=>H.sessionId===E);if(M>=0){p=M+1,Dr();return}}p=d.length>0?1:0,m=0,Dr()},Dr=()=>{if(p===0)return;let E=p-1;E<m?m=E:E>=m+dt?m=E-dt+1:m+dt>d.length&&(m=Math.max(0,d.length-dt))},me=()=>Math.max(2,Wt-3),It=!1,nt=!0,Xt=!1,bf=[],Wn=e.composerAgentId,jn=e.composerModel,kf=!1,Pi=()=>{let E=Wn;if(!E)return"";let M=jn;return M?`${E}\u2022${M}`:E},Mi=null,Br=null,Zt=null,_i=()=>{let E=me(),M=`\u2500 ${Ka} `,H=Pi(),K="";if(H.length>0){let Ot=`\u2500 ${H} `;Ot.length+M.length+1<=E&&(K=Ot)}let se=Math.max(1,E-M.length-K.length),oe="\u2500".repeat(se),fe=(p===0||It)&&nt;if(Mi=M.length>0?{start:2,end:1+M.length}:null,K.length>0){let Ot=1+M.length+se+1;Br={start:Ot,end:Ot+K.length-1}}else Br=null;let rt=fe?"box-border-focused":"box-border",Bt=fe?"box-border-focused-hover":"box-border-hover",nn=(Ot,Ss)=>{B(n,Ss?Bt:rt,Ot)};B(n,rt,"\u256D"),nn(M,Zt==="cwd"),B(n,rt,oe),K&&nn(K,Zt==="agent"),B(n,rt,"\u256E")},Lo=()=>{let E=me(),M="\u2500".repeat(E);(p===0||It)&&nt?B(n,"box-border-focused",`\u2570${M}\u256F`):B(n,"box-border",`\u2570${M}\u256F`)},Va=()=>{let E=at();if(E===null)return;let M=Math.max(0,xn(n)-2);if(E.plain.length>M){let H=E.plain.slice(0,Math.max(0,M-1))+"\u2026";B(n,"modal-hint",` ${H}`);return}E.render()},Ya=E=>{let M=Un[E];return M?(Pe.state().buffer[M.bufferIdx]??"").slice(M.startCol,M.endCol):""},Qa=E=>{if(Je===null)return null;let M=Un[E];if(!M)return null;let H=Je;if(M.bufferIdx<H.startRow||M.bufferIdx>H.endRow)return null;let K=M.bufferIdx===H.startRow?H.startCol:M.startCol,se=M.bufferIdx===H.endRow?H.endCol:M.endCol,oe=Math.max(K,M.startCol),fe=Math.min(se,M.endCol);return fe<=oe?null:{start:oe-M.startCol,end:fe-M.startCol}},oo=E=>{let M=me(),H=Ya(E),K=Math.max(0,M-1-H.length),se=" ".repeat(K),oe=Qa(E),fe=()=>{if(oe===null){B(n,"content",` ${H}${se}`);return}B(n,"content"," "),oe.start>0&&B(n,"content",H.slice(0,oe.start)),B(n,"selection-highlight",H.slice(oe.start,oe.end)),oe.end<H.length&&B(n,"content",H.slice(oe.end)),B(n,"content",se)};(p===0||It)&&nt?(B(n,"box-border-focused","\u2502"),fe(),B(n,"box-border-focused","\u2502")):(B(n,"box-border","\u2502"),fe(),B(n,"box-border","\u2502"))},No=E=>{let M=no[E]??"",H=d[E],K=H&&H.priority&&H.priority>0?"* ":" ";p===E+1&&!It&&nt?B(n,"list-selected",`${K}${M}`):B(n,"content",`${K}${M}`)},Hr=()=>{let E=m,M=Math.max(0,d.length-m-dt),H=[];return r.filters.cwdOnly&&H.push({kind:"plain",text:"cwd-only"}),r.filters.hostFilter!=="__all"&&H.push({kind:"host",text:dG(r.filters.hostFilter)}),r.filters.includeNonInteractive&&H.push({kind:"plain",text:"+non-interactive"}),E>0&&H.push({kind:"plain",text:`\u2191 ${E} above`}),M>0&&H.push({kind:"plain",text:`\u2193 ${M} below`}),H},Xa=()=>{let E=Hr();return E.length===0?"":` ${E.map(M=>M.text).join(" \xB7 ")}`},io=E=>ot(E),vf=()=>{let E=I?`${I.sessionId}|${I.status}`:"";return["ind",S,E,Ge?`${Ge.text}${Ge.cursor}`:"",Ae??"",h?`1|${g}|${d.length}`:"0",Xa(),Bi?"h1":"h0",Uo?"ho1":"ho0"].join("")},Qe=()=>{ht(()=>{Ve.paintRow(De(),vf(),()=>{let E=()=>{bn=null,vs=null};if(S==="confirm-kill"&&I)E(),B(n,"prompt-text",` kill ${io(I.sessionId)}? [y/N]`);else if(S==="confirm-delete"&&I)E(),I.status==="warm"?B(n,"prompt-destructive",` kill + delete ${io(I.sessionId)}? [y/N]`):B(n,"prompt-destructive",` delete ${io(I.sessionId)}? [y/N]`);else if(S==="busy"&&I)E(),B(n,"modal-status",` working on ${io(I.sessionId)}\u2026`);else if(S==="rename"&&I&&Ge){E();let M=Ge.text,H=Ge.cursor;B(n,"prompt-text"," title: "),B(n,"prompt-text",M.slice(0,H)),H<M.length?(B(n,"prompt-cursor",M[H]??" "),B(n,"prompt-text",M.slice(H+1))):B(n,"prompt-cursor"," "),B(n,"modal-hint"," Enter saves \xB7 Esc cancels")}else if(Ae!==null)E(),B(n,"modal-status",` ${Ae}`);else{let M=Hr(),H=Xa(),K="Esc \xB7 Go Back",se=K.length,oe=5,fe=H.length,rt=Math.max(1,Wt-fe-se-oe);if(vs=null,M.length>0){B(n,"modal-hint"," ");let Bt=3;for(let nn=0;nn<M.length;nn++){let Ot=M[nn];nn>0&&(B(n,"modal-hint"," \xB7 "),Bt+=3),Ot.kind==="host"?(vs={start:Bt,end:Bt+Ot.text.length-1},Uo?B(n,"content",Ot.text):B(n,"modal-hint",Ot.text)):B(n,"modal-hint",Ot.text),Bt+=Ot.text.length}}B(n,"modal-hint"," ".repeat(rt)),Bi?B(n,"content",K):B(n,"modal-hint",K),bn={start:Wt-oe-se+1,end:Wt-oe}}})})},$i=E=>$n+1+E,en=()=>$n+gn+1,tn=()=>$n+gn+3,ao=E=>tn()+1+(E-m),De=()=>tn()+1+dt,qn=()=>{let E=Ri-to;if(E<0||E>=gn)return;let M=3+tl;n.moveTo(M,$i(E))},Oi=(E,M)=>{let H=M-($n+1);if(H<0||H>=gn)return null;let K=Un[to+H];if(!K)return null;let se=Math.max(0,Math.min(K.endCol-K.startCol,E-3));return{row:K.bufferIdx,col:K.startCol+se}},Ur=()=>{Je!==null&&(Je=null,Cn())},tr=(E,M)=>{let H=E.row<M.row||E.row===M.row&&E.col<=M.col,K=H?E:M,se=H?M:E;if(K.row===se.row&&K.col===se.col){Ur();return}let oe={startRow:K.row,startCol:K.col,endRow:se.row,endCol:se.col},fe=Je;fe&&fe.startRow===oe.startRow&&fe.startCol===oe.startCol&&fe.endRow===oe.endRow&&fe.endCol===oe.endCol||(Je=oe,Cn())},Za=()=>{if(Je===null)return"";let{startRow:E,startCol:M,endRow:H,endCol:K}=Je,se=Pe.state().buffer;if(E===H)return(se[E]??"").slice(M,K);let oe=[(se[E]??"").slice(M)];for(let fe=E+1;fe<H;fe++)oe.push(se[fe]??"");return oe.push((se[H]??"").slice(0,K)),oe.join(`
263
- `)},ed=()=>{let E=Za();E.length!==0&&Vc(E,{target:Ci}).then(M=>{let H=E.length;de=M.ok?`copied ${H} char${H===1?"":"s"} to clipboard`:`clipboard copy failed: ${M.reason}`,Kn()},M=>{de=`clipboard copy failed: ${M.message}`,Kn()})},R=E=>{let M=Pe.state().buffer[E.row]??"";if(M.length===0)return null;let H=Math.max(0,Math.min(M.length-1,E.col));if(!ws.test(M[H]))return null;let K=H;for(;K>0&&ws.test(M[K-1]);)K--;let se=H+1;for(;se<M.length&&ws.test(M[se]);)se++;return{start:K,end:se}},Sf=E=>{let M=Pe.state().buffer[E]??"";tr({row:E,col:0},{row:E,col:M.length})},Eg=E=>{let M=dn;if(M===null)return;let H=E.row<M.row||E.row===M.row&&E.col<M.start,K=E.row>M.row||E.row===M.row&&E.col>M.end,se={row:M.row,col:M.start},oe={row:M.row,col:M.end};if(H){let fe=R(E);se=fe!==null?{row:E.row,col:fe.start}:E}else if(K){let fe=R(E);oe=fe!==null?{row:E.row,col:fe.end}:E}tr(se,oe)},xf=E=>{let M=za;if(M===null)return;let H=Math.min(M,E.row),K=Math.max(M,E.row),se=Pe.state().buffer[K]??"";tr({row:H,col:0},{row:K,col:se.length})},If=E=>{if(!ys)return;let M=Oi(E.x,E.y);if(M===null)return;mr=M,ce=!1,Lr=!1,Nr=1,Ie="char",dn=null,za=null,Ur();let H=Date.now(),K=Oo,se=K!==null&&H-K.t<=Tg&&Math.abs(E.x-K.x)<=el&&Math.abs(E.y-K.y)<=el&&K.row!==null&&K.row===M.row;if(se&&K.count===2&&E.x===K.x&&E.y===K.y){Nr=3,Sf(M.row),Ie="line",za=M.row,Lr=!0;return}if(se&&K.count===1){Nr=2;let rt=R(M);rt!==null&&(tr({row:M.row,col:rt.start},{row:M.row,col:rt.end}),Lr=!0,Ie="word",dn={row:M.row,start:rt.start,end:rt.end})}},td=E=>{if(mr===null)return;let M=Math.max(1,Math.min(Wt,E.x)),H=Math.max($n+1,Math.min($n+gn,E.y)),K=Oi(M,H);K!==null&&(ce=!0,Ie==="word"?Eg(K):Ie==="line"?xf(K):tr(mr,K))},Do=E=>{let M=ce,H=Lr;if(mr=null,ce=!1,Lr=!1,E!==null){let K=Oi(E.x,E.y);Oo={x:E.x,y:E.y,t:Date.now(),count:Nr,row:K?.row??null}}if(Nr=1,M||H){ed();return}Ur()},gr=()=>nt?p===0?"f":It?"h":"u":"x",Cf=()=>`ct|${gr()}|${me()}|${Ka}|${Pi()}|${Zt??""}`,nl=()=>`cb|${gr()}|${me()}`,co=()=>Ne!==null?`cs|i|${Ne}`:h?`cs|s|${g}|${d.length}`:de!==null?`cs|h|${de}`:"blank",nd=E=>{let M=Qa(E),H=M===null?"":`${M.start}:${M.end}`;return`cbb|${gr()}|${me()}|${Ya(E)}|${H}`},Rf=()=>`h|${Ga}`,rd=E=>{let M=d[E],H=M&&M.priority&&M.priority>0?"* ":" ",K=no[E]??"";return`sr|${p===E+1&&!It&&nt?"1":"0"}|${H}${K}`},At=()=>{ht(()=>{n.hideCursor(),Ei(),Dr(),$n=1,Ve.ensureSize(Wt,Fo),Ve.paintRow($n,Cf(),()=>{_i()});for(let E=0;E<gn;E++){let M=to+E;Ve.paintRow($i(E),nd(M),()=>{oo(M)})}Ve.paintRow(en(),nl(),()=>{Lo()}),Ve.paintRow(en()+1,co(),()=>Va()),Ve.paintRow(tn(),Rf(),()=>{B(n,"list-header",` ${Ga}`)});for(let E=0;E<dt;E++){let M=m+E,H=tn()+1+E;M<d.length?Ve.paintRow(H,rd(M),()=>{No(M)}):Ve.paintRow(H,"blank",()=>{})}Qe();for(let E=De()+1;E<=Fo;E++)Ve.paintRow(E,"blank",()=>{});p===0&&(qn(),n.hideCursor(!1))})},Af=()=>{Ve.clearCache(),n.moveTo(1,1).eraseDisplayBelow(),At()},Tf=()=>{ht(()=>{n.hideCursor(),Ve.clearCache(),n.moveTo(1,1).eraseDisplayBelow(),B(n,"modal-title"," Picker hotkeys"),n.noFormat(`
262
+ `))}}}var Yv=q(()=>{"use strict";Tn()});function Qv(){return{filters:{cwdOnly:!1,hostFilter:"__local",includeNonInteractive:!1}}}function ja(){return an()?.id??"terminal"}function sG(){if(!Hu())return w_;let n=[];for(let e of w_)n.push(e),e?.[0]==="*"&&n.push(["^t",$m()?"go to selected session's tab (opening one if needed), or send the composer to a new one":"new tab: selected session, or send the composer to a new one"]);return n}async function Xv(n,e){let t=()=>{we(ns),we(Aa),we(Po),we(Ta),we(Ea),we(Dc),we(Bc),we(Hc),we(Ra),we("\x1B>")};t();let r=e.prefs??Qv();if(e.prefs===void 0&&e.currentSessionId!==void 0){let E=e.sessions.find(M=>M.sessionId===e.currentSessionId);(E?.importedFromMachine||E?.remote)&&(r.filters.hostFilter="__all")}let s=e.cwd,o=wg(e.sessions,s),i,a=E=>{let M=E;return r.filters.cwdOnly&&(M=M.filter(H=>H.cwd===s)),r.filters.includeNonInteractive||(M=M.filter(H=>H.interactive===!0)),M=aG(M,r.filters.hostFilter),M},d=a(o),c={columns:e.config.tui.sessionColumns??pi,cwdMaxWidth:e.config.tui.cwdColumnMaxWidth},l=d.map(E=>ds(E,Date.now())),u=Gs(l,c),f=1+d.length,p=0,m=0;if(e.currentSessionId!==void 0){let E=d.findIndex(M=>M.sessionId===e.currentSessionId);E>=0&&(p=E+1)}let h=!1,g="",w=120,b=!1,k=0,S="normal",I=null,x=!1,A="input",_=new Mo({history:[],collapsePastes:!1}),P=[],$=!1,F=0,J=0,Y=null,W=!1,Z=new Map,ne=Gs([],c),Se="",Le=E=>Z.get(E)??null,Re=()=>{let E=Date.now(),M=new Map(d.map(se=>[se.sessionId,se])),H=[];Z=new Map;for(let se of P){let oe=M.get(se.sessionId);if(!oe)continue;let fe=ds(oe,E);Z.set(se.sessionId,fe),H.push(fe)}ne=Gs(H,c);let K=Math.max(20,xn(n)-yg);Se=ur(Co,ne,K,c).padEnd(K)},Ge=null,Ae=null,de=null,Ne=null,at=()=>{if(Ne!==null){let E=Ne;return{plain:E,render:()=>{B(n,"status-active",` ${E}`)}}}if(h){let E=d.length===0?"no matches":`${d.length} match${d.length===1?"":"es"}`;return{plain:`/${g}\u2589 ${E} \xB7 ^c clears`,render:()=>{B(n,"prompt-text",` /${g}`),B(n,"prompt-cursor"," "),B(n,"modal-hint",` ${E} \xB7 ^c clears`)}}}return de!==null?{plain:de,render:()=>{B(n,"modal-hint",` ${de}`)}}:null},Rt=!1,Pe=new Mo({history:[]});if(e.initialPrompt&&Pe.setBuffer(e.initialPrompt),e.initialAttachments)for(let E of e.initialAttachments)Pe.addAttachment(E);let Jt=e.config.tui.promptHistoryMaxEntries;su(D.globalTuiHistoryFile()).then(E=>{let M=E.length>Jt?E.slice(E.length-Jt):E;Pe.setHistory(M)}).catch(()=>{});let Ve=new Yc(n),ys=Il(e.config),Ci=e.config.tui.selectionClipboard,mr=null,ce=!1,Je=null,xe="char",dn=null,za=null,Lr=!1,Nr=1,Oo=null,Tg=500,el=1,ws=/[A-Za-z0-9_:\-]/,Fo=Js(n),Wt=xn(n),dt=0,Ka="",er=0,Un=[],gn=1,to=0,Ri=0,tl=0,Ga="",no=[],$n=1,wf=0,Ye=[],yn=1,Ai=0,Ti=0,ro=0,Ei=()=>{Fo=Js(n),Wt=xn(n);let E=Math.max(10,Wt-yg-1);er=Math.max(10,Wt-y_);let M=Math.max(10,Wt-8),H=Pe.state().attachments.length,K=H>0?` \xB7 \u{1F4CE}\xD7${H}`:"",se=Math.max(10,M-K.length);Ka=oG(s,se)+K;let oe=Pe.state();Un=ms(oe.buffer,er);let fe=eo(Un,oe,af);gn=fe.rendered,to=fe.windowStart,Ri=fe.cursorVisualRow,tl=fe.cursorVisualCol;let rt=6+gn,Bt=Math.max(3,Fo-rt);dt=Math.min(d.length,Bt),Ga=ur(Co,u,E,c).padEnd(E),no=l.map(nn=>ur(nn,u,E,c).padEnd(E))},Ja=()=>{l=d.map(E=>ds(E,Date.now())),u=Gs(l,c),f=1+d.length,Ei()},In=()=>{let E=a(o);h&&g.length>0?d=E.filter(M=>cG(M,g)):d=E,Ja(),h?(m=0,p=d.length>0?1:0):p>f-1&&(p=Math.max(0,f-1)),m+dt>d.length&&(m=Math.max(0,d.length-dt)),Dr()},so=E=>{if(E!==void 0){let M=d.findIndex(H=>H.sessionId===E);if(M>=0){p=M+1,Dr();return}}p=d.length>0?1:0,m=0,Dr()},Dr=()=>{if(p===0)return;let E=p-1;E<m?m=E:E>=m+dt?m=E-dt+1:m+dt>d.length&&(m=Math.max(0,d.length-dt))},me=()=>Math.max(2,Wt-3),It=!1,nt=!0,Xt=!1,bf=[],Wn=e.composerAgentId,jn=e.composerModel,kf=!1,Pi=()=>{let E=Wn;if(!E)return"";let M=jn;return M?`${E}\u2022${M}`:E},Mi=null,Br=null,Zt=null,_i=()=>{let E=me(),M=`\u2500 ${Ka} `,H=Pi(),K="";if(H.length>0){let Ot=`\u2500 ${H} `;Ot.length+M.length+1<=E&&(K=Ot)}let se=Math.max(1,E-M.length-K.length),oe="\u2500".repeat(se),fe=(p===0||It)&&nt;if(Mi=M.length>0?{start:2,end:1+M.length}:null,K.length>0){let Ot=1+M.length+se+1;Br={start:Ot,end:Ot+K.length-1}}else Br=null;let rt=fe?"box-border-focused":"box-border",Bt=fe?"box-border-focused-hover":"box-border-hover",nn=(Ot,Ss)=>{B(n,Ss?Bt:rt,Ot)};B(n,rt,"\u256D"),nn(M,Zt==="cwd"),B(n,rt,oe),K&&nn(K,Zt==="agent"),B(n,rt,"\u256E")},Lo=()=>{let E=me(),M="\u2500".repeat(E);(p===0||It)&&nt?B(n,"box-border-focused",`\u2570${M}\u256F`):B(n,"box-border",`\u2570${M}\u256F`)},Va=()=>{let E=at();if(E===null)return;let M=Math.max(0,xn(n)-2);if(E.plain.length>M){let H=E.plain.slice(0,Math.max(0,M-1))+"\u2026";B(n,"modal-hint",` ${H}`);return}E.render()},Ya=E=>{let M=Un[E];return M?(Pe.state().buffer[M.bufferIdx]??"").slice(M.startCol,M.endCol):""},Qa=E=>{if(Je===null)return null;let M=Un[E];if(!M)return null;let H=Je;if(M.bufferIdx<H.startRow||M.bufferIdx>H.endRow)return null;let K=M.bufferIdx===H.startRow?H.startCol:M.startCol,se=M.bufferIdx===H.endRow?H.endCol:M.endCol,oe=Math.max(K,M.startCol),fe=Math.min(se,M.endCol);return fe<=oe?null:{start:oe-M.startCol,end:fe-M.startCol}},oo=E=>{let M=me(),H=Ya(E),K=Math.max(0,M-1-H.length),se=" ".repeat(K),oe=Qa(E),fe=()=>{if(oe===null){B(n,"content",` ${H}${se}`);return}B(n,"content"," "),oe.start>0&&B(n,"content",H.slice(0,oe.start)),B(n,"selection-highlight",H.slice(oe.start,oe.end)),oe.end<H.length&&B(n,"content",H.slice(oe.end)),B(n,"content",se)};(p===0||It)&&nt?(B(n,"box-border-focused","\u2502"),fe(),B(n,"box-border-focused","\u2502")):(B(n,"box-border","\u2502"),fe(),B(n,"box-border","\u2502"))},No=E=>{let M=no[E]??"",H=d[E],K=H&&H.priority&&H.priority>0?"* ":" ";p===E+1&&!It&&nt?B(n,"list-selected",`${K}${M}`):B(n,"content",`${K}${M}`)},Hr=()=>{let E=m,M=Math.max(0,d.length-m-dt),H=[];return r.filters.cwdOnly&&H.push({kind:"plain",text:"cwd-only"}),r.filters.hostFilter!=="__all"&&H.push({kind:"host",text:dG(r.filters.hostFilter)}),r.filters.includeNonInteractive&&H.push({kind:"plain",text:"+non-interactive"}),E>0&&H.push({kind:"plain",text:`\u2191 ${E} above`}),M>0&&H.push({kind:"plain",text:`\u2193 ${M} below`}),H},Xa=()=>{let E=Hr();return E.length===0?"":` ${E.map(M=>M.text).join(" \xB7 ")}`},io=E=>ot(E),vf=()=>{let E=I?`${I.sessionId}|${I.status}`:"";return["ind",S,E,Ge?`${Ge.text}${Ge.cursor}`:"",Ae??"",h?`1|${g}|${d.length}`:"0",Xa(),Bi?"h1":"h0",Uo?"ho1":"ho0"].join("")},Qe=()=>{ht(()=>{Ve.paintRow(De(),vf(),()=>{let E=()=>{bn=null,vs=null};if(S==="confirm-kill"&&I)E(),B(n,"prompt-text",` kill ${io(I.sessionId)}? [y/N]`);else if(S==="confirm-delete"&&I)E(),I.status==="warm"?B(n,"prompt-destructive",` kill + delete ${io(I.sessionId)}? [y/N]`):B(n,"prompt-destructive",` delete ${io(I.sessionId)}? [y/N]`);else if(S==="busy"&&I)E(),B(n,"modal-status",` working on ${io(I.sessionId)}\u2026`);else if(S==="rename"&&I&&Ge){E();let M=Ge.text,H=Ge.cursor;B(n,"prompt-text"," title: "),B(n,"prompt-text",M.slice(0,H)),H<M.length?(B(n,"prompt-cursor",M[H]??" "),B(n,"prompt-text",M.slice(H+1))):B(n,"prompt-cursor"," "),B(n,"modal-hint"," Enter saves \xB7 Esc cancels")}else if(Ae!==null)E(),B(n,"modal-status",` ${Ae}`);else{let M=Hr(),H=Xa(),K="Esc \xB7 Go Back",se=K.length,oe=5,fe=H.length,rt=Math.max(1,Wt-fe-se-oe);if(vs=null,M.length>0){B(n,"modal-hint"," ");let Bt=3;for(let nn=0;nn<M.length;nn++){let Ot=M[nn];nn>0&&(B(n,"modal-hint"," \xB7 "),Bt+=3),Ot.kind==="host"?(vs={start:Bt,end:Bt+Ot.text.length-1},Uo?B(n,"content",Ot.text):B(n,"modal-hint",Ot.text)):B(n,"modal-hint",Ot.text),Bt+=Ot.text.length}}B(n,"modal-hint"," ".repeat(rt)),Bi?B(n,"content",K):B(n,"modal-hint",K),bn={start:Wt-oe-se+1,end:Wt-oe}}})})},$i=E=>$n+1+E,en=()=>$n+gn+1,tn=()=>$n+gn+3,ao=E=>tn()+1+(E-m),De=()=>tn()+1+dt,qn=()=>{let E=Ri-to;if(E<0||E>=gn)return;let M=3+tl;n.moveTo(M,$i(E))},Oi=(E,M)=>{let H=M-($n+1);if(H<0||H>=gn)return null;let K=Un[to+H];if(!K)return null;let se=Math.max(0,Math.min(K.endCol-K.startCol,E-3));return{row:K.bufferIdx,col:K.startCol+se}},Ur=()=>{Je!==null&&(Je=null,Cn())},tr=(E,M)=>{let H=E.row<M.row||E.row===M.row&&E.col<=M.col,K=H?E:M,se=H?M:E;if(K.row===se.row&&K.col===se.col){Ur();return}let oe={startRow:K.row,startCol:K.col,endRow:se.row,endCol:se.col},fe=Je;fe&&fe.startRow===oe.startRow&&fe.startCol===oe.startCol&&fe.endRow===oe.endRow&&fe.endCol===oe.endCol||(Je=oe,Cn())},Za=()=>{if(Je===null)return"";let{startRow:E,startCol:M,endRow:H,endCol:K}=Je,se=Pe.state().buffer;if(E===H)return(se[E]??"").slice(M,K);let oe=[(se[E]??"").slice(M)];for(let fe=E+1;fe<H;fe++)oe.push(se[fe]??"");return oe.push((se[H]??"").slice(0,K)),oe.join(`
263
+ `)},ed=()=>{let E=Za();E.length!==0&&Vc(E,{target:Ci}).then(M=>{let H=E.length;de=M.ok?`copied ${H} char${H===1?"":"s"} to clipboard`:`clipboard copy failed: ${M.reason}`,Kn()},M=>{de=`clipboard copy failed: ${M.message}`,Kn()})},R=E=>{let M=Pe.state().buffer[E.row]??"";if(M.length===0)return null;let H=Math.max(0,Math.min(M.length-1,E.col));if(!ws.test(M[H]))return null;let K=H;for(;K>0&&ws.test(M[K-1]);)K--;let se=H+1;for(;se<M.length&&ws.test(M[se]);)se++;return{start:K,end:se}},Sf=E=>{let M=Pe.state().buffer[E]??"";tr({row:E,col:0},{row:E,col:M.length})},Eg=E=>{let M=dn;if(M===null)return;let H=E.row<M.row||E.row===M.row&&E.col<M.start,K=E.row>M.row||E.row===M.row&&E.col>M.end,se={row:M.row,col:M.start},oe={row:M.row,col:M.end};if(H){let fe=R(E);se=fe!==null?{row:E.row,col:fe.start}:E}else if(K){let fe=R(E);oe=fe!==null?{row:E.row,col:fe.end}:E}tr(se,oe)},xf=E=>{let M=za;if(M===null)return;let H=Math.min(M,E.row),K=Math.max(M,E.row),se=Pe.state().buffer[K]??"";tr({row:H,col:0},{row:K,col:se.length})},If=E=>{if(!ys)return;let M=Oi(E.x,E.y);if(M===null)return;mr=M,ce=!1,Lr=!1,Nr=1,xe="char",dn=null,za=null,Ur();let H=Date.now(),K=Oo,se=K!==null&&H-K.t<=Tg&&Math.abs(E.x-K.x)<=el&&Math.abs(E.y-K.y)<=el&&K.row!==null&&K.row===M.row;if(se&&K.count===2&&E.x===K.x&&E.y===K.y){Nr=3,Sf(M.row),xe="line",za=M.row,Lr=!0;return}if(se&&K.count===1){Nr=2;let rt=R(M);rt!==null&&(tr({row:M.row,col:rt.start},{row:M.row,col:rt.end}),Lr=!0,xe="word",dn={row:M.row,start:rt.start,end:rt.end})}},td=E=>{if(mr===null)return;let M=Math.max(1,Math.min(Wt,E.x)),H=Math.max($n+1,Math.min($n+gn,E.y)),K=Oi(M,H);K!==null&&(ce=!0,xe==="word"?Eg(K):xe==="line"?xf(K):tr(mr,K))},Do=E=>{let M=ce,H=Lr;if(mr=null,ce=!1,Lr=!1,E!==null){let K=Oi(E.x,E.y);Oo={x:E.x,y:E.y,t:Date.now(),count:Nr,row:K?.row??null}}if(Nr=1,M||H){ed();return}Ur()},gr=()=>nt?p===0?"f":It?"h":"u":"x",Cf=()=>`ct|${gr()}|${me()}|${Ka}|${Pi()}|${Zt??""}`,nl=()=>`cb|${gr()}|${me()}`,co=()=>Ne!==null?`cs|i|${Ne}`:h?`cs|s|${g}|${d.length}`:de!==null?`cs|h|${de}`:"blank",nd=E=>{let M=Qa(E),H=M===null?"":`${M.start}:${M.end}`;return`cbb|${gr()}|${me()}|${Ya(E)}|${H}`},Rf=()=>`h|${Ga}`,rd=E=>{let M=d[E],H=M&&M.priority&&M.priority>0?"* ":" ",K=no[E]??"";return`sr|${p===E+1&&!It&&nt?"1":"0"}|${H}${K}`},At=()=>{ht(()=>{n.hideCursor(),Ei(),Dr(),$n=1,Ve.ensureSize(Wt,Fo),Ve.paintRow($n,Cf(),()=>{_i()});for(let E=0;E<gn;E++){let M=to+E;Ve.paintRow($i(E),nd(M),()=>{oo(M)})}Ve.paintRow(en(),nl(),()=>{Lo()}),Ve.paintRow(en()+1,co(),()=>Va()),Ve.paintRow(tn(),Rf(),()=>{B(n,"list-header",` ${Ga}`)});for(let E=0;E<dt;E++){let M=m+E,H=tn()+1+E;M<d.length?Ve.paintRow(H,rd(M),()=>{No(M)}):Ve.paintRow(H,"blank",()=>{})}Qe();for(let E=De()+1;E<=Fo;E++)Ve.paintRow(E,"blank",()=>{});p===0&&(qn(),n.hideCursor(!1))})},Af=()=>{Ve.clearCache(),n.moveTo(1,1).eraseDisplayBelow(),At()},Tf=()=>{ht(()=>{n.hideCursor(),Ve.clearCache(),n.moveTo(1,1).eraseDisplayBelow(),B(n,"modal-title"," Picker hotkeys"),n.noFormat(`
264
264
 
265
265
  `);for(let E of sG()){if(E===null){n(`
266
266
  `);continue}let[M,H]=E;B(n,"modal-key",` ${M.padEnd(rG)}`),B(n,"content",H),n.noFormat(`
@@ -290,9 +290,9 @@ unhandled rejection: ${n(e)}
290
290
  `),process.stdout.isTTY){let x=await ka(e);if(x?.version!==void 0){let A=x.version!==He,_=ai(e),P=x.configDigest!==void 0&&x.configDigest!==_;if(A||P){let $=A?`daemon ${x.version} \u2260 cli ${He}`:"config changed since daemon started";process.stderr.write(sa("cli-warn",`! ${$} \u2014 run \`${Ln()} daemon restart\` to apply.`,Pl(process.stderr))+`
291
291
  `)}}}if(l.sessionId&&process.stdout.isTTY){let x=ot(l.sessionId),A=l.readonly?" --readonly":"";process.stdout.write(`Continue: ${Ln()} --session ${x}${A}
292
292
  `)}}function R4(n){let{order:e,states:t,startedAt:r,endedAt:s,stopReason:o,perToolExpanded:i,collapsedLimit:a=20}=n,d=e.filter(F=>!pc(F,t.get(F)?.latestTitle)),c=d.length,l=a>0,u;if(!l||n.expanded)u=d;else{let F=Math.max(0,c-a),J=d.slice(F),Y=[];for(let W=0;W<F;W++){let Z=d[W];if(Z===void 0)continue;let ne=t.get(Z);ne&&!Qb(ne.status)&&Y.push(Z)}u=[...Y,...J]}let f=c-u.length,p=s===null,m=s??Date.now(),h=m-r,g=!p&&o!==null&&o!=="end_turn"?o:null,w=g==="amended",b=w?`amended \xB7 ${Pr(h)}`:`stopped (${g}) \xB7 ${Pr(h)}`,k=p?"":` \xB7 ${sm(m)}`,S;if(c===0)g!==null?S=b+k:S=p?`thinking \xB7 ${Pr(h)}`:`thought \xB7 ${Pr(h)}${k}`;else{let F=c===1?"tool":"tools",J=g!==null?b:p?Pr(h):`took ${Pr(h)}`,Y=[`${c} ${F}`,J];p&&Y.push(`started ${sm(r)}`),p&&l&&f>0&&Y.push(`${f} hidden`),S=Y.join(" \xB7 ")+k}let I=c===0&&p;if(I)return{lines:[{body:""}],rowOwners:[null]};let x=w?"tool-status-cancelled":"tool-status-fail",P=[{prefix:"\u2699 ",prefixStyle:I?"tool-status-running":g!==null?x:"tool",body:S,bodyStyle:I?"tool-status-running":g!==null?x:"status-idle"}],$=[null];for(let F of u){let J=t.get(F);if(J){let Y=Eu(J,m),W=i?.has(F)??!1;for(let Z of Y)Z.hoverSubKey=F,W||(Z.maxWrapRows=C4);if(P.push(...Y),$.push(...Y.map(()=>F)),W){let Z=y0(J);for(let ne of Z)ne.hoverSubKey=F;P.push(...Z),$.push(...Z.map(()=>F))}}}return{lines:P,rowOwners:$}}async function A4(n,e,t,r,s,o,i,a){if(r.terminalHostLauncher&&r.sessionId===void 0&&r.forceNew!==!0&&r.resume!==!0)for(;;){let y=await f$(n,e,t,r,i,o);if(!y)return n.grabInput(!1),null;y.installStatus?.finalize();let v=await uS(y.sessionId==="__new__"?{kind:"new",...r.cwd!==void 0?{cwd:r.cwd}:{},...y.agentId?{agentId:y.agentId}:{},...r.model!==void 0?{model:r.model}:{},...r.initialPrompt!==void 0?{prompt:r.initialPrompt}:{}}:{kind:"attach",sessionId:y.sessionId},[],y.cwd);B(n,"content",`${v}
293
- `),y.sessionId!=="__new__"&&(r.pickerSelect=y.sessionId),delete r.initialPrompt,delete r.initialAttachments}let d=await f$(n,e,t,r,i,o);if(!d)return n.grabInput(!1),ge({src:"grab",site:"runSession.picker-aborted",on:!1}),null;let c=d.resolved?.status==="warm"&&t.isLocal,l=d.sessionId==="__new__"?"Starting new session\u2026":d.isFreshFork?"Forking session\u2026":d.resolved?.status==="warm"?"Attaching to session\u2026":"Resuming session\u2026",u=r.installStatus;r.installStatus&&delete r.installStatus;let f=d.installStatus??u??gg(c?"":l,g_(n));c||f.write(l);let p=t.isLocal?async()=>(await sn(await Be())).wsUrl:t.wsUrl,m=t.isLocal?async()=>["acp.v1",`hydra-acp-token.${(await sn(await Be())).token}`]:["acp.v1",`hydra-acp-token.${t.token}`],h=null,g=null,w=new Wc({url:p,subprotocols:m,onConnect:async y=>{y||h&&await h()},onDisconnect:y=>{g&&g(y)},log:y=>ge({src:"resilient-ws",line:y})}),b=new pn(w);await w.start(),b.onNotification(yp,y=>{let v=zI.safeParse(y);v.success&&f.applyProgress(v.data)});let k=[],S=null,I=!1,x=!1,A=(y,v,C)=>{y&&(S?S(y,v,C):k.push({event:y,rawUpdate:v,recordedAt:C}))},_,P=y=>{y!==_&&(_=y,y!==void 0&&R.appendLines([{prefix:" ",body:`\u2500\u2500 T${y} \u2500\u2500`,bodyStyle:"muted"}]))},$=null,F=null,J=!1,Y=0,W=0,Z=!1,ne=!1,Se,Le=null,Re=null,Ge=!1,Ae=!1,de=null,Ne=!1,at=null,Rt=null,Pe=null,Jt=null,Ve=null,ys=null,Ci=!1,mr=()=>setInterval(()=>{if(Ie===null)return;if(Le===null){at!==null&&Ie.setBanner({});return}let y=ys===null?0:Date.now()-ys;y<l$&&(Ci=!1);let C=at===null&&!za()&&y>=l$;Ie.setBanner({elapsedMs:Date.now()-Le,stalled:C}),C&&!Ci&&(Ci=!0,Ie.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`no output for ${Math.round(y/6e4)}m and nothing running. ^C to cancel`,bodyStyle:"tool-status-fail"}])),sr()},1e3),ce=!1,Je=(y,v,C)=>{let O=W;W=Math.max(0,W+y),ge({src:"pending-turns",delta:y,before:O,after:W,origin:v??null,label:C??null}),y>0&&bM({origin:v??null,label:C});let T=typeof Ie<"u"&&Ie!==null;O===0&&W>0?(ne=!1,Le=Date.now(),ys=Date.now(),Ie?.setSidebarSnapshot({busySince:Le}),dn?.setTurnRunning(!0),T&&Ie.setBanner({status:"busy",elapsedMs:0,stalled:!1}),de===null&&T&&(de=mr())):O>0&&W===0?(ne=!1,er!==null&&(clearTimeout(er),er=null),dt=!1,Le=null,Ge?Re=Date.now():Ae=!0,Ie?.setSidebarSnapshot({busySince:null,lastTurnEndedAt:Re}),ys=null,dn?.setTurnRunning(!1),de!==null&&at===null&&(clearInterval(de),de=null),T&&Ie.setBanner({status:"ready",elapsedMs:void 0,stalled:!1})):W>0&&ne&&(ne=!1,T&&Ie.setBanner({status:"busy",stalled:!1}))},Ie=null,dn=null,za=()=>!1,Lr,Nr,Oo=null,Tg=new Set(["session_info_update","_hydra_current_model_update","current_mode_update","available_commands_update","_hydra_available_modes_update","usage_update","config_option_update","_hydra_compaction","_hydra_workspace","clarifier_question_asked","clarifier_question_answered","clarifier_question_dismissed"]),el=y=>{let{update:v}=y??{},C=NI(y),O=Us(v,{cwd:nt});T4(v,O),ys=Date.now();let T=v?.sessionUpdate;if(typeof T=="string"&&!Tg.has(T)){let N=v??{};typeof N.messageId=="string"&&(Lr=N.messageId);let U=mp(y);U!==void 0&&(Nr=U)}if(T==="prompt_received"){let N=M_(v?.sentBy);Je(1,N.origin,N.label)}else O?.kind==="turn-complete"&&(Je(-1),J=!0);if(T==="permission_resolved"){wf(v);return}if(T==="_hydra_compaction"){to(v);return}if(T==="_hydra_workspace"){Ri(v);return}if(T==="clarifier_question_asked"){let N=v,U=typeof N.question?.question=="string"?N.question.question:"",te=U.length>50?U.slice(0,49)+"\u2026":U;R.notify(te?`new question: ${te} \u2014 ^Q to view`:"new clarifier question \u2014 ^Q to view");return}T==="clarifier_question_answered"||T==="clarifier_question_dismissed"||(A(O,v,C),Ai(v))};b.onNotification("session/update",y=>{if(!I){if(Oo!==null){Oo.push(y);return}el(y)}}),b.onNotification("hydra-acp/session/closed",()=>{if(I)return;W>0&&Je(-W),typeof Ie<"u"&&Ie!==null&&Ie.setBanner({status:"cold",elapsedMs:void 0}),$n()});let ws=new Map,Fo=200,Wt=0,dt=!1,Ka=4e3,er=null;b.onNotification("hydra-acp/prompt_queue/added",y=>{if(I)return;let v=y??{};if(typeof v.messageId!="string")return;if(typeof v._meta?.["hydra-acp"]?.amending=="string"){let O=v.messageId,T=v.prompt,N=setTimeout(()=>{I||(ws.delete(O),Fn.set(O,wd(O,T)),Ie&&dn&&ho())},Fo);ws.set(O,N)}else Fn.set(v.messageId,wd(v.messageId,v.prompt)),Ie&&dn&&ho();if(Br!==void 0&&v.originator?.clientId===Br){let O=Jn.shift();O&&(O.messageId=v.messageId,xs.set(v.messageId,O))}});let Un=(y,v)=>{let C=Fn.get(y);C!==void 0&&(v?C.held=!0:delete C.held,Ie&&dn&&ho())},gn=(y,v)=>{v!==void 0&&Ie?.setSidebarSnapshot({armedTasks:v}),at!==y&&(at=y,Ie?.setBanner({armedSince:y??void 0}),Ie?.setSidebarSnapshot({armedSince:y}),y!==null&&de===null&&Ie!==null&&(de=mr()),y===null&&Le===null&&de!==null&&(clearInterval(de),de=null))};b.onNotification("hydra-acp/session/armed_tasks_updated",y=>{if(I)return;let v=y??{},C=typeof v.count=="number"?v.count:0;gn(C>0&&typeof v.since=="number"?v.since:null,Array.isArray(v.tasks)?cS(v.tasks):void 0)}),b.onNotification("hydra-acp/prompt_queue/held",y=>{if(I)return;let v=y??{};typeof v.messageId=="string"&&Un(v.messageId,!0)}),b.onNotification("hydra-acp/prompt_queue/released",y=>{if(I)return;let v=y??{};typeof v.messageId=="string"&&Un(v.messageId,!1)}),b.onNotification("hydra-acp/prompt_queue/updated",y=>{if(I)return;let v=y??{};if(typeof v.messageId!="string")return;let C=Fn.get(v.messageId);if(C===void 0)return;let O=wd(v.messageId,v.prompt);C.held&&(O.held=!0),Fn.set(v.messageId,O);let T=xs.get(v.messageId);if(T){let N=Array.isArray(v.prompt)?v.prompt:[],U="",te=[];for(let le of N){if(!le||typeof le!="object")continue;let ie=le;ie.type==="text"&&typeof ie.text=="string"?U+=ie.text:ie.type==="image"&&typeof ie.data=="string"&&typeof ie.mimeType=="string"&&te.push({data:ie.data,mimeType:ie.mimeType,sizeBytes:Math.floor(ie.data.length*3/4)})}T.text=U,T.attachments=te}Ie&&dn&&ho()}),b.onNotification("hydra-acp/prompt_queue/removed",y=>{if(I)return;let v=y??{};if(typeof v.messageId!="string")return;v.reason==="started"&&(Se=v.messageId);let C=ws.get(v.messageId);C!==void 0&&(clearTimeout(C),ws.delete(v.messageId)),Fn.delete(v.messageId)&&Ie&&dn&&ho();let T=xs.get(v.messageId);T&&(xs.delete(v.messageId),v.reason==="started"&&(T.flushed=!0,A({kind:"user-text",text:T.displayText,attachments:T.attachments}),Vr=T))}),b.onNotification("hydra-acp/cancel_failed",y=>{if(I)return;let v=y??{};if(!(typeof Ie<"u"&&Ie!==null))return;Wt=Date.now(),dt=!0;let O=typeof v.code=="number"?` (${v.code})`:"",T=typeof v.message=="string"&&v.message.length>0?`: ${v.message}`:"";Ie.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`cancel rejected by agent${O}${T} \u2014 this agent build may not support cancellation. Cancel again to force-stop (restarts the agent).`,bodyStyle:"tool-status-fail"}])}),b.onNotification("hydra-acp/prompt/amended",y=>{if(I)return;let v=y??{};if(typeof v.cancelledMessageId!="string")return;let C=v.cancelledMessageId;Jr.add(C),Vr!==null&&Vr.messageId!==void 0&&Vr.messageId===C&&(A({kind:"turn-complete",stopReason:"cancelled",amended:!0}),Vr=null,Jr.delete(C))});let to=y=>{let v=y??{},C=typeof v.phase=="string"?v.phase:void 0;if(C==="started")R.setCompactionIndicator("compacting...");else if(C==="iteration")R.setCompactionIndicator("compacting...");else if(C==="deferred")R.setCompactionIndicator("compaction queued (waiting for idle)");else if(C==="swapped")R.setCompactionIndicator(null),R.notify("compacted",2e3);else if(C==="rolled_back")R.setCompactionIndicator(null),R.notify("rolled back",2e3);else if(C==="failed"){R.setCompactionIndicator(null);let O=typeof v.error=="string"?v.error:"unknown error",T=O.length>40?O.slice(0,40)+"...":O;R.notify(`compaction failed: ${T}`,5e3)}},Ri=y=>{let v=y??{},C=typeof v.phase=="string"?v.phase:void 0;if(C==="drift"){let N=typeof v.behind=="number"?v.behind:0;R.notify(N>0?`source moved on, ${N} commit(s) ahead \u2014 /hydra workspace sync`:"source moved on \u2014 /hydra workspace sync",6e3);return}if(C==="provisioning"){R.setWorkspaceIndicator("creating workspace...");return}if(C==="setup"){R.setWorkspaceIndicator("running workspace setup...");return}if(C==="swapping"){R.setWorkspaceIndicator("moving session into workspace...");return}if(C==="landing"){R.setWorkspaceIndicator("merging workspace back...");return}if(C==="applying"){R.setWorkspaceIndicator("staging workspace changes...");return}if(C==="returning"){R.setWorkspaceIndicator("returning to source tree...");return}if(C==="failed"){R.setWorkspaceIndicator(null);let N=typeof v.error=="string"?v.error:"unknown error";R.notify(`workspace failed: ${N.length>40?N.slice(0,40)+"...":N}`,5e3);return}if(C!=="entered"&&C!=="left"||(R.setWorkspaceIndicator(null),typeof v.cwd!="string"||v.cwd.length===0))return;nt=v.cwd,Wf=null;let O=typeof v.sourceCwd=="string"?v.sourceCwd:v.cwd,T=typeof v.label=="string"?v.label:void 0;R.setSessionbar({cwd:v.cwd,...C==="entered"&&T!==void 0?{workspace:{label:T,path:v.cwd,sourceCwd:O}}:{workspace:void 0}}),ml(),R.setSidebarSnapshot({workspace:C==="entered"&&T!==void 0?{label:T,path:v.cwd}:null}),R.notify(C==="entered"?`isolated in ${T??"a workspace"}`:"returned to source tree",2e3)},tl=()=>{Rt===null&&(Rt=setInterval(async()=>{try{let y=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(me)}`,{headers:{Authorization:`Bearer ${t.token}`}});if(!y.ok)return;let v=await y.json();v.forkSynthesisState===void 0?(R.setSynthesisIndicator(null),R.notify("synthesis complete",2e3),Rt!==null&&(clearInterval(Rt),Rt=null)):v.forkSynthesisState==="failed"&&(R.setSynthesisIndicator("\u26A0 synthesis failed"),R.notify("synthesis failed \u2014 fork still usable via recall",8e3),Rt!==null&&(clearInterval(Rt),Rt=null))}catch{}},5e3))},Ga=()=>{Rt!==null&&(clearInterval(Rt),Rt=null)},no=()=>{Pe!==null&&(clearInterval(Pe),Pe=null)},$n=()=>{if(Pe!==null)return;let y=!1;Pe=setInterval(async()=>{if(!(y||I)){y=!0;try{let v=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(me)}`,{headers:{Authorization:`Bearer ${t.token}`}});if(!v.ok){v.status===404&&no();return}if((await v.json()).status!=="warm")return;no(),ge({src:"cold-watch",step:"warm-detected",sessionId:me}),h&&await h({skipInitialize:!0,beforeReplay:()=>{Ie?.appendLines([{prefix:" ",body:"-- session resumed by another client, catching up --",bodyStyle:"muted"}])}})}catch{}finally{y=!1}}},w4)},wf=y=>{let v=y??{},C=typeof v.toolCallId=="string"?v.toolCallId:void 0,O;v.outcome&&typeof v.outcome=="object"?O=v.outcome:typeof v.chosenOptionId=="string"&&(O={kind:"selected",optionId:v.chosenOptionId}),yn(C,O?{outcome:O}:void 0)},Ye=null,yn=(y,v)=>{if(!Ye||Ye.toolCallId&&y&&Ye.toolCallId!==y)return;let C=Ye.resolve;Ye=null,R.setPermissionPrompt(null),C(v??{outcome:{outcome:"cancelled"}})},Ai=y=>{if(!Ye?.toolCallId)return;let v=y??{};v.sessionUpdate!=="tool_call"&&v.sessionUpdate!=="tool_call_update"||v.toolCallId===Ye.toolCallId&&(!v.status||v.status==="pending"||yn(v.toolCallId,void 0))},Ti=()=>{if(!Ye){R.setPermissionPrompt(null);return}R.setPermissionPrompt({title:Ye.title,detail:Ye.detail,options:Ye.options.map(y=>({label:y.name})),selectedIndex:Ye.selectedIndex})},ro=y=>{if(!Ye)return;let{options:v,resolve:C}=Ye;if(Ye=null,R.setPermissionPrompt(null),y===null){C({outcome:{outcome:"cancelled"}});return}C({outcome:{outcome:"selected",optionId:y}})};b.onRequest("session/request_permission",async y=>{if(I)return{outcome:{outcome:"cancelled"}};if(r.dangerouslySkipPermissions)return $a(y);let v=y??{},O=(Array.isArray(v.options)?v.options:[]).map(le=>({optionId:le.optionId,name:it(le.name??""),...le.kind!==void 0?{kind:le.kind}:{}})),T=v.toolCall?.title??v.toolCall?.name??"tool",N=it(T),U=it(CE(IE(y))),te=v.toolCall?.toolCallId;return O.length===0?(R.appendLines([{prefix:"\u{1F512} ",body:`Permission requested \xB7 ${N} \xB7 (no options offered, cancelling)`,bodyStyle:"tool-status-fail"}]),{outcome:{outcome:"cancelled"}}):new Promise(le=>{Ye={title:N,detail:U,options:O,selectedIndex:0,resolve:le,toolCallId:te},Ti()})}),b.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}}));let Ei,Ja,In=!0,so=!1,Dr=!1;try{let y=await b.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:He}});Ja=y?.agentInfo?.name,y?.agentCapabilities?.promptCapabilities?.image===!1&&(In=!1),so=Pn(y?._meta??void 0).prompt?.amending===!0,Dr=y?._meta?.steering?.supported===!0}catch{}let me=d.sessionId,It=d.agentId,nt=d.cwd,Xt;t.isLocal||(d.remote=t.display);let bf=d.remote,Wn=Gc(d),jn=null,kf=()=>(jn===null&&(jn=o4(xi.join(d4(),"hydra-remote-exec-"))),jn),Pi=()=>Wn?kf():nt,Mi=d.jumpToRecordedAt,Br,Zt,_i,Lo,Va,Ya,Qa,oo,No,Hr,Xa,io,vf=!1;if(d.sessionId==="__new__"){let y={};r.agentId&&(y.agentId=r.agentId),r.name&&(y.title=r.name),r.model&&(y.model=r.model),r.workspace===!0&&(y.workspace={});let v={cwd:d.cwd,...Object.keys(y).length>0?{_meta:{[ft]:y}}:{}},C;try{C=await fE({request:()=>b.request("session/new",v),showBanner:(N,U,te)=>pE(n,N,U,te,{authenticate:le=>b.request("authenticate",{methodId:le,_meta:{[ft]:{agentId:N}}})}),resolveOnboarding:async N=>{if(N)try{return(await Sa(t)).find(le=>le.id===N)?.onboarding}catch{return}},fallbackAgentId:r.agentId})}catch(N){n.grabInput(!1),ge({src:"grab",site:"runSession.session-new-failed",on:!1}),w.close().catch(()=>{});let U=N instanceof Error?N.message:String(N);ge({src:"session-new-failed",agentId:r.agentId??null,message:U});let te=await I_(n,r.agentId,U,{canGoBack:!r.forceNew});if(te==="cancel")return null;let le={...r};return delete le.sessionId,delete le.resume,te==="retry"?le.forceNew=!0:(delete le.forceNew,delete le.agentId),le}if(C.kind==="cancel")return n.grabInput(!1),ge({src:"grab",site:"runSession.auth-cancel",on:!1}),w.close().catch(()=>{}),null;if(C.kind==="back"){n.grabInput(!1),ge({src:"grab",site:"runSession.auth-back",on:!1}),w.close().catch(()=>{});let N={...r};return delete N.sessionId,delete N.forceNew,delete N.resume,delete N.agentId,N}let O=C.result;f.write(l),me=O.sessionId,xv(me),s.sessionId=me,s.readonly=!1;let T=Pn(O._meta??void 0);T.clientId&&(Br=T.clientId),Ei=T.upstreamSessionId,T.agentId&&(It=T.agentId),T.cwd&&(nt=T.cwd),Zt=T.workspaceInfo,T.title&&(Xt=T.title),_i=T.currentModel,Lo=T.currentMode,No=T.currentUsage,Hr=T.turnStartedAt,Xa=T.armedSince,io=T.armedTaskList,T.availableCommands&&(Va=kh(T.availableCommands)),T.availableModes&&(Ya=T.availableModes),Qa=c$(O.configOptions),oo=T.queue}else{let y={};r.readonly===!0&&(y.readonly=!0),e.tui.toolContent==="references"&&(y.toolContent="references"),r.drip===!0&&(y.replayMode="drip",r.dripSpeed!==void 0&&(y.dripSpeed=r.dripSpeed)),d.resumeHint!==void 0&&(y.resume={upstreamSessionId:d.resumeHint.upstreamSessionId,agentId:d.resumeHint.agentId,cwd:d.resumeHint.cwd});let v=await b.request("session/attach",{sessionId:d.sessionId,historyPolicy:"full",clientInfo:{name:"hydra-acp-tui",version:He},...Object.keys(y).length>0?{_meta:{[ft]:y}}:{}});me=v.sessionId,xv(me),v.clientId&&(Br=v.clientId),s.sessionId=me,s.readonly=r.readonly===!0;let C=Pn(v._meta??void 0);vf=C.resurrected===!0,Ei=C.upstreamSessionId,C.agentId&&(It=C.agentId),C.cwd&&(nt=C.cwd),Zt=C.workspaceInfo,C.title&&(Xt=C.title),_i=C.currentModel,Lo=C.currentMode,No=C.currentUsage,Hr=C.turnStartedAt,Xa=C.armedSince,io=C.armedTaskList,C.availableCommands&&(Va=kh(C.availableCommands)),C.availableModes&&(Ya=C.availableModes),Qa=c$(v.configOptions),oo=C.queue}let Qe=D.tuiHistoryFile(me),$i=D.globalTuiHistoryFile(),en=await su(Qe).catch(()=>[]),tn=await su($i).catch(()=>[]);tn.length>e.tui.promptHistoryMaxEntries&&(tn=tn.slice(tn.length-e.tui.promptHistoryMaxEntries));let ao=[...en],De=new Mo({history:Zp(tn,ao)});dn=De;let qn=!1,Oi=()=>{Ie?.setBanner({hintsExhausted:CR(en.length,e.tui.composer.hintTurns)})},Ur=(y,v)=>{let C=y.replace(/\n+$/,"");if(C.length===0)return;let O=(v??y).replace(/\n+$/,""),T=ou(en,C),N=T!==en;en=T,ao=ou(ao,O);let U=ou(tn,C,e.tui.promptHistoryMaxEntries),te=U!==tn;tn=U,De.setHistory(Zp(tn,ao)),N&&ua(Qe,en).catch(()=>{}),te&&RR($i,C).catch(()=>{}),Oi(),Ie?.clearHintReveal()};W>0&&De.setTurnRunning(!0);let tr=[],Za=null;r_(s_(e.tui.ambiguousWidth,process.env,m$)),b0(e.tui.diffContextLines);let ed=!1,R,Sf=()=>{ed&&(ed=!1,R.start())},Eg=()=>{ed||(ed=!0,R.stop(),process.kill(process.pid,"SIGTSTP"))};process.platform!=="win32"&&process.on("SIGCONT",Sf);let xf=b4(e.tui.openFileCommand);R=new cg({term:n,dispatcher:De,repaintThrottleMs:e.tui.repaintThrottleMs,maxScrollbackLines:e.tui.maxScrollbackLines,mouse:o.mouseEnabled,inAppSelection:o.inAppSelectionEnabled,selectionClipboard:e.tui.selectionClipboard,openFileCommand:xf?.argv,openFileSource:xf?.source,openFileInTerminal:e.tui.openFileInTerminal,progressIndicator:e.tui.progressIndicator,readonly:r.readonly===!0,onSidebarCollapseChange:(y,v)=>{o.sidebarCollapsed=Ie?.sidebarCollapsedIds()??[],!v&&(y==="git"?ml():y==="sessions"?qg():y==="resources"&&FS(),yl())},onSuspend:process.platform!=="win32"?Eg:void 0,onLayoutChange:()=>{PS()},onBlockClick:(y,v,C)=>{rO(y,v,C)},onHydraLinkClick:y=>(Wo(y),!0),onBlockVisible:y=>{z$(y)},onHoverRun:y=>{if(!y.startsWith("thought:"))return null;let v=Ue.get(y);if(v!==void 0&&v.length>0)return new Set(v);let C=R.contiguousRun(y,new Set(ae.keys()));return C.length>0?new Set(C):null},onBarAction:(y,v)=>{if(y==="toggle-mode"){Nf(!0);return}if(y==="rename-session"){cl(v);return}if(y==="choose-model"){fe("model");return}if(y==="choose-agent"){fe("agent");return}if(y==="choose-mode"){fe("mode");return}let C=y==="switch-session"?{type:"switch-session"}:y==="detach"?{type:"exit"}:y==="toggle-options"?{type:"toggle-options"}:{type:"show-help"};r.readonly===!0&&lS(C)||Wi(C)},onFormClick:y=>ll(y),onPermissionClick:y=>Tf(y),onCompactionClick:y=>Li(y),onHelpClick:()=>R.setHelpPrompt(null),onMouse:y=>{if(y.kind!=="press"||y.button!=="middle")return;let v={type:"attachment-request",source:"primary"};r.readonly===!0&&lS(v)||Wi(v)},onKey:y=>{for(let v of y){if(Z&&uo(v)){v.type==="key"&&ge({src:"key-swallowed",site:"compactionPrompt",name:v.name});continue}if(Ye&&Pg(v)){v.type==="key"&&ge({src:"key-swallowed",site:"permission",name:v.name});continue}if(Ni(v)){v.type==="key"&&ge({src:"key-swallowed",site:"help",name:v.name});continue}if(Ui(v)){v.type==="key"&&ge({src:"key-swallowed",site:`form:${On??"none"}`,name:v.name});continue}if(Af(v)){v.type==="key"&&ge({src:"key-swallowed",site:"scrollbackSearch",name:v.name});continue}if(Rf(v)){v.type==="key"&&ge({src:"key-swallowed",site:"completion",name:v.name});continue}if(At(v)){v.type==="key"&&ge({src:"key-swallowed",site:"btwClose",name:v.name});continue}if(v.type==="key"&&v.name==="escape"&&R.isScrolledBack()){R.scrollToBottom();continue}if(v.type==="attachment-paths"){yd(v.paths);continue}if(v.type==="key"&&zn(v.name)){ge({src:"key-swallowed",site:"userHotkey",name:v.name});continue}let C=De.feed(v);for(let O of C)r.readonly===!0&&lS(O)||Wi(O)}nd(),R.setBannerSearchIndicator(De.state().historySearchQuery),R.setAttachments(De.state().attachments),R.refreshPrompt()}}),Ie=R,R.setStickyBottomKey("plan");let If=[{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:"/title",description:"Rename this session: /title [title] (no arg opens the field)"},{name:"/model",description:"Switch model: /model [model-id] (no arg opens the picker)"},{name:"/mode",description:"Switch mode: /mode [mode-id] (no arg opens the picker)"},{name:"/agent",description:"Switch agent: /agent [agent-id] (no arg opens the picker)"},{name:"/btw",description:"Run an ancillary forked session: /btw <prompt> (no args toggles the last overlay)"},{name:"/export",description:"Export this session as a markdown transcript: /export [path]"}],td=Va??[],Do=Ya??[],gr=Qa??[],Cf=()=>{let y=new Set,v=[];for(let C of[...If,...td])y.has(C.name)||(y.add(C.name),v.push(C));return v},nl=()=>{let y=De.state().buffer,v=y[0]??"";if(!v.startsWith("/"))return[];if(y.length>1)return[];let C=v.indexOf(" "),O=C===-1?v:v.slice(0,C);if(O.lastIndexOf("/")>0)return[];let T=Cf().filter(N=>N.name.startsWith(O));return T.length===1&&T[0]?.name===O?[]:T},co=[],nd=()=>{let y=nl();if(y.length>0){co=[],R.setCompletions(y);return}R.setCompletions(co)},Rf=y=>{if(y.type!=="key"||y.name!=="tab")return co.length>0&&(co=[]),!1;let v=nl();if(R.isOverlayOpen()&&v.length===0)return R.toggleFocusedPane(),!0;if(v.length>0){co=[];let C=De.state().buffer[0]??"",O=u_({matches:v.map(T=>T.name),firstLine:C});return O===null||De.replaceFirstLine(O),!0}return rd()},rd=()=>{if(Wn)return!1;let y=De.state(),v=y.buffer[y.row]??"",C=pg(v,y.col);if(C===null)return!1;let O=hg(C.token,nt);return O===null?!1:(O.replacement!==C.token&&De.replaceRangeOnCurrentLine(C.start,y.col,O.replacement),co=O.candidates.length>1?O.candidates.map(T=>({name:T})):[],!0)},At=y=>!R.isOverlayOpen()||y.type!=="key"||y.name!=="escape"&&y.name!=="ctrl-c"?!1:($&&($.cancel(),$=null,F=null),R.closeBtwOverlay(),!0),Af=y=>{if(!R.isScrollbackSearchActive())return y.type==="key"&&y.name==="ctrl-r"&&R.isScrolledBack()?(R.enterScrollbackSearch(),R.updateScrollbackSearchTerm(""),!0):!1;if(y.type==="char"){let v=R.scrollbackSearchTerm()+y.ch;return R.updateScrollbackSearchTerm(v),!0}if(y.type==="paste"){let v=R.scrollbackSearchTerm()+y.text.replace(/\n/g," ");return R.updateScrollbackSearchTerm(v),!0}if(y.type==="key")switch(y.name){case"ctrl-r":return R.advanceScrollbackSearch(),!0;case"ctrl-s":return R.retreatScrollbackSearch(),!0;case"backspace":{let v=R.scrollbackSearchTerm();return v.length===0?R.cancelScrollbackSearch():R.updateScrollbackSearchTerm(v.slice(0,-1)),!0}case"enter":return R.acceptScrollbackSearch(),!0;case"escape":case"ctrl-c":return R.cancelScrollbackSearch(),!0;default:return!0}return!0},Tf=y=>{if(!Ye)return;let v=Ye.options;if(y.kind==="hint"){if(y.action==="cancel"){ro(null);return}ro(v[Ye.selectedIndex]?.optionId??null);return}let C=v[y.index];if(C){if(y.select===!0){Ye.selectedIndex=y.index,Ti();return}ro(C.optionId)}},Pg=y=>{if(!Ye)return!1;let v=Ye.options;if(y.type==="key")switch(y.name){case"up":return Ye.selectedIndex=Math.max(0,Ye.selectedIndex-1),Ti(),!0;case"down":return Ye.selectedIndex=Math.min(v.length-1,Ye.selectedIndex+1),Ti(),!0;case"enter":{let C=v[Ye.selectedIndex];return C&&ro(C.optionId),!0}case"escape":case"ctrl-c":return ro(null),!0;default:return!0}if(y.type==="char"&&/^[1-9]$/.test(y.ch)){let C=parseInt(y.ch,10)-1,O=v[C];return O&&ro(O.optionId),!0}return!0},zn=y=>{let v=e.tui.hotkeys[y];return v?(mg(v,{sessionId:me,cwd:Pi(),agentId:It||Ja||"",baseUrl:t.baseUrl,tokenFile:D.authToken()},{notify:C=>R.notify(C),cwd:Pi(),emitLines:C=>{R.appendLines(C.map(O=>{let T;switch(O.style){case"meta":T="muted";break;case"stderr":case"error":T="tool-status-fail";break;default:T="notice"}return{prefix:" ",body:O.text,bodyStyle:T}}))}}),!0):!1},sd=()=>It||Ja||"?",Ct=sd(),$t={...No??{}};f.finalize(),R.start({skipFullscreen:!0}),R.setHideThoughts(!o.showThoughts),R.setBarConfig({composer:e.tui.composer,sessionbar:e.tui.sessionbar});let Bo=eS(Qu({composer:e.tui.composer,sessionbar:e.tui.sessionbar}),e.tui.scriptRefreshMs),rl=y=>{let v=a.get(y);if(v===void 0)return;let C={HYDRA_ACP_TOKEN:v,HYDRA_ACP_DAEMON_URL:t.baseUrl};return me!==null&&(C.HYDRA_ACP_SESSION_ID=me),C};if(Bo.size>0){let y=R_({cwd:Pi,envFor:rl,onOutput:(v,C)=>R.setScriptOutput(v,C)});Jt=setInterval(()=>{y.poll(Bo,Date.now())},1e3),Jt.unref?.(),y.poll(Bo,Date.now())}let bs=yv(e.tui.sidebar.gadgets);R.setSidebarProcessGadgets(Xm(bs)),R.setSidebarGadgets(bs.map(Qm));let od=uv(bs,e.tui.scriptRefreshMs),id=new Map;for(let y of Xm(bs)){let v=id.get(y.script)??[];v.push(y.id),id.set(y.script,v)}let lo=()=>{let y=new Map;for(let[v,C]of od)(id.get(v)??[]).some(T=>R.isSidebarGadgetActive(T))&&y.set(v,C);return y};if(od.size>0){let y=bg({cwd:Pi,envFor:rl,sanitize:aM,onOutput:(v,C)=>R.setProcessOutput(v,C)});Ve=setInterval(()=>{y.poll(lo(),Date.now())},1e3),Ve.unref?.(),y.poll(lo(),Date.now())}Oi(),R.setSidebarWidth(e.tui.sidebar.width??null),R.setSidebarBorder(e.tui.sidebar.border),R.setSidebarSnapshot({usage:{...$t},model:_i??null,mode:Lo??null,sessionId:me===null?null:ot(me),host:me===null?null:Ns(me)?.name??null,agent:Ct,workspace:Zt===void 0?null:{label:Zt.label,path:Zt.path}}),R.setSessionbar({agent:Ct,cwd:nt,remote:bf,...Zt===void 0?{}:{workspace:{label:Zt.label,path:Zt.path,sourceCwd:Zt.sourceCwd}},sessionId:me,title:Xt,model:_i,usage:{...$t}}),Lo&&R.setBanner({currentMode:Lo}),Nu().then(y=>{y&&R.notify(`\u2728 ${Du(y)}`,3e4)}).catch(()=>{});let jt=null,Fi=new Promise(y=>{jt=y}),sl=()=>{if(b.notify("session/cancel",{sessionId:me}).catch(()=>{}),er===null){let y=Date.now();er=setTimeout(()=>{er=null,W!==0&&(Wt>=y||dt||(dt=!0,Ie?.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"cancel not acknowledged by agent; the turn is still running. Cancel again to force-stop (restarts the agent).",bodyStyle:"tool-status-fail"}])))},Ka)}},Ef=()=>{dt=!1,Ie!==null&&Ie.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"force-stopping agent \u2014 turn aborted; resumes on your next message\u2026",bodyStyle:"tool-status-fail"}]),b.request("hydra-acp/session/force_cancel",{sessionId:me}).catch(()=>{})},ol=()=>{Ie!==null&&W===1&&(ne=!0,Ie.setBanner({status:"cancelling",elapsedMs:void 0,stalled:!1}))},Pf=()=>{let y=tr[0];if(y){y.cancel(),ol();return}if(W>0){dt?Ef():sl(),ol();return}ad()},ad=()=>{gd(0)},Mg=()=>{let y="enqueue prompt (sends now, or queues during a turn)",v="amend the in-flight turn (cancel + replace)";return[...o.defaultEnterAction==="amend"?[["Enter",v],["Ctrl+Enter / Shift+Enter / ^S",y]]:[["Enter",y],["Ctrl+Enter / Shift+Enter / ^S",v]],...k4]},il=()=>{if(R.isHelpPromptActive()){R.setHelpPrompt(null);return}R.setHelpPrompt({title:`Hotkeys \xB7 hydra-acp v${He}`,entries:Mg(),hint:"any key dismisses \xB7 /help lists commands"})},Ho=()=>{Z=!1,R.setCompactionPrompt(null),R.setCompactionIndicator("compaction queued...");let y=me;fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(y)}/compact`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`}}).catch(()=>{})},Wr=()=>{Z=!1,R.setCompactionPrompt(null)},ks=y=>{let v=R.compactionPromptSpec();if(!v)return;let C=v.options.length;if(C===0)return;let O=((v.selectedIndex+y)%C+C)%C;O!==v.selectedIndex&&R.setCompactionPrompt({...v,selectedIndex:O})},Li=y=>{if(!Z)return;let v=R.compactionPromptSpec();if(!v)return;if(y.kind==="hint"){if(y.action==="cancel"){Wr();return}v.options[v.selectedIndex]?.key==="y"?Ho():Wr();return}let C=v.options[y.index];if(C){if(y.select===!0){y.index!==v.selectedIndex&&R.setCompactionPrompt({...v,selectedIndex:y.index});return}C.key==="y"?Ho():Wr()}},uo=y=>{if(!Z)return!1;if(y.type==="key"){if(y.name==="escape")return Wr(),!0;if(y.name==="up")return ks(-1),!0;if(y.name==="down")return ks(1),!0;if(y.name==="enter"){let v=R.compactionPromptSpec();return v?.options[v.selectedIndex]?.key==="y"?Ho():Wr(),!0}}if(y.type==="char"){let v=y.ch.toLowerCase();if(v==="y"||v==="1")return Ho(),!0;if(v==="n"||v==="2")return Wr(),!0}return!0},Ni=y=>R.isHelpPromptActive()?(y.type==="key"&&y.name==="ctrl-g",R.setHelpPrompt(null),!0):!1,dd=["tools","plan","thoughts","diffs","mouse","enter","sidebar","theme"],cd=0,jr=null,qr=[],zr=[],wn=[],Kn=0,On=null,ld=null,Cn=(y,v)=>{y!=="chooser"&&(H=null),On=y,ld=v,R.setFormPrompt(xP(v))},Gn=y=>{On===y&&(On=null,ld=null,H=null,K=new Map,R.setFormPrompt(null))},Mf=y=>{switch(y){case"tools":return o.toolsExpanded?"expanded":"collapsed";case"plan":return o.planExpanded?"expanded":"collapsed";case"thoughts":return o.showThoughts?"shown":"hidden";case"diffs":return o.showFileUpdates;case"mouse":return o.mouseEnabled?"on":"off";case"enter":return o.defaultEnterAction;case"sidebar":return R.isSidebarVisible()?"shown":"hidden";case"theme":return qa}},_f=y=>{switch(y){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";case"sidebar":return"Sidebar";case"theme":return"Theme"}},yr=()=>({title:"Session options",rows:dd.map(y=>({id:y,kind:"select",label:_f(y),value:Mf(y)})),cursor:cd,hints:[{label:"\u2191/\u2193 row"},{label:"\u2190/\u2192 cycle"},{label:"\u23CE next",action:"commit"},{label:"s save default",action:"save"},{label:"Esc close",action:"close"}]}),$f=()=>{On==="options"&&Cn("options",yr())},fo=()=>{if(On==="options"){Gn("options");return}cd=0,Cn("options",yr())},Kr=()=>{jr!==null&&Cn("questions",b$(jr,qr,wn,Kn))},ud=()=>{jr=null,qr=[],zr=[],wn=[],Kn=0,Gn("questions")},_g=async()=>{if(jr!==null){ud();return}try{let v=await b.request(gP,{sessionId:me}),C=f4(v.questions??[]);if(C.length===0){R.notify("no open questions");return}let O=h4(C);jr=O,Kn=0,qr=O.map(T=>p4(T.representative)),zr=O.map(()=>!1),wn=O.map(()=>!1),Kr()}catch(y){R.notify("clarifier unavailable"),ge({src:"questions",step:"list_failed",error:y.message})}},po=()=>{let y=xg.find(C=>C.name===qa);if(y===void 0)return;Yy(y.palette,{...y.overrides,background:Fr,foreground:y$}),ES(),Ng(),Ug(),Oe(),R.fullRedraw();let v=oS(y.palette,qa,Fr);v!==void 0&&R.notify(v)},Di=(y=1)=>{if(xg.length===0){R.notify("no themes available");return}let v=B_(xg.map(C=>C.name),qa,y);v!==void 0&&(qa=v,po())},bn=null,Bi=y=>{bn!==null&&(clearTimeout(bn),bn=null),e.tui.themeBackground===void 0&&(Fr!==void 0&&Fr.kind==="rgb"&&y.kind==="rgb"&&Fr.r===y.r&&Fr.g===y.g&&Fr.b===y.b||(Fr=y,po()))};g$=y=>{e.tui.themeBackground===void 0&&(bn!==null&&clearTimeout(bn),bn=setTimeout(()=>{bn=null,Bi(UM(y))},200),bn.unref?.(),we("\x1B]11;?\x07"))},w$=Bi;let Uo=(y,v=1)=>{switch(y){case"tools":o.toolsExpanded=!o.toolsExpanded,Ft.clear(),Pt.clear(),Ng();break;case"plan":o.planExpanded=!o.planExpanded,Yn=null,Oe();break;case"thoughts":o.showThoughts=!o.showThoughts,R.setHideThoughts(!o.showThoughts);break;case"diffs":o.showFileUpdates=o.showFileUpdates==="diff"?"edit":"diff",wr.clear(),Ug();break;case"mouse":{let C=!R.isMouseEnabled();R.setMouseEnabled(C),o.mouseEnabled=C;break}case"enter":o.defaultEnterAction=o.defaultEnterAction==="amend"?"enqueue":"amend";break;case"sidebar":Yg(!R.isSidebarVisible());break;case"theme":Di(v);break}$f()},nr=y=>{(async()=>{try{switch(y){case"tools":case"plan":R.notify(`${_f(y)} is session-only \u2014 not saved`);return;case"thoughts":await Yi("showThoughts",o.showThoughts);break;case"diffs":await Yi("showFileUpdates",o.showFileUpdates);break;case"mouse":await Yi("mouse",o.mouseEnabled);break;case"enter":await Yi("defaultEnterAction",o.defaultEnterAction);break;case"sidebar":await uy(R.isSidebarVisible());break;case"theme":await Yi("theme",qa);break}R.notify(`saved default: ${_f(y)} ${Mf(y)}`)}catch(v){R.notify(`save failed: ${v instanceof Error?v.message:String(v)}`)}})()},fd=y=>{let v=C=>dd[C];switch(y.type){case"row":{cd=y.row;let C=y.viaDigit===!0?v(y.row):void 0;C?Uo(C):$f();return}case"cycle":{let C=v(y.row);C&&(cd=y.row,Uo(C,y.delta));return}case"advance":{let C=v(y.row);C&&Uo(C);return}case"save":{let C=v(y.row);C&&nr(C);return}case"close":case"cancel":Gn("options");return;default:return}},al=(y,v)=>{if(y.type==="key"){if(y.name==="ctrl-o")return Gn("options"),!0;if(y.name==="ctrl-d")return Gn("options"),!1}return fd(zu(v,y)),!0},pd="title",dl=(y,v)=>{let C=y.rows.find(O=>O.id===v);return C?.kind==="text"?C.editor.text:""},cl=y=>{if(On!=="title"){if(r.readonly===!0){R.notify("view-only: rename disabled");return}if(me==="__new__"){R.notify("no active session to rename");return}Cn("title",CP({title:"Rename session",id:pd,label:"title:",initial:y,hints:[{label:"\u23CE save",action:"commit"},{label:"Esc cancel",action:"close"}]}))}},hd=y=>{let v=dl(y,pd).trim(),C=me;Gn("title"),v.length!==0&&xu(t,C,v).catch(O=>{R.notify(`rename failed: ${O.message}`)})},E=(y,v)=>{switch(v.type){case"commit":hd(y);return;case"close":case"cancel":Gn("title");return;case"edited":Cn("title",y);return;default:return}},M=(y,v)=>(E(v,zu(v,y)),!0),H=null,K=new Map,se=(y,v)=>{let C=y.options.find(N=>N.value===v);if(C)return C.value;let O=v.toLowerCase(),T=y.options.filter(N=>N.value.toLowerCase().startsWith(O));return T.length===1?T[0].value:null},oe=y=>{if(r.readonly===!0)return R.notify(`view-only: ${y} switching disabled`),null;if(me==="__new__")return R.notify("no active session yet"),null;let v=gr.find(C=>C.id===y);return!v||v.options.length===0?(R.notify(`no ${y} option advertised for this session`),null):v},fe=y=>{if(On==="chooser"&&H?.kind==="values"&&H.configId===y)return;let v=oe(y);v&&(H={kind:"values",configId:y},Cn("chooser",kP(v)))},rt=()=>{if(gr.length===0){R.notify("no config options advertised for this session");return}H={kind:"index"},K=new Map,Cn("chooser",Uk(gr,K))},Bt=y=>{Cn("chooser",{...Uk(gr,K),cursor:y})},nn=()=>{let y=new Map(gr.map(v=>[v.id,v.currentValue]));for(let[v,C]of K)y.get(v)!==C&&Ot(v,C);K=new Map},Ot=(y,v)=>{R.notify(`switching ${y} to ${v}\u2026`),b.request("session/set_config_option",{sessionId:me,configId:y,value:v}).catch(C=>{R.notify(`${y} switch failed: ${C instanceof Error?C.message:String(C)}`)})},Ss=(y,v)=>{(async()=>{try{if(y==="agent")await Go(v);else{let C=It||Ja||"";if(!C){R.notify(`can't save a ${y} default without an agent`);return}await Cl(C,y,v)}R.notify(`saved default: ${y} ${v}`)}catch(C){R.notify(`save failed: ${C instanceof Error?C.message:String(C)}`)}})()},md=(y,v)=>{let C=H;if(C===null)return;let O=U=>y.rows[U]?.id,T=U=>{let te=O(U);return te===void 0?void 0:gr.find(le=>le.id===te)},N=U=>K.get(U.id)??U.currentValue;switch(v.type){case"row":Cn("chooser",{...y,cursor:v.row});return;case"cycle":{let U=T(v.row);if(!U)return;K.set(U.id,vP(U,N(U),v.delta)),Bt(v.row);return}case"advance":nn(),Gn("chooser");return;case"commit":{let U=O(v.row);if(C.kind!=="values"||U===void 0)return;Gn("chooser"),Ot(C.configId,U);return}case"save":{if(C.kind==="values"){let te=O(v.row);te!==void 0&&Ss(C.configId,te);return}let U=T(v.row);U&&Ss(U.id,N(U));return}case"close":K=new Map,Gn("chooser");return;case"cancel":K=new Map,Gn("chooser");return;default:return}},Hi=(y,v)=>H===null?!1:(md(v,zu(v,y)),!0),Ui=y=>{let v=ld;if(On===null||v===null)return!1;switch(On){case"questions":return Of(y);case"options":return al(y,v);case"title":return M(y,v);case"chooser":return Hi(y,v)}},ll=y=>{let v=ld;if(!(On===null||v===null))for(let C of IP(v,y))switch(On){case"options":fd(C);break;case"title":E(v,C);break;case"chooser":md(v,C);break;case"questions":ul(jr===null?{type:"noop"}:v$(C,jr,qr,zr,wn,me));break}},ul=y=>{switch(y.type){case"noop":return;case"row":Kn=y.selectedRow,Kr();return;case"cycle":Kn=y.selectedRow,qr[y.selectedRow]=y.newValueIndex,zr[y.selectedRow]=!0,wn[y.selectedRow]=!1,Kr();return;case"dismiss-toggle":{let v=y.selectedRow;wn[v]?(wn[v]=!1,zr[v]=!1):(wn[v]=!0,zr[v]=!0),Kr();return}case"discard":ud();return;case"save":{let v=y.dispatches;if(ud(),v.length===0)return;(async()=>{let C=0,O=0,T=0;for(let U of v)try{await b.request(U.method,U.params),U.type==="dismiss"?O++:C++}catch(te){T++,ge({src:"questions",step:"dispatch_failed",method:U.method,error:te.message})}let N=[];C>0&&N.push(`${C} answered`),O>0&&N.push(`${O} dismissed`),T>0&&N.push(`${T} failed`),N.length>0&&R.notify(`clarifier: ${N.join(", ")}`)})();return}}},Of=y=>jr===null?!1:(ul(y4(y,!0,jr,qr,zr,wn,Kn,me)),!0),rr=()=>{if(!I){I=!0,$?($.cancel(),$=null,F=null):F!==null&&(Ks(t,F).catch(()=>{}),F=null),process.off("SIGINT",Pf),process.platform!=="win32"&&process.off("SIGCONT",Sf),de!==null&&(clearInterval(de),de=null),Rt!==null&&(clearInterval(Rt),Rt=null),no();for(let y of ws.values())clearTimeout(y);ws.clear(),NS(),LS(),Jt!==null&&(clearInterval(Jt),Jt=null),Ve!==null&&(clearInterval(Ve),Ve=null),jn!==null&&(a4(jn,{recursive:!0,force:!0}),jn=null),R.clearWindowTitle(),R.stop({keepFullscreen:!0}),ua(Qe,en).catch(()=>{}),w.close().catch(()=>{})}},gd=(y=0)=>{rr(),jt&&(jt(null),jt=null),y!==0&&process.exit(y)},fl=async()=>{if(ge({src:"switch-session",step:"entered",finishSessionNull:jt===null}),!jt)return;$?($.cancel(),$=null,F=null):F!==null&&(Ks(t,F).catch(()=>{}),F=null),Ga(),no(),R.setSynthesisIndicator(null);let y=De.state().buffer.join(`
293
+ `),y.sessionId!=="__new__"&&(r.pickerSelect=y.sessionId),delete r.initialPrompt,delete r.initialAttachments}let d=await f$(n,e,t,r,i,o);if(!d)return n.grabInput(!1),ge({src:"grab",site:"runSession.picker-aborted",on:!1}),null;let c=d.resolved?.status==="warm"&&t.isLocal,l=d.sessionId==="__new__"?"Starting new session\u2026":d.isFreshFork?"Forking session\u2026":d.resolved?.status==="warm"?"Attaching to session\u2026":"Resuming session\u2026",u=r.installStatus;r.installStatus&&delete r.installStatus;let f=d.installStatus??u??gg(c?"":l,g_(n));c||f.write(l);let p=t.isLocal?async()=>(await sn(await Be())).wsUrl:t.wsUrl,m=t.isLocal?async()=>["acp.v1",`hydra-acp-token.${(await sn(await Be())).token}`]:["acp.v1",`hydra-acp-token.${t.token}`],h=null,g=null,w=new Wc({url:p,subprotocols:m,onConnect:async y=>{y||h&&await h()},onDisconnect:y=>{g&&g(y)},log:y=>ge({src:"resilient-ws",line:y})}),b=new pn(w);await w.start(),b.onNotification(yp,y=>{let v=zI.safeParse(y);v.success&&f.applyProgress(v.data)});let k=[],S=null,I=!1,x=!1,A=(y,v,C)=>{y&&(S?S(y,v,C):k.push({event:y,rawUpdate:v,recordedAt:C}))},_,P=y=>{y!==_&&(_=y,y!==void 0&&R.appendLines([{prefix:" ",body:`\u2500\u2500 T${y} \u2500\u2500`,bodyStyle:"muted"}]))},$=null,F=null,J=!1,Y=0,W=0,Z=!1,ne=!1,Se,Le=null,Re=null,Ge=!1,Ae=!1,de=null,Ne=!1,at=null,Rt=null,Pe=null,Jt=null,Ve=null,ys=null,Ci=!1,mr=()=>setInterval(()=>{if(xe===null)return;if(Le===null){at!==null&&xe.setBanner({});return}let y=ys===null?0:Date.now()-ys;y<l$&&(Ci=!1);let C=at===null&&!za()&&y>=l$;xe.setBanner({elapsedMs:Date.now()-Le,stalled:C}),C&&!Ci&&(Ci=!0,xe.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`no output for ${Math.round(y/6e4)}m and nothing running. ^C to cancel`,bodyStyle:"tool-status-fail"}])),sr()},1e3),ce=!1,Je=(y,v,C)=>{let O=W;W=Math.max(0,W+y),ge({src:"pending-turns",delta:y,before:O,after:W,origin:v??null,label:C??null}),y>0&&bM({origin:v??null,label:C});let T=typeof xe<"u"&&xe!==null;O===0&&W>0?(ne=!1,Le=Date.now(),ys=Date.now(),xe?.setSidebarSnapshot({busySince:Le}),dn?.setTurnRunning(!0),T&&xe.setBanner({status:"busy",elapsedMs:0,stalled:!1}),de===null&&T&&(de=mr())):O>0&&W===0?(ne=!1,er!==null&&(clearTimeout(er),er=null),dt=!1,Le=null,Ge?Re=Date.now():Ae=!0,xe?.setSidebarSnapshot({busySince:null,lastTurnEndedAt:Re}),ys=null,dn?.setTurnRunning(!1),de!==null&&at===null&&(clearInterval(de),de=null),T&&xe.setBanner({status:"ready",elapsedMs:void 0,stalled:!1})):W>0&&ne&&(ne=!1,T&&xe.setBanner({status:"busy",stalled:!1}))},xe=null,dn=null,za=()=>!1,Lr,Nr,Oo=null,Tg=new Set(["session_info_update","_hydra_current_model_update","current_mode_update","available_commands_update","_hydra_available_modes_update","usage_update","config_option_update","_hydra_compaction","_hydra_workspace","clarifier_question_asked","clarifier_question_answered","clarifier_question_dismissed"]),el=y=>{let{update:v}=y??{},C=NI(y),O=Us(v,{cwd:nt});T4(v,O),ys=Date.now();let T=v?.sessionUpdate;if(typeof T=="string"&&!Tg.has(T)){let N=v??{};typeof N.messageId=="string"&&(Lr=N.messageId);let U=mp(y);U!==void 0&&(Nr=U)}if(T==="prompt_received"){let N=M_(v?.sentBy);Je(1,N.origin,N.label)}else O?.kind==="turn-complete"&&(Je(-1),J=!0);if(T==="permission_resolved"){wf(v);return}if(T==="_hydra_compaction"){to(v);return}if(T==="_hydra_workspace"){Ri(v);return}if(T==="clarifier_question_asked"){let N=v,U=typeof N.question?.question=="string"?N.question.question:"",te=U.length>50?U.slice(0,49)+"\u2026":U;R.notify(te?`new question: ${te} \u2014 ^Q to view`:"new clarifier question \u2014 ^Q to view");return}T==="clarifier_question_answered"||T==="clarifier_question_dismissed"||(A(O,v,C),Ai(v))};b.onNotification("session/update",y=>{if(!I){if(Oo!==null){Oo.push(y);return}el(y)}}),b.onNotification("hydra-acp/session/closed",()=>{if(I)return;W>0&&Je(-W),typeof xe<"u"&&xe!==null&&xe.setBanner({status:"cold",elapsedMs:void 0}),$n()});let ws=new Map,Fo=200,Wt=0,dt=!1,Ka=4e3,er=null;b.onNotification("hydra-acp/prompt_queue/added",y=>{if(I)return;let v=y??{};if(typeof v.messageId!="string")return;if(typeof v._meta?.["hydra-acp"]?.amending=="string"){let O=v.messageId,T=v.prompt,N=setTimeout(()=>{I||(ws.delete(O),Fn.set(O,wd(O,T)),xe&&dn&&ho())},Fo);ws.set(O,N)}else Fn.set(v.messageId,wd(v.messageId,v.prompt)),xe&&dn&&ho();if(Br!==void 0&&v.originator?.clientId===Br){let O=Jn.shift();O&&(O.messageId=v.messageId,xs.set(v.messageId,O))}});let Un=(y,v)=>{let C=Fn.get(y);C!==void 0&&(v?C.held=!0:delete C.held,xe&&dn&&ho())},gn=(y,v)=>{v!==void 0&&xe?.setSidebarSnapshot({armedTasks:v}),at!==y&&(at=y,xe?.setBanner({armedSince:y??void 0}),xe?.setSidebarSnapshot({armedSince:y}),y!==null&&de===null&&xe!==null&&(de=mr()),y===null&&Le===null&&de!==null&&(clearInterval(de),de=null))};b.onNotification("hydra-acp/session/armed_tasks_updated",y=>{if(I)return;let v=y??{},C=typeof v.count=="number"?v.count:0;gn(C>0&&typeof v.since=="number"?v.since:null,Array.isArray(v.tasks)?cS(v.tasks):void 0)}),b.onNotification("hydra-acp/prompt_queue/held",y=>{if(I)return;let v=y??{};typeof v.messageId=="string"&&Un(v.messageId,!0)}),b.onNotification("hydra-acp/prompt_queue/released",y=>{if(I)return;let v=y??{};typeof v.messageId=="string"&&Un(v.messageId,!1)}),b.onNotification("hydra-acp/prompt_queue/updated",y=>{if(I)return;let v=y??{};if(typeof v.messageId!="string")return;let C=Fn.get(v.messageId);if(C===void 0)return;let O=wd(v.messageId,v.prompt);C.held&&(O.held=!0),Fn.set(v.messageId,O);let T=xs.get(v.messageId);if(T){let N=Array.isArray(v.prompt)?v.prompt:[],U="",te=[];for(let le of N){if(!le||typeof le!="object")continue;let ie=le;ie.type==="text"&&typeof ie.text=="string"?U+=ie.text:ie.type==="image"&&typeof ie.data=="string"&&typeof ie.mimeType=="string"&&te.push({data:ie.data,mimeType:ie.mimeType,sizeBytes:Math.floor(ie.data.length*3/4)})}T.text=U,T.attachments=te}xe&&dn&&ho()}),b.onNotification("hydra-acp/prompt_queue/removed",y=>{if(I)return;let v=y??{};if(typeof v.messageId!="string")return;v.reason==="started"&&(Se=v.messageId);let C=ws.get(v.messageId);C!==void 0&&(clearTimeout(C),ws.delete(v.messageId)),Fn.delete(v.messageId)&&xe&&dn&&ho();let T=xs.get(v.messageId);T&&(xs.delete(v.messageId),v.reason==="started"&&(T.flushed=!0,A({kind:"user-text",text:T.displayText,attachments:T.attachments}),Vr=T))}),b.onNotification("hydra-acp/cancel_failed",y=>{if(I)return;let v=y??{};if(!(typeof xe<"u"&&xe!==null))return;Wt=Date.now();let O=typeof v.message=="string"&&v.message.length>0?`: ${v.message}`:"";if(v.reason==="unresponsive"){xe.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`agent kept resuming after repeated cancels${O} \u2014 hydra restarted it automatically.`,bodyStyle:"tool-status-fail"}]);return}dt=!0;let T=typeof v.code=="number"?` (${v.code})`:"";xe.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`cancel rejected by agent${T}${O} \u2014 this agent build may not support cancellation. Cancel again to force-stop (restarts the agent).`,bodyStyle:"tool-status-fail"}])}),b.onNotification("hydra-acp/prompt/amended",y=>{if(I)return;let v=y??{};if(typeof v.cancelledMessageId!="string")return;let C=v.cancelledMessageId;Jr.add(C),Vr!==null&&Vr.messageId!==void 0&&Vr.messageId===C&&(A({kind:"turn-complete",stopReason:"cancelled",amended:!0}),Vr=null,Jr.delete(C))});let to=y=>{let v=y??{},C=typeof v.phase=="string"?v.phase:void 0;if(C==="started")R.setCompactionIndicator("compacting...");else if(C==="iteration")R.setCompactionIndicator("compacting...");else if(C==="deferred")R.setCompactionIndicator("compaction queued (waiting for idle)");else if(C==="swapped")R.setCompactionIndicator(null),R.notify("compacted",2e3);else if(C==="rolled_back")R.setCompactionIndicator(null),R.notify("rolled back",2e3);else if(C==="failed"){R.setCompactionIndicator(null);let O=typeof v.error=="string"?v.error:"unknown error",T=O.length>40?O.slice(0,40)+"...":O;R.notify(`compaction failed: ${T}`,5e3)}},Ri=y=>{let v=y??{},C=typeof v.phase=="string"?v.phase:void 0;if(C==="drift"){let N=typeof v.behind=="number"?v.behind:0;R.notify(N>0?`source moved on, ${N} commit(s) ahead \u2014 /hydra workspace sync`:"source moved on \u2014 /hydra workspace sync",6e3);return}if(C==="provisioning"){R.setWorkspaceIndicator("creating workspace...");return}if(C==="setup"){R.setWorkspaceIndicator("running workspace setup...");return}if(C==="swapping"){R.setWorkspaceIndicator("moving session into workspace...");return}if(C==="landing"){R.setWorkspaceIndicator("merging workspace back...");return}if(C==="applying"){R.setWorkspaceIndicator("staging workspace changes...");return}if(C==="returning"){R.setWorkspaceIndicator("returning to source tree...");return}if(C==="failed"){R.setWorkspaceIndicator(null);let N=typeof v.error=="string"?v.error:"unknown error";R.notify(`workspace failed: ${N.length>40?N.slice(0,40)+"...":N}`,5e3);return}if(C!=="entered"&&C!=="left"||(R.setWorkspaceIndicator(null),typeof v.cwd!="string"||v.cwd.length===0))return;nt=v.cwd,Wf=null;let O=typeof v.sourceCwd=="string"?v.sourceCwd:v.cwd,T=typeof v.label=="string"?v.label:void 0;R.setSessionbar({cwd:v.cwd,...C==="entered"&&T!==void 0?{workspace:{label:T,path:v.cwd,sourceCwd:O}}:{workspace:void 0}}),ml(),R.setSidebarSnapshot({workspace:C==="entered"&&T!==void 0?{label:T,path:v.cwd}:null}),R.notify(C==="entered"?`isolated in ${T??"a workspace"}`:"returned to source tree",2e3)},tl=()=>{Rt===null&&(Rt=setInterval(async()=>{try{let y=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(me)}`,{headers:{Authorization:`Bearer ${t.token}`}});if(!y.ok)return;let v=await y.json();v.forkSynthesisState===void 0?(R.setSynthesisIndicator(null),R.notify("synthesis complete",2e3),Rt!==null&&(clearInterval(Rt),Rt=null)):v.forkSynthesisState==="failed"&&(R.setSynthesisIndicator("\u26A0 synthesis failed"),R.notify("synthesis failed \u2014 fork still usable via recall",8e3),Rt!==null&&(clearInterval(Rt),Rt=null))}catch{}},5e3))},Ga=()=>{Rt!==null&&(clearInterval(Rt),Rt=null)},no=()=>{Pe!==null&&(clearInterval(Pe),Pe=null)},$n=()=>{if(Pe!==null)return;let y=!1;Pe=setInterval(async()=>{if(!(y||I)){y=!0;try{let v=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(me)}`,{headers:{Authorization:`Bearer ${t.token}`}});if(!v.ok){v.status===404&&no();return}if((await v.json()).status!=="warm")return;no(),ge({src:"cold-watch",step:"warm-detected",sessionId:me}),h&&await h({skipInitialize:!0,beforeReplay:()=>{xe?.appendLines([{prefix:" ",body:"-- session resumed by another client, catching up --",bodyStyle:"muted"}])}})}catch{}finally{y=!1}}},w4)},wf=y=>{let v=y??{},C=typeof v.toolCallId=="string"?v.toolCallId:void 0,O;v.outcome&&typeof v.outcome=="object"?O=v.outcome:typeof v.chosenOptionId=="string"&&(O={kind:"selected",optionId:v.chosenOptionId}),yn(C,O?{outcome:O}:void 0)},Ye=null,yn=(y,v)=>{if(!Ye||Ye.toolCallId&&y&&Ye.toolCallId!==y)return;let C=Ye.resolve;Ye=null,R.setPermissionPrompt(null),C(v??{outcome:{outcome:"cancelled"}})},Ai=y=>{if(!Ye?.toolCallId)return;let v=y??{};v.sessionUpdate!=="tool_call"&&v.sessionUpdate!=="tool_call_update"||v.toolCallId===Ye.toolCallId&&(!v.status||v.status==="pending"||yn(v.toolCallId,void 0))},Ti=()=>{if(!Ye){R.setPermissionPrompt(null);return}R.setPermissionPrompt({title:Ye.title,detail:Ye.detail,options:Ye.options.map(y=>({label:y.name})),selectedIndex:Ye.selectedIndex})},ro=y=>{if(!Ye)return;let{options:v,resolve:C}=Ye;if(Ye=null,R.setPermissionPrompt(null),y===null){C({outcome:{outcome:"cancelled"}});return}C({outcome:{outcome:"selected",optionId:y}})};b.onRequest("session/request_permission",async y=>{if(I)return{outcome:{outcome:"cancelled"}};if(r.dangerouslySkipPermissions)return $a(y);let v=y??{},O=(Array.isArray(v.options)?v.options:[]).map(le=>({optionId:le.optionId,name:it(le.name??""),...le.kind!==void 0?{kind:le.kind}:{}})),T=v.toolCall?.title??v.toolCall?.name??"tool",N=it(T),U=it(CE(IE(y))),te=v.toolCall?.toolCallId;return O.length===0?(R.appendLines([{prefix:"\u{1F512} ",body:`Permission requested \xB7 ${N} \xB7 (no options offered, cancelling)`,bodyStyle:"tool-status-fail"}]),{outcome:{outcome:"cancelled"}}):new Promise(le=>{Ye={title:N,detail:U,options:O,selectedIndex:0,resolve:le,toolCallId:te},Ti()})}),b.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}}));let Ei,Ja,In=!0,so=!1,Dr=!1;try{let y=await b.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:He}});Ja=y?.agentInfo?.name,y?.agentCapabilities?.promptCapabilities?.image===!1&&(In=!1),so=Pn(y?._meta??void 0).prompt?.amending===!0,Dr=y?._meta?.steering?.supported===!0}catch{}let me=d.sessionId,It=d.agentId,nt=d.cwd,Xt;t.isLocal||(d.remote=t.display);let bf=d.remote,Wn=Gc(d),jn=null,kf=()=>(jn===null&&(jn=o4(xi.join(d4(),"hydra-remote-exec-"))),jn),Pi=()=>Wn?kf():nt,Mi=d.jumpToRecordedAt,Br,Zt,_i,Lo,Va,Ya,Qa,oo,No,Hr,Xa,io,vf=!1;if(d.sessionId==="__new__"){let y={};r.agentId&&(y.agentId=r.agentId),r.name&&(y.title=r.name),r.model&&(y.model=r.model),r.workspace===!0&&(y.workspace={});let v={cwd:d.cwd,...Object.keys(y).length>0?{_meta:{[ft]:y}}:{}},C;try{C=await fE({request:()=>b.request("session/new",v),showBanner:(N,U,te)=>pE(n,N,U,te,{authenticate:le=>b.request("authenticate",{methodId:le,_meta:{[ft]:{agentId:N}}})}),resolveOnboarding:async N=>{if(N)try{return(await Sa(t)).find(le=>le.id===N)?.onboarding}catch{return}},fallbackAgentId:r.agentId})}catch(N){n.grabInput(!1),ge({src:"grab",site:"runSession.session-new-failed",on:!1}),w.close().catch(()=>{});let U=N instanceof Error?N.message:String(N);ge({src:"session-new-failed",agentId:r.agentId??null,message:U});let te=await I_(n,r.agentId,U,{canGoBack:!r.forceNew});if(te==="cancel")return null;let le={...r};return delete le.sessionId,delete le.resume,te==="retry"?le.forceNew=!0:(delete le.forceNew,delete le.agentId),le}if(C.kind==="cancel")return n.grabInput(!1),ge({src:"grab",site:"runSession.auth-cancel",on:!1}),w.close().catch(()=>{}),null;if(C.kind==="back"){n.grabInput(!1),ge({src:"grab",site:"runSession.auth-back",on:!1}),w.close().catch(()=>{});let N={...r};return delete N.sessionId,delete N.forceNew,delete N.resume,delete N.agentId,N}let O=C.result;f.write(l),me=O.sessionId,xv(me),s.sessionId=me,s.readonly=!1;let T=Pn(O._meta??void 0);T.clientId&&(Br=T.clientId),Ei=T.upstreamSessionId,T.agentId&&(It=T.agentId),T.cwd&&(nt=T.cwd),Zt=T.workspaceInfo,T.title&&(Xt=T.title),_i=T.currentModel,Lo=T.currentMode,No=T.currentUsage,Hr=T.turnStartedAt,Xa=T.armedSince,io=T.armedTaskList,T.availableCommands&&(Va=kh(T.availableCommands)),T.availableModes&&(Ya=T.availableModes),Qa=c$(O.configOptions),oo=T.queue}else{let y={};r.readonly===!0&&(y.readonly=!0),e.tui.toolContent==="references"&&(y.toolContent="references"),r.drip===!0&&(y.replayMode="drip",r.dripSpeed!==void 0&&(y.dripSpeed=r.dripSpeed)),d.resumeHint!==void 0&&(y.resume={upstreamSessionId:d.resumeHint.upstreamSessionId,agentId:d.resumeHint.agentId,cwd:d.resumeHint.cwd});let v=await b.request("session/attach",{sessionId:d.sessionId,historyPolicy:"full",clientInfo:{name:"hydra-acp-tui",version:He},...Object.keys(y).length>0?{_meta:{[ft]:y}}:{}});me=v.sessionId,xv(me),v.clientId&&(Br=v.clientId),s.sessionId=me,s.readonly=r.readonly===!0;let C=Pn(v._meta??void 0);vf=C.resurrected===!0,Ei=C.upstreamSessionId,C.agentId&&(It=C.agentId),C.cwd&&(nt=C.cwd),Zt=C.workspaceInfo,C.title&&(Xt=C.title),_i=C.currentModel,Lo=C.currentMode,No=C.currentUsage,Hr=C.turnStartedAt,Xa=C.armedSince,io=C.armedTaskList,C.availableCommands&&(Va=kh(C.availableCommands)),C.availableModes&&(Ya=C.availableModes),Qa=c$(v.configOptions),oo=C.queue}let Qe=D.tuiHistoryFile(me),$i=D.globalTuiHistoryFile(),en=await su(Qe).catch(()=>[]),tn=await su($i).catch(()=>[]);tn.length>e.tui.promptHistoryMaxEntries&&(tn=tn.slice(tn.length-e.tui.promptHistoryMaxEntries));let ao=[...en],De=new Mo({history:Zp(tn,ao)});dn=De;let qn=!1,Oi=()=>{xe?.setBanner({hintsExhausted:CR(en.length,e.tui.composer.hintTurns)})},Ur=(y,v)=>{let C=y.replace(/\n+$/,"");if(C.length===0)return;let O=(v??y).replace(/\n+$/,""),T=ou(en,C),N=T!==en;en=T,ao=ou(ao,O);let U=ou(tn,C,e.tui.promptHistoryMaxEntries),te=U!==tn;tn=U,De.setHistory(Zp(tn,ao)),N&&ua(Qe,en).catch(()=>{}),te&&RR($i,C).catch(()=>{}),Oi(),xe?.clearHintReveal()};W>0&&De.setTurnRunning(!0);let tr=[],Za=null;r_(s_(e.tui.ambiguousWidth,process.env,m$)),b0(e.tui.diffContextLines);let ed=!1,R,Sf=()=>{ed&&(ed=!1,R.start())},Eg=()=>{ed||(ed=!0,R.stop(),process.kill(process.pid,"SIGTSTP"))};process.platform!=="win32"&&process.on("SIGCONT",Sf);let xf=b4(e.tui.openFileCommand);R=new cg({term:n,dispatcher:De,repaintThrottleMs:e.tui.repaintThrottleMs,maxScrollbackLines:e.tui.maxScrollbackLines,mouse:o.mouseEnabled,inAppSelection:o.inAppSelectionEnabled,selectionClipboard:e.tui.selectionClipboard,openFileCommand:xf?.argv,openFileSource:xf?.source,openFileInTerminal:e.tui.openFileInTerminal,progressIndicator:e.tui.progressIndicator,readonly:r.readonly===!0,onSidebarCollapseChange:(y,v)=>{o.sidebarCollapsed=xe?.sidebarCollapsedIds()??[],!v&&(y==="git"?ml():y==="sessions"?qg():y==="resources"&&FS(),yl())},onSuspend:process.platform!=="win32"?Eg:void 0,onLayoutChange:()=>{PS()},onBlockClick:(y,v,C)=>{rO(y,v,C)},onHydraLinkClick:y=>(Wo(y),!0),onBlockVisible:y=>{z$(y)},onHoverRun:y=>{if(!y.startsWith("thought:"))return null;let v=Ue.get(y);if(v!==void 0&&v.length>0)return new Set(v);let C=R.contiguousRun(y,new Set(ae.keys()));return C.length>0?new Set(C):null},onBarAction:(y,v)=>{if(y==="toggle-mode"){Nf(!0);return}if(y==="rename-session"){cl(v);return}if(y==="choose-model"){fe("model");return}if(y==="choose-agent"){fe("agent");return}if(y==="choose-mode"){fe("mode");return}let C=y==="switch-session"?{type:"switch-session"}:y==="detach"?{type:"exit"}:y==="toggle-options"?{type:"toggle-options"}:{type:"show-help"};r.readonly===!0&&lS(C)||Wi(C)},onFormClick:y=>ll(y),onPermissionClick:y=>Tf(y),onCompactionClick:y=>Li(y),onHelpClick:()=>R.setHelpPrompt(null),onMouse:y=>{if(y.kind!=="press"||y.button!=="middle")return;let v={type:"attachment-request",source:"primary"};r.readonly===!0&&lS(v)||Wi(v)},onKey:y=>{for(let v of y){if(Z&&uo(v)){v.type==="key"&&ge({src:"key-swallowed",site:"compactionPrompt",name:v.name});continue}if(Ye&&Pg(v)){v.type==="key"&&ge({src:"key-swallowed",site:"permission",name:v.name});continue}if(Ni(v)){v.type==="key"&&ge({src:"key-swallowed",site:"help",name:v.name});continue}if(Ui(v)){v.type==="key"&&ge({src:"key-swallowed",site:`form:${On??"none"}`,name:v.name});continue}if(Af(v)){v.type==="key"&&ge({src:"key-swallowed",site:"scrollbackSearch",name:v.name});continue}if(Rf(v)){v.type==="key"&&ge({src:"key-swallowed",site:"completion",name:v.name});continue}if(At(v)){v.type==="key"&&ge({src:"key-swallowed",site:"btwClose",name:v.name});continue}if(v.type==="key"&&v.name==="escape"&&R.isScrolledBack()){R.scrollToBottom();continue}if(v.type==="attachment-paths"){yd(v.paths);continue}if(v.type==="key"&&zn(v.name)){ge({src:"key-swallowed",site:"userHotkey",name:v.name});continue}let C=De.feed(v);for(let O of C)r.readonly===!0&&lS(O)||Wi(O)}nd(),R.setBannerSearchIndicator(De.state().historySearchQuery),R.setAttachments(De.state().attachments),R.refreshPrompt()}}),xe=R,R.setStickyBottomKey("plan");let If=[{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:"/title",description:"Rename this session: /title [title] (no arg opens the field)"},{name:"/model",description:"Switch model: /model [model-id] (no arg opens the picker)"},{name:"/mode",description:"Switch mode: /mode [mode-id] (no arg opens the picker)"},{name:"/agent",description:"Switch agent: /agent [agent-id] (no arg opens the picker)"},{name:"/btw",description:"Run an ancillary forked session: /btw <prompt> (no args toggles the last overlay)"},{name:"/export",description:"Export this session as a markdown transcript: /export [path]"}],td=Va??[],Do=Ya??[],gr=Qa??[],Cf=()=>{let y=new Set,v=[];for(let C of[...If,...td])y.has(C.name)||(y.add(C.name),v.push(C));return v},nl=()=>{let y=De.state().buffer,v=y[0]??"";if(!v.startsWith("/"))return[];if(y.length>1)return[];let C=v.indexOf(" "),O=C===-1?v:v.slice(0,C);if(O.lastIndexOf("/")>0)return[];let T=Cf().filter(N=>N.name.startsWith(O));return T.length===1&&T[0]?.name===O?[]:T},co=[],nd=()=>{let y=nl();if(y.length>0){co=[],R.setCompletions(y);return}R.setCompletions(co)},Rf=y=>{if(y.type!=="key"||y.name!=="tab")return co.length>0&&(co=[]),!1;let v=nl();if(R.isOverlayOpen()&&v.length===0)return R.toggleFocusedPane(),!0;if(v.length>0){co=[];let C=De.state().buffer[0]??"",O=u_({matches:v.map(T=>T.name),firstLine:C});return O===null||De.replaceFirstLine(O),!0}return rd()},rd=()=>{if(Wn)return!1;let y=De.state(),v=y.buffer[y.row]??"",C=pg(v,y.col);if(C===null)return!1;let O=hg(C.token,nt);return O===null?!1:(O.replacement!==C.token&&De.replaceRangeOnCurrentLine(C.start,y.col,O.replacement),co=O.candidates.length>1?O.candidates.map(T=>({name:T})):[],!0)},At=y=>!R.isOverlayOpen()||y.type!=="key"||y.name!=="escape"&&y.name!=="ctrl-c"?!1:($&&($.cancel(),$=null,F=null),R.closeBtwOverlay(),!0),Af=y=>{if(!R.isScrollbackSearchActive())return y.type==="key"&&y.name==="ctrl-r"&&R.isScrolledBack()?(R.enterScrollbackSearch(),R.updateScrollbackSearchTerm(""),!0):!1;if(y.type==="char"){let v=R.scrollbackSearchTerm()+y.ch;return R.updateScrollbackSearchTerm(v),!0}if(y.type==="paste"){let v=R.scrollbackSearchTerm()+y.text.replace(/\n/g," ");return R.updateScrollbackSearchTerm(v),!0}if(y.type==="key")switch(y.name){case"ctrl-r":return R.advanceScrollbackSearch(),!0;case"ctrl-s":return R.retreatScrollbackSearch(),!0;case"backspace":{let v=R.scrollbackSearchTerm();return v.length===0?R.cancelScrollbackSearch():R.updateScrollbackSearchTerm(v.slice(0,-1)),!0}case"enter":return R.acceptScrollbackSearch(),!0;case"escape":case"ctrl-c":return R.cancelScrollbackSearch(),!0;default:return!0}return!0},Tf=y=>{if(!Ye)return;let v=Ye.options;if(y.kind==="hint"){if(y.action==="cancel"){ro(null);return}ro(v[Ye.selectedIndex]?.optionId??null);return}let C=v[y.index];if(C){if(y.select===!0){Ye.selectedIndex=y.index,Ti();return}ro(C.optionId)}},Pg=y=>{if(!Ye)return!1;let v=Ye.options;if(y.type==="key")switch(y.name){case"up":return Ye.selectedIndex=Math.max(0,Ye.selectedIndex-1),Ti(),!0;case"down":return Ye.selectedIndex=Math.min(v.length-1,Ye.selectedIndex+1),Ti(),!0;case"enter":{let C=v[Ye.selectedIndex];return C&&ro(C.optionId),!0}case"escape":case"ctrl-c":return ro(null),!0;default:return!0}if(y.type==="char"&&/^[1-9]$/.test(y.ch)){let C=parseInt(y.ch,10)-1,O=v[C];return O&&ro(O.optionId),!0}return!0},zn=y=>{let v=e.tui.hotkeys[y];return v?(mg(v,{sessionId:me,cwd:Pi(),agentId:It||Ja||"",baseUrl:t.baseUrl,tokenFile:D.authToken()},{notify:C=>R.notify(C),cwd:Pi(),emitLines:C=>{R.appendLines(C.map(O=>{let T;switch(O.style){case"meta":T="muted";break;case"stderr":case"error":T="tool-status-fail";break;default:T="notice"}return{prefix:" ",body:O.text,bodyStyle:T}}))}}),!0):!1},sd=()=>It||Ja||"?",Ct=sd(),$t={...No??{}};f.finalize(),R.start({skipFullscreen:!0}),R.setHideThoughts(!o.showThoughts),R.setBarConfig({composer:e.tui.composer,sessionbar:e.tui.sessionbar});let Bo=eS(Qu({composer:e.tui.composer,sessionbar:e.tui.sessionbar}),e.tui.scriptRefreshMs),rl=y=>{let v=a.get(y);if(v===void 0)return;let C={HYDRA_ACP_TOKEN:v,HYDRA_ACP_DAEMON_URL:t.baseUrl};return me!==null&&(C.HYDRA_ACP_SESSION_ID=me),C};if(Bo.size>0){let y=R_({cwd:Pi,envFor:rl,onOutput:(v,C)=>R.setScriptOutput(v,C)});Jt=setInterval(()=>{y.poll(Bo,Date.now())},1e3),Jt.unref?.(),y.poll(Bo,Date.now())}let bs=yv(e.tui.sidebar.gadgets);R.setSidebarProcessGadgets(Xm(bs)),R.setSidebarGadgets(bs.map(Qm));let od=uv(bs,e.tui.scriptRefreshMs),id=new Map;for(let y of Xm(bs)){let v=id.get(y.script)??[];v.push(y.id),id.set(y.script,v)}let lo=()=>{let y=new Map;for(let[v,C]of od)(id.get(v)??[]).some(T=>R.isSidebarGadgetActive(T))&&y.set(v,C);return y};if(od.size>0){let y=bg({cwd:Pi,envFor:rl,sanitize:aM,onOutput:(v,C)=>R.setProcessOutput(v,C)});Ve=setInterval(()=>{y.poll(lo(),Date.now())},1e3),Ve.unref?.(),y.poll(lo(),Date.now())}Oi(),R.setSidebarWidth(e.tui.sidebar.width??null),R.setSidebarBorder(e.tui.sidebar.border),R.setSidebarSnapshot({usage:{...$t},model:_i??null,mode:Lo??null,sessionId:me===null?null:ot(me),host:me===null?null:Ns(me)?.name??null,agent:Ct,workspace:Zt===void 0?null:{label:Zt.label,path:Zt.path}}),R.setSessionbar({agent:Ct,cwd:nt,remote:bf,...Zt===void 0?{}:{workspace:{label:Zt.label,path:Zt.path,sourceCwd:Zt.sourceCwd}},sessionId:me,title:Xt,model:_i,usage:{...$t}}),Lo&&R.setBanner({currentMode:Lo}),Nu().then(y=>{y&&R.notify(`\u2728 ${Du(y)}`,3e4)}).catch(()=>{});let jt=null,Fi=new Promise(y=>{jt=y}),sl=()=>{if(b.notify("session/cancel",{sessionId:me}).catch(()=>{}),er===null){let y=Date.now();er=setTimeout(()=>{er=null,W!==0&&(Wt>=y||dt||(dt=!0,xe?.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"cancel not acknowledged by agent; the turn is still running. Cancel again to force-stop (restarts the agent).",bodyStyle:"tool-status-fail"}])))},Ka)}},Ef=()=>{dt=!1,xe!==null&&xe.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"force-stopping agent \u2014 turn aborted; resumes on your next message\u2026",bodyStyle:"tool-status-fail"}]),b.request("hydra-acp/session/force_cancel",{sessionId:me}).catch(()=>{})},ol=()=>{xe!==null&&W===1&&(ne=!0,xe.setBanner({status:"cancelling",elapsedMs:void 0,stalled:!1}))},Pf=()=>{let y=tr[0];if(y){y.cancel(),ol();return}if(W>0){dt?Ef():sl(),ol();return}ad()},ad=()=>{gd(0)},Mg=()=>{let y="enqueue prompt (sends now, or queues during a turn)",v="amend the in-flight turn (cancel + replace)";return[...o.defaultEnterAction==="amend"?[["Enter",v],["Ctrl+Enter / Shift+Enter / ^S",y]]:[["Enter",y],["Ctrl+Enter / Shift+Enter / ^S",v]],...k4]},il=()=>{if(R.isHelpPromptActive()){R.setHelpPrompt(null);return}R.setHelpPrompt({title:`Hotkeys \xB7 hydra-acp v${He}`,entries:Mg(),hint:"any key dismisses \xB7 /help lists commands"})},Ho=()=>{Z=!1,R.setCompactionPrompt(null),R.setCompactionIndicator("compaction queued...");let y=me;fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(y)}/compact`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`}}).catch(()=>{})},Wr=()=>{Z=!1,R.setCompactionPrompt(null)},ks=y=>{let v=R.compactionPromptSpec();if(!v)return;let C=v.options.length;if(C===0)return;let O=((v.selectedIndex+y)%C+C)%C;O!==v.selectedIndex&&R.setCompactionPrompt({...v,selectedIndex:O})},Li=y=>{if(!Z)return;let v=R.compactionPromptSpec();if(!v)return;if(y.kind==="hint"){if(y.action==="cancel"){Wr();return}v.options[v.selectedIndex]?.key==="y"?Ho():Wr();return}let C=v.options[y.index];if(C){if(y.select===!0){y.index!==v.selectedIndex&&R.setCompactionPrompt({...v,selectedIndex:y.index});return}C.key==="y"?Ho():Wr()}},uo=y=>{if(!Z)return!1;if(y.type==="key"){if(y.name==="escape")return Wr(),!0;if(y.name==="up")return ks(-1),!0;if(y.name==="down")return ks(1),!0;if(y.name==="enter"){let v=R.compactionPromptSpec();return v?.options[v.selectedIndex]?.key==="y"?Ho():Wr(),!0}}if(y.type==="char"){let v=y.ch.toLowerCase();if(v==="y"||v==="1")return Ho(),!0;if(v==="n"||v==="2")return Wr(),!0}return!0},Ni=y=>R.isHelpPromptActive()?(y.type==="key"&&y.name==="ctrl-g",R.setHelpPrompt(null),!0):!1,dd=["tools","plan","thoughts","diffs","mouse","enter","sidebar","theme"],cd=0,jr=null,qr=[],zr=[],wn=[],Kn=0,On=null,ld=null,Cn=(y,v)=>{y!=="chooser"&&(H=null),On=y,ld=v,R.setFormPrompt(xP(v))},Gn=y=>{On===y&&(On=null,ld=null,H=null,K=new Map,R.setFormPrompt(null))},Mf=y=>{switch(y){case"tools":return o.toolsExpanded?"expanded":"collapsed";case"plan":return o.planExpanded?"expanded":"collapsed";case"thoughts":return o.showThoughts?"shown":"hidden";case"diffs":return o.showFileUpdates;case"mouse":return o.mouseEnabled?"on":"off";case"enter":return o.defaultEnterAction;case"sidebar":return R.isSidebarVisible()?"shown":"hidden";case"theme":return qa}},_f=y=>{switch(y){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";case"sidebar":return"Sidebar";case"theme":return"Theme"}},yr=()=>({title:"Session options",rows:dd.map(y=>({id:y,kind:"select",label:_f(y),value:Mf(y)})),cursor:cd,hints:[{label:"\u2191/\u2193 row"},{label:"\u2190/\u2192 cycle"},{label:"\u23CE next",action:"commit"},{label:"s save default",action:"save"},{label:"Esc close",action:"close"}]}),$f=()=>{On==="options"&&Cn("options",yr())},fo=()=>{if(On==="options"){Gn("options");return}cd=0,Cn("options",yr())},Kr=()=>{jr!==null&&Cn("questions",b$(jr,qr,wn,Kn))},ud=()=>{jr=null,qr=[],zr=[],wn=[],Kn=0,Gn("questions")},_g=async()=>{if(jr!==null){ud();return}try{let v=await b.request(gP,{sessionId:me}),C=f4(v.questions??[]);if(C.length===0){R.notify("no open questions");return}let O=h4(C);jr=O,Kn=0,qr=O.map(T=>p4(T.representative)),zr=O.map(()=>!1),wn=O.map(()=>!1),Kr()}catch(y){R.notify("clarifier unavailable"),ge({src:"questions",step:"list_failed",error:y.message})}},po=()=>{let y=xg.find(C=>C.name===qa);if(y===void 0)return;Yy(y.palette,{...y.overrides,background:Fr,foreground:y$}),ES(),Ng(),Ug(),Oe(),R.fullRedraw();let v=oS(y.palette,qa,Fr);v!==void 0&&R.notify(v)},Di=(y=1)=>{if(xg.length===0){R.notify("no themes available");return}let v=B_(xg.map(C=>C.name),qa,y);v!==void 0&&(qa=v,po())},bn=null,Bi=y=>{bn!==null&&(clearTimeout(bn),bn=null),e.tui.themeBackground===void 0&&(Fr!==void 0&&Fr.kind==="rgb"&&y.kind==="rgb"&&Fr.r===y.r&&Fr.g===y.g&&Fr.b===y.b||(Fr=y,po()))};g$=y=>{e.tui.themeBackground===void 0&&(bn!==null&&clearTimeout(bn),bn=setTimeout(()=>{bn=null,Bi(UM(y))},200),bn.unref?.(),we("\x1B]11;?\x07"))},w$=Bi;let Uo=(y,v=1)=>{switch(y){case"tools":o.toolsExpanded=!o.toolsExpanded,Ft.clear(),Pt.clear(),Ng();break;case"plan":o.planExpanded=!o.planExpanded,Yn=null,Oe();break;case"thoughts":o.showThoughts=!o.showThoughts,R.setHideThoughts(!o.showThoughts);break;case"diffs":o.showFileUpdates=o.showFileUpdates==="diff"?"edit":"diff",wr.clear(),Ug();break;case"mouse":{let C=!R.isMouseEnabled();R.setMouseEnabled(C),o.mouseEnabled=C;break}case"enter":o.defaultEnterAction=o.defaultEnterAction==="amend"?"enqueue":"amend";break;case"sidebar":Yg(!R.isSidebarVisible());break;case"theme":Di(v);break}$f()},nr=y=>{(async()=>{try{switch(y){case"tools":case"plan":R.notify(`${_f(y)} is session-only \u2014 not saved`);return;case"thoughts":await Yi("showThoughts",o.showThoughts);break;case"diffs":await Yi("showFileUpdates",o.showFileUpdates);break;case"mouse":await Yi("mouse",o.mouseEnabled);break;case"enter":await Yi("defaultEnterAction",o.defaultEnterAction);break;case"sidebar":await uy(R.isSidebarVisible());break;case"theme":await Yi("theme",qa);break}R.notify(`saved default: ${_f(y)} ${Mf(y)}`)}catch(v){R.notify(`save failed: ${v instanceof Error?v.message:String(v)}`)}})()},fd=y=>{let v=C=>dd[C];switch(y.type){case"row":{cd=y.row;let C=y.viaDigit===!0?v(y.row):void 0;C?Uo(C):$f();return}case"cycle":{let C=v(y.row);C&&(cd=y.row,Uo(C,y.delta));return}case"advance":{let C=v(y.row);C&&Uo(C);return}case"save":{let C=v(y.row);C&&nr(C);return}case"close":case"cancel":Gn("options");return;default:return}},al=(y,v)=>{if(y.type==="key"){if(y.name==="ctrl-o")return Gn("options"),!0;if(y.name==="ctrl-d")return Gn("options"),!1}return fd(zu(v,y)),!0},pd="title",dl=(y,v)=>{let C=y.rows.find(O=>O.id===v);return C?.kind==="text"?C.editor.text:""},cl=y=>{if(On!=="title"){if(r.readonly===!0){R.notify("view-only: rename disabled");return}if(me==="__new__"){R.notify("no active session to rename");return}Cn("title",CP({title:"Rename session",id:pd,label:"title:",initial:y,hints:[{label:"\u23CE save",action:"commit"},{label:"Esc cancel",action:"close"}]}))}},hd=y=>{let v=dl(y,pd).trim(),C=me;Gn("title"),v.length!==0&&xu(t,C,v).catch(O=>{R.notify(`rename failed: ${O.message}`)})},E=(y,v)=>{switch(v.type){case"commit":hd(y);return;case"close":case"cancel":Gn("title");return;case"edited":Cn("title",y);return;default:return}},M=(y,v)=>(E(v,zu(v,y)),!0),H=null,K=new Map,se=(y,v)=>{let C=y.options.find(N=>N.value===v);if(C)return C.value;let O=v.toLowerCase(),T=y.options.filter(N=>N.value.toLowerCase().startsWith(O));return T.length===1?T[0].value:null},oe=y=>{if(r.readonly===!0)return R.notify(`view-only: ${y} switching disabled`),null;if(me==="__new__")return R.notify("no active session yet"),null;let v=gr.find(C=>C.id===y);return!v||v.options.length===0?(R.notify(`no ${y} option advertised for this session`),null):v},fe=y=>{if(On==="chooser"&&H?.kind==="values"&&H.configId===y)return;let v=oe(y);v&&(H={kind:"values",configId:y},Cn("chooser",kP(v)))},rt=()=>{if(gr.length===0){R.notify("no config options advertised for this session");return}H={kind:"index"},K=new Map,Cn("chooser",Uk(gr,K))},Bt=y=>{Cn("chooser",{...Uk(gr,K),cursor:y})},nn=()=>{let y=new Map(gr.map(v=>[v.id,v.currentValue]));for(let[v,C]of K)y.get(v)!==C&&Ot(v,C);K=new Map},Ot=(y,v)=>{R.notify(`switching ${y} to ${v}\u2026`),b.request("session/set_config_option",{sessionId:me,configId:y,value:v}).catch(C=>{R.notify(`${y} switch failed: ${C instanceof Error?C.message:String(C)}`)})},Ss=(y,v)=>{(async()=>{try{if(y==="agent")await Go(v);else{let C=It||Ja||"";if(!C){R.notify(`can't save a ${y} default without an agent`);return}await Cl(C,y,v)}R.notify(`saved default: ${y} ${v}`)}catch(C){R.notify(`save failed: ${C instanceof Error?C.message:String(C)}`)}})()},md=(y,v)=>{let C=H;if(C===null)return;let O=U=>y.rows[U]?.id,T=U=>{let te=O(U);return te===void 0?void 0:gr.find(le=>le.id===te)},N=U=>K.get(U.id)??U.currentValue;switch(v.type){case"row":Cn("chooser",{...y,cursor:v.row});return;case"cycle":{let U=T(v.row);if(!U)return;K.set(U.id,vP(U,N(U),v.delta)),Bt(v.row);return}case"advance":nn(),Gn("chooser");return;case"commit":{let U=O(v.row);if(C.kind!=="values"||U===void 0)return;Gn("chooser"),Ot(C.configId,U);return}case"save":{if(C.kind==="values"){let te=O(v.row);te!==void 0&&Ss(C.configId,te);return}let U=T(v.row);U&&Ss(U.id,N(U));return}case"close":K=new Map,Gn("chooser");return;case"cancel":K=new Map,Gn("chooser");return;default:return}},Hi=(y,v)=>H===null?!1:(md(v,zu(v,y)),!0),Ui=y=>{let v=ld;if(On===null||v===null)return!1;switch(On){case"questions":return Of(y);case"options":return al(y,v);case"title":return M(y,v);case"chooser":return Hi(y,v)}},ll=y=>{let v=ld;if(!(On===null||v===null))for(let C of IP(v,y))switch(On){case"options":fd(C);break;case"title":E(v,C);break;case"chooser":md(v,C);break;case"questions":ul(jr===null?{type:"noop"}:v$(C,jr,qr,zr,wn,me));break}},ul=y=>{switch(y.type){case"noop":return;case"row":Kn=y.selectedRow,Kr();return;case"cycle":Kn=y.selectedRow,qr[y.selectedRow]=y.newValueIndex,zr[y.selectedRow]=!0,wn[y.selectedRow]=!1,Kr();return;case"dismiss-toggle":{let v=y.selectedRow;wn[v]?(wn[v]=!1,zr[v]=!1):(wn[v]=!0,zr[v]=!0),Kr();return}case"discard":ud();return;case"save":{let v=y.dispatches;if(ud(),v.length===0)return;(async()=>{let C=0,O=0,T=0;for(let U of v)try{await b.request(U.method,U.params),U.type==="dismiss"?O++:C++}catch(te){T++,ge({src:"questions",step:"dispatch_failed",method:U.method,error:te.message})}let N=[];C>0&&N.push(`${C} answered`),O>0&&N.push(`${O} dismissed`),T>0&&N.push(`${T} failed`),N.length>0&&R.notify(`clarifier: ${N.join(", ")}`)})();return}}},Of=y=>jr===null?!1:(ul(y4(y,!0,jr,qr,zr,wn,Kn,me)),!0),rr=()=>{if(!I){I=!0,$?($.cancel(),$=null,F=null):F!==null&&(Ks(t,F).catch(()=>{}),F=null),process.off("SIGINT",Pf),process.platform!=="win32"&&process.off("SIGCONT",Sf),de!==null&&(clearInterval(de),de=null),Rt!==null&&(clearInterval(Rt),Rt=null),no();for(let y of ws.values())clearTimeout(y);ws.clear(),NS(),LS(),Jt!==null&&(clearInterval(Jt),Jt=null),Ve!==null&&(clearInterval(Ve),Ve=null),jn!==null&&(a4(jn,{recursive:!0,force:!0}),jn=null),R.clearWindowTitle(),R.stop({keepFullscreen:!0}),ua(Qe,en).catch(()=>{}),w.close().catch(()=>{})}},gd=(y=0)=>{rr(),jt&&(jt(null),jt=null),y!==0&&process.exit(y)},fl=async()=>{if(ge({src:"switch-session",step:"entered",finishSessionNull:jt===null}),!jt)return;$?($.cancel(),$=null,F=null):F!==null&&(Ks(t,F).catch(()=>{}),F=null),Ga(),no(),R.setSynthesisIndicator(null);let y=De.state().buffer.join(`
294
294
  `);y.replace(/\s+$/,"").length>0&&Ur(y),R.pauseRepaint(),R.stop({keepFullscreen:!0}),ua(Qe,en).catch(()=>{});let v=!1,C=null;try{let O=null,T=null,N=await go();for(;O===null;){let ie=await zs(t,{includeNonInteractive:!0}),un=[];try{un=await Sa(t)}catch{}let xt=vn=>lf({cwd:vn,config:N,prefs:o,...r.explicitAgentId!==void 0?{explicitAgentId:r.explicitAgentId}:{},...r.agentId!==void 0?{fallbackAgentId:r.agentId}:{},availableAgents:un}),je=vn=>lf({cwd:vn,config:N,prefs:o,...r.explicitAgentId!==void 0?{explicitAgentId:r.explicitAgentId}:{},availableAgents:un}),{agentId:Ze,model:qe}=await xt(nt),Lt=await Xv(n,{cwd:nt,sessions:ie,config:e,target:t,currentSessionId:me,prefs:i,...Ze?{composerAgentId:Ze}:{},...qe?{composerModel:qe}:{},...un.length>0?{availableAgents:un}:{},onComposerAgentChange:(vn,qi)=>{pf(o,vn,qi)},onCwdChange:je});if(Lt.kind==="abort")return;if(Lt.kind==="exit"){v=!0,gd(0);return}if(Lt.kind==="new"){O={choice:Lt,sessions:ie};break}if(Lt.kind==="fork"){let vn=await C$(n,t,Lt,ie);if(vn.kind==="cancel")return;if(vn.kind==="back")continue;O={choice:{kind:"attach",sessionId:vn.ctx.sessionId,...vn.ctx.agentId?{agentId:vn.ctx.agentId}:{}},sessions:ie},T={readonly:!1,cwd:vn.ctx.cwd},vn.ctx.resumeHint!==void 0&&(T.resumeHint=vn.ctx.resumeHint);break}let Kt=ie.find(vn=>vn.sessionId===Lt.sessionId);if(!(Kt!==void 0&&!!Kt.importedFromMachine&&!Kt.remote&&!Kt.upstreamSessionId&&Lt.readonly!==!0)){if(t.isLocal&&Kt&&!Kt.importedFromMachine&&!Kt.remote&&Lt.readonly!==!0&&!(await qu(Kt.cwd)).ok){Lt.installStatus?.finalize(),delete Lt.installStatus;let qi=await Wa(n,Kt,{defaultCwd:kt(e.defaultCwd),title:"Working directory missing \u2014 choose cwd",intro:"This session's working directory no longer exists. Pick a new one:"});if(qi.kind==="cancel")return;if(qi.kind==="back")continue;O={choice:Lt,sessions:ie},T={readonly:!1,cwd:qi.path,resumeHint:{agentId:Lt.agentId??Kt.agentId??"",cwd:qi.path,upstreamSessionId:""}};break}O={choice:Lt,sessions:ie};break}let US={...r,readonly:!1};Lt.installStatus?.finalize(),delete Lt.installStatus;let wl=await x$(n,t,Kt,Lt,US);if(wl.kind==="cancel")return;wl.kind!=="back"&&(O={choice:Lt,sessions:ie},T={readonly:US.readonly===!0,cwd:wl.ctx.cwd},wl.ctx.resumeHint!==void 0&&(T.resumeHint=wl.ctx.resumeHint))}let{choice:U}=O;if(r.terminalHostLauncher&&(U.kind==="attach"||U.kind==="new")){U.installStatus?.finalize(),delete U.installStatus,C=await uS(U,O.sessions,T?.cwd??nt);return}let te=jt;if(jt=null,rr(),v=!0,U.kind==="new"){let{sessionId:ie,agentId:un,...xt}=r,je={...xt,cwd:U.cwd??nt,forceNew:!0,readonly:!1};U.prompt!==void 0&&(je.initialPrompt=U.prompt),U.attachments&&U.attachments.length>0&&(je.initialAttachments=U.attachments),U.agentId!==void 0&&(je.agentId=U.agentId,pf(o,U.agentId,U.model)),U.model!==void 0&&(je.model=U.model),U.installStatus!==void 0&&(je.installStatus=U.installStatus),te(je);return}if(U.kind!=="attach")return;let le={...r,sessionId:U.sessionId,cwd:T?.cwd??nt,readonly:T?.readonly??U.readonly===!0};U.agentId!==void 0&&(le.agentId=U.agentId),T?.resumeHint!==void 0?le.resumeHint=T.resumeHint:delete le.resumeHint,U.jumpToRecordedAt!==void 0?le.jumpToRecordedAt=U.jumpToRecordedAt:delete le.jumpToRecordedAt,U.installStatus!==void 0?le.installStatus=U.installStatus:delete le.installStatus,te(le)}finally{!v&&jt&&(R.start({skipFullscreen:!0}),R.resumeRepaint(),C&&R.notify(C))}},Gr=async(y="next")=>{if(!jt)return;let v=await zs(t,{status:"warm"});if(v.length<=1)return;let C=v.findIndex(ie=>ie.sessionId===me),N=((C===-1?0:C)+(y==="prev"?-1:1)+v.length)%v.length,U=v[N],te=jt;jt=null,rr();let le={...r,sessionId:U.sessionId,cwd:nt,readonly:!1,resolved:U};U.agentId!==void 0&&(le.agentId=U.agentId),te(le)},Wo=async y=>{if(!jt)return;let v=await zs(t,{includeNonInteractive:!0}),C=y.trim();if(!C){R.notify("usage: /session <id|next|prev>");return}let O=C.startsWith(on)?[C]:[C,on+C],T=v.find(te=>O.includes(te.sessionId));if(!T){let te=v.filter(le=>O.some(ie=>le.sessionId.startsWith(ie)));if(te.length===1)T=te[0];else if(te.length>1){R.notify(`ambiguous session id: ${C} (${te.length} matches)`);return}}if(!T){R.notify(`no session matches: ${C}`);return}if(T.sessionId===me){R.notify("already on that session");return}if(r.terminalHostLauncher){let te=await uS({kind:"attach",sessionId:T.sessionId},v,T.cwd??nt);R.notify(te);return}let N=jt;jt=null,rr();let U={...r,sessionId:T.sessionId,cwd:T.cwd??nt,readonly:!1,resolved:T};T.agentId!==void 0&&(U.agentId=T.agentId),delete U.resumeHint,N(U)},Wi=y=>{switch(y.type){case"send":o.defaultEnterAction==="amend"?Lf(y.text,y.attachments,y.displayText):jo(y.text,y.attachments,y.displayText);return;case"amend":o.defaultEnterAction==="amend"?jo(y.text,y.attachments,y.displayText):Lf(y.text,y.attachments,y.displayText);return;case"queue-edit":{let v=Ff(y.index);if(!v)return;let C=[];y.text.length>0&&C.push({type:"text",text:y.text});for(let O of y.attachments)C.push({type:"image",data:O.data,mimeType:O.mimeType});b.request("hydra-acp/prompt/update",{sessionId:me,messageId:v,prompt:C}).then(O=>{let T=O;if(T.updated||T.reason==="ok"){let N=xs.get(v);N&&(N.text=y.text,N.displayText=y.displayText??y.text,N.attachments=y.attachments)}else R.notify(`queue edit skipped (${T.reason})`)}).catch(O=>{R.notify(`queue edit failed: ${O.message}`)});return}case"queue-remove":{let v=Ff(y.index);if(!v)return;b.request("hydra-acp/prompt/cancel",{sessionId:me,messageId:v}).then(C=>{let O=C;!O.cancelled&&O.reason!=="ok"&&R.notify(`queue cancel skipped (${O.reason})`)}).catch(C=>{R.notify(`queue cancel failed: ${C.message}`)});return}case"cancel":{if(R.isOverlayOpen()){$&&($.cancel(),$=null,F=null),R.closeBtwOverlay();return}let v=tr[0];if(y.prefill&&v){let C=Fn.size===0,O=De.state().buffer.every(T=>T==="");C&&O&&(Za={text:v.text,attachments:v.attachments})}v?v.cancel():W>0&&sl(),ol();return}case"exit":ad();return;case"plan-toggle":Nf(y.on);return;case"redraw-banner":R.setBanner({});return;case"redraw":R.fullRedraw();return;case"scroll-to-top":R.scrollToTop();return;case"scroll-to-bottom":R.scrollToBottom();return;case"switch-session":fl().catch(v=>{ge({src:"switch-session-failed",stack:v instanceof Error?v.stack??v.message:String(v)})});return;case"next-live-session":Gr("next").catch(()=>{});return;case"prev-live-session":Gr("prev").catch(()=>{});return;case"toggle-options":fo();return;case"toggle-sidebar":Yg(!R.isSidebarVisible());return;case"toggle-questions":_g();return;case"toggle-thoughts":o.showThoughts=!o.showThoughts,R.setHideThoughts(!o.showThoughts),R.notify(o.showThoughts?"thoughts shown":"thoughts hidden");return;case"show-help":il();return;case"escalate-search":R.enterScrollbackSearch(),R.updateScrollbackSearchTerm(y.query);return;case"attachment-request":Og(y.source);return;case"edit-in-editor":$g();return}},$g=async()=>{let y=await qm(De.expandedText(),{suspend:()=>R.stop(),resume:()=>R.start(),notify:v=>R.notify(v)});y!==null&&(De.setBuffer(y,De.state().attachments),R.setAttachments(De.state().attachments),R.refreshPrompt())},yd=async y=>{if(!In){R.notify("agent does not accept image attachments");return}let v=0;for(let C of y){if(C.startsWith("data:")){let T=Gk(C);if(!T){R.notify("unsupported data: URI");continue}if(T.sizeBytes>Qs){R.notify(`image too large (${Mr(T.sizeBytes)}, max ${Mr(Qs)})`);continue}De.addAttachment({mimeType:T.mimeType,data:T.data,name:"pasted image",sizeBytes:T.sizeBytes}),v++;continue}let O=Gu(C);if(!O){R.notify(`unsupported image type: ${xi.basename(C)}`);continue}try{let T=await dS.readFile(C);if(T.length>Qs){R.notify(`image too large (${Mr(T.length)}, max ${Mr(Qs)})`);continue}De.addAttachment({mimeType:O,data:T.toString("base64"),name:xi.basename(C),sizeBytes:T.length}),v++}catch(T){R.notify(`cannot read ${xi.basename(C)}: ${T.message}`)}}v>0&&(R.setAttachments(De.state().attachments),R.refreshPrompt())},Og=async(y="clipboard")=>{let v=y==="primary"?await OP():await Hm();if(!v.ok){R.notify(v.reason);return}if(v.kind==="image"){if(!In){R.notify("agent does not accept image attachments");return}De.addAttachment(v.attachment),R.setAttachments(De.state().attachments),R.refreshPrompt();return}let C=De.feed({type:"paste",text:v.text});for(let O of C)Wi(O);R.refreshPrompt()},ji=y=>{let v=y.attachmentCount>0?`${y.text} \xB7 \u{1F4CE}\xD7${y.attachmentCount}`:y.text;return y.held?`\u23F8 ${v}`:v},wd=(y,v)=>{let C=Array.isArray(v)?v:[],O="",T=0;for(let N of C){if(!N||typeof N!="object")continue;let U=N;U.type==="text"&&typeof U.text=="string"?O+=U.text:U.type==="image"&&(T+=1)}return{messageId:y,text:it(O),attachmentCount:T}},Fn=new Map,Jn=[],xs=new Map,Jr=new Set,Vr=null,ho=()=>{let y=[...Fn.values()],v=y.map(ji);R.setQueuedPrompts(v),R.setBanner({queued:y.length}),R.setSidebarSnapshot({queued:y.length}),De.setQueue(y.map(C=>C.text))},Ff=y=>[...Fn.values()][y]?.messageId;if(oo&&oo.length>0){for(let y of oo){if(y.position===0){Se=y.messageId;continue}Fn.set(y.messageId,wd(y.messageId,y.prompt))}Fn.size>0&&ho()}let jo=(y,v,C)=>{R.scrollToBottom(),!bd(y)&&(Ur(y,C),pl(y,v,C))},Vn=(y,v,C)=>{if(R.scrollToBottom(),bd(y))return;if(Ur(y,C),!so||Se===void 0){pl(y,v,C);return}let O=Se,T=[];y.length>0&&T.push({type:"text",text:y});for(let te of v)T.push({type:"image",data:te.data,mimeType:te.mimeType});let N={text:y,displayText:C??y,attachments:v,flushed:!1};Jn.push(N);let U=()=>{let te=Jn.indexOf(N);te>=0&&Jn.splice(te,1),N.messageId!==void 0&&xs.delete(N.messageId)};b.request("hydra-acp/prompt/amend",{sessionId:me,targetMessageId:O,prompt:T}).then(te=>{let le=te;if(le.amended&&le.reason==="ok"){Je(1,"self");return}if(U(),le.reason==="target_completed"){R.notify("previous response finished \u2014 press Enter to send as a new turn"),De.setBuffer(y,v),R.refreshPrompt();return}if(le.reason==="target_cancelled"){R.notify("amend skipped \u2014 previous turn was cancelled"),De.setBuffer(y,v),R.refreshPrompt();return}if(le.reason==="target_not_found"){R.notify("amend skipped \u2014 no matching prompt"),De.setBuffer(y,v),R.refreshPrompt();return}}).catch(te=>{U(),R.notify(`amend failed: ${te.message}`),De.setBuffer(y,v),R.refreshPrompt()})},Lf=(y,v,C)=>{if(R.scrollToBottom(),bd(y))return;if(Ur(y,C),!Dr){Vn(y,v,C);return}let O=[];y.length>0&&O.push({type:"text",text:y});for(let U of v)O.push({type:"image",data:U.data,mimeType:U.mimeType});let T={text:y,displayText:C??y,attachments:v,flushed:!1};Jn.push(T);let N=()=>{let U=Jn.indexOf(T);U>=0&&Jn.splice(U,1),T.messageId!==void 0&&xs.delete(T.messageId)};b.request("_session/steering",{sessionId:me,prompt:O}).then(U=>{let te=U;if(te.outcome==="injected"){let le=Jn.indexOf(T);le>=0&&Jn.splice(le,1),T.flushed=!0,A({kind:"user-text",text:T.displayText,attachments:T.attachments}),Vr=T;return}if(te.outcome==="startedNewTurn"){te.detached!==!0&&Je(1,"self");return}N(),R.notify("steering failed"),De.setBuffer(y,v),R.refreshPrompt()}).catch(U=>{if(U.code===-32601){N(),Vn(y,v,C);return}N(),R.notify(`steering failed: ${U.message}`),De.setBuffer(y,v),R.refreshPrompt()})},Nf=async y=>{if(Do.length===0){R.notify("no modes advertised by agent");return}let v=R.currentModeId(),C=Do.findIndex(N=>N.id===v),O=C===-1?0:(C+1)%Do.length,T=Do[O]?.id;if(T){R.setBanner({currentMode:T});try{await b.request("session/set_mode",{sessionId:me,modeId:T})}catch(N){R.notify(`set_mode failed: ${N.message}`)}}},bd=y=>{let v=y.replace(/\s+$/,"");if(!v.startsWith("/")||v.includes(`
295
- `))return!1;let C=v.indexOf(" "),O=C===-1?v:v.slice(0,C);switch(O){case"/quit":case"/exit":return ad(),!0;case"/clear":return Vt.clear(),Is.clear(),L.length=0,ee.clear(),Me=null,X=null,$e=null,Yr.clear(),wr.clear(),ze.clear(),Ft.clear(),ae.clear(),ut.clear(),Ue.clear(),R.clearScrollback(),!0;case"/help":{let T=[{prefix:" ",body:"Built-in commands:",bodyStyle:"local-heading"}];for(let N of If)T.push({prefix:" ",body:` ${N.name.padEnd(12)} ${N.description??""}`,bodyStyle:"local-item"});if(td.length>0){T.push({prefix:" ",body:"Agent commands:",bodyStyle:"local-heading"});for(let N of td)T.push({prefix:" ",body:` ${N.name.padEnd(12)} ${N.description??""}`,bodyStyle:"local-item"})}return R.appendLines(T),!0}case"/agent":case"/model":case"/mode":{let T=O.slice(1),N=C===-1?"":v.slice(C+1).trim();if(!N)return fe(T),!0;let U=oe(T);if(!U)return!0;let te=se(U,N);return te===null?(R.notify(`unknown ${T}: ${N}`),!0):te===U.currentValue?(R.notify(`already on ${T} ${te}`),!0):(Ot(T,te),!0)}case"/hydra":{let T=C===-1?"":v.slice(C+1).trim(),N=T.length>0?T.split(/\s+/):[];return N[0]!=="config"||N.length>2?!1:N.length===1?(rt(),!0):gr.some(U=>U.id===N[1])?(fe(N[1]),!0):!1}case"/title":{let T=C===-1?"":v.slice(C+1).trim();return T?r.readonly===!0?(R.notify("view-only: rename disabled"),!0):(xu(t,me,T).catch(N=>{R.notify(`rename failed: ${N.message}`)}),!0):(cl(R.sessionTitle()??""),!0)}case"/sessions":return R.appendLines([{prefix:" ",body:"Run `hydra-acp sessions` (or `hydra sessions`) for the full list.",bodyStyle:"notice"}]),!0;case"/resume":return fl().catch(T=>{ge({src:"switch-session-failed",stack:T instanceof Error?T.stack??T.message:String(T)})}),!0;case"/session":{let T=C===-1?"":v.slice(C+1).trim();return T?T==="next"||T==="prev"?(Gr(T).catch(N=>{R.notify(`session ${T} failed: ${N.message}`)}),!0):(Wo(T).catch(N=>{R.notify(`session switch failed: ${N.message}`)}),!0):(fl().catch(N=>{ge({src:"switch-session-failed",stack:N instanceof Error?N.stack??N.message:String(N)})}),!0)}case"/rename":{let T=C===-1?"":v.slice(C+1).trim(),N=T.length>0?`/hydra title ${T}`:"/hydra title";return Ur(v,v),pl(N,[],v),!0}case"/btw":{let T=C===-1?"":v.slice(C+1).trim();if(!T)return R.isOverlayOpen()?($&&($.cancel(),$=null,F=null),R.closeBtwOverlay(),!0):(R.reopenBtwOverlay()||R.appendLines([{prefix:" ",body:"/btw requires a prompt",bodyStyle:"notice-error"}]),!0);if(me==="__new__")return R.appendLines([{prefix:" ",body:"no active session to fork",bodyStyle:"notice-error"}]),!0;Y+=1;let N=Y;$&&($.cancel(),$=null);let U=null;F!==null&&!J?U=F:F!==null&&(Ks(t,F).catch(()=>{}),F=null),J=!1,R.openBtwOverlay(),R.setBtwOverlayStatus({label:"busy",style:"busy"});let te=new Lm({getMaxWidth:()=>{let xt=R.width();return xt>0?xt:void 0}});te.on("changed",()=>{R.setBtwOverlayContent(te.getLines())});let le={};te.append({sessionUpdate:"prompt_received",prompt:[{type:"text",text:T}]});let ie=xt=>{te.append({sessionUpdate:"agent_message_chunk",content:{type:"text",text:xt}})},un={};return U!==null&&(un.reuseSessionId=U),AP(t,me,T,un).then(xt=>{if(N!==Y){xt.cancel();return}$=xt,F=xt.sessionId,R.setBtwOverlayMeta({sessionId:xt.sessionId}),xt.on("event",je=>{if(N===Y)if(je.kind==="update"){te.append(je.update);let Ze=Us(je.update);if(Ze&&Ze.kind==="usage-update"){let qe=!1;Ze.used!==void 0&&le.used!==Ze.used&&(le.used=Ze.used,qe=!0),Ze.size!==void 0&&le.size!==Ze.size&&(le.size=Ze.size,qe=!0),Ze.costAmount!==void 0&&le.costAmount!==Ze.costAmount&&(le.costAmount=Ze.costAmount,qe=!0),Ze.costCurrency!==void 0&&le.costCurrency!==Ze.costCurrency&&(le.costCurrency=Ze.costCurrency,qe=!0),qe&&R.setBtwOverlayMeta({usage:{...le}})}}else je.kind==="completed"?(R.setBtwOverlayStatus({label:"done",style:"done"}),$=null):je.kind==="cancelled"?(R.setBtwOverlayStatus({label:"cancelled",style:"cancelled"}),$=null,F=null):je.kind==="errored"&&(R.setBtwOverlayStatus({label:"errored",style:"errored"}),ie(`btw errored: ${je.error.message}`),F!==null&&Ks(t,F).catch(()=>{}),$=null,F=null)})}).catch(xt=>{if(N!==Y)return;let je=xt instanceof Error?xt.message:String(xt);R.setBtwOverlayStatus({label:"errored",style:"errored"}),ie(`btw startup failed: ${je}`),R.appendLines([{prefix:" ",body:`btw startup failed: ${je}`,bodyStyle:"tool-status-fail"}])}),!0}case"/export":{if(me==="__new__")return R.appendLines([{prefix:" ",body:"no active session to export",bodyStyle:"notice-error"}]),!0;let T=C===-1?"":v.slice(C+1).trim(),N=me;return(async()=>{try{let U=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(N)}/transcript`,{headers:{Authorization:`Bearer ${t.token}`}});if(!U.ok){let je=await U.text().catch(()=>"");R.appendLines([{prefix:" ",body:`/export failed: HTTP ${U.status} ${je}`.trim(),bodyStyle:"notice-error"}]);return}let te=await U.text(),le=new Date().toISOString().replace(/[:.]/g,"-"),ie=`hydra-${ot(N)}-${le}.md`,un=T.length>0?kt(T):ie,xt=xi.resolve(un);await dS.mkdir(xi.dirname(xt),{recursive:!0}),await dS.writeFile(xt,te,{encoding:"utf8",mode:384}),R.appendLines([{prefix:" ",body:`Wrote ${xt}`,bodyStyle:"notice-ok"}])}catch(U){R.appendLines([{prefix:" ",body:`/export failed: ${U.message}`,bodyStyle:"notice-error"}])}})(),!0}default:return!1}},pl=async(y,v,C)=>{let O=[];y.length>0&&O.push({type:"text",text:y});for(let je of v)O.push({type:"image",data:je.data,mimeType:je.mimeType});Je(1,"self");let T={text:y,displayText:C??y,attachments:v,flushed:!1};Jn.push(T),W===1&&(dt=!1);let N=!1,U=!1,te=null,le=je=>{typeof Ie<"u"&&Ie!==null&&Ie.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:je,bodyStyle:"tool-status-fail"}])},ie=!1,un={text:y,attachments:v,cancel:()=>{if(dt){dt=!1,ie=!0,le("force-stopping agent \u2014 turn aborted; resumes on your next message\u2026"),b.request("hydra-acp/session/force_cancel",{sessionId:me}).catch(Ze=>{le(`force-stop failed: ${Ze.message}`)});return}if(N)return;N=!0,b.notify("session/cancel",{sessionId:me}).catch(()=>{});let je=Date.now();te=setTimeout(()=>{U||Wt>=je||(dt=!0,le("cancel not acknowledged by agent \u2014 the turn is still running. Cancel again to force-stop (restarts the agent)."))},Ka)}};tr.push(un);let xt;try{let je=await b.request("session/prompt",{sessionId:me,prompt:O});je&&typeof je.stopReason=="string"&&(xt=je.stopReason)}catch(je){let Ze=Jn.indexOf(T);Ze>=0&&Jn.splice(Ze,1),T.messageId!==void 0&&xs.delete(T.messageId),ie?R.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"turn force-stopped",bodyStyle:"tool-status-fail"}]):R.appendLines([{prefix:"\u2717 ",prefixStyle:"tool-status-fail",body:je.message,bodyStyle:"tool-status-fail"}])}finally{U=!0;let je=tr.indexOf(un);if(je>=0&&tr.splice(je,1),je===0&&tr.length>0&&(dt=!1),te!==null&&(clearTimeout(te),te=null),Je(-1),T.flushed&&Vr===T){let Ze=T.messageId!==void 0&&Jr.has(T.messageId);Ze&&T.messageId!==void 0&&Jr.delete(T.messageId);let qe={kind:"turn-complete"};xt!==void 0&&(qe.stopReason=xt),Ze&&(qe.amended=!0),A(qe),Vr=null}if(Za!==null){let{text:Ze,attachments:qe}=Za;Za=null,De.state().buffer.every(Kt=>Kt==="")&&(De.setBuffer(Ze,qe),R.refreshPrompt())}}},Vt=new Map;za=()=>{for(let y of Vt.values())if(dv(y.status))return!0;return!1};let Yr=new Map,wr=new Map,Is=new Map,L=[],ee=new Map,pe=[],Q=0,ke=`tools:${Q}`,ze=new Map,Ft=new Map,Pt=new Set,cn=new Map,ae=new Map,ut=new Map,Ue=new Map,Me=null,X=null,$e=null,_e=null,vt=null,St=!1,Yn=null,Qr=e.tui.maxToolItems,ln=e.tui.maxPlanItems,Cs=()=>({maxPlanItems:Yn??o.planExpanded?1/0:ln}),qo=y=>{let v=S4(y.entries);St&&(St=!1,x4({stale:!0,hasKey:R.hasKey("plan"),prevFingerprint:vt,fingerprint:v})==="fresh"&&R.clearKey("plan")),vt=v;let C=Ro(y,Cs());C.length>0&&R.upsertLines("plan",[{body:""},...C]);let O=y.entries.length>0&&y.entries.every(T=>(T.status??"pending")==="completed");R.setStickyBottomKey(O?null:"plan")},Oe=()=>{if(_e===null)return;let y=Ro(_e,Cs());y.length>0&&R.upsertLines("plan",[{body:""},...y])},Xe="",kn=null,hl=0,Fg,N$=()=>{if(kn===null)return;let y=R.width(),v=Ao(Xe,y>0?{maxWidth:y}:void 0);v.length!==0&&R.upsertLines(kn,v)},D$=(y,v)=>{y.length!==0&&(kn===null&&(R.ensureSeparator(),kn=`agent:${hl}`,hl+=1,Xe="",Fg=v),Xe+=y,ut.set(kn,Xe),N$())},Xr=()=>{kn=null,Xe="",Fg=void 0},kd="",zo=null,bS=0,Lg,B$=()=>({prefix:" ",body:"\u25B8 Thoughts",bodyStyle:"thought"}),H$=()=>{if(zo===null||kd.length===0)return;let y=Fc(kd);y.length!==0&&R.upsertLines(zo,y)},kS=y=>{let v=ae.get(y);if(v===void 0)return[];let C=Fc(v.text);return v.workerTaskId&&C.unshift({prefix:" ",body:`[T${v.workerTaskId}] `,bodyStyle:"muted"}),C},U$=(y,v)=>{y.length!==0&&(zo===null&&(R.ensureSeparator("thought"),zo=`thought:${bS}`,bS+=1,kd="",Lg=v),kd+=y,ae.set(zo,{text:kd,workerTaskId:v}),H$())},Zr=()=>{Lg=void 0,zo=null,kd=""},vS=y=>R4({...y,collapsedLimit:Qr}),SS=y=>Ft.get(y)??o.toolsExpanded,sr=()=>{if(Me===null)return;let{lines:y,rowOwners:v}=vS({order:L,states:Vt,startedAt:Me,endedAt:X,stopReason:$e,expanded:SS(ke),perToolExpanded:Pt});R.upsertLines(ke,y),cn.set(ke,v)},Df=y=>{let v=ze.get(y);if(!v)return;let{lines:C,rowOwners:O}=vS({order:v.order,states:v.states,startedAt:v.startedAt,endedAt:v.endedAt,stopReason:v.stopReason,expanded:SS(y),perToolExpanded:Pt});R.upsertLines(y,C),cn.set(y,O)},Ng=()=>{Me!==null&&!ze.has(ke)&&sr();for(let y of ze.keys())Df(y)},Dg=()=>{Me!==null&&ze.set(ke,{order:[...L],states:new Map(Vt),startedAt:Me,endedAt:X??Date.now(),stopReason:$e,rowOwners:cn.get(ke)??[]})},xS=y=>{Q+=1,ke=`tools:${Q}`,Me=y??Date.now(),X=null,$e=null,sr()};function W$(y){if(!y||typeof y!="object")return null;let v=y,C=Array.isArray(v.content)?v.content:void 0,O=[],T=N=>{if(typeof N=="string"){O.push({text:Gt(N)});return}if(N&&typeof N=="object"){let U=N;typeof U.__hydraBlob=="string"&&O.push({hash:U.__hydraBlob})}};for(let N of C??[]){if(!N||typeof N!="object")continue;let U=N;if(U.type==="content"&&U.content&&typeof U.content=="object"){let te=U.content;if(te.text!==void 0){T(te.text);continue}}if(U.type==="text"&&U.text!==void 0){T(U.text);continue}U.text!==void 0&&T(U.text)}if(O.length===0)for(let N of lA(v))T(N);return O.length>0?O:null}let IS=(y,v)=>{let C=v.map(N=>"text"in N?N.text:"").join(`
295
+ `))return!1;let C=v.indexOf(" "),O=C===-1?v:v.slice(0,C);switch(O){case"/quit":case"/exit":return ad(),!0;case"/clear":return Vt.clear(),Is.clear(),L.length=0,ee.clear(),Me=null,X=null,$e=null,Yr.clear(),wr.clear(),ze.clear(),Ft.clear(),ae.clear(),ut.clear(),Ue.clear(),R.clearScrollback(),!0;case"/help":{let T=[{prefix:" ",body:"Built-in commands:",bodyStyle:"local-heading"}];for(let N of If)T.push({prefix:" ",body:` ${N.name.padEnd(12)} ${N.description??""}`,bodyStyle:"local-item"});if(td.length>0){T.push({prefix:" ",body:"Agent commands:",bodyStyle:"local-heading"});for(let N of td)T.push({prefix:" ",body:` ${N.name.padEnd(12)} ${N.description??""}`,bodyStyle:"local-item"})}return R.appendLines(T),!0}case"/agent":case"/model":case"/mode":{let T=O.slice(1),N=C===-1?"":v.slice(C+1).trim();if(!N)return fe(T),!0;let U=oe(T);if(!U)return!0;let te=se(U,N);return te===null?(R.notify(`unknown ${T}: ${N}`),!0):te===U.currentValue?(R.notify(`already on ${T} ${te}`),!0):(Ot(T,te),!0)}case"/hydra":{let T=C===-1?"":v.slice(C+1).trim(),N=T.length>0?T.split(/\s+/):[];return N[0]!=="config"||N.length>2?!1:N.length===1?(rt(),!0):gr.some(U=>U.id===N[1])?(fe(N[1]),!0):!1}case"/title":{let T=C===-1?"":v.slice(C+1).trim();return T?r.readonly===!0?(R.notify("view-only: rename disabled"),!0):(xu(t,me,T).catch(N=>{R.notify(`rename failed: ${N.message}`)}),!0):(cl(R.sessionTitle()??""),!0)}case"/sessions":return R.appendLines([{prefix:" ",body:"Run `hydra-acp sessions` (or `hydra sessions`) for the full list.",bodyStyle:"notice"}]),!0;case"/resume":return fl().catch(T=>{ge({src:"switch-session-failed",stack:T instanceof Error?T.stack??T.message:String(T)})}),!0;case"/session":{let T=C===-1?"":v.slice(C+1).trim();return T?T==="next"||T==="prev"?(Gr(T).catch(N=>{R.notify(`session ${T} failed: ${N.message}`)}),!0):(Wo(T).catch(N=>{R.notify(`session switch failed: ${N.message}`)}),!0):(fl().catch(N=>{ge({src:"switch-session-failed",stack:N instanceof Error?N.stack??N.message:String(N)})}),!0)}case"/rename":{let T=C===-1?"":v.slice(C+1).trim(),N=T.length>0?`/hydra title ${T}`:"/hydra title";return Ur(v,v),pl(N,[],v),!0}case"/btw":{let T=C===-1?"":v.slice(C+1).trim();if(!T)return R.isOverlayOpen()?($&&($.cancel(),$=null,F=null),R.closeBtwOverlay(),!0):(R.reopenBtwOverlay()||R.appendLines([{prefix:" ",body:"/btw requires a prompt",bodyStyle:"notice-error"}]),!0);if(me==="__new__")return R.appendLines([{prefix:" ",body:"no active session to fork",bodyStyle:"notice-error"}]),!0;Y+=1;let N=Y;$&&($.cancel(),$=null);let U=null;F!==null&&!J?U=F:F!==null&&(Ks(t,F).catch(()=>{}),F=null),J=!1,R.openBtwOverlay(),R.setBtwOverlayStatus({label:"busy",style:"busy"});let te=new Lm({getMaxWidth:()=>{let xt=R.width();return xt>0?xt:void 0}});te.on("changed",()=>{R.setBtwOverlayContent(te.getLines())});let le={};te.append({sessionUpdate:"prompt_received",prompt:[{type:"text",text:T}]});let ie=xt=>{te.append({sessionUpdate:"agent_message_chunk",content:{type:"text",text:xt}})},un={};return U!==null&&(un.reuseSessionId=U),AP(t,me,T,un).then(xt=>{if(N!==Y){xt.cancel();return}$=xt,F=xt.sessionId,R.setBtwOverlayMeta({sessionId:xt.sessionId}),xt.on("event",je=>{if(N===Y)if(je.kind==="update"){te.append(je.update);let Ze=Us(je.update);if(Ze&&Ze.kind==="usage-update"){let qe=!1;Ze.used!==void 0&&le.used!==Ze.used&&(le.used=Ze.used,qe=!0),Ze.size!==void 0&&le.size!==Ze.size&&(le.size=Ze.size,qe=!0),Ze.costAmount!==void 0&&le.costAmount!==Ze.costAmount&&(le.costAmount=Ze.costAmount,qe=!0),Ze.costCurrency!==void 0&&le.costCurrency!==Ze.costCurrency&&(le.costCurrency=Ze.costCurrency,qe=!0),qe&&R.setBtwOverlayMeta({usage:{...le}})}}else je.kind==="completed"?(R.setBtwOverlayStatus({label:"done",style:"done"}),$=null):je.kind==="cancelled"?(R.setBtwOverlayStatus({label:"cancelled",style:"cancelled"}),$=null,F=null):je.kind==="errored"&&(R.setBtwOverlayStatus({label:"errored",style:"errored"}),ie(`btw errored: ${je.error.message}`),F!==null&&Ks(t,F).catch(()=>{}),$=null,F=null)})}).catch(xt=>{if(N!==Y)return;let je=xt instanceof Error?xt.message:String(xt);R.setBtwOverlayStatus({label:"errored",style:"errored"}),ie(`btw startup failed: ${je}`),R.appendLines([{prefix:" ",body:`btw startup failed: ${je}`,bodyStyle:"tool-status-fail"}])}),!0}case"/export":{if(me==="__new__")return R.appendLines([{prefix:" ",body:"no active session to export",bodyStyle:"notice-error"}]),!0;let T=C===-1?"":v.slice(C+1).trim(),N=me;return(async()=>{try{let U=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(N)}/transcript`,{headers:{Authorization:`Bearer ${t.token}`}});if(!U.ok){let je=await U.text().catch(()=>"");R.appendLines([{prefix:" ",body:`/export failed: HTTP ${U.status} ${je}`.trim(),bodyStyle:"notice-error"}]);return}let te=await U.text(),le=new Date().toISOString().replace(/[:.]/g,"-"),ie=`hydra-${ot(N)}-${le}.md`,un=T.length>0?kt(T):ie,xt=xi.resolve(un);await dS.mkdir(xi.dirname(xt),{recursive:!0}),await dS.writeFile(xt,te,{encoding:"utf8",mode:384}),R.appendLines([{prefix:" ",body:`Wrote ${xt}`,bodyStyle:"notice-ok"}])}catch(U){R.appendLines([{prefix:" ",body:`/export failed: ${U.message}`,bodyStyle:"notice-error"}])}})(),!0}default:return!1}},pl=async(y,v,C)=>{let O=[];y.length>0&&O.push({type:"text",text:y});for(let je of v)O.push({type:"image",data:je.data,mimeType:je.mimeType});Je(1,"self");let T={text:y,displayText:C??y,attachments:v,flushed:!1};Jn.push(T),W===1&&(dt=!1);let N=!1,U=!1,te=null,le=je=>{typeof xe<"u"&&xe!==null&&xe.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:je,bodyStyle:"tool-status-fail"}])},ie=!1,un={text:y,attachments:v,cancel:()=>{if(dt){dt=!1,ie=!0,le("force-stopping agent \u2014 turn aborted; resumes on your next message\u2026"),b.request("hydra-acp/session/force_cancel",{sessionId:me}).catch(Ze=>{le(`force-stop failed: ${Ze.message}`)});return}if(N)return;N=!0,b.notify("session/cancel",{sessionId:me}).catch(()=>{});let je=Date.now();te=setTimeout(()=>{U||Wt>=je||(dt=!0,le("cancel not acknowledged by agent \u2014 the turn is still running. Cancel again to force-stop (restarts the agent)."))},Ka)}};tr.push(un);let xt;try{let je=await b.request("session/prompt",{sessionId:me,prompt:O});je&&typeof je.stopReason=="string"&&(xt=je.stopReason)}catch(je){let Ze=Jn.indexOf(T);Ze>=0&&Jn.splice(Ze,1),T.messageId!==void 0&&xs.delete(T.messageId),ie?R.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"turn force-stopped",bodyStyle:"tool-status-fail"}]):R.appendLines([{prefix:"\u2717 ",prefixStyle:"tool-status-fail",body:je.message,bodyStyle:"tool-status-fail"}])}finally{U=!0;let je=tr.indexOf(un);if(je>=0&&tr.splice(je,1),je===0&&tr.length>0&&(dt=!1),te!==null&&(clearTimeout(te),te=null),Je(-1),T.flushed&&Vr===T){let Ze=T.messageId!==void 0&&Jr.has(T.messageId);Ze&&T.messageId!==void 0&&Jr.delete(T.messageId);let qe={kind:"turn-complete"};xt!==void 0&&(qe.stopReason=xt),Ze&&(qe.amended=!0),A(qe),Vr=null}if(Za!==null){let{text:Ze,attachments:qe}=Za;Za=null,De.state().buffer.every(Kt=>Kt==="")&&(De.setBuffer(Ze,qe),R.refreshPrompt())}}},Vt=new Map;za=()=>{for(let y of Vt.values())if(dv(y.status))return!0;return!1};let Yr=new Map,wr=new Map,Is=new Map,L=[],ee=new Map,pe=[],Q=0,ke=`tools:${Q}`,ze=new Map,Ft=new Map,Pt=new Set,cn=new Map,ae=new Map,ut=new Map,Ue=new Map,Me=null,X=null,$e=null,_e=null,vt=null,St=!1,Yn=null,Qr=e.tui.maxToolItems,ln=e.tui.maxPlanItems,Cs=()=>({maxPlanItems:Yn??o.planExpanded?1/0:ln}),qo=y=>{let v=S4(y.entries);St&&(St=!1,x4({stale:!0,hasKey:R.hasKey("plan"),prevFingerprint:vt,fingerprint:v})==="fresh"&&R.clearKey("plan")),vt=v;let C=Ro(y,Cs());C.length>0&&R.upsertLines("plan",[{body:""},...C]);let O=y.entries.length>0&&y.entries.every(T=>(T.status??"pending")==="completed");R.setStickyBottomKey(O?null:"plan")},Oe=()=>{if(_e===null)return;let y=Ro(_e,Cs());y.length>0&&R.upsertLines("plan",[{body:""},...y])},Xe="",kn=null,hl=0,Fg,N$=()=>{if(kn===null)return;let y=R.width(),v=Ao(Xe,y>0?{maxWidth:y}:void 0);v.length!==0&&R.upsertLines(kn,v)},D$=(y,v)=>{y.length!==0&&(kn===null&&(R.ensureSeparator(),kn=`agent:${hl}`,hl+=1,Xe="",Fg=v),Xe+=y,ut.set(kn,Xe),N$())},Xr=()=>{kn=null,Xe="",Fg=void 0},kd="",zo=null,bS=0,Lg,B$=()=>({prefix:" ",body:"\u25B8 Thoughts",bodyStyle:"thought"}),H$=()=>{if(zo===null||kd.length===0)return;let y=Fc(kd);y.length!==0&&R.upsertLines(zo,y)},kS=y=>{let v=ae.get(y);if(v===void 0)return[];let C=Fc(v.text);return v.workerTaskId&&C.unshift({prefix:" ",body:`[T${v.workerTaskId}] `,bodyStyle:"muted"}),C},U$=(y,v)=>{y.length!==0&&(zo===null&&(R.ensureSeparator("thought"),zo=`thought:${bS}`,bS+=1,kd="",Lg=v),kd+=y,ae.set(zo,{text:kd,workerTaskId:v}),H$())},Zr=()=>{Lg=void 0,zo=null,kd=""},vS=y=>R4({...y,collapsedLimit:Qr}),SS=y=>Ft.get(y)??o.toolsExpanded,sr=()=>{if(Me===null)return;let{lines:y,rowOwners:v}=vS({order:L,states:Vt,startedAt:Me,endedAt:X,stopReason:$e,expanded:SS(ke),perToolExpanded:Pt});R.upsertLines(ke,y),cn.set(ke,v)},Df=y=>{let v=ze.get(y);if(!v)return;let{lines:C,rowOwners:O}=vS({order:v.order,states:v.states,startedAt:v.startedAt,endedAt:v.endedAt,stopReason:v.stopReason,expanded:SS(y),perToolExpanded:Pt});R.upsertLines(y,C),cn.set(y,O)},Ng=()=>{Me!==null&&!ze.has(ke)&&sr();for(let y of ze.keys())Df(y)},Dg=()=>{Me!==null&&ze.set(ke,{order:[...L],states:new Map(Vt),startedAt:Me,endedAt:X??Date.now(),stopReason:$e,rowOwners:cn.get(ke)??[]})},xS=y=>{Q+=1,ke=`tools:${Q}`,Me=y??Date.now(),X=null,$e=null,sr()};function W$(y){if(!y||typeof y!="object")return null;let v=y,C=Array.isArray(v.content)?v.content:void 0,O=[],T=N=>{if(typeof N=="string"){O.push({text:Gt(N)});return}if(N&&typeof N=="object"){let U=N;typeof U.__hydraBlob=="string"&&O.push({hash:U.__hydraBlob})}};for(let N of C??[]){if(!N||typeof N!="object")continue;let U=N;if(U.type==="content"&&U.content&&typeof U.content=="object"){let te=U.content;if(te.text!==void 0){T(te.text);continue}}if(U.type==="text"&&U.text!==void 0){T(U.text);continue}U.text!==void 0&&T(U.text)}if(O.length===0)for(let N of lA(v))T(N);return O.length>0?O:null}let IS=(y,v)=>{let C=v.map(N=>"text"in N?N.text:"").join(`
296
296
  `);if(C.length===0)return;let{text:O,truncated:T}=g0(C);y.resultText=O,y.resultTruncated=T},Bf=new Set,j$=(y,v)=>{!v.some(O=>"hash"in O)||Bf.has(y)||(Bf.add(y),(async()=>{let O=await Promise.all(v.map(async N=>"text"in N?N:{text:await Hg(N.hash)??""}));Bf.delete(y);let T=Vt.get(y);if(!T)for(let N of ze.values()){let U=N.states.get(y);if(U){T=U;break}}if(T){IS(T,O),Vt.has(y)&&sr();for(let[N,U]of ze)U.states.has(y)&&Df(N);R.repaintNow()}})().catch(()=>{Bf.delete(y)}))},Bg=(y,v)=>{let C=v??Vt.get(y);if(C===void 0)return;let O=X_(C,Yr.get(y)??C.editDiff,nt);if(O===null){ee.delete(y);return}ee.set(y,O)},CS=(y,v,C,O,T,N,U,te,le,ie,un,xt)=>{let je=!Vt.has(y),Ze=Vt.get(y),qe=Ze??{initialTitle:v??"tool",latestTitle:v??"tool",status:C??"pending",startedAt:xt??Date.now()};if(!Ze&&le!==void 0&&(qe.workerTaskId=le),un!==void 0&&qe.rawKind===void 0&&(qe.rawKind=un),Ze&&v!==void 0&&(qe.latestTitle=v),N!==void 0&&qe.detail===void 0&&(qe.detail=N),U!==void 0&&qe.detailFull===void 0&&(qe.detailFull=U),te!==void 0&&te.length>0&&(qe.locations=te),Ze&&C!==void 0&&(qe.status=C),Ze||(qe.status=C??"pending"),qe.endedAt===void 0&&Qb(qe.status)&&(qe.endedAt=xt??Date.now(),qe.startedAt!==void 0&&qe.endedAt<qe.startedAt&&(qe.endedAt=qe.startedAt),Vg()),O!==void 0&&(qe.errorText=O),T!==void 0&&(qe.editDiff=T),ie!==void 0){let Kt=Sb(ie);Kt!==void 0&&(qe.resultSummary=Kt)}if(ie!==void 0){let Kt=W$(ie);Kt!==null&&(IS(qe,Kt),Kt.some(HS=>"hash"in HS)&&j$(y,Kt))}Vt.set(y,qe),Bg(y,qe);let Lt=t$(ie);Lt!==null&&(pe=Lt,Vg(),Lt.length>0&&qo({kind:"plan",entries:Lt})),je&&(Me===null&&(Q+=1,ke=`tools:${Q}`,Me=Date.now(),X=null,$e=null),L.push(y),R.isSidebarVisible()&&yl())},Hg=async y=>{try{let v=await b.request("hydra-acp/session/tool_content",{sessionId:me,hash:y});return typeof v?.content=="string"?v.content:null}catch{return null}},Hf=new Set,q$=(y,v)=>{Hf.has(y)||v.oldRef===void 0&&v.newRef===void 0||(Hf.add(y),(async()=>{let[C,O]=await Promise.all([v.oldRef?Hg(v.oldRef.hash):Promise.resolve(v.oldText),v.newRef?Hg(v.newRef.hash):Promise.resolve(v.newText)]);if(v.oldRef!==void 0&&C===null||v.newRef!==void 0&&O===null){Hf.delete(y);let ie=AS(y,v,Jb(v,"diff",{deferredStatus:"error"}));ie.length>0&&(R.upsertLines(`editdiff:${y}`,ie),R.repaintNow());return}let N={...v.path!==void 0?{path:v.path}:{},oldText:C??"",newText:O??""};Yr.set(y,N);let U=Vt.get(y);U?.editDiff&&(U.editDiff=N),Bg(y),Hf.delete(y);let te=wr.get(y),le=te===void 0?o.showFileUpdates:te?"diff":"edit";le!=="none"&&(Uf(y,N,le==="diff"?"diff":"edit"),R.repaintNow())})())},RS=new Map,AS=(y,v,C)=>{let O=RS.get(y);return O===void 0&&(O=Vt.get(y)?.locations?.[0]?.line??nO(v),RS.set(y,O)),O===null?C:C.map(T=>T.links===void 0?T:{...T,links:T.links.map(N=>({...N,url:`${N.url}#L${O}`}))})},Uf=(y,v,C)=>{let O=`editdiff:${y}`,T=AS(y,v,Jb(v,C));if(T.length===0){R.removeKey(O);return}R.upsertLines(O,T),C==="diff"&&(v.oldRef!==void 0||v.newRef!==void 0)&&R.notifyWhenVisible(O)},z$=y=>{if(!y.startsWith("editdiff:"))return;let v=y.slice(9),C=Yr.get(v);C&&(C.oldRef!==void 0||C.newRef!==void 0)&&q$(v,C)},TS=y=>{let v=`editdiff:${y}`,C=o.showFileUpdates,O=Vt.get(y),T;if(C==="none"||!O?.editDiff||O.status!=="completed")T=null;else{let U=wr.get(y);T=U!==void 0?U?"diff":"edit":C==="diff"?"diff":"edit"}if(T===null){R.removeKey(v);return}let N=O.editDiff;Yr.set(y,N),Bg(y),Uf(y,N,T)},Ug=()=>{let y=o.showFileUpdates;for(let[v,C]of Yr){let O=`editdiff:${v}`,T=wr.get(v),N=T===void 0?y:T?"diff":"edit";if(N==="none"){R.removeKey(O);continue}Uf(v,C,N==="diff"?"diff":"edit")}},ES=()=>{let y=R.width(),v=y>0?{maxWidth:y}:void 0;for(let[O,T]of ut){let N=Ao(T,v);N.length>0&&R.upsertLines(O,N)}let C=new Set;for(let O of Ue.values())for(let T of O)C.add(T);for(let O of ae.keys()){if(C.has(O))continue;let T=kS(O);T.length>0&&R.upsertLines(O,T)}},PS=()=>{R.isSidebarOverlay()||(Ng(),Ug(),Oe(),ES())},Wg=!1,Wf=null,MS=y=>{d$("git",["status","--porcelain=v2","--branch"],{cwd:y,timeout:3e3,maxBuffer:4*1024*1024},(v,C)=>{Wg=!1,R.setSidebarSnapshot({git:v?null:Y_(C,Wf)})})},ml=()=>{if(Wg||nt===null)return;if(Wn){R.setSidebarSnapshot({git:null});return}let y=nt;if(Wg=!0,Wf!==null){MS(y);return}d$("git",["rev-parse","--show-toplevel"],{cwd:y,timeout:3e3},(v,C)=>{v||(Wf=C.trim()||null),MS(y)})},jg=!1,qg=()=>{jg||(jg=!0,(async()=>{try{let y=await zs(t,{status:"warm"}),v=[];for(let C of y)C.sessionId!==me&&v.push({sessionId:C.sessionId,label:C.title!==void 0&&C.title.length>0?C.title:ot(C.sessionId),busy:C.busy===!0,armed:(C.armedTasks??0)>0,blocked:C.awaitingInput===!0});R.setSidebarSnapshot({liveSessions:v})}catch{}finally{jg=!1}})())},K$="hydra",G$="agent",jf=null,zg=!1,qf=null,gl=null,Kg=null,Gg=!1,_S=(()=>{try{let y=new URL(t.baseUrl).hostname;return y==="127.0.0.1"||y==="localhost"||y==="::1"||y==="[::1]"}catch{return!1}})(),$S=()=>{Gg||me===null||(Gg=!0,(async()=>{try{let y=await fetch(`${t.baseUrl}/v1/sessions/${encodeURIComponent(me)}`,{headers:{Authorization:`Bearer ${t.token}`}});if(y.ok){let v=await y.json();Kg=typeof v.agentPid=="number"?v.agentPid:null}}catch{}finally{Gg=!1}})())},OS=()=>{zg||(zg=!0,(async()=>{try{let y=[],v=process.cpuUsage(),C=Date.now();y.push({label:K$,rssBytes:process.memoryUsage.rss(),cpuFraction:s$(v,qf,gl===null?0:C-gl),processes:1}),qf=v,gl=C;let O=Kg;if(O!==null){let T=await i$([O]),N=o$(T,jf,O);N!==null&&y.push({label:G$,...N}),jf=T}R.setSidebarSnapshot({resources:y})}finally{zg=!1}})())},FS=()=>{R.isSidebarGadgetActive("resources")&&(jf=null,qf=null,gl=null,_S&&$S(),OS())},J$=()=>{jf=null,qf=null,gl=null,Kg=null,R.setSidebarSnapshot({resources:[]})},V$=()=>{R.isSidebarGadgetActive("sessions")&&qg()},Y$=()=>{R.setSidebarSnapshot({liveSessions:[]})},Q$=()=>{R.isSidebarGadgetActive("git")&&ml()},LS=()=>{R.setSidebarSnapshot({git:null})},X$=5,vd=null,Jg=0,Z$=()=>{vd===null&&(Jg=0,vd=setInterval(()=>{Jg++;let y=Jg%X$===0;(Le!==null||y)&&yl(),y&&R.isSidebarGadgetActive("git")&&ml(),y&&R.isSidebarGadgetActive("sessions")&&qg(),y&&R.isSidebarGadgetActive("resources")&&(_S&&$S(),OS())},1e3),vd.unref?.())},NS=()=>{vd!==null&&(clearInterval(vd),vd=null)},Vg=()=>{R.isSidebarVisible()&&(yl(),R.isSidebarGadgetActive("git")&&ml())},Yg=y=>{o.sidebarVisible=y,R.setSidebarVisible(y),PS(),yl(),R.isSidebarSuppressed()?R.notify("sidebar needs a wider terminal (80+ columns)"):y&&R.isSidebarOverlay()&&R.notify("sidebar overlaying transcript (too wide to reflow)"),R.fullRedraw(),y?(Q$(),V$(),FS(),Z$()):(LS(),Y$(),J$(),NS())},yl=()=>{R.setSidebarSnapshot({busySince:Le,lastTurnEndedAt:Re,queued:Fn.size,plan:eO(),editedFiles:tO(),running:YP(L,Vt,nt),sessionId:me===null?null:ot(me),agent:sd()})},eO=()=>_e!==null&&_e.entries.length>0?_e.entries:pe,tO=()=>Z_(ee.values()),nO=y=>{if(!y.path||Wn)return null;let v=Gt(y.oldText).split(`
297
297
  `),C=Gt(y.newText).split(`
298
298
  `),O=0,T=Math.min(v.length,C.length);for(;O<T&&v[O]===C[O];)O++;let N=C[O];if(!N)return null;let U=xi.isAbsolute(y.path)?y.path:xi.resolve(nt,y.path),te;try{te=i4(U,"utf8")}catch{return null}let le=te.split(`
@@ -403,7 +403,7 @@ ${A}`)}await this.mutateRecord(e.sessionId,{cwd:e.cwd,workspace:e.workspace}),th
403
403
  `),await l(A),A.exhausted){try{A.rl.close()}catch{}S.splice(I,1)}}}catch(I){for(let x of S)try{x.rl.close()}catch{}throw I}return f.raw.end(),f}),n.get("/v1/sessions/:id/events",async(u,f)=>{let p=u.params.id,m=u.query,h=await e.resolveCanonicalId(p)??p;if(!e.get(h)&&!await e.hasRecord(h))return f.code(404).send({error:"session not found"}),f;let w=m.kinds;if(!w||w.trim().length===0)return f.code(400).send({error:"kinds parameter is required"}),f;let b=w.split(",").map(_=>_.trim());if(b.length===0)return f.code(400).send({error:"kinds parameter is required"}),f;for(let _ of b)if(!Th.has(_))return f.code(400).send({error:`kind "${_}" is not queryable; allowed kinds: ${[...Th].join(", ")}`}),f;let k=new Set(b),S;if(m.since!==void 0&&m.since.trim().length>0){let _=new Date(m.since);if(isNaN(_.getTime()))return f.code(400).send({error:"since is not a valid ISO-8601 timestamp"}),f;S=_.getTime()}let I=D.historyFile(h),x=Rb.createReadStream(I),A=Ab.createInterface({input:x,crlfDelay:1/0});f.raw.setHeader("content-type","application/x-ndjson"),f.raw.statusCode=200;try{for await(let _ of A){let P=typeof _=="string"?_.trim():"";if(P.length===0)continue;let $;try{$=JSON.parse(P)}catch{console.debug("events endpoint: skipping malformed JSONL line in %s",I);continue}if(!$||typeof $!="object"||Array.isArray($)){console.debug("events endpoint: skipping non-object JSONL line in %s",I);continue}let F=$;if(typeof F.recordedAt!="number"||typeof F.params!="object"||F.params===null||Array.isArray(F.params))continue;let J=F.params;if(typeof J.update!="object"||J.update===null||Array.isArray(J.update))continue;let Y=J.update,W=Y.sessionUpdate;if(typeof W!="string"||!k.has(W)||S!==void 0&&F.recordedAt<S)continue;let Z={ts:new Date(F.recordedAt).toISOString(),kind:W,update:Y};Y.messageId!==void 0&&Y.messageId!==null&&(Z.messageId=Y.messageId),f.raw.write(JSON.stringify(Z)+`
404
404
  `)}}catch(_){if(_.code==="ENOENT")return f.raw.end(),f;throw _}return f.raw.end(),f}),n.post("/v1/sessions/:id/prompt/:messageId/notify",async(u,f)=>{let p=u.params,m=p.id,h=await e.resolveCanonicalId(m)??m,g=p.messageId,w=u.body,b=typeof w?.callbackUrl=="string"?w.callbackUrl:"",k=typeof w?.secret=="string"?w.secret:"";if(!g||!b||!k){f.code(400).send({error:"messageId, callbackUrl, and secret are all required"});return}let S;try{S=new URL(b)}catch{f.code(400).send({error:"callbackUrl must be a valid absolute URL"});return}if(S.protocol!=="https:"&&S.protocol!=="http:"){f.code(400).send({error:"callbackUrl must be http or https"});return}let I=e.get(h);if(!I){f.code(404).send({error:"session not found or not warm"});return}let x=I.registerTurnNotify(g,b,k);if(x.alreadyTerminal){f.code(200).send({status:"already_terminal",stopReason:x.stopReason});return}f.code(202).send({status:"registered"})}),n.get("/v1/sessions/:id/attention",async(u,f)=>{let p=u.params.id,m=await e.resolveCanonicalId(p)??p,h=e.get(m);return!h&&!await e.hasRecord(m)?(f.code(404).send({error:"session not found"}),f):h?{flags:h.listAttentionFlags()}:{flags:(await e.store.read(m))?.attentionFlags??[]}}),n.get("/v1/sessions/attention",async(u,f)=>{let p=u.query;if(!p.source||p.source.trim().length===0)return f.code(400).send({error:"source query parameter is required"}),f;let m=await e.list({includeNonInteractive:!0}),h=[];for(let g of m){let w=e.get(g.sessionId),b;w?b=w.listAttentionFlags():b=(await e.store.read(g.sessionId))?.attentionFlags??[];for(let k of b)k.source===p.source&&h.push({...k,sessionId:g.sessionId})}return{flags:h}}),n.post("/v1/sessions/:id/attention/clear",async(u,f)=>{let p=u.params.id,m=await e.resolveCanonicalId(p)??p,g=u.body??{},w=typeof g.source=="string"?g.source:"",b=typeof g.reason=="string"?g.reason:"";if((w.length>0||b.length>0)&&!(w.length>0&&b.length>0)){f.code(400).send({error:"both source and reason are required to clear a specific flag, or omit both to clear all"});return}w.length===0&&b.length;let k=e.get(m);if(k){if(w.length>0&&b.length>0)k.clearAttentionFlag(w,b);else{let _=Array.from(k.listAttentionFlags()).map(P=>`${P.source}::${P.reason}`);for(let P of _)k.clearAttentionFlag(P.split("::")[0],P.split("::").slice(1).join("::"))}f.code(204).send();return}if(!await e.hasRecord(m)){f.code(404).send({error:"session not found"});return}let S=e.store,I=await S.read(m);if(!I){f.code(404).send({error:"session not found"});return}let x=I.attentionFlags??[],A;if(w.length>0&&b.length>0){let _=`${w}::${b}`;A=x.filter(P=>`${P.source}::${P.reason}`!==_)}else A=[];if(A.length===x.length&&A.every((_,P)=>_.source===x[P].source&&_.reason===x[P].reason)){f.code(204).send();return}await S.write({...I,attentionFlags:A}),f.code(204).send()})}$s();fn();function TA(n,e,t,r={}){n.get("/v1/agents",async()=>tc(e)),n.get("/v1/registry",async()=>e.load()),n.post("/v1/registry/refresh",async()=>{let s=await e.refresh();return{version:s.version,agentCount:s.agents.length}}),n.post("/v1/agents/:id/install",async(s,o)=>{let i=s.params.id,a=await e.getAgent(i);if(!a){o.code(404).send({error:`agent ${i} not found in registry`});return}if(a.distribution.uvx&&!a.distribution.npx&&!a.distribution.binary){o.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 Ir(a,[],{npmRegistry:r.npmRegistry}),c=a.distribution.npx?"npx":a.distribution.binary?"binary":"unknown";o.send({agentId:a.id,version:d.version,distribution:c,installed:!0,command:d.command})}catch(d){o.code(500).send({error:d.message})}}),n.post("/v1/agents/:id/sync",async(s,o)=>{let i=s.params.id;try{let{synced:a,skipped:d}=await t.syncFromAgent(i);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===G.AgentNotInstalled){o.code(404).send({error:d.message});return}o.code(409).send({error:d.message})}})}ve();function EA(n,e,t,r=()=>[]){n.get("/v1/health",{config:{skipAuth:!0}},async()=>({status:"ok",version:e,configDigest:t,home:D.home(),driftedKeys:r()}))}var MB=/^[A-Za-z0-9._-]+$/;function Ph(n,e,t){let r=e==="extension"?"extensions":"transformers",s=`/v1/${r}`;n.get(s,async()=>({[r]:t.list()})),n.get(`${s}/:name`,async(o,i)=>{let a=o.params.name,d=t.get(a);if(!d){i.code(404).send({error:`unknown ${e}: ${a}`});return}return d}),n.post(s,async(o,i)=>{let a=o.body??{},d=_B(a);if("error"in d){i.code(400).send({error:d.error});return}try{let c=t.register(d.config);i.code(201).send(c)}catch(c){bu(i,c)}}),n.delete(`${s}/:name`,async(o,i)=>{let a=o.params.name;try{await t.unregister(a),i.code(204).send()}catch(d){bu(i,d)}}),n.post(`${s}/:name/start`,async(o,i)=>{let a=o.params.name;try{let d=await t.startByName(a);i.code(200).send(d)}catch(d){bu(i,d)}}),n.post(`${s}/:name/stop`,async(o,i)=>{let a=o.params.name;try{let d=await t.stopByName(a);i.code(200).send(d)}catch(d){bu(i,d)}}),n.post(`${s}/:name/restart`,async(o,i)=>{let a=o.params.name;try{let d=await t.restartByName(a);i.code(200).send(d)}catch(d){bu(i,d)}})}function bu(n,e){let t=e.code,r=e.message??"unknown error";if(t==="NOT_FOUND"){n.code(404).send({error:r});return}if(t==="CONFLICT"){n.code(409).send({error:r});return}n.code(500).send({error:r})}function _B(n){let e=n.name;if(typeof e!="string"||!MB.test(e))return{error:"name must match [A-Za-z0-9._-]+"};let t=n.command;if(t!==void 0&&(!Array.isArray(t)||t.some(i=>typeof i!="string")))return{error:"command must be string[]"};let r=n.args;if(r!==void 0&&(!Array.isArray(r)||r.some(i=>typeof i!="string")))return{error:"args must be string[]"};let s=n.env;if(s!==void 0&&(typeof s!="object"||s===null||Array.isArray(s)))return{error:"env must be an object of string\u2192string"};if(s&&Object.values(s).some(i=>typeof i!="string"))return{error:"env values must be strings"};let o=n.enabled;return o!==void 0&&typeof o!="boolean"?{error:"enabled must be a boolean"}:{config:{name:e,command:t??[],args:r??[],env:s??{},enabled:o===void 0?!0:o}}}function PA(n,e){Ph(n,"extension",e)}function MA(n,e){Ph(n,"transformer",e)}function _A(n,e){n.get("/v1/config",async()=>e())}import{z as ci}from"zod";ve();import*as di from"fs/promises";import*as LA from"path";import{randomBytes as $B,scrypt as OB,timingSafeEqual as FB}from"crypto";import{promisify as LB}from"util";var NA=LB(OB);function Tb(){return LA.join(D.home(),"password-hash")}var $A=32768,OA=8,FA=1,NB=64,DB=16,DA=128*1024*1024;async function BA(n){if(typeof n!="string"||n.length===0)throw new Error("password must be a non-empty string");let e=$B(DB),t=await NA(n,e,NB,{N:$A,r:OA,p:FA,maxmem:DA}),r=`scrypt$${$A}$${OA}$${FA}$${e.toString("hex")}$${t.toString("hex")}
405
405
  `;await di.mkdir(D.home(),{recursive:!0}),await di.writeFile(Tb(),r,{encoding:"utf8",mode:384})}async function Mh(){try{return(await di.readFile(Tb(),"utf8")).trim().length>0}catch(n){if(n.code==="ENOENT")return!1;throw n}}async function _h(n){if(typeof n!="string"||n.length===0)return!1;let e;try{e=(await di.readFile(Tb(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let t=e.split("$");if(t.length!==6||t[0]!=="scrypt")return!1;let r=parseInt(t[1],10),s=parseInt(t[2],10),o=parseInt(t[3],10);if(!Number.isFinite(r)||!Number.isFinite(s)||!Number.isFinite(o))return!1;let i=Buffer.from(t[4],"hex"),a=Buffer.from(t[5],"hex");if(i.length===0||a.length===0)return!1;let d=await NA(n,i,a.length,{N:r,r:s,p:o,maxmem:DA});return d.length!==a.length?!1:FB(d,a)}var BB=ci.object({password:ci.string().min(1),label:ci.string().min(1).max(256).optional(),ttlSec:ci.number().int().positive().optional()}),HB=ci.object({id:ci.string().optional()}).optional(),UB=ci.object({token:ci.string().min(32)});function HA(n,e){n.post("/v1/auth/login",{config:{skipAuth:!0}},async(t,r)=>{let s=WB(t);if(e.rateLimiter.isBlocked(s))return r.code(429).send({error:"Too many failed attempts; try again later."});let o;try{o=BB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}if(!await Mh())return r.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await _h(o.password))return e.rateLimiter.recordFailure(s),r.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(s);let a=await e.store.issue({label:o.label,ttlSec:o.ttlSec});return r.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),n.post("/v1/auth/logout",async(t,r)=>{let s;try{s=HB.parse(t.body??void 0)}catch{return r.code(400).send({error:"Invalid request body"})}let o=s?.id??t.authIdentity;if(!o||o==="service")return r.code(200).send({revoked:!1});let i=await e.store.revoke(o);return r.code(200).send({revoked:i})}),n.get("/v1/auth/verify",async(t,r)=>r.code(200).send({ok:!0})),n.get("/v1/auth/sessions",async(t,r)=>r.code(200).send({sessions:e.store.list()})),n.delete("/v1/auth/sessions",async(t,r)=>{let s=await e.store.revokeAll();return r.code(200).send({revoked:s})}),n.delete("/v1/auth/sessions/:id",async(t,r)=>{let s=t.params.id;return await e.store.revoke(s)?r.code(204).send():r.code(404).send({error:"Not found"})}),n.post("/v1/auth/rotate-token",async(t,r)=>{if(t.authIdentity!=="service")return r.code(403).send({error:"Requires the service token"});let s;try{s=UB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}return e.staticTokenValidator.rotate(s.token),r.code(200).send({rotated:!0})})}function WB(n){return n.ip||"unknown"}st();import{z as li}from"zod";ve();es();var Eb=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,$h=class n{data;constructor(e){this.data=e}static async load(){let e=await qt(D.peers());return new n(jB(e))}get(e){return this.data.entries[e]}async set(e){this.data.entries[e.name]=e,await UA(this.data)}async delete(e){return e in this.data.entries?(delete this.data.entries[e],await UA(this.data),!0):!1}list(){return Object.values(this.data.entries).map(({name:e,host:t,port:r,expiresAt:s,label:o,addedAt:i,pinnedFingerprint:a,pinnedAt:d})=>({name:e,host:t,port:r,expiresAt:s,label:o,addedAt:i,pinnedFingerprint:a,pinnedAt:d})).sort((e,t)=>e.addedAt.localeCompare(t.addedAt))}};function jB(n){if(!n||typeof n!="object")return{version:1,entries:{}};let e=n,t=e.entries&&typeof e.entries=="object"?e.entries:{},r={};for(let[s,o]of Object.entries(t)){if(!o||typeof o!="object")continue;let i=o;if(typeof i.name!="string"||typeof i.host!="string"||typeof i.port!="number"||typeof i.token!="string"||typeof i.expiresAt!="string"||typeof i.addedAt!="string")continue;let a={name:i.name,host:i.host,port:i.port,token:i.token,expiresAt:i.expiresAt,addedAt:i.addedAt};typeof i.label=="string"&&(a.label=i.label),typeof i.pinnedFingerprint=="string"&&(a.pinnedFingerprint=i.pinnedFingerprint),typeof i.pinnedAt=="string"&&(a.pinnedAt=i.pinnedAt),r[s]=a}return{version:1,entries:r}}async function UA(n){await rn(D.peers(),n,{mode:384})}As();var qB=3600*24*365,Ws=class extends Error{status;constructor(e,t){super(e),this.name="PeerLoginError",this.status=t}};function WA(n,e){return`${Yt(n)?"http":"https"}://${n}:${e}`}async function jA(n){let e=n.fetchImpl??fetch,t=`${n.host}:${n.port}`,r=WA(n.host,n.port),s;try{s=await e(`${r}/v1/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:n.password,label:n.label,ttlSec:n.ttlSec??qB})})}catch(i){throw new Ws(`Could not reach ${t}: ${i.message}`,502)}if(s.status===401)throw new Ws(`Wrong password for ${t}.`,401);if(s.status===403)throw new Ws(`No password is configured on ${t}. Run \`hydra-acp auth password\` on that daemon first.`,502);if(s.status===429)throw new Ws(`Too many failed login attempts on ${t}; try again later.`,429);if(!s.ok)throw new Ws(`Login to ${t} failed: HTTP ${s.status}`,502);let o=await s.json();if(!o.session_token||!o.expires_at)throw new Ws(`Login to ${t} returned a malformed response.`,502);return{token:o.session_token,expiresAt:o.expires_at}}async function qA(n){let e=n.fetchImpl??fetch,t=WA(n.host,n.port);try{await e(`${t}/v1/auth/logout`,{method:"POST",headers:{Authorization:`Bearer ${n.token}`,"Content-Type":"application/json"},body:JSON.stringify({})})}catch{}}Qo();var zB=li.object({name:li.string().min(1).max(64).regex(Eb),host:li.string().min(1),port:li.number().int().positive().optional(),password:li.string().min(1),label:li.string().min(1).max(256).optional(),ttlSec:li.number().int().positive().optional(),pinnedFingerprint:li.string().min(1).optional()});function zA(n,e){n.post("/v1/remotes",async(t,r)=>{let s;try{s=zB.parse(t.body)}catch{return r.code(400).send({error:`Invalid request body (name must match ${Eb} and the rest is a normal login request)`})}let o=s.port??An;s.pinnedFingerprint&&Vo(s.host,o,s.pinnedFingerprint);let i;try{i=await jA({host:s.host,port:o,password:s.password,label:s.label,ttlSec:s.ttlSec})}catch(c){if(c instanceof Ws)return r.code(c.status).send({error:c.message});throw c}let a=new Date().toISOString(),d={name:s.name,host:s.host,port:o,token:i.token,expiresAt:i.expiresAt,addedAt:a,...s.label!==void 0?{label:s.label}:{},...s.pinnedFingerprint!==void 0?{pinnedFingerprint:s.pinnedFingerprint,pinnedAt:a}:{}};return await e.store.set(d),e.health?.markOk(d.name),r.code(201).send({name:d.name,host:d.host,port:d.port,expiresAt:d.expiresAt,label:d.label,addedAt:d.addedAt,pinnedFingerprint:d.pinnedFingerprint,status:e.health?.get(d.name)?.status??"unknown"})}),n.get("/v1/remotes",async(t,r)=>{let s=e.store.list().map(o=>{let i=e.health?.get(o.name);return{...o,status:i?.status??"unknown",...i?.checkedAt?{lastCheckedAt:i.checkedAt}:{}}});return r.code(200).send({remotes:s})}),n.delete("/v1/remotes/:name",async(t,r)=>{let s=t.params.name,o=e.store.get(s);return o?(await qA({host:o.host,port:o.port,token:o.token}),await e.store.delete(s),e.health?.forget(s),e.store.list().some(a=>a.host===o.host&&a.port===o.port)||ky(o.host,o.port),r.code(204).send()):r.code(404).send({error:"Not found"})})}bo();ya();Nd();As();Wl();fn();var KB=new Set(["session/attach","session/detach","session/prompt","session/cancel","session/close","session/delete","hydra-acp/session/delete","session/set_model","session/set_mode","session/set_config_option","_session/steering","hydra-acp/prompt/cancel","hydra-acp/prompt/update","hydra-acp/prompt/amend","hydra-acp/session/tool_content","hydra-acp/session/force_cancel"]);function GB(n){return KB.has(n)}function GA(n,e,t,r){let s=[],o=a=>{for(let d of s)d(a)},i=(a,d)=>{e.handleLocalMessage(a,d,{connection:t.connection,clientId:r}).then(c=>c?n.send(c):void 0).catch(()=>{})};return n.onMessage(a=>{if("method"in a&&GB(a.method)){let d=a.params,c=typeof d?.sessionId=="string"?d.sessionId:void 0;if(c){if(Ns(c)){i(a,c);return}if(a.method==="session/attach"){let l="id"in a;e.resolveLocalMiss(c).then(u=>{if(u.ok){i(a,u.foreignId);return}if(u.ambiguous&&l){n.send(ku(a.id,G.SessionNotFound,`Session "${c}" exists on more than one remote (${u.ambiguous.join(", ")}). Address it as "<remote>:${c}".`));return}o(a)});return}}}o(a)}),{send:a=>n.send(a),onMessage:a=>s.push(a),onClose:a=>n.onClose(a),close:()=>n.close()}}var Oh=class{constructor(e,t=VB,r){this.store=e;this.dial=t;this.localMiss=r}store;dial;localMiss;attachments=new Map;async resolveLocalMiss(e){if(!this.localMiss)return{ok:!1};if(await this.localMiss.resolvesLocally(e))return{ok:!1};let t=this.localMiss.cache.findByLocalId(e);return t.length===0?{ok:!1}:t.length>1?{ok:!1,ambiguous:t.map(r=>r.name)}:{ok:!0,foreignId:ko(t[0])}}async handleLocalMessage(e,t,r){let s="id"in e,o=s?e.id:void 0,i=Ns(t);if(!i)return s?ku(o,G.SessionNotFound,`not a federated session id: ${t}`):void 0;let a=KA(r.clientId,t),d={...e.params,sessionId:i.localId};if(e.method==="session/attach"){let l=this.store.get(i.name);if(!l)return s?ku(o,G.SessionNotFound,`No remote named "${i.name}". Run \`hydra remote add\` first.`):void 0;let u=this.attachments.get(a);u&&(this.attachments.delete(a),u.peerConnection.close().catch(()=>{}));let f;try{f=await this.dial(l)}catch(g){return s?ku(o,G.InternalError,`Could not reach remote "${i.name}": ${g.message}`):void 0}let p={peerConnection:f,localId:i.localId,target:r};this.wireAttachment(i.name,p);let m;try{m=await f.request("session/attach",d)}catch(g){return f.close().catch(()=>{}),s?Pb(o,g):void 0}this.attachments.set(a,p);let h=m&&typeof m.sessionId=="string"?{...m,sessionId:t}:m;return s?{jsonrpc:"2.0",id:o,result:h}:void 0}let c=this.attachments.get(a);if(!c)return s?ku(o,G.SessionNotFound,`"${t}" is not attached through this daemon.`):void 0;if(e.method==="session/detach"){let l,u;try{l=await c.peerConnection.request("session/detach",d)}catch(f){u=f}return this.attachments.delete(a),c.peerConnection.close().catch(()=>{}),u?s?Pb(o,u):void 0:s?{jsonrpc:"2.0",id:o,result:l??{}}:void 0}if(s)try{let l=await c.peerConnection.request(e.method,d);return{jsonrpc:"2.0",id:o,result:l}}catch(l){return Pb(o,l)}await c.peerConnection.notify(e.method,d).catch(()=>{})}detachClient(e){for(let[t,r]of[...this.attachments.entries()])r.target.clientId===e&&(this.attachments.delete(t),r.peerConnection.request("session/detach",{sessionId:r.localId}).catch(()=>{}),r.peerConnection.close().catch(()=>{}))}wireAttachment(e,t){let{peerConnection:r,localId:s,target:o}=t,i=ko({name:e,localId:s}),a=()=>{this.attachments.delete(KA(o.clientId,i))};r.onAnyNotification((d,c)=>{let l=d;!l||l.sessionId!==s||(c==="hydra-acp/session/closed"&&a(),o.connection.notify(c,{...l,sessionId:i}).catch(()=>{}))}),r.onRequest("hydra-acp/session/request_permission",async d=>{let c=d;if(!c||c.sessionId!==s)throw{code:G.MethodNotFound,message:"unexpected sessionId"};return o.connection.request("hydra-acp/session/request_permission",{...c,sessionId:i})}),r.onClose(()=>{a(),o.connection.notify("hydra-acp/session/closed",{sessionId:i}).catch(()=>{})})}};function KA(n,e){return`${n} ${e}`}function ku(n,e,t){return{jsonrpc:"2.0",id:n,error:{code:e,message:t}}}function Pb(n,e){let t=e,r=typeof t?.code=="number"?t.code:G.InternalError,s=typeof t?.message=="string"?t.message:String(e??"forward failed");return{jsonrpc:"2.0",id:n,error:{code:r,message:s,...t?.data!==void 0?{data:t.data}:{}}}}var JB=1e4;async function VB(n){let t=`${Yt(n.host)?"ws":"wss"}://${n.host}:${n.port}/acp`,r=await wo(t,["acp.v1",`hydra-acp-token.${n.token}`],JB);return new pn(Rr(r))}As();var YB=3e4,QB=5e3,Fh=class{constructor(e,t={}){this.store=e;this.opts=t}store;opts;snapshots=new Map;timer;start(){this.timer||(this.checkAll(),this.timer=setInterval(()=>{this.checkAll()},this.opts.intervalMs??YB),this.timer.unref?.())}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}get(e){return this.snapshots.get(e)}markOk(e){this.snapshots.set(e,{status:"ok",checkedAt:new Date().toISOString()})}forget(e){this.snapshots.delete(e)}async checkAll(){let e=this.opts.fetchImpl??fetch;await Promise.allSettled(this.store.list().map(async t=>{let r=this.store.get(t.name);if(!r)return;let o=`${Yt(r.host)?"http":"https"}://${r.host}:${r.port}/v1/auth/verify`,i=new AbortController,a=setTimeout(()=>i.abort(),QB);try{let d=await e(o,{headers:{Authorization:`Bearer ${r.token}`},signal:i.signal});this.snapshots.set(t.name,{status:d.ok?"ok":"unauthorized",checkedAt:new Date().toISOString()})}catch(d){this.snapshots.set(t.name,{status:"unreachable",checkedAt:new Date().toISOString(),error:d.message})}finally{clearTimeout(a)}}))}};Qo();import{z as JA}from"zod";var XB=JA.object({sessionLabel:JA.string().min(1).max(256)});function VA(n,e){n.post("/v1/process-tokens",async(t,r)=>{if(t.authIdentity!=="service")return r.code(403).send({error:"Requires the service token"});let s;try{s=XB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}let o=e.processRegistry.mint(s.sessionLabel,"script");return r.code(201).send({token:o})}),n.delete("/v1/process-tokens/:sessionLabel",async(t,r)=>t.authIdentity!=="service"?r.code(403).send({error:"Requires the service token"}):(e.processRegistry.revoke(t.params.sessionLabel),r.code(204).send()))}bo();hc();ya();import{nanoid as Mb}from"nanoid";xp();fn();$s();Ad();dr();import{randomBytes as eT}from"crypto";import*as tT from"os";import*as nT from"path";nc();var ZB=200;function eH(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object"||Array.isArray(e))return;let t=e[ft];if(!t||typeof t!="object"||Array.isArray(t))return;let r=t.sentBy;if(!r||typeof r!="object"||Array.isArray(r))return;let s=r,o={};if(typeof s.sessionId=="string"&&s.sessionId.length>0&&(o.sessionId=s.sessionId),typeof s.label=="string"&&s.label.length>0&&(o.label=s.label.slice(0,ZB)),s.awaiting===!0&&(o.awaiting=!0),!(o.sessionId===void 0&&o.label===void 0))return o}async function YA(n,e,t){let r=eH(n);if(!r)return;let s={};if(r.label!==void 0&&(s.fromLabel=r.label),r.awaiting===!0&&(s.awaiting=!0),r.sessionId!==void 0){let o=await e.resolveCanonicalId(r.sessionId)??r.sessionId,i=await e.getOne(o);if(i){s.fromSession=o,i.title&&(s.fromSessionTitle=i.title);let a=e.get(o)?.currentPromptDepth;s.depth=(a??0)+1}else t?.(r.sessionId)}if(!(s.fromSession===void 0&&s.fromLabel===void 0))return s}var vu=new Map;function QA(n,e){let t=vu.get(n);t||(t=new Set,vu.set(n,t)),t.add(e);let r=!1;return()=>{if(r)return;r=!0;let s=vu.get(n);s&&(s.delete(e),s.size===0&&vu.delete(n))}}function XA(n,e){if(n===e)return!0;let t=new Set,r=[e];for(;r.length>0;){let s=r.pop();if(t.has(s))continue;t.add(s);let o=vu.get(s);if(o){if(o.has(n))return!0;for(let i of o)r.push(i)}}return!1}function he(n,e,t){let r=new Error(e);return r.code=n,t!==void 0&&(r.data=t),r}function oH(n){if(!n||typeof n!="object")return 512;let r=n.params?.update;if(!r)return 512;let s=512,o=r.content;if(typeof o=="string")s+=o.length;else if(o&&typeof o=="object"){let a=o;typeof a.text=="string"&&(s+=a.text.length),typeof a.data=="string"&&(s+=a.data.length)}let i=r.toolCall;if(i&&(typeof i.rawInput=="string"?s+=i.rawInput.length:i.rawInput&&typeof i.rawInput=="object"&&(s+=256),typeof i.rawOutput=="string"?s+=i.rawOutput.length:i.rawOutput&&typeof i.rawOutput=="object"&&(s+=256),Array.isArray(i.content)))for(let a of i.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(s+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(s+=c.text.length)}}return s}function cr(n,e,t){let r=n.get(e);if(!r)throw he(G.SessionNotFound,t??`session ${e} not found`);return r}async function wa(n,e){let t=Cc(n),r,s,o;typeof e.summarizedThroughEntry=="number"&&e.summarizedThroughEntry>0&&n.mcpTokenRegistry!==void 0&&n.getDaemonOrigin!==void 0&&(r=eT(32).toString("hex"),s=n.mcpTokenRegistry.reserve(r),o={name:"hydra-acp-recall",type:"http",url:`${n.getDaemonOrigin()}/mcp/hydra-acp-recall`,headers:[{name:"Authorization",value:`Bearer ${r}`}]});let a=[...t?.descriptors??[],...o!==void 0?[o]:[]],d=Cb({baselineMcpServers:void 0,stdinEnabled:!1,deps:n}),c;try{c=await n.manager.resurrect({...e,mcpServers:a,...d?{mintMcpServersForSwap:d}:{}})}catch(l){throw t!==void 0&&t.abandon(l instanceof Error?l:void 0),s!==void 0&&s.abandon(l instanceof Error?l:void 0),l}if(t!==void 0&&t.bindToSession(c),r!==void 0&&s!==void 0&&n.mcpTokenRegistry!==void 0){let l=r,u=n.mcpTokenRegistry;s.complete(c),c.onClose(()=>{u.unbind(l)})}return mH(c,n),sT(c.sessionId,n),c}function rT(n,e){n.get("/acp",{websocket:!0},async(t,r)=>{let s=YR({headers:r.headers,url:r.url});if(!s||!await e.validator.validate(s)){t.close(4401,"Unauthorized");return}let o=e.processRegistry?.resolve(s),i=`hydra_client_${Mb(12)}`,a=Rr(t),d={},c=e.foreignSessions?GA(a,e.foreignSessions,d,i):a,l=new pn(c);d.connection=l;let u={clientId:i,processIdentity:o,attached:new Map};l.onClose(()=>{for(let m of u.attached.values())e.manager.get(m.sessionId)?.detach(m.clientId);u.attached.clear(),e.foreignSessions?.detachClient(i)});let f=(m,h)=>{if(u.attached.get(m)?.readonly)throw he(G.PermissionDenied,`${h} not permitted on a read-only attachment`)};if(l.onRequest("initialize",async m=>{let h=PI.parse(m??{});h.clientInfo?.name&&(u.clientInfo={name:h.clientInfo.name,...h.clientInfo.version!==void 0?{version:h.clientInfo.version}:{}});let g=h.clientInfo?.version;return g&&o&&(o.kind==="extension"?e.onExtensionVersion?.(o.name,g):e.onTransformerVersion?.(o.name,g)),hH()}),o&&e.extensionCommands){let m=e.extensionCommands;l.onRequest("hydra-acp/commands/register",async h=>{let g=h??{},w=Array.isArray(g.commands)?g.commands.map(b=>{if(!b||typeof b!="object")return;let k=b;if(typeof k.verb!="string")return;let S={verb:k.verb};return typeof k.argsHint=="string"&&(S.argsHint=k.argsHint),typeof k.description=="string"&&(S.description=k.description),S}).filter(b=>b!==void 0):[];return m.register(o.name,l,w),{ok:!0,registered:w.length}}),l.onClose(()=>{m.clear(o.name)})}if(o&&e.extensionMcp){let m=e.extensionMcp;l.onRequest("hydra-acp/mcp_tools/register",async g=>{let w=g??{},b=typeof w.instructions=="string"?w.instructions:void 0,k=Array.isArray(w.tools)?w.tools.map(S=>{if(!S||typeof S!="object")return;let I=S;if(typeof I.name!="string"||I.name.length===0||typeof I.description!="string"||I.inputSchema===null||typeof I.inputSchema!="object")return;let x={name:I.name,description:I.description,inputSchema:I.inputSchema};return I.outputSchema!==null&&typeof I.outputSchema=="object"&&(x.outputSchema=I.outputSchema),x}).filter(S=>S!==void 0):[];if(k.length===0)throw new Error("register_mcp_tools requires at least one tool");return m.register(o.name,l,b,k),{ok:!0,registered:k.length}});let h=g=>{let w=g??{};if(typeof w.sessionId!="string"||w.sessionId.length===0)throw he(G.InvalidParams,"sessionId is required");return w.sessionId};if(l.onRequest("hydra-acp/session/extension_state/get",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw he(G.InvalidParams,"key is required");if(!e.manager)throw he(G.InternalError,"manager not wired");return{value:await e.manager.getExtensionStateKey(w,o.name,b.key)??null}}),l.onRequest("hydra-acp/session/extension_state/list",async g=>{let w=h(g);if(!e.manager)throw he(G.InternalError,"manager not wired");return{state:await e.manager.getExtensionState(w,o.name)}}),l.onRequest("hydra-acp/session/extension_state/set",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw he(G.InvalidParams,"key is required");if(b.value===void 0)throw he(G.InvalidParams,"value is required (use extension_state/delete to remove)");if(!e.manager)throw he(G.InternalError,"manager not wired");try{await e.manager.setExtensionStateKey(w,o.name,b.key,b.value)}catch(k){throw he(G.InvalidParams,k.message)}return{ok:!0}}),l.onRequest("hydra-acp/session/extension_state/delete",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw he(G.InvalidParams,"key is required");if(!e.manager)throw he(G.InternalError,"manager not wired");return await e.manager.deleteExtensionStateKey(w,o.name,b.key),{ok:!0}}),e.extensionMcpControls){let g=e.extensionMcpControls;l.onRequest("hydra-acp/mcp_tools/refresh_session",async w=>{let b=w??{};if(typeof b.sessionId!="string"||b.sessionId.length===0)throw he(G.InvalidParams,"refresh_session requires sessionId");return await g.notifyToolListChanged(b.sessionId,o.name),{ok:!0}})}l.onClose(()=>{m.clear(o.name)})}if(o?.kind==="transformer"){l.onRequest("hydra-acp/transformer/initialize",async h=>{let g=h??{},w=Array.isArray(g.intercepts)?g.intercepts.filter(b=>typeof b=="string"):[];if(e.transformers&&(e.transformers.registerConnection(o.name,l,w),e.manager?.defaultTransformers.includes(o.name))){let b=e.transformers.resolveChain([o.name])[0];if(b)for(let k of e.manager.liveSessions())k.addTransformer(b)}return{ack:!0}}),l.onClose(()=>{e.transformers?.deregisterConnection(o.name)}),l.onRequest("hydra-acp/message/emit",async h=>{let g=h??{},w=typeof g.sessionId=="string"?g.sessionId:void 0,b=typeof g.method=="string"?g.method:void 0,k=g.envelope,S=g.route;if(!w)throw he(-32602,"emit_message requires sessionId");if(!b&&S!=="client_broadcast")throw he(-32602,"emit_message requires method");let I=cr(e.manager,w),x=typeof g.respondsTo=="string"?g.respondsTo:void 0;if(x)return I.dischargeClaim(x,k),{ok:!0};if(S==="chain")return{ok:!0,response:await I.emitToChain(o.name,b,k)};if(S==="queue"){if(b!=="session/prompt")throw he(-32602,'route "queue" only supports method "session/prompt"');return{ok:!0,response:await I.emitToQueue(o.name,k)}}if(S==="daemon")return{ok:!0,response:await I.emitToChain(o.name,b,k)};if(S==="client_broadcast"){if(!k||typeof k!="object")throw he(-32602,"client_broadcast requires an envelope object");return I.broadcastClientUpdate(k),{ok:!0}}throw he(-32602,`unsupported route: ${JSON.stringify(S)}`)}),l.onRequest("hydra-acp/session/request_permission",async h=>{let g=h??{},w=typeof g.sessionId=="string"?g.sessionId:void 0;if(!w)throw he(-32602,"hydra-acp/session/request_permission requires sessionId");return cr(e.manager,w).requestPermissionFromClients(g)}),l.onRequest("hydra-acp/transformer/attach",async h=>lH(h,o.name,e)),l.onRequest("hydra-acp/child_session/spawn",async h=>{let g=h??{},w=typeof g.agentId=="string"?g.agentId:void 0,b=typeof g.cwd=="string"?g.cwd:void 0,k=typeof g.parentSessionId=="string"?g.parentSessionId:void 0,S=Pn(g._meta??void 0),I=S.title,x=S.model,A=S.workspace;if(!b&&k){let Z=e.manager.get(k);Z&&(b=Z.cwd)}if(!b)throw he(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let _=await Rd(b),P=w??_.agentId??e.defaultAgent,$=await e.registry?.getAgent(P),F=xr(_.configDefaults,$??{id:P})?.value,J=x??F?.model,Y=typeof g.interactive=="boolean"?g.interactive:!1,W=await e.manager.create({agentId:P,cwd:b,parentSessionId:k,interactive:Y,transformChain:[],title:I,model:J,configDefaults:F,...A!==void 0?{workspace:A}:{}});return{childSessionId:W.sessionId,...W.workspace!==void 0||W.workspaceError!==void 0?{_meta:{[ft]:{...W.workspace!==void 0?{workspaceInfo:W.workspace}:{},...W.workspaceError!==void 0?{workspaceError:W.workspaceError}:{}}}}:{}}}),l.onRequest("hydra-acp/session/fork",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw he(G.InvalidParams,"fork_session requires sessionId");let w=typeof g.forkAt=="string"?g.forkAt:void 0,b=typeof g.cwd=="string"?g.cwd:void 0,k=typeof g.agentId=="string"?g.agentId:void 0,S=typeof g.mode=="string"&&(g.mode==="verbatim"||g.mode==="synthesis")?g.mode:void 0,I=typeof g.model=="string"&&g.model.length>0?g.model:void 0,x=await e.manager.forkSession(g.sessionId,{...w!==void 0?{forkAt:w}:{},...b!==void 0?{cwd:b}:{},...k!==void 0?{agentId:k}:{},...S!==void 0?{mode:S}:{},...I!==void 0?{model:I}:{}}),A=e.manager.get(x.sessionId);if(!A){let $=await e.manager.loadFromDisk(x.sessionId);if(!$)throw he(G.InternalError,`fork ${x.sessionId} vanished before it could be attached`);A=await wa(e,{...$,onInstallProgress:Lh(l)})}Rc(u,A,A.sessionId);let _=ui(l,A,u),{entries:P}=await A.attach(_,"full");u.attached.set(A.sessionId,{sessionId:A.sessionId,clientId:_.clientId,readonly:!1});for(let $ of P){if(l.isClosed())break;await l.notify($.method,Fs(Os($.params,$.recordedAt),$.seq)).catch(()=>{})}return{...x,sessionId:A.sessionId}}),l.onRequest("session/fork",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw he(G.InvalidParams,"session/fork requires sessionId");let w=typeof g.cwd=="string"?g.cwd:void 0,b=await e.manager.forkSession(g.sessionId,{...w!==void 0?{cwd:w}:{},mode:"verbatim"}),k=e.manager.get(b.sessionId);if(!k){let x=await e.manager.loadFromDisk(b.sessionId);if(!x)throw he(G.InternalError,`fork ${b.sessionId} vanished before it could be attached`);k=await wa(e,{...x,onInstallProgress:Lh(l)})}Rc(u,k,k.sessionId);let S=ui(l,k,u),{entries:I}=await k.attach(S,"full");u.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:S.clientId,readonly:!1});for(let x of I){if(l.isClosed())break;await l.notify(x.method,Fs(Os(x.params,x.recordedAt),x.seq)).catch(()=>{})}return{sessionId:k.sessionId}});let m=async(h,g)=>{let w=h??{};if(typeof w.sessionId!="string")throw he(G.InvalidParams,`${g} requires sessionId`);let b=await e.manager.resolveCanonicalId(w.sessionId)??w.sessionId,k=e.manager.get(b);if(k)return await k.close({deleteRecord:!0,by:`session/delete ${u.clientId}`}),await e.manager.waitForDeletion(b),await e.manager.hasRecord(b)&&await e.manager.deleteRecord(b),{id:b,existed:!0};let S=await e.manager.deleteRecord(b);return{id:b,existed:S}};l.onRequest("session/delete",async h=>(await m(h,"session/delete"),{})),l.onRequest("session/close",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw he(G.InvalidParams,"session/close requires sessionId");f(g.sessionId,"session/close");let w=await e.manager.resolveCanonicalId(g.sessionId)??g.sessionId,b=e.manager.get(w);if(b)return await b.close({deleteRecord:!1,by:`session/close ${u.clientId}`+(u.processIdentity?` (${u.processIdentity.name})`:"")}),{};if(await e.manager.hasRecord(w))return{};throw he(G.SessionNotFound,`session ${w} not found`)}),l.onRequest("hydra-acp/session/delete",async h=>{let{id:g,existed:w}=await m(h,"hydra-acp/session/delete");if(!w)throw he(G.SessionNotFound,`session ${g} not found`);return{deleted:!0,sessionId:g}}),l.onRequest("hydra-acp/child_session/await",async h=>{let g=h??{},w=typeof g.childSessionId=="string"?g.childSessionId:void 0,b=g.until==="idle"?"idle":"turn_complete",k=typeof g.timeoutMs=="number"?Math.min(g.timeoutMs,18e5):3e5;if(!w)throw he(-32602,"await_child requires childSessionId");let S=cr(e.manager,w,`child session ${w} not found`);return new Promise(I=>{let _=[],P=[],$=0,F=!1,J,Y,W=!1,Z=()=>{W||(W=!0,clearTimeout(ne),J?.(),Y?.(),I(F?{entries:_,truncated:!0}:{entries:_}))};J=S.onBroadcast(Se=>{let Le=oH(Se);for(_.push(Se),P.push(Le),$+=Le;_.length>0&&(_.length>1e3||$>1048576);)_.shift(),$-=P.shift()??0,F=!0;b==="turn_complete"&&Se.params?.update?.sessionUpdate==="turn_complete"&&Z()});let ne=setTimeout(Z,k);typeof ne.unref=="function"&&ne.unref(),Y=S.onClose(()=>Z())})}),l.onRequest("hydra-acp/child_session/close",async h=>{let g=h??{},w=typeof g.childSessionId=="string"?g.childSessionId:void 0;if(!w)throw he(-32602,"close_child_session requires childSessionId");let b=e.manager.get(w);return b&&await b.close({deleteRecord:!1,by:`child_session/close ${u.clientId}`}),{ok:!0}}),l.onRequest("hydra-acp/attention/set",async h=>uH(h,o.name,e)),l.onRequest("hydra-acp/attention/clear",async h=>fH(h,o.name,e)),l.onRequest("hydra-acp/connection/keep_alive",async h=>{let g=h??{},w=typeof g.token=="string"?g.token:void 0,b=typeof g.sessionId=="string"?g.sessionId:void 0,k=typeof g.estimatedRemainingMs=="number"?g.estimatedRemainingMs:void 0;return w&&b&&e.manager.get(b)?.keepAliveClaim(w,k),{ok:!0}})}l.onRequest("hydra-acp/session/tool_content",async m=>{let h=m??{};if(typeof h.sessionId!="string"||typeof h.hash!="string")throw he(G.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let g=await e.manager.resolveCanonicalId(h.sessionId)??h.sessionId,w=await e.manager.loadToolBlob(g,h.hash);if(w===null)throw he(G.SessionNotFound,"tool content not found");return{content:w}}),l.onRequest("authenticate",async m=>iH(m,e)),l.onRequest("logout",async m=>aH(m,e)),l.onRequest("session/new",async m=>{let h=MI.parse(m),g=Pn(m?._meta),w=Array.isArray(g.transformers)&&g.transformers.every(Re=>typeof Re=="string")?g.transformers:e.manager.defaultTransformers??[],b=e.transformers?.resolveChain(w)??[],k=await Rd(h.cwd),S=g.agentId??k.agentId??e.defaultAgent,I=await e.registry?.getAgent(S),x=xr(k.configDefaults,I??{id:S})?.value,A,_,P=h.mcpServers;if(g.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){A=eT(32).toString("hex"),_=e.mcpTokenRegistry.reserve(A);let Ge={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${A}`}]};P=[...h.mcpServers??[],Ge]}let $,F,J=Cc(e);J!==void 0&&(P=[...P??[],...J.descriptors]);let Y=Cb({baselineMcpServers:h.mcpServers,stdinEnabled:g.mcpStdin===!0,deps:e}),W;try{W=await e.manager.create({cwd:h.cwd,agentId:S,mcpServers:P,title:g.title,agentArgs:g.agentArgs,model:g.model??x?.model,configDefaults:x,onInstallProgress:Lh(l),transformChain:b,originatingClient:u.clientInfo,...g.interactive!==void 0?{interactive:g.interactive}:{},...g.env!==void 0?{forwardedEnv:g.env}:{},...g.workspace!==void 0?{workspace:g.workspace}:{},...Y?{mintMcpServersForSwap:Y}:{}})}catch(Re){throw _!==void 0&&_.abandon(Re instanceof Error?Re:void 0),F!==void 0&&F.abandon(Re instanceof Error?Re:void 0),J!==void 0&&J.abandon(Re instanceof Error?Re:void 0),Re}if(A!==void 0&&_!==void 0&&e.mcpTokenRegistry!==void 0){let Re=A,Ge=e.mcpTokenRegistry;_.complete(W),W.onClose(()=>{Ge.unbind(Re)})}if($!==void 0&&F!==void 0&&e.mcpTokenRegistry!==void 0){let Re=$,Ge=e.mcpTokenRegistry;F.complete(W),W.onClose(()=>{Ge.unbind(Re)})}J!==void 0&&J.bindToSession(W),sT(W.sessionId,e);let Z,ne;try{Rc(u,W,W.sessionId),Z=ui(l,W,u),{entries:ne}=await W.attach(Z,"full")}catch(Re){throw await W.close({deleteRecord:!1,by:"session/new attach-failed"}).catch(()=>{}),Re}u.attached.set(W.sessionId,{sessionId:W.sessionId,clientId:Z.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let Re of ne){if(l.isClosed())break;await l.notify(Re.method,Fs(Os(Re.params,Re.recordedAt),Re.seq)).catch(()=>{})}})()});let Se=Nh(W),Le=Dh(W);return{sessionId:W.sessionId,...Se?{modes:Se}:{},...Le?{models:Le}:{},configOptions:W.buildConfigOptions(),_meta:Bh(e.manager,W,{clientId:Z.clientId})}}),l.onRequest("session/attach",async m=>{let h=$I.parse(m),g=h.clientInfo?.version;g&&o&&(o.kind==="extension"?e.onExtensionVersion?.(o.name,g):e.onTransformerVersion?.(o.name,g));let w=Pn(h._meta),b=w.resume,k=w.readonly===!0,S=w.env;n.log.info(`session/attach sessionId=${h.sessionId} hasResumeHints=${!!b} readonly=${k}`);let I=b?h.sessionId:await e.manager.resolveCanonicalId(h.sessionId)??h.sessionId,x=e.manager.get(I);if(!x&&k){let W=await e.manager.loadFromDisk(I);if(!W)throw he(G.SessionNotFound,`session ${h.sessionId} not found`);let Z=await e.manager.loadHistory(I),ne=h.clientId??`cli_${Mb(8)}`;u.attached.set(W.hydraSessionId,{sessionId:W.hydraSessionId,clientId:ne,readonly:!0}),n.log.info(`session/attach OK (viewer) sessionId=${W.hydraSessionId} clientId=${ne} attachedCount=${u.attached.size} replayed=${Z.length}`);for(let Se of Z)await l.notify(Se.method,Fs(Os(Se.params,Se.recordedAt),Se.seq)).catch(()=>{});return{sessionId:W.hydraSessionId,clientId:ne,connectedClients:[ne],historyPolicy:"full",replayed:Z.length,_meta:pH(W)}}let A=!x;if(!x){let W=await e.manager.loadFromDisk(I),Z=await dH(I,b,W?.upstreamSessionId,e.manager);Z.kind==="ignore"&&n.log.warn(Z.logMessage);let ne=W;if(b&&Z.kind==="honor"&&(ne={...W,hydraSessionId:h.sessionId,upstreamSessionId:b.upstreamSessionId,agentId:b.agentId,cwd:W?.workspace?.path??b.cwd,...b.title!==void 0?{title:b.title}:{},...b.agentArgs!==void 0?{agentArgs:b.agentArgs}:{}}),!ne)throw he(G.SessionNotFound,`session ${h.sessionId} not found and no resume hints provided`);if(await e.manager.isTombstoned(ne.agentId,ne.upstreamSessionId))throw he(G.SessionNotFound,`session ${h.sessionId} was deleted`);let Se=ne.originatingClient?ne:{...ne,originatingClient:u.clientInfo},Le=S!==void 0?{...Se,forwardedEnv:S}:Se;x=await wa(e,{...Le,onInstallProgress:Lh(l)})}Rc(u,x,x.sessionId);let _=ui(l,x,u,h.clientInfo,h.clientId),P=w.replayMode==="drip",{entries:$,appliedPolicy:F}=await x.attach(_,h.historyPolicy,{afterMessageId:h.afterMessageId,afterSeq:h.afterSeq,raw:P,...w.historyLimit!==void 0?{historyLimit:w.historyLimit}:{},...w.toolContent!==void 0?{toolContent:w.toolContent}:{}});if(u.attached.set(x.sessionId,{sessionId:x.sessionId,clientId:_.clientId,readonly:k}),S!==void 0&&await e.manager.setForwardedEnv(x.sessionId,S).catch(()=>{}),n.log.info(`session/attach OK sessionId=${x.sessionId} clientId=${_.clientId} attachedCount=${u.attached.size} requestedPolicy=${h.historyPolicy} appliedPolicy=${F} replayed=${$.length} readonly=${k}${P?" replayMode=drip":""}`),P){let W=w.dripSpeed&&w.dripSpeed>0?w.dripSpeed:1,Z=750;(async()=>{let ne=null;for(let Se of $){let Le=typeof Se.recordedAt=="number"?Se.recordedAt:null;if(ne!==null&&Le!==null){let Re=Math.min(Z,Math.max(0,(Le-ne)/W));Re>0&&await new Promise(Ge=>setTimeout(Ge,Re))}Le!==null&&(ne=Le);try{await l.notify(Se.method,Fs(Os(Se.params,Le??void 0),Se.seq))}catch{return}}})()}else for(let W=0;W<$.length&&!l.isClosed();W++){let Z=$[W],ne=l.notify(Z.method,Fs(Os(Z.params,Z.recordedAt),Z.seq)).catch(()=>{});(W+1)%200===0&&await ne}x.replayPendingPermissions(_);let J=Nh(x),Y=Dh(x);return{sessionId:x.sessionId,clientId:_.clientId,connectedClients:x.connectedClients(_.clientId),historyPolicy:F,replayed:$.length,...J?{modes:J}:{},...Y?{models:Y}:{},configOptions:x.buildConfigOptions(),_meta:Bh(e.manager,x,{resurrected:A})}}),l.onRequest("session/detach",async m=>{let h=OI.parse(m),g=u.attached.get(h.sessionId);if(!g)throw he(G.SessionNotFound,"client not attached to that session");let w=e.manager.get(h.sessionId);return w?.detach(g.clientId),u.attached.delete(h.sessionId),w&&e.manager.reapIfOrphanedNonInteractive(h.sessionId),{sessionId:h.sessionId,_meta:{[ft]:{detachStatus:"detached"}}}}),l.onRequest("session/list",async m=>{let h=FI.parse(m??{});return{sessions:(await e.manager.list({cwd:h.cwd})).filter(k=>k.originatingClient?.name!==la).map(LI)}}),l.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw he(G.InternalError,"agent registry unavailable");return tc(e.registry)}),l.onRequest("hydra-acp/agents/auth_methods",async m=>{let h=m??{};if(typeof h.agentId!="string"||h.agentId.length===0)throw he(G.InvalidParams,"hydra-acp/agents/auth_methods requires a non-empty agentId string");return{authMethods:(await e.manager.bootstrapAgentForAuth(h.agentId)).authMethods??[]}}),l.onRequest("session/prompt",async m=>{let h=DI.parse(m);f(h.sessionId,"session/prompt");let g=await YA(h,e.manager,S=>{n.log.warn(`session/prompt: dropping unknown sentBy.sessionId=${S} sessionId=${h.sessionId}`)});if(g?.fromSession!==void 0){if((g.depth??0)>3)throw n.log.warn(`session/prompt: refusing depth ${g.depth} chain from ${g.fromSession} to ${h.sessionId}`),he(G.InvalidRequest,`message chain too deep (${g.depth} hops, max ${3}): refusing to continue a session-to-session loop`);if(g.awaiting===!0&&XA(g.fromSession,h.sessionId))throw n.log.warn(`session/prompt: refusing deadlock ${g.fromSession} -> ${h.sessionId}`),he(G.InvalidRequest,`would deadlock: ${h.sessionId} is already blocked waiting on ${g.fromSession}. Send with --no-wait, or let the other turn finish first.`)}let w=u.attached.get(h.sessionId);if(!w)throw n.log.warn(`session/prompt rejected: not attached sessionId=${h.sessionId} attachedKeys=[${[...u.attached.keys()].join(",")}]`),he(G.SessionNotFound,"not attached to session");let b=e.manager.get(h.sessionId);if(!b){let S=await e.manager.loadFromDisk(h.sessionId);if(!S)throw he(G.SessionNotFound,`session ${h.sessionId} not found`);n.log.info(`session/prompt auto-resurrecting cold sessionId=${h.sessionId}`),b=await wa(e,S);let I=ui(l,b,u,void 0,w.clientId);await b.attach(I,"none")}let k=g?.awaiting===!0&&g.fromSession!==void 0?QA(g.fromSession,h.sessionId):void 0;try{return await b.prompt(w.clientId,h,g)}finally{k?.()}});let p=m=>{let h;try{h=gp.parse(m)}catch(b){n.log.warn(`session/cancel: invalid params: ${b.message}`);return}let g=u.attached.get(h.sessionId);if(!g)return;if(g.readonly){n.log.warn(`session/cancel dropped (readonly attachment) sessionId=${h.sessionId}`);return}let w=e.manager.get(h.sessionId);w&&w.cancel(g.clientId).catch(b=>{n.log.warn(`session/cancel for ${h.sessionId}: ${b.message}`)})};l.onNotification("session/cancel",p),l.onRequest("session/cancel",async m=>{let h=gp.parse(m);return f(h.sessionId,"session/cancel"),p(m),null}),l.onRequest("hydra-acp/prompt/cancel",async m=>{let h=HI.parse(m);return f(h.sessionId,"hydra-acp/prompt/cancel"),cr(e.manager,h.sessionId).cancelQueuedPrompt(h.messageId)}),l.onRequest("hydra-acp/session/force_cancel",async m=>{let h=gp.parse(m);return f(h.sessionId,"hydra-acp/session/force_cancel"),cr(e.manager,h.sessionId).forceCancel()}),l.onRequest("hydra-acp/prompt/update",async m=>{let h=UI.parse(m);return f(h.sessionId,"hydra-acp/prompt/update"),cr(e.manager,h.sessionId).updateQueuedPrompt(h.messageId,h.prompt)}),l.onRequest("hydra-acp/prompt/amend",async m=>{let h=WI.parse(m);f(h.sessionId,"hydra-acp/prompt/amend");let g=u.attached.get(h.sessionId);if(!g)throw he(G.SessionNotFound,"not attached to session");return cr(e.manager,h.sessionId).amendPrompt(g.clientId,h)}),l.onRequest("_session/steering",async m=>{let h=jI.parse(m);f(h.sessionId,"_session/steering");let g=u.attached.get(h.sessionId);if(!g)throw he(G.SessionNotFound,"not attached to session");let w=e.manager.get(h.sessionId);if(!w){let b=await e.manager.loadFromDisk(h.sessionId);if(!b)throw he(G.SessionNotFound,`session ${h.sessionId} not found`);w=await wa(e,b);let k=ui(l,w,u,void 0,g.clientId);await w.attach(k,"none")}return w.steer(g.clientId,h)}),l.onRequest("session/resume",async m=>{let h=m??{},g=typeof h.sessionId=="string"?h.sessionId:void 0;if(!g)throw he(G.InvalidParams,"session/resume requires sessionId");let w=await e.manager.resolveCanonicalId(g)??g,b=e.manager.get(w);if(!b){let x=await e.manager.loadFromDisk(w);if(!x)throw he(G.SessionNotFound,`session ${g} not found in memory or on disk`);b=await wa(e,x)}Rc(u,b,b.sessionId);let k=ui(l,b,u);await b.attach(k,"pending_only"),u.attached.set(b.sessionId,{sessionId:b.sessionId,clientId:k.clientId,readonly:!1}),b.replayPendingPermissions(k);let S=Nh(b),I=Dh(b);return{sessionId:b.sessionId,...S?{modes:S}:{},...I?{models:I}:{},configOptions:b.buildConfigOptions(),_meta:Bh(e.manager,b,{clientId:k.clientId})}}),l.onRequest("session/load",async m=>{let h=m??{},g=typeof h.sessionId=="string"?h.sessionId:void 0;if(!g)throw he(G.InvalidParams,"session/load requires sessionId");let w=await e.manager.resolveCanonicalId(g)??g,b=e.manager.get(w);if(!b){let A=await e.manager.loadFromDisk(w);if(!A)throw he(G.SessionNotFound,`session ${g} not found in memory or on disk`);b=await wa(e,A)}Rc(u,b,b.sessionId);let k=ui(l,b,u),{entries:S}=await b.attach(k,"full");u.attached.set(b.sessionId,{sessionId:b.sessionId,clientId:k.clientId,readonly:!1});for(let A of S){if(l.isClosed())break;await l.notify(A.method,Fs(Os(A.params,A.recordedAt),A.seq)).catch(()=>{})}b.replayPendingPermissions(k);let I=Nh(b),x=Dh(b);return{sessionId:b.sessionId,...I?{modes:I}:{},...x?{models:x}:{},configOptions:b.buildConfigOptions(),_meta:Bh(e.manager,b,{clientId:k.clientId})}}),l.onRequest("session/set_model",async m=>{let h=m?.sessionId;typeof h=="string"&&f(h,"session/set_model");let g=cH(m,e.manager);if(g.kind==="error")throw n.log.warn(g.logMessage),he(g.code,g.message);if(g.kind==="no_op")return n.log.warn(g.logMessage),await l.notify("session/update",{sessionId:g.sessionId,update:{sessionUpdate:"_hydra_current_model_update",currentModel:g.currentModel}}).catch(()=>{}),null;n.log.info(g.logMessage);let{modelId:w}=g,b=await g.session.forwardModelChange(w,m);return g.session.applyAgentConfigOptionResponse(b,"model"),g.session.applyModelChange(w),b}),l.onRequest("session/set_mode",async m=>{let h=m,g=h?.sessionId;if(typeof g=="string"&&f(g,"session/set_mode"),!h||typeof h.sessionId!="string")throw he(G.InvalidParams,"session/set_mode requires string sessionId");if(typeof h.modeId!="string")throw he(G.InvalidParams,"session/set_mode requires string modeId");let w=cr(e.manager,h.sessionId),b=await w.forwardRequest("session/set_mode",m);return w.applyModeChange(h.modeId),b}),l.onRequest("session/set_config_option",async m=>{let h=m,g=S=>he(G.InvalidParams,S),w=h?.sessionId;if(typeof w=="string"&&f(w,"session/set_config_option"),!h||typeof h.sessionId!="string")throw g("session/set_config_option requires string sessionId");if(typeof h.configId!="string")throw g("session/set_config_option requires string configId");if(typeof h.value!="string")throw g("session/set_config_option requires string value");let b=cr(e.manager,h.sessionId),k=b.buildConfigOptions().find(S=>S.id===h.configId);if(!k)throw g(`unknown configId ${JSON.stringify(h.configId)} for this session`);if(!k.options.some(S=>S.value===h.value))throw g(`value ${JSON.stringify(h.value)} is not valid for configId ${JSON.stringify(h.configId)}`);switch(h.configId){case"model":{if(h.value!==b.currentModel){let S=await b.forwardModelChange(h.value);b.applyAgentConfigOptionResponse(S,"model")}b.applyModelChange(h.value);break}case"mode":{h.value!==b.currentMode&&await b.forwardRequest("session/set_mode",{sessionId:h.sessionId,modeId:h.value}),b.applyModeChange(h.value);break}case"agent":{h.value!==b.agentId&&await b.setAgent(h.value);break}default:{let S=await b.forwardRequest("session/set_config_option",{sessionId:h.sessionId,configId:h.configId,value:h.value});b.applyAgentConfigOptionResponse(S,h.configId)&&b.broadcastConfigOptions()}}return{configOptions:b.buildConfigOptions()}}),l.setDefaultHandler(async(m,h)=>{let g=new Set(["hydra-acp/attention/set","hydra-acp/attention/clear"]),w=h.startsWith("session/"),b=h.startsWith("hydra-acp/");if(!w&&!b||m===null||typeof m!="object"||g.has(h))throw he(G.MethodNotFound,`Method not found: ${h}`);let k=m.sessionId;if(typeof k!="string")throw he(G.MethodNotFound,`Method not found: ${h}`);return f(k,h),cr(e.manager,k).forwardRequest(h,m)})})}async function iH(n,e){let t=n??{};if(typeof t.methodId!="string"||t.methodId.length===0)throw he(G.InvalidParams,"authenticate requires a non-empty methodId string");let r=t.methodId,s=t._meta?.["hydra-acp"],o=typeof s?.sessionId=="string"?s.sessionId:void 0,i=typeof s?.agentId=="string"?s.agentId:void 0,a=o!==void 0?e.manager.getAgentForSession(o):void 0;if(!a||!a.isAlive()){let p=i??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(p)}let d=a.authMethods??[],c=d.find(p=>p.id===r);if(!c){let p=d.map(m=>m.id);throw he(G.InvalidParams,`authenticate: methodId ${JSON.stringify(r)} is not advertised by agent ${a.agentId}; valid: [${p.map(m=>JSON.stringify(m)).join(", ")}]`)}let l=c._meta?.type,u=(()=>{let p=c._meta?.["terminal-auth"];if(p&&typeof p=="object"&&!Array.isArray(p))return p})();if((c.type??(l==="agent"||l==="terminal"?l:u!==void 0?"terminal":"agent"))==="terminal"){let p=(k,S)=>{if(!Array.isArray(k))throw he(G.InvalidParams,`authenticate: method ${JSON.stringify(r)} ${S} must be a string[]; got ${k===null?"null":typeof k}`);for(let I of k)if(typeof I!="string")throw he(G.InvalidParams,`authenticate: method ${JSON.stringify(r)} ${S} must be string[]; got non-string entry ${JSON.stringify(I)}`);return k},m=await e.manager.planSpawnForAgent(a.agentId),h,g;if(u?.args!==void 0){let k=typeof u.command=="string"?u.command:void 0;h=k!==void 0&&nT.isAbsolute(k)?k:m.command,g=p(u.args,'_meta["terminal-auth"].args')}else{let k=c.args!==void 0?{raw:c.args,label:"args"}:c._meta?.args!==void 0?{raw:c._meta.args,label:"_meta.args"}:void 0,S=k!==void 0?p(k.raw,k.label):[];h=m.command,g=[...m.args,...S]}let w={};for(let[k,S]of Object.entries(process.env))typeof S=="string"&&(w[k]=S);Object.assign(w,m.env);let b=tT.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${r}`),{kind:"terminal",command:h,args:g,env:w,cwd:b}}try{return await a.connection.request("authenticate",{methodId:r})}catch(p){throw ii(p,a)}}async function aH(n,e){let r=(n??{})._meta?.["hydra-acp"],s=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,i=s!==void 0?e.manager.getAgentForSession(s):void 0;if(!i||!i.isAlive()){let a=o??e.defaultAgent;i=await e.manager.bootstrapAgentForAuth(a)}return await i.connection.request("logout",{})}function Lh(n){return e=>{let t={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(t.receivedBytes=e.receivedBytes),"totalBytes"in e&&(t.totalBytes=e.totalBytes),"packageSpec"in e&&(t.packageSpec=e.packageSpec),n.notify(yp,t).catch(()=>{})}}function Nh(n){let e=n.availableModes();if(e.length===0)return;let t=e.map(s=>{let o={id:s.id,name:s.name??s.id};return s.description!==void 0&&(o.description=s.description),o});return{currentModeId:n.currentMode??e[0].id,availableModes:t}}function Dh(n){let e=n.availableModels();if(e.length===0)return;let t=e.map(s=>{let o={modelId:s.modelId};return s.name!==void 0&&(o.name=s.name),s.description!==void 0&&(o.description=s.description),o});return{currentModelId:n.currentModel??e[0].modelId,availableModels:t}}async function dH(n,e,t,r){return e?await r.isRetiredGeneration(n,e.upstreamSessionId)?{kind:"ignore",logMessage:`session/attach ignoring stale resume hint sessionId=${n} hintUpstream=${e.upstreamSessionId} recordUpstream=${t} (retired generation)`}:{kind:"honor"}:{kind:"none"}}function cH(n,e){if(!n||typeof n!="object")return{kind:"error",code:G.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let t=n;if(typeof t.sessionId!="string")return{kind:"error",code:G.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof t.modelId!="string")return{kind:"error",code:G.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${t.sessionId}`};let r=e.get(t.sessionId);if(!r)return{kind:"error",code:G.SessionNotFound,message:`session ${t.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${t.sessionId}`};let s=r.availableModels(),o=ac(t.modelId,s);if(o.kind==="none")return{kind:"ok",session:r,modelId:t.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)}`};if(o.kind==="exact")return{kind:"ok",session:r,modelId:t.modelId,logMessage:`session/set_model accepted sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)}`};if(o.kind==="resolved")return{kind:"ok",session:r,modelId:o.modelId,logMessage:`session/set_model resolved sessionId=${t.sessionId} requested=${JSON.stringify(t.modelId)} \u2192 ${JSON.stringify(o.modelId)}`};let i=s.map(d=>d.modelId).join(", "),a=o.kind==="ambiguous"?`ambiguous (trailing-segment matches [${o.candidates.join(", ")}])`:"not in availableModels";return r.currentModel!==void 0&&r.currentModel.length>0?{kind:"no_op",session:r,sessionId:t.sessionId,currentModel:r.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${t.sessionId} requested=${JSON.stringify(t.modelId)} ${a} actual=${JSON.stringify(r.currentModel)} agentId=${r.agentId} known=[${i}]`}:{kind:"error",code:G.InvalidParams,message:`model "${t.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${r.agentId}); known models: ${i}`,logMessage:`session/set_model rejected sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)} ${a} agentId=${r.agentId} known=[${i}] (no current model to fall back to)`}}async function lH(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0;if(!s)throw he(G.InvalidParams,"transformer/attach requires sessionId");if(!t.transformers)throw he(G.InternalError,"transformer manager not configured");let o=t.transformers.resolveChain([e])[0];if(!o)throw he(G.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return cr(t.manager,s).addTransformer(o),{ok:!0}}async function uH(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0,o=typeof r.reason=="string"?r.reason:void 0;if(!s)throw he(G.InvalidParams,"hydra-acp/attention/set requires string sessionId");if(!o)throw he(G.InvalidParams,"hydra-acp/attention/set requires string reason");return cr(t.manager,s).setAttentionFlag(e,o,r.payload),{ok:!0}}async function fH(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0,o=typeof r.reason=="string"?r.reason:void 0;if(!s)throw he(G.InvalidParams,"hydra-acp/attention/clear requires string sessionId");if(!o)throw he(G.InvalidParams,"hydra-acp/attention/clear requires string reason");return cr(t.manager,s).clearAttentionFlag(e,o),{ok:!0}}function pH(n){let e={sessionId:n.hydraSessionId,upstreamSessionId:n.upstreamSessionId,cwd:n.cwd,workspace:n.workspace,title:n.title,agentId:n.agentId,currentModel:n.currentModel,currentUsage:pa(n.currentUsage),forkedFromSessionId:n.forkedFromSessionId,forkedFromMessageId:n.forkedFromMessageId,forkSynthesisState:n.forkSynthesisState,originatingClient:n.originatingClient,interactive:n.interactive,updatedAt:n.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,armedTasks:0,awaitingInput:!1},t={currentMode:n.currentMode,agentArgs:n.agentArgs,availableCommands:n.agentCommands,availableModes:n.agentModes,availableModels:n.agentModels,armedTaskList:[]};return{[ft]:hp(e,t)}}function Bh(n,e,t={}){let r=n.liveListEntry(e),s={clientId:t.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(),armedTaskList:e.armedBackgroundTasks,...t.resurrected===!0?{resurrected:!0}:{}};return Bl(e.agentMeta,hp(r,s))}function hH(){return{protocolVersion:1,agentInfo:{name:"hydra",version:He},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,auth:{logout:{}},sessionCapabilities:{attach:{},list:{},resume:{},delete:{},close:{},fork:{}}},authMethods:[{id:"proxy",name:"Hydra proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:{...Bl(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0},session:{fork:{forkAt:!0,agentSwap:!0,synthesis:!0,model:!0}}}),steering:{supported:!0}}}}function mH(n,e){if(!(!e.transformers||!e.manager))for(let t of e.manager.defaultTransformers){let r=e.transformers.resolveChain([t])[0];r&&n.addTransformer(r)}}function sT(n,e){if(!e.transformers)return;let t=e.transformers.interestedIn("lifecycle:session.starting");for(let r of t)r.connection.notify("hydra-acp/transformer/session_event",{event:"session.starting",sessionId:n}).catch(()=>{})}function ui(n,e,t,r,s){return{clientId:s??`cli_${Mb(8)}`,connection:n,clientInfo:r}}function Rc(n,e,t){let r=n.attached.get(t);r&&(e.detach(r.clientId),n.attached.delete(t))}var Hh=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let t,r,s=new Promise((i,a)=>{t=i,r=a});s.catch(()=>{});let o={session:void 0,sessionReady:s,disposers:[]};return this.byToken.set(e,o),{complete:i=>{o.session=i,t(i)},abandon:i=>{this.byToken.delete(e),r(i??new Error("mcp token reservation abandoned"))}}}bind(e,t){let{complete:r}=this.reserve(e);r(t)}lookup(e){return this.byToken.get(e)}addDisposer(e,t){let r=this.byToken.get(e);r!==void 0&&r.disposers.push(t)}async unbind(e){let t=this.byToken.get(e);if(t!==void 0){this.byToken.delete(e);for(let r of t.disposers)try{await r()}catch{}}}size(){return this.byToken.size}};import{randomUUID as gH}from"crypto";import{McpServer as yH}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as wH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as Mn}from"zod";function _b(n){if(n.method!=="session/update")return null;let t=n.params?.update;return!t||typeof t.sessionUpdate!="string"?null:{kind:t.sessionUpdate,update:t}}function Zn(n){return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}var oT="Bearer ";function Ac(n){let e=n.headers.authorization;if(typeof e!="string"||!e.startsWith(oT))return;let t=e.slice(oT.length).trim();return t.length>0?t:void 0}function bH(n){let e=new yH({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:Mn.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:t})=>{let r=n.streamTail(t);return Zn(r)}),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:Mn.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:t})=>{let r=n.streamHead(t);return Zn(r)}),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:Mn.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:Mn.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:Mn.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:t,max_bytes:r,wait_ms:s})=>{let o=await n.streamRead(t,r,s);return Zn(o)}),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:Mn.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:Mn.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:t,timeout_ms:r})=>{let s=await n.streamWaitFor(t,r),o=n.streamInfo();return Zn({outcome:s,writeCursor:o.writeCursor,closed:o.closed})}),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:Mn.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:Mn.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:Mn.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:Mn.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:Mn.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:Mn.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:Mn.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:Mn.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:Mn.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 t=>{let r={pattern:t.pattern};t.regex!==void 0&&(r.regex=t.regex),t.case_insensitive!==void 0&&(r.caseInsensitive=t.case_insensitive),t.invert!==void 0&&(r.invert=t.invert),t.max_matches!==void 0&&(r.maxMatches=t.max_matches),t.max_bytes!==void 0&&(r.maxBytes=t.max_bytes),t.context_before!==void 0&&(r.contextBefore=t.context_before),t.context_after!==void 0&&(r.contextAfter=t.context_after),t.cursor!==void 0&&(r.cursor=t.cursor);let s=n.streamGrep(r);return Zn(s)}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let t=n.streamInfo();return Zn(t)}),e}var kH=1e4;function iT(n,e){let t=new Map;async function r(i,a){let d=t.get(i);if(d!==void 0)return d.transport;let c=bH(a),l=new wH({sessionIdGenerator:()=>gH()});await c.connect(l);let u={server:c,transport:l};return t.set(i,u),e.addDisposer(i,async()=>{t.delete(i);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function s(i,a){let d=Ac(i);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 f,p=new Promise(h=>{f=setTimeout(()=>h(void 0),kH)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(f!==void 0&&clearTimeout(f),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let u=await r(d,l);a.hijack(),await u.handleRequest(i.raw,a.raw,i.body)}let o={config:{skipAuth:!0}};n.post("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)}),n.get("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)}),n.delete("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)})}Cp();import{randomUUID as vH}from"crypto";import{McpServer as SH}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as xH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as js}from"zod";function IH(n){switch(n){case"prompt_received":return"user";case"tool_call":case"tool_call_update":return"tool";default:return"agent"}}var aT=2e3,dT=2e4;function CH(n,e,t){if(e!=="tool_call"&&e!=="tool_call_update")return dc([n]);let r=[],s=zl(t);s!==void 0?r.push(`Tool: ${s}`):typeof t.title=="string"&&t.title.length>0&&r.push(`Tool: ${t.title}`);let o=t.rawInput;if(o&&typeof o=="object"&&!Array.isArray(o))for(let[a,d]of Object.entries(o))typeof d=="string"&&d.length>0&&r.push(`${a}=${d}`);if(Array.isArray(t.locations))for(let a of t.locations)typeof a?.path=="string"&&a.path.length>0&&r.push(a.path);let i=Ip(t);return i!==void 0&&r.push(i),r.join(`
406
- `)}function RH(n,e){if(n.length<=148)return n;let s=Math.floor(148/2),o=e-s;o<0&&(o=0);let i=o+148;i>n.length&&(o=n.length-148,o<0&&(o=0));let a=n.slice(o,i);return o>0&&(a="\u2026"+a),i<n.length&&(a=a+"\u2026"),a}function AH(n){let e=new SH({name:"hydra-acp-recall",version:"1.0.0"},{instructions:"Search and retrieve detail from this session's pre-compaction history. After a compaction summary replaces earlier conversation in working memory, these tools let you page back specifics on demand. Use `search` to find entries by keyword, `range` to pull a contiguous slice verbatim, and `tool_calls` to enumerate prior tool invocations. These tools only return results once the session has been compacted at least once."});return e.registerTool("search",{description:"Search this session's prior conversation history (the part that was compacted out of your working memory) by keyword. Covers assistant and user messages, the arguments of every tool call including full shell commands, and what those calls printed. Returns matching entry ids with short snippets so you can decide which to pull in full via `range`. Use this when the compaction summary mentions something but you need the verbatim detail.",inputSchema:{query:js.string().min(1).describe("Case-insensitive substring to search for."),limit:js.number().int().min(1).max(50).optional().describe("Maximum number of matches to return (default 10, max 50)."),include_tool_calls:js.boolean().optional().describe("Whether to include tool_call entries in the search (default true).")}},async({query:t,limit:r=10,include_tool_calls:s=!0})=>{let o=await n();if(!o.summarizedThroughEntry||o.summarizedThroughEntry===0)return Zn({matches:[],total_matched:0,truncated:!1,note:"This session has no compacted history. `search` retrieves detail from entries that were summarized out of the working conversation; nothing has been summarized yet."});let i=[],a=t.toLowerCase();for await(let{entryId:c,entry:l}of o.iterRecallNewestFirst()){let u=_b(l);if(!u)continue;let{kind:f,update:p}=u;if((f==="tool_call"||f==="tool_call_update")&&!s)continue;let m=CH(l,f,p),h=m.toLowerCase().indexOf(a);if(h<0)continue;let g=IH(f),w=RH(m,h),b=typeof l.recordedAt=="number"?String(l.recordedAt):void 0;if(i.push({entryId:c,speaker:g,snippet:w,timestamp:b}),i.length>=r)break}i.sort((c,l)=>c.entryId-l.entryId);let d=i.length>=r;return Zn({matches:i,total_matched:i.length,truncated:d})}),e.registerTool("range",{description:"Pull a contiguous range of prior conversation entries verbatim from this session's pre-compaction history, including each tool call's arguments and what it printed. Use after `search` narrows in on what you need. Capped at 50 entries per call.",inputSchema:{from_entry:js.number().int().min(0).describe("Zero-based index of the first entry to include (inclusive)."),to_entry:js.number().int().min(0).describe("Zero-based index of the last entry to include (inclusive).")}},async({from_entry:t,to_entry:r})=>{let s=await n();if(!s.summarizedThroughEntry||s.summarizedThroughEntry===0)return Zn({text:"",entry_count:0,truncated:!1,note:"This session has no compacted history. `range` retrieves verbatim entries from the pre-compaction transcript; nothing has been compacted yet."});if(r<t)throw new Error(`range: to_entry (${r}) must be >= from_entry (${t})`);let o=r-t+1;if(o>50)throw new Error(`range: range size (${o}) exceeds maximum of 50 entries`);let i=await s.getRecallTotalCount();if(i===0)return Zn({text:"",entry_count:0,truncated:!1});let a=Math.min(t,i-1),d=Math.min(r,i-1),c=a>t||d<r;if(a>d)return{content:[{type:"text",text:""}],structuredContent:{text:"",entry_count:0,truncated:c}};let l=await s.sliceRecallHistory(a,d),u=dc(l,{toolOutput:{maxPerCall:aT,maxTotal:dT}});return{content:[{type:"text",text:u}],structuredContent:{text:u,entry_count:l.length,truncated:c}}}),e.registerTool("tool_calls",{description:"Search this session's prior tool invocations by tool name, ACP kind, and/or file path. Returns when each tool was called, its arguments (including the full shell command), the result status, and what the call printed. Use this to recall which files were read/edited, what shell commands ran, and what they output.",inputSchema:{tool_name:js.string().optional().describe("Case-insensitive substring of the tool name. Names vary by agent for the same tool (Bash, Terminal, bash), so prefer `kind` when you want every shell invocation."),kind:js.string().optional().describe("ACP tool kind: execute (shell), read, edit, think, other. Agent-independent, unlike tool_name."),file_path:js.string().optional(),limit:js.number().int().min(1).max(100).optional(),include_output:js.boolean().optional().describe("Include what each call printed (default true). Set false when you only need the commands and not their results.")}},async({tool_name:t,kind:r,file_path:s,limit:o=20,include_output:i=!0})=>{let a=await n();if(!a.summarizedThroughEntry||a.summarizedThroughEntry===0)return Zn({calls:[],truncated:!1,note:"This session has no compacted history. `tool_calls` retrieves tool invocations from the pre-compaction transcript; nothing has been compacted yet."});let d=typeof t=="string"&&t.length>0,c=typeof r=="string"&&r.length>0,l=typeof s=="string"&&s.length>0;if(!d&&!c&&!l)throw new Error("tool_calls: at least one of tool_name, kind, or file_path must be provided");let u=new Map,f=Math.max(o*4,200);for await(let{entryId:b,entry:k}of a.iterRecallNewestFirst()){let S=_b(k);if(!S)continue;let{kind:I,update:x}=S;if(I!=="tool_call"&&I!=="tool_call_update")continue;let A=typeof x.toolCallId=="string"&&x.toolCallId.length>0?x.toolCallId:`__noid_${b}`,_=u.get(A);if(_||(_={entryId:b,toolName:"(unnamed)",nameAuthoritative:!1,rawInput:{},locations:[],status:"in_progress"},u.set(A,_)),b<_.entryId&&(_.entryId=b),!_.nameAuthoritative){let $=zl(x);$!==void 0?(_.toolName=$,_.nameAuthoritative=!0):typeof x.name=="string"&&x.name.length>0?(_.toolName=x.name,_.nameAuthoritative=!0):I==="tool_call"&&typeof x.title=="string"&&x.title.length>0&&(_.toolName=x.title,_.nameAuthoritative=!0)}if(_.kind===void 0&&typeof x.kind=="string"&&x.kind.length>0&&(_.kind=x.kind),_.output===void 0){let $=Ip(x);$!==void 0&&(_.output=$)}let P=x.rawInput;if(P&&typeof P=="object"&&!Array.isArray(P)&&Object.keys(P).length>0)for(let[$,F]of Object.entries(P))_.rawInput[$]===void 0&&(_.rawInput[$]=F);if(Array.isArray(x.locations))for(let $ of x.locations){let F=$?.path;typeof F=="string"&&F.length>0&&!_.locations.includes(F)&&_.locations.push(F)}if(typeof x.status=="string"&&_.status==="in_progress"&&(_.status=x.status),k.recordedAt!==void 0&&_.timestamp===void 0&&(_.timestamp=String(k.recordedAt)),u.size>=f)break}let p=[...u.keys()].sort((b,k)=>u.get(b).entryId-u.get(k).entryId),m=[],h=dT,g=!1;for(let b of p){let k=u.get(b);if(k.toolName=xw({name:k.toolName,rawInput:k.rawInput,...k.kind!==void 0?{kind:k.kind}:{}}),d&&!k.toolName.toLowerCase().includes(t.toLowerCase())||c&&(k.kind??"").toLowerCase()!==r.toLowerCase())continue;if(l){let x=s.toLowerCase(),A=["file_path","filePath","path"],_=!1;for(let P of A){let $=k.rawInput[P];if(typeof $=="string"&&$.toLowerCase().includes(x)){_=!0;break}}if(!_){for(let P of k.locations)if(P.toLowerCase().includes(x)){_=!0;break}}if(!_)continue}let S={};for(let[x,A]of Object.entries(k.rawInput))typeof A=="string"?S[x]=A.length>500?A.slice(0,497)+"\u2026":A:(typeof A=="number"||typeof A=="boolean")&&(S[x]=A);k.locations.length>0&&S.locations===void 0&&(S.locations=k.locations);let I={entryId:k.entryId,tool:k.toolName,args:S,status:k.status,timestamp:k.timestamp};if(k.kind!==void 0&&(I.kind=k.kind),i&&k.output!==void 0){let x=k.output,A=Math.min(aT,h);if(A<=0)g=!0;else{let _=x.length<=A?x:x.slice(0,A-1)+"\u2026";I.output=_,I.outputBytes=x.length,I.outputTruncated=_.length<x.length,h-=_.length}}if(m.push(I),m.length>=o)break}let w=m.length>=o;return Zn({calls:m,truncated:w,...g?{outputBudgetExhausted:g}:{}})}),e}var TH=1e4;function cT(n,e){let t=new Map;async function r(i,a){let d=t.get(i);if(d!==void 0)return d.transport;let c=AH(a),l=new xH({sessionIdGenerator:()=>vH()});await c.connect(l);let u={server:c,transport:l};return t.set(i,u),e.addDisposer(i,async()=>{t.delete(i);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function s(i,a){let d=Ac(i);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 recall token"});return}let u=await r(d,async()=>{if(c.session!==void 0)return c.session;let f,p=new Promise(h=>{f=setTimeout(()=>h(void 0),TH)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(f!==void 0&&clearTimeout(f),m===void 0)throw new Error("recall: session not ready");return m});a.hijack(),await u.handleRequest(i.raw,a.raw,i.body)}let o={config:{skipAuth:!0}};n.post("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)}),n.get("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)}),n.delete("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)})}var Uh=class{byName=new Map;changeHandlers=[];register(e,t,r,s){this.byName.set(e,{connection:t,instructions:r,tools:[...s]}),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 t=this.changeHandlers.indexOf(e);t>=0&&this.changeHandlers.splice(t,1)}}fireChanged(e,t){for(let r of this.changeHandlers)try{r(e,t)}catch{}}};import{StreamableHTTPServerTransport as LH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as NH}from"crypto";import{Server as EH}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as PH,ListToolsRequestSchema as MH}from"@modelcontextprotocol/sdk/types.js";function lT(n,e,t,r){let s=typeof t=="function"?async()=>t():async()=>t,o=new EH({name:n,version:"1.0.0"},{capabilities:{tools:{listChanged:!0}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),i=a=>({name:a.name,description:a.description,inputSchema:a.inputSchema,...a.outputSchema!==void 0?{outputSchema:a.outputSchema}:{}});return o.setRequestHandler(MH,async()=>{let a=r?.peekSessionId?.();if(a!==void 0&&r?.fetchSessionTools!==void 0)try{let d=await r.fetchSessionTools(a);if(d!==void 0)return{tools:d.map(i)}}catch{}return{tools:e.tools.map(i)}}),o.setRequestHandler(PH,async(a,d)=>{let c=a.params.name,l=d._meta?.progressToken??d.requestId,u=$H(l,d.sendNotification);try{let f=await s(),p=await OH(e.connection,n,c,a.params.arguments??{},f);return FH(p,c)}catch(f){return $b(f instanceof Error?f.message:String(f))}finally{u()}}),o}var _H=15e3;function $H(n,e,t=_H){if(n===void 0)return()=>{};let r=0,s=setInterval(()=>{r+=1,e({method:"notifications/progress",params:{progressToken:n,progress:r}}).catch(()=>{})},t);return s.unref?.(),()=>clearInterval(s)}async function OH(n,e,t,r,s){return await n.request("hydra-acp/mcp_tools/invoke",{server:e,tool:t,args:r,sessionId:s})}function FH(n,e){if(n===null||typeof n!="object")return $b(`extension ${e} returned non-object`);let t=n;return Array.isArray(t.content)?t:$b(`extension ${e} omitted content array`)}function $b(n){return{content:[{type:"text",text:n}],isError:!0}}var DH=1e4;function uT(n,e,t){let r=new Map;async function s(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let u of r.values()){let f=u.get(l);f!==void 0&&(u.delete(l),s(f))}}async function i(l,u){for(let[f,p]of r){if(e.lookup(f)?.session?.sessionId!==l)continue;let h=p.get(u);if(h!==void 0)try{await h.server.sendToolListChanged()}catch{}}}t.onChange(l=>{o(l)});async function a(l,u){let f=r.get(l);f===void 0&&(f=new Map,r.set(l,f),e.addDisposer(l,async()=>{let S=r.get(l);if(S!==void 0){r.delete(l);for(let I of S.values())await s(I)}}));let p=f.get(u);if(p!==void 0)return p.transport;let m=t.lookup(u);if(m===void 0)return;let b=lT(u,m,async()=>{let S=e.lookup(l);if(S===void 0)throw new Error("mcp token no longer bound");if(S.session!==void 0)return S.session.sessionId;let I,x=new Promise(_=>{I=setTimeout(()=>_(void 0),DH)}),A=await Promise.race([S.sessionReady.catch(()=>{}),x]);if(I!==void 0&&clearTimeout(I),A===void 0)throw new Error("session not ready");return A.sessionId},{peekSessionId:()=>e.lookup(l)?.session?.sessionId,fetchSessionTools:async S=>{let I=await m.connection.request("hydra-acp/mcp_tools/list_tools",{sessionId:S});if(!I||typeof I!="object")return;let x=I.tools;if(!Array.isArray(x))return;let A=[];for(let _ of x){if(!_||typeof _!="object")continue;let P=_;if(typeof P.name!="string"||P.name.length===0||typeof P.description!="string"||P.inputSchema===null||typeof P.inputSchema!="object")continue;let $={name:P.name,description:P.description,inputSchema:P.inputSchema};P.outputSchema!==null&&typeof P.outputSchema=="object"&&($.outputSchema=P.outputSchema),A.push($)}return A}}),k=new LH({sessionIdGenerator:()=>NH()});return await b.connect(k),f.set(u,{server:b,transport:k}),k}async function d(l,u){let f=Ac(l);if(f===void 0){u.code(401).send({error:"missing bearer token"});return}if(e.lookup(f)===void 0){u.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,h=await a(f,m);if(h===void 0){u.code(404).send({error:`unknown mcp server: ${m}`});return}u.hijack(),await h.handleRequest(l.raw,u.raw,l.body)}let c={config:{skipAuth:!0}};return n.post("/mcp/:name",c,async(l,u)=>{await d(l,u)}),n.get("/mcp/:name",c,async(l,u)=>{await d(l,u)}),n.delete("/mcp/:name",c,async(l,u)=>{await d(l,u)}),{notifyToolListChanged:i}}async function yT(n,e){zH(n),Ll(n.daemon.scrubEnv);let t=n,r=n.daemon.tls?await qs.readFile(kt(n.daemon.tls.key)):void 0,s=n.daemon.tls?await qs.readFile(kt(n.daemon.tls.cert)):void 0;await qs.mkdir(D.home(),{recursive:!0});let{stream:o,fileStream:i}=await jH(n.daemon.logLevel),a=BH({logger:{level:n.daemon.logLevel,stream:o},bodyLimit:256*1024*1024});await a.register(HH,{options:{handleProtocols:sI}}),nw(ce=>{a.log.info(ce)}),ow(ce=>{a.log.info(ce)});let d=await ph.load(),c=await $h.load();Al(),xy(c);let l=new Fh(c);l.start();let u=new Ah(c);u.start();let f=new wh,p=new yh,m=new hh(e),h=new gh([m,new mh(d),p]),g=VR({validator:h});a.addHook("onRequest",async(ce,Je)=>{ce.routeOptions.config?.skipAuth||ce.url==="/acp"||ce.url?.startsWith("/acp?")||(await g(ce,Je),!Je.sent&&ce.authIdentity?.startsWith("script:")&&!QR(ce.method,ce.routeOptions.url)&&Je.code(403).send({error:"script tokens may only access read-only session data"}))});let w=setInterval(()=>{d.sweepExpired()},300*1e3);w.unref();let b=setInterval(()=>{f.sweepExpired()},300*1e3);b.unref();let k=new fp(n,{onFetched:()=>{LR(k,A)},onStaleFallback:(ce,Je)=>{let Ie=Math.round(Je/36e5),dn=Ie>=48?`${Math.round(Ie/24)}d`:`${Ie}h`;a.log.warn(`registry fetch failed (${ce.message}); serving stale cache last synced ${dn} ago; agent versions may be outdated ('hydra registry refresh' to retry)`)}});gb(ce=>a.log.info(ce));let S={info:ce=>a.log.info(ce),warn:ce=>a.log.warn(ce)},I=ce=>ti.spawn({...ce,stderrTailBytes:n.daemon.agentStderrTailBytes,logger:S});lI(n.compressToolContent);let x=new uh,A=new th(k,I,void 0,{idleTimeoutMs:n.daemon.sessionIdleTimeoutSeconds*1e3,orphanTimeoutMs:n.daemon.nonInteractiveOrphanTimeoutSeconds*1e3,sessionDefaults:n.sessionDefaults,synopsisAgent:n.synopsisAgent,synopsisModel:n.synopsisModel,compactionAgent:n.compaction?.agent,compactionModel:n.compaction?.model,defaultTransformers:n.defaultTransformers,sessionHistoryMaxEntries:n.daemon.sessionHistoryMaxEntries,sessionHistoryArchiveMaxBytes:n.daemon.sessionHistoryArchiveMaxBytes,sessionHistoryArchiveTiers:n.daemon.sessionHistoryArchiveTiers,logger:S,npmRegistry:n.npmRegistry,extensionCommands:x,defaultCwd:n.defaultCwd,disableWorkspaceSnapshots:n.disableWorkspaceSnapshots}),_=new Oh(c,void 0,{resolvesLocally:async ce=>await A.resolveCanonicalId(ce)!==void 0,cache:u}),P=new ch(cy(n),void 0,{tokenRegistry:p}),$=new lh(ly(n),void 0,{tokenRegistry:p}),F=[];EA(a,He,ai(n),()=>F);let J=new Hh,Y=new Uh,W,Z=()=>{if(W!==void 0)return W;let ce=a.server.address();return W=`http://127.0.0.1:${ce&&typeof ce=="object"?ce.port:n.daemon.port}`,W},ne={agentId:n.defaultAgent,cwd:n.defaultCwd,publicHost:n.daemon.publicHost,host:n.daemon.host,port:n.daemon.port,compaction:n.compaction};AA(a,A,ne,{extensionMcp:Y,mcpTokenRegistry:J,getDaemonOrigin:Z},c,u),SA(a,{store:c,localMiss:{resolvesLocally:async ce=>await A.resolveCanonicalId(ce)!==void 0,cache:u}}),TA(a,k,A,{npmRegistry:n.npmRegistry}),PA(a,P),MA(a,$),_A(a,()=>({defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,sessionDefaults:{...t.sessionDefaults},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},defaultTransformers:[...t.defaultTransformers]})),HA(a,{store:d,rateLimiter:f,staticTokenValidator:m}),zA(a,{store:c,health:l}),VA(a,{processRegistry:p}),iT(a,J),cT(a,J);let Se=uT(a,J,Y);rT(a,{validator:h,manager:A,defaultAgent:n.defaultAgent,processRegistry:p,onExtensionVersion:(ce,Je)=>P.reportVersion(ce,Je),onTransformerVersion:(ce,Je)=>$.reportVersion(ce,Je),transformers:$,extensionCommands:x,mcpTokenRegistry:J,extensionMcp:Y,extensionMcpControls:Se,getDaemonOrigin:Z,registry:k,foreignSessions:_});let Le=!!n.daemon.tls;await a.listen({host:Le?"127.0.0.1":n.daemon.host,port:Le?0:n.daemon.port});let Re=a.server.address(),Ge=Re&&typeof Re=="object"?Re.port:n.daemon.port,Ae,de=n.daemon.host,Ne=Ge;if(Le&&r&&s){Ae=qH({listenHost:n.daemon.host,listenPort:n.daemon.port,upstreamHost:"127.0.0.1",upstreamPort:Ge,tlsOptions:{key:r,cert:s},logger:a.log});let ce=Ae.address();ce&&typeof ce=="object"&&(Ne=ce.port)}await qs.mkdir(D.home(),{recursive:!0}),await ix({pid:process.pid,host:de,port:Ne,loopbackPort:Ge,startedAt:new Date().toISOString()});let at={daemonUrl:`http://127.0.0.1:${Ge}`,daemonHost:"127.0.0.1",daemonPort:Ge,serviceToken:e,daemonWsUrl:`ws://127.0.0.1:${Ge}/acp`,hydraHome:D.home()};P.setContext(at),$.setContext(at),await P.start(),await $.start();try{await A.reconcilePermissionFlags()}catch(ce){a.log.warn(`permission flag reconcile failed: ${ce.message}`)}try{await A.seedSessionIndex()}catch(ce){a.log.warn(`session index seed failed: ${ce.message}`)}A.resurrectPendingQueues().catch(ce=>{a.log.warn(`queue replay scan failed: ${ce.message}`)}),A.resumePendingCompactions().catch(ce=>{a.log.warn(`compaction resume scan failed: ${ce.message}`)}),A.resumePendingAgentSwaps().catch(ce=>{a.log.warn(`agent-swap resume scan failed: ${ce.message}`)});let Rt=n.daemon.agentSyncIntervalMinutes*60*1e3,Pe=Rt>0?NR({registry:k,manager:A,intervalMs:Rt,logger:S}):void 0,Jt=n.daemon.sessionGcIntervalMinutes*60*1e3,Ve=n.daemon.sessionGcMaxAgeDays*24*60*60*1e3,ys=Jt>0?DR({manager:A,intervalMs:Jt,maxAgeMs:Ve,logger:S}):void 0,Ci=WR({bootConfig:n,apply:ce=>{t=ce,k.setConfig(ce),A.setLiveConfig({sessionDefaults:ce.sessionDefaults}),ne.agentId=ce.defaultAgent,ne.cwd=ce.defaultCwd,Ll(ce.daemon.scrubEnv)},onDrift:ce=>{F=ce},logger:S});return{app:a,manager:A,registry:k,extensions:P,transformers:$,mcpTokenRegistry:J,extensionMcp:Y,processRegistry:p,shutdown:async()=>{l.stop(),u.stop(),Ci(),ys&&ys(),Pe&&Pe(),clearInterval(w),clearInterval(b);let ce=async(Je,Ie)=>{try{await Ie()}catch(dn){a.log.warn(`shutdown step ${Je} failed: ${dn instanceof Error?dn.message:String(dn)}`)}};await ce("sessionTokenStore.flush",()=>d.flush()),await ce("extensions.stop",()=>P.stop()),await ce("transformers.stop",()=>$.stop()),await ce("manager.closeAll",()=>A.closeAll()),await ce("manager.flushSynopsis",()=>A.flushSynopsis(3e4)),await ce("manager.shutdownSynopsis",()=>A.shutdownSynopsis()),await ce("manager.flushMetaWrites",()=>A.flushMetaWrites()),await ce("manager.flushHistoryWrites",()=>A.flushHistoryWrites()),nw(null),ow(null),gb(null),Ae&&await ce("tlsTerminator.close",()=>new Promise(Je=>Ae.close(()=>Je()))),await ce("app.close",()=>a.close());try{hT.unlinkSync(D.pidFile())}catch{}await ce("fileStream.flushSync",()=>i.flushSync())}}}var pT=20;async function WH(n,e){let t=Tc.dirname(n),r=Tc.basename(n,".log"),s=new RegExp(`^${r}\\.(\\d+)\\.log$`),o;try{o=await qs.readdir(t)}catch{return}let i=[];for(let d of o){let c=d.match(s);c&&i.push({name:d,n:Number(c[1])})}if(i.length<=e)return;i.sort((d,c)=>d.n-c.n);let a=i.slice(0,i.length-e);await Promise.allSettled(a.map(d=>qs.unlink(Tc.join(t,d.name))))}async function jH(n){await WH(D.logFile(),pT);let e=await UH({file:D.logFile(),size:"10m",mkdir:!0,symlink:oh,limit:{count:pT,removeOtherLogFiles:!0}}),t=fT.destination(2);return{stream:fT.multistream([{stream:e,level:n},{stream:t,level:n}]),fileStream:e}}function qH(n){let e=gT.createServer(n.tlsOptions,t=>{let r=mT.connect({host:n.upstreamHost,port:n.upstreamPort}),s=!1,o=i=>{if(!s){s=!0,i&&n.logger.warn(`tls terminator forwarder error: ${i.message??String(i)}`);try{t.destroy()}catch{}try{r.destroy()}catch{}}};t.on("error",o),r.on("error",o),t.on("close",()=>o()),r.on("close",()=>o()),t.pipe(r),r.pipe(t)});return e.on("tlsClientError",t=>{n.logger.warn(`tls handshake error: ${t.message}`)}),e.listen({host:n.listenHost,port:n.listenPort}),e}function zH(n){let e=n.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!n.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}va();dr();vc();Su();async function xT(n={}){let e=await go(),t=await bl();if(await Wh(e)){let s=await Mc();process.stdout.write(`Daemon already running${s?` (pid ${s.pid})`:""}. Run \`hydra-acp daemon restart\` to restart it.
406
+ `)}function RH(n,e){if(n.length<=148)return n;let s=Math.floor(148/2),o=e-s;o<0&&(o=0);let i=o+148;i>n.length&&(o=n.length-148,o<0&&(o=0));let a=n.slice(o,i);return o>0&&(a="\u2026"+a),i<n.length&&(a=a+"\u2026"),a}function AH(n){let e=new SH({name:"hydra-acp-recall",version:"1.0.0"},{instructions:"Search and retrieve detail from this session's pre-compaction history. After a compaction summary replaces earlier conversation in working memory, these tools let you page back specifics on demand. Use `search` to find entries by keyword, `range` to pull a contiguous slice verbatim, and `tool_calls` to enumerate prior tool invocations. These tools only return results once the session has been compacted at least once."});return e.registerTool("search",{description:"Search this session's prior conversation history (the part that was compacted out of your working memory) by keyword. Covers assistant and user messages, the arguments of every tool call including full shell commands, and what those calls printed. Returns matching entry ids with short snippets so you can decide which to pull in full via `range`. Use this when the compaction summary mentions something but you need the verbatim detail.",inputSchema:{query:js.string().min(1).describe("Case-insensitive substring to search for."),limit:js.number().int().min(1).max(50).optional().describe("Maximum number of matches to return (default 10, max 50)."),include_tool_calls:js.boolean().optional().describe("Whether to include tool_call entries in the search (default true).")}},async({query:t,limit:r=10,include_tool_calls:s=!0})=>{let o=await n();if(!o.summarizedThroughEntry||o.summarizedThroughEntry===0)return Zn({matches:[],total_matched:0,truncated:!1,note:"This session has no compacted history. `search` retrieves detail from entries that were summarized out of the working conversation; nothing has been summarized yet."});let i=[],a=t.toLowerCase();for await(let{entryId:c,entry:l}of o.iterRecallNewestFirst()){let u=_b(l);if(!u)continue;let{kind:f,update:p}=u;if((f==="tool_call"||f==="tool_call_update")&&!s)continue;let m=CH(l,f,p),h=m.toLowerCase().indexOf(a);if(h<0)continue;let g=IH(f),w=RH(m,h),b=typeof l.recordedAt=="number"?String(l.recordedAt):void 0;if(i.push({entryId:c,speaker:g,snippet:w,timestamp:b}),i.length>=r)break}i.sort((c,l)=>c.entryId-l.entryId);let d=i.length>=r;return Zn({matches:i,total_matched:i.length,truncated:d})}),e.registerTool("range",{description:"Pull a contiguous range of prior conversation entries verbatim from this session's pre-compaction history, including each tool call's arguments and what it printed. Use after `search` narrows in on what you need. Capped at 50 entries per call.",inputSchema:{from_entry:js.number().int().min(0).describe("Zero-based index of the first entry to include (inclusive)."),to_entry:js.number().int().min(0).describe("Zero-based index of the last entry to include (inclusive).")}},async({from_entry:t,to_entry:r})=>{let s=await n();if(!s.summarizedThroughEntry||s.summarizedThroughEntry===0)return Zn({text:"",entry_count:0,truncated:!1,note:"This session has no compacted history. `range` retrieves verbatim entries from the pre-compaction transcript; nothing has been compacted yet."});if(r<t)throw new Error(`range: to_entry (${r}) must be >= from_entry (${t})`);let o=r-t+1;if(o>50)throw new Error(`range: range size (${o}) exceeds maximum of 50 entries`);let i=await s.getRecallTotalCount();if(i===0)return Zn({text:"",entry_count:0,truncated:!1});let a=Math.min(t,i-1),d=Math.min(r,i-1),c=a>t||d<r;if(a>d)return{content:[{type:"text",text:""}],structuredContent:{text:"",entry_count:0,truncated:c}};let l=await s.sliceRecallHistory(a,d),u=dc(l,{toolOutput:{maxPerCall:aT,maxTotal:dT}});return{content:[{type:"text",text:u}],structuredContent:{text:u,entry_count:l.length,truncated:c}}}),e.registerTool("tool_calls",{description:"Search this session's prior tool invocations by tool name, ACP kind, and/or file path. Returns when each tool was called, its arguments (including the full shell command), the result status, and what the call printed. Use this to recall which files were read/edited, what shell commands ran, and what they output.",inputSchema:{tool_name:js.string().optional().describe("Case-insensitive substring of the tool name. Names vary by agent for the same tool (Bash, Terminal, bash), so prefer `kind` when you want every shell invocation."),kind:js.string().optional().describe("ACP tool kind: execute (shell), read, edit, think, other. Agent-independent, unlike tool_name."),file_path:js.string().optional(),limit:js.number().int().min(1).max(100).optional(),include_output:js.boolean().optional().describe("Include what each call printed (default true). Set false when you only need the commands and not their results.")}},async({tool_name:t,kind:r,file_path:s,limit:o=20,include_output:i=!0})=>{let a=await n();if(!a.summarizedThroughEntry||a.summarizedThroughEntry===0)return Zn({calls:[],truncated:!1,note:"This session has no compacted history. `tool_calls` retrieves tool invocations from the pre-compaction transcript; nothing has been compacted yet."});let d=typeof t=="string"&&t.length>0,c=typeof r=="string"&&r.length>0,l=typeof s=="string"&&s.length>0;if(!d&&!c&&!l)throw new Error("tool_calls: at least one of tool_name, kind, or file_path must be provided");let u=new Map,f=Math.max(o*4,200);for await(let{entryId:b,entry:k}of a.iterRecallNewestFirst()){let S=_b(k);if(!S)continue;let{kind:I,update:x}=S;if(I!=="tool_call"&&I!=="tool_call_update")continue;let A=typeof x.toolCallId=="string"&&x.toolCallId.length>0?x.toolCallId:`__noid_${b}`,_=u.get(A);if(_||(_={entryId:b,toolName:"(unnamed)",nameAuthoritative:!1,rawInput:{},locations:[],status:"in_progress"},u.set(A,_)),b<_.entryId&&(_.entryId=b),!_.nameAuthoritative){let $=zl(x);$!==void 0?(_.toolName=$,_.nameAuthoritative=!0):typeof x.name=="string"&&x.name.length>0?(_.toolName=x.name,_.nameAuthoritative=!0):I==="tool_call"&&typeof x.title=="string"&&x.title.length>0&&(_.toolName=x.title,_.nameAuthoritative=!0)}if(_.kind===void 0&&typeof x.kind=="string"&&x.kind.length>0&&(_.kind=x.kind),_.output===void 0){let $=Ip(x);$!==void 0&&(_.output=$)}let P=x.rawInput;if(P&&typeof P=="object"&&!Array.isArray(P)&&Object.keys(P).length>0)for(let[$,F]of Object.entries(P))_.rawInput[$]===void 0&&(_.rawInput[$]=F);if(Array.isArray(x.locations))for(let $ of x.locations){let F=$?.path;typeof F=="string"&&F.length>0&&!_.locations.includes(F)&&_.locations.push(F)}if(typeof x.status=="string"&&_.status==="in_progress"&&(_.status=x.status),k.recordedAt!==void 0&&_.timestamp===void 0&&(_.timestamp=String(k.recordedAt)),u.size>=f)break}let p=[...u.keys()].sort((b,k)=>u.get(b).entryId-u.get(k).entryId),m=[],h=dT,g=!1;for(let b of p){let k=u.get(b);if(k.toolName=xw({name:k.toolName,rawInput:k.rawInput,...k.kind!==void 0?{kind:k.kind}:{}}),d&&!k.toolName.toLowerCase().includes(t.toLowerCase())||c&&(k.kind??"").toLowerCase()!==r.toLowerCase())continue;if(l){let x=s.toLowerCase(),A=["file_path","filePath","path"],_=!1;for(let P of A){let $=k.rawInput[P];if(typeof $=="string"&&$.toLowerCase().includes(x)){_=!0;break}}if(!_){for(let P of k.locations)if(P.toLowerCase().includes(x)){_=!0;break}}if(!_)continue}let S={};for(let[x,A]of Object.entries(k.rawInput))typeof A=="string"?S[x]=A.length>500?A.slice(0,497)+"\u2026":A:(typeof A=="number"||typeof A=="boolean")&&(S[x]=A);k.locations.length>0&&S.locations===void 0&&(S.locations=k.locations);let I={entryId:k.entryId,tool:k.toolName,args:S,status:k.status,timestamp:k.timestamp};if(k.kind!==void 0&&(I.kind=k.kind),i&&k.output!==void 0){let x=k.output,A=Math.min(aT,h);if(A<=0)g=!0;else{let _=x.length<=A?x:x.slice(0,A-1)+"\u2026";I.output=_,I.outputBytes=x.length,I.outputTruncated=_.length<x.length,h-=_.length}}if(m.push(I),m.length>=o)break}let w=m.length>=o;return Zn({calls:m,truncated:w,...g?{outputBudgetExhausted:g}:{}})}),e}var TH=1e4;function cT(n,e){let t=new Map;async function r(i,a){let d=t.get(i);if(d!==void 0)return d.transport;let c=AH(a),l=new xH({sessionIdGenerator:()=>vH()});await c.connect(l);let u={server:c,transport:l};return t.set(i,u),e.addDisposer(i,async()=>{t.delete(i);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function s(i,a){let d=Ac(i);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 recall token"});return}let u=await r(d,async()=>{if(c.session!==void 0)return c.session;let f,p=new Promise(h=>{f=setTimeout(()=>h(void 0),TH)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(f!==void 0&&clearTimeout(f),m===void 0)throw new Error("recall: session not ready");return m});a.hijack(),await u.handleRequest(i.raw,a.raw,i.body)}let o={config:{skipAuth:!0}};n.post("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)}),n.get("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)}),n.delete("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)})}var Uh=class{byName=new Map;changeHandlers=[];register(e,t,r,s){this.byName.set(e,{connection:t,instructions:r,tools:[...s]}),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 t=this.changeHandlers.indexOf(e);t>=0&&this.changeHandlers.splice(t,1)}}fireChanged(e,t){for(let r of this.changeHandlers)try{r(e,t)}catch{}}};import{StreamableHTTPServerTransport as LH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as NH}from"crypto";import{Server as EH}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as PH,ListToolsRequestSchema as MH}from"@modelcontextprotocol/sdk/types.js";function lT(n,e,t,r){let s=typeof t=="function"?async()=>t():async()=>t,o=new EH({name:n,version:"1.0.0"},{capabilities:{tools:{listChanged:!0}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),i=a=>({name:a.name,description:a.description,inputSchema:a.inputSchema,...a.outputSchema!==void 0?{outputSchema:a.outputSchema}:{}});return o.setRequestHandler(MH,async()=>{let a=r?.peekSessionId?.();if(a!==void 0&&r?.fetchSessionTools!==void 0)try{let d=await r.fetchSessionTools(a);if(d!==void 0)return{tools:d.map(i)}}catch{}return{tools:e.tools.map(i)}}),o.setRequestHandler(PH,async(a,d)=>{let c=a.params.name,l=d._meta?.progressToken??d.requestId,u=$H(l,d.sendNotification);try{let f=await s(),p=await OH(e.connection,n,c,a.params.arguments??{},f);return FH(p,c)}catch(f){return $b(f instanceof Error?f.message:String(f))}finally{u()}}),o}var _H=15e3;function $H(n,e,t=_H){if(n===void 0)return()=>{};let r=0,s=setInterval(()=>{r+=1,e({method:"notifications/progress",params:{progressToken:n,progress:r}}).catch(()=>{})},t);return s.unref?.(),()=>clearInterval(s)}async function OH(n,e,t,r,s){return await n.request("hydra-acp/mcp_tools/invoke",{server:e,tool:t,args:r,sessionId:s})}function FH(n,e){if(n===null||typeof n!="object")return $b(`extension ${e} returned non-object`);let t=n;return Array.isArray(t.content)?t:$b(`extension ${e} omitted content array`)}function $b(n){return{content:[{type:"text",text:n}],isError:!0}}var DH=1e4;function uT(n,e,t){let r=new Map;async function s(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let u of r.values()){let f=u.get(l);f!==void 0&&(u.delete(l),s(f))}}async function i(l,u){for(let[f,p]of r){if(e.lookup(f)?.session?.sessionId!==l)continue;let h=p.get(u);if(h!==void 0)try{await h.server.sendToolListChanged()}catch{}}}t.onChange(l=>{o(l)});async function a(l,u){let f=r.get(l);f===void 0&&(f=new Map,r.set(l,f),e.addDisposer(l,async()=>{let S=r.get(l);if(S!==void 0){r.delete(l);for(let I of S.values())await s(I)}}));let p=f.get(u);if(p!==void 0)return p.transport;let m=t.lookup(u);if(m===void 0)return;let b=lT(u,m,async()=>{let S=e.lookup(l);if(S===void 0)throw new Error("mcp token no longer bound");if(S.session!==void 0)return S.session.sessionId;let I,x=new Promise(_=>{I=setTimeout(()=>_(void 0),DH)}),A=await Promise.race([S.sessionReady.catch(()=>{}),x]);if(I!==void 0&&clearTimeout(I),A===void 0)throw new Error("session not ready");return A.sessionId},{peekSessionId:()=>e.lookup(l)?.session?.sessionId,fetchSessionTools:async S=>{let I=await m.connection.request("hydra-acp/mcp_tools/list_tools",{sessionId:S});if(!I||typeof I!="object")return;let x=I.tools;if(!Array.isArray(x))return;let A=[];for(let _ of x){if(!_||typeof _!="object")continue;let P=_;if(typeof P.name!="string"||P.name.length===0||typeof P.description!="string"||P.inputSchema===null||typeof P.inputSchema!="object")continue;let $={name:P.name,description:P.description,inputSchema:P.inputSchema};P.outputSchema!==null&&typeof P.outputSchema=="object"&&($.outputSchema=P.outputSchema),A.push($)}return A}}),k=new LH({sessionIdGenerator:()=>NH()});return await b.connect(k),f.set(u,{server:b,transport:k}),k}async function d(l,u){let f=Ac(l);if(f===void 0){u.code(401).send({error:"missing bearer token"});return}if(e.lookup(f)===void 0){u.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,h=await a(f,m);if(h===void 0){u.code(404).send({error:`unknown mcp server: ${m}`});return}u.hijack(),await h.handleRequest(l.raw,u.raw,l.body)}let c={config:{skipAuth:!0}};return n.post("/mcp/:name",c,async(l,u)=>{await d(l,u)}),n.get("/mcp/:name",c,async(l,u)=>{await d(l,u)}),n.delete("/mcp/:name",c,async(l,u)=>{await d(l,u)}),{notifyToolListChanged:i}}async function yT(n,e){zH(n),Ll(n.daemon.scrubEnv);let t=n,r=n.daemon.tls?await qs.readFile(kt(n.daemon.tls.key)):void 0,s=n.daemon.tls?await qs.readFile(kt(n.daemon.tls.cert)):void 0;await qs.mkdir(D.home(),{recursive:!0});let{stream:o,fileStream:i}=await jH(n.daemon.logLevel),a=BH({logger:{level:n.daemon.logLevel,stream:o},bodyLimit:256*1024*1024});await a.register(HH,{options:{handleProtocols:sI}}),nw(ce=>{a.log.info(ce)}),ow(ce=>{a.log.info(ce)});let d=await ph.load(),c=await $h.load();Al(),xy(c);let l=new Fh(c);l.start();let u=new Ah(c);u.start();let f=new wh,p=new yh,m=new hh(e),h=new gh([m,new mh(d),p]),g=VR({validator:h});a.addHook("onRequest",async(ce,Je)=>{ce.routeOptions.config?.skipAuth||ce.url==="/acp"||ce.url?.startsWith("/acp?")||(await g(ce,Je),!Je.sent&&ce.authIdentity?.startsWith("script:")&&!QR(ce.method,ce.routeOptions.url)&&Je.code(403).send({error:"script tokens may only access read-only session data"}))});let w=setInterval(()=>{d.sweepExpired()},300*1e3);w.unref();let b=setInterval(()=>{f.sweepExpired()},300*1e3);b.unref();let k=new fp(n,{onFetched:()=>{LR(k,A)},onStaleFallback:(ce,Je)=>{let xe=Math.round(Je/36e5),dn=xe>=48?`${Math.round(xe/24)}d`:`${xe}h`;a.log.warn(`registry fetch failed (${ce.message}); serving stale cache last synced ${dn} ago; agent versions may be outdated ('hydra registry refresh' to retry)`)}});gb(ce=>a.log.info(ce));let S={info:ce=>a.log.info(ce),warn:ce=>a.log.warn(ce)},I=ce=>ti.spawn({...ce,stderrTailBytes:n.daemon.agentStderrTailBytes,logger:S});lI(n.compressToolContent);let x=new uh,A=new th(k,I,void 0,{idleTimeoutMs:n.daemon.sessionIdleTimeoutSeconds*1e3,orphanTimeoutMs:n.daemon.nonInteractiveOrphanTimeoutSeconds*1e3,sessionDefaults:n.sessionDefaults,synopsisAgent:n.synopsisAgent,synopsisModel:n.synopsisModel,compactionAgent:n.compaction?.agent,compactionModel:n.compaction?.model,defaultTransformers:n.defaultTransformers,sessionHistoryMaxEntries:n.daemon.sessionHistoryMaxEntries,sessionHistoryArchiveMaxBytes:n.daemon.sessionHistoryArchiveMaxBytes,sessionHistoryArchiveTiers:n.daemon.sessionHistoryArchiveTiers,logger:S,npmRegistry:n.npmRegistry,extensionCommands:x,defaultCwd:n.defaultCwd,disableWorkspaceSnapshots:n.disableWorkspaceSnapshots}),_=new Oh(c,void 0,{resolvesLocally:async ce=>await A.resolveCanonicalId(ce)!==void 0,cache:u}),P=new ch(cy(n),void 0,{tokenRegistry:p}),$=new lh(ly(n),void 0,{tokenRegistry:p}),F=[];EA(a,He,ai(n),()=>F);let J=new Hh,Y=new Uh,W,Z=()=>{if(W!==void 0)return W;let ce=a.server.address();return W=`http://127.0.0.1:${ce&&typeof ce=="object"?ce.port:n.daemon.port}`,W},ne={agentId:n.defaultAgent,cwd:n.defaultCwd,publicHost:n.daemon.publicHost,host:n.daemon.host,port:n.daemon.port,compaction:n.compaction};AA(a,A,ne,{extensionMcp:Y,mcpTokenRegistry:J,getDaemonOrigin:Z},c,u),SA(a,{store:c,localMiss:{resolvesLocally:async ce=>await A.resolveCanonicalId(ce)!==void 0,cache:u}}),TA(a,k,A,{npmRegistry:n.npmRegistry}),PA(a,P),MA(a,$),_A(a,()=>({defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,sessionDefaults:{...t.sessionDefaults},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},defaultTransformers:[...t.defaultTransformers]})),HA(a,{store:d,rateLimiter:f,staticTokenValidator:m}),zA(a,{store:c,health:l}),VA(a,{processRegistry:p}),iT(a,J),cT(a,J);let Se=uT(a,J,Y);rT(a,{validator:h,manager:A,defaultAgent:n.defaultAgent,processRegistry:p,onExtensionVersion:(ce,Je)=>P.reportVersion(ce,Je),onTransformerVersion:(ce,Je)=>$.reportVersion(ce,Je),transformers:$,extensionCommands:x,mcpTokenRegistry:J,extensionMcp:Y,extensionMcpControls:Se,getDaemonOrigin:Z,registry:k,foreignSessions:_});let Le=!!n.daemon.tls;await a.listen({host:Le?"127.0.0.1":n.daemon.host,port:Le?0:n.daemon.port});let Re=a.server.address(),Ge=Re&&typeof Re=="object"?Re.port:n.daemon.port,Ae,de=n.daemon.host,Ne=Ge;if(Le&&r&&s){Ae=qH({listenHost:n.daemon.host,listenPort:n.daemon.port,upstreamHost:"127.0.0.1",upstreamPort:Ge,tlsOptions:{key:r,cert:s},logger:a.log});let ce=Ae.address();ce&&typeof ce=="object"&&(Ne=ce.port)}await qs.mkdir(D.home(),{recursive:!0}),await ix({pid:process.pid,host:de,port:Ne,loopbackPort:Ge,startedAt:new Date().toISOString()});let at={daemonUrl:`http://127.0.0.1:${Ge}`,daemonHost:"127.0.0.1",daemonPort:Ge,serviceToken:e,daemonWsUrl:`ws://127.0.0.1:${Ge}/acp`,hydraHome:D.home()};P.setContext(at),$.setContext(at),await P.start(),await $.start();try{await A.reconcilePermissionFlags()}catch(ce){a.log.warn(`permission flag reconcile failed: ${ce.message}`)}try{await A.seedSessionIndex()}catch(ce){a.log.warn(`session index seed failed: ${ce.message}`)}A.resurrectPendingQueues().catch(ce=>{a.log.warn(`queue replay scan failed: ${ce.message}`)}),A.resumePendingCompactions().catch(ce=>{a.log.warn(`compaction resume scan failed: ${ce.message}`)}),A.resumePendingAgentSwaps().catch(ce=>{a.log.warn(`agent-swap resume scan failed: ${ce.message}`)});let Rt=n.daemon.agentSyncIntervalMinutes*60*1e3,Pe=Rt>0?NR({registry:k,manager:A,intervalMs:Rt,logger:S}):void 0,Jt=n.daemon.sessionGcIntervalMinutes*60*1e3,Ve=n.daemon.sessionGcMaxAgeDays*24*60*60*1e3,ys=Jt>0?DR({manager:A,intervalMs:Jt,maxAgeMs:Ve,logger:S}):void 0,Ci=WR({bootConfig:n,apply:ce=>{t=ce,k.setConfig(ce),A.setLiveConfig({sessionDefaults:ce.sessionDefaults}),ne.agentId=ce.defaultAgent,ne.cwd=ce.defaultCwd,Ll(ce.daemon.scrubEnv)},onDrift:ce=>{F=ce},logger:S});return{app:a,manager:A,registry:k,extensions:P,transformers:$,mcpTokenRegistry:J,extensionMcp:Y,processRegistry:p,shutdown:async()=>{l.stop(),u.stop(),Ci(),ys&&ys(),Pe&&Pe(),clearInterval(w),clearInterval(b);let ce=async(Je,xe)=>{try{await xe()}catch(dn){a.log.warn(`shutdown step ${Je} failed: ${dn instanceof Error?dn.message:String(dn)}`)}};await ce("sessionTokenStore.flush",()=>d.flush()),await ce("extensions.stop",()=>P.stop()),await ce("transformers.stop",()=>$.stop()),await ce("manager.closeAll",()=>A.closeAll()),await ce("manager.flushSynopsis",()=>A.flushSynopsis(3e4)),await ce("manager.shutdownSynopsis",()=>A.shutdownSynopsis()),await ce("manager.flushMetaWrites",()=>A.flushMetaWrites()),await ce("manager.flushHistoryWrites",()=>A.flushHistoryWrites()),nw(null),ow(null),gb(null),Ae&&await ce("tlsTerminator.close",()=>new Promise(Je=>Ae.close(()=>Je()))),await ce("app.close",()=>a.close());try{hT.unlinkSync(D.pidFile())}catch{}await ce("fileStream.flushSync",()=>i.flushSync())}}}var pT=20;async function WH(n,e){let t=Tc.dirname(n),r=Tc.basename(n,".log"),s=new RegExp(`^${r}\\.(\\d+)\\.log$`),o;try{o=await qs.readdir(t)}catch{return}let i=[];for(let d of o){let c=d.match(s);c&&i.push({name:d,n:Number(c[1])})}if(i.length<=e)return;i.sort((d,c)=>d.n-c.n);let a=i.slice(0,i.length-e);await Promise.allSettled(a.map(d=>qs.unlink(Tc.join(t,d.name))))}async function jH(n){await WH(D.logFile(),pT);let e=await UH({file:D.logFile(),size:"10m",mkdir:!0,symlink:oh,limit:{count:pT,removeOtherLogFiles:!0}}),t=fT.destination(2);return{stream:fT.multistream([{stream:e,level:n},{stream:t,level:n}]),fileStream:e}}function qH(n){let e=gT.createServer(n.tlsOptions,t=>{let r=mT.connect({host:n.upstreamHost,port:n.upstreamPort}),s=!1,o=i=>{if(!s){s=!0,i&&n.logger.warn(`tls terminator forwarder error: ${i.message??String(i)}`);try{t.destroy()}catch{}try{r.destroy()}catch{}}};t.on("error",o),r.on("error",o),t.on("close",()=>o()),r.on("close",()=>o()),t.pipe(r),r.pipe(t)});return e.on("tlsClientError",t=>{n.logger.warn(`tls handshake error: ${t.message}`)}),e.listen({host:n.listenHost,port:n.listenPort}),e}function zH(n){let e=n.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!n.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}va();dr();vc();Su();async function xT(n={}){let e=await go(),t=await bl();if(await Wh(e)){let s=await Mc();process.stdout.write(`Daemon already running${s?` (pid ${s.pid})`:""}. Run \`hydra-acp daemon restart\` to restart it.
407
407
  `);return}if(Sd(n,"foreground")){process.title="hydra-acp-daemon";let s=await yT(e,t);process.stdout.write(`hydra-acp daemon listening on ${e.daemon.host}:${e.daemon.port}
408
408
  `);let o=1e4,i=!1,a=async()=>{i&&(process.stderr.write(`Second signal received; exiting immediately.
409
409
  `),process.exit(1)),i=!0,process.stdout.write(`Shutting down...