@hydra-acp/cli 0.1.81 → 0.1.83

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
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- var qy=Object.defineProperty;var q=(t,e)=>()=>(t&&(e=t(t=0)),e);var Wy=(t,e)=>{for(var n in e)qy(t,n,{get:e[n],enumerable:!0})};import*as me from"path";import*as Ld from"os";function je(t){let e=Ld.homedir();return e?t===e?"~":t.startsWith(e+"/")?"~"+t.slice(e.length):t:t}function Gy(){if(process.env.VITEST)return"vitest";if(process.versions.bun||typeof globalThis.Bun<"u")return"bun";if(process.env.JEST_WORKER_ID!==void 0)return"jest";if(process.env.NODE_TEST_CONTEXT!==void 0)return"node:test"}function Se(){let t=process.env[Yy];if(t&&t.length>0)return me.resolve(t);let e=Gy();if(e)throw new Error(`HYDRA_ACP_HOME is unset under a test runner (${e}); refusing to fall back to ~/.hydra-acp. The harness must set HYDRA_ACP_HOME \u2014 vitest.setup.ts does this, but \`bun test\` bypasses the vitest config and does not. Run the suite with \`npx vitest run\`, not \`bun test\`.`);return me.join(Ld.homedir(),".hydra-acp")}var Yy,M,ge=q(()=>{"use strict";Yy="HYDRA_ACP_HOME";M={home:Se,config:()=>me.join(Se(),"config.json"),authToken:()=>me.join(Se(),"auth-token"),remotes:()=>me.join(Se(),"remotes.json"),pidFile:()=>me.join(Se(),"daemon.pid"),logFile:()=>me.join(Se(),"daemon.log"),currentLogFile:()=>me.join(Se(),"current.log"),registryCache:()=>me.join(Se(),"registry.json"),agentsDir:()=>me.join(Se(),"agents"),agentLogFile:t=>me.join(Se(),"agents","logs",`${t}.log`),agentInstallDir:(t,e,n)=>me.join(Se(),"agents",e,t,n),agentNpmInstallDir:(t,e,n)=>me.join(Se(),"agents",e,t,n,`node${process.versions.modules}`),sessionsDir:()=>me.join(Se(),"sessions"),sessionDir:t=>me.join(Se(),"sessions",t),sessionFile:t=>me.join(Se(),"sessions",t,"meta.json"),historyFile:t=>me.join(Se(),"sessions",t,"history.jsonl"),toolsDir:t=>me.join(Se(),"sessions",t,"tools"),toolBlobFile:(t,e)=>me.join(Se(),"sessions",t,"tools",e),queueFile:t=>me.join(Se(),"sessions",t,"queue.ndjson"),tombstonesDir:()=>me.join(Se(),"sessions",".tombstones"),tombstoneAgentDir:t=>me.join(Se(),"sessions",".tombstones",encodeURIComponent(t)),tombstoneFile:(t,e)=>me.join(Se(),"sessions",".tombstones",encodeURIComponent(t),encodeURIComponent(e)),extensionsDir:()=>me.join(Se(),"extensions"),extensionLogFile:t=>me.join(Se(),"extensions",`${t}.log`),extensionPidFile:t=>me.join(Se(),"extensions",`${t}.pid`),transformersDir:()=>me.join(Se(),"transformers"),transformerLogFile:t=>me.join(Se(),"transformers",`${t}.log`),transformerPidFile:t=>me.join(Se(),"transformers",`${t}.pid`),transformerState:(t,e)=>me.join(Se(),"sessions",t,"transformer-state",e),tuiHistoryFile:t=>me.join(Se(),"sessions",t,"prompt-history"),globalTuiHistoryFile:()=>me.join(Se(),"prompt-history"),tuiLogFile:()=>me.join(Se(),"tui.log"),shimWireLogFile:()=>me.join(Se(),"shim-wire.log")}});import*as vr from"fs/promises";function Ir(){let t=new Uint8Array(32);crypto.getRandomValues(t);let e="";for(let n of t)e+=n.toString(16).padStart(2,"0");return`hydra_token_${e}`}async function Sr(){try{let e=(await vr.readFile(M.authToken(),"utf8")).trim();return e.length>0?e:void 0}catch(t){if(t.code==="ENOENT")return;throw t}}async function Bs(){let t=await Sr();if(!t)throw new Error(`No service token found at ${M.authToken()}. Run \`hydra-acp init\` to create one.`);return t}async function kr(t){await vr.mkdir(M.home(),{recursive:!0}),await vr.writeFile(M.authToken(),t+`
2
+ var qy=Object.defineProperty;var J=(t,e)=>()=>(t&&(e=t(t=0)),e);var Wy=(t,e)=>{for(var n in e)qy(t,n,{get:e[n],enumerable:!0})};import*as me from"path";import*as Ld from"os";function Ue(t){let e=Ld.homedir();return e?t===e?"~":t.startsWith(e+"/")?"~"+t.slice(e.length):t:t}function Gy(){if(process.env.VITEST)return"vitest";if(process.versions.bun||typeof globalThis.Bun<"u")return"bun";if(process.env.JEST_WORKER_ID!==void 0)return"jest";if(process.env.NODE_TEST_CONTEXT!==void 0)return"node:test"}function Se(){let t=process.env[Yy];if(t&&t.length>0)return me.resolve(t);let e=Gy();if(e)throw new Error(`HYDRA_ACP_HOME is unset under a test runner (${e}); refusing to fall back to ~/.hydra-acp. The harness must set HYDRA_ACP_HOME \u2014 vitest.setup.ts does this, but \`bun test\` bypasses the vitest config and does not. Run the suite with \`npx vitest run\`, not \`bun test\`.`);return me.join(Ld.homedir(),".hydra-acp")}var Yy,M,ge=J(()=>{"use strict";Yy="HYDRA_ACP_HOME";M={home:Se,config:()=>me.join(Se(),"config.json"),authToken:()=>me.join(Se(),"auth-token"),remotes:()=>me.join(Se(),"remotes.json"),pidFile:()=>me.join(Se(),"daemon.pid"),logFile:()=>me.join(Se(),"daemon.log"),currentLogFile:()=>me.join(Se(),"current.log"),registryCache:()=>me.join(Se(),"registry.json"),agentsDir:()=>me.join(Se(),"agents"),agentLogFile:t=>me.join(Se(),"agents","logs",`${t}.log`),agentInstallDir:(t,e,n)=>me.join(Se(),"agents",e,t,n),agentNpmInstallDir:(t,e,n)=>me.join(Se(),"agents",e,t,n,`node${process.versions.modules}`),sessionsDir:()=>me.join(Se(),"sessions"),sessionDir:t=>me.join(Se(),"sessions",t),sessionFile:t=>me.join(Se(),"sessions",t,"meta.json"),historyFile:t=>me.join(Se(),"sessions",t,"history.jsonl"),toolsDir:t=>me.join(Se(),"sessions",t,"tools"),toolBlobFile:(t,e)=>me.join(Se(),"sessions",t,"tools",e),queueFile:t=>me.join(Se(),"sessions",t,"queue.ndjson"),tombstonesDir:()=>me.join(Se(),"sessions",".tombstones"),tombstoneAgentDir:t=>me.join(Se(),"sessions",".tombstones",encodeURIComponent(t)),tombstoneFile:(t,e)=>me.join(Se(),"sessions",".tombstones",encodeURIComponent(t),encodeURIComponent(e)),extensionsDir:()=>me.join(Se(),"extensions"),extensionLogFile:t=>me.join(Se(),"extensions",`${t}.log`),extensionPidFile:t=>me.join(Se(),"extensions",`${t}.pid`),transformersDir:()=>me.join(Se(),"transformers"),transformerLogFile:t=>me.join(Se(),"transformers",`${t}.log`),transformerPidFile:t=>me.join(Se(),"transformers",`${t}.pid`),transformerState:(t,e)=>me.join(Se(),"sessions",t,"transformer-state",e),tuiHistoryFile:t=>me.join(Se(),"sessions",t,"prompt-history"),globalTuiHistoryFile:()=>me.join(Se(),"prompt-history"),tuiLogFile:()=>me.join(Se(),"tui.log"),shimWireLogFile:()=>me.join(Se(),"shim-wire.log")}});import*as vr from"fs/promises";function Ir(){let t=new Uint8Array(32);crypto.getRandomValues(t);let e="";for(let n of t)e+=n.toString(16).padStart(2,"0");return`hydra_token_${e}`}async function Sr(){try{let e=(await vr.readFile(M.authToken(),"utf8")).trim();return e.length>0?e:void 0}catch(t){if(t.code==="ENOENT")return;throw t}}async function Bs(){let t=await Sr();if(!t)throw new Error(`No service token found at ${M.authToken()}. Run \`hydra-acp init\` to create one.`);return t}async function kr(t){await vr.mkdir(M.home(),{recursive:!0}),await vr.writeFile(M.authToken(),t+`
3
3
  `,{encoding:"utf8",mode:384})}async function Ti(){let t=await Sr();if(t)return t;let e=Ir();return await kr(e),process.stderr.write(`hydra-acp: initialized ${M.authToken()} with a fresh service token.
4
- `),e}var Fn=q(()=>{"use strict";ge()});import*as dt from"fs/promises";import*as mu from"fs";import*as Vt from"path";import{randomBytes as Qy}from"crypto";async function Et(t,e,n={}){let r=(n.pretty??!0?JSON.stringify(e,null,2):JSON.stringify(e))+`
5
- `;await Xy(t,r,n)}async function Xy(t,e,n={}){let s=await Zy(t),r=ew(s);await dt.mkdir(r,{recursive:!0});let i=`${s}.tmp-${process.pid}-${tw()}`;try{let o={encoding:"utf8"};n.mode!==void 0&&(o.mode=n.mode),await dt.writeFile(i,e,o),await dt.rename(i,s)}catch(o){throw await dt.unlink(i).catch(()=>{}),o}if(n.mode!==void 0)try{mu.chmodSync(s,n.mode)}catch{}}async function Zy(t){let e;try{e=await dt.lstat(t)}catch(r){if(r.code==="ENOENT")return t;throw r}if(!e.isSymbolicLink())return t;let n=await dt.readlink(t),s=Vt.isAbsolute(n)?n:Vt.resolve(Vt.dirname(t),n);try{let r=await dt.realpath(Vt.dirname(s));return Vt.join(r,Vt.basename(s))}catch(r){if(r.code==="ENOENT")return s;throw r}}async function Bt(t){let e;try{e=await dt.readFile(t,"utf8")}catch(n){if(n.code==="ENOENT")return;throw n}if(e.trim().length!==0)try{return JSON.parse(e)}catch{return}}function ew(t){let e=t.lastIndexOf("/");return e<=0?".":t.slice(0,e)}function tw(){return Qy(4).toString("hex")}var Ns=q(()=>{"use strict"});import*as ss from"fs/promises";import{homedir as Bd}from"os";import{z as N}from"zod";function wu(t){return t.tui.inAppSelection??t.tui.mouse}function bu(t){return Object.entries(t.extensions).map(([e,n])=>({name:e,...n}))}function vu(t){return Object.entries(t.transformers).map(([e,n])=>({name:e,...n}))}async function Fo(){return await lw(),await Bt(M.config())??{}}async function lw(){let t;try{t=await ss.lstat(M.config())}catch(e){if(e.code==="ENOENT")return;throw e}if(t.isSymbolicLink())try{await ss.stat(M.config())}catch(e){if(e.code!=="ENOENT")throw e;let n=await ss.readlink(M.config()).catch(()=>"<unknown>");throw new Error(`config.json at ${M.config()} is a broken symlink (-> ${n}); its target is missing. Refusing to treat this as "no config" and overwrite it. Restore the target (e.g. decrypt/check out your dotfiles) or remove the dangling link.`)}}async function Lo(){let t=await Fo(),e=t.daemon,n=e&&typeof e.authToken=="string"?e.authToken:void 0;if(!n)return;let s=!1;try{await ss.access(M.authToken()),s=!0}catch(r){if(r.code!=="ENOENT")throw r}if(s)throw new Error(`Auth token present in both ${M.authToken()} and ${M.config()} (daemon.authToken). Remove daemon.authToken from config.json to resolve.`);await kr(n),delete e.authToken,Object.keys(e).length===0&&delete t.daemon,await Et(M.config(),t,{mode:384}),process.stderr.write(`hydra-acp: migrated auth token from ${M.config()} to ${M.authToken()}.
6
- `)}async function ye(){return await Lo(),Nd.parse(await Fo())}async function Ln(t){await Lo();let e=await Fo();t(e),Nd.parse(e),await Et(M.config(),e,{mode:384})}async function Ei(t,e){await Ln(n=>{let s=n.tui&&typeof n.tui=="object"&&!Array.isArray(n.tui)?n.tui:{};s[t]=e,n.tui=s})}async function Bo(t){await Ln(e=>{e.defaultAgent=t})}async function Iu(t,e){await Ln(n=>{let s=n.defaultModels&&typeof n.defaultModels=="object"?n.defaultModels:{};s[t]=e,n.defaultModels=s})}async function Su(t,e){await Ln(n=>{let s=n.agentOverrides&&typeof n.agentOverrides=="object"?n.agentOverrides:{};e===void 0?delete s[t]:s[t]={packageSpec:e},n.agentOverrides=s})}async function Dd(t,e){await Ln(n=>{let s=n.agents&&typeof n.agents=="object"?n.agents:{};e===void 0?delete s[t]:s[t]=e,n.agents=s})}async function ku(t){await Ln(e=>{let n=e.registry&&typeof e.registry=="object"?e.registry:{};n.pinned=t,e.registry=n})}async function xu(){let t=await Fo();return typeof t.defaultAgent=="string"&&t.defaultAgent.length>0}function Nt(t){return t==="~"||t==="$HOME"?Bd():t.startsWith("~/")?Bd()+t.slice(1):t.startsWith("$HOME/")?Bd()+t.slice(5):t}var yu,nw,xr,sw,rw,iw,ow,aw,gu,dw,cw,Nd,qe=q(()=>{"use strict";ge();Fn();Ns();yu="https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json",nw=N.object({cert:N.string(),key:N.string()}),xr=55514,sw=N.object({host:N.string().default("127.0.0.1"),port:N.number().int().positive().default(xr),logLevel:N.enum(["debug","info","warn","error"]).default("info"),tls:nw.optional(),sessionIdleTimeoutSeconds:N.number().int().nonnegative().default(3600),sessionHistoryMaxEntries:N.number().int().positive().default(1e4),agentStderrTailBytes:N.number().int().positive().default(4096),publicHost:N.string().optional(),agentSyncIntervalMinutes:N.number().nonnegative().default(60),sessionGcIntervalMinutes:N.number().nonnegative().default(60),sessionGcMaxAgeDays:N.number().positive().default(2)}),rw=N.object({url:N.string().url().default(yu),ttlHours:N.number().positive().default(24),pinned:N.boolean().default(!1)}),iw=N.object({name:N.string().optional(),description:N.string().optional(),command:N.string().optional(),args:N.array(N.string()).optional(),env:N.record(N.string()).optional()}),ow=N.object({packageSpec:N.string().optional()}),aw=N.object({repaintThrottleMs:N.number().int().nonnegative().default(1e3),maxScrollbackLines:N.number().int().positive().default(1e4),mouse:N.boolean().default(!0),inAppSelection:N.boolean().optional(),selectionClipboard:N.enum(["primary","clipboard","both"]).default("both"),openFileCommand:N.union([N.string(),N.array(N.string())]).optional(),logMaxBytes:N.number().int().positive().default(5*1024*1024),cwdColumnMaxWidth:N.number().int().positive().default(32),progressIndicator:N.boolean().default(!0),defaultEnterAction:N.enum(["enqueue","amend"]).default("amend"),showThoughts:N.boolean().default(!0),ambiguousWidth:N.enum(["narrow","wide"]).default("wide"),toolContent:N.enum(["inline","references"]).default("references"),diffContextLines:N.number().int().min(0).default(3),promptHistoryMaxEntries:N.number().int().positive().default(2e3),maxToolItems:N.number().int().nonnegative().default(5),maxPlanItems:N.number().int().nonnegative().default(5),showFileUpdates:N.enum(["none","edit","diff"]).default("edit"),sessionColumns:N.array(N.enum(["session","upstream","host","state","agent","model","age","cwd","title","cost"])).nonempty().optional()}),gu=N.string().min(1).regex(/^[A-Za-z0-9._-]+$/,"extension name must be filename-safe"),dw=N.object({command:N.array(N.string()).default([]),args:N.array(N.string()).default([]),env:N.record(N.string()).default({}),enabled:N.boolean().default(!0)}),cw=N.object({command:N.array(N.string()).default([]),args:N.array(N.string()).default([]),env:N.record(N.string()).default({}),enabled:N.boolean().default(!0)}),Nd=N.object({daemon:sw.default({}),registry:rw.default({url:yu,ttlHours:24,pinned:!1}),agents:N.record(N.string(),iw).default({}),agentOverrides:N.record(N.string(),ow).default({}),defaultAgent:N.string().default("opencode"),defaultModels:N.record(N.string(),N.string()).default({}),synopsisAgent:N.string().optional(),synopsisModel:N.string().optional(),synopsisOnClose:N.boolean().default(!1),defaultCwd:N.string().default("~"),compressToolContent:N.boolean().default(!0),sessionListColdLimit:N.number().int().nonnegative().default(20),extensions:N.record(gu,dw).default({}),transformers:N.record(gu,cw).default({}),defaultTransformers:N.array(N.string()).default([]),npmRegistry:N.string().url().optional(),tui:aw.default({repaintThrottleMs:1e3,maxScrollbackLines:1e4,mouse:!0,logMaxBytes:5*1024*1024,cwdColumnMaxWidth:32,progressIndicator:!0,defaultEnterAction:"amend",showThoughts:!0,ambiguousWidth:"wide",toolContent:"references",diffContextLines:3,promptHistoryMaxEntries:2e3,maxToolItems:5,maxPlanItems:5,showFileUpdates:"edit",selectionClipboard:"both"})})});function Bn(t){return t==="127.0.0.1"||t==="::1"||t==="localhost"||t==="[::1]"}function Hd(t){return Bn(t)?{httpScheme:"http",wsScheme:"ws"}:{httpScheme:"https",wsScheme:"wss"}}function Ud(t){if(typeof t!="string"||t.length===0)throw new Error("expected a hydra:// URL");if(!t.startsWith("hydra://"))throw new Error(`expected hydra:// URL, got ${No(t)}`);let e=t.slice(8);if(e.length===0||e.startsWith("/"))throw new Error(`hydra:// URL is missing a host: ${No(t)}`);let n=e.match(/^[^/]*?:(\d+)(?:\/|$)/);if(n){let c=Number(n[1]);if(!Number.isInteger(c)||c<=0||c>65535)throw new Error(`hydra:// URL has invalid port: ${n[1]}`)}let s=uw(`http://${e}`);if(!s)throw new Error(`invalid hydra:// URL: ${No(t)}`);let r=s.hostname;if(!r)throw new Error(`hydra:// URL is missing a host: ${No(t)}`);let i=Bn(r),o;if(s.port){let c=Number(s.port);if(!Number.isInteger(c)||c<=0||c>65535)throw new Error(`hydra:// URL has invalid port: ${s.port}`);o=c}else o=i?xr:443;let a=s.pathname.replace(/^\/+/,"");return{host:r,port:o,sessionId:a===""?void 0:a,isLoopback:i}}function Au(t){let n=Bn(t.host)?xr:443,s=t.port!==void 0&&t.port!==n?`:${t.port}`:"",r=t.sessionId?`/${t.sessionId}`:"/";return`hydra://${t.host}${s}${r}`}function uw(t){try{return new URL(t)}catch{return null}}function No(t){return t.length>80?`${t.slice(0,77)}...`:t}var Pi=q(()=>{"use strict";qe()});function jd(t,e){return`${t}:${e}`}function Cu(t,e){let n=Date.parse(t.expiresAt);return Number.isFinite(n)?n<=e:!0}function fw(t){let e=t.lastIndexOf(":");if(e<0)return null;let n=t.slice(0,e),s=Number(t.slice(e+1));return Number.isInteger(s)?{host:n,port:s}:null}async function pw(){let t=await Bt(M.remotes());return t===void 0?{version:1,entries:{}}:hw(t)}function hw(t){if(!t||typeof t!="object")return{version:1,entries:{}};let e=t,n=e.entries&&typeof e.entries=="object"?e.entries:{},s={};for(let[r,i]of Object.entries(n)){if(!i||typeof i!="object")continue;let o=i;if(typeof o.token!="string"||typeof o.expiresAt!="string")continue;let a={token:o.token,expiresAt:o.expiresAt};typeof o.label=="string"&&(a.label=o.label),s[r]=a}return{version:1,entries:s}}async function qd(t){await Et(M.remotes(),t,{mode:384})}var Do,Ru=q(()=>{"use strict";ge();Ns();Do=class t{data;constructor(e){this.data=e}static async load(){let e=await pw(),n=Date.now(),s={},r=!1;for(let[o,a]of Object.entries(e.entries)){if(Cu(a,n)){r=!0;continue}s[o]=a}let i={version:1,entries:s};return r&&await qd(i),new t(i)}get(e,n){let s=this.data.entries[jd(e,n)];if(s&&!Cu(s,Date.now()))return s}async set(e,n,s){this.data.entries[jd(e,n)]=s,await qd(this.data)}async delete(e,n){let s=jd(e,n);return s in this.data.entries?(delete this.data.entries[s],await qd(this.data),!0):!1}list(){let e=[];for(let[n,s]of Object.entries(this.data.entries)){let r=fw(n);r&&e.push({host:r.host,port:r.port,entry:s})}return e}}});async function Ar(t){return process.stdout.write(t),process.stdin.isTTY?new Promise((e,n)=>{let s=process.stdin,r=s.isRaw===!0,i="",o=()=>{s.removeListener("data",a),s.removeListener("error",d),r||s.setRawMode(!1),s.pause()},a=c=>{for(let l of c){if(l===10||l===13){process.stdout.write(`
4
+ `),e}var Fn=J(()=>{"use strict";ge()});import*as dt from"fs/promises";import*as mu from"fs";import*as Vt from"path";import{randomBytes as Qy}from"crypto";async function Et(t,e,n={}){let r=(n.pretty??!0?JSON.stringify(e,null,2):JSON.stringify(e))+`
5
+ `;await Xy(t,r,n)}async function Xy(t,e,n={}){let s=await Zy(t),r=ew(s);await dt.mkdir(r,{recursive:!0});let i=`${s}.tmp-${process.pid}-${tw()}`;try{let o={encoding:"utf8"};n.mode!==void 0&&(o.mode=n.mode),await dt.writeFile(i,e,o),await dt.rename(i,s)}catch(o){throw await dt.unlink(i).catch(()=>{}),o}if(n.mode!==void 0)try{mu.chmodSync(s,n.mode)}catch{}}async function Zy(t){let e;try{e=await dt.lstat(t)}catch(r){if(r.code==="ENOENT")return t;throw r}if(!e.isSymbolicLink())return t;let n=await dt.readlink(t),s=Vt.isAbsolute(n)?n:Vt.resolve(Vt.dirname(t),n);try{let r=await dt.realpath(Vt.dirname(s));return Vt.join(r,Vt.basename(s))}catch(r){if(r.code==="ENOENT")return s;throw r}}async function Bt(t){let e;try{e=await dt.readFile(t,"utf8")}catch(n){if(n.code==="ENOENT")return;throw n}if(e.trim().length!==0)try{return JSON.parse(e)}catch{return}}function ew(t){let e=t.lastIndexOf("/");return e<=0?".":t.slice(0,e)}function tw(){return Qy(4).toString("hex")}var Ns=J(()=>{"use strict"});import*as ss from"fs/promises";import{homedir as Bd}from"os";import{z as N}from"zod";function wu(t){return t.tui.inAppSelection??t.tui.mouse}function bu(t){return Object.entries(t.extensions).map(([e,n])=>({name:e,...n}))}function vu(t){return Object.entries(t.transformers).map(([e,n])=>({name:e,...n}))}async function Fo(){return await lw(),await Bt(M.config())??{}}async function lw(){let t;try{t=await ss.lstat(M.config())}catch(e){if(e.code==="ENOENT")return;throw e}if(t.isSymbolicLink())try{await ss.stat(M.config())}catch(e){if(e.code!=="ENOENT")throw e;let n=await ss.readlink(M.config()).catch(()=>"<unknown>");throw new Error(`config.json at ${M.config()} is a broken symlink (-> ${n}); its target is missing. Refusing to treat this as "no config" and overwrite it. Restore the target (e.g. decrypt/check out your dotfiles) or remove the dangling link.`)}}async function Lo(){let t=await Fo(),e=t.daemon,n=e&&typeof e.authToken=="string"?e.authToken:void 0;if(!n)return;let s=!1;try{await ss.access(M.authToken()),s=!0}catch(r){if(r.code!=="ENOENT")throw r}if(s)throw new Error(`Auth token present in both ${M.authToken()} and ${M.config()} (daemon.authToken). Remove daemon.authToken from config.json to resolve.`);await kr(n),delete e.authToken,Object.keys(e).length===0&&delete t.daemon,await Et(M.config(),t,{mode:384}),process.stderr.write(`hydra-acp: migrated auth token from ${M.config()} to ${M.authToken()}.
6
+ `)}async function ye(){return await Lo(),Nd.parse(await Fo())}async function Ln(t){await Lo();let e=await Fo();t(e),Nd.parse(e),await Et(M.config(),e,{mode:384})}async function Ei(t,e){await Ln(n=>{let s=n.tui&&typeof n.tui=="object"&&!Array.isArray(n.tui)?n.tui:{};s[t]=e,n.tui=s})}async function Bo(t){await Ln(e=>{e.defaultAgent=t})}async function Iu(t,e){await Ln(n=>{let s=n.defaultModels&&typeof n.defaultModels=="object"?n.defaultModels:{};s[t]=e,n.defaultModels=s})}async function Su(t,e){await Ln(n=>{let s=n.agentOverrides&&typeof n.agentOverrides=="object"?n.agentOverrides:{};e===void 0?delete s[t]:s[t]={packageSpec:e},n.agentOverrides=s})}async function Dd(t,e){await Ln(n=>{let s=n.agents&&typeof n.agents=="object"?n.agents:{};e===void 0?delete s[t]:s[t]=e,n.agents=s})}async function ku(t){await Ln(e=>{let n=e.registry&&typeof e.registry=="object"?e.registry:{};n.pinned=t,e.registry=n})}async function xu(){let t=await Fo();return typeof t.defaultAgent=="string"&&t.defaultAgent.length>0}function Nt(t){return t==="~"||t==="$HOME"?Bd():t.startsWith("~/")?Bd()+t.slice(1):t.startsWith("$HOME/")?Bd()+t.slice(5):t}var yu,nw,xr,sw,rw,iw,ow,aw,gu,dw,cw,Nd,je=J(()=>{"use strict";ge();Fn();Ns();yu="https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json",nw=N.object({cert:N.string(),key:N.string()}),xr=55514,sw=N.object({host:N.string().default("127.0.0.1"),port:N.number().int().positive().default(xr),logLevel:N.enum(["debug","info","warn","error"]).default("info"),tls:nw.optional(),sessionIdleTimeoutSeconds:N.number().int().nonnegative().default(3600),sessionHistoryMaxEntries:N.number().int().positive().default(1e4),agentStderrTailBytes:N.number().int().positive().default(4096),publicHost:N.string().optional(),agentSyncIntervalMinutes:N.number().nonnegative().default(60),sessionGcIntervalMinutes:N.number().nonnegative().default(60),sessionGcMaxAgeDays:N.number().positive().default(2)}),rw=N.object({url:N.string().url().default(yu),ttlHours:N.number().positive().default(24),pinned:N.boolean().default(!1)}),iw=N.object({name:N.string().optional(),description:N.string().optional(),command:N.string().optional(),args:N.array(N.string()).optional(),env:N.record(N.string()).optional()}),ow=N.object({packageSpec:N.string().optional()}),aw=N.object({repaintThrottleMs:N.number().int().nonnegative().default(1e3),maxScrollbackLines:N.number().int().positive().default(1e4),mouse:N.boolean().default(!0),inAppSelection:N.boolean().optional(),selectionClipboard:N.enum(["primary","clipboard","both"]).default("both"),openFileCommand:N.union([N.string(),N.array(N.string())]).optional(),logMaxBytes:N.number().int().positive().default(5*1024*1024),cwdColumnMaxWidth:N.number().int().positive().default(32),progressIndicator:N.boolean().default(!0),defaultEnterAction:N.enum(["enqueue","amend"]).default("amend"),showThoughts:N.boolean().default(!0),ambiguousWidth:N.enum(["narrow","wide"]).default("wide"),toolContent:N.enum(["inline","references"]).default("references"),diffContextLines:N.number().int().min(0).default(3),promptHistoryMaxEntries:N.number().int().positive().default(2e3),maxToolItems:N.number().int().nonnegative().default(5),maxPlanItems:N.number().int().nonnegative().default(5),showFileUpdates:N.enum(["none","edit","diff"]).default("edit"),sessionColumns:N.array(N.enum(["session","upstream","host","state","agent","model","age","cwd","title","cost"])).nonempty().optional()}),gu=N.string().min(1).regex(/^[A-Za-z0-9._-]+$/,"extension name must be filename-safe"),dw=N.object({command:N.array(N.string()).default([]),args:N.array(N.string()).default([]),env:N.record(N.string()).default({}),enabled:N.boolean().default(!0)}),cw=N.object({command:N.array(N.string()).default([]),args:N.array(N.string()).default([]),env:N.record(N.string()).default({}),enabled:N.boolean().default(!0)}),Nd=N.object({daemon:sw.default({}),registry:rw.default({url:yu,ttlHours:24,pinned:!1}),agents:N.record(N.string(),iw).default({}),agentOverrides:N.record(N.string(),ow).default({}),defaultAgent:N.string().default("opencode"),defaultModels:N.record(N.string(),N.string()).default({}),synopsisAgent:N.string().optional(),synopsisModel:N.string().optional(),synopsisOnClose:N.boolean().default(!1),defaultCwd:N.string().default("~"),compressToolContent:N.boolean().default(!0),sessionListColdLimit:N.number().int().nonnegative().default(20),extensions:N.record(gu,dw).default({}),transformers:N.record(gu,cw).default({}),defaultTransformers:N.array(N.string()).default([]),npmRegistry:N.string().url().optional(),tui:aw.default({repaintThrottleMs:1e3,maxScrollbackLines:1e4,mouse:!0,logMaxBytes:5*1024*1024,cwdColumnMaxWidth:32,progressIndicator:!0,defaultEnterAction:"amend",showThoughts:!0,ambiguousWidth:"wide",toolContent:"references",diffContextLines:3,promptHistoryMaxEntries:2e3,maxToolItems:5,maxPlanItems:5,showFileUpdates:"edit",selectionClipboard:"both"})})});function Bn(t){return t==="127.0.0.1"||t==="::1"||t==="localhost"||t==="[::1]"}function Hd(t){return Bn(t)?{httpScheme:"http",wsScheme:"ws"}:{httpScheme:"https",wsScheme:"wss"}}function Ud(t){if(typeof t!="string"||t.length===0)throw new Error("expected a hydra:// URL");if(!t.startsWith("hydra://"))throw new Error(`expected hydra:// URL, got ${No(t)}`);let e=t.slice(8);if(e.length===0||e.startsWith("/"))throw new Error(`hydra:// URL is missing a host: ${No(t)}`);let n=e.match(/^[^/]*?:(\d+)(?:\/|$)/);if(n){let c=Number(n[1]);if(!Number.isInteger(c)||c<=0||c>65535)throw new Error(`hydra:// URL has invalid port: ${n[1]}`)}let s=uw(`http://${e}`);if(!s)throw new Error(`invalid hydra:// URL: ${No(t)}`);let r=s.hostname;if(!r)throw new Error(`hydra:// URL is missing a host: ${No(t)}`);let i=Bn(r),o;if(s.port){let c=Number(s.port);if(!Number.isInteger(c)||c<=0||c>65535)throw new Error(`hydra:// URL has invalid port: ${s.port}`);o=c}else o=i?xr:443;let a=s.pathname.replace(/^\/+/,"");return{host:r,port:o,sessionId:a===""?void 0:a,isLoopback:i}}function Au(t){let n=Bn(t.host)?xr:443,s=t.port!==void 0&&t.port!==n?`:${t.port}`:"",r=t.sessionId?`/${t.sessionId}`:"/";return`hydra://${t.host}${s}${r}`}function uw(t){try{return new URL(t)}catch{return null}}function No(t){return t.length>80?`${t.slice(0,77)}...`:t}var Pi=J(()=>{"use strict";je()});function jd(t,e){return`${t}:${e}`}function Cu(t,e){let n=Date.parse(t.expiresAt);return Number.isFinite(n)?n<=e:!0}function fw(t){let e=t.lastIndexOf(":");if(e<0)return null;let n=t.slice(0,e),s=Number(t.slice(e+1));return Number.isInteger(s)?{host:n,port:s}:null}async function pw(){let t=await Bt(M.remotes());return t===void 0?{version:1,entries:{}}:hw(t)}function hw(t){if(!t||typeof t!="object")return{version:1,entries:{}};let e=t,n=e.entries&&typeof e.entries=="object"?e.entries:{},s={};for(let[r,i]of Object.entries(n)){if(!i||typeof i!="object")continue;let o=i;if(typeof o.token!="string"||typeof o.expiresAt!="string")continue;let a={token:o.token,expiresAt:o.expiresAt};typeof o.label=="string"&&(a.label=o.label),s[r]=a}return{version:1,entries:s}}async function qd(t){await Et(M.remotes(),t,{mode:384})}var Do,Ru=J(()=>{"use strict";ge();Ns();Do=class t{data;constructor(e){this.data=e}static async load(){let e=await pw(),n=Date.now(),s={},r=!1;for(let[o,a]of Object.entries(e.entries)){if(Cu(a,n)){r=!0;continue}s[o]=a}let i={version:1,entries:s};return r&&await qd(i),new t(i)}get(e,n){let s=this.data.entries[jd(e,n)];if(s&&!Cu(s,Date.now()))return s}async set(e,n,s){this.data.entries[jd(e,n)]=s,await qd(this.data)}async delete(e,n){let s=jd(e,n);return s in this.data.entries?(delete this.data.entries[s],await qd(this.data),!0):!1}list(){let e=[];for(let[n,s]of Object.entries(this.data.entries)){let r=fw(n);r&&e.push({host:r.host,port:r.port,entry:s})}return e}}});async function Ar(t){return process.stdout.write(t),process.stdin.isTTY?new Promise((e,n)=>{let s=process.stdin,r=s.isRaw===!0,i="",o=()=>{s.removeListener("data",a),s.removeListener("error",d),r||s.setRawMode(!1),s.pause()},a=c=>{for(let l of c){if(l===10||l===13){process.stdout.write(`
7
7
  `),o(),e(i);return}if(l===3){o(),n(new Error("password entry cancelled"));return}if(l===127||l===8){i=i.slice(0,-1);continue}i+=String.fromCharCode(l)}},d=c=>{o(),n(c)};s.setRawMode(!0),s.resume(),s.on("data",a),s.on("error",d)}):mw()}function mw(){return new Promise((t,e)=>{let n="";process.stdin.setEncoding("utf8");let s=i=>{n+=i;let o=n.indexOf(`
8
- `);o!==-1&&(process.stdin.removeListener("data",s),process.stdin.removeListener("error",r),t(n.slice(0,o).replace(/\r$/,"")))},r=i=>{process.stdin.removeListener("data",s),process.stdin.removeListener("error",r),e(i)};process.stdin.on("data",s),process.stdin.on("error",r)})}var Wd=q(()=>{"use strict"});import*as Tu from"path";function cn(){let t=process.argv[1];if(!t)return"hydra-acp";let e=Tu.basename(t);return e==="cli.js"||e==="cli"?"hydra-acp":e}var Mi=q(()=>{"use strict"});import*as Pu from"os";async function Dt(t){let e=await Ti(),n=t.daemon.host,s=t.daemon.port,r=!!t.daemon.tls,i=r?"https":"http",o=r?"wss":"ws";return{baseUrl:`${i}://${n}:${s}`,wsUrl:`${o}://${n}:${s}/acp`,token:e,display:`${n}:${s}`,isLocal:Bn(n)}}function Jd(t,e){let{httpScheme:n,wsScheme:s}=Hd(t.host);return{baseUrl:`${n}://${t.host}:${t.port}`,wsUrl:`${s}://${t.host}:${t.port}/acp`,token:e,display:_u(t),isLocal:t.isLoopback}}async function Mu(t,e={}){let n=e.fetchImpl??fetch,s=e.promptImpl??Ar,r=e.preferServiceToken??!0,i=e.allowPrompt??!0;if(t.isLoopback&&r){let m=await Sr();if(m)return Jd(t,m)}let o=e.store??await Do.load(),a=o.get(t.host,t.port);if(a)return Jd(t,a.token);if(!i)throw new zd(t.host,t.port);let d=_u(t),c=await s(`Password for ${d}: `);if(c.length===0)throw new Error("Password is required to attach to a remote daemon.");let{httpScheme:l}=Hd(t.host),f=`${l}://${t.host}:${t.port}`,u=await n(`${f}/v1/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:c,label:Eu()})});if(u.status===401)throw new Error(`Wrong password for ${d}.`);if(u.status===403)throw new Error(`No password is configured on ${d}. Run \`hydra-acp auth password\` on the daemon host first.`);if(u.status===429)throw new Error(`Too many failed login attempts on ${d}; try again later.`);if(!u.ok)throw new Error(`Login to ${d} failed: HTTP ${u.status}`);let p=await u.json();if(!p.session_token||!p.expires_at)throw new Error(`Login to ${d} returned a malformed response.`);return await o.set(t.host,t.port,{token:p.session_token,expiresAt:p.expires_at,label:Eu()}),Jd(t,p.session_token)}function Eu(){try{let t=Pu.hostname();return t.length>0?t:"remote"}catch{return"remote"}}function _u(t){let e=t.isLoopback?xr:443;return t.port===e?t.host:`${t.host}:${t.port}`}var zd,Ds=q(()=>{"use strict";qe();Fn();Pi();Ru();Wd();Mi();Pi();zd=class extends Error{host;port;constructor(e,n){let s=n===443?"":`:${n}`;super(`No cached credentials for ${e}:${n}. Run \`${cn()} --session hydra://${e}${s}/\` once in a terminal to log in.`),this.name="NoCachedCredentialError",this.host=e,this.port=n}}});var D,Jo=q(()=>{"use strict";D={ParseError:-32700,InvalidRequest:-32600,MethodNotFound:-32601,InvalidParams:-32602,InternalError:-32603,AuthRequired:-32e3,SessionNotFound:-32001,NotAuthorisedToAttach:-32002,MultiClientNotSupported:-32003,AgentNotInstalled:-32005,BundleAlreadyImported:-32010,PermissionDenied:-32011,AlreadyAttached:-32012,StreamNotEnabled:-32013,SessionClosing:-32014}});import{z as Ce}from"zod";var nf,jw,sf,rf,of,ic=q(()=>{"use strict";nf=Ce.object({protocolVersion:Ce.number().optional(),clientCapabilities:Ce.record(Ce.unknown()).optional(),clientInfo:Ce.object({name:Ce.string(),version:Ce.string().optional()}).optional()}),jw=Ce.enum(["full","pending_only","none","after_message"]),sf=Ce.object({cwd:Ce.string(),mcpServers:Ce.array(Ce.unknown()).optional(),_meta:Ce.record(Ce.unknown()).optional()}),rf=Ce.object({upstreamSessionId:Ce.string(),agentId:Ce.string(),cwd:Ce.string(),title:Ce.string().optional(),agentArgs:Ce.array(Ce.string()).optional()}),of=Ce.object({sessionId:Ce.string(),historyPolicy:jw.default("full"),afterMessageId:Ce.string().optional(),clientId:Ce.string().optional(),clientInfo:Ce.object({name:Ce.string(),version:Ce.string().optional()}).optional(),_meta:Ce.record(Ce.unknown()).optional()})});import{z as de}from"zod";function zo(t,e){let n={attachedClients:t.attachedClients,status:t.status,busy:t.busy,awaitingInput:t.awaitingInput};return t.cwd!==void 0&&(n.cwd=t.cwd),t.title!==void 0&&(n.title=t.title),t.agentId!==void 0&&(n.agentId=t.agentId),t.upstreamSessionId!==void 0&&(n.upstreamSessionId=t.upstreamSessionId),t.currentModel!==void 0&&(n.currentModel=t.currentModel),t.currentUsage!==void 0&&(n.currentUsage=t.currentUsage),t.importedFromMachine!==void 0&&(n.importedFromMachine=t.importedFromMachine),t.importedFromUpstreamSessionId!==void 0&&(n.importedFromUpstreamSessionId=t.importedFromUpstreamSessionId),t.parentSessionId!==void 0&&(n.parentSessionId=t.parentSessionId),t.forkedFromSessionId!==void 0&&(n.forkedFromSessionId=t.forkedFromSessionId),t.forkedFromMessageId!==void 0&&(n.forkedFromMessageId=t.forkedFromMessageId),t.originatingClient!==void 0&&(n.originatingClient=t.originatingClient),t.interactive!==void 0&&(n.interactive=t.interactive),t.priority!==void 0&&t.priority>0&&(n.priority=t.priority),e&&(e.clientId!==void 0&&(n.clientId=e.clientId),e.currentMode!==void 0&&(n.currentMode=e.currentMode),e.agentArgs!==void 0&&e.agentArgs.length>0&&(n.agentArgs=e.agentArgs),e.availableCommands!==void 0&&e.availableCommands.length>0&&(n.availableCommands=e.availableCommands),e.availableModes!==void 0&&e.availableModes.length>0&&(n.availableModes=e.availableModes),e.availableModels!==void 0&&e.availableModels.length>0&&(n.availableModels=e.availableModels),e.turnStartedAt!==void 0&&(n.turnStartedAt=e.turnStartedAt),e.agentCapabilities!==void 0&&(n.agentCapabilities=e.agentCapabilities),e.queue!==void 0&&e.queue.length>0&&(n.queue=e.queue)),n}function cf(t){let e={sessionId:t.sessionId,cwd:t.cwd,updatedAt:t.updatedAt,_meta:_i(t._meta,zo(t))};return t.title!==void 0&&(e.title=t.title),e}var af,df,oc,OR,qw,FR,ac=q(()=>{"use strict";Ko();af=de.object({sessionId:de.string()}),df=de.object({cwd:de.string().optional(),cursor:de.string().optional()}),oc=de.object({used:de.number().optional(),size:de.number().optional(),costAmount:de.number().optional(),costCurrency:de.string().optional()}),OR=de.object({sessionId:de.string(),upstreamSessionId:de.string().optional(),cwd:de.string(),title:de.string().optional(),agentId:de.string().optional(),currentModel:de.string().optional(),currentUsage:oc.optional(),importedFromMachine:de.string().optional(),importedFromUpstreamSessionId:de.string().optional(),parentSessionId:de.string().optional(),forkedFromSessionId:de.string().optional(),forkedFromMessageId:de.string().optional(),originatingClient:de.object({name:de.string(),version:de.string().optional()}).optional(),interactive:de.boolean().optional(),priority:de.number().int().nonnegative().optional(),updatedAt:de.string(),attachedClients:de.number().int().nonnegative(),status:de.enum(["live","cold"]).default("live"),busy:de.boolean().default(!1),awaitingInput:de.boolean().default(!1),_meta:de.record(de.unknown()).optional()}),qw=de.object({sessionId:de.string(),cwd:de.string(),title:de.string().optional(),updatedAt:de.string().optional(),_meta:de.record(de.unknown()).optional()}),FR=de.object({sessions:de.array(qw),nextCursor:de.string().optional()})});function Ww(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e={};for(let[n,s]of Object.entries(t)){if(typeof n!="string"||n.length===0||typeof s!="string")return;e[n]=s}return e}function Mt(t){if(!t)return{};let e=t[lt];if(!e||typeof e!="object"||Array.isArray(e))return{};let n=e,s={};if(typeof n.upstreamSessionId=="string"&&(s.upstreamSessionId=n.upstreamSessionId),typeof n.agentId=="string"&&(s.agentId=n.agentId),typeof n.cwd=="string"&&(s.cwd=n.cwd),typeof n.clientId=="string"&&(s.clientId=n.clientId),typeof n.readonly=="boolean"&&(s.readonly=n.readonly),(n.replayMode==="instant"||n.replayMode==="drip")&&(s.replayMode=n.replayMode),typeof n.dripSpeed=="number"&&n.dripSpeed>0&&(s.dripSpeed=n.dripSpeed),(n.toolContent==="inline"||n.toolContent==="references")&&(s.toolContent=n.toolContent),n.detachStatus==="detached"&&(s.detachStatus=n.detachStatus),typeof n.title=="string"&&(s.title=n.title),Array.isArray(n.agentArgs)&&n.agentArgs.every(r=>typeof r=="string")&&(s.agentArgs=n.agentArgs),Array.isArray(n.transformers)&&n.transformers.every(r=>typeof r=="string")&&(s.transformers=n.transformers),n.resume){let r=rf.safeParse(n.resume);r.success&&(s.resume=r.data)}if(typeof n.model=="string"&&(s.model=n.model),typeof n.currentModel=="string"&&(s.currentModel=n.currentModel),typeof n.currentMode=="string"&&(s.currentMode=n.currentMode),n.currentUsage){let r=oc.safeParse(n.currentUsage);r.success&&(s.currentUsage=r.data)}if(typeof n.turnStartedAt=="number"&&n.turnStartedAt>0&&(s.turnStartedAt=n.turnStartedAt),Array.isArray(n.availableCommands)){let r=[];for(let i of n.availableCommands){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i;if(typeof o.name!="string")continue;let a={name:o.name};typeof o.description=="string"&&(a.description=o.description),r.push(a)}r.length>0&&(s.availableCommands=r)}if(n.prompt&&typeof n.prompt=="object"&&!Array.isArray(n.prompt)){let r=n.prompt,i={};typeof r.queueing=="boolean"&&(i.queueing=r.queueing),typeof r.cancelling=="boolean"&&(i.cancelling=r.cancelling),typeof r.updating=="boolean"&&(i.updating=r.updating),typeof r.amending=="boolean"&&(i.amending=r.amending),typeof r.pipelining=="boolean"&&(i.pipelining=r.pipelining),s.prompt=i}if(n.agents&&typeof n.agents=="object"&&!Array.isArray(n.agents)){let r=n.agents,i={};typeof r.list=="boolean"&&(i.list=r.list),typeof r.installProgress=="boolean"&&(i.installProgress=r.installProgress),s.agents=i}if(typeof n.mcpStdin=="boolean"&&(s.mcpStdin=n.mcpStdin),typeof n.interactive=="boolean"&&(s.interactive=n.interactive),typeof n.ancillary=="boolean"&&(s.ancillary=n.ancillary),Array.isArray(n.queue)){let r=[];for(let i of n.queue){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i,a=o.originator;if(typeof o.messageId!="string"||!a||typeof a.clientId!="string"||!Array.isArray(o.prompt)||typeof o.position!="number"||typeof o.enqueuedAt!="number")continue;let d={clientId:a.clientId};typeof a.name=="string"&&(d.name=a.name),typeof a.version=="string"&&(d.version=a.version),r.push({messageId:o.messageId,originator:d,prompt:o.prompt,position:o.position,enqueuedAt:o.enqueuedAt})}r.length>0&&(s.queue=r)}if(Array.isArray(n.availableModes)){let r=[];for(let i of n.availableModes){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i;if(typeof o.id!="string")continue;let a={id:o.id};typeof o.name=="string"&&(a.name=o.name),typeof o.description=="string"&&(a.description=o.description),r.push(a)}r.length>0&&(s.availableModes=r)}if(Array.isArray(n.availableModels)){let r=[];for(let i of n.availableModels){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i;if(typeof o.modelId!="string")continue;let a={modelId:o.modelId};typeof o.name=="string"&&(a.name=o.name),typeof o.description=="string"&&(a.description=o.description),r.push(a)}r.length>0&&(s.availableModels=r)}if((n.status==="live"||n.status==="cold")&&(s.status=n.status),typeof n.busy=="boolean"&&(s.busy=n.busy),typeof n.awaitingInput=="boolean"&&(s.awaitingInput=n.awaitingInput),typeof n.attachedClients=="number"&&(s.attachedClients=n.attachedClients),typeof n.importedFromMachine=="string"&&(s.importedFromMachine=n.importedFromMachine),typeof n.importedFromUpstreamSessionId=="string"&&(s.importedFromUpstreamSessionId=n.importedFromUpstreamSessionId),typeof n.parentSessionId=="string"&&(s.parentSessionId=n.parentSessionId),typeof n.forkedFromSessionId=="string"&&(s.forkedFromSessionId=n.forkedFromSessionId),typeof n.forkedFromMessageId=="string"&&(s.forkedFromMessageId=n.forkedFromMessageId),n.originatingClient&&typeof n.originatingClient=="object"&&!Array.isArray(n.originatingClient)&&typeof n.originatingClient.name=="string"){let r=n.originatingClient;s.originatingClient={name:r.name,...typeof r.version=="string"?{version:r.version}:{}}}if(n.agentCapabilities!==void 0&&(s.agentCapabilities=n.agentCapabilities),n.env!==void 0){let r=Ww(n.env);r!==void 0&&(s.env=r)}return s}function _i(t,e){return{...t??{},[lt]:e}}var lt,Ko=q(()=>{"use strict";ic();ac();lt="hydra-acp"});import{z as V}from"zod";var lf,Vo,uf,UR,jR,qR,ff,WR,pf,JR,hf,zR,KR,mf=q(()=>{"use strict";lf=V.object({sessionId:V.string(),prompt:V.array(V.unknown()),_meta:V.record(V.unknown()).optional()}),Vo=V.object({sessionId:V.string()}),uf=V.object({clientId:V.string(),name:V.string().optional(),version:V.string().optional()}),UR=V.object({sessionId:V.string(),messageId:V.string(),originator:uf,prompt:V.array(V.unknown()),position:V.number().int().nonnegative(),queueDepth:V.number().int().positive(),enqueuedAt:V.number()}),jR=V.object({sessionId:V.string(),messageId:V.string(),prompt:V.array(V.unknown())}),qR=V.object({sessionId:V.string(),messageId:V.string(),reason:V.enum(["started","cancelled","abandoned"])}),ff=V.object({sessionId:V.string(),messageId:V.string()}),WR=V.object({cancelled:V.boolean(),reason:V.enum(["ok","not_found","already_running"])}),pf=V.object({sessionId:V.string(),messageId:V.string(),prompt:V.array(V.unknown())}),JR=V.object({updated:V.boolean(),reason:V.enum(["ok","not_found","already_running"])}),hf=V.object({sessionId:V.string(),targetMessageId:V.string(),prompt:V.array(V.unknown()),replaceQueue:V.boolean().optional(),onTargetCompleted:V.enum(["reject","send_anyway"]).optional()}),zR=V.object({amended:V.boolean(),reason:V.enum(["ok","target_completed","target_cancelled","target_not_found"]),messageId:V.string().optional()}),KR=V.object({sessionId:V.string(),cancelledMessageId:V.string(),newMessageId:V.string(),prompt:V.array(V.unknown()),originator:uf,amendedAt:V.number()})});import{z as is}from"zod";var gf,Yo,yf=q(()=>{"use strict";gf=is.object({agentId:is.string(),version:is.string(),source:is.enum(["binary","npm"]),phase:is.enum(["download_start","download_progress","download_done","extract","install_start","installed"]),receivedBytes:is.number().optional(),totalBytes:is.number().optional(),packageSpec:is.string().optional()}),Yo="hydra-acp/agents/install_progress"});var yt=q(()=>{"use strict";Jo();ic();Ko();ac();mf();yf()});import{nanoid as Jw}from"nanoid";var dc,kt,Us=q(()=>{"use strict";yt();dc=class extends Error{code="ERR_CONNECTION_CLOSED";constructor(e="connection is closed"){super(e),this.name="ConnectionClosedError"}},kt=class t{constructor(e){this.stream=e;this.stream.onMessage(n=>this.handleIncoming(n)),this.stream.onClose(n=>this.handleClose(n))}stream;requestHandlers=new Map;defaultRequestHandler;notificationHandlers=new Map;bufferedNotifications=new Map;static MAX_BUFFERED_PER_METHOD=64;static MAX_BUFFERED_METHODS=256;pending=new Map;closed=!1;closeHandlers=[];orphanErrorHandlers=[];onRequest(e,n){this.requestHandlers.set(e,n)}setDefaultHandler(e){this.defaultRequestHandler=e}onNotification(e,n){this.notificationHandlers.set(e,n);let s=this.bufferedNotifications.get(e);if(s){this.bufferedNotifications.delete(e);for(let r of s)try{n(r.params,r.method)}catch{}}}drainBuffered(e){let s=this.bufferedNotifications.get(e)?.length??0;return this.bufferedNotifications.delete(e),s}onClose(e){this.closeHandlers.push(e)}isClosed(){return this.closed}onOrphanError(e){this.orphanErrorHandlers.push(e)}async request(e,n){return this.requestWithId(e,n).response}requestWithId(e,n){if(this.closed)throw new dc;let s=Jw(),r={jsonrpc:"2.0",id:s,method:e,params:n},i=new Promise((o,a)=>{this.pending.set(s,{resolve:d=>o(d),reject:a}),this.stream.send(r).catch(d=>{this.pending.delete(s),a(d)})});return{id:s,response:i}}notify(e,n){if(this.closed)return Promise.resolve();let s={jsonrpc:"2.0",method:e,params:n};return this.stream.send(s)}async close(){this.closed||await this.stream.close()}fail(e){this.handleClose(e)}handleIncoming(e){"method"in e?"id"in e&&e.id!==void 0?this.handleRequest(e).catch(()=>{}):this.handleNotification(e):"id"in e?this.handleResponse(e):"error"in e&&this.handleResponse(e)}async handleRequest(e){let n=this.requestHandlers.get(e.method)??this.defaultRequestHandler;if(!n){await this.sendError(e.id,{code:D.MethodNotFound,message:`Method not found: ${e.method}`}).catch(()=>{});return}try{let s=await n(e.params,e.method),r={jsonrpc:"2.0",id:e.id,result:s};await this.stream.send(r).catch(()=>{})}catch(s){let r=s;await this.sendError(e.id,{code:r.code??D.InternalError,message:r.message,data:r.data}).catch(()=>{})}}handleNotification(e){let n=this.notificationHandlers.get(e.method);if(n){n(e.params,e.method);return}let s=this.bufferedNotifications.get(e.method);if(!s){if(this.bufferedNotifications.size>=t.MAX_BUFFERED_METHODS){let r=this.bufferedNotifications.keys().next().value;r!==void 0&&this.bufferedNotifications.delete(r)}s=[],this.bufferedNotifications.set(e.method,s)}s.push(e),s.length>t.MAX_BUFFERED_PER_METHOD&&s.shift()}handleResponse(e){let n=e.id===null?void 0:this.pending.get(e.id);if(!n){if(e.error)for(let s of this.orphanErrorHandlers)try{s({code:e.error.code,message:e.error.message,data:e.error.data})}catch{}return}if(this.pending.delete(e.id),e.error){let s=new Error(e.error.message);s.code=e.error.code,s.data=e.error.data,n.reject(s)}else n.resolve(e.result)}async sendError(e,n){let s={jsonrpc:"2.0",id:e,error:n};await this.stream.send(s)}handleClose(e){if(!this.closed){this.closed=!0;for(let n of this.pending.values())n.reject(e??new Error("connection closed"));this.pending.clear();for(let n of this.closeHandlers)n(e)}}}});import*as vf from"fs/promises";function sb(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Gw,Qw,Pr,Xw,Zw,eb,tb,nb,bf,Xo,If=q(()=>{"use strict";Gw=64*1024*1024,Qw=1*1024*1024,Pr=64*1024,Xw=6e4,Zw=100,eb=1e3,tb=64*1024,nb=256*1024,bf=20;Xo=class{storage;maxCapacityBytes;currentCapacityBytes;writeCursor=0;closed=!1;waiters=[];filePath;fileCapBytes;fileBytesWritten=0;fileCapReached=!1;onFileCapReached;logWriteError;fileWriteChain=Promise.resolve();constructor(e={}){if(this.maxCapacityBytes=e.capacityBytes??Gw,this.maxCapacityBytes<=0)throw new Error("capacityBytes must be > 0");this.currentCapacityBytes=Math.min(Qw,this.maxCapacityBytes),this.storage=Buffer.alloc(this.currentCapacityBytes),this.filePath=e.filePath,this.fileCapBytes=e.fileCapBytes??Number.POSITIVE_INFINITY,this.onFileCapReached=e.onFileCapReached,this.logWriteError=e.logWriteError}get capacity(){return this.maxCapacityBytes}get allocatedBytes(){return this.currentCapacityBytes}get writeCursorPos(){return this.writeCursor}get oldestAvailable(){return Math.max(0,this.writeCursor-this.currentCapacityBytes)}get isClosed(){return this.closed}append(e){this.closed||e.length===0||(this.writeRing(e),this.writeCursor+=e.length,this.filePath!==void 0&&this.scheduleFileWrite(e),this.wakeWaiters("data"))}close(){this.closed||(this.closed=!0,this.wakeWaiters("eof"))}read(e,n){let s=Math.max(0,Math.min(n,Pr));if(s===0){let f={bytes:Buffer.alloc(0),nextCursor:e};return this.closed&&e>=this.writeCursor&&(f.eof=!0),f}let r=e,i=0,o=this.oldestAvailable;r<o&&(i=o-r,r=o);let a=this.writeCursor-r;if(a<=0){let f={bytes:Buffer.alloc(0),nextCursor:r};return i>0&&(f.gap=i),this.closed&&(f.eof=!0),f}let d=Math.min(a,s),l={bytes:this.sliceFromRing(r,d),nextCursor:r+d};return i>0&&(l.gap=i),this.closed&&r+d>=this.writeCursor&&(l.eof=!0),l}tail(e){let n=Math.max(0,Math.min(e,Pr)),s=this.oldestAvailable,r=this.writeCursor-n,i=Math.max(s,r),o=r<s;return{bytes:this.sliceFromRing(i,this.writeCursor-i),startCursor:i,endCursor:this.writeCursor,truncated:o}}head(e){let n=Math.max(0,Math.min(e,Pr)),s=this.oldestAvailable,r=s>0,i=s,o=Math.min(this.writeCursor,i+n);return{bytes:this.sliceFromRing(i,o-i),startCursor:i,endCursor:o,truncated:r}}waitForData(e,n){if(e<this.writeCursor)return Promise.resolve("data");if(this.closed)return Promise.resolve("eof");let s=Math.max(0,Math.min(n,Xw));return s===0?Promise.resolve("timeout"):new Promise(r=>{let i={resolve:o=>{i.timer!==void 0&&(clearTimeout(i.timer),i.timer=void 0),r(o)},timer:setTimeout(()=>{let o=this.waiters.indexOf(i);o>=0&&this.waiters.splice(o,1),i.timer=void 0,r("timeout")},s)};this.waiters.push(i)})}grep(e){let n=this.oldestAvailable,s=e.cursor,r=s??n,i=0;s!==void 0&&s<n&&(i=n-s,r=n),r>this.writeCursor&&(r=this.writeCursor);let o=this.sliceFromRing(r,this.writeCursor-r),a=e.regex??!0,d=e.caseInsensitive===!0?"i":"",c=a?new RegExp(e.pattern,d):new RegExp(sb(e.pattern),d),l=e.invert??!1,f=Math.max(1,Math.min(e.maxMatches??Zw,eb)),u=Math.max(1,Math.min(e.maxBytes??tb,nb)),p=Math.max(0,Math.min(e.contextBefore??0,bf)),m=Math.max(0,Math.min(e.contextAfter??0,bf)),g=[],y=[],v=[],b=0,k=!1,R=0,H=0,z=(W,F)=>{for(let Z of v)Z.remaining>0&&(Z.match.after===void 0&&(Z.match.after=[]),Z.match.after.push({cursor:W,line:F}),Z.remaining--,b+=F.length);for(;v.length>0&&v[0].remaining===0;)v.shift();if(c.test(F)!==l&&g.length<f){let Z={cursor:W,line:F};if(p>0&&y.length>0){Z.before=y.slice();for(let ee of Z.before)b+=ee.line.length}b+=F.length,g.push(Z),m>0&&v.push({match:Z,remaining:m})}if(p>0)for(y.push({cursor:W,line:F});y.length>p;)y.shift();let Y=g.length>=f&&v.length===0,te=b>=u;return Y||te};for(let W=0;W<o.length;W++){if(o[W]!==10)continue;let F=o.subarray(R,W).toString("utf8"),U=r+R;if(R=W+1,H=R,z(U,F)){k=!0;break}}if(!k&&R<o.length&&this.closed){let W=o.subarray(R).toString("utf8"),F=r+R;z(F,W)&&(k=!0),H=o.length}let K=Math.min(r+H,this.writeCursor),J={matches:g,truncated:k,nextCursor:K,scannedBytes:H};return i>0&&(J.gap=i),this.closed&&K>=this.writeCursor&&(J.eof=!0),J}wakeWaiters(e){if(this.waiters.length===0)return;let n=this.waiters;this.waiters=[];for(let s of n)s.resolve(e)}growIfNeeded(e){if(this.currentCapacityBytes>=this.maxCapacityBytes)return;let n=this.writeCursor+e;if(n<=this.currentCapacityBytes)return;let s=this.currentCapacityBytes;for(;s<n&&s<this.maxCapacityBytes;)s=Math.min(this.maxCapacityBytes,s*2);if(s===this.currentCapacityBytes)return;let r=Buffer.alloc(s);this.storage.copy(r,0,0,this.writeCursor),this.storage=r,this.currentCapacityBytes=s}writeRing(e){let n=e.length;if(this.growIfNeeded(n),n>=this.currentCapacityBytes){let i=n-this.currentCapacityBytes;e.copy(this.storage,0,i,n);return}let s=this.writeCursor%this.currentCapacityBytes,r=this.currentCapacityBytes-s;n<=r?e.copy(this.storage,s,0,n):(e.copy(this.storage,s,0,r),e.copy(this.storage,0,r,n))}sliceFromRing(e,n){if(n<=0)return Buffer.alloc(0);let s=Buffer.alloc(n),r=e%this.currentCapacityBytes,i=Math.min(n,this.currentCapacityBytes-r);return this.storage.copy(s,0,r,r+i),i<n&&this.storage.copy(s,i,0,n-i),s}scheduleFileWrite(e){let n=this.filePath;if(n===void 0||this.fileCapReached)return;let s=this.fileCapBytes-this.fileBytesWritten;if(s<=0){this.fileCapReached=!0,this.onFileCapReached?.();return}let r=e.length<=s?e:e.subarray(0,s);this.fileBytesWritten+=r.length;let i=this.fileBytesWritten>=this.fileCapBytes;this.fileWriteChain=this.fileWriteChain.then(()=>vf.appendFile(n,r)).catch(o=>{this.logWriteError?.(o)}),i&&!this.fileCapReached&&(this.fileCapReached=!0,this.onFileCapReached?.())}async drainFileWrites(){await this.fileWriteChain.catch(()=>{})}}});var Zo,mT,Sf=q(()=>{"use strict";Zo=[{verb:"title",name:"hydra title",description:"Regenerate the session title + synopsis via the agent (or set title manually with an arg)"},{verb:"agent",name:"hydra agent",argsHint:"<agent>",description:"Swap the agent backing this session, preserving context"},{verb:"kill",name:"hydra kill",description:"Close this session (kills the agent; record is kept so it can be resumed later)"},{verb:"restart",name:"hydra restart",description:"Restart the agent with a fresh session/new while preserving conversation history (useful when the proxy has changed available models)"},{verb:"config",name:"hydra config",argsHint:"[<id> [<value>]]",description:"List or set an agent-advertised configOption (model, mode, effort, etc.). With no args, lists all options; with <id>, shows its choices; with <id> <value>, applies it."}],mT=new Map(Zo.map(t=>[t.verb,t]))});function kf(t){let e=t.lastIndexOf("/");return(e===-1?t:t.slice(e+1)).toLowerCase()}function Mr(t,e){return cc(t,e.map(n=>n.modelId))}function cc(t,e){if(e.length===0)return{kind:"none",requested:t};if(e.includes(t))return{kind:"exact",modelId:t};let n=kf(t),s=e.filter(i=>kf(i)===n);if(s.length===1)return{kind:"resolved",modelId:s[0],requested:t};if(s.length>1)return{kind:"ambiguous",requested:t,candidates:s};let r=t.toLowerCase();if(r.length>0){let i=e.filter(o=>o.toLowerCase().includes(r));if(i.length===1)return{kind:"resolved",modelId:i[0],requested:t};if(i.length>1)return{kind:"ambiguous",requested:t,candidates:i}}return{kind:"unknown",requested:t}}var ea=q(()=>{"use strict"});function xf(t){if(t.length===0)return t;let e=new Map,n=new Map,s=new Map;for(let a=0;a<t.length;a++){let d=t[a];if(d===void 0)continue;let c=lc(d);if(c?.sessionUpdate!=="tool_call_update")continue;let l=typeof c.toolCallId=="string"?c.toolCallId:void 0;if(l!==void 0&&(e.set(l,a),c.rawInput&&typeof c.rawInput=="object"&&!Array.isArray(c.rawInput)&&Object.keys(c.rawInput).length>0&&s.set(l,c.rawInput),Array.isArray(c.content)&&c.content.length>0)){let f=n.get(l);f?f.push(...c.content):n.set(l,[...c.content])}}let r=[],i=null,o=null;for(let a=0;a<t.length;a++){let d=t[a];if(d===void 0)continue;let c=lc(d);if(!c||typeof c.sessionUpdate!="string"){r.push(d),i=null;continue}let l=c.sessionUpdate;if(l==="agent_message_chunk"||l==="agent_thought_chunk"||l==="user_message_chunk"){i&&i.kind===l?ib(r,i.outIndex,rb(c.content)):(r.push(d),i={outIndex:r.length-1,kind:l});continue}if(i=null,l==="tool_call_update"){let f=typeof c.toolCallId=="string"?c.toolCallId:void 0;if(f!==void 0&&e.get(f)!==a)continue;let u=f!==void 0&&n.has(f)?ob(d,n.get(f)??[]):d;f!==void 0&&s.has(f)&&!ab(u)&&(u=db(u,s.get(f))),r.push(u);continue}if(l==="plan"){o!==null?r[o]=d:(r.push(d),o=r.length-1);continue}(l==="prompt_received"||l==="turn_complete")&&(o=null),r.push(d)}return r}function lc(t){if(t.method!=="session/update")return;let n=t.params?.update;if(!(!n||typeof n!="object"||Array.isArray(n)))return n}function rb(t){if(!t||typeof t!="object")return"";let e=t;return typeof e.text=="string"?e.text:""}function ib(t,e,n){if(n.length===0)return;let s=t[e];if(s===void 0)return;let r=s.params??{},i=r.update??{},o=i.content??{},a=typeof o.text=="string"?o.text:"";t[e]={...s,params:{...r,update:{...i,content:{...o,text:a+n}}}}}function ob(t,e){let n=t.params??{},s=n.update??{};return{...t,params:{...n,update:{...s,content:e}}}}function ab(t){let n=lc(t)?.rawInput;return!!n&&typeof n=="object"&&!Array.isArray(n)&&Object.keys(n).length>0}function db(t,e){let n=t.params??{},s=n.update??{};return{...t,params:{...n,update:{...s,rawInput:e}}}}var Af=q(()=>{"use strict"});import*as pn from"fs/promises";async function $i(t,e){let n=M.queueFile(t);if(e.length===0){await pn.unlink(n).catch(()=>{});return}await pn.mkdir(M.sessionDir(t),{recursive:!0});let s=e.map(r=>JSON.stringify(r)).join(`
8
+ `);o!==-1&&(process.stdin.removeListener("data",s),process.stdin.removeListener("error",r),t(n.slice(0,o).replace(/\r$/,"")))},r=i=>{process.stdin.removeListener("data",s),process.stdin.removeListener("error",r),e(i)};process.stdin.on("data",s),process.stdin.on("error",r)})}var Wd=J(()=>{"use strict"});import*as Tu from"path";function cn(){let t=process.argv[1];if(!t)return"hydra-acp";let e=Tu.basename(t);return e==="cli.js"||e==="cli"?"hydra-acp":e}var Mi=J(()=>{"use strict"});import*as Pu from"os";async function Dt(t){let e=await Ti(),n=t.daemon.host,s=t.daemon.port,r=!!t.daemon.tls,i=r?"https":"http",o=r?"wss":"ws";return{baseUrl:`${i}://${n}:${s}`,wsUrl:`${o}://${n}:${s}/acp`,token:e,display:`${n}:${s}`,isLocal:Bn(n)}}function Jd(t,e){let{httpScheme:n,wsScheme:s}=Hd(t.host);return{baseUrl:`${n}://${t.host}:${t.port}`,wsUrl:`${s}://${t.host}:${t.port}/acp`,token:e,display:_u(t),isLocal:t.isLoopback}}async function Mu(t,e={}){let n=e.fetchImpl??fetch,s=e.promptImpl??Ar,r=e.preferServiceToken??!0,i=e.allowPrompt??!0;if(t.isLoopback&&r){let m=await Sr();if(m)return Jd(t,m)}let o=e.store??await Do.load(),a=o.get(t.host,t.port);if(a)return Jd(t,a.token);if(!i)throw new zd(t.host,t.port);let d=_u(t),c=await s(`Password for ${d}: `);if(c.length===0)throw new Error("Password is required to attach to a remote daemon.");let{httpScheme:l}=Hd(t.host),f=`${l}://${t.host}:${t.port}`,u=await n(`${f}/v1/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:c,label:Eu()})});if(u.status===401)throw new Error(`Wrong password for ${d}.`);if(u.status===403)throw new Error(`No password is configured on ${d}. Run \`hydra-acp auth password\` on the daemon host first.`);if(u.status===429)throw new Error(`Too many failed login attempts on ${d}; try again later.`);if(!u.ok)throw new Error(`Login to ${d} failed: HTTP ${u.status}`);let p=await u.json();if(!p.session_token||!p.expires_at)throw new Error(`Login to ${d} returned a malformed response.`);return await o.set(t.host,t.port,{token:p.session_token,expiresAt:p.expires_at,label:Eu()}),Jd(t,p.session_token)}function Eu(){try{let t=Pu.hostname();return t.length>0?t:"remote"}catch{return"remote"}}function _u(t){let e=t.isLoopback?xr:443;return t.port===e?t.host:`${t.host}:${t.port}`}var zd,Ds=J(()=>{"use strict";je();Fn();Pi();Ru();Wd();Mi();Pi();zd=class extends Error{host;port;constructor(e,n){let s=n===443?"":`:${n}`;super(`No cached credentials for ${e}:${n}. Run \`${cn()} --session hydra://${e}${s}/\` once in a terminal to log in.`),this.name="NoCachedCredentialError",this.host=e,this.port=n}}});var D,Jo=J(()=>{"use strict";D={ParseError:-32700,InvalidRequest:-32600,MethodNotFound:-32601,InvalidParams:-32602,InternalError:-32603,AuthRequired:-32e3,SessionNotFound:-32001,NotAuthorisedToAttach:-32002,MultiClientNotSupported:-32003,AgentNotInstalled:-32005,BundleAlreadyImported:-32010,PermissionDenied:-32011,AlreadyAttached:-32012,StreamNotEnabled:-32013,SessionClosing:-32014}});import{z as Ce}from"zod";var nf,jw,sf,rf,of,ic=J(()=>{"use strict";nf=Ce.object({protocolVersion:Ce.number().optional(),clientCapabilities:Ce.record(Ce.unknown()).optional(),clientInfo:Ce.object({name:Ce.string(),version:Ce.string().optional()}).optional()}),jw=Ce.enum(["full","pending_only","none","after_message"]),sf=Ce.object({cwd:Ce.string(),mcpServers:Ce.array(Ce.unknown()).optional(),_meta:Ce.record(Ce.unknown()).optional()}),rf=Ce.object({upstreamSessionId:Ce.string(),agentId:Ce.string(),cwd:Ce.string(),title:Ce.string().optional(),agentArgs:Ce.array(Ce.string()).optional()}),of=Ce.object({sessionId:Ce.string(),historyPolicy:jw.default("full"),afterMessageId:Ce.string().optional(),clientId:Ce.string().optional(),clientInfo:Ce.object({name:Ce.string(),version:Ce.string().optional()}).optional(),_meta:Ce.record(Ce.unknown()).optional()})});import{z as ae}from"zod";function zo(t,e){let n={attachedClients:t.attachedClients,status:t.status,busy:t.busy,awaitingInput:t.awaitingInput};return t.cwd!==void 0&&(n.cwd=t.cwd),t.title!==void 0&&(n.title=t.title),t.agentId!==void 0&&(n.agentId=t.agentId),t.upstreamSessionId!==void 0&&(n.upstreamSessionId=t.upstreamSessionId),t.currentModel!==void 0&&(n.currentModel=t.currentModel),t.currentUsage!==void 0&&(n.currentUsage=t.currentUsage),t.importedFromMachine!==void 0&&(n.importedFromMachine=t.importedFromMachine),t.importedFromUpstreamSessionId!==void 0&&(n.importedFromUpstreamSessionId=t.importedFromUpstreamSessionId),t.parentSessionId!==void 0&&(n.parentSessionId=t.parentSessionId),t.forkedFromSessionId!==void 0&&(n.forkedFromSessionId=t.forkedFromSessionId),t.forkedFromMessageId!==void 0&&(n.forkedFromMessageId=t.forkedFromMessageId),t.originatingClient!==void 0&&(n.originatingClient=t.originatingClient),t.interactive!==void 0&&(n.interactive=t.interactive),t.priority!==void 0&&t.priority>0&&(n.priority=t.priority),e&&(e.clientId!==void 0&&(n.clientId=e.clientId),e.currentMode!==void 0&&(n.currentMode=e.currentMode),e.agentArgs!==void 0&&e.agentArgs.length>0&&(n.agentArgs=e.agentArgs),e.availableCommands!==void 0&&e.availableCommands.length>0&&(n.availableCommands=e.availableCommands),e.availableModes!==void 0&&e.availableModes.length>0&&(n.availableModes=e.availableModes),e.availableModels!==void 0&&e.availableModels.length>0&&(n.availableModels=e.availableModels),e.turnStartedAt!==void 0&&(n.turnStartedAt=e.turnStartedAt),e.agentCapabilities!==void 0&&(n.agentCapabilities=e.agentCapabilities),e.queue!==void 0&&e.queue.length>0&&(n.queue=e.queue)),n}function cf(t){let e={sessionId:t.sessionId,cwd:t.cwd,updatedAt:t.updatedAt,_meta:_i(t._meta,zo(t))};return t.title!==void 0&&(e.title=t.title),e}var af,df,oc,OR,qw,FR,ac=J(()=>{"use strict";Ko();af=ae.object({sessionId:ae.string()}),df=ae.object({cwd:ae.string().optional(),cursor:ae.string().optional()}),oc=ae.object({used:ae.number().optional(),size:ae.number().optional(),costAmount:ae.number().optional(),costCurrency:ae.string().optional()}),OR=ae.object({sessionId:ae.string(),upstreamSessionId:ae.string().optional(),cwd:ae.string(),title:ae.string().optional(),agentId:ae.string().optional(),currentModel:ae.string().optional(),currentUsage:oc.optional(),importedFromMachine:ae.string().optional(),importedFromUpstreamSessionId:ae.string().optional(),parentSessionId:ae.string().optional(),forkedFromSessionId:ae.string().optional(),forkedFromMessageId:ae.string().optional(),originatingClient:ae.object({name:ae.string(),version:ae.string().optional()}).optional(),interactive:ae.boolean().optional(),priority:ae.number().int().nonnegative().optional(),updatedAt:ae.string(),attachedClients:ae.number().int().nonnegative(),status:ae.enum(["live","cold"]).default("live"),busy:ae.boolean().default(!1),awaitingInput:ae.boolean().default(!1),_meta:ae.record(ae.unknown()).optional()}),qw=ae.object({sessionId:ae.string(),cwd:ae.string(),title:ae.string().optional(),updatedAt:ae.string().optional(),_meta:ae.record(ae.unknown()).optional()}),FR=ae.object({sessions:ae.array(qw),nextCursor:ae.string().optional()})});function Ww(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e={};for(let[n,s]of Object.entries(t)){if(typeof n!="string"||n.length===0||typeof s!="string")return;e[n]=s}return e}function Mt(t){if(!t)return{};let e=t[lt];if(!e||typeof e!="object"||Array.isArray(e))return{};let n=e,s={};if(typeof n.upstreamSessionId=="string"&&(s.upstreamSessionId=n.upstreamSessionId),typeof n.agentId=="string"&&(s.agentId=n.agentId),typeof n.cwd=="string"&&(s.cwd=n.cwd),typeof n.clientId=="string"&&(s.clientId=n.clientId),typeof n.readonly=="boolean"&&(s.readonly=n.readonly),(n.replayMode==="instant"||n.replayMode==="drip")&&(s.replayMode=n.replayMode),typeof n.dripSpeed=="number"&&n.dripSpeed>0&&(s.dripSpeed=n.dripSpeed),(n.toolContent==="inline"||n.toolContent==="references")&&(s.toolContent=n.toolContent),n.detachStatus==="detached"&&(s.detachStatus=n.detachStatus),typeof n.title=="string"&&(s.title=n.title),Array.isArray(n.agentArgs)&&n.agentArgs.every(r=>typeof r=="string")&&(s.agentArgs=n.agentArgs),Array.isArray(n.transformers)&&n.transformers.every(r=>typeof r=="string")&&(s.transformers=n.transformers),n.resume){let r=rf.safeParse(n.resume);r.success&&(s.resume=r.data)}if(typeof n.model=="string"&&(s.model=n.model),typeof n.currentModel=="string"&&(s.currentModel=n.currentModel),typeof n.currentMode=="string"&&(s.currentMode=n.currentMode),n.currentUsage){let r=oc.safeParse(n.currentUsage);r.success&&(s.currentUsage=r.data)}if(typeof n.turnStartedAt=="number"&&n.turnStartedAt>0&&(s.turnStartedAt=n.turnStartedAt),Array.isArray(n.availableCommands)){let r=[];for(let i of n.availableCommands){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i;if(typeof o.name!="string")continue;let a={name:o.name};typeof o.description=="string"&&(a.description=o.description),r.push(a)}r.length>0&&(s.availableCommands=r)}if(n.prompt&&typeof n.prompt=="object"&&!Array.isArray(n.prompt)){let r=n.prompt,i={};typeof r.queueing=="boolean"&&(i.queueing=r.queueing),typeof r.cancelling=="boolean"&&(i.cancelling=r.cancelling),typeof r.updating=="boolean"&&(i.updating=r.updating),typeof r.amending=="boolean"&&(i.amending=r.amending),typeof r.pipelining=="boolean"&&(i.pipelining=r.pipelining),s.prompt=i}if(n.agents&&typeof n.agents=="object"&&!Array.isArray(n.agents)){let r=n.agents,i={};typeof r.list=="boolean"&&(i.list=r.list),typeof r.installProgress=="boolean"&&(i.installProgress=r.installProgress),s.agents=i}if(typeof n.mcpStdin=="boolean"&&(s.mcpStdin=n.mcpStdin),typeof n.interactive=="boolean"&&(s.interactive=n.interactive),typeof n.ancillary=="boolean"&&(s.ancillary=n.ancillary),Array.isArray(n.queue)){let r=[];for(let i of n.queue){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i,a=o.originator;if(typeof o.messageId!="string"||!a||typeof a.clientId!="string"||!Array.isArray(o.prompt)||typeof o.position!="number"||typeof o.enqueuedAt!="number")continue;let d={clientId:a.clientId};typeof a.name=="string"&&(d.name=a.name),typeof a.version=="string"&&(d.version=a.version),r.push({messageId:o.messageId,originator:d,prompt:o.prompt,position:o.position,enqueuedAt:o.enqueuedAt})}r.length>0&&(s.queue=r)}if(Array.isArray(n.availableModes)){let r=[];for(let i of n.availableModes){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i;if(typeof o.id!="string")continue;let a={id:o.id};typeof o.name=="string"&&(a.name=o.name),typeof o.description=="string"&&(a.description=o.description),r.push(a)}r.length>0&&(s.availableModes=r)}if(Array.isArray(n.availableModels)){let r=[];for(let i of n.availableModels){if(!i||typeof i!="object"||Array.isArray(i))continue;let o=i;if(typeof o.modelId!="string")continue;let a={modelId:o.modelId};typeof o.name=="string"&&(a.name=o.name),typeof o.description=="string"&&(a.description=o.description),r.push(a)}r.length>0&&(s.availableModels=r)}if((n.status==="live"||n.status==="cold")&&(s.status=n.status),typeof n.busy=="boolean"&&(s.busy=n.busy),typeof n.awaitingInput=="boolean"&&(s.awaitingInput=n.awaitingInput),typeof n.attachedClients=="number"&&(s.attachedClients=n.attachedClients),typeof n.importedFromMachine=="string"&&(s.importedFromMachine=n.importedFromMachine),typeof n.importedFromUpstreamSessionId=="string"&&(s.importedFromUpstreamSessionId=n.importedFromUpstreamSessionId),typeof n.parentSessionId=="string"&&(s.parentSessionId=n.parentSessionId),typeof n.forkedFromSessionId=="string"&&(s.forkedFromSessionId=n.forkedFromSessionId),typeof n.forkedFromMessageId=="string"&&(s.forkedFromMessageId=n.forkedFromMessageId),n.originatingClient&&typeof n.originatingClient=="object"&&!Array.isArray(n.originatingClient)&&typeof n.originatingClient.name=="string"){let r=n.originatingClient;s.originatingClient={name:r.name,...typeof r.version=="string"?{version:r.version}:{}}}if(n.agentCapabilities!==void 0&&(s.agentCapabilities=n.agentCapabilities),n.env!==void 0){let r=Ww(n.env);r!==void 0&&(s.env=r)}return s}function _i(t,e){return{...t??{},[lt]:e}}var lt,Ko=J(()=>{"use strict";ic();ac();lt="hydra-acp"});import{z as Y}from"zod";var lf,Vo,uf,UR,jR,qR,ff,WR,pf,JR,hf,zR,KR,mf=J(()=>{"use strict";lf=Y.object({sessionId:Y.string(),prompt:Y.array(Y.unknown()),_meta:Y.record(Y.unknown()).optional()}),Vo=Y.object({sessionId:Y.string()}),uf=Y.object({clientId:Y.string(),name:Y.string().optional(),version:Y.string().optional()}),UR=Y.object({sessionId:Y.string(),messageId:Y.string(),originator:uf,prompt:Y.array(Y.unknown()),position:Y.number().int().nonnegative(),queueDepth:Y.number().int().positive(),enqueuedAt:Y.number()}),jR=Y.object({sessionId:Y.string(),messageId:Y.string(),prompt:Y.array(Y.unknown())}),qR=Y.object({sessionId:Y.string(),messageId:Y.string(),reason:Y.enum(["started","cancelled","abandoned"])}),ff=Y.object({sessionId:Y.string(),messageId:Y.string()}),WR=Y.object({cancelled:Y.boolean(),reason:Y.enum(["ok","not_found","already_running"])}),pf=Y.object({sessionId:Y.string(),messageId:Y.string(),prompt:Y.array(Y.unknown())}),JR=Y.object({updated:Y.boolean(),reason:Y.enum(["ok","not_found","already_running"])}),hf=Y.object({sessionId:Y.string(),targetMessageId:Y.string(),prompt:Y.array(Y.unknown()),replaceQueue:Y.boolean().optional(),onTargetCompleted:Y.enum(["reject","send_anyway"]).optional()}),zR=Y.object({amended:Y.boolean(),reason:Y.enum(["ok","target_completed","target_cancelled","target_not_found"]),messageId:Y.string().optional()}),KR=Y.object({sessionId:Y.string(),cancelledMessageId:Y.string(),newMessageId:Y.string(),prompt:Y.array(Y.unknown()),originator:uf,amendedAt:Y.number()})});import{z as is}from"zod";var gf,Yo,yf=J(()=>{"use strict";gf=is.object({agentId:is.string(),version:is.string(),source:is.enum(["binary","npm"]),phase:is.enum(["download_start","download_progress","download_done","extract","install_start","installed"]),receivedBytes:is.number().optional(),totalBytes:is.number().optional(),packageSpec:is.string().optional()}),Yo="hydra-acp/agents/install_progress"});var yt=J(()=>{"use strict";Jo();ic();Ko();ac();mf();yf()});import{nanoid as Jw}from"nanoid";var dc,kt,Us=J(()=>{"use strict";yt();dc=class extends Error{code="ERR_CONNECTION_CLOSED";constructor(e="connection is closed"){super(e),this.name="ConnectionClosedError"}},kt=class t{constructor(e){this.stream=e;this.stream.onMessage(n=>this.handleIncoming(n)),this.stream.onClose(n=>this.handleClose(n))}stream;requestHandlers=new Map;defaultRequestHandler;notificationHandlers=new Map;bufferedNotifications=new Map;static MAX_BUFFERED_PER_METHOD=64;static MAX_BUFFERED_METHODS=256;pending=new Map;closed=!1;closeHandlers=[];orphanErrorHandlers=[];onRequest(e,n){this.requestHandlers.set(e,n)}setDefaultHandler(e){this.defaultRequestHandler=e}onNotification(e,n){this.notificationHandlers.set(e,n);let s=this.bufferedNotifications.get(e);if(s){this.bufferedNotifications.delete(e);for(let r of s)try{n(r.params,r.method)}catch{}}}drainBuffered(e){let s=this.bufferedNotifications.get(e)?.length??0;return this.bufferedNotifications.delete(e),s}onClose(e){this.closeHandlers.push(e)}isClosed(){return this.closed}onOrphanError(e){this.orphanErrorHandlers.push(e)}async request(e,n){return this.requestWithId(e,n).response}requestWithId(e,n){if(this.closed)throw new dc;let s=Jw(),r={jsonrpc:"2.0",id:s,method:e,params:n},i=new Promise((o,a)=>{this.pending.set(s,{resolve:d=>o(d),reject:a}),this.stream.send(r).catch(d=>{this.pending.delete(s),a(d)})});return{id:s,response:i}}notify(e,n){if(this.closed)return Promise.resolve();let s={jsonrpc:"2.0",method:e,params:n};return this.stream.send(s)}async close(){this.closed||await this.stream.close()}fail(e){this.handleClose(e)}handleIncoming(e){"method"in e?"id"in e&&e.id!==void 0?this.handleRequest(e).catch(()=>{}):this.handleNotification(e):"id"in e?this.handleResponse(e):"error"in e&&this.handleResponse(e)}async handleRequest(e){let n=this.requestHandlers.get(e.method)??this.defaultRequestHandler;if(!n){await this.sendError(e.id,{code:D.MethodNotFound,message:`Method not found: ${e.method}`}).catch(()=>{});return}try{let s=await n(e.params,e.method),r={jsonrpc:"2.0",id:e.id,result:s};await this.stream.send(r).catch(()=>{})}catch(s){let r=s;await this.sendError(e.id,{code:r.code??D.InternalError,message:r.message,data:r.data}).catch(()=>{})}}handleNotification(e){let n=this.notificationHandlers.get(e.method);if(n){n(e.params,e.method);return}let s=this.bufferedNotifications.get(e.method);if(!s){if(this.bufferedNotifications.size>=t.MAX_BUFFERED_METHODS){let r=this.bufferedNotifications.keys().next().value;r!==void 0&&this.bufferedNotifications.delete(r)}s=[],this.bufferedNotifications.set(e.method,s)}s.push(e),s.length>t.MAX_BUFFERED_PER_METHOD&&s.shift()}handleResponse(e){let n=e.id===null?void 0:this.pending.get(e.id);if(!n){if(e.error)for(let s of this.orphanErrorHandlers)try{s({code:e.error.code,message:e.error.message,data:e.error.data})}catch{}return}if(this.pending.delete(e.id),e.error){let s=new Error(e.error.message);s.code=e.error.code,s.data=e.error.data,n.reject(s)}else n.resolve(e.result)}async sendError(e,n){let s={jsonrpc:"2.0",id:e,error:n};await this.stream.send(s)}handleClose(e){if(!this.closed){this.closed=!0;for(let n of this.pending.values())n.reject(e??new Error("connection closed"));this.pending.clear();for(let n of this.closeHandlers)n(e)}}}});import*as vf from"fs/promises";function sb(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Gw,Qw,Pr,Xw,Zw,eb,tb,nb,bf,Xo,If=J(()=>{"use strict";Gw=64*1024*1024,Qw=1*1024*1024,Pr=64*1024,Xw=6e4,Zw=100,eb=1e3,tb=64*1024,nb=256*1024,bf=20;Xo=class{storage;maxCapacityBytes;currentCapacityBytes;writeCursor=0;closed=!1;waiters=[];filePath;fileCapBytes;fileBytesWritten=0;fileCapReached=!1;onFileCapReached;logWriteError;fileWriteChain=Promise.resolve();constructor(e={}){if(this.maxCapacityBytes=e.capacityBytes??Gw,this.maxCapacityBytes<=0)throw new Error("capacityBytes must be > 0");this.currentCapacityBytes=Math.min(Qw,this.maxCapacityBytes),this.storage=Buffer.alloc(this.currentCapacityBytes),this.filePath=e.filePath,this.fileCapBytes=e.fileCapBytes??Number.POSITIVE_INFINITY,this.onFileCapReached=e.onFileCapReached,this.logWriteError=e.logWriteError}get capacity(){return this.maxCapacityBytes}get allocatedBytes(){return this.currentCapacityBytes}get writeCursorPos(){return this.writeCursor}get oldestAvailable(){return Math.max(0,this.writeCursor-this.currentCapacityBytes)}get isClosed(){return this.closed}append(e){this.closed||e.length===0||(this.writeRing(e),this.writeCursor+=e.length,this.filePath!==void 0&&this.scheduleFileWrite(e),this.wakeWaiters("data"))}close(){this.closed||(this.closed=!0,this.wakeWaiters("eof"))}read(e,n){let s=Math.max(0,Math.min(n,Pr));if(s===0){let f={bytes:Buffer.alloc(0),nextCursor:e};return this.closed&&e>=this.writeCursor&&(f.eof=!0),f}let r=e,i=0,o=this.oldestAvailable;r<o&&(i=o-r,r=o);let a=this.writeCursor-r;if(a<=0){let f={bytes:Buffer.alloc(0),nextCursor:r};return i>0&&(f.gap=i),this.closed&&(f.eof=!0),f}let d=Math.min(a,s),l={bytes:this.sliceFromRing(r,d),nextCursor:r+d};return i>0&&(l.gap=i),this.closed&&r+d>=this.writeCursor&&(l.eof=!0),l}tail(e){let n=Math.max(0,Math.min(e,Pr)),s=this.oldestAvailable,r=this.writeCursor-n,i=Math.max(s,r),o=r<s;return{bytes:this.sliceFromRing(i,this.writeCursor-i),startCursor:i,endCursor:this.writeCursor,truncated:o}}head(e){let n=Math.max(0,Math.min(e,Pr)),s=this.oldestAvailable,r=s>0,i=s,o=Math.min(this.writeCursor,i+n);return{bytes:this.sliceFromRing(i,o-i),startCursor:i,endCursor:o,truncated:r}}waitForData(e,n){if(e<this.writeCursor)return Promise.resolve("data");if(this.closed)return Promise.resolve("eof");let s=Math.max(0,Math.min(n,Xw));return s===0?Promise.resolve("timeout"):new Promise(r=>{let i={resolve:o=>{i.timer!==void 0&&(clearTimeout(i.timer),i.timer=void 0),r(o)},timer:setTimeout(()=>{let o=this.waiters.indexOf(i);o>=0&&this.waiters.splice(o,1),i.timer=void 0,r("timeout")},s)};this.waiters.push(i)})}grep(e){let n=this.oldestAvailable,s=e.cursor,r=s??n,i=0;s!==void 0&&s<n&&(i=n-s,r=n),r>this.writeCursor&&(r=this.writeCursor);let o=this.sliceFromRing(r,this.writeCursor-r),a=e.regex??!0,d=e.caseInsensitive===!0?"i":"",c=a?new RegExp(e.pattern,d):new RegExp(sb(e.pattern),d),l=e.invert??!1,f=Math.max(1,Math.min(e.maxMatches??Zw,eb)),u=Math.max(1,Math.min(e.maxBytes??tb,nb)),p=Math.max(0,Math.min(e.contextBefore??0,bf)),m=Math.max(0,Math.min(e.contextAfter??0,bf)),g=[],y=[],v=[],b=0,k=!1,R=0,H=0,q=(W,O)=>{for(let Z of v)Z.remaining>0&&(Z.match.after===void 0&&(Z.match.after=[]),Z.match.after.push({cursor:W,line:O}),Z.remaining--,b+=O.length);for(;v.length>0&&v[0].remaining===0;)v.shift();if(c.test(O)!==l&&g.length<f){let Z={cursor:W,line:O};if(p>0&&y.length>0){Z.before=y.slice();for(let ne of Z.before)b+=ne.line.length}b+=O.length,g.push(Z),m>0&&v.push({match:Z,remaining:m})}if(p>0)for(y.push({cursor:W,line:O});y.length>p;)y.shift();let V=g.length>=f&&v.length===0,se=b>=u;return V||se};for(let W=0;W<o.length;W++){if(o[W]!==10)continue;let O=o.subarray(R,W).toString("utf8"),U=r+R;if(R=W+1,H=R,q(U,O)){k=!0;break}}if(!k&&R<o.length&&this.closed){let W=o.subarray(R).toString("utf8"),O=r+R;q(O,W)&&(k=!0),H=o.length}let K=Math.min(r+H,this.writeCursor),z={matches:g,truncated:k,nextCursor:K,scannedBytes:H};return i>0&&(z.gap=i),this.closed&&K>=this.writeCursor&&(z.eof=!0),z}wakeWaiters(e){if(this.waiters.length===0)return;let n=this.waiters;this.waiters=[];for(let s of n)s.resolve(e)}growIfNeeded(e){if(this.currentCapacityBytes>=this.maxCapacityBytes)return;let n=this.writeCursor+e;if(n<=this.currentCapacityBytes)return;let s=this.currentCapacityBytes;for(;s<n&&s<this.maxCapacityBytes;)s=Math.min(this.maxCapacityBytes,s*2);if(s===this.currentCapacityBytes)return;let r=Buffer.alloc(s);this.storage.copy(r,0,0,this.writeCursor),this.storage=r,this.currentCapacityBytes=s}writeRing(e){let n=e.length;if(this.growIfNeeded(n),n>=this.currentCapacityBytes){let i=n-this.currentCapacityBytes;e.copy(this.storage,0,i,n);return}let s=this.writeCursor%this.currentCapacityBytes,r=this.currentCapacityBytes-s;n<=r?e.copy(this.storage,s,0,n):(e.copy(this.storage,s,0,r),e.copy(this.storage,0,r,n))}sliceFromRing(e,n){if(n<=0)return Buffer.alloc(0);let s=Buffer.alloc(n),r=e%this.currentCapacityBytes,i=Math.min(n,this.currentCapacityBytes-r);return this.storage.copy(s,0,r,r+i),i<n&&this.storage.copy(s,i,0,n-i),s}scheduleFileWrite(e){let n=this.filePath;if(n===void 0||this.fileCapReached)return;let s=this.fileCapBytes-this.fileBytesWritten;if(s<=0){this.fileCapReached=!0,this.onFileCapReached?.();return}let r=e.length<=s?e:e.subarray(0,s);this.fileBytesWritten+=r.length;let i=this.fileBytesWritten>=this.fileCapBytes;this.fileWriteChain=this.fileWriteChain.then(()=>vf.appendFile(n,r)).catch(o=>{this.logWriteError?.(o)}),i&&!this.fileCapReached&&(this.fileCapReached=!0,this.onFileCapReached?.())}async drainFileWrites(){await this.fileWriteChain.catch(()=>{})}}});var Zo,mT,Sf=J(()=>{"use strict";Zo=[{verb:"title",name:"hydra title",description:"Regenerate the session title + synopsis via the agent (or set title manually with an arg)"},{verb:"agent",name:"hydra agent",argsHint:"<agent>",description:"Swap the agent backing this session, preserving context"},{verb:"kill",name:"hydra kill",description:"Close this session (kills the agent; record is kept so it can be resumed later)"},{verb:"restart",name:"hydra restart",description:"Restart the agent with a fresh session/new while preserving conversation history (useful when the proxy has changed available models)"},{verb:"config",name:"hydra config",argsHint:"[<id> [<value>]]",description:"List or set an agent-advertised configOption (model, mode, effort, etc.). With no args, lists all options; with <id>, shows its choices; with <id> <value>, applies it."}],mT=new Map(Zo.map(t=>[t.verb,t]))});function kf(t){let e=t.lastIndexOf("/");return(e===-1?t:t.slice(e+1)).toLowerCase()}function Mr(t,e){return cc(t,e.map(n=>n.modelId))}function cc(t,e){if(e.length===0)return{kind:"none",requested:t};if(e.includes(t))return{kind:"exact",modelId:t};let n=kf(t),s=e.filter(i=>kf(i)===n);if(s.length===1)return{kind:"resolved",modelId:s[0],requested:t};if(s.length>1)return{kind:"ambiguous",requested:t,candidates:s};let r=t.toLowerCase();if(r.length>0){let i=e.filter(o=>o.toLowerCase().includes(r));if(i.length===1)return{kind:"resolved",modelId:i[0],requested:t};if(i.length>1)return{kind:"ambiguous",requested:t,candidates:i}}return{kind:"unknown",requested:t}}var ea=J(()=>{"use strict"});function xf(t){if(t.length===0)return t;let e=new Map,n=new Map,s=new Map;for(let a=0;a<t.length;a++){let d=t[a];if(d===void 0)continue;let c=lc(d);if(c?.sessionUpdate!=="tool_call_update")continue;let l=typeof c.toolCallId=="string"?c.toolCallId:void 0;if(l!==void 0&&(e.set(l,a),c.rawInput&&typeof c.rawInput=="object"&&!Array.isArray(c.rawInput)&&Object.keys(c.rawInput).length>0&&s.set(l,c.rawInput),Array.isArray(c.content)&&c.content.length>0)){let f=n.get(l);f?f.push(...c.content):n.set(l,[...c.content])}}let r=[],i=null,o=null;for(let a=0;a<t.length;a++){let d=t[a];if(d===void 0)continue;let c=lc(d);if(!c||typeof c.sessionUpdate!="string"){r.push(d),i=null;continue}let l=c.sessionUpdate;if(l==="agent_message_chunk"||l==="agent_thought_chunk"||l==="user_message_chunk"){i&&i.kind===l?ib(r,i.outIndex,rb(c.content)):(r.push(d),i={outIndex:r.length-1,kind:l});continue}if(i=null,l==="tool_call_update"){let f=typeof c.toolCallId=="string"?c.toolCallId:void 0;if(f!==void 0&&e.get(f)!==a)continue;let u=f!==void 0&&n.has(f)?ob(d,n.get(f)??[]):d;f!==void 0&&s.has(f)&&!ab(u)&&(u=db(u,s.get(f))),r.push(u);continue}if(l==="plan"){o!==null?r[o]=d:(r.push(d),o=r.length-1);continue}(l==="prompt_received"||l==="turn_complete")&&(o=null),r.push(d)}return r}function lc(t){if(t.method!=="session/update")return;let n=t.params?.update;if(!(!n||typeof n!="object"||Array.isArray(n)))return n}function rb(t){if(!t||typeof t!="object")return"";let e=t;return typeof e.text=="string"?e.text:""}function ib(t,e,n){if(n.length===0)return;let s=t[e];if(s===void 0)return;let r=s.params??{},i=r.update??{},o=i.content??{},a=typeof o.text=="string"?o.text:"";t[e]={...s,params:{...r,update:{...i,content:{...o,text:a+n}}}}}function ob(t,e){let n=t.params??{},s=n.update??{};return{...t,params:{...n,update:{...s,content:e}}}}function ab(t){let n=lc(t)?.rawInput;return!!n&&typeof n=="object"&&!Array.isArray(n)&&Object.keys(n).length>0}function db(t,e){let n=t.params??{},s=n.update??{};return{...t,params:{...n,update:{...s,rawInput:e}}}}var Af=J(()=>{"use strict"});import*as pn from"fs/promises";async function $i(t,e){let n=M.queueFile(t);if(e.length===0){await pn.unlink(n).catch(()=>{});return}await pn.mkdir(M.sessionDir(t),{recursive:!0});let s=e.map(r=>JSON.stringify(r)).join(`
9
9
  `)+`
10
10
  `;await pn.writeFile(n,s,"utf8")}async function Cf(t){let e=M.queueFile(t),n;try{n=await pn.readFile(e,"utf8")}catch(r){if(r.code==="ENOENT")return[];throw r}let s=[];for(let r of n.split(`
11
- `))if(r.trim())try{let i=JSON.parse(r);i&&typeof i.messageId=="string"&&Array.isArray(i.prompt)&&typeof i.enqueuedAt=="number"&&s.push(i)}catch{}return s}async function Rf(t){let e=M.queueFile(t);await pn.unlink(e).catch(()=>{})}var uc=q(()=>{"use strict";ge()});import{customAlphabet as Pf}from"nanoid";import*as $f from"fs/promises";function _r(){return`m_${_f()}`}function ze(t){return t.startsWith(Ht)?t.slice(Ht.length):t}function xt(t,e){return t.code=e,t}function fb(t,e){if(t!=="session/update")return!1;let s=(e??{}).update?.sessionUpdate;return typeof s=="string"&&ub.has(s)}function pb(t,e){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]?.name!==e[n]?.name||t[n]?.description!==e[n]?.description)return!1;return!0}function hb(t,e){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]?.id!==e[n]?.id||t[n]?.name!==e[n]?.name||t[n]?.description!==e[n]?.description)return!1;return!0}function mb(t,e){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]?.modelId!==e[n]?.modelId||t[n]?.name!==e[n]?.name||t[n]?.description!==e[n]?.description)return!1;return!0}function Or(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!n||typeof n!="object"||Array.isArray(n))continue;let s=n,r=typeof s.modelId=="string"&&s.modelId.trim()||typeof s.value=="string"&&s.value.trim()||typeof s.id=="string"&&s.id.trim()||void 0;if(!r)continue;let i={modelId:r};typeof s.name=="string"&&s.name.length>0&&(i.name=s.name),typeof s.description=="string"&&s.description.length>0&&(i.description=s.description),e.push(i)}return e}function Oi(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!n||typeof n!="object"||Array.isArray(n))continue;let s=n,r=typeof s.value=="string"&&s.value.trim()||typeof s.id=="string"&&s.id.trim()||void 0;if(!r)continue;let i={id:r};typeof s.name=="string"&&s.name.length>0&&(i.name=s.name),typeof s.description=="string"&&s.description.length>0&&(i.description=s.description),e.push(i)}return e}function gb(t){let n=(t??{}).update??{};if(n.sessionUpdate!=="available_modes_update")return null;let s=n.availableModes;if(!Array.isArray(s))return[];let r=[];for(let i of s){if(!i||typeof i!="object")continue;let o=i;if(typeof o.id!="string"||o.id.length===0)continue;let a={id:o.id};typeof o.name=="string"&&(a.name=o.name),typeof o.description=="string"&&(a.description=o.description),r.push(a)}return r}function yb(t,e){let s=(e??{}).update??{};if(s.sessionUpdate!=="agent_message_chunk")return;let r=s.content??{};typeof r.text=="string"&&t.chunks.push(r.text)}function wb(t){let n=(t??{}).update??{};if(n.sessionUpdate!=="available_commands_update")return null;let s=n.availableCommands??n.commands;if(!Array.isArray(s))return[];let r=[];for(let i of s){if(!i||typeof i!="object")continue;let o=i;if(typeof o.name!="string"||o.name.length===0)continue;let a={name:o.name};typeof o.description=="string"&&(a.description=o.description),r.push(a)}return r}function bb(t,e){if(t!=="session/update"||!e||typeof e!="object")return e;let n=e;return!n.update||typeof n.update!="object"||Array.isArray(n.update)||typeof n.update.messageId=="string"?e:{...e,update:{...n.update,messageId:_r()}}}function hc(t,e){for(let n=0;n<t.length;n++){let s=t[n];if(!s||s.method!=="session/update")continue;if(s.params?.update?.messageId===e)return n}return-1}function vb(t){if(!t||typeof t!="object")return;let e=t.toolCall;if(!e||typeof e!="object")return;let n=e.toolCallId;return typeof n=="string"?n:void 0}function Ib(t){let e=Sb(t.result),n={sessionUpdate:"permission_resolved"};return t.toolCallId!==void 0&&(n.toolCallId=t.toolCallId),e&&(n.outcome=e,e.kind==="selected"&&typeof e.optionId=="string"&&(n.chosenOptionId=e.optionId)),n.resolvedBy=kb(t.resolver),n}function Sb(t){if(!t||typeof t!="object")return;let e=t.outcome;if(!e||typeof e!="object")return;let n=e.kind;if(typeof n!="string")return;let s={kind:n},r=e.optionId;typeof r=="string"&&(s.optionId=r);let i=e.reason;return typeof i=="string"&&(s.reason=i),s}function kb(t){let e={clientId:t.clientId};return t.clientInfo?.name&&(e.name=t.clientInfo.name),t.clientInfo?.version&&(e.version=t.clientInfo.version),e}function $r(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&typeof e.text=="string"?e.text:"").join(""):""}function pc(t){return t==="session/prompt"?{stopReason:"stopped"}:{}}function Ef(t){let e=t.name&&t.name!==t.id?`${t.id} (${t.name}) \u2014 \u25B6 ${t.currentValue}`:`${t.id} \u2014 \u25B6 ${t.currentValue}`;if(t.options.length===0)return e;let n=Math.max(...t.options.map(r=>r.value.length)),s=t.options.map(r=>{let i=r.value===t.currentValue?"\u25B6":"\xB7",o=r.name&&r.name!==r.value,a=o?r.value.padEnd(n):r.value;return o?` ${i} ${a} ${r.name}`:` ${i} ${a}`});return`${e}
11
+ `))if(r.trim())try{let i=JSON.parse(r);i&&typeof i.messageId=="string"&&Array.isArray(i.prompt)&&typeof i.enqueuedAt=="number"&&s.push(i)}catch{}return s}async function Rf(t){let e=M.queueFile(t);await pn.unlink(e).catch(()=>{})}var uc=J(()=>{"use strict";ge()});import{customAlphabet as Pf}from"nanoid";import*as $f from"fs/promises";function _r(){return`m_${_f()}`}function ze(t){return t.startsWith(Ht)?t.slice(Ht.length):t}function xt(t,e){return t.code=e,t}function fb(t,e){if(t!=="session/update")return!1;let s=(e??{}).update?.sessionUpdate;return typeof s=="string"&&ub.has(s)}function pb(t,e){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]?.name!==e[n]?.name||t[n]?.description!==e[n]?.description)return!1;return!0}function hb(t,e){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]?.id!==e[n]?.id||t[n]?.name!==e[n]?.name||t[n]?.description!==e[n]?.description)return!1;return!0}function mb(t,e){if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]?.modelId!==e[n]?.modelId||t[n]?.name!==e[n]?.name||t[n]?.description!==e[n]?.description)return!1;return!0}function Or(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!n||typeof n!="object"||Array.isArray(n))continue;let s=n,r=typeof s.modelId=="string"&&s.modelId.trim()||typeof s.value=="string"&&s.value.trim()||typeof s.id=="string"&&s.id.trim()||void 0;if(!r)continue;let i={modelId:r};typeof s.name=="string"&&s.name.length>0&&(i.name=s.name),typeof s.description=="string"&&s.description.length>0&&(i.description=s.description),e.push(i)}return e}function Oi(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!n||typeof n!="object"||Array.isArray(n))continue;let s=n,r=typeof s.value=="string"&&s.value.trim()||typeof s.id=="string"&&s.id.trim()||void 0;if(!r)continue;let i={id:r};typeof s.name=="string"&&s.name.length>0&&(i.name=s.name),typeof s.description=="string"&&s.description.length>0&&(i.description=s.description),e.push(i)}return e}function gb(t){let n=(t??{}).update??{};if(n.sessionUpdate!=="available_modes_update")return null;let s=n.availableModes;if(!Array.isArray(s))return[];let r=[];for(let i of s){if(!i||typeof i!="object")continue;let o=i;if(typeof o.id!="string"||o.id.length===0)continue;let a={id:o.id};typeof o.name=="string"&&(a.name=o.name),typeof o.description=="string"&&(a.description=o.description),r.push(a)}return r}function yb(t,e){let s=(e??{}).update??{};if(s.sessionUpdate!=="agent_message_chunk")return;let r=s.content??{};typeof r.text=="string"&&t.chunks.push(r.text)}function wb(t){let n=(t??{}).update??{};if(n.sessionUpdate!=="available_commands_update")return null;let s=n.availableCommands??n.commands;if(!Array.isArray(s))return[];let r=[];for(let i of s){if(!i||typeof i!="object")continue;let o=i;if(typeof o.name!="string"||o.name.length===0)continue;let a={name:o.name};typeof o.description=="string"&&(a.description=o.description),r.push(a)}return r}function bb(t,e){if(t!=="session/update"||!e||typeof e!="object")return e;let n=e;return!n.update||typeof n.update!="object"||Array.isArray(n.update)||typeof n.update.messageId=="string"?e:{...e,update:{...n.update,messageId:_r()}}}function hc(t,e){for(let n=0;n<t.length;n++){let s=t[n];if(!s||s.method!=="session/update")continue;if(s.params?.update?.messageId===e)return n}return-1}function vb(t){if(!t||typeof t!="object")return;let e=t.toolCall;if(!e||typeof e!="object")return;let n=e.toolCallId;return typeof n=="string"?n:void 0}function Ib(t){let e=Sb(t.result),n={sessionUpdate:"permission_resolved"};return t.toolCallId!==void 0&&(n.toolCallId=t.toolCallId),e&&(n.outcome=e,e.kind==="selected"&&typeof e.optionId=="string"&&(n.chosenOptionId=e.optionId)),n.resolvedBy=kb(t.resolver),n}function Sb(t){if(!t||typeof t!="object")return;let e=t.outcome;if(!e||typeof e!="object")return;let n=e.kind;if(typeof n!="string")return;let s={kind:n},r=e.optionId;typeof r=="string"&&(s.optionId=r);let i=e.reason;return typeof i=="string"&&(s.reason=i),s}function kb(t){let e={clientId:t.clientId};return t.clientInfo?.name&&(e.name=t.clientInfo.name),t.clientInfo?.version&&(e.version=t.clientInfo.version),e}function $r(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&typeof e.text=="string"?e.text:"").join(""):""}function pc(t){return t==="session/prompt"?{stopReason:"stopped"}:{}}function Ef(t){let e=t.name&&t.name!==t.id?`${t.id} (${t.name}) \u2014 \u25B6 ${t.currentValue}`:`${t.id} \u2014 \u25B6 ${t.currentValue}`;if(t.options.length===0)return e;let n=Math.max(...t.options.map(r=>r.value.length)),s=t.options.map(r=>{let i=r.value===t.currentValue?"\u25B6":"\xB7",o=r.name&&r.name!==r.value,a=o?r.value.padEnd(n):r.value;return o?` ${i} ${a} ${r.name}`:` ${i} ${a}`});return`${e}
12
12
  ${s.join(`
13
- `)}`}function mc(t,e){for(let n of t.split(/\r?\n/)){let s=n.trim();if(s)return s.length>e?`${s.slice(0,e)}\u2026`:s}}var Mf,_f,Tf,Ht,cb,fc,lb,Fr,ub,hn=q(()=>{"use strict";If();Sf();ea();Af();uc();yt();Mf="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",_f=Pf(Mf,16),Tf=Pf(Mf,16),Ht="hydra_session_";cb=1e3,fc=300*1e3,lb=64,Fr=class t{sessionId;cwd;agentId;agent;upstreamSessionId;agentMeta;agentCapabilities;agentArgs;parentSessionId;forkedFromSessionId;forkedFromMessageId;originatingClient;_interactive;get interactive(){return this._interactive}_priority;get priority(){return this._priority}title;currentModel;currentMode;_currentUsage;updatedAt;createdAt;clients=new Map;historyStore;promptQueue=[];currentEntry;promptInFlight=!1;queueWriteChain=Promise.resolve();closed=!1;closing=!1;closeInFlight;closeHandlers=[];titleHandlers=[];scheduleSynopsisHook;broadcastHandlers=[];lastCancelAt=0;static CANCEL_ERROR_WINDOW_MS=2e3;forceCancelling=!1;_firstPromptSeeded=!1;get firstPromptSeeded(){return this._firstPromptSeeded}promptStartedAt;appendCount=0;historyMaxEntries;compactEvery;inFlightPermissions=new Set;internalPromptCapture;idleTimeoutMs;idleTimer;idleEventTimer;idleEventTimeoutMs;lastRecordedAt;spawnReplacementAgent;forwardedEnv;listSessions;logger;transformChain;extensionCommands;extensionCommandsUnsub;pendingClaims=new Map;agentChangeHandlers=[];agentAdvertisedCommands=[];agentAdvertisedModes=[];agentAdvertisedModels=[];agentAdvertisedConfigOptions=[];agentCommandsHandlers=[];agentModesHandlers=[];agentModelsHandlers=[];availableAgentsFn;modelHandlers=[];modeHandlers=[];interactiveHandlers=[];priorityHandlers=[];usageHandlers=[];cumulativeCost=0;get currentUsage(){if(!this._currentUsage&&!this.cumulativeCost)return;let e=this._currentUsage??{},n=this.cumulativeCost+(e.costAmount??0);return{...e,costAmount:n||void 0,cumulativeCost:void 0}}amendInProgress;inFlightExtensionDispatches=new Map;recentlyTerminal=new Map;streamBuffer;streamFilePath;constructor(e){this.sessionId=e.sessionId??`${Ht}${_f()}`,this.cwd=e.cwd,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.originatingClient=e.originatingClient,this.title=e.title,this.scheduleSynopsisHook=e.scheduleSynopsis,this.currentModel=e.currentModel,this.currentMode=e.currentMode,this._currentUsage=e.currentUsage,this.cumulativeCost=e.currentUsage?.cumulativeCost??0,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]),this.idleTimeoutMs=e.idleTimeoutMs??0,this.idleEventTimeoutMs=e.idleEventTimeoutMs??3e4,this.spawnReplacementAgent=e.spawnReplacementAgent,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._interactive=e.interactive,this._priority=e.priority,this.historyStore=e.historyStore,this.historyMaxEntries=e.historyMaxEntries??cb,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.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:"available_modes_update",availableModes:this.agentAdvertisedModes}})}broadcastAvailableModels(){let e={sessionUpdate:"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){e.connection.onNotification("session/update",n=>{if(this.internalPromptCapture){yb(this.internalPromptCapture,n);return}this.runResponseChain(n)}),e.connection.onRequest("session/request_permission",async n=>this.handlePermissionRequest(n)),typeof e.connection.onOrphanError=="function"&&e.connection.onOrphanError(n=>{this.handleOrphanError(n)}),e.onExit(()=>{this.agent===e&&this.markClosed({deleteRecord:!1})})}handleOrphanError(e){let n=Date.now()-this.lastCancelAt;if(this.lastCancelAt===0||n>t.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,n=new Set,s=0){let r=e,i=this.injectCumulativeCost(e);for(let d=s;d<this.transformChain.length;d++){let c=this.transformChain[d];if(n.has(c.name)||!c.intercepts.has("response:session/update"))continue;let l=`t_${Tf()}`,f;try{f=await c.connection.request("hydra-acp/transformer/message",{token:l,phase:"response",method:"session/update",direction:"agent\u2192client",sessionId:this.sessionId,envelope:i})}catch(p){this.logger?.warn(`transformer ${c.name} error on response:session/update: ${p.message}`);continue}let u=f?.action??"continue";if(u==="stop")return;if(u==="processing"){let p=d,m=i,g=new Set(n);await new Promise(y=>{let v=setTimeout(()=>{this.pendingClaims.delete(l)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:l,transformerName:c.name}),this.runResponseChain(m,new Set([...g,c.name]),p+1).then(()=>y()).catch(()=>y()))},fc);typeof v.unref=="function"&&v.unref(),this.pendingClaims.set(l,{resolve:()=>y(),timer:v,transformerName:c.name,method:"session/update",envelope:m,chainIdx:p,originatedBy:g,side:"response"})});return}n.add(c.name)}let o=wb(i);if(o!==null){this.setAgentAdvertisedCommands(o);return}let a=gb(i);if(a!==null){this.setAgentAdvertisedModes(a);return}if(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(r)){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 n=[];for(let s of this.clients.values()){if(e&&s.clientId===e)continue;let r={clientId:s.clientId};s.clientInfo?.name&&(r.name=s.clientInfo.name),s.clientInfo?.version&&(r.version=s.clientInfo.version),n.push(r)}return n}get turnStartedAt(){return this.promptStartedAt}get awaitingInput(){return this.inFlightPermissions.size>0}async getHistorySnapshot(e="inline"){return this.historyStore?this.historyStore.load(this.sessionId,{tools:e}).catch(()=>[]):[]}onBroadcast(e){return this.broadcastHandlers.push(e),()=>{let n=this.broadcastHandlers.indexOf(e);n>=0&&this.broadcastHandlers.splice(n,1)}}attach(e,n,s={}){if(this.closed)throw xt(new Error("session is closed"),D.SessionNotFound);if(this.clients.has(e.clientId))throw xt(new Error(`client ${e.clientId} is already attached`),D.AlreadyAttached);return this.clients.set(e.clientId,e),this.updatedAt=Date.now(),n==="none"?Promise.resolve({entries:[],appliedPolicy:n}):n==="pending_only"?Promise.resolve({entries:this.buildStateSnapshotReplay(),appliedPolicy:n}):this.loadReplay(n,s)}async loadReplay(e,n){let s=o=>n.raw?o:xf(o),r=await this.getHistorySnapshot(n.toolContent??"inline"),i=this.buildStateSnapshotReplay();if(e==="after_message"){let o=n.afterMessageId?hc(r,n.afterMessageId):-1;return o<0?{entries:[...i,...s(r)],appliedPolicy:"full"}:{entries:[...i,...s(r.slice(o+1))],appliedPolicy:"after_message"}}return{entries:[...i,...s(r)],appliedPolicy:"full"}}buildStateSnapshotReplay(){let e=[],n=this.sessionId,s=Date.now();if(this.title!==void 0&&this.title.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"session_info_update",title:this.title}},recordedAt:s}),this.currentModel!==void 0&&this.currentModel.length>0||this.agentAdvertisedModels.length>0){let i={sessionUpdate:"current_model_update"};this.currentModel!==void 0&&this.currentModel.length>0&&(i.currentModel=this.currentModel),this.agentAdvertisedModels.length>0&&(i.availableModels=[...this.agentAdvertisedModels]),e.push({method:"session/update",params:{sessionId:n,update:i},recordedAt:s})}this.currentMode!==void 0&&this.currentMode.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"current_mode_update",currentModeId:this.currentMode}},recordedAt:s});let r=this.mergedAvailableCommands();if(r.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"available_commands_update",availableCommands:r}},recordedAt:s}),this.agentAdvertisedModes.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"available_modes_update",availableModes:[...this.agentAdvertisedModes]}},recordedAt:s}),this.currentUsage!==void 0){let i=this.currentUsage,o={sessionUpdate:"usage_update"};if(typeof i.used=="number"&&(o.used=i.used),typeof i.size=="number"&&(o.size=i.size),typeof i.costAmount=="number"||typeof i.costCurrency=="string"){let a={};typeof i.costAmount=="number"&&(a.amount=i.costAmount),typeof i.costCurrency=="string"&&(a.currency=i.costCurrency),o.cost=a}Object.keys(o).length>1&&e.push({method:"session/update",params:{sessionId:n,update:o},recordedAt:s})}return e}replayPendingPermissions(e){for(let n of this.inFlightPermissions)n.addClient(e)}detach(e){let n=this.clients.get(e);n&&(this.clients.delete(e),this.updatedAt=Date.now(),this.broadcastClientDisconnected(n))}broadcastClientDisconnected(e){let n={clientId:e.clientId};e.clientInfo?.name&&(n.name=e.clientInfo.name),e.clientInfo?.version&&(n.version=e.clientInfo.version);let s={sessionUpdate:"client_disconnected",client:n,timestamp:new Date().toISOString()};for(let r of this.clients.values())r.connection.notify("session/update",{sessionId:this.sessionId,update:s}).catch(()=>{})}async prompt(e,n){let s=this.clients.get(e);if(!s)throw xt(new Error("client not attached"),D.SessionNotFound);if(this.closing)throw xt(new Error("session is closing; new prompts cannot be accepted"),D.SessionClosing);let r=_r();if(this.maybeSeedTitleFromPrompt(n),this._firstPromptSeeded=!0,!(Mt((n??{})._meta).ancillary===!0)&&this._interactive!==!0){this._interactive=!0;for(let o of this.interactiveHandlers)try{o(!0)}catch{}}return this.enqueueUserPrompt(s,n,r)}broadcastPromptReceived(e){let n={clientId:e.originator.clientId};e.originator.name&&(n.name=e.originator.name),e.originator.version&&(n.version=e.originator.version),this.promptStartedAt=Date.now(),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"prompt_received",messageId:e.messageId,prompt:e.prompt,sentBy:n}},e.clientId);let s=$r(e.prompt);s.length>0&&this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"user_message_chunk",content:{type:"text",text:s},_meta:{"hydra-acp":{compatFor:"prompt_received"}}}},e.clientId)}broadcastTurnComplete(e,n,s,r){let i=n&&typeof n=="object"&&"stopReason"in n&&typeof n.stopReason=="string"?n.stopReason:void 0,o={sessionUpdate:"turn_complete",messageId:_r()};i!==void 0&&(o.stopReason=i);let a=this.amendInProgress;a&&s!==void 0&&a.cancelledMessageId===s&&(o._meta={"hydra-acp":{amended:{cancelledMessageId:a.cancelledMessageId,newMessageId:a.newMessageId}}}),this.promptStartedAt=void 0,s!==void 0&&i!==void 0&&this.recordTerminal(s,i),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:o},r?void 0:e),a&&s!==void 0&&a.cancelledMessageId===s&&this.broadcastPromptAmended(a)}recordTerminal(e,n){for(this.recentlyTerminal.set(e,{stopReason:n,terminatedAt:Date.now()});this.recentlyTerminal.size>lb;){let s=this.recentlyTerminal.keys().next().value;if(s===void 0)break;this.recentlyTerminal.delete(s)}}broadcastPromptAmended(e){let n=this.findUserEntry(e.newMessageId);if(!n)return;let s={sessionId:this.sessionId,cancelledMessageId:e.cancelledMessageId,newMessageId:e.newMessageId,prompt:n.prompt,originator:n.originator,amendedAt:Date.now()};this.broadcastQueueNotification("hydra-acp/prompt/amended",s)}findUserEntry(e){if(this.currentEntry?.messageId===e&&this.currentEntry.kind==="user")return this.currentEntry;let n=this.promptQueue.find(s=>s.messageId===e&&s.kind==="user");return n?.kind==="user"?n:void 0}visibleQueueDepth(){let e=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled?1:0;for(let n of this.promptQueue)n.kind==="user"&&!n.cancelled&&(e+=1);return e}broadcastQueueAdded(e,n){let s=this.visibleQueueDepth(),r=n?.position??Math.max(0,s-1),i={sessionId:this.sessionId,messageId:e.messageId,originator:e.originator,prompt:e.prompt,position:r,queueDepth:s,enqueuedAt:e.enqueuedAt};n?.amending!==void 0&&(i._meta={"hydra-acp":{amending:n.amending}}),this.broadcastQueueNotification("hydra-acp/prompt_queue/added",i)}broadcastQueueUpdated(e,n){this.broadcastQueueNotification("hydra-acp/prompt_queue/updated",{sessionId:this.sessionId,messageId:e,prompt:n})}broadcastQueueRemoved(e,n){this.broadcastQueueNotification("hydra-acp/prompt_queue/removed",{sessionId:this.sessionId,messageId:e,reason:n})}broadcastQueueNotification(e,n){for(let s of this.clients.values())s.connection.notify(e,n).catch(()=>{})}queueSnapshot(){let e=[],n=0;this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled&&e.push({messageId:this.currentEntry.messageId,originator:this.currentEntry.originator,prompt:this.currentEntry.prompt,position:n++,enqueuedAt:this.currentEntry.enqueuedAt});for(let s of this.promptQueue)s.kind!=="user"||s.cancelled||e.push({messageId:s.messageId,originator:s.originator,prompt:s.prompt,position:n++,enqueuedAt:s.enqueuedAt});return e}async flushPersistWrites(){await this.queueWriteChain.catch(()=>{})}replayPersistedQueue(e){for(let n of e){let s={clientId:`hydra-resurrected_${n.messageId}`};n.originator.clientInfo.name!==void 0&&(s.name=n.originator.clientInfo.name),n.originator.clientInfo.version!==void 0&&(s.version=n.originator.clientInfo.version);let r={kind:"user",messageId:n.messageId,originator:s,clientId:s.clientId,prompt:n.prompt,enqueuedAt:n.enqueuedAt,cancelled:!1,resolve:()=>{},reject:()=>{}};this.promptQueue.push(r),this.broadcastQueueAdded(r)}this.drainQueue()}cancelQueuedPrompt(e){if(this.currentEntry?.messageId===e)return{cancelled:!1,reason:"already_running"};let n=this.promptQueue.findIndex(r=>r.messageId===e);if(n<0)return{cancelled:!1,reason:"not_found"};let s=this.promptQueue[n];return s.cancelled=!0,this.promptQueue.splice(n,1),s.kind==="user"&&(this.broadcastQueueRemoved(e,"cancelled"),this.persistRewrite()),this.amendInProgress?.newMessageId===e&&(this.amendInProgress=void 0),s.resolve({stopReason:"cancelled"}),{cancelled:!0,reason:"ok"}}updateQueuedPrompt(e,n){if(this.currentEntry?.messageId===e)return{updated:!1,reason:"already_running"};let s=this.promptQueue.find(r=>r.messageId===e);return!s||s.kind!=="user"?{updated:!1,reason:"not_found"}:(s.prompt=n,this.broadcastQueueUpdated(e,n),this.persistRewrite(),{updated:!0,reason:"ok"})}amendPrompt(e,n){let s=this.clients.get(e);if(!s)throw xt(new Error("client not attached"),D.SessionNotFound);let{targetMessageId:r,prompt:i,replaceQueue:o,onTargetCompleted:a}=n;if(this.currentEntry?.messageId===r&&this.currentEntry.kind==="user"&&!this.currentEntry.cancelled&&this.amendInProgress===void 0)return this.amendOnHead(s,i,r,o);let d=this.promptQueue.find(l=>l.messageId===r&&l.kind==="user");if(d&&d.kind==="user"&&!d.cancelled)return d.prompt=i,this.broadcastQueueUpdated(r,i),this.persistRewrite(),{amended:!0,reason:"ok",messageId:r};let c=this.recentlyTerminal.get(r);return c?c.stopReason==="cancelled"?{amended:!1,reason:"target_cancelled"}:a==="send_anyway"?{amended:!1,reason:"target_completed",messageId:this.enqueueAmendmentAsFollowUp(s,i)}:{amended:!1,reason:"target_completed"}:{amended:!1,reason:"target_not_found"}}amendOnHead(e,n,s,r){let i=_r(),o={clientId:e.clientId};if(e.clientInfo?.name&&(o.name=e.clientInfo.name),e.clientInfo?.version&&(o.version=e.clientInfo.version),r){let d=[];for(let c of this.promptQueue){if(c.kind==="user"&&!c.cancelled){c.cancelled=!0,this.broadcastQueueRemoved(c.messageId,"cancelled"),c.resolve({stopReason:"cancelled"});continue}d.push(c)}this.promptQueue=d}let a={kind:"user",messageId:i,originator:o,clientId:e.clientId,prompt:n,enqueuedAt:Date.now(),cancelled:!1,wasAmend:!0,resolve:()=>{},reject:()=>{}};return this.promptQueue.unshift(a),this.persistRewrite(),this.broadcastQueueAdded(a,{amending:s,position:1}),this.amendInProgress={cancelledMessageId:s,newMessageId:i},this.cancelExtensionDispatch(s,"amended"),this.agent.connection.notify("session/cancel",{sessionId:this.upstreamSessionId}).catch(()=>{}),{amended:!0,reason:"ok",messageId:i}}enqueueAmendmentAsFollowUp(e,n){let s=_r(),r={clientId:e.clientId};e.clientInfo?.name&&(r.name=e.clientInfo.name),e.clientInfo?.version&&(r.version=e.clientInfo.version);let i={kind:"user",messageId:s,originator:r,clientId:e.clientId,prompt:n,enqueuedAt:Date.now(),cancelled:!1,resolve:()=>{},reject:()=>{}};return this.promptQueue.push(i),this.persistRewrite(),this.broadcastQueueAdded(i),this.drainQueue(),s}async cancel(e){if(!this.clients.get(e))throw xt(new Error("client not attached"),D.SessionNotFound);this.lastCancelAt=Date.now(),this.currentEntry?.kind==="user"&&this.currentEntry.messageId!==void 0&&this.cancelExtensionDispatch(this.currentEntry.messageId,"cancelled"),await this.forwardRequest("session/cancel",{sessionId:this.sessionId},new Set,0,"notification")}addTransformer(e){let n=this.transformChain.findIndex(s=>s.name===e.name);n>=0?this.transformChain[n]=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,n,s=new Set,r=0,i="request"){let o=this.rewriteForAgent(n);for(let a=r;a<this.transformChain.length;a++){let d=this.transformChain[a];if(s.has(d.name))continue;let c=`request:${e}`;if(!d.intercepts.has(c))continue;let l=`t_${Tf()}`,f;try{f=await d.connection.request("hydra-acp/transformer/message",{token:l,phase:"request",method:e,direction:"client\u2192agent",sessionId:this.sessionId,envelope:o})}catch(p){this.logger?.warn(`transformer ${d.name} error on ${c}: ${p.message}`);continue}let u=f?.action??"continue";if(u==="stop")return i==="notification"?void 0:f?.payload??pc(e);if(u==="processing"){let p=a,m=o,g=new Set(s);return new Promise(y=>{let v=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([...g,d.name]),p+1,i).then(y).catch(()=>y(i==="notification"?void 0:pc(e))))},fc);typeof v.unref=="function"&&v.unref(),this.pendingClaims.set(l,{resolve:y,timer:v,transformerName:d.name,method:e,envelope:m,chainIdx:p,originatedBy:g,side:"request",tailKind:i})})}s.add(d.name)}if(i==="notification"){await this.agent.connection.notify(e,o);return}return this.agent.connection.request(e,o)}dischargeClaim(e,n){let s=this.pendingClaims.get(e);return s?(clearTimeout(s.timer),this.pendingClaims.delete(e),s.resolve(n),!0):!1}keepAliveClaim(e,n){let s=this.pendingClaims.get(e);if(!s)return!1;clearTimeout(s.timer);let r=typeof n=="number"&&n>0?Math.min(n*1.5,1800*1e3):fc,i=setTimeout(()=>{if(this.pendingClaims.delete(e))if(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:e,transformerName:s.transformerName}),s.side==="response")this.runResponseChain(s.envelope,new Set([...s.originatedBy,s.transformerName]),s.chainIdx+1).then(()=>s.resolve(void 0)).catch(()=>s.resolve(void 0));else{let o=s.tailKind??"request";this.forwardRequest(s.method,s.envelope,new Set([...s.originatedBy,s.transformerName]),s.chainIdx+1,o).then(s.resolve).catch(()=>s.resolve(o==="notification"?void 0:pc(s.method)))}},r);return typeof i.unref=="function"&&i.unref(),s.timer=i,!0}async emitToChain(e,n,s){let r=this.transformChain.findIndex(a=>a.name===e),i=r>=0?r+1:0,o=new Set([e]);if(n==="session/update"){await this.runResponseChain(s,o,i);return}return this.forwardRequest(n,s,o,i)}rewriteForAgent(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let n=e;if(n.sessionId===this.sessionId)return{...n,sessionId:this.upstreamSessionId}}return e}async close(e={}){if(!this.closed)return this.closeInFlight?this.closeInFlight:(this.closing=!0,this.closeInFlight=this.doClose(e),this.closeInFlight)}async doClose(e){this.logger?.info(`session ${this.sessionId} closing deleteRecord=${e.deleteRecord??!1}`),this.cancelIdleTimer();for(let n of this.pendingClaims.values())clearTimeout(n.timer);this.pendingClaims.clear(),await this.agent.kill().catch(()=>{}),this.markClosed({deleteRecord:e.deleteRecord??!1})}onClose(e){return this.closeHandlers.push(e),()=>{let n=this.closeHandlers.indexOf(e);n>=0&&this.closeHandlers.splice(n,1)}}onTitleChange(e){this.titleHandlers.push(e)}retitle(e){return this.runTitleCommand(e)}retitleFromAgent(){return this.runTitleCommand("")}setTitle(e){let n=e.trim();if(!(!n||n===this.title)){this.title=n,this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",title:n,updatedAt:new Date().toISOString()}});for(let s of this.titleHandlers)try{s(n)}catch{}}}maybeSeedTitleFromPrompt(e){if(this.firstPromptSeeded)return;let s=$r((e??{}).prompt),r=mc(s,200);r&&(r.startsWith("/")||(this._firstPromptSeeded=!0,this.setTitle(r)))}maybeApplyAgentModel(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="current_model_update")return!1;let r=Or(s.availableModels);r.length>0&&this.setAgentAdvertisedModels(r);let i=typeof s.currentModel=="string"?s.currentModel:typeof s.model=="string"?s.model:void 0;if(i===void 0)return!0;let o=i.trim();if(!o||o===this.currentModel)return!0;this.logger?.info(`live current_model_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(o)}`),this.currentModel=o;for(let a of this.modelHandlers)try{a(o)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentConfigOption(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="config_option_update")return!1;let r=s.configOptions;if(!Array.isArray(r))return!0;for(let i of r){if(!i||typeof i!="object")continue;let o=i;if(o.id==="model"){let a=Or(o.options);a.length>0&&this.setAgentAdvertisedModels(a);let d=o.currentValue;if(typeof d=="string"){let c=d.trim();c&&c!==this.currentModel&&(this.logger?.info(`live config_option_update(model): sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(c)}`),this.applyModelChange(c))}}else if(o.id==="mode"){let a=Oi(o.options);a.length>0&&this.setAgentAdvertisedModes(a);let d=o.currentValue;if(typeof d=="string"){let c=d.trim();c&&c!==this.currentMode&&(this.logger?.info(`live config_option_update(mode): sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(c)}`),this.applyModeChange(c))}}else if(typeof o.id=="string"&&o.id.trim()){let a=o.id.trim(),d=Or(o.options);if(d.length>0){let c=Oi(o.options),l=c.length>0?c.map(y=>({value:y.id,name:y.name??y.id})):d.map(y=>({value:y.modelId,name:y.name??y.modelId})),f=o.name,u=typeof f=="string"&&f.trim()?f.trim():a,p=o.currentValue,m=typeof p=="string"&&p.trim()?p.trim():l[0]?.value??"",g=this.agentAdvertisedConfigOptions.findIndex(y=>y.id===a);if(g>=0){let y={...this.agentAdvertisedConfigOptions[g]};y.options=l,typeof p=="string"&&p.trim()&&(y.currentValue=p.trim()),this.agentAdvertisedConfigOptions[g]=y}else this.agentAdvertisedConfigOptions.push({id:a,name:u,category:"other",type:"select",currentValue:m,options:l})}}}return!0}maybeApplyAgentMode(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="current_mode_update")return!1;let r=typeof s.currentModeId=="string"?s.currentModeId:typeof s.currentMode=="string"?s.currentMode:typeof s.mode=="string"?s.mode:void 0;if(r===void 0)return!0;let i=r.trim();if(!i||i===this.currentMode)return!0;this.logger?.info(`current_mode_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(i)}`),this.currentMode=i;for(let o of this.modeHandlers)try{o(i)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentUsage(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="usage_update")return!1;let r={...this._currentUsage??{}},i=!1;if(typeof s.used=="number"&&r.used!==s.used&&(r.used=s.used,i=!0),typeof s.size=="number"&&r.size!==s.size&&(r.size=s.size,i=!0),s.cost&&typeof s.cost=="object"){let a=s.cost;typeof a.amount=="number"&&r.costAmount!==a.amount&&(r.costAmount=a.amount,i=!0),typeof a.currency=="string"&&r.costCurrency!==a.currency&&(r.costCurrency=a.currency,i=!0)}if(!i)return!0;this._currentUsage=r;let o=this.currentUsage??r;for(let a of this.usageHandlers)try{a(o)}catch{}return!0}accumulateAndResetCost(){let e=this._currentUsage?.costAmount;if(!e)return;this.cumulativeCost+=e;let n={...this._currentUsage??{},cumulativeCost:this.cumulativeCost,costAmount:void 0};this._currentUsage=n;for(let s of this.usageHandlers)try{s(n)}catch{}}injectCumulativeCost(e){if(!this.cumulativeCost||!e||typeof e!="object")return e;let n=e;if(!n.update||typeof n.update!="object")return e;let s=n.update;if(s.sessionUpdate!=="usage_update"||!s.cost||typeof s.cost!="object")return e;let r=s.cost;return typeof r.amount!="number"?e:{...n,update:{...s,cost:{...r,amount:this.cumulativeCost+r.amount}}}}get totalUsage(){return this.currentUsage}setAgentAdvertisedCommands(e){if(pb(this.agentAdvertisedCommands,e)){this.broadcastMergedCommands();return}this.agentAdvertisedCommands=e;for(let n of this.agentCommandsHandlers)try{n(e)}catch{}this.broadcastMergedCommands()}setAgentAdvertisedModes(e){if(hb(this.agentAdvertisedModes,e)){this.broadcastAvailableModes();return}this.agentAdvertisedModes=e;for(let n of this.agentModesHandlers)try{n(e)}catch{}this.broadcastAvailableModes()}setAgentAdvertisedModels(e){if(this.logger?.info(`setAgentAdvertisedModels: sessionId=${this.sessionId} currentModel=${JSON.stringify(this.currentModel)} newList=[${e.map(n=>n.modelId).join(",")}]`),mb(this.agentAdvertisedModels,e)){this.broadcastAvailableModels();return}this.agentAdvertisedModels=e;for(let n of this.agentModelsHandlers)try{n(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 n=e===void 0||e<=0?void 0:Math.floor(e);if(n!==this._priority){this._priority=n,this.updatedAt=Date.now();for(let s of this.priorityHandlers)try{s(n)}catch{}}}applyModelChange(e){let n=e.trim();if(!n)return;if(n!==this.currentModel){this.logger?.info(`applyModelChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(n)}`),this.currentModel=n;for(let r of this.modelHandlers)try{r(n)}catch{}}let s={sessionUpdate:"current_model_update",currentModel:n};this.agentAdvertisedModels.length>0&&(s.availableModels=[...this.agentAdvertisedModels]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:s}),this.broadcastConfigOptions()}applyModeChange(e){let n=e.trim();if(!n)return;if(n!==this.currentMode){this.logger?.info(`applyModeChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(n)}`),this.currentMode=n;for(let r of this.modeHandlers)try{r(n)}catch{}}let s={sessionUpdate:"current_mode_update",currentModeId:n};this.agentAdvertisedModes.length>0&&(s.availableModes=[...this.agentAdvertisedModes]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:s}),this.broadcastConfigOptions()}buildConfigOptions(){let e=[];if(this.agentAdvertisedModels.length>0){let r=this.agentAdvertisedModels.map(o=>({value:o.modelId,name:o.name??o.modelId,...o.description!==void 0?{description:o.description}:{}})),i=this.currentModel&&r.some(o=>o.value===this.currentModel)?this.currentModel:r[0].value;e.push({id:"model",name:"Model",category:"model",type:"select",currentValue:i,options:r})}if(this.agentAdvertisedModes.length>0){let r=this.agentAdvertisedModes.map(o=>({value:o.id,name:o.name??o.id,...o.description!==void 0?{description:o.description}:{}})),i=this.currentMode&&r.some(o=>o.value===this.currentMode)?this.currentMode:r[0].value;e.push({id:"mode",name:"Session Mode",category:"mode",type:"select",currentValue:i,options:r})}let s=(this.availableAgentsFn?.()??[]).map(r=>({value:r.id,name:r.name??r.id,...r.description!==void 0?{description:r.description}:{}}));return s.some(r=>r.value===this.agentId)||s.unshift({value:this.agentId,name:this.agentId}),e.push({id:"agent",name:"Agent",category:"_hydra_agent",type:"select",currentValue:this.agentId,options:s}),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 n=e;if(!n.update||typeof n.update!="object")return e;let s=n.update,r=Array.isArray(s.configOptions)?[...s.configOptions]:[];if(r.some(a=>a&&typeof a=="object"&&a.id==="agent"))return e;let o=this.buildConfigOptions().find(a=>a.id==="agent");return o?{...n,update:{...s,configOptions:[...r,o]}}:e}onUsageChange(e){this.usageHandlers.push(e)}mergedAvailableCommands(){let e=[{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"}];if(this.extensionCommands)for(let{name:n,command:s}of this.extensionCommands.list()){let r=s.verb?`hydra ${n} ${s.verb}`:`hydra ${n}`,o={name:s.argsHint?`${r} ${s.argsHint}`:r};if(s.description&&(o.description=s.description),e.push(o),n.startsWith("hydra-acp-")){let a=n.slice(10);if(a.length>0){let d=s.verb?`hydra ${a} ${s.verb}`:`hydra ${a}`,l={name:s.argsHint?`${d} ${s.argsHint}`:d};s.description&&(l.description=s.description),e.push(l)}}}return e.push(...this.agentAdvertisedCommands),e}agentOnlyAdvertisedCommands(){return[...this.agentAdvertisedCommands]}availableModes(){return[...this.agentAdvertisedModes]}availableModels(){return[...this.agentAdvertisedModels]}maybeApplyAgentSessionInfo(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="session_info_update"||typeof s.title!="string")return;let r=s.title.trim();if(!(!r||r===this.title)){this.title=r,this._firstPromptSeeded=!0;for(let i of this.titleHandlers)try{i(r)}catch{}}}async handleSlashCommand(e,n){let r=e.slice(6).trim().match(/^(\S+)(?:\s+([\s\S]*))?$/),i=r?.[1]??"",o=(r?.[2]??"").trim();if(i==="")return{stopReason:"end_turn"};let a=n!==void 0;if(Zo.some(f=>f.verb===i))switch(i){case"title":return a?this.runTitleCommandInline(o):this.runTitleCommand(o);case"agent":return a?this.runAgentCommandInline(o):this.runAgentCommand(o);case"config":return this.handleConfigCommand(`/config ${o}`);case"kill":return this.runKillCommand();case"restart":return a?this.runRestartCommandInline():this.runRestartCommand();default:{let f=new Error(`no dispatcher for /hydra verb ${i}`);throw f.code=D.InternalError,f}}if(this.extensionCommands?.has(i))return a?this.runExtensionCommandInline(i,o,n):this.runExtensionCommand(i,o);let d=`hydra-acp-${i}`;if(this.extensionCommands?.has(d))return a?this.runExtensionCommandInline(d,o,n):this.runExtensionCommand(d,o);let c=Zo.map(f=>f.verb);if(this.extensionCommands){let f=new Set;for(let{name:u}of this.extensionCommands.list())f.has(u)||(c.push(u),f.add(u))}let l=new Error(`unknown /hydra verb: ${i} (known: ${c.join(", ")})`);throw l.code=D.InvalidParams,l}runExtensionCommand(e,n){return this.enqueuePrompt(()=>this.runExtensionCommandInline(e,n,void 0))}async runExtensionCommandInline(e,n,s){let r=this.extensionCommands?.get(e);if(!r)return this.emitExtensionReply(`extension "${e}" is no longer connected`);let i=n.match(/^(\S+)(?:\s+([\s\S]*))?$/),o=i?.[1]??"",a=(i?.[2]??"").trim();if(!r.commands.some(m=>m.verb===o)){let m=r.commands.map(g=>g.verb).join(", ");return this.emitExtensionReply(`/hydra ${e}${o?` ${o}`:""}: unknown verb (known: ${m||"(none)"})`)}let d={sessionId:this.sessionId,verb:o,args:a};s!==void 0&&(d.messageId=s);let c=()=>{},l=new Promise(m=>{c=m});s!==void 0&&this.inFlightExtensionDispatches.set(s,{extensionName:e,connection:r.connection,cancel:m=>c({stopReason:"cancelled",reason:m})});let f,u=!1;try{let m=r.connection.request("hydra-acp/commands/invoke",d),g=await Promise.race([m,l]);if(g&&typeof g=="object"&&g.stopReason==="cancelled"&&"reason"in g)return u=!0,this.logger?.info(`extension ${e} ${o} cancelled (cancelExtensionDispatch); abandoning in-flight commands/invoke`),{stopReason:"cancelled"};f=g}catch(m){return this.emitExtensionReply(`${e} ${o}: ${m.message}`)}finally{s!==void 0&&!u&&this.inFlightExtensionDispatches.delete(s)}let p=f&&typeof f=="object"&&typeof f.text=="string"?f.text:"";return p.length>0?this.emitExtensionReply(p):{stopReason:"end_turn"}}cancelExtensionDispatch(e,n){let s=this.inFlightExtensionDispatches.get(e);if(!s)return!1;this.inFlightExtensionDispatches.delete(e);try{s.connection.notify("hydra-acp/commands/cancel",{sessionId:this.sessionId,messageId:e,reason:n})}catch(r){this.logger?.warn(`notify commands/cancel to ${s.extensionName} failed: ${r.message}`)}return s.cancel(n),!0}emitExtensionReply(e){return this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
13
+ `)}`}function mc(t,e){for(let n of t.split(/\r?\n/)){let s=n.trim();if(s)return s.length>e?`${s.slice(0,e)}\u2026`:s}}var Mf,_f,Tf,Ht,cb,fc,lb,Fr,ub,hn=J(()=>{"use strict";If();Sf();ea();Af();uc();yt();Mf="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",_f=Pf(Mf,16),Tf=Pf(Mf,16),Ht="hydra_session_";cb=1e3,fc=300*1e3,lb=64,Fr=class t{sessionId;cwd;agentId;agent;upstreamSessionId;agentMeta;agentCapabilities;agentArgs;parentSessionId;forkedFromSessionId;forkedFromMessageId;originatingClient;_interactive;get interactive(){return this._interactive}_priority;get priority(){return this._priority}title;currentModel;currentMode;_currentUsage;updatedAt;createdAt;clients=new Map;historyStore;promptQueue=[];currentEntry;promptInFlight=!1;queueWriteChain=Promise.resolve();closed=!1;closing=!1;closeInFlight;closeHandlers=[];titleHandlers=[];scheduleSynopsisHook;broadcastHandlers=[];lastCancelAt=0;static CANCEL_ERROR_WINDOW_MS=2e3;forceCancelling=!1;_firstPromptSeeded=!1;get firstPromptSeeded(){return this._firstPromptSeeded}promptStartedAt;appendCount=0;historyMaxEntries;compactEvery;inFlightPermissions=new Set;internalPromptCapture;idleTimeoutMs;idleTimer;idleEventTimer;idleEventTimeoutMs;lastRecordedAt;spawnReplacementAgent;forwardedEnv;listSessions;logger;transformChain;extensionCommands;extensionCommandsUnsub;pendingClaims=new Map;agentChangeHandlers=[];agentAdvertisedCommands=[];agentAdvertisedModes=[];agentAdvertisedModels=[];agentAdvertisedConfigOptions=[];agentCommandsHandlers=[];agentModesHandlers=[];agentModelsHandlers=[];availableAgentsFn;modelHandlers=[];modeHandlers=[];interactiveHandlers=[];priorityHandlers=[];usageHandlers=[];cumulativeCost=0;get currentUsage(){if(!this._currentUsage&&!this.cumulativeCost)return;let e=this._currentUsage??{},n=this.cumulativeCost+(e.costAmount??0);return{...e,costAmount:n||void 0,cumulativeCost:void 0}}amendInProgress;inFlightExtensionDispatches=new Map;recentlyTerminal=new Map;streamBuffer;streamFilePath;constructor(e){this.sessionId=e.sessionId??`${Ht}${_f()}`,this.cwd=e.cwd,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.originatingClient=e.originatingClient,this.title=e.title,this.scheduleSynopsisHook=e.scheduleSynopsis,this.currentModel=e.currentModel,this.currentMode=e.currentMode,this._currentUsage=e.currentUsage,this.cumulativeCost=e.currentUsage?.cumulativeCost??0,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]),this.idleTimeoutMs=e.idleTimeoutMs??0,this.idleEventTimeoutMs=e.idleEventTimeoutMs??3e4,this.spawnReplacementAgent=e.spawnReplacementAgent,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._interactive=e.interactive,this._priority=e.priority,this.historyStore=e.historyStore,this.historyMaxEntries=e.historyMaxEntries??cb,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.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:"available_modes_update",availableModes:this.agentAdvertisedModes}})}broadcastAvailableModels(){let e={sessionUpdate:"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){e.connection.onNotification("session/update",n=>{if(this.internalPromptCapture){yb(this.internalPromptCapture,n);return}this.runResponseChain(n)}),e.connection.onRequest("session/request_permission",async n=>this.handlePermissionRequest(n)),typeof e.connection.onOrphanError=="function"&&e.connection.onOrphanError(n=>{this.handleOrphanError(n)}),e.onExit(()=>{this.agent===e&&this.markClosed({deleteRecord:!1})})}handleOrphanError(e){let n=Date.now()-this.lastCancelAt;if(this.lastCancelAt===0||n>t.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,n=new Set,s=0){let r=e,i=this.injectCumulativeCost(e);for(let d=s;d<this.transformChain.length;d++){let c=this.transformChain[d];if(n.has(c.name)||!c.intercepts.has("response:session/update"))continue;let l=`t_${Tf()}`,f;try{f=await c.connection.request("hydra-acp/transformer/message",{token:l,phase:"response",method:"session/update",direction:"agent\u2192client",sessionId:this.sessionId,envelope:i})}catch(p){this.logger?.warn(`transformer ${c.name} error on response:session/update: ${p.message}`);continue}let u=f?.action??"continue";if(u==="stop")return;if(u==="processing"){let p=d,m=i,g=new Set(n);await new Promise(y=>{let v=setTimeout(()=>{this.pendingClaims.delete(l)&&(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:l,transformerName:c.name}),this.runResponseChain(m,new Set([...g,c.name]),p+1).then(()=>y()).catch(()=>y()))},fc);typeof v.unref=="function"&&v.unref(),this.pendingClaims.set(l,{resolve:()=>y(),timer:v,transformerName:c.name,method:"session/update",envelope:m,chainIdx:p,originatedBy:g,side:"response"})});return}n.add(c.name)}let o=wb(i);if(o!==null){this.setAgentAdvertisedCommands(o);return}let a=gb(i);if(a!==null){this.setAgentAdvertisedModes(a);return}if(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(r)){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 n=[];for(let s of this.clients.values()){if(e&&s.clientId===e)continue;let r={clientId:s.clientId};s.clientInfo?.name&&(r.name=s.clientInfo.name),s.clientInfo?.version&&(r.version=s.clientInfo.version),n.push(r)}return n}get turnStartedAt(){return this.promptStartedAt}get awaitingInput(){return this.inFlightPermissions.size>0}async getHistorySnapshot(e="inline"){return this.historyStore?this.historyStore.load(this.sessionId,{tools:e}).catch(()=>[]):[]}onBroadcast(e){return this.broadcastHandlers.push(e),()=>{let n=this.broadcastHandlers.indexOf(e);n>=0&&this.broadcastHandlers.splice(n,1)}}attach(e,n,s={}){if(this.closed)throw xt(new Error("session is closed"),D.SessionNotFound);if(this.clients.has(e.clientId))throw xt(new Error(`client ${e.clientId} is already attached`),D.AlreadyAttached);return this.clients.set(e.clientId,e),this.updatedAt=Date.now(),n==="none"?Promise.resolve({entries:[],appliedPolicy:n}):n==="pending_only"?Promise.resolve({entries:this.buildStateSnapshotReplay(),appliedPolicy:n}):this.loadReplay(n,s)}async loadReplay(e,n){let s=o=>n.raw?o:xf(o),r=await this.getHistorySnapshot(n.toolContent??"inline"),i=this.buildStateSnapshotReplay();if(e==="after_message"){let o=n.afterMessageId?hc(r,n.afterMessageId):-1;return o<0?{entries:[...i,...s(r)],appliedPolicy:"full"}:{entries:[...i,...s(r.slice(o+1))],appliedPolicy:"after_message"}}return{entries:[...i,...s(r)],appliedPolicy:"full"}}buildStateSnapshotReplay(){let e=[],n=this.sessionId,s=Date.now();if(this.title!==void 0&&this.title.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"session_info_update",title:this.title}},recordedAt:s}),this.currentModel!==void 0&&this.currentModel.length>0||this.agentAdvertisedModels.length>0){let i={sessionUpdate:"current_model_update"};this.currentModel!==void 0&&this.currentModel.length>0&&(i.currentModel=this.currentModel),this.agentAdvertisedModels.length>0&&(i.availableModels=[...this.agentAdvertisedModels]),e.push({method:"session/update",params:{sessionId:n,update:i},recordedAt:s})}this.currentMode!==void 0&&this.currentMode.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"current_mode_update",currentModeId:this.currentMode}},recordedAt:s});let r=this.mergedAvailableCommands();if(r.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"available_commands_update",availableCommands:r}},recordedAt:s}),this.agentAdvertisedModes.length>0&&e.push({method:"session/update",params:{sessionId:n,update:{sessionUpdate:"available_modes_update",availableModes:[...this.agentAdvertisedModes]}},recordedAt:s}),this.currentUsage!==void 0){let i=this.currentUsage,o={sessionUpdate:"usage_update"};if(typeof i.used=="number"&&(o.used=i.used),typeof i.size=="number"&&(o.size=i.size),typeof i.costAmount=="number"||typeof i.costCurrency=="string"){let a={};typeof i.costAmount=="number"&&(a.amount=i.costAmount),typeof i.costCurrency=="string"&&(a.currency=i.costCurrency),o.cost=a}Object.keys(o).length>1&&e.push({method:"session/update",params:{sessionId:n,update:o},recordedAt:s})}return e}replayPendingPermissions(e){for(let n of this.inFlightPermissions)n.addClient(e)}detach(e){let n=this.clients.get(e);n&&(this.clients.delete(e),this.updatedAt=Date.now(),this.broadcastClientDisconnected(n))}broadcastClientDisconnected(e){let n={clientId:e.clientId};e.clientInfo?.name&&(n.name=e.clientInfo.name),e.clientInfo?.version&&(n.version=e.clientInfo.version);let s={sessionUpdate:"client_disconnected",client:n,timestamp:new Date().toISOString()};for(let r of this.clients.values())r.connection.notify("session/update",{sessionId:this.sessionId,update:s}).catch(()=>{})}async prompt(e,n){let s=this.clients.get(e);if(!s)throw xt(new Error("client not attached"),D.SessionNotFound);if(this.closing)throw xt(new Error("session is closing; new prompts cannot be accepted"),D.SessionClosing);let r=_r();if(this.maybeSeedTitleFromPrompt(n),this._firstPromptSeeded=!0,!(Mt((n??{})._meta).ancillary===!0)&&this._interactive!==!0){this._interactive=!0;for(let o of this.interactiveHandlers)try{o(!0)}catch{}}return this.enqueueUserPrompt(s,n,r)}broadcastPromptReceived(e){let n={clientId:e.originator.clientId};e.originator.name&&(n.name=e.originator.name),e.originator.version&&(n.version=e.originator.version),this.promptStartedAt=Date.now(),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"prompt_received",messageId:e.messageId,prompt:e.prompt,sentBy:n}},e.clientId);let s=$r(e.prompt);s.length>0&&this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"user_message_chunk",content:{type:"text",text:s},_meta:{"hydra-acp":{compatFor:"prompt_received"}}}},e.clientId)}broadcastTurnComplete(e,n,s,r){let i=n&&typeof n=="object"&&"stopReason"in n&&typeof n.stopReason=="string"?n.stopReason:void 0,o={sessionUpdate:"turn_complete",messageId:_r()};i!==void 0&&(o.stopReason=i);let a=this.amendInProgress;a&&s!==void 0&&a.cancelledMessageId===s&&(o._meta={"hydra-acp":{amended:{cancelledMessageId:a.cancelledMessageId,newMessageId:a.newMessageId}}}),this.promptStartedAt=void 0,s!==void 0&&i!==void 0&&this.recordTerminal(s,i),this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:o},r?void 0:e),a&&s!==void 0&&a.cancelledMessageId===s&&this.broadcastPromptAmended(a)}recordTerminal(e,n){for(this.recentlyTerminal.set(e,{stopReason:n,terminatedAt:Date.now()});this.recentlyTerminal.size>lb;){let s=this.recentlyTerminal.keys().next().value;if(s===void 0)break;this.recentlyTerminal.delete(s)}}broadcastPromptAmended(e){let n=this.findUserEntry(e.newMessageId);if(!n)return;let s={sessionId:this.sessionId,cancelledMessageId:e.cancelledMessageId,newMessageId:e.newMessageId,prompt:n.prompt,originator:n.originator,amendedAt:Date.now()};this.broadcastQueueNotification("hydra-acp/prompt/amended",s)}findUserEntry(e){if(this.currentEntry?.messageId===e&&this.currentEntry.kind==="user")return this.currentEntry;let n=this.promptQueue.find(s=>s.messageId===e&&s.kind==="user");return n?.kind==="user"?n:void 0}visibleQueueDepth(){let e=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled?1:0;for(let n of this.promptQueue)n.kind==="user"&&!n.cancelled&&(e+=1);return e}broadcastQueueAdded(e,n){let s=this.visibleQueueDepth(),r=n?.position??Math.max(0,s-1),i={sessionId:this.sessionId,messageId:e.messageId,originator:e.originator,prompt:e.prompt,position:r,queueDepth:s,enqueuedAt:e.enqueuedAt};n?.amending!==void 0&&(i._meta={"hydra-acp":{amending:n.amending}}),this.broadcastQueueNotification("hydra-acp/prompt_queue/added",i)}broadcastQueueUpdated(e,n){this.broadcastQueueNotification("hydra-acp/prompt_queue/updated",{sessionId:this.sessionId,messageId:e,prompt:n})}broadcastQueueRemoved(e,n){this.broadcastQueueNotification("hydra-acp/prompt_queue/removed",{sessionId:this.sessionId,messageId:e,reason:n})}broadcastQueueNotification(e,n){for(let s of this.clients.values())s.connection.notify(e,n).catch(()=>{})}queueSnapshot(){let e=[],n=0;this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled&&e.push({messageId:this.currentEntry.messageId,originator:this.currentEntry.originator,prompt:this.currentEntry.prompt,position:n++,enqueuedAt:this.currentEntry.enqueuedAt});for(let s of this.promptQueue)s.kind!=="user"||s.cancelled||e.push({messageId:s.messageId,originator:s.originator,prompt:s.prompt,position:n++,enqueuedAt:s.enqueuedAt});return e}async flushPersistWrites(){await this.queueWriteChain.catch(()=>{})}replayPersistedQueue(e){for(let n of e){let s={clientId:`hydra-resurrected_${n.messageId}`};n.originator.clientInfo.name!==void 0&&(s.name=n.originator.clientInfo.name),n.originator.clientInfo.version!==void 0&&(s.version=n.originator.clientInfo.version);let r={kind:"user",messageId:n.messageId,originator:s,clientId:s.clientId,prompt:n.prompt,enqueuedAt:n.enqueuedAt,cancelled:!1,resolve:()=>{},reject:()=>{}};this.promptQueue.push(r),this.broadcastQueueAdded(r)}this.drainQueue()}cancelQueuedPrompt(e){if(this.currentEntry?.messageId===e)return{cancelled:!1,reason:"already_running"};let n=this.promptQueue.findIndex(r=>r.messageId===e);if(n<0)return{cancelled:!1,reason:"not_found"};let s=this.promptQueue[n];return s.cancelled=!0,this.promptQueue.splice(n,1),s.kind==="user"&&(this.broadcastQueueRemoved(e,"cancelled"),this.persistRewrite()),this.amendInProgress?.newMessageId===e&&(this.amendInProgress=void 0),s.resolve({stopReason:"cancelled"}),{cancelled:!0,reason:"ok"}}updateQueuedPrompt(e,n){if(this.currentEntry?.messageId===e)return{updated:!1,reason:"already_running"};let s=this.promptQueue.find(r=>r.messageId===e);return!s||s.kind!=="user"?{updated:!1,reason:"not_found"}:(s.prompt=n,this.broadcastQueueUpdated(e,n),this.persistRewrite(),{updated:!0,reason:"ok"})}amendPrompt(e,n){let s=this.clients.get(e);if(!s)throw xt(new Error("client not attached"),D.SessionNotFound);let{targetMessageId:r,prompt:i,replaceQueue:o,onTargetCompleted:a}=n;if(this.currentEntry?.messageId===r&&this.currentEntry.kind==="user"&&!this.currentEntry.cancelled&&this.amendInProgress===void 0)return this.amendOnHead(s,i,r,o);let d=this.promptQueue.find(l=>l.messageId===r&&l.kind==="user");if(d&&d.kind==="user"&&!d.cancelled)return d.prompt=i,this.broadcastQueueUpdated(r,i),this.persistRewrite(),{amended:!0,reason:"ok",messageId:r};let c=this.recentlyTerminal.get(r);return c?c.stopReason==="cancelled"?{amended:!1,reason:"target_cancelled"}:a==="send_anyway"?{amended:!1,reason:"target_completed",messageId:this.enqueueAmendmentAsFollowUp(s,i)}:{amended:!1,reason:"target_completed"}:{amended:!1,reason:"target_not_found"}}amendOnHead(e,n,s,r){let i=_r(),o={clientId:e.clientId};if(e.clientInfo?.name&&(o.name=e.clientInfo.name),e.clientInfo?.version&&(o.version=e.clientInfo.version),r){let d=[];for(let c of this.promptQueue){if(c.kind==="user"&&!c.cancelled){c.cancelled=!0,this.broadcastQueueRemoved(c.messageId,"cancelled"),c.resolve({stopReason:"cancelled"});continue}d.push(c)}this.promptQueue=d}let a={kind:"user",messageId:i,originator:o,clientId:e.clientId,prompt:n,enqueuedAt:Date.now(),cancelled:!1,wasAmend:!0,resolve:()=>{},reject:()=>{}};return this.promptQueue.unshift(a),this.persistRewrite(),this.broadcastQueueAdded(a,{amending:s,position:1}),this.amendInProgress={cancelledMessageId:s,newMessageId:i},this.cancelExtensionDispatch(s,"amended"),this.agent.connection.notify("session/cancel",{sessionId:this.upstreamSessionId}).catch(()=>{}),{amended:!0,reason:"ok",messageId:i}}enqueueAmendmentAsFollowUp(e,n){let s=_r(),r={clientId:e.clientId};e.clientInfo?.name&&(r.name=e.clientInfo.name),e.clientInfo?.version&&(r.version=e.clientInfo.version);let i={kind:"user",messageId:s,originator:r,clientId:e.clientId,prompt:n,enqueuedAt:Date.now(),cancelled:!1,resolve:()=>{},reject:()=>{}};return this.promptQueue.push(i),this.persistRewrite(),this.broadcastQueueAdded(i),this.drainQueue(),s}async cancel(e){if(!this.clients.get(e))throw xt(new Error("client not attached"),D.SessionNotFound);this.lastCancelAt=Date.now(),this.currentEntry?.kind==="user"&&this.currentEntry.messageId!==void 0&&this.cancelExtensionDispatch(this.currentEntry.messageId,"cancelled"),await this.forwardRequest("session/cancel",{sessionId:this.sessionId},new Set,0,"notification")}addTransformer(e){let n=this.transformChain.findIndex(s=>s.name===e.name);n>=0?this.transformChain[n]=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,n,s=new Set,r=0,i="request"){let o=this.rewriteForAgent(n);for(let a=r;a<this.transformChain.length;a++){let d=this.transformChain[a];if(s.has(d.name))continue;let c=`request:${e}`;if(!d.intercepts.has(c))continue;let l=`t_${Tf()}`,f;try{f=await d.connection.request("hydra-acp/transformer/message",{token:l,phase:"request",method:e,direction:"client\u2192agent",sessionId:this.sessionId,envelope:o})}catch(p){this.logger?.warn(`transformer ${d.name} error on ${c}: ${p.message}`);continue}let u=f?.action??"continue";if(u==="stop")return i==="notification"?void 0:f?.payload??pc(e);if(u==="processing"){let p=a,m=o,g=new Set(s);return new Promise(y=>{let v=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([...g,d.name]),p+1,i).then(y).catch(()=>y(i==="notification"?void 0:pc(e))))},fc);typeof v.unref=="function"&&v.unref(),this.pendingClaims.set(l,{resolve:y,timer:v,transformerName:d.name,method:e,envelope:m,chainIdx:p,originatedBy:g,side:"request",tailKind:i})})}s.add(d.name)}if(i==="notification"){await this.agent.connection.notify(e,o);return}return this.agent.connection.request(e,o)}dischargeClaim(e,n){let s=this.pendingClaims.get(e);return s?(clearTimeout(s.timer),this.pendingClaims.delete(e),s.resolve(n),!0):!1}keepAliveClaim(e,n){let s=this.pendingClaims.get(e);if(!s)return!1;clearTimeout(s.timer);let r=typeof n=="number"&&n>0?Math.min(n*1.5,1800*1e3):fc,i=setTimeout(()=>{if(this.pendingClaims.delete(e))if(this.broadcastQueueNotification("hydra-acp/transformer/abandoned_request",{sessionId:this.sessionId,token:e,transformerName:s.transformerName}),s.side==="response")this.runResponseChain(s.envelope,new Set([...s.originatedBy,s.transformerName]),s.chainIdx+1).then(()=>s.resolve(void 0)).catch(()=>s.resolve(void 0));else{let o=s.tailKind??"request";this.forwardRequest(s.method,s.envelope,new Set([...s.originatedBy,s.transformerName]),s.chainIdx+1,o).then(s.resolve).catch(()=>s.resolve(o==="notification"?void 0:pc(s.method)))}},r);return typeof i.unref=="function"&&i.unref(),s.timer=i,!0}async emitToChain(e,n,s){let r=this.transformChain.findIndex(a=>a.name===e),i=r>=0?r+1:0,o=new Set([e]);if(n==="session/update"){await this.runResponseChain(s,o,i);return}return this.forwardRequest(n,s,o,i)}rewriteForAgent(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let n=e;if(n.sessionId===this.sessionId)return{...n,sessionId:this.upstreamSessionId}}return e}async close(e={}){if(!this.closed)return this.closeInFlight?this.closeInFlight:(this.closing=!0,this.closeInFlight=this.doClose(e),this.closeInFlight)}async doClose(e){this.logger?.info(`session ${this.sessionId} closing deleteRecord=${e.deleteRecord??!1}`),this.cancelIdleTimer();for(let n of this.pendingClaims.values())clearTimeout(n.timer);this.pendingClaims.clear(),await this.agent.kill().catch(()=>{}),this.markClosed({deleteRecord:e.deleteRecord??!1})}onClose(e){return this.closeHandlers.push(e),()=>{let n=this.closeHandlers.indexOf(e);n>=0&&this.closeHandlers.splice(n,1)}}onTitleChange(e){this.titleHandlers.push(e)}retitle(e){return this.runTitleCommand(e)}retitleFromAgent(){return this.runTitleCommand("")}setTitle(e){let n=e.trim();if(!(!n||n===this.title)){this.title=n,this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",title:n,updatedAt:new Date().toISOString()}});for(let s of this.titleHandlers)try{s(n)}catch{}}}maybeSeedTitleFromPrompt(e){if(this.firstPromptSeeded)return;let s=$r((e??{}).prompt),r=mc(s,200);r&&(r.startsWith("/")||(this._firstPromptSeeded=!0,this.setTitle(r)))}maybeApplyAgentModel(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="current_model_update")return!1;let r=Or(s.availableModels);r.length>0&&this.setAgentAdvertisedModels(r);let i=typeof s.currentModel=="string"?s.currentModel:typeof s.model=="string"?s.model:void 0;if(i===void 0)return!0;let o=i.trim();if(!o||o===this.currentModel)return!0;this.logger?.info(`live current_model_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(o)}`),this.currentModel=o;for(let a of this.modelHandlers)try{a(o)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentConfigOption(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="config_option_update")return!1;let r=s.configOptions;if(!Array.isArray(r))return!0;for(let i of r){if(!i||typeof i!="object")continue;let o=i;if(o.id==="model"){let a=Or(o.options);a.length>0&&this.setAgentAdvertisedModels(a);let d=o.currentValue;if(typeof d=="string"){let c=d.trim();c&&c!==this.currentModel&&(this.logger?.info(`live config_option_update(model): sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(c)}`),this.applyModelChange(c))}}else if(o.id==="mode"){let a=Oi(o.options);a.length>0&&this.setAgentAdvertisedModes(a);let d=o.currentValue;if(typeof d=="string"){let c=d.trim();c&&c!==this.currentMode&&(this.logger?.info(`live config_option_update(mode): sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(c)}`),this.applyModeChange(c))}}else if(typeof o.id=="string"&&o.id.trim()){let a=o.id.trim(),d=Or(o.options);if(d.length>0){let c=Oi(o.options),l=c.length>0?c.map(y=>({value:y.id,name:y.name??y.id})):d.map(y=>({value:y.modelId,name:y.name??y.modelId})),f=o.name,u=typeof f=="string"&&f.trim()?f.trim():a,p=o.currentValue,m=typeof p=="string"&&p.trim()?p.trim():l[0]?.value??"",g=this.agentAdvertisedConfigOptions.findIndex(y=>y.id===a);if(g>=0){let y={...this.agentAdvertisedConfigOptions[g]};y.options=l,typeof p=="string"&&p.trim()&&(y.currentValue=p.trim()),this.agentAdvertisedConfigOptions[g]=y}else this.agentAdvertisedConfigOptions.push({id:a,name:u,category:"other",type:"select",currentValue:m,options:l})}}}return!0}maybeApplyAgentMode(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="current_mode_update")return!1;let r=typeof s.currentModeId=="string"?s.currentModeId:typeof s.currentMode=="string"?s.currentMode:typeof s.mode=="string"?s.mode:void 0;if(r===void 0)return!0;let i=r.trim();if(!i||i===this.currentMode)return!0;this.logger?.info(`current_mode_update: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(i)}`),this.currentMode=i;for(let o of this.modeHandlers)try{o(i)}catch{}return this.broadcastConfigOptions(),!0}maybeApplyAgentUsage(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="usage_update")return!1;let r={...this._currentUsage??{}},i=!1;if(typeof s.used=="number"&&r.used!==s.used&&(r.used=s.used,i=!0),typeof s.size=="number"&&r.size!==s.size&&(r.size=s.size,i=!0),s.cost&&typeof s.cost=="object"){let a=s.cost;typeof a.amount=="number"&&r.costAmount!==a.amount&&(r.costAmount=a.amount,i=!0),typeof a.currency=="string"&&r.costCurrency!==a.currency&&(r.costCurrency=a.currency,i=!0)}if(!i)return!0;this._currentUsage=r;let o=this.currentUsage??r;for(let a of this.usageHandlers)try{a(o)}catch{}return!0}accumulateAndResetCost(){let e=this._currentUsage?.costAmount;if(!e)return;this.cumulativeCost+=e;let n={...this._currentUsage??{},cumulativeCost:this.cumulativeCost,costAmount:void 0};this._currentUsage=n;for(let s of this.usageHandlers)try{s(n)}catch{}}injectCumulativeCost(e){if(!this.cumulativeCost||!e||typeof e!="object")return e;let n=e;if(!n.update||typeof n.update!="object")return e;let s=n.update;if(s.sessionUpdate!=="usage_update"||!s.cost||typeof s.cost!="object")return e;let r=s.cost;return typeof r.amount!="number"?e:{...n,update:{...s,cost:{...r,amount:this.cumulativeCost+r.amount}}}}get totalUsage(){return this.currentUsage}setAgentAdvertisedCommands(e){if(pb(this.agentAdvertisedCommands,e)){this.broadcastMergedCommands();return}this.agentAdvertisedCommands=e;for(let n of this.agentCommandsHandlers)try{n(e)}catch{}this.broadcastMergedCommands()}setAgentAdvertisedModes(e){if(hb(this.agentAdvertisedModes,e)){this.broadcastAvailableModes();return}this.agentAdvertisedModes=e;for(let n of this.agentModesHandlers)try{n(e)}catch{}this.broadcastAvailableModes()}setAgentAdvertisedModels(e){if(this.logger?.info(`setAgentAdvertisedModels: sessionId=${this.sessionId} currentModel=${JSON.stringify(this.currentModel)} newList=[${e.map(n=>n.modelId).join(",")}]`),mb(this.agentAdvertisedModels,e)){this.broadcastAvailableModels();return}this.agentAdvertisedModels=e;for(let n of this.agentModelsHandlers)try{n(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 n=e===void 0||e<=0?void 0:Math.floor(e);if(n!==this._priority){this._priority=n,this.updatedAt=Date.now();for(let s of this.priorityHandlers)try{s(n)}catch{}}}applyModelChange(e){let n=e.trim();if(!n)return;if(n!==this.currentModel){this.logger?.info(`applyModelChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentModel)} \u2192 ${JSON.stringify(n)}`),this.currentModel=n;for(let r of this.modelHandlers)try{r(n)}catch{}}let s={sessionUpdate:"current_model_update",currentModel:n};this.agentAdvertisedModels.length>0&&(s.availableModels=[...this.agentAdvertisedModels]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:s}),this.broadcastConfigOptions()}applyModeChange(e){let n=e.trim();if(!n)return;if(n!==this.currentMode){this.logger?.info(`applyModeChange: sessionId=${this.sessionId} ${JSON.stringify(this.currentMode)} \u2192 ${JSON.stringify(n)}`),this.currentMode=n;for(let r of this.modeHandlers)try{r(n)}catch{}}let s={sessionUpdate:"current_mode_update",currentModeId:n};this.agentAdvertisedModes.length>0&&(s.availableModes=[...this.agentAdvertisedModes]),this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:s}),this.broadcastConfigOptions()}buildConfigOptions(){let e=[];if(this.agentAdvertisedModels.length>0){let r=this.agentAdvertisedModels.map(o=>({value:o.modelId,name:o.name??o.modelId,...o.description!==void 0?{description:o.description}:{}})),i=this.currentModel&&r.some(o=>o.value===this.currentModel)?this.currentModel:r[0].value;e.push({id:"model",name:"Model",category:"model",type:"select",currentValue:i,options:r})}if(this.agentAdvertisedModes.length>0){let r=this.agentAdvertisedModes.map(o=>({value:o.id,name:o.name??o.id,...o.description!==void 0?{description:o.description}:{}})),i=this.currentMode&&r.some(o=>o.value===this.currentMode)?this.currentMode:r[0].value;e.push({id:"mode",name:"Session Mode",category:"mode",type:"select",currentValue:i,options:r})}let s=(this.availableAgentsFn?.()??[]).map(r=>({value:r.id,name:r.name??r.id,...r.description!==void 0?{description:r.description}:{}}));return s.some(r=>r.value===this.agentId)||s.unshift({value:this.agentId,name:this.agentId}),e.push({id:"agent",name:"Agent",category:"_hydra_agent",type:"select",currentValue:this.agentId,options:s}),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 n=e;if(!n.update||typeof n.update!="object")return e;let s=n.update,r=Array.isArray(s.configOptions)?[...s.configOptions]:[];if(r.some(a=>a&&typeof a=="object"&&a.id==="agent"))return e;let o=this.buildConfigOptions().find(a=>a.id==="agent");return o?{...n,update:{...s,configOptions:[...r,o]}}:e}onUsageChange(e){this.usageHandlers.push(e)}mergedAvailableCommands(){let e=[{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"}];if(this.extensionCommands)for(let{name:n,command:s}of this.extensionCommands.list()){let r=s.verb?`hydra ${n} ${s.verb}`:`hydra ${n}`,o={name:s.argsHint?`${r} ${s.argsHint}`:r};if(s.description&&(o.description=s.description),e.push(o),n.startsWith("hydra-acp-")){let a=n.slice(10);if(a.length>0){let d=s.verb?`hydra ${a} ${s.verb}`:`hydra ${a}`,l={name:s.argsHint?`${d} ${s.argsHint}`:d};s.description&&(l.description=s.description),e.push(l)}}}return e.push(...this.agentAdvertisedCommands),e}agentOnlyAdvertisedCommands(){return[...this.agentAdvertisedCommands]}availableModes(){return[...this.agentAdvertisedModes]}availableModels(){return[...this.agentAdvertisedModels]}maybeApplyAgentSessionInfo(e){let s=(e??{}).update??{};if(s.sessionUpdate!=="session_info_update"||typeof s.title!="string")return;let r=s.title.trim();if(!(!r||r===this.title)){this.title=r,this._firstPromptSeeded=!0;for(let i of this.titleHandlers)try{i(r)}catch{}}}async handleSlashCommand(e,n){let r=e.slice(6).trim().match(/^(\S+)(?:\s+([\s\S]*))?$/),i=r?.[1]??"",o=(r?.[2]??"").trim();if(i==="")return{stopReason:"end_turn"};let a=n!==void 0;if(Zo.some(f=>f.verb===i))switch(i){case"title":return a?this.runTitleCommandInline(o):this.runTitleCommand(o);case"agent":return a?this.runAgentCommandInline(o):this.runAgentCommand(o);case"config":return this.handleConfigCommand(`/config ${o}`);case"kill":return this.runKillCommand();case"restart":return a?this.runRestartCommandInline():this.runRestartCommand();default:{let f=new Error(`no dispatcher for /hydra verb ${i}`);throw f.code=D.InternalError,f}}if(this.extensionCommands?.has(i))return a?this.runExtensionCommandInline(i,o,n):this.runExtensionCommand(i,o);let d=`hydra-acp-${i}`;if(this.extensionCommands?.has(d))return a?this.runExtensionCommandInline(d,o,n):this.runExtensionCommand(d,o);let c=Zo.map(f=>f.verb);if(this.extensionCommands){let f=new Set;for(let{name:u}of this.extensionCommands.list())f.has(u)||(c.push(u),f.add(u))}let l=new Error(`unknown /hydra verb: ${i} (known: ${c.join(", ")})`);throw l.code=D.InvalidParams,l}runExtensionCommand(e,n){return this.enqueuePrompt(()=>this.runExtensionCommandInline(e,n,void 0))}async runExtensionCommandInline(e,n,s){let r=this.extensionCommands?.get(e);if(!r)return this.emitExtensionReply(`extension "${e}" is no longer connected`);let i=n.match(/^(\S+)(?:\s+([\s\S]*))?$/),o=i?.[1]??"",a=(i?.[2]??"").trim();if(!r.commands.some(m=>m.verb===o)){let m=r.commands.map(g=>g.verb).join(", ");return this.emitExtensionReply(`/hydra ${e}${o?` ${o}`:""}: unknown verb (known: ${m||"(none)"})`)}let d={sessionId:this.sessionId,verb:o,args:a};s!==void 0&&(d.messageId=s);let c=()=>{},l=new Promise(m=>{c=m});s!==void 0&&this.inFlightExtensionDispatches.set(s,{extensionName:e,connection:r.connection,cancel:m=>c({stopReason:"cancelled",reason:m})});let f,u=!1;try{let m=r.connection.request("hydra-acp/commands/invoke",d),g=await Promise.race([m,l]);if(g&&typeof g=="object"&&g.stopReason==="cancelled"&&"reason"in g)return u=!0,this.logger?.info(`extension ${e} ${o} cancelled (cancelExtensionDispatch); abandoning in-flight commands/invoke`),{stopReason:"cancelled"};f=g}catch(m){return this.emitExtensionReply(`${e} ${o}: ${m.message}`)}finally{s!==void 0&&!u&&this.inFlightExtensionDispatches.delete(s)}let p=f&&typeof f=="object"&&typeof f.text=="string"?f.text:"";return p.length>0?this.emitExtensionReply(p):{stopReason:"end_turn"}}cancelExtensionDispatch(e,n){let s=this.inFlightExtensionDispatches.get(e);if(!s)return!1;this.inFlightExtensionDispatches.delete(e);try{s.connection.notify("hydra-acp/commands/cancel",{sessionId:this.sessionId,messageId:e,reason:n})}catch(r){this.logger?.warn(`notify commands/cancel to ${s.extensionName} failed: ${r.message}`)}return s.cancel(n),!0}emitExtensionReply(e){return this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
14
14
  ${e}
15
15
  `},_meta:{"hydra-acp":{synthetic:!0}}}}),{stopReason:"end_turn"}}async handleSessionsCommand(){let e;if(!this.listSessions)e="_(session listing not available)_";else{let n=await this.listSessions();if(n.length===0)e="_(no sessions)_";else{let s=n.map(r=>{let i=r.sessionId.replace(/^hydra_session_/,"").slice(0,12),o=r.currentModel?` \xB7 ${r.currentModel}`:"",a=r.sessionId===this.sessionId?" \u25C0":"",d=r.title?` ${r.title}`:"";return`\`${i}\` ${r.cwd}${o}${a}${d}`});e=`Sessions (${n.length}):
16
16
  ${s.join(`
@@ -51,7 +51,7 @@ ${m}:
51
51
  `)}
52
52
  `},_meta:{"hydra-acp":{synthetic:!0}}}}),{stopReason:"end_turn"}}return s==="model"?(c!==this.currentModel&&await this.forwardRequest("session/set_model",{sessionId:this.sessionId,modelId:c}),this.applyModelChange(c),{stopReason:"end_turn"}):s==="mode"?(c!==this.currentMode&&await this.forwardRequest("session/set_mode",{sessionId:this.sessionId,modeId:c}),this.applyModeChange(c),{stopReason:"end_turn"}):s==="agent"?(c!==this.agentId&&await this.runAgentCommandInline(c),{stopReason:"end_turn"}):(await this.forwardRequest("session/set_config_option",{sessionId:this.sessionId,configId:s,value:c}),{stopReason:"end_turn"})}runTitleCommand(e){return this.enqueuePrompt(()=>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 n={chunks:[]};this.internalPromptCapture=n;try{return await this.agent.connection.request("session/prompt",{sessionId:this.upstreamSessionId,prompt:[{type:"text",text:e}]}),n.chunks.join("")}finally{this.internalPromptCapture=void 0}}setAgent(e){return this.runAgentCommand(e)}runAgentCommand(e){return this.enqueuePrompt(()=>this.runAgentCommandInline(e))}async runAgentCommandInline(e){if(!e)throw xt(new Error("/hydra agent requires an agent id"),D.InvalidParams);if(e===this.agentId)throw xt(new Error(`already on agent ${e}`),D.InvalidParams);if(!this.spawnReplacementAgent)throw xt(new Error("agent switching not configured for this session"),D.InternalError);let n=this.spawnReplacementAgent,s=this.agentId,r=await this.buildSwitchTranscript(s),i=await n({agentId:e,cwd:this.cwd,agentArgs:this.agentArgs,...this.forwardedEnv?{forwardedEnv:this.forwardedEnv}:{}});this.accumulateAndResetCost(),this.wireAgent(i.agent);let o=this.agent;this.agent=i.agent,this.agentId=e,this.upstreamSessionId=i.upstreamSessionId,this.agentMeta=i.agentMeta,this.agentCapabilities=i.agentCapabilities,this.agentAdvertisedCommands=[],this.broadcastMergedCommands(),this.currentModel=i.initialModel,this.currentMode=i.initialMode,this.setAgentAdvertisedModels(i.initialModels??[]),this.setAgentAdvertisedModes(i.initialModes??[]),await o.kill().catch(()=>{}),r&&await this.runInternalPrompt(r).catch(()=>{}),this.broadcastAgentSwitch(s,e);let a={agentId:this.agentId,upstreamSessionId:this.upstreamSessionId};for(let d of this.agentChangeHandlers)try{d(a)}catch{}return{stopReason:"end_turn"}}async runKillCommand(){return await this.close({deleteRecord:!1}),{stopReason:"end_turn"}}runRestartCommand(){return this.enqueuePrompt(()=>this.runRestartCommandInline())}async runRestartCommandInline(){if(!this.spawnReplacementAgent)throw xt(new Error("agent restart not configured for this session"),D.InternalError);return await this.respawnAgent(),{stopReason:"end_turn"}}async forceCancel(){if(this.closed||this.closing)throw xt(new Error("session is closing"),D.SessionClosing);return this.lastCancelAt=0,this.forceCancelling=!0,await this.close({deleteRecord:!1}),{stopReason:"cancelled"}}async respawnAgent(){let e=this.spawnReplacementAgent,n=this.agentId,s=await this.buildSwitchTranscript(n),r=await e({agentId:n,cwd:this.cwd,agentArgs:this.agentArgs,...this.forwardedEnv?{forwardedEnv:this.forwardedEnv}:{}});this.accumulateAndResetCost(),this.wireAgent(r.agent);let i=this.agent;this.agent=r.agent,this.upstreamSessionId=r.upstreamSessionId,this.agentMeta=r.agentMeta,this.agentCapabilities=r.agentCapabilities,this.agentAdvertisedCommands=[],this.broadcastMergedCommands(),this.currentModel=r.initialModel,this.currentMode=r.initialMode,this.setAgentAdvertisedModels(r.initialModels??[]),this.setAgentAdvertisedModes(r.initialModes??[]),await i.kill().catch(()=>{}),s&&await this.runInternalPrompt(s).catch(()=>{}),this.broadcastAgentSwitch(n,n);let o={agentId:n,upstreamSessionId:this.upstreamSessionId};for(let a of this.agentChangeHandlers)try{a(o)}catch{}}async buildSwitchTranscript(e,n){let s=[],r=await this.getHistorySnapshot();for(let c of r){if(c.method!=="session/update")continue;let f=(c.params??{}).update;if(!f||f._meta?.["hydra-acp"]?.synthetic)continue;let p=f.sessionUpdate;if(p==="prompt_received"){let m=$r(f.prompt);m&&s.push({speaker:"user",text:m})}else if(p==="agent_message_chunk"){let g=f.content?.text;g&&s.push({speaker:`agent: ${e}`,text:g})}else if(p==="tool_call"||p==="tool_call_update"){let m=f.status,g=f.title;(m==="completed"||m==="failed")&&s.push({speaker:"tool",text:`${g??"?"} ${m}`})}}if(s.length===0)return"";let i=[],o;for(let c of s)o&&o.speaker===c.speaker?o.text+=c.text:(o&&i.push(`<${o.speaker}>: ${o.text.trim()}`),o={speaker:c.speaker,text:c.text});o&&i.push(`<${o.speaker}>: ${o.text.trim()}`);let a=n?.intro??`You are taking over this conversation from ${e}. Below is the transcript so far.`,d=n?.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 ---",...i,"--- end transcript ---"].join(`
53
53
  `)}async seedFromImport(){await this.enqueuePrompt(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(()=>{})})}broadcastAgentSwitch(e,n){this.recordAndBroadcast("session/update",{sessionId:this.sessionId,update:{sessionUpdate:"session_info_update",_meta:{"hydra-acp":{synthetic:!0,agentId:n}}}}),this.broadcastConfigOptions()}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 s=(e.mode??"memory")==="file"&&e.filePathFor!==void 0?e.filePathFor(this.sessionId):void 0,r={};e.capacityBytes!==void 0&&(r.capacityBytes=e.capacityBytes),s!==void 0&&(r.filePath=s),e.fileCapBytes!==void 0&&(r.fileCapBytes=e.fileCapBytes),r.onFileCapReached=()=>{this.recordAndBroadcast("session/update",{sessionId:this.upstreamSessionId,update:{sessionUpdate:"stream_truncated",...s!==void 0?{filePath:s}:{},fileCapBytes:e.fileCapBytes}})};let i=new Xo(r);this.streamBuffer=i,this.streamFilePath=s;let o={capacityBytes:i.capacity};return s!==void 0&&(o.filePath=s),e.fileCapBytes!==void 0&&(o.fileCapBytes=e.fileCapBytes),o}streamWrite(e,n){let s=this.requireStreamBuffer();if(e.length>0){let r=Buffer.from(e,"base64");s.append(r)}return n===!0&&s.close(),{writeCursor:s.writeCursorPos}}async streamRead(e,n,s){let r=this.requireStreamBuffer(),i=Math.max(0,Math.min(n??Pr,Pr)),o=r.read(e,i);if(o.bytes.length===0&&o.eof!==!0&&s!==void 0&&s>0){let d=await r.waitForData(o.nextCursor,s);(d==="data"||d==="eof")&&(o=r.read(o.nextCursor,i))}let a={bytes:o.bytes.toString("base64"),nextCursor:o.nextCursor};return o.gap!==void 0&&(a.gap=o.gap),o.eof===!0&&(a.eof=!0),a}streamTail(e){let s=this.requireStreamBuffer().tail(e);return{bytes:s.bytes.toString("base64"),startCursor:s.startCursor,endCursor:s.endCursor,truncated:s.truncated}}streamHead(e){let s=this.requireStreamBuffer().head(e);return{bytes:s.bytes.toString("base64"),startCursor:s.startCursor,endCursor:s.endCursor,truncated:s.truncated}}async streamWaitFor(e,n){return this.requireStreamBuffer().waitForData(e,n)}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=D.StreamNotEnabled,e}return this.streamBuffer}markClosed(e){if(this.closed)return;this.closing=!0,this.closed=!0,this.cancelIdleTimer(),this.extensionCommandsUnsub&&(this.extensionCommandsUnsub(),this.extensionCommandsUnsub=void 0);for(let r of[...this.inFlightExtensionDispatches.keys()])this.cancelExtensionDispatch(r,"abandoned");this.currentEntry?.kind==="user"&&!this.recentlyTerminal.has(this.currentEntry.messageId)&&this.broadcastTurnComplete(this.currentEntry.clientId,{stopReason:"interrupted"},this.currentEntry.messageId,this.currentEntry.wasAmend),this.currentEntry=void 0;let n=this.promptQueue;this.promptQueue=[];for(let r of n){r.cancelled=!0,r.kind==="user"&&this.broadcastQueueRemoved(r.messageId,"abandoned");try{r.resolve({stopReason:"cancelled"})}catch{}}this.notifyChain("session.closed",{});let s=this.sessionId;this.queueWriteChain=this.queueWriteChain.catch(()=>{}).then(()=>Rf(s).catch(()=>{}));for(let r of this.clients.values())r.connection.notify("hydra-acp/session/closed",{sessionId:this.sessionId}).catch(()=>{});if(this.clients.clear(),this.streamBuffer!==void 0){let r=this.streamBuffer,i=this.streamFilePath;this.streamBuffer=void 0,this.streamFilePath=void 0,r.close(),i!==void 0&&r.drainFileWrites().then(()=>$f.unlink(i).catch(()=>{}))}for(let r of this.closeHandlers)r(e)}get lastActivityAt(){return this.lastRecordedAt}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.turnStartedAt!==void 0||this.inFlightPermissions.size>0||this.promptQueue.length>0){this.armIdleTimer(this.idleTimeoutMs);return}let e=Date.now()-this.lastActivityAt;if(e<this.idleTimeoutMs){this.armIdleTimer(this.idleTimeoutMs-e);return}let n=this.firstPromptSeeded?{deleteRecord:!1}:{deleteRecord:!0},s=Math.round(e/1e3);this.logger?.info(`session ${this.sessionId} idle timeout fired after ${s}s (window=${Math.round(this.idleTimeoutMs/1e3)}s) \u2014 closing`),this.close(n).catch(()=>{})}cancelIdleTimer(){this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=void 0),this.cancelIdleEventTimer()}scheduleIdleEvent(){this.closed||this.idleEventTimeoutMs<=0||this.transformChain.length===0||(this.idleEventTimer&&clearTimeout(this.idleEventTimer),this.idleEventTimer=setTimeout(()=>{this.idleEventTimer=void 0,this.notifyChain("session.idle",{})},this.idleEventTimeoutMs),typeof this.idleEventTimer.unref=="function"&&this.idleEventTimer.unref())}cancelIdleEventTimer(){this.idleEventTimer&&(clearTimeout(this.idleEventTimer),this.idleEventTimer=void 0)}notifyChain(e,n){let s=`lifecycle:${e}`;for(let r of this.transformChain)r.intercepts.has(s)&&r.connection.notify("hydra-acp/transformer/session_event",{event:e,sessionId:this.sessionId,payload:n}).catch(()=>{})}rewriteForClient(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let n=e;if(n.sessionId===this.upstreamSessionId)return{...n,sessionId:this.sessionId}}return e}recordAndBroadcast(e,n,s){let r=this.rewriteForClient(n),i=!fb(e,r),o=i?bb(e,r):r;if(i){let a={method:e,params:o,recordedAt:Date.now()};if(this.lastRecordedAt=a.recordedAt,this.appendCount+=1,this.historyStore){let d=this.historyStore;d.append(this.sessionId,a).catch(()=>{}),this.appendCount>=this.compactEvery&&(this.appendCount=0,d.compact(this.sessionId,this.historyMaxEntries).catch(()=>{}))}for(let d of this.broadcastHandlers)try{d(a)}catch{}this.scheduleIdleCheck(),this.scheduleIdleEvent()}this.updatedAt=Date.now();for(let a of this.clients.values())s&&a.clientId===s||a.connection.notify(e,o).catch(()=>{})}async requestPermissionFromClients(e){return this.handlePermissionRequest(e)}async handlePermissionRequest(e){let n=[...this.clients.values()];if(n.length===0)throw xt(new Error("no clients attached to handle permission request"),D.PermissionDenied);let s=this.rewriteForClient(e),r=vb(s);return new Promise((i,o)=>{let a=!1,d=[],c=0,l,f={addClient:g};this.inFlightPermissions.add(f);let u=this.sessionId,p=y=>{a||(a=!0,this.inFlightPermissions.delete(f),y())},m=y=>y?.code===D.MethodNotFound;function g(y){if(a)return;let v=y.connection.request("session/request_permission",s);d.push({client:y}),c++,v.then(b=>{c--,p(()=>{let k=Ib({toolCallId:r,result:b,resolver:y});for(let R of d)R.client.clientId!==y.clientId&&R.client.connection.notify("session/update",{sessionId:u,update:k}).catch(()=>{});i(b)})}).catch(b=>{if(c--,m(b)||(l=b),c===0&&!a){let k=l??xt(new Error("no client handled permission request"),D.PermissionDenied);p(()=>o(k))}})}for(let y of n)g(y)})}async enqueuePrompt(e){return new Promise((n,s)=>{let r={kind:"internal",messageId:_r(),enqueuedAt:Date.now(),cancelled:!1,task:e,resolve:n,reject:s};this.promptQueue.push(r),this.drainQueue()})}async enqueueUserPrompt(e,n,s){let r=(n??{}).prompt??[],i={clientId:e.clientId};e.clientInfo?.name&&(i.name=e.clientInfo.name),e.clientInfo?.version&&(i.version=e.clientInfo.version);let o=this.parseQueuePosition(n);return new Promise((a,d)=>{let c={kind:"user",messageId:s,originator:i,clientId:e.clientId,prompt:r,enqueuedAt:Date.now(),cancelled:!1,resolve:a,reject:d},l=this.insertEntryAt(c,o);this.persistRewrite(),this.broadcastQueueAdded(c,{position:l}),this.drainQueue()})}parseQueuePosition(e){if(!e||typeof e!="object")return"tail";let n=e._meta;if(!n||typeof n!="object"||Array.isArray(n))return"tail";let s=n["hydra-acp"];if(!s||typeof s!="object"||Array.isArray(s))return"tail";let r=s.queuePosition;if(r==="head"||r==="tail")return r;if(r&&typeof r=="object"&&!Array.isArray(r)){let i=r.afterMessageId;if(typeof i=="string"&&i.length>0)return{afterMessageId:i}}return"tail"}insertEntryAt(e,n){let s=this.currentEntry?.kind==="user"&&!this.currentEntry.cancelled?1:0;if(n==="head")return this.promptQueue.unshift(e),s;if(typeof n=="object"){let r=n.afterMessageId,i=this.promptQueue.findIndex(o=>o.messageId===r);if(i>=0)return this.promptQueue.splice(i+1,0,e),s+i+1}return this.promptQueue.push(e),s+this.promptQueue.length-1}persistRewrite(){let e=[];for(let s of this.promptQueue)s.kind!=="user"||s.cancelled||e.push(this.persistedFromEntry(s));let n=this.sessionId;this.queueWriteChain=this.queueWriteChain.catch(()=>{}).then(()=>$i(n,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.shift();if(!e)break;if(!e.cancelled){this.currentEntry=e,e.kind==="user"&&this.persistRewrite(),e.kind==="user"&&this.broadcastQueueRemoved(e.messageId,"started");try{let n=await this.runQueueEntry(e);e.resolve(n),await new Promise(s=>setImmediate(s))}catch(n){e.reject(n)}finally{this.currentEntry=void 0}}}}finally{this.promptInFlight=!1}}}async runQueueEntry(e){if(e.kind==="internal")return e.task();this.broadcastPromptReceived(e);let n=$r(e.prompt).replace(/\s+$/,""),s=!n.includes(`
54
- `)&&n.startsWith("/")?n.split(/\s+/)[0]:"";if(s==="/model"||s==="/mode"||s==="/sessions"||s==="/help"||s==="/hydra"){let i;return s==="/sessions"?i=await this.handleSessionsCommand():s==="/help"?i=await this.handleHelpCommand():s==="/mode"?i=await this.handleModeCommand(n):s==="/model"?i=await this.handleModelCommand(n):i=await this.handleSlashCommand(n,e.messageId),this.closed||this.broadcastTurnComplete(e.clientId,i,e.messageId,e.wasAmend),this.clearAmendIfMatches(e.messageId),i}let r;try{r=await this.agent.connection.request("session/prompt",{sessionId:this.upstreamSessionId,prompt:e.prompt})}catch(i){if(this.forceCancelling)return this.clearAmendIfMatches(e.messageId),{stopReason:"cancelled"};throw this.closed||this.broadcastTurnComplete(e.clientId,{stopReason:"error"},e.messageId,e.wasAmend),this.clearAmendIfMatches(e.messageId),i}return this.closed||this.broadcastTurnComplete(e.clientId,r,e.messageId,e.wasAmend),this.clearAmendIfMatches(e.messageId),r}clearAmendIfMatches(e){this.amendInProgress?.cancelledMessageId===e&&(this.amendInProgress=void 0)}};ub=new Set(["session_info_update","current_model_update","current_mode_update","available_commands_update","available_modes_update","usage_update","config_option_update"])});import{z as Yt}from"zod";function Ff(t){let e=t.trim();if(e.length===0)return;let n=Of(e);if(n===void 0){let i=e.indexOf("{"),o=e.lastIndexOf("}");if(i<0||o<=i||(n=Of(e.slice(i,o+1)),n===void 0))return}if(n===null||typeof n!="object")return;let s=n,r={};if(typeof s.title=="string"){let i=s.title.trim();i.length>0&&(r.title=i.slice(0,xb))}if(s.synopsis!==void 0&&s.synopsis!==null){let i=Fi.safeParse(s.synopsis);i.success&&Ab(i.data)&&(r.synopsis=i.data)}if(!(r.title===void 0&&r.synopsis===void 0))return r}function Of(t){try{return JSON.parse(t)}catch{return}}function Ab(t){return t.goal!==void 0&&t.goal.trim().length>0||t.outcome!==void 0&&t.outcome.trim().length>0||t.files_touched!==void 0&&t.files_touched.length>0||t.tools_used!==void 0&&t.tools_used.length>0||t.rejected_approaches!==void 0&&t.rejected_approaches.length>0||t.open_threads!==void 0&&t.open_threads.length>0}var Fi,xb,gc,ta=q(()=>{"use strict";Fi=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()}),xb=200,gc=`Reply with ONLY a JSON object with exactly these keys, no prose, no markdown, no code fences:
54
+ `)&&n.startsWith("/")?n.split(/\s+/)[0]:"";if(s==="/model"||s==="/mode"||s==="/sessions"||s==="/help"||s==="/hydra"){let i;return s==="/sessions"?i=await this.handleSessionsCommand():s==="/help"?i=await this.handleHelpCommand():s==="/mode"?i=await this.handleModeCommand(n):s==="/model"?i=await this.handleModelCommand(n):i=await this.handleSlashCommand(n,e.messageId),this.closed||this.broadcastTurnComplete(e.clientId,i,e.messageId,e.wasAmend),this.clearAmendIfMatches(e.messageId),i}let r;try{r=await this.agent.connection.request("session/prompt",{sessionId:this.upstreamSessionId,prompt:e.prompt})}catch(i){if(this.forceCancelling)return this.clearAmendIfMatches(e.messageId),{stopReason:"cancelled"};throw this.closed||this.broadcastTurnComplete(e.clientId,{stopReason:"error"},e.messageId,e.wasAmend),this.clearAmendIfMatches(e.messageId),i}return this.closed||this.broadcastTurnComplete(e.clientId,r,e.messageId,e.wasAmend),this.clearAmendIfMatches(e.messageId),r}clearAmendIfMatches(e){this.amendInProgress?.cancelledMessageId===e&&(this.amendInProgress=void 0)}};ub=new Set(["session_info_update","current_model_update","current_mode_update","available_commands_update","available_modes_update","usage_update","config_option_update"])});import{z as Yt}from"zod";function Ff(t){let e=t.trim();if(e.length===0)return;let n=Of(e);if(n===void 0){let i=e.indexOf("{"),o=e.lastIndexOf("}");if(i<0||o<=i||(n=Of(e.slice(i,o+1)),n===void 0))return}if(n===null||typeof n!="object")return;let s=n,r={};if(typeof s.title=="string"){let i=s.title.trim();i.length>0&&(r.title=i.slice(0,xb))}if(s.synopsis!==void 0&&s.synopsis!==null){let i=Fi.safeParse(s.synopsis);i.success&&Ab(i.data)&&(r.synopsis=i.data)}if(!(r.title===void 0&&r.synopsis===void 0))return r}function Of(t){try{return JSON.parse(t)}catch{return}}function Ab(t){return t.goal!==void 0&&t.goal.trim().length>0||t.outcome!==void 0&&t.outcome.trim().length>0||t.files_touched!==void 0&&t.files_touched.length>0||t.tools_used!==void 0&&t.tools_used.length>0||t.rejected_approaches!==void 0&&t.rejected_approaches.length>0||t.open_threads!==void 0&&t.open_threads.length>0}var Fi,xb,gc,ta=J(()=>{"use strict";Fi=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()}),xb=200,gc=`Reply with ONLY a JSON object with exactly these keys, no prose, no markdown, no code fences:
55
55
  {
56
56
  "title": "short summary, max 80 chars",
57
57
  "synopsis": {
@@ -61,12 +61,12 @@ ${m}:
61
61
  "open_threads": ["work started but not finished"]
62
62
  }
63
63
  }
64
- Use empty arrays/strings where a field doesn't apply.`});import*as Lr from"fs/promises";import*as MT from"path";import{customAlphabet as Cb}from"nanoid";import{z as se}from"zod";function Li(){return`${Eb}${Tb()}`}function _b(t){if(!yc.test(t))throw new Error(`unsafe session id: ${t}`)}function Sc(t){let e=new Date().toISOString();return{sessionId:t.sessionId,lineageId:t.lineageId,upstreamSessionId:t.upstreamSessionId,importedFromSessionId:t.importedFromSessionId,importedFromUpstreamSessionId:t.importedFromUpstreamSessionId,importedFromMachine:t.importedFromMachine,agentId:t.agentId,cwd:t.cwd,title:t.title,synopsis:t.synopsis,summarizedThroughEntry:t.summarizedThroughEntry,agentArgs:t.agentArgs,currentModel:t.currentModel,currentMode:t.currentMode,currentUsage:t.currentUsage,agentCommands:t.agentCommands,agentModes:t.agentModes,agentModels:t.agentModels,pendingHistorySync:t.pendingHistorySync,parentSessionId:t.parentSessionId,forkedFromSessionId:t.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId,originatingClient:t.originatingClient,interactive:t.interactive,priority:t.priority,forwardedEnv:t.forwardedEnv,createdAt:t.createdAt??e,updatedAt:t.updatedAt??e}}var Rb,Tb,Eb,wc,bc,Pb,vc,Ic,Mb,yc,na,kc=q(()=>{"use strict";ge();Ns();ta();Rb="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Tb=Cb(Rb,16),Eb="hydra_lineage_";wc=se.object({name:se.string(),description:se.string().optional()}),bc=se.object({id:se.string(),name:se.string().optional(),description:se.string().optional()}),Pb=se.object({modelId:se.string(),name:se.string().optional(),description:se.string().optional()}),vc=se.object({used:se.number().optional(),size:se.number().optional(),costAmount:se.number().optional(),costCurrency:se.string().optional(),cumulativeCost:se.number().optional()}),Ic=se.object({name:se.string(),version:se.string().optional()}),Mb=se.object({version:se.literal(1),sessionId:se.string(),lineageId:se.string().optional(),upstreamSessionId:se.string(),importedFromSessionId:se.string().optional(),importedFromUpstreamSessionId:se.string().optional(),importedFromMachine:se.string().optional(),agentId:se.string(),cwd:se.string(),title:se.string().optional(),synopsis:Fi.optional(),summarizedThroughEntry:se.number().int().nonnegative().optional(),agentArgs:se.array(se.string()).optional(),currentModel:se.string().optional(),currentMode:se.string().optional(),currentUsage:vc.optional(),agentCommands:se.array(wc).optional(),agentModes:se.array(bc).optional(),agentModels:se.array(Pb).optional(),pendingHistorySync:se.boolean().optional(),parentSessionId:se.string().optional(),forkedFromSessionId:se.string().optional(),forkedFromMessageId:se.string().optional(),originatingClient:Ic.optional(),interactive:se.boolean().optional(),priority:se.number().int().nonnegative().optional(),forwardedEnv:se.record(se.string(),se.string()).optional(),createdAt:se.string(),updatedAt:se.string()}),yc=/^[A-Za-z0-9_-]+$/;na=class{async write(e){_b(e.sessionId);let n={version:1,...e};await Et(M.sessionFile(e.sessionId),n,{mode:384})}async read(e){if(!yc.test(e))return;let n=await Bt(M.sessionFile(e));if(n!==void 0)try{return Mb.parse(n)}catch{return}}async delete(e){if(yc.test(e)){try{await Lr.unlink(M.sessionFile(e))}catch(n){if(n.code!=="ENOENT")throw n}try{await Lr.rmdir(M.sessionDir(e))}catch(n){let s=n;if(s.code!=="ENOENT"&&s.code!=="ENOTEMPTY")throw n}}}async findByLineageId(e){if(e.length===0)return;let n=await this.list().catch(()=>[]);for(let s of n)if(s.lineageId===e)return s}async list(){let e;try{e=await Lr.readdir(M.sessionsDir())}catch(r){if(r.code==="ENOENT")return[];throw r}let n=await Promise.all(e.map(r=>this.read(r).catch(()=>{}))),s=[];for(let r of n)r&&s.push(r);return s}}});import{fileURLToPath as Ob}from"url";import*as Bi from"path";import*as ra from"fs";function Fb(){try{let t=Bi.dirname(Ob(import.meta.url));for(let e=0;e<8;e+=1){let n=Bi.join(t,"package.json");if(ra.existsSync(n)){let r=JSON.parse(ra.readFileSync(n,"utf8"));if(typeof r.version=="string"&&r.version.length>0&&(typeof r.name!="string"||r.name.includes("hydra-acp")))return r.version}let s=Bi.dirname(t);if(s===t)break;t=s}}catch{}return"0.0.0"}var fe,js,_t=q(()=>{"use strict";fe=Fb(),js="hydra-acp-cat"});function xc(t){let e=new Map;for(let n of zf(t).values())e.set(n.toolName,(e.get(n.toolName)??0)+1);return[...e.entries()].map(([n,s])=>({name:n,count:s})).sort((n,s)=>s.count-n.count||n.name.localeCompare(s.name))}function qf(t){return xc(t).map(e=>e.name)}function Ac(t){let e=new Map;for(let n of zf(t).values())for(let s of n.paths){let r=e.get(s);r===void 0&&(r=new Map,e.set(s,r)),r.set(n.toolName,(r.get(n.toolName)??0)+1)}return[...e.entries()].map(([n,s])=>{let r=[...s.entries()].map(([o,a])=>({name:o,count:a})).sort((o,a)=>a.count-o.count||o.name.localeCompare(a.name)),i=r.reduce((o,a)=>o+a.count,0);return{path:n,count:i,byTool:r}}).sort((n,s)=>s.count-n.count||n.path.localeCompare(s.path))}function Wf(t){return Ac(t).map(e=>e.path)}function Jf(t){let e=0;for(let n of t)n.params?.update?.sessionUpdate==="prompt_received"&&(e+=1);return e}function zf(t){let e=new Map,n=0;for(let s of t){let i=s.params?.update;if(!i)continue;let o=i.sessionUpdate;if(o!=="tool_call"&&o!=="tool_call_update")continue;if(o==="tool_call"){let d=typeof i.toolCallId=="string"&&i.toolCallId.length>0?i.toolCallId:`__synth_${n++}`,c=e.get(d);c===void 0?(c={toolName:Uf(i),paths:new Set},e.set(d,c)):c.toolName=Uf(i);for(let l of jf(i.rawInput,i.locations))c.paths.add(l);continue}if(typeof i.toolCallId!="string"||i.toolCallId.length===0)continue;let a=e.get(i.toolCallId);if(a!==void 0)for(let d of jf(i.rawInput,i.locations))a.paths.add(d)}return e}function Uf(t){return typeof t.name=="string"&&t.name.length>0?t.name:typeof t.title=="string"&&t.title.length>0?t.title:"(unnamed)"}function jf(t,e){let n=new Set;if(t&&typeof t=="object"&&!Array.isArray(t)){let s=t;typeof s.file_path=="string"?n.add(s.file_path):typeof s.path=="string"&&n.add(s.path);let r=s.edits;if(Array.isArray(r)){for(let i of r)if(i&&typeof i=="object"){let o=i.file_path;typeof o=="string"&&n.add(o)}}}if(Array.isArray(e)){for(let s of e)if(s&&typeof s=="object"){let r=s.path;typeof r=="string"&&n.add(r)}}return n}var Cc=q(()=>{"use strict"});import{promises as Di}from"fs";import*as _c from"path";async function Hi(t){let e;try{e=await Di.readFile(t,"utf8")}catch(n){if(n.code==="ENOENT")return[];throw n}return nv(e)}function nv(t){let e=[];for(let n of t.split(`
64
+ Use empty arrays/strings where a field doesn't apply.`});import*as Lr from"fs/promises";import*as MT from"path";import{customAlphabet as Cb}from"nanoid";import{z as te}from"zod";function Li(){return`${Eb}${Tb()}`}function _b(t){if(!yc.test(t))throw new Error(`unsafe session id: ${t}`)}function Sc(t){let e=new Date().toISOString();return{sessionId:t.sessionId,lineageId:t.lineageId,upstreamSessionId:t.upstreamSessionId,importedFromSessionId:t.importedFromSessionId,importedFromUpstreamSessionId:t.importedFromUpstreamSessionId,importedFromMachine:t.importedFromMachine,agentId:t.agentId,cwd:t.cwd,title:t.title,synopsis:t.synopsis,summarizedThroughEntry:t.summarizedThroughEntry,agentArgs:t.agentArgs,currentModel:t.currentModel,currentMode:t.currentMode,currentUsage:t.currentUsage,agentCommands:t.agentCommands,agentModes:t.agentModes,agentModels:t.agentModels,pendingHistorySync:t.pendingHistorySync,parentSessionId:t.parentSessionId,forkedFromSessionId:t.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId,originatingClient:t.originatingClient,interactive:t.interactive,priority:t.priority,forwardedEnv:t.forwardedEnv,createdAt:t.createdAt??e,updatedAt:t.updatedAt??e}}var Rb,Tb,Eb,wc,bc,Pb,vc,Ic,Mb,yc,na,kc=J(()=>{"use strict";ge();Ns();ta();Rb="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Tb=Cb(Rb,16),Eb="hydra_lineage_";wc=te.object({name:te.string(),description:te.string().optional()}),bc=te.object({id:te.string(),name:te.string().optional(),description:te.string().optional()}),Pb=te.object({modelId:te.string(),name:te.string().optional(),description:te.string().optional()}),vc=te.object({used:te.number().optional(),size:te.number().optional(),costAmount:te.number().optional(),costCurrency:te.string().optional(),cumulativeCost:te.number().optional()}),Ic=te.object({name:te.string(),version:te.string().optional()}),Mb=te.object({version:te.literal(1),sessionId:te.string(),lineageId:te.string().optional(),upstreamSessionId:te.string(),importedFromSessionId:te.string().optional(),importedFromUpstreamSessionId:te.string().optional(),importedFromMachine:te.string().optional(),agentId:te.string(),cwd:te.string(),title:te.string().optional(),synopsis:Fi.optional(),summarizedThroughEntry:te.number().int().nonnegative().optional(),agentArgs:te.array(te.string()).optional(),currentModel:te.string().optional(),currentMode:te.string().optional(),currentUsage:vc.optional(),agentCommands:te.array(wc).optional(),agentModes:te.array(bc).optional(),agentModels:te.array(Pb).optional(),pendingHistorySync:te.boolean().optional(),parentSessionId:te.string().optional(),forkedFromSessionId:te.string().optional(),forkedFromMessageId:te.string().optional(),originatingClient:Ic.optional(),interactive:te.boolean().optional(),priority:te.number().int().nonnegative().optional(),forwardedEnv:te.record(te.string(),te.string()).optional(),createdAt:te.string(),updatedAt:te.string()}),yc=/^[A-Za-z0-9_-]+$/;na=class{async write(e){_b(e.sessionId);let n={version:1,...e};await Et(M.sessionFile(e.sessionId),n,{mode:384})}async read(e){if(!yc.test(e))return;let n=await Bt(M.sessionFile(e));if(n!==void 0)try{return Mb.parse(n)}catch{return}}async delete(e){if(yc.test(e)){try{await Lr.unlink(M.sessionFile(e))}catch(n){if(n.code!=="ENOENT")throw n}try{await Lr.rmdir(M.sessionDir(e))}catch(n){let s=n;if(s.code!=="ENOENT"&&s.code!=="ENOTEMPTY")throw n}}}async findByLineageId(e){if(e.length===0)return;let n=await this.list().catch(()=>[]);for(let s of n)if(s.lineageId===e)return s}async list(){let e;try{e=await Lr.readdir(M.sessionsDir())}catch(r){if(r.code==="ENOENT")return[];throw r}let n=await Promise.all(e.map(r=>this.read(r).catch(()=>{}))),s=[];for(let r of n)r&&s.push(r);return s}}});import{fileURLToPath as Ob}from"url";import*as Bi from"path";import*as ra from"fs";function Fb(){try{let t=Bi.dirname(Ob(import.meta.url));for(let e=0;e<8;e+=1){let n=Bi.join(t,"package.json");if(ra.existsSync(n)){let r=JSON.parse(ra.readFileSync(n,"utf8"));if(typeof r.version=="string"&&r.version.length>0&&(typeof r.name!="string"||r.name.includes("hydra-acp")))return r.version}let s=Bi.dirname(t);if(s===t)break;t=s}}catch{}return"0.0.0"}var fe,js,_t=J(()=>{"use strict";fe=Fb(),js="hydra-acp-cat"});function xc(t){let e=new Map;for(let n of zf(t).values())e.set(n.toolName,(e.get(n.toolName)??0)+1);return[...e.entries()].map(([n,s])=>({name:n,count:s})).sort((n,s)=>s.count-n.count||n.name.localeCompare(s.name))}function qf(t){return xc(t).map(e=>e.name)}function Ac(t){let e=new Map;for(let n of zf(t).values())for(let s of n.paths){let r=e.get(s);r===void 0&&(r=new Map,e.set(s,r)),r.set(n.toolName,(r.get(n.toolName)??0)+1)}return[...e.entries()].map(([n,s])=>{let r=[...s.entries()].map(([o,a])=>({name:o,count:a})).sort((o,a)=>a.count-o.count||o.name.localeCompare(a.name)),i=r.reduce((o,a)=>o+a.count,0);return{path:n,count:i,byTool:r}}).sort((n,s)=>s.count-n.count||n.path.localeCompare(s.path))}function Wf(t){return Ac(t).map(e=>e.path)}function Jf(t){let e=0;for(let n of t)n.params?.update?.sessionUpdate==="prompt_received"&&(e+=1);return e}function zf(t){let e=new Map,n=0;for(let s of t){let i=s.params?.update;if(!i)continue;let o=i.sessionUpdate;if(o!=="tool_call"&&o!=="tool_call_update")continue;if(o==="tool_call"){let d=typeof i.toolCallId=="string"&&i.toolCallId.length>0?i.toolCallId:`__synth_${n++}`,c=e.get(d);c===void 0?(c={toolName:Uf(i),paths:new Set},e.set(d,c)):c.toolName=Uf(i);for(let l of jf(i.rawInput,i.locations))c.paths.add(l);continue}if(typeof i.toolCallId!="string"||i.toolCallId.length===0)continue;let a=e.get(i.toolCallId);if(a!==void 0)for(let d of jf(i.rawInput,i.locations))a.paths.add(d)}return e}function Uf(t){return typeof t.name=="string"&&t.name.length>0?t.name:typeof t.title=="string"&&t.title.length>0?t.title:"(unnamed)"}function jf(t,e){let n=new Set;if(t&&typeof t=="object"&&!Array.isArray(t)){let s=t;typeof s.file_path=="string"?n.add(s.file_path):typeof s.path=="string"&&n.add(s.path);let r=s.edits;if(Array.isArray(r)){for(let i of r)if(i&&typeof i=="object"){let o=i.file_path;typeof o=="string"&&n.add(o)}}}if(Array.isArray(e)){for(let s of e)if(s&&typeof s=="object"){let r=s.path;typeof r=="string"&&n.add(r)}}return n}var Cc=J(()=>{"use strict"});import{promises as Di}from"fs";import*as _c from"path";async function Hi(t){let e;try{e=await Di.readFile(t,"utf8")}catch(n){if(n.code==="ENOENT")return[];throw n}return nv(e)}function nv(t){let e=[];for(let n of t.split(`
65
65
  `))if(n.length!==0)try{let s=JSON.parse(n);typeof s=="string"&&e.push(s)}catch{}return e}function Ui(t,e,n=ep){let s=e.replace(/\n+$/,"");if(s.length===0||t.length>0&&t[t.length-1]===s)return t;let r=t.concat(s);return r.length>n?r.slice(r.length-n):r}async function qs(t,e){await Di.mkdir(_c.dirname(t),{recursive:!0});let n=e.map(s=>JSON.stringify(s));await Di.writeFile(t,n.length>0?n.join(`
66
66
  `)+`
67
67
  `:"")}async function tp(t,e){let n=e.replace(/\n+$/,"");n.length!==0&&(await Di.mkdir(_c.dirname(t),{recursive:!0}),await Di.appendFile(t,JSON.stringify(n)+`
68
- `,{encoding:"utf8"}))}function aa(t,e){if(e.length===0)return[...t];let n=new Set(e);return[...t.filter(r=>!n.has(r)),...e]}function $c(t,e,n=ep){if(e.length===0)return t;let s=new Set(t),r=t;for(let i of e){let o=i.replace(/\n+$/,"");o.length!==0&&(s.has(o)||(s.add(o),r=Ui(r,o,n)))}return r}var ep,da=q(()=>{"use strict";ep=500});import{z as ke}from"zod";function ji(t){let e={version:1,exportedAt:new Date().toISOString(),exportedFrom:{hydraVersion:t.hydraVersion,machine:t.machine,...t.hydraHost!==void 0&&t.hydraHost.length>0?{hydraHost:t.hydraHost}:{}},session:{sessionId:t.record.sessionId,lineageId:t.record.lineageId,...t.record.upstreamSessionId?{upstreamSessionId:t.record.upstreamSessionId}:{},agentId:t.record.agentId,cwd:t.record.cwd,...t.record.title!==void 0?{title:t.record.title}:{},...t.record.synopsis!==void 0?{synopsis:t.record.synopsis}:{},...t.record.summarizedThroughEntry!==void 0?{summarizedThroughEntry:t.record.summarizedThroughEntry}:{},...t.record.currentModel!==void 0?{currentModel:t.record.currentModel}:{},...t.record.currentMode!==void 0?{currentMode:t.record.currentMode}:{},...t.record.currentUsage!==void 0?{currentUsage:t.record.currentUsage}:{},...t.record.agentCommands!==void 0?{agentCommands:t.record.agentCommands}:{},...t.record.agentModes!==void 0?{agentModes:t.record.agentModes}:{},...t.record.interactive!==void 0?{interactive:t.record.interactive}:{},...t.record.originatingClient!==void 0?{originatingClient:t.record.originatingClient}:{},...t.record.priority!==void 0&&t.record.priority>0?{priority:t.record.priority}:{},createdAt:t.record.createdAt,updatedAt:t.record.updatedAt},history:t.history};return t.promptHistory!==void 0&&(e.promptHistory=t.promptHistory),t.toolBlobs!==void 0&&Object.keys(t.toolBlobs).length>0&&(e.toolBlobs=t.toolBlobs),e}function Gt(t){return iv.parse(t)}var sv,rv,iv,Ws=q(()=>{"use strict";kc();ta();sv=ke.object({method:ke.string(),params:ke.unknown(),recordedAt:ke.number()}),rv=ke.object({sessionId:ke.string(),lineageId:ke.string(),upstreamSessionId:ke.string().optional(),agentId:ke.string(),cwd:ke.string(),title:ke.string().optional(),synopsis:Fi.optional(),summarizedThroughEntry:ke.number().int().nonnegative().optional(),currentModel:ke.string().optional(),currentMode:ke.string().optional(),currentUsage:vc.optional(),agentCommands:ke.array(wc).optional(),agentModes:ke.array(bc).optional(),interactive:ke.boolean().optional(),originatingClient:Ic.optional(),priority:ke.number().int().nonnegative().optional(),createdAt:ke.string(),updatedAt:ke.string()}),iv=ke.object({version:ke.literal(1),exportedAt:ke.string(),exportedFrom:ke.object({hydraVersion:ke.string(),machine:ke.string(),hydraHost:ke.string().optional()}),session:rv,history:ke.array(sv),promptHistory:ke.array(ke.string()).optional(),toolBlobs:ke.record(ke.string()).optional()})});import{createHash as vv}from"crypto";function Nc(t){if(Array.isArray(t))return t.map(Nc);if(t!==null&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=Nc(t[n]);return e}return t}function ds(t){let{tui:e,...n}=t,s=JSON.stringify(Nc(n));return vv("sha256").update(s).digest("hex").slice(0,16)}var Vi=q(()=>{"use strict";qe()});function Yi(t){if(!t||typeof t!="object")return;let e=t;return typeof e.workerTaskId=="string"?e.workerTaskId:void 0}var xp=q(()=>{"use strict"});import{posix as _v}from"path";import $v from"strip-ansi";function Qe(t){return $v(t).replace(Ov,"")}function Ae(t){return Qe(t).replace(/[\n\t]+/g," ").replace(/ +/g," ").trim()}function yn(t,e={}){if(!t||typeof t!="object")return null;let n=t,s=n.sessionUpdate??n.kind;if(typeof s!="string")return null;switch(s){case"agent_message_chunk":return Hv(n);case"agent_thought_chunk":case"agent_thought":return Uv(n);case"user_message_chunk":return jv(n);case"prompt_received":return qv(n);case"tool_call":return Wv(n,e);case"tool_call_update":return Yv(n,e);case"plan":return Xv(n);case"current_mode_update":return Zv(n);case"current_model_update":return eI(n);case"turn_complete":return tI(n);case"usage_update":return Dv(n);case"available_commands_update":return Bv(n);case"available_modes_update":return Nv(n);case"session_info_update":return Lv(n);case"config_option_update":return Fv(n);default:return{kind:"unknown",sessionUpdate:s,raw:t}}}function Fv(t){let e=t.configOptions;if(!Array.isArray(e))return null;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(typeof r.id!="string"||typeof r.currentValue!="string"||!Array.isArray(r.options))continue;let i=[];for(let o of r.options){if(!o||typeof o!="object")continue;let a=o;typeof a.value=="string"&&i.push({value:a.value,name:typeof a.name=="string"?a.name:a.value,...typeof a.description=="string"?{description:a.description}:{}})}n.push({id:r.id,name:typeof r.name=="string"?r.name:r.id,type:"select",currentValue:r.currentValue,options:i,...typeof r.category=="string"?{category:r.category}:{}})}return{kind:"config-options",options:n}}function Lv(t){let e=De(t,"title"),n=e!==void 0?Ae(e):void 0,s=t._meta,r;if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s["hydra-acp"];if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o.agentId;typeof a=="string"&&(r=a)}}if(n===void 0&&r===void 0)return null;let i={kind:"session-info"};return n!==void 0&&(i.title=n),r!==void 0&&(i.agentId=r),i}function Aa(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!n||typeof n!="object")continue;let s=n;if(typeof s.name!="string"||s.name.length===0)continue;let r=s.name.startsWith("/")?s.name:`/${s.name}`,i={name:Ae(r)};typeof s.description=="string"&&(i.description=Ae(s.description)),e.push(i)}return e}function Bv(t){let e=t.availableCommands??t.commands;return Array.isArray(e)?{kind:"available-commands",commands:Aa(e)}:null}function Nv(t){let e=t.availableModes;if(!Array.isArray(e))return null;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(typeof r.id!="string"||r.id.length===0)continue;let i={id:Ae(r.id)};typeof r.name=="string"&&(i.name=Ae(r.name)),typeof r.description=="string"&&(i.description=Ae(r.description)),n.push(i)}return{kind:"available-modes",modes:n}}function Dv(t){let e={kind:"usage-update"};if(typeof t.used=="number"&&(e.used=t.used),typeof t.size=="number"&&(e.size=t.size),t.cost&&typeof t.cost=="object"){let n=t.cost;typeof n.amount=="number"&&(e.costAmount=n.amount),typeof n.currency=="string"&&(e.costCurrency=n.currency)}return e}function Hv(t){let e=Gi(t.content);return e===null?null:{kind:"agent-text",text:e,workerTaskId:Yi(t)}}function Uv(t){let e=typeof t.text=="string"?Qe(t.text):Gi(t.content);return e===null?null:{kind:"agent-thought",text:e,workerTaskId:Yi(t)}}function jv(t){let e=t._meta;if(e&&typeof e=="object"&&!Array.isArray(e)){let s=e["hydra-acp"];if(s&&typeof s=="object"&&!Array.isArray(s)&&s.compatFor==="prompt_received")return null}let n=Gi(t.content);return n===null?null:{kind:"user-text",text:n}}function qv(t){let e=nI(t.prompt);return e===null?null:{kind:"user-text",text:e}}function Rp(t){return t?t.toLowerCase().replace(/[_\s-]/g,"")==="exitplanmode":!1}function Ap(t){if(typeof t=="string")return{text:t};if(t&&typeof t=="object"&&!Array.isArray(t)){let e=t;if(typeof e.__hydraBlob=="string")return{ref:{hash:e.__hydraBlob,bytes:typeof e.bytes=="number"?e.bytes:0}}}}function Ca(t){let e=t.content;if(Array.isArray(e))for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(r.type!=="diff")continue;let i=Ap(r.oldText),o=Ap(r.newText);if(i===void 0&&o===void 0)continue;let a=typeof r.path=="string"?r.path:void 0;return{...a!==void 0?{path:a}:{},oldText:i?.text??"",newText:o?.text??"",...i?.ref?{oldRef:i.ref}:{},...o?.ref?{newRef:o.ref}:{}}}let n=t.rawInput;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n,r=typeof s.file_path=="string"?s.file_path:typeof s.path=="string"?s.path:void 0;if(typeof s.old_string=="string"&&typeof s.new_string=="string")return{...r!==void 0?{path:r}:{},oldText:s.old_string,newText:s.new_string};if(typeof s.content=="string")return{...r!==void 0?{path:r}:{},oldText:"",newText:s.content}}return null}function Tp(t){let e=t.rawInput;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e.plan;return typeof n!="string"||n.length===0?null:Qe(n)}function Wv(t,e={}){let n=De(t,"toolCallId")??De(t,"id");if(!n)return null;let s=De(t,"title")??De(t,"name")??De(t,"label")??"tool call",r=De(t,"name")??De(t,"title");if(Rp(r)){let m=Tp(t);if(m!==null){let g=De(t,"status"),y={kind:"exit-plan-mode",toolCallId:n,plan:m};return g!==void 0&&(y.status=g),y}}let i=Mp(Ae(s),t,e),o=De(t,"status"),a=De(t,"kind"),d={kind:"tool-call",toolCallId:n,title:i};o!==void 0&&(d.status=o),a!==void 0&&(d.rawKind=a);let c=Ca(t);c!==null&&(d.editDiff=c);let l=Pp(t);l!==void 0&&(d.detail=l);let f=Dc(t);f!==void 0&&(d.detailFull=f);let u=Ep(t);u!==void 0&&(d.locations=u);let p=Yi(t);return p!==void 0&&(d.workerTaskId=p),d}function Ep(t){let e=t.locations;if(!Array.isArray(e))return;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(typeof r.path!="string"||r.path.length===0)continue;let i={path:r.path};typeof r.line=="number"&&Number.isFinite(r.line)&&r.line>=1&&(i.line=Math.floor(r.line)),n.push(i)}return n.length>0?n:void 0}function Pp(t){let e=Dc(t);if(e===void 0)return;let n=t.rawInput;return n&&typeof n.command=="string"?Kv(e,Cp):Vv(e,Cp)}function Dc(t){let e=t.rawInput;if(!e||typeof e!="object"||Array.isArray(e))return;let n=e;if(typeof n.command=="string"&&n.command.trim().length>0)return Qe(n.command).trim().replace(/^cd\s+\S+\s+&&\s+/,"");let s=typeof n.file_path=="string"?n.file_path:typeof n.filePath=="string"?n.filePath:typeof n.path=="string"?n.path:void 0;if(s!==void 0&&s.length>0)return je(Ae(s))}function zv(t){for(let e of Jv)if(t.startsWith(e))return!0;return!1}function Mp(t,e,n={}){if(t.length===0)return t;if(t.startsWith("/"))return je(t);if(t.startsWith("~")||!t.includes("/")||/\s/.test(t))return t;let s=e.rawInput;if(s&&typeof s=="object"&&!Array.isArray(s)){let r=s,i=[r.file_path,r.filePath,r.path];for(let o of i)if(!(typeof o!="string"||o.length===0)&&(o===`/${t}`||o.endsWith(`/${t}`)||o===t))return je(o)}return zv(t)?je(`/${t}`):n.cwd&&n.cwd.length>0?je(_v.resolve(n.cwd,t)):t}function Kv(t,e){return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function Vv(t,e){if(t.length<=e)return t;let n=t.slice(-(e-1)),s=n.indexOf("/");return s>=0&&s<e/2?`\u2026${n.slice(s)}`:`\u2026${n}`}function Yv(t,e={}){let n=De(t,"toolCallId")??De(t,"id");if(!n)return null;let s=De(t,"title"),r=s!==void 0?Mp(Ae(s),t,e):void 0,i=De(t,"status"),o=Ca(t),a=Pp(t);if(!(r!==void 0||o!==null||a!==void 0||i==="completed"||i==="failed"||i==="rejected"||i==="cancelled"))return null;let c=De(t,"name")??s;if(Rp(c)){let m={kind:"exit-plan-mode",toolCallId:n},g=Tp(t);return g!==null&&(m.plan=g),i!==void 0&&(m.status=i),m}let l={kind:"tool-call-update",toolCallId:n};r!==void 0&&(l.title=r),a!==void 0&&(l.detail=a);let f=Dc(t);f!==void 0&&(l.detailFull=f);let u=Ep(t);if(u!==void 0&&(l.locations=u),i!==void 0&&(l.status=i),o!==null&&(l.editDiff=o),i==="failed"){let m=Gv(t);m!==null&&(l.errorText=m),Qv(t,m)&&(l.upstreamInterrupted=!0)}let p=Yi(t);return p!==void 0&&(l.workerTaskId=p),l}function Gv(t){let e=t.content;if(Array.isArray(e))for(let s of e){if(!s||typeof s!="object")continue;let i=Gi(s.content);if(i!==null&&i.length>0)return i}let n=t.rawOutput;if(n&&typeof n=="object"){let s=n.error;if(typeof s=="string"&&s.length>0)return Qe(s)}return null}function Qv(t,e){let n=t.rawOutput;if(n&&typeof n=="object"){let s=n.metadata;if(s&&typeof s=="object"&&s.interrupted===!0)return!0}return!!(e!==null&&e.toLowerCase().includes("tool execution aborted"))}function Xv(t){let e=t.entries;if(!Array.isArray(e)||e.length===0)return null;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s,i=typeof r.content=="string"?Ae(r.content):void 0;if(!i)continue;let o={content:i};typeof r.status=="string"&&(o.status=r.status),typeof r.priority=="string"&&(o.priority=r.priority),n.push(o)}return{kind:"plan",entries:n}}function Zv(t){let e=De(t,"currentModeId")??De(t,"currentMode")??De(t,"mode");return e?{kind:"mode-changed",mode:Ae(e)}:null}function eI(t){let e=De(t,"currentModel")??De(t,"model");if(!e)return null;let n=t.availableModels,s=Array.isArray(n)?n.map(r=>typeof r=="object"&&r!==null?r.modelId:typeof r=="string"?r:void 0).filter(r=>typeof r=="string"&&r.length>0):void 0;return{kind:"model-changed",model:Ae(e),...s&&s.length>0?{availableModels:s}:{}}}function tI(t){let e=De(t,"stopReason"),n=t._meta,s=n?.["hydra-acp"]?.amended!==void 0&&n["hydra-acp"].amended!==null,r={kind:"turn-complete"};return e!==void 0&&(r.stopReason=e),s&&(r.amended=!0),r}function Gi(t){if(typeof t=="string")return Qe(t);if(!t||typeof t!="object")return null;let e=t;return e.type==="text"&&typeof e.text=="string"||typeof e.text=="string"?Qe(e.text):null}function nI(t){if(!Array.isArray(t))return null;let e=[];for(let n of t){let s=Gi(n);s!==null&&e.push(s)}return e.length===0?null:e.join("")}function De(t,e){let n=t[e];return typeof n=="string"?n:void 0}var Ov,Cp,Jv,cs=q(()=>{"use strict";ge();xp();Ov=/[\x00-\x08\x0b-\x1f\x7f]/g;Cp=64;Jv=["home/","Users/","root/","tmp/","var/","opt/","etc/","usr/","mnt/","private/"]});function Hr(t){let e=new Map,n=new Map;for(let r of t){let o=r.params?.update;if(!o||typeof o!="object")continue;let a=o.sessionUpdate;if(a!=="tool_call"&&a!=="tool_call_update")continue;let d=typeof o.toolCallId=="string"&&o.toolCallId.length>0?o.toolCallId:void 0,c=rI(o);if(c.length===0)continue;let l=c;if(d!==void 0){let f=e.get(d)??[],u=[];for(let p of c)f.some(m=>m.path===p.path&&m.oldText===p.oldText&&m.newText===p.newText)||u.push(p);if(u.length===0)continue;e.set(d,[...f,...u]),l=u}for(let f of l)sI(n,f)}let s=[];for(let[r,i]of n)s.push({path:r,hunks:i.hunks,created:i.created});return s}function Ur(t){let e=[];for(let n of t){let s=-1;for(let i=e.length-1;i>=0;i--)if(e[i].newText===n.oldText){s=i;break}if(s===-1){e.push(n);continue}let r=e[s];e.splice(s,1,{oldText:r.oldText,newText:n.newText})}return e}function sI(t,e){let n={oldText:e.oldText,newText:e.newText},s=t.get(e.path);if(s===void 0){t.set(e.path,{hunks:[n],created:e.oldText.length===0});return}s.hunks.push(n)}function rI(t){let e=[],n=t.rawInput;if(n&&typeof n=="object"&&!Array.isArray(n)){let i=n,o=typeof i.file_path=="string"?i.file_path:typeof i.path=="string"?i.path:void 0,a=i.edits;if(o!==void 0&&Array.isArray(a)){for(let d of a){if(!d||typeof d!="object")continue;let c=d,l=typeof c.old_string=="string"?c.old_string:void 0,f=typeof c.new_string=="string"?c.new_string:void 0;l===void 0||f===void 0||e.push({path:o,oldText:l,newText:f})}if(e.length>0)return e}}let s=t.content;if(Array.isArray(s)){for(let i of s){if(!i||typeof i!="object")continue;let o=i;if(o.type!=="diff")continue;let a=typeof o.path=="string"?o.path:void 0;if(a===void 0)continue;let d=typeof o.oldText=="string"?o.oldText:"",c=typeof o.newText=="string"?o.newText:"";e.push({path:a,oldText:d,newText:c})}if(e.length>0)return e}let r=Ca(t);return r&&r.path&&e.push({path:r.path,oldText:r.oldText,newText:r.newText}),e}var Ra=q(()=>{"use strict";cs()});function wn(t){let e=[],n=[],s=!1,r=i=>{if(!s){s=!0;for(let o of n)o(i)}};return t.on("message",(i,o)=>{if(o)return;let a=i.toString("utf8");try{let d=JSON.parse(a);for(let c of e)c(d)}catch(d){for(let c of e)c({jsonrpc:"2.0",id:null,error:{code:D.ParseError,message:`Failed to parse WS frame: ${d.message}`}})}}),t.on("close",()=>r()),t.on("error",i=>r(i)),{async send(i){if(s)throw new Error("ws is closed");let o=JSON.stringify(i);await new Promise((a,d)=>{t.send(o,c=>{if(c){d(c);return}a()})})},onMessage(i){e.push(i)},onClose(i){n.push(i)},async close(){s||(await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,clearTimeout(d),i())},d=setTimeout(a,5e3);t.once("close",a);try{t.close()}catch{a()}}),r())}}}var qr=q(()=>{"use strict";yt()});import{spawn as hS}from"child_process";import{setTimeout as mS}from"timers/promises";async function gS(t){let e=await Vs(t,500);return e?e.configDigest===void 0?"mismatch":e.configDigest===ds(t)?"match":"mismatch":"missing"}async function fs(t){let e=await gS(t);if(e!=="match"){if(e==="mismatch"){let n=cn();throw new Error(`unable to attach to running daemon \u2014 run \`${n} daemon stop\` and try again.`)}process.stderr.write(`hydra-acp: daemon not running; starting it...
69
- `),Da(),await Ha(t)}}async function Na(t){let n=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${t.daemon.port}/v1/health`;try{return(await fetch(n,{signal:AbortSignal.timeout(500),headers:{Connection:"close"}})).ok}catch{return!1}}async function Vs(t,e=1e3){let s=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${t.daemon.port}/v1/health`;try{let r=await fetch(s,{signal:AbortSignal.timeout(e),headers:{Connection:"close"}});if(!r.ok)return;let i=await r.json();return{version:typeof i.version=="string"?i.version:void 0,configDigest:typeof i.configDigest=="string"?i.configDigest:void 0}}catch{return}}function Da(){let t=process.argv[1];if(!t)throw new Error("Cannot determine hydra-acp binary path to spawn daemon");hS(process.execPath,[t,"daemon","start","--foreground"],{detached:!0,stdio:"ignore",env:process.env}).unref()}async function Ha(t,e=15e3){let n=Date.now()+e;for(;Date.now()<n;){if(await Na(t))return;await mS(150)}throw new Error(`hydra-acp daemon did not become ready within ${e}ms`)}var Ys=q(()=>{"use strict";Mi();Vi()});import{WebSocket as IS}from"ws";async function Gs(t,e,n=SS){return new Promise((s,r)=>{let i=new IS(t,e),o=Date.now(),a=setTimeout(()=>{i.off("open",d),i.off("error",c),i.on("error",()=>{});try{i.terminate()}catch{}r(new Vc(t,Date.now()-o))},n),d=()=>{clearTimeout(a),i.off("error",c),s(i)},c=l=>{clearTimeout(a),i.off("open",d),r(l)};i.once("open",d),i.once("error",c)})}var SS,Vc,eo=q(()=>{"use strict";SS=1e4,Vc=class extends Error{url;elapsedMs;constructor(e,n){super(`hydra-acp: websocket connect to ${e} timed out after ${n}ms`),this.name="WsConnectTimeoutError",this.url=e,this.elapsedMs=n}}});import*as ja from"fs/promises";function Kr(t,e,n){return`${n?"https":"http"}://${t}:${e}`}async function Re(t,e={}){let n=await ye(),s=await Bs(),r=Kr(n.daemon.host,n.daemon.port,!!n.daemon.tls),i=t.startsWith("http")?t:`${r}${t}`,o={Authorization:`Bearer ${s}`},a;e.body!==void 0&&(o["Content-Type"]="application/json",a=JSON.stringify(e.body));let d;try{d=await fetch(i,{method:e.method,headers:o,...a!==void 0?{body:a}:{}})}catch(u){if(e.rethrowNetworkError)throw u;process.stderr.write(`Could not reach daemon at ${r}: ${u.message}
68
+ `,{encoding:"utf8"}))}function aa(t,e){if(e.length===0)return[...t];let n=new Set(e);return[...t.filter(r=>!n.has(r)),...e]}function $c(t,e,n=ep){if(e.length===0)return t;let s=new Set(t),r=t;for(let i of e){let o=i.replace(/\n+$/,"");o.length!==0&&(s.has(o)||(s.add(o),r=Ui(r,o,n)))}return r}var ep,da=J(()=>{"use strict";ep=500});import{z as ke}from"zod";function ji(t){let e={version:1,exportedAt:new Date().toISOString(),exportedFrom:{hydraVersion:t.hydraVersion,machine:t.machine,...t.hydraHost!==void 0&&t.hydraHost.length>0?{hydraHost:t.hydraHost}:{}},session:{sessionId:t.record.sessionId,lineageId:t.record.lineageId,...t.record.upstreamSessionId?{upstreamSessionId:t.record.upstreamSessionId}:{},agentId:t.record.agentId,cwd:t.record.cwd,...t.record.title!==void 0?{title:t.record.title}:{},...t.record.synopsis!==void 0?{synopsis:t.record.synopsis}:{},...t.record.summarizedThroughEntry!==void 0?{summarizedThroughEntry:t.record.summarizedThroughEntry}:{},...t.record.currentModel!==void 0?{currentModel:t.record.currentModel}:{},...t.record.currentMode!==void 0?{currentMode:t.record.currentMode}:{},...t.record.currentUsage!==void 0?{currentUsage:t.record.currentUsage}:{},...t.record.agentCommands!==void 0?{agentCommands:t.record.agentCommands}:{},...t.record.agentModes!==void 0?{agentModes:t.record.agentModes}:{},...t.record.interactive!==void 0?{interactive:t.record.interactive}:{},...t.record.originatingClient!==void 0?{originatingClient:t.record.originatingClient}:{},...t.record.priority!==void 0&&t.record.priority>0?{priority:t.record.priority}:{},createdAt:t.record.createdAt,updatedAt:t.record.updatedAt},history:t.history};return t.promptHistory!==void 0&&(e.promptHistory=t.promptHistory),t.toolBlobs!==void 0&&Object.keys(t.toolBlobs).length>0&&(e.toolBlobs=t.toolBlobs),e}function Gt(t){return iv.parse(t)}var sv,rv,iv,Ws=J(()=>{"use strict";kc();ta();sv=ke.object({method:ke.string(),params:ke.unknown(),recordedAt:ke.number()}),rv=ke.object({sessionId:ke.string(),lineageId:ke.string(),upstreamSessionId:ke.string().optional(),agentId:ke.string(),cwd:ke.string(),title:ke.string().optional(),synopsis:Fi.optional(),summarizedThroughEntry:ke.number().int().nonnegative().optional(),currentModel:ke.string().optional(),currentMode:ke.string().optional(),currentUsage:vc.optional(),agentCommands:ke.array(wc).optional(),agentModes:ke.array(bc).optional(),interactive:ke.boolean().optional(),originatingClient:Ic.optional(),priority:ke.number().int().nonnegative().optional(),createdAt:ke.string(),updatedAt:ke.string()}),iv=ke.object({version:ke.literal(1),exportedAt:ke.string(),exportedFrom:ke.object({hydraVersion:ke.string(),machine:ke.string(),hydraHost:ke.string().optional()}),session:rv,history:ke.array(sv),promptHistory:ke.array(ke.string()).optional(),toolBlobs:ke.record(ke.string()).optional()})});import{createHash as vv}from"crypto";function Nc(t){if(Array.isArray(t))return t.map(Nc);if(t!==null&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=Nc(t[n]);return e}return t}function ds(t){let{tui:e,...n}=t,s=JSON.stringify(Nc(n));return vv("sha256").update(s).digest("hex").slice(0,16)}var Vi=J(()=>{"use strict";je()});function Yi(t){if(!t||typeof t!="object")return;let e=t;return typeof e.workerTaskId=="string"?e.workerTaskId:void 0}var xp=J(()=>{"use strict"});import{posix as _v}from"path";import $v from"strip-ansi";function Qe(t){return $v(t).replace(Ov,"")}function xe(t){return Qe(t).replace(/[\n\t]+/g," ").replace(/ +/g," ").trim()}function yn(t,e={}){if(!t||typeof t!="object")return null;let n=t,s=n.sessionUpdate??n.kind;if(typeof s!="string")return null;switch(s){case"agent_message_chunk":return Hv(n);case"agent_thought_chunk":case"agent_thought":return Uv(n);case"user_message_chunk":return jv(n);case"prompt_received":return qv(n);case"tool_call":return Wv(n,e);case"tool_call_update":return Yv(n,e);case"plan":return Xv(n);case"current_mode_update":return Zv(n);case"current_model_update":return eI(n);case"turn_complete":return tI(n);case"usage_update":return Dv(n);case"available_commands_update":return Bv(n);case"available_modes_update":return Nv(n);case"session_info_update":return Lv(n);case"config_option_update":return Fv(n);default:return{kind:"unknown",sessionUpdate:s,raw:t}}}function Fv(t){let e=t.configOptions;if(!Array.isArray(e))return null;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(typeof r.id!="string"||typeof r.currentValue!="string"||!Array.isArray(r.options))continue;let i=[];for(let o of r.options){if(!o||typeof o!="object")continue;let a=o;typeof a.value=="string"&&i.push({value:a.value,name:typeof a.name=="string"?a.name:a.value,...typeof a.description=="string"?{description:a.description}:{}})}n.push({id:r.id,name:typeof r.name=="string"?r.name:r.id,type:"select",currentValue:r.currentValue,options:i,...typeof r.category=="string"?{category:r.category}:{}})}return{kind:"config-options",options:n}}function Lv(t){let e=Ne(t,"title"),n=e!==void 0?xe(e):void 0,s=t._meta,r;if(s&&typeof s=="object"&&!Array.isArray(s)){let o=s["hydra-acp"];if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o.agentId;typeof a=="string"&&(r=a)}}if(n===void 0&&r===void 0)return null;let i={kind:"session-info"};return n!==void 0&&(i.title=n),r!==void 0&&(i.agentId=r),i}function Aa(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!n||typeof n!="object")continue;let s=n;if(typeof s.name!="string"||s.name.length===0)continue;let r=s.name.startsWith("/")?s.name:`/${s.name}`,i={name:xe(r)};typeof s.description=="string"&&(i.description=xe(s.description)),e.push(i)}return e}function Bv(t){let e=t.availableCommands??t.commands;return Array.isArray(e)?{kind:"available-commands",commands:Aa(e)}:null}function Nv(t){let e=t.availableModes;if(!Array.isArray(e))return null;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(typeof r.id!="string"||r.id.length===0)continue;let i={id:xe(r.id)};typeof r.name=="string"&&(i.name=xe(r.name)),typeof r.description=="string"&&(i.description=xe(r.description)),n.push(i)}return{kind:"available-modes",modes:n}}function Dv(t){let e={kind:"usage-update"};if(typeof t.used=="number"&&(e.used=t.used),typeof t.size=="number"&&(e.size=t.size),t.cost&&typeof t.cost=="object"){let n=t.cost;typeof n.amount=="number"&&(e.costAmount=n.amount),typeof n.currency=="string"&&(e.costCurrency=n.currency)}return e}function Hv(t){let e=Gi(t.content);return e===null?null:{kind:"agent-text",text:e,workerTaskId:Yi(t)}}function Uv(t){let e=typeof t.text=="string"?Qe(t.text):Gi(t.content);return e===null?null:{kind:"agent-thought",text:e,workerTaskId:Yi(t)}}function jv(t){let e=t._meta;if(e&&typeof e=="object"&&!Array.isArray(e)){let s=e["hydra-acp"];if(s&&typeof s=="object"&&!Array.isArray(s)&&s.compatFor==="prompt_received")return null}let n=Gi(t.content);return n===null?null:{kind:"user-text",text:n}}function qv(t){let e=nI(t.prompt);return e===null?null:{kind:"user-text",text:e}}function Rp(t){return t?t.toLowerCase().replace(/[_\s-]/g,"")==="exitplanmode":!1}function Ap(t){if(typeof t=="string")return{text:t};if(t&&typeof t=="object"&&!Array.isArray(t)){let e=t;if(typeof e.__hydraBlob=="string")return{ref:{hash:e.__hydraBlob,bytes:typeof e.bytes=="number"?e.bytes:0}}}}function Ca(t){let e=t.content;if(Array.isArray(e))for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(r.type!=="diff")continue;let i=Ap(r.oldText),o=Ap(r.newText);if(i===void 0&&o===void 0)continue;let a=typeof r.path=="string"?r.path:void 0;return{...a!==void 0?{path:a}:{},oldText:i?.text??"",newText:o?.text??"",...i?.ref?{oldRef:i.ref}:{},...o?.ref?{newRef:o.ref}:{}}}let n=t.rawInput;if(n&&typeof n=="object"&&!Array.isArray(n)){let s=n,r=typeof s.file_path=="string"?s.file_path:typeof s.path=="string"?s.path:void 0;if(typeof s.old_string=="string"&&typeof s.new_string=="string")return{...r!==void 0?{path:r}:{},oldText:s.old_string,newText:s.new_string};if(typeof s.content=="string")return{...r!==void 0?{path:r}:{},oldText:"",newText:s.content}}return null}function Tp(t){let e=t.rawInput;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e.plan;return typeof n!="string"||n.length===0?null:Qe(n)}function Wv(t,e={}){let n=Ne(t,"toolCallId")??Ne(t,"id");if(!n)return null;let s=Ne(t,"title")??Ne(t,"name")??Ne(t,"label")??"tool call",r=Ne(t,"name")??Ne(t,"title");if(Rp(r)){let m=Tp(t);if(m!==null){let g=Ne(t,"status"),y={kind:"exit-plan-mode",toolCallId:n,plan:m};return g!==void 0&&(y.status=g),y}}let i=Mp(xe(s),t,e),o=Ne(t,"status"),a=Ne(t,"kind"),d={kind:"tool-call",toolCallId:n,title:i};o!==void 0&&(d.status=o),a!==void 0&&(d.rawKind=a);let c=Ca(t);c!==null&&(d.editDiff=c);let l=Pp(t);l!==void 0&&(d.detail=l);let f=Dc(t);f!==void 0&&(d.detailFull=f);let u=Ep(t);u!==void 0&&(d.locations=u);let p=Yi(t);return p!==void 0&&(d.workerTaskId=p),d}function Ep(t){let e=t.locations;if(!Array.isArray(e))return;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s;if(typeof r.path!="string"||r.path.length===0)continue;let i={path:r.path};typeof r.line=="number"&&Number.isFinite(r.line)&&r.line>=1&&(i.line=Math.floor(r.line)),n.push(i)}return n.length>0?n:void 0}function Pp(t){let e=Dc(t);if(e===void 0)return;let n=xe(e),s=t.rawInput;return s&&typeof s.command=="string"?Kv(n,Cp):Vv(n,Cp)}function Dc(t){let e=t.rawInput;if(!e||typeof e!="object"||Array.isArray(e))return;let n=e;if(typeof n.command=="string"&&n.command.trim().length>0)return Qe(n.command).trim().replace(/^cd\s+\S+\s+&&\s+/,"");let s=typeof n.file_path=="string"?n.file_path:typeof n.filePath=="string"?n.filePath:typeof n.path=="string"?n.path:void 0;if(s!==void 0&&s.length>0)return Ue(xe(s))}function zv(t){for(let e of Jv)if(t.startsWith(e))return!0;return!1}function Mp(t,e,n={}){if(t.length===0)return t;if(t.startsWith("/"))return Ue(t);if(t.startsWith("~")||!t.includes("/")||/\s/.test(t))return t;let s=e.rawInput;if(s&&typeof s=="object"&&!Array.isArray(s)){let r=s,i=[r.file_path,r.filePath,r.path];for(let o of i)if(!(typeof o!="string"||o.length===0)&&(o===`/${t}`||o.endsWith(`/${t}`)||o===t))return Ue(o)}return zv(t)?Ue(`/${t}`):n.cwd&&n.cwd.length>0?Ue(_v.resolve(n.cwd,t)):t}function Kv(t,e){return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function Vv(t,e){if(t.length<=e)return t;let n=t.slice(-(e-1)),s=n.indexOf("/");return s>=0&&s<e/2?`\u2026${n.slice(s)}`:`\u2026${n}`}function Yv(t,e={}){let n=Ne(t,"toolCallId")??Ne(t,"id");if(!n)return null;let s=Ne(t,"title"),r=s!==void 0?Mp(xe(s),t,e):void 0,i=Ne(t,"status"),o=Ca(t),a=Pp(t);if(!(r!==void 0||o!==null||a!==void 0||i==="completed"||i==="failed"||i==="rejected"||i==="cancelled"))return null;let c=Ne(t,"name")??s;if(Rp(c)){let m={kind:"exit-plan-mode",toolCallId:n},g=Tp(t);return g!==null&&(m.plan=g),i!==void 0&&(m.status=i),m}let l={kind:"tool-call-update",toolCallId:n};r!==void 0&&(l.title=r),a!==void 0&&(l.detail=a);let f=Dc(t);f!==void 0&&(l.detailFull=f);let u=Ep(t);if(u!==void 0&&(l.locations=u),i!==void 0&&(l.status=i),o!==null&&(l.editDiff=o),i==="failed"){let m=Gv(t);m!==null&&(l.errorText=m),Qv(t,m)&&(l.upstreamInterrupted=!0)}let p=Yi(t);return p!==void 0&&(l.workerTaskId=p),l}function Gv(t){let e=t.content;if(Array.isArray(e))for(let s of e){if(!s||typeof s!="object")continue;let i=Gi(s.content);if(i!==null&&i.length>0)return i}let n=t.rawOutput;if(n&&typeof n=="object"){let s=n.error;if(typeof s=="string"&&s.length>0)return Qe(s)}return null}function Qv(t,e){let n=t.rawOutput;if(n&&typeof n=="object"){let s=n.metadata;if(s&&typeof s=="object"&&s.interrupted===!0)return!0}return!!(e!==null&&e.toLowerCase().includes("tool execution aborted"))}function Xv(t){let e=t.entries;if(!Array.isArray(e)||e.length===0)return null;let n=[];for(let s of e){if(!s||typeof s!="object")continue;let r=s,i=typeof r.content=="string"?xe(r.content):void 0;if(!i)continue;let o={content:i};typeof r.status=="string"&&(o.status=r.status),typeof r.priority=="string"&&(o.priority=r.priority),n.push(o)}return{kind:"plan",entries:n}}function Zv(t){let e=Ne(t,"currentModeId")??Ne(t,"currentMode")??Ne(t,"mode");return e?{kind:"mode-changed",mode:xe(e)}:null}function eI(t){let e=Ne(t,"currentModel")??Ne(t,"model");if(!e)return null;let n=t.availableModels,s=Array.isArray(n)?n.map(r=>typeof r=="object"&&r!==null?r.modelId:typeof r=="string"?r:void 0).filter(r=>typeof r=="string"&&r.length>0):void 0;return{kind:"model-changed",model:xe(e),...s&&s.length>0?{availableModels:s}:{}}}function tI(t){let e=Ne(t,"stopReason"),n=t._meta,s=n?.["hydra-acp"]?.amended!==void 0&&n["hydra-acp"].amended!==null,r={kind:"turn-complete"};return e!==void 0&&(r.stopReason=e),s&&(r.amended=!0),r}function Gi(t){if(typeof t=="string")return Qe(t);if(!t||typeof t!="object")return null;let e=t;return e.type==="text"&&typeof e.text=="string"||typeof e.text=="string"?Qe(e.text):null}function nI(t){if(!Array.isArray(t))return null;let e=[];for(let n of t){let s=Gi(n);s!==null&&e.push(s)}return e.length===0?null:e.join("")}function Ne(t,e){let n=t[e];return typeof n=="string"?n:void 0}var Ov,Cp,Jv,cs=J(()=>{"use strict";ge();xp();Ov=/[\x00-\x08\x0b-\x1f\x7f]/g;Cp=64;Jv=["home/","Users/","root/","tmp/","var/","opt/","etc/","usr/","mnt/","private/"]});function Hr(t){let e=new Map,n=new Map;for(let r of t){let o=r.params?.update;if(!o||typeof o!="object")continue;let a=o.sessionUpdate;if(a!=="tool_call"&&a!=="tool_call_update")continue;let d=typeof o.toolCallId=="string"&&o.toolCallId.length>0?o.toolCallId:void 0,c=rI(o);if(c.length===0)continue;let l=c;if(d!==void 0){let f=e.get(d)??[],u=[];for(let p of c)f.some(m=>m.path===p.path&&m.oldText===p.oldText&&m.newText===p.newText)||u.push(p);if(u.length===0)continue;e.set(d,[...f,...u]),l=u}for(let f of l)sI(n,f)}let s=[];for(let[r,i]of n)s.push({path:r,hunks:i.hunks,created:i.created});return s}function Ur(t){let e=[];for(let n of t){let s=-1;for(let i=e.length-1;i>=0;i--)if(e[i].newText===n.oldText){s=i;break}if(s===-1){e.push(n);continue}let r=e[s];e.splice(s,1,{oldText:r.oldText,newText:n.newText})}return e}function sI(t,e){let n={oldText:e.oldText,newText:e.newText},s=t.get(e.path);if(s===void 0){t.set(e.path,{hunks:[n],created:e.oldText.length===0});return}s.hunks.push(n)}function rI(t){let e=[],n=t.rawInput;if(n&&typeof n=="object"&&!Array.isArray(n)){let i=n,o=typeof i.file_path=="string"?i.file_path:typeof i.path=="string"?i.path:void 0,a=i.edits;if(o!==void 0&&Array.isArray(a)){for(let d of a){if(!d||typeof d!="object")continue;let c=d,l=typeof c.old_string=="string"?c.old_string:void 0,f=typeof c.new_string=="string"?c.new_string:void 0;l===void 0||f===void 0||e.push({path:o,oldText:l,newText:f})}if(e.length>0)return e}}let s=t.content;if(Array.isArray(s)){for(let i of s){if(!i||typeof i!="object")continue;let o=i;if(o.type!=="diff")continue;let a=typeof o.path=="string"?o.path:void 0;if(a===void 0)continue;let d=typeof o.oldText=="string"?o.oldText:"",c=typeof o.newText=="string"?o.newText:"";e.push({path:a,oldText:d,newText:c})}if(e.length>0)return e}let r=Ca(t);return r&&r.path&&e.push({path:r.path,oldText:r.oldText,newText:r.newText}),e}var Ra=J(()=>{"use strict";cs()});function wn(t){let e=[],n=[],s=!1,r=i=>{if(!s){s=!0;for(let o of n)o(i)}};return t.on("message",(i,o)=>{if(o)return;let a=i.toString("utf8");try{let d=JSON.parse(a);for(let c of e)c(d)}catch(d){for(let c of e)c({jsonrpc:"2.0",id:null,error:{code:D.ParseError,message:`Failed to parse WS frame: ${d.message}`}})}}),t.on("close",()=>r()),t.on("error",i=>r(i)),{async send(i){if(s)throw new Error("ws is closed");let o=JSON.stringify(i);await new Promise((a,d)=>{t.send(o,c=>{if(c){d(c);return}a()})})},onMessage(i){e.push(i)},onClose(i){n.push(i)},async close(){s||(await new Promise(i=>{let o=!1,a=()=>{o||(o=!0,clearTimeout(d),i())},d=setTimeout(a,5e3);t.once("close",a);try{t.close()}catch{a()}}),r())}}}var qr=J(()=>{"use strict";yt()});import{spawn as hS}from"child_process";import{setTimeout as mS}from"timers/promises";async function gS(t){let e=await Vs(t,500);return e?e.configDigest===void 0?"mismatch":e.configDigest===ds(t)?"match":"mismatch":"missing"}async function fs(t){let e=await gS(t);if(e!=="match"){if(e==="mismatch"){let n=cn();throw new Error(`unable to attach to running daemon \u2014 run \`${n} daemon stop\` and try again.`)}process.stderr.write(`hydra-acp: daemon not running; starting it...
69
+ `),Da(),await Ha(t)}}async function Na(t){let n=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${t.daemon.port}/v1/health`;try{return(await fetch(n,{signal:AbortSignal.timeout(500),headers:{Connection:"close"}})).ok}catch{return!1}}async function Vs(t,e=1e3){let s=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${t.daemon.port}/v1/health`;try{let r=await fetch(s,{signal:AbortSignal.timeout(e),headers:{Connection:"close"}});if(!r.ok)return;let i=await r.json();return{version:typeof i.version=="string"?i.version:void 0,configDigest:typeof i.configDigest=="string"?i.configDigest:void 0}}catch{return}}function Da(){let t=process.argv[1];if(!t)throw new Error("Cannot determine hydra-acp binary path to spawn daemon");hS(process.execPath,[t,"daemon","start","--foreground"],{detached:!0,stdio:"ignore",env:process.env}).unref()}async function Ha(t,e=15e3){let n=Date.now()+e;for(;Date.now()<n;){if(await Na(t))return;await mS(150)}throw new Error(`hydra-acp daemon did not become ready within ${e}ms`)}var Ys=J(()=>{"use strict";Mi();Vi()});import{WebSocket as IS}from"ws";async function Gs(t,e,n=SS){return new Promise((s,r)=>{let i=new IS(t,e),o=Date.now(),a=setTimeout(()=>{i.off("open",d),i.off("error",c),i.on("error",()=>{});try{i.terminate()}catch{}r(new Vc(t,Date.now()-o))},n),d=()=>{clearTimeout(a),i.off("error",c),s(i)},c=l=>{clearTimeout(a),i.off("open",d),r(l)};i.once("open",d),i.once("error",c)})}var SS,Vc,eo=J(()=>{"use strict";SS=1e4,Vc=class extends Error{url;elapsedMs;constructor(e,n){super(`hydra-acp: websocket connect to ${e} timed out after ${n}ms`),this.name="WsConnectTimeoutError",this.url=e,this.elapsedMs=n}}});import*as ja from"fs/promises";function Kr(t,e,n){return`${n?"https":"http"}://${t}:${e}`}async function Re(t,e={}){let n=await ye(),s=await Bs(),r=Kr(n.daemon.host,n.daemon.port,!!n.daemon.tls),i=t.startsWith("http")?t:`${r}${t}`,o={Authorization:`Bearer ${s}`},a;e.body!==void 0&&(o["Content-Type"]="application/json",a=JSON.stringify(e.body));let d;try{d=await fetch(i,{method:e.method,headers:o,...a!==void 0?{body:a}:{}})}catch(u){if(e.rethrowNetworkError)throw u;process.stderr.write(`Could not reach daemon at ${r}: ${u.message}
70
70
  `),process.exit(1)}let c=null;if(d.status!==204)try{c=await d.json()}catch{c=null}let l=e.expectStatus,f=l===void 0?d.ok:Array.isArray(l)?l.includes(d.status):l===d.status;if(l!==void 0&&!f){let u=`HTTP ${d.status}`;if(c&&typeof c=="object"&&"error"in c){let m=c.error;typeof m=="string"&&m.length>0&&(u=m)}let p=e.errorPrefix??"Daemon returned";process.stderr.write(`${p} ${u}
71
71
  `),process.exit(1)}return{ok:d.ok,status:d.status,body:c}}function Vr(t){let e;t instanceof Date?e=t.getTime():typeof t=="string"?e=Date.parse(t):e=t;let n=Math.max(0,Date.now()-e),s=Math.floor(n/1e3);if(s<60)return`${s}s ago`;let r=Math.floor(s/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}function qa(t,e){let n=e!=="agent",s=n?[]:void 0,r=[],i={},o=!0,a=0;for(;a<t.length;){let d=t[a];if(d==="--command"){let c=t[a+1];c===void 0&&(process.stderr.write(`--command requires a value
72
72
  `),process.exit(2)),s=n?kS(c):c,a+=2;continue}if(d==="--args"){let c=t[a+1];c===void 0&&(process.stderr.write(`--args requires a value
@@ -74,21 +74,21 @@ Use empty arrays/strings where a field doesn't apply.`});import*as Lr from"fs/pr
74
74
  `),process.exit(2));let l=c.indexOf("=");l<=0&&(process.stderr.write(`Invalid --env value '${c}': expected KEY=VALUE
75
75
  `),process.exit(2)),i[c.slice(0,l)]=c.slice(l+1),a+=2;continue}if(d==="--disabled"&&e!=="agent"){o=!1,a+=1;continue}process.stderr.write(`Unknown flag: ${d}
76
76
  `),process.exit(2)}return{command:s,args:r,env:i,enabled:o}}function kS(t){return t.split(/\s+/).filter(e=>e.length>0)}async function Yr(){let t=await ja.readFile(M.config(),"utf8");return JSON.parse(t)}async function Yc(t){await ja.writeFile(M.config(),JSON.stringify(t,null,2)+`
77
- `,{encoding:"utf8",mode:384})}var ps=q(()=>{"use strict";qe();Fn();ge();eo()});async function $t(t,e={},n=8e3,s=fetch){let r=new AbortController,i=e.signal??void 0;i&&(i.aborted?r.abort(i.reason):i.addEventListener("abort",()=>r.abort(i.reason),{once:!0}));let o=!1,a=setTimeout(()=>{o=!0,r.abort()},n);try{return await s(t,{...e,signal:r.signal})}catch(d){throw o?new Gc(t,n):d}finally{clearTimeout(a)}}async function bn(t,e={},n=fetch){let s=new URL(`${t.baseUrl}/v1/sessions`);e.cwd&&s.searchParams.set("cwd",e.cwd),e.all&&s.searchParams.set("all","true"),e.includeNonInteractive&&s.searchParams.set("includeNonInteractive","true");let r=await $t(s.toString(),{headers:{Authorization:`Bearer ${t.token}`},signal:e.signal},8e3,n);if(!r.ok)throw new Error(`daemon returned HTTP ${r.status}`);let i=await r.json();return Array.isArray(i.sessions)?i.sessions.map(o=>({sessionId:o.sessionId,cwd:o.cwd,updatedAt:o.updatedAt,attachedClients:o.attachedClients??0,status:o.status??"live",upstreamSessionId:o.upstreamSessionId,agentId:o.agentId,currentModel:o.currentModel,currentUsage:o.currentUsage,title:o.title,importedFromMachine:o.importedFromMachine,importedFromUpstreamSessionId:o.importedFromUpstreamSessionId,forkedFromSessionId:o.forkedFromSessionId,forkedFromMessageId:o.forkedFromMessageId,busy:o.busy,awaitingInput:o.awaitingInput,originatingClient:o.originatingClient,interactive:o.interactive,priority:o.priority})):[]}async function yh(t,e=fetch){let n=await $t(`${t.baseUrl}/v1/agents`,{headers:{Authorization:`Bearer ${t.token}`}},8e3,e);if(!n.ok)throw new Error(`daemon returned HTTP ${n.status}`);let s=await n.json(),r=Array.isArray(s.agents)?s.agents.filter(d=>d.installed==="yes"):[],i=0,o=0,a=0;for(let d of r)try{let c=await $t(`${t.baseUrl}/v1/agents/${d.id}/sync`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`}},3e4,e);if(!c.ok)continue;let l=await c.json();i+=Array.isArray(l.synced)?l.synced.length:0,o+=typeof l.skipped=="number"?l.skipped:0,a+=1}catch{}return{synced:i,skipped:o,agents:a}}async function Qc(t,e=fetch){let n=await $t(`${t.baseUrl}/v1/agents`,{headers:{Authorization:`Bearer ${t.token}`}},8e3,e);if(!n.ok)throw new Error(`daemon returned HTTP ${n.status}`);let s=await n.json();return Array.isArray(s.agents)?s.agents.map(r=>({id:r.id,name:r.name,description:r.description,...r.onboarding?{onboarding:r.onboarding}:{}})):[]}async function Wa(t,e,n={},s=fetch){let r=await $t(`${t.baseUrl}/v1/sessions/${e}/fork`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify(n)},3e4,s);if(!r.ok){let i="";try{let o=await r.json();typeof o.error=="string"&&(i=`: ${o.error}`)}catch{}throw new Error(`fork failed (HTTP ${r.status})${i}`)}return await r.json()}async function vn(t,e,n=fetch){let s=await $t(`${t.baseUrl}/v1/sessions/${e}/kill`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`}},8e3,n);if(!s.ok&&s.status!==204&&s.status!==404)throw new Error(`daemon returned HTTP ${s.status}`)}async function wh(t,e,n,s=fetch){let r=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"PATCH",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({title:n})},8e3,s);if(!r.ok&&r.status!==204&&r.status!==404)throw new Error(`daemon returned HTTP ${r.status}`)}async function bh(t,e,n,s=fetch){let r=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"PATCH",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({priority:n})},8e3,s);if(!r.ok&&r.status!==204&&r.status!==404)throw new Error(`daemon returned HTTP ${r.status}`)}async function vh(t,e,n=fetch){let s=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"PATCH",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({regen:!0})},8e3,n);if(!s.ok&&s.status!==202&&s.status!==204&&s.status!==404&&s.status!==409)throw new Error(`daemon returned HTTP ${s.status}`)}async function Ih(t,e,n={},s=fetch){let r={q:e};n.sessionIds&&n.sessionIds.length>0&&(r.sessionIds=n.sessionIds);let i=await $t(`${t.baseUrl}/v1/sessions/search`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify(r)},2e4,s);if(!i.ok)throw new Error(`daemon returned HTTP ${i.status}`);return await i.json()}async function Sh(t,e,n=fetch){let s=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"DELETE",headers:{Authorization:`Bearer ${t.token}`}},8e3,n);if(!s.ok&&s.status!==204&&s.status!==404)throw new Error(`daemon returned HTTP ${s.status}`)}function Ja(t,e){let n=t.filter(i=>i.cwd===e);if(n.length===0)return null;let s=i=>i.status==="live"?1:0;return[...n].sort((i,o)=>{let a=s(o)-s(i);return a!==0?a:o.updatedAt.localeCompare(i.updatedAt)})[0]??null}var Gc,to=q(()=>{"use strict";Gc=class extends Error{constructor(n,s){super(`daemon did not respond within ${s}ms (${n})`);this.url=n;this.timeoutMs=s;this.name="DaemonTimeoutError"}url;timeoutMs}});function Xc(t){if(!t)return;let e=t.lastIndexOf("/");return e===-1?t:t.slice(e+1)}function kh(t,e){let n=t??"?",s=Xc(e);return s?`${n}${xS}${s}`:n}function xh(t){return t??"?"}function Ah(t){if(!t||typeof t.costAmount!="number")return"";let{costAmount:e,costCurrency:n}=t;return n===void 0||n==="USD"?`$${Math.round(e)}`:Zc(e,n)}function Zc(t,e){return`${e==="USD"||e===void 0?"$":""}${t.toFixed(2)}${e&&e!=="USD"?` ${e}`:""}`}var xS,el=q(()=>{"use strict";xS="\u2022"});function Ch(t){let e=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(e.length===0)throw new Error("--columns: no column names given");let n=new Set,s=[];for(let r of e){if(!Ka.includes(r))throw new Error(`--columns: unknown column "${r}" (valid: ${Ka.join(", ")})`);if(n.has(r))throw new Error(`--columns: duplicate column "${r}"`);n.add(r),s.push(r)}return s}function Xr(t,e=Date.now()){return{session:ze(t.sessionId),upstream:CS(t.upstreamSessionId,t.importedFromMachine),host:t.importedFromMachine??"-",state:RS(t.status,t.busy,t.awaitingInput),agent:xh(t.agentId),model:Xc(t.currentModel)??"-",age:TS(t.updatedAt,e),title:t.title??"-",cwd:je(t.cwd),cost:Ah(t.currentUsage)}}function CS(t,e){return t&&t.length>0?t:e&&e.length>0?`\u2190 ${e}`:"-"}function RS(t,e,n){return t==="cold"?"COLD":n?"LIVE\u25E6":e?"LIVE\u2022":"LIVE"}function Zr(t,e={}){let n=e.columns??Gr,s={session:0,upstream:0,host:0,state:0,agent:0,model:0,age:0,cwd:0,title:0,cost:0};for(let r of n)s[r]=ES(Qr[r],t.map(i=>i[r]));return s}function TS(t,e){if(!t)return"?";let n=Date.parse(t);if(Number.isNaN(n))return"?";let s=Math.max(0,e-n),r=Math.floor(s/1e3);if(r<60)return"<1m";let i=Math.floor(r/60);if(i<60)return`${i}m`;let o=Math.floor(i/60);if(o<24)return`${o}h`;let a=Math.floor(o/24);if(a<14)return`${a}d`;let d=Math.floor(a/7);if(d<9)return`${d}w`;let c=Math.floor(a/30);return c<12?`${c}mo`:`${Math.floor(a/365)}y`}function ES(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}function hs(t,e,n,s={}){let r=s.columns??Gr,i=s.cwdMaxWidth??AS,o=b=>b==="age"?t[b].padStart(e[b]):t[b].padEnd(e[b]);if(n===void 0)return r.map((k,R)=>R===r.length-1?t[k]:o(k)).join(za);let a=r.map((b,k)=>({col:b,i:k})).filter(({col:b})=>tl.has(b)),d=a.length>0?a[a.length-1].i:-1;if(d===-1){let b=r.map(o).join(za);return b.length>n?b.slice(0,n):b}let c=r.filter(b=>!tl.has(b)).reduce((b,k)=>b+e[k],0),l=Math.max(0,r.length-1),f=n-c-l*za.length;f<0&&(f=0);let u=new Map,p=f;for(let{col:b,i:k}of a){if(k===d)continue;let R=b==="cwd"?Math.min(e[b],i):e[b],H=Math.min(R,Math.max(0,p-1));u.set(k,H),p=Math.max(0,p-H)}u.set(d,Math.max(0,p));let m=r.length-1,g=(b,k,R)=>{if(b==="cwd")return no(t[b],k).padEnd(k);let H=PS(t[b],k);return R?H:H.padEnd(k)},v=r.map((b,k)=>tl.has(b)?g(b,u.get(k)??0,k===m):o(b)).join(za);return v.length>n?v.slice(0,n):v}function PS(t,e){return e<=0?"":t.length<=e?t:e===1?"\u2026":t.slice(0,e-1)+"\u2026"}function no(t,e){if(e<=0)return"";if(t.length<=e)return t;if(e===1)return"\u2026";let n=Math.ceil((e-1)/2),s=e-1-n;return t.slice(0,n)+"\u2026"+t.slice(t.length-s)}var Ka,Gr,tl,Qr,za,AS,Va=q(()=>{"use strict";el();ge();hn();Ka=["session","upstream","host","state","agent","model","age","cwd","title","cost"],Gr=["session","state","age","cwd","title","agent","cost"],tl=new Set(["cwd","title"]),Qr={session:"SESSION",upstream:"UPSTREAM",host:"HOST",state:"STATE",agent:"AGENT",model:"MODEL",age:"AGE",title:"TITLE",cwd:"CWD",cost:"COST"},za=" ",AS=32});import{spawn as NS}from"child_process";import{Writable as DS}from"stream";function Ya(t={}){let e=t.isTTY??process.stdout.isTTY===!0;if(t.disabled===!0||!e)return{stream:process.stdout,flush:async()=>{}};let n=t.env??process.env,s=HS(n);if(s===null)return{stream:process.stdout,flush:async()=>{}};let r=t.spawn??NS,i={...n};i.LESS===void 0&&(i.LESS="FRX");let o=r(s,[],{shell:!0,stdio:["pipe","inherit","inherit"],env:i}),a=o.stdin;if(a===null)return{stream:process.stdout,flush:async()=>{}};a.on("error",l=>{l.code!=="EPIPE"&&process.stderr.write(`pager: ${l.message}
77
+ `,{encoding:"utf8",mode:384})}var ps=J(()=>{"use strict";je();Fn();ge();eo()});async function $t(t,e={},n=8e3,s=fetch){let r=new AbortController,i=e.signal??void 0;i&&(i.aborted?r.abort(i.reason):i.addEventListener("abort",()=>r.abort(i.reason),{once:!0}));let o=!1,a=setTimeout(()=>{o=!0,r.abort()},n);try{return await s(t,{...e,signal:r.signal})}catch(d){throw o?new Gc(t,n):d}finally{clearTimeout(a)}}async function bn(t,e={},n=fetch){let s=new URL(`${t.baseUrl}/v1/sessions`);e.cwd&&s.searchParams.set("cwd",e.cwd),e.all&&s.searchParams.set("all","true"),e.includeNonInteractive&&s.searchParams.set("includeNonInteractive","true");let r=await $t(s.toString(),{headers:{Authorization:`Bearer ${t.token}`},signal:e.signal},8e3,n);if(!r.ok)throw new Error(`daemon returned HTTP ${r.status}`);let i=await r.json();return Array.isArray(i.sessions)?i.sessions.map(o=>({sessionId:o.sessionId,cwd:o.cwd,updatedAt:o.updatedAt,attachedClients:o.attachedClients??0,status:o.status??"live",upstreamSessionId:o.upstreamSessionId,agentId:o.agentId,currentModel:o.currentModel,currentUsage:o.currentUsage,title:o.title,importedFromMachine:o.importedFromMachine,importedFromUpstreamSessionId:o.importedFromUpstreamSessionId,forkedFromSessionId:o.forkedFromSessionId,forkedFromMessageId:o.forkedFromMessageId,busy:o.busy,awaitingInput:o.awaitingInput,originatingClient:o.originatingClient,interactive:o.interactive,priority:o.priority})):[]}async function yh(t,e=fetch){let n=await $t(`${t.baseUrl}/v1/agents`,{headers:{Authorization:`Bearer ${t.token}`}},8e3,e);if(!n.ok)throw new Error(`daemon returned HTTP ${n.status}`);let s=await n.json(),r=Array.isArray(s.agents)?s.agents.filter(d=>d.installed==="yes"):[],i=0,o=0,a=0;for(let d of r)try{let c=await $t(`${t.baseUrl}/v1/agents/${d.id}/sync`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`}},3e4,e);if(!c.ok)continue;let l=await c.json();i+=Array.isArray(l.synced)?l.synced.length:0,o+=typeof l.skipped=="number"?l.skipped:0,a+=1}catch{}return{synced:i,skipped:o,agents:a}}async function Qc(t,e=fetch){let n=await $t(`${t.baseUrl}/v1/agents`,{headers:{Authorization:`Bearer ${t.token}`}},8e3,e);if(!n.ok)throw new Error(`daemon returned HTTP ${n.status}`);let s=await n.json();return Array.isArray(s.agents)?s.agents.map(r=>({id:r.id,name:r.name,description:r.description,...r.onboarding?{onboarding:r.onboarding}:{}})):[]}async function Wa(t,e,n={},s=fetch){let r=await $t(`${t.baseUrl}/v1/sessions/${e}/fork`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify(n)},3e4,s);if(!r.ok){let i="";try{let o=await r.json();typeof o.error=="string"&&(i=`: ${o.error}`)}catch{}throw new Error(`fork failed (HTTP ${r.status})${i}`)}return await r.json()}async function vn(t,e,n=fetch){let s=await $t(`${t.baseUrl}/v1/sessions/${e}/kill`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`}},8e3,n);if(!s.ok&&s.status!==204&&s.status!==404)throw new Error(`daemon returned HTTP ${s.status}`)}async function wh(t,e,n,s=fetch){let r=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"PATCH",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({title:n})},8e3,s);if(!r.ok&&r.status!==204&&r.status!==404)throw new Error(`daemon returned HTTP ${r.status}`)}async function bh(t,e,n,s=fetch){let r=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"PATCH",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({priority:n})},8e3,s);if(!r.ok&&r.status!==204&&r.status!==404)throw new Error(`daemon returned HTTP ${r.status}`)}async function vh(t,e,n=fetch){let s=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"PATCH",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify({regen:!0})},8e3,n);if(!s.ok&&s.status!==202&&s.status!==204&&s.status!==404&&s.status!==409)throw new Error(`daemon returned HTTP ${s.status}`)}async function Ih(t,e,n={},s=fetch){let r={q:e};n.sessionIds&&n.sessionIds.length>0&&(r.sessionIds=n.sessionIds);let i=await $t(`${t.baseUrl}/v1/sessions/search`,{method:"POST",headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},body:JSON.stringify(r)},2e4,s);if(!i.ok)throw new Error(`daemon returned HTTP ${i.status}`);return await i.json()}async function Sh(t,e,n=fetch){let s=await $t(`${t.baseUrl}/v1/sessions/${e}`,{method:"DELETE",headers:{Authorization:`Bearer ${t.token}`}},8e3,n);if(!s.ok&&s.status!==204&&s.status!==404)throw new Error(`daemon returned HTTP ${s.status}`)}function Ja(t,e){let n=t.filter(i=>i.cwd===e);if(n.length===0)return null;let s=i=>i.status==="live"?1:0;return[...n].sort((i,o)=>{let a=s(o)-s(i);return a!==0?a:o.updatedAt.localeCompare(i.updatedAt)})[0]??null}var Gc,to=J(()=>{"use strict";Gc=class extends Error{constructor(n,s){super(`daemon did not respond within ${s}ms (${n})`);this.url=n;this.timeoutMs=s;this.name="DaemonTimeoutError"}url;timeoutMs}});function Xc(t){if(!t)return;let e=t.lastIndexOf("/");return e===-1?t:t.slice(e+1)}function kh(t,e){let n=t??"?",s=Xc(e);return s?`${n}${xS}${s}`:n}function xh(t){return t??"?"}function Ah(t){if(!t||typeof t.costAmount!="number")return"";let{costAmount:e,costCurrency:n}=t;return n===void 0||n==="USD"?`$${Math.round(e)}`:Zc(e,n)}function Zc(t,e){return`${e==="USD"||e===void 0?"$":""}${t.toFixed(2)}${e&&e!=="USD"?` ${e}`:""}`}var xS,el=J(()=>{"use strict";xS="\u2022"});function Ch(t){let e=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(e.length===0)throw new Error("--columns: no column names given");let n=new Set,s=[];for(let r of e){if(!Ka.includes(r))throw new Error(`--columns: unknown column "${r}" (valid: ${Ka.join(", ")})`);if(n.has(r))throw new Error(`--columns: duplicate column "${r}"`);n.add(r),s.push(r)}return s}function Xr(t,e=Date.now()){return{session:ze(t.sessionId),upstream:CS(t.upstreamSessionId,t.importedFromMachine),host:t.importedFromMachine??"-",state:RS(t.status,t.busy,t.awaitingInput),agent:xh(t.agentId),model:Xc(t.currentModel)??"-",age:TS(t.updatedAt,e),title:t.title??"-",cwd:Ue(t.cwd),cost:Ah(t.currentUsage)}}function CS(t,e){return t&&t.length>0?t:e&&e.length>0?`\u2190 ${e}`:"-"}function RS(t,e,n){return t==="cold"?"COLD":n?"LIVE\u25E6":e?"LIVE\u2022":"LIVE"}function Zr(t,e={}){let n=e.columns??Gr,s={session:0,upstream:0,host:0,state:0,agent:0,model:0,age:0,cwd:0,title:0,cost:0};for(let r of n)s[r]=ES(Qr[r],t.map(i=>i[r]));return s}function TS(t,e){if(!t)return"?";let n=Date.parse(t);if(Number.isNaN(n))return"?";let s=Math.max(0,e-n),r=Math.floor(s/1e3);if(r<60)return"<1m";let i=Math.floor(r/60);if(i<60)return`${i}m`;let o=Math.floor(i/60);if(o<24)return`${o}h`;let a=Math.floor(o/24);if(a<14)return`${a}d`;let d=Math.floor(a/7);if(d<9)return`${d}w`;let c=Math.floor(a/30);return c<12?`${c}mo`:`${Math.floor(a/365)}y`}function ES(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}function hs(t,e,n,s={}){let r=s.columns??Gr,i=s.cwdMaxWidth??AS,o=b=>b==="age"?t[b].padStart(e[b]):t[b].padEnd(e[b]);if(n===void 0)return r.map((k,R)=>R===r.length-1?t[k]:o(k)).join(za);let a=r.map((b,k)=>({col:b,i:k})).filter(({col:b})=>tl.has(b)),d=a.length>0?a[a.length-1].i:-1;if(d===-1){let b=r.map(o).join(za);return b.length>n?b.slice(0,n):b}let c=r.filter(b=>!tl.has(b)).reduce((b,k)=>b+e[k],0),l=Math.max(0,r.length-1),f=n-c-l*za.length;f<0&&(f=0);let u=new Map,p=f;for(let{col:b,i:k}of a){if(k===d)continue;let R=b==="cwd"?Math.min(e[b],i):e[b],H=Math.min(R,Math.max(0,p-1));u.set(k,H),p=Math.max(0,p-H)}u.set(d,Math.max(0,p));let m=r.length-1,g=(b,k,R)=>{if(b==="cwd")return no(t[b],k).padEnd(k);let H=PS(t[b],k);return R?H:H.padEnd(k)},v=r.map((b,k)=>tl.has(b)?g(b,u.get(k)??0,k===m):o(b)).join(za);return v.length>n?v.slice(0,n):v}function PS(t,e){return e<=0?"":t.length<=e?t:e===1?"\u2026":t.slice(0,e-1)+"\u2026"}function no(t,e){if(e<=0)return"";if(t.length<=e)return t;if(e===1)return"\u2026";let n=Math.ceil((e-1)/2),s=e-1-n;return t.slice(0,n)+"\u2026"+t.slice(t.length-s)}var Ka,Gr,tl,Qr,za,AS,Va=J(()=>{"use strict";el();ge();hn();Ka=["session","upstream","host","state","agent","model","age","cwd","title","cost"],Gr=["session","state","age","cwd","title","agent","cost"],tl=new Set(["cwd","title"]),Qr={session:"SESSION",upstream:"UPSTREAM",host:"HOST",state:"STATE",agent:"AGENT",model:"MODEL",age:"AGE",title:"TITLE",cwd:"CWD",cost:"COST"},za=" ",AS=32});import{spawn as NS}from"child_process";import{Writable as DS}from"stream";function Ya(t={}){let e=t.isTTY??process.stdout.isTTY===!0;if(t.disabled===!0||!e)return{stream:process.stdout,flush:async()=>{}};let n=t.env??process.env,s=HS(n);if(s===null)return{stream:process.stdout,flush:async()=>{}};let r=t.spawn??NS,i={...n};i.LESS===void 0&&(i.LESS="FRX");let o=r(s,[],{shell:!0,stdio:["pipe","inherit","inherit"],env:i}),a=o.stdin;if(a===null)return{stream:process.stdout,flush:async()=>{}};a.on("error",l=>{l.code!=="EPIPE"&&process.stderr.write(`pager: ${l.message}
78
78
  `)});let d=new DS({write(l,f,u){if(!a.writable){u();return}a.write(l,m=>{if(m&&m.code!=="EPIPE"){u(m);return}u()})||a.once("drain",()=>{})},final(l){a.writable&&a.end(),l()}});d.on("error",l=>{l.code!=="EPIPE"&&process.stderr.write(`pager: ${l.message}
79
- `)});let c=new Promise(l=>{o.once("exit",()=>l()),o.once("error",()=>l())});return{stream:d,flush:async()=>{a.writable&&await new Promise(l=>{d.end(()=>l())}),await c}}}function HS(t){let e=t.HYDRA_ACP_PAGER;if(e!==void 0)return e.length===0?null:e;let n=t.PAGER;return n!==void 0?n.length===0?null:n:"less"}var nl=q(()=>{"use strict"});import US from"chalk";import{highlight as jS,supportsLanguage as Ga}from"cli-highlight";import Xa from"string-width";function ms(t,e={}){switch(t.kind){case"user-text":{let n=sl(t.text,"\u258E ","user",void 0,t.sentBy,!0);if(t.attachments&&t.attachments.length>0)for(let s of t.attachments)n.push({prefix:"\u258E ",prefixStyle:"user",body:`\u{1F4CE} ${s.name??"image"}`,bodyStyle:"user",fillRow:!0,iterm2Image:{data:s.data,heightCells:5}});return n}case"agent-text":return sl(t.text," ","agent");case"agent-thought":return sl(t.text," ","thought","thought");case"tool-call":case"tool-call-update":return[];case"exit-plan-mode":return[];case"plan":return lk(t,e.maxPlanItems??dk);case"mode-changed":return[{prefix:"\xBB ",prefixStyle:"info",body:`mode: ${t.mode}`,bodyStyle:"info"}];case"model-changed":return[];case"turn-complete":return[];case"usage-update":return[];case"available-commands":case"available-modes":case"config-options":return[];case"session-info":return[];case"unknown":return[]}}function rl(t,e){return ei(t,e).styled}function ei(t,e){let n=e?.codeOpen??"^C",s=e?.codeReset??"^:",r=e?.boldReset??"^:",i=e?.linkOpen??"^C^_",o=e?.linkReset??"^:",a="",d=0,c=[],l=0;for(;l<t.length;){let f=t[l];if(f==="^"){a+="^^",d+=1,l+=1;continue}if(f==="*"&&t[l+1]==="*"){let u=t.indexOf("**",l+2);if(u!==-1&&u>l+2){let p=t.slice(l+2,u),m=ei(p,e),g=d;a+=`^+${m.styled}${r}`;for(let y of m.links)c.push({start:g+y.start,end:g+y.end,url:y.url});d+=m.cleanLength,l=u+2;continue}}if(f==="`"){let u=t.indexOf("`",l+1);if(u!==-1&&u>l+1){let p=t.slice(l+1,u);a+=`${n}${p}${s}`,d+=p.length,l=u+1;continue}}if(f==="["){let u=t.indexOf("]",l+1);if(u!==-1&&t[u+1]==="("&&u>l+1){let p=t.indexOf(")",u+2);if(p!==-1&&p>u+2){let m=t.slice(l+1,u),g=t.slice(u+2,p),y=ei(m,e),v=d;a+=`${i}${y.styled}${o}`;for(let b of y.links)c.push({start:v+b.start,end:v+b.end,url:b.url});d+=y.cleanLength,c.push({start:v,end:d,url:g}),l=p+1;continue}}}a+=f,d+=1,l+=1}return{styled:a,links:c,cleanLength:d}}function qS(t){switch(t){case"plan-done":return{codeOpen:"^C",boldReset:"^:^g",codeReset:"^:^g"};case"plan-pending":return{codeOpen:"^C",boldReset:"^:^-",codeReset:"^:^-"};default:return{codeOpen:"^C",boldReset:"^:^Y",codeReset:"^:^Y"}}}function Bh(t){switch(t){case"heading-1":return{codeOpen:"^C",boldReset:"^+^Y",codeReset:"^+^Y"};case"heading-2":return{codeOpen:"^Y",boldReset:"^+^C",codeReset:"^+^C"};default:return{codeOpen:"^C",boldReset:"^:^+",codeReset:"^:^+"}}}function Nh(t,e){let{proseStyle:n,highlightCode:s,prefixStyle:r,firstPrefix:i=" ",inlineOpts:o,maxWidth:a}=e,d=[],c=t.replace(/^\s+/,"").split(`
80
- `),l=!1,f="",u=[],p=i!==" ",m=(v,b,k=" ",R)=>{let H={prefix:k,body:v,bodyStyle:b};r!==void 0&&(H.prefixStyle=r),R&&R.length>0&&(H.links=R),d.push(H)},g=()=>p?(p=!1,i):" ",y=()=>{if(u.length!==0){if(s){let v=Hh(f,u);for(let b of v){let k={prefix:" ",body:b.body,bodyStyle:"code",fillRow:!0};r!==void 0&&(k.prefixStyle=r),b.ansi&&(k.ansi=!0),d.push(k)}}else for(let v of u)m(v.replace(/\^/g,"^^"),n);u=[],f=""}};for(let v=0;v<c.length;v++){let b=c[v],k=b.match(/^\s*```\s*(\w*)\s*$/);if(k){l?(y(),l=!1):(l=!0,f=k[1]??"");continue}if(l){u.push(b);continue}let R=b.match(/^(#{1,6})\s+(.*)$/);if(R){let U=R[1].length,Y=R[2]??"",te=s?U===1?"heading-1":U===2?"heading-2":"heading-3":n,Z=s?Bh(te):o;m(rl(Y,Z),te,g());continue}let H=c[v+1];if(b.includes("|")&&H!==void 0&&WS(H)&&so(b).length===so(H).length){let U=so(b),Y=[],te=v+2;for(;te<c.length&&c[te].includes("|");)Y.push(so(c[te])),te++;let Z=QS(U,Y,a);for(let ee of Z)r!==void 0&&(ee.prefixStyle=r),d.push(ee);v=te-1;continue}let z=b.match(/^(\s*)[-*+]\s+(.*)$/);if(z){let U=z[1]??"",Y=z[2]??"",{styled:te,links:Z}=ei(Y,o),ee=U.length+2,Q=Z.map(oe=>({start:oe.start+ee,end:oe.end+ee,url:oe.url}));m(`${U}\u2022 ${te}`,n,g(),Q);continue}let K=b.match(/^(\s*)(\d+)\.\s+(.*)$/);if(K){let U=K[1]??"",Y=K[2]??"",te=K[3]??"",{styled:Z,links:ee}=ei(te,o),Q=U.length+Y.length+2,oe=ee.map(Oe=>({start:Oe.start+Q,end:Oe.end+Q,url:Oe.url}));m(`${U}${Y}. ${Z}`,n,g(),oe);continue}let J=b.trim()==="",{styled:W,links:F}=ei(b,o);m(W,n,J?" ":g(),F)}for(l&&y();d.length>0&&d[d.length-1].body==="";)d.pop();return d}function gs(t,e){return Nh(t,{proseStyle:"agent",highlightCode:!0,maxWidth:e?.maxWidth})}function ti(t){return Nh(t,{proseStyle:"thought",highlightCode:!1,prefixStyle:"thought",firstPrefix:" ",inlineOpts:{codeOpen:"^c",boldReset:"^-",codeReset:"^K"}})}function so(t){let e=t.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(n=>n.trim())}function WS(t){if(!t.includes("|"))return!1;let e=so(t);return e.length===0?!1:e.every(n=>/^:?-+:?$/.test(n))}function Qa(t){let e=t.replace(/\*\*(.+?)\*\*/g,"$1").replace(/`([^`]+)`/g,"$1");return Xa(e)}function KS(t){let e=[],n=0;for(;n<t.length;){let s=t[n];if(s===" "||s===" "){let o=n;for(;o<t.length&&(t[o]===" "||t[o]===" ");)o++;let a=t.slice(n,o);e.push({text:a,isWS:!0,width:Xa(a)}),n=o;continue}let r="",i=n;for(;i<t.length;){let o=t[i];if(o===" "||o===" ")break;if(t[i]==="*"&&t[i+1]==="*"){let a=t.indexOf("**",i+2);a===-1?(r+="**",i+=2):(r+=t.slice(i,a+2),i=a+2);continue}if(o==="`"){let a=t.indexOf("`",i+1);a===-1?(r+="`",i+=1):(r+=t.slice(i,a+1),i=a+1);continue}r+=o,i+=1}e.push({text:r,isWS:!1,width:Qa(r)}),n=i}return e}function VS(t,e){let n=[],s="",r=0;for(let i of t){let o=Xa(i);r>0&&r+o>e?(n.push(s),s=i,r=o):(s+=i,r+=o)}return s.length>0&&n.push(s),n}function YS(t,e){if(e<=0)return t.length===0?[""]:[t.map(o=>o.text).join("")];let n=[],s="",r=0,i=()=>{n.push(s.replace(/[ \t]+$/,"")),s="",r=0};for(let o of t){if(o.isWS){if(r===0)continue;s+=o.text,r+=o.width;continue}if(o.width>e){if(r>0&&i(),o.text.includes("**")||o.text.includes("`"))n.push(o.text);else{let d=VS(o.text,e);for(let l=0;l<d.length-1;l++)n.push(d[l]);let c=d[d.length-1]??"";s=c,r=Xa(c)}continue}if(r===0){s=o.text,r=o.width;continue}r+o.width>e?(i(),s=o.text,r=o.width):(s+=o.text,r+=o.width)}return(s.length>0||n.length===0)&&i(),n}function GS(t,e){let n=t.length;if(t.reduce((l,f)=>l+f,0)<=e)return t.slice();let r=t.map(l=>Math.min(l,Dh)),i=r.reduce((l,f)=>l+f,0);if(i>=e)return r;let o=e-i,a=t.map((l,f)=>({i:f,slack:Math.max(0,l-r[f])})).filter(l=>l.slack>0),d=a.reduce((l,f)=>l+f.slack,0);if(d===0)return r;for(let l of a){let f=Math.floor(o*l.slack/d);r[l.i]=r[l.i]+Math.min(f,l.slack)}i=r.reduce((l,f)=>l+f,0);let c=e-i;for(;c>0;){let l=-1,f=0;for(let u=0;u<n;u++){let p=t[u]-r[u];p>f&&(f=p,l=u)}if(l<0)break;r[l]=r[l]+1,c--}return r}function QS(t,e,n){let s=t.length,r=new Array(s).fill(0);for(let c=0;c<s;c++)r[c]=Qa(t[c]??"");for(let c of e)for(let l=0;l<s;l++){let f=c[l]??"",u=Qa(f);u>r[l]&&(r[l]=u)}let i=r.slice();if(n!==void 0){let c=Math.max(s*Dh,n-JS-(s-1)*zS);i=GS(r,c)}let o=(c,l,f)=>{let u=[],p=1;for(let g=0;g<s;g++){let y=c[g]??"",v=i[g],b=YS(KS(y),v);u.push(b),b.length>p&&(p=b.length)}let m=[];for(let g=0;g<p;g++){let y=[];for(let v=0;v<s;v++){let b=u[v][g]??"",k=i[v],R=Qa(b),H=rl(b,f);y.push(H+" ".repeat(Math.max(0,k-R)))}m.push({prefix:" ",body:y.join(" \u2502 "),bodyStyle:l})}return m},a=[];a.push(...o(t,"heading-3",Bh("heading-3")));let d=[];for(let c=0;c<s;c++)d.push("\u2500".repeat(i[c]));a.push({prefix:" ",body:d.join("\u2500\u253C\u2500"),bodyStyle:"dim"});for(let c of e)a.push(...o(c,"agent"));return a}function Hh(t,e){if(t.length===0||!Ga(t))return e.map(r=>({body:r,ansi:!1}));let n;try{n=jS(e.join(`
79
+ `)});let c=new Promise(l=>{o.once("exit",()=>l()),o.once("error",()=>l())});return{stream:d,flush:async()=>{a.writable&&await new Promise(l=>{d.end(()=>l())}),await c}}}function HS(t){let e=t.HYDRA_ACP_PAGER;if(e!==void 0)return e.length===0?null:e;let n=t.PAGER;return n!==void 0?n.length===0?null:n:"less"}var nl=J(()=>{"use strict"});import US from"chalk";import{highlight as jS,supportsLanguage as Ga}from"cli-highlight";import Xa from"string-width";function ms(t,e={}){switch(t.kind){case"user-text":{let n=sl(t.text,"\u258E ","user",void 0,t.sentBy,!0);if(t.attachments&&t.attachments.length>0)for(let s of t.attachments)n.push({prefix:"\u258E ",prefixStyle:"user",body:`\u{1F4CE} ${s.name??"image"}`,bodyStyle:"user",fillRow:!0,iterm2Image:{data:s.data,heightCells:5}});return n}case"agent-text":return sl(t.text," ","agent");case"agent-thought":return sl(t.text," ","thought","thought");case"tool-call":case"tool-call-update":return[];case"exit-plan-mode":return[];case"plan":return lk(t,e.maxPlanItems??dk);case"mode-changed":return[{prefix:"\xBB ",prefixStyle:"info",body:`mode: ${t.mode}`,bodyStyle:"info"}];case"model-changed":return[];case"turn-complete":return[];case"usage-update":return[];case"available-commands":case"available-modes":case"config-options":return[];case"session-info":return[];case"unknown":return[]}}function rl(t,e){return ei(t,e).styled}function ei(t,e){let n=e?.codeOpen??"^C",s=e?.codeReset??"^:",r=e?.boldReset??"^:",i=e?.linkOpen??"^C^_",o=e?.linkReset??"^:",a="",d=0,c=!1,l=[],f=0;for(;f<t.length;){let u=t[f];if(u==="^"){a+="^^",d+=1,f+=1;continue}if(u==="*"&&t[f+1]==="*"){let p=t.indexOf("**",f+2);if(p!==-1&&p>f+2){let m=t.slice(f+2,p),g=ei(m,e),y=d;a+=`^+${g.styled}${r}`;for(let v of g.links)l.push({start:y+v.start,end:y+v.end,url:v.url});d+=g.cleanLength,g.ansi&&(c=!0),f=p+2;continue}}if(u==="`"){let p=t.indexOf("`",f+1);if(p!==-1&&p>f+1){let m=t.slice(f+1,p);a+=`${n}${m}${s}`,d+=m.length,f=p+1;continue}}if(u==="["){let p=t.indexOf("]",f+1);if(p!==-1&&t[p+1]==="("&&p>f+1){let m=t.indexOf(")",p+2);if(m!==-1&&m>p+2){let g=t.slice(f+1,p),y=t.slice(p+2,m),v=ei(g,e),b=d,k=y.startsWith("file://");k?a+=`${i}${v.styled}${o}`:(a+=`\x1B]8;;${y}\x1B\\${i}${v.styled}${o}\x1B]8;;\x1B\\`,c=!0);for(let R of v.links)l.push({start:b+R.start,end:b+R.end,url:R.url});d+=v.cleanLength,k&&l.push({start:b,end:d,url:y}),f=m+1;continue}}}a+=u,d+=1,f+=1}return{styled:a,links:l,cleanLength:d,ansi:c}}function qS(t){switch(t){case"plan-done":return{codeOpen:"^C",boldReset:"^:^g",codeReset:"^:^g"};case"plan-pending":return{codeOpen:"^C",boldReset:"^:^-",codeReset:"^:^-"};default:return{codeOpen:"^C",boldReset:"^:^Y",codeReset:"^:^Y"}}}function Bh(t){switch(t){case"heading-1":return{codeOpen:"^C",boldReset:"^+^Y",codeReset:"^+^Y"};case"heading-2":return{codeOpen:"^Y",boldReset:"^+^C",codeReset:"^+^C"};default:return{codeOpen:"^C",boldReset:"^:^+",codeReset:"^:^+"}}}function Nh(t,e){let{proseStyle:n,highlightCode:s,prefixStyle:r,firstPrefix:i=" ",inlineOpts:o,maxWidth:a}=e,d=[],c=t.replace(/^\s+/,"").split(`
80
+ `),l=!1,f="",u=[],p=i!==" ",m=(v,b,k=" ",R,H)=>{let q={prefix:k,body:v,bodyStyle:b};r!==void 0&&(q.prefixStyle=r),R&&R.length>0&&(q.links=R),H&&(q.ansi=!0),d.push(q)},g=()=>p?(p=!1,i):" ",y=()=>{if(u.length!==0){if(s){let v=Hh(f,u);for(let b of v){let k={prefix:" ",body:b.body,bodyStyle:"code",fillRow:!0};r!==void 0&&(k.prefixStyle=r),b.ansi&&(k.ansi=!0),d.push(k)}}else for(let v of u)m(v.replace(/\^/g,"^^"),n);u=[],f=""}};for(let v=0;v<c.length;v++){let b=c[v],k=b.match(/^\s*```\s*(\w*)\s*$/);if(k){l?(y(),l=!1):(l=!0,f=k[1]??"");continue}if(l){u.push(b);continue}let R=b.match(/^(#{1,6})\s+(.*)$/);if(R){let O=R[1].length,U=R[2]??"",V=s?O===1?"heading-1":O===2?"heading-2":"heading-3":n,se=s?Bh(V):o;m(rl(U,se),V,g());continue}let H=c[v+1];if(b.includes("|")&&H!==void 0&&WS(H)&&so(b).length===so(H).length){let O=so(b),U=[],V=v+2;for(;V<c.length&&c[V].includes("|");)U.push(so(c[V])),V++;let se=QS(O,U,a);for(let Z of se)r!==void 0&&(Z.prefixStyle=r),d.push(Z);v=V-1;continue}let q=b.match(/^(\s*)[-*+]\s+(.*)$/);if(q){let O=q[1]??"",U=q[2]??"",V=ei(U,o),se=O.length+2,Z=V.links.map(ne=>({start:ne.start+se,end:ne.end+se,url:ne.url}));m(`${O}\u2022 ${V.styled}`,n,g(),Z,V.ansi);continue}let K=b.match(/^(\s*)(\d+)\.\s+(.*)$/);if(K){let O=K[1]??"",U=K[2]??"",V=K[3]??"",se=ei(V,o),Z=O.length+U.length+2,ne=se.links.map(Q=>({start:Q.start+Z,end:Q.end+Z,url:Q.url}));m(`${O}${U}. ${se.styled}`,n,g(),ne,se.ansi);continue}let z=b.trim()==="",W=ei(b,o);m(W.styled,n,z?" ":g(),W.links,W.ansi)}for(l&&y();d.length>0&&d[d.length-1].body==="";)d.pop();return d}function gs(t,e){return Nh(t,{proseStyle:"agent",highlightCode:!0,maxWidth:e?.maxWidth})}function ti(t){return Nh(t,{proseStyle:"thought",highlightCode:!1,prefixStyle:"thought",firstPrefix:" ",inlineOpts:{codeOpen:"^c",boldReset:"^-",codeReset:"^K"}})}function so(t){let e=t.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(n=>n.trim())}function WS(t){if(!t.includes("|"))return!1;let e=so(t);return e.length===0?!1:e.every(n=>/^:?-+:?$/.test(n))}function Qa(t){let e=t.replace(/\*\*(.+?)\*\*/g,"$1").replace(/`([^`]+)`/g,"$1");return Xa(e)}function KS(t){let e=[],n=0;for(;n<t.length;){let s=t[n];if(s===" "||s===" "){let o=n;for(;o<t.length&&(t[o]===" "||t[o]===" ");)o++;let a=t.slice(n,o);e.push({text:a,isWS:!0,width:Xa(a)}),n=o;continue}let r="",i=n;for(;i<t.length;){let o=t[i];if(o===" "||o===" ")break;if(t[i]==="*"&&t[i+1]==="*"){let a=t.indexOf("**",i+2);a===-1?(r+="**",i+=2):(r+=t.slice(i,a+2),i=a+2);continue}if(o==="`"){let a=t.indexOf("`",i+1);a===-1?(r+="`",i+=1):(r+=t.slice(i,a+1),i=a+1);continue}r+=o,i+=1}e.push({text:r,isWS:!1,width:Qa(r)}),n=i}return e}function VS(t,e){let n=[],s="",r=0;for(let i of t){let o=Xa(i);r>0&&r+o>e?(n.push(s),s=i,r=o):(s+=i,r+=o)}return s.length>0&&n.push(s),n}function YS(t,e){if(e<=0)return t.length===0?[""]:[t.map(o=>o.text).join("")];let n=[],s="",r=0,i=()=>{n.push(s.replace(/[ \t]+$/,"")),s="",r=0};for(let o of t){if(o.isWS){if(r===0)continue;s+=o.text,r+=o.width;continue}if(o.width>e){if(r>0&&i(),o.text.includes("**")||o.text.includes("`"))n.push(o.text);else{let d=VS(o.text,e);for(let l=0;l<d.length-1;l++)n.push(d[l]);let c=d[d.length-1]??"";s=c,r=Xa(c)}continue}if(r===0){s=o.text,r=o.width;continue}r+o.width>e?(i(),s=o.text,r=o.width):(s+=o.text,r+=o.width)}return(s.length>0||n.length===0)&&i(),n}function GS(t,e){let n=t.length;if(t.reduce((l,f)=>l+f,0)<=e)return t.slice();let r=t.map(l=>Math.min(l,Dh)),i=r.reduce((l,f)=>l+f,0);if(i>=e)return r;let o=e-i,a=t.map((l,f)=>({i:f,slack:Math.max(0,l-r[f])})).filter(l=>l.slack>0),d=a.reduce((l,f)=>l+f.slack,0);if(d===0)return r;for(let l of a){let f=Math.floor(o*l.slack/d);r[l.i]=r[l.i]+Math.min(f,l.slack)}i=r.reduce((l,f)=>l+f,0);let c=e-i;for(;c>0;){let l=-1,f=0;for(let u=0;u<n;u++){let p=t[u]-r[u];p>f&&(f=p,l=u)}if(l<0)break;r[l]=r[l]+1,c--}return r}function QS(t,e,n){let s=t.length,r=new Array(s).fill(0);for(let c=0;c<s;c++)r[c]=Qa(t[c]??"");for(let c of e)for(let l=0;l<s;l++){let f=c[l]??"",u=Qa(f);u>r[l]&&(r[l]=u)}let i=r.slice();if(n!==void 0){let c=Math.max(s*Dh,n-JS-(s-1)*zS);i=GS(r,c)}let o=(c,l,f)=>{let u=[],p=1;for(let g=0;g<s;g++){let y=c[g]??"",v=i[g],b=YS(KS(y),v);u.push(b),b.length>p&&(p=b.length)}let m=[];for(let g=0;g<p;g++){let y=[];for(let v=0;v<s;v++){let b=u[v][g]??"",k=i[v],R=Qa(b),H=rl(b,f);y.push(H+" ".repeat(Math.max(0,k-R)))}m.push({prefix:" ",body:y.join(" \u2502 "),bodyStyle:l})}return m},a=[];a.push(...o(t,"heading-3",Bh("heading-3")));let d=[];for(let c=0;c<s;c++)d.push("\u2500".repeat(i[c]));a.push({prefix:" ",body:d.join("\u2500\u253C\u2500"),bodyStyle:"dim"});for(let c of e)a.push(...o(c,"agent"));return a}function Hh(t,e){if(t.length===0||!Ga(t))return e.map(r=>({body:r,ansi:!1}));let n;try{n=jS(e.join(`
81
81
  `),{language:t,theme:XS,ignoreIllegals:!0})}catch{return e.map(r=>({body:r,ansi:!1}))}n=n.replace(/\x1b\[39m/g,"\x1B[37m");let s=n.split(`
82
82
  `);return s.length!==e.length?e.map(r=>({body:r,ansi:!1})):s.map((r,i)=>({body:r,ansi:r!==e[i]}))}function ek(t){if(!t)return"";let e=t.split(/[\\/]/).pop()?.toLowerCase()??"";if(e==="dockerfile"||e.startsWith("dockerfile."))return Ga("dockerfile")?"dockerfile":"";if(e==="makefile"||e==="gnumakefile")return Ga("makefile")?"makefile":"";let n=e.lastIndexOf(".");if(n<0)return"";let s=e.slice(n),r=ZS[s];return r&&Ga(r)?r:""}function sl(t,e,n,s,r,i){let o=t.replace(/^\s+/,"").split(`
83
83
  `),a=[];r&&a.push({prefix:"\u21B3 ",prefixStyle:"dim",body:`from ${r}`,bodyStyle:"dim"});for(let d of o){let c={prefix:e,prefixStyle:s??n,body:d,bodyStyle:n};i&&(c.fillRow=!0),a.push(c)}return a}function tk(t){return t<1024?`${t} B`:t<1024*1024?`${Math.round(t/1024)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function In(t){let e=Math.floor(t/1e3);if(e<60)return`${e}s`;let n=Math.floor(e/60),s=e%60;if(n<60)return s===0?`${n}m`:`${n}m ${s}s`;let r=Math.floor(n/60),i=n%60;return i===0?`${r}h`:`${r}h ${i}m`}function Uh(t){if(t.length<=4096&&t.split(`
84
84
  `).length<=40)return{text:t,truncated:!1};let s=t.slice(0,4096),r=t.length>4096,i=s.split(`
85
85
  `);return i.length>40&&(s=i.slice(0,40).join(`
86
- `),r=!0),{text:s,truncated:r}}function ro(t,e=Date.now()){let n=t.initialTitle,s=t.latestTitle,r=n.toLowerCase(),i=s.toLowerCase(),o;if(s===n||i.includes(r)?o=s:r.includes(i)?o=n:o=`${n} \xB7 ${s}`,t.detail){let d=t.detail,c=o.toLowerCase(),l=d.toLowerCase();(l.startsWith(`${c} `)||l.startsWith(`${c} `))&&(d=d.slice(o.length).trimStart()),d.length>0&&!o.includes(d)&&(o=`${o} \xB7 ${d}`)}if(t.startedAt!==void 0){let d=t.endedAt??e;o=`${o} \xB7 ${In(d-t.startedAt)}`}let a=[{prefix:` ${ik(t.status)} `,prefixStyle:ok(t.status),body:o,bodyStyle:uk(t.status)}];return t.status==="failed"&&t.errorText&&a.push({prefix:" ",body:Ae(t.errorText),bodyStyle:"tool-status-fail"}),a}function jh(t){if(t.editDiff!==void 0)return[];let e=[],n=t.detailFull??t.detail;if(n)for(let s of n.split(`
87
- `))e.push({prefix:" ",body:Ae(s),bodyStyle:"dim"});if(t.status==="failed"&&t.errorText&&e.push({prefix:" ",body:Ae(t.errorText),bodyStyle:"tool-status-fail"}),t.resultText){let s=t.resultText.split(`
88
- `),r=t.locations?.[0]?.path??t.detailFull??t.detail,i=ek(r);if(i.length>0){let o=Hh(i,s.map(a=>Ae(a)));for(let a of o){let d={prefix:" ",body:a.body,bodyStyle:"code",fillRow:!0};a.ansi&&(d.ansi=!0),e.push(d)}}else for(let o of s)e.push({prefix:" ",body:Ae(o),bodyStyle:"dim"});t.resultTruncated&&e.push({prefix:" ",body:"\u2026 (truncated)",bodyStyle:"dim"})}return e}function Wh(t){qh=t>=0?t:0}function il(t,e,n={}){let s=[],r=t.oldRef!==void 0||t.newRef!==void 0,i;if(r){let c=(t.oldRef?.bytes??0)+(t.newRef?.bytes??0);i=` (~${tk(c)})`}else{let c=sk(t),l=[];c.added>0&&l.push(`+${c.added}`),c.removed>0&&l.push(`-${c.removed}`),i=l.length>0?` (${l.join(" ")})`:""}let o=c=>({prefix:" ",body:`${c?"\u25BE":"\u25B8"} Edited ${Ae(je(t.path))}${i}`,bodyStyle:"dim"});if(e==="edit")return t.path&&s.push(o(!1)),s;if(r)return t.path&&(s.push(o(!0)),s.push(n.deferredStatus==="error"?{prefix:" ",body:"\u26A0 failed to load diff",bodyStyle:"tool-status-fail"}:{prefix:" ",body:"\u22EF fetching diff\u2026",bodyStyle:"dim"}),s.unshift({body:""})),s;let a=ol(t,{maxLines:1/0});if(a.length===0)return t.path&&s.push(o(!1)),s;t.path&&s.push(o(!0));let d="```diff\n"+a+"\n```";return s.push(...gs(d)),s.length>0&&s.unshift({body:""}),s}function Jh(t){let e=Qe(t.oldText).split(`
86
+ `),r=!0),{text:s,truncated:r}}function ro(t,e=Date.now()){let n=t.initialTitle,s=t.latestTitle,r=n.toLowerCase(),i=s.toLowerCase(),o;if(s===n||i.includes(r)?o=s:r.includes(i)?o=n:o=`${n} \xB7 ${s}`,t.detail){let d=t.detail,c=o.toLowerCase(),l=d.toLowerCase();(l.startsWith(`${c} `)||l.startsWith(`${c} `))&&(d=d.slice(o.length).trimStart()),d.length>0&&!o.includes(d)&&(o=`${o} \xB7 ${d}`)}if(t.startedAt!==void 0){let d=t.endedAt??e;o=`${o} \xB7 ${In(d-t.startedAt)}`}let a=[{prefix:` ${ik(t.status)} `,prefixStyle:ok(t.status),body:o,bodyStyle:uk(t.status)}];return t.status==="failed"&&t.errorText&&a.push({prefix:" ",body:xe(t.errorText),bodyStyle:"tool-status-fail"}),a}function jh(t){if(t.editDiff!==void 0)return[];let e=[],n=t.detailFull??t.detail;if(n)for(let s of n.split(`
87
+ `))e.push({prefix:" ",body:xe(s),bodyStyle:"dim"});if(t.status==="failed"&&t.errorText&&e.push({prefix:" ",body:xe(t.errorText),bodyStyle:"tool-status-fail"}),t.resultText){let s=t.resultText.split(`
88
+ `),r=t.locations?.[0]?.path??t.detailFull??t.detail,i=ek(r);if(i.length>0){let o=Hh(i,s.map(a=>xe(a)));for(let a of o){let d={prefix:" ",body:a.body,bodyStyle:"code",fillRow:!0};a.ansi&&(d.ansi=!0),e.push(d)}}else for(let o of s)e.push({prefix:" ",body:xe(o),bodyStyle:"dim"});t.resultTruncated&&e.push({prefix:" ",body:"\u2026 (truncated)",bodyStyle:"dim"})}return e}function Wh(t){qh=t>=0?t:0}function il(t,e,n={}){let s=[],r=t.oldRef!==void 0||t.newRef!==void 0,i;if(r){let c=(t.oldRef?.bytes??0)+(t.newRef?.bytes??0);i=` (~${tk(c)})`}else{let c=sk(t),l=[];c.added>0&&l.push(`+${c.added}`),c.removed>0&&l.push(`-${c.removed}`),i=l.length>0?` (${l.join(" ")})`:""}let o=c=>({prefix:" ",body:`${c?"\u25BE":"\u25B8"} Edited ${xe(Ue(t.path))}${i}`,bodyStyle:"dim"});if(e==="edit")return t.path&&s.push(o(!1)),s;if(r)return t.path&&(s.push(o(!0)),s.push(n.deferredStatus==="error"?{prefix:" ",body:"\u26A0 failed to load diff",bodyStyle:"tool-status-fail"}:{prefix:" ",body:"\u22EF fetching diff\u2026",bodyStyle:"dim"}),s.unshift({body:""})),s;let a=ol(t,{maxLines:1/0});if(a.length===0)return t.path&&s.push(o(!1)),s;t.path&&s.push(o(!0));let d="```diff\n"+a+"\n```";return s.push(...gs(d)),s.length>0&&s.unshift({body:""}),s}function Jh(t){let e=Qe(t.oldText).split(`
89
89
  `),n=Qe(t.newText).split(`
90
90
  `);return e.length>0&&e[e.length-1]===""&&e.pop(),n.length>0&&n[n.length-1]===""&&n.pop(),{oldLines:e,newLines:n}}function sk(t){let{oldLines:e,newLines:n}=Jh(t),s=0,r=0;for(let i of zh(e,n))i.op==="+"?s++:i.op==="-"&&r++;return{added:s,removed:r}}function Lh(t){return t.op==="="?` ${t.text}`:t.op==="-"?`- ${t.text}`:`+ ${t.text}`}function ol(t,e={}){let n=e.maxLines??nk,s=e.contextLines??qh,{oldLines:r,newLines:i}=Jh(t),o=zh(r,i),a=[];if(Number.isFinite(s)){if(!o.some(u=>u.op!=="="))return"";let l=new Array(o.length).fill(!1);for(let u=0;u<o.length;u++)if(o[u].op!=="="){let p=Math.max(0,u-s),m=Math.min(o.length-1,u+s);for(let g=p;g<=m;g++)l[g]=!0}let f=0;for(;f<o.length;){if(l[f]){a.push(Lh(o[f])),f++;continue}let u=f;for(;u<o.length&&!l[u];)u++;let p=u-f;a.push(` \u22EF ${p} unchanged line${p===1?"":"s"}`),f=u}}else for(let c of o)a.push(Lh(c));let d=[];for(let c=0;c<a.length;c++){if(d.length>=n-1&&c<a.length-1){let f=a.length-c;d.push(`\u2026 ${f} more line${f===1?"":"s"}`);break}d.push(a[c])}return d.join(`
91
- `)}function zh(t,e){let n=0,s=Math.min(t.length,e.length);for(;n<s&&t[n]===e[n];)n++;let r=t.length,i=e.length;for(;r>n&&i>n&&t[r-1]===e[i-1];)r--,i--;let o=[];for(let a=0;a<n;a++)o.push({op:"=",text:t[a]});o.push(...rk(t.slice(n,r),e.slice(n,i)));for(let a=r;a<t.length;a++)o.push({op:"=",text:t[a]});return o}function rk(t,e){let n=t.length,s=e.length;if(n===0||s===0){let d=[];for(let c of t)d.push({op:"-",text:c});for(let c of e)d.push({op:"+",text:c});return d}let r=Array.from({length:n+1},()=>new Array(s+1).fill(0));for(let d=n-1;d>=0;d--)for(let c=s-1;c>=0;c--)t[d]===e[c]?r[d][c]=r[d+1][c+1]+1:r[d][c]=Math.max(r[d+1][c],r[d][c+1]);let i=[],o=0,a=0;for(;o<n&&a<s;)t[o]===e[a]?(i.push({op:"=",text:t[o]}),o++,a++):r[o+1][a]>=r[o][a+1]?(i.push({op:"-",text:t[o]}),o++):(i.push({op:"+",text:e[a]}),a++);for(;o<n;)i.push({op:"-",text:t[o]}),o++;for(;a<s;)i.push({op:"+",text:e[a]}),a++;return i}function Kh(t){switch(t){case"completed":case"succeeded":case"ok":case"failed":case"error":case"rejected":case"cancelled":return!0;default:return!1}}function ik(t){switch(t){case"completed":case"succeeded":case"ok":return"\u2713";case"failed":case"error":return"\u2717";case"rejected":return"\u2298";case"cancelled":return"\u229D";default:return"\u25D0"}}function ok(t){switch(t){case"completed":case"succeeded":case"ok":return"tool-status-ok";case"failed":case"error":case"rejected":return"tool-status-fail";case"cancelled":return"tool-status-cancelled";default:return"tool-status-running"}}function Vh(t){let e=[{prefix:"\u25A3 ",prefixStyle:"plan",body:"Plan",bodyStyle:"plan"}];e.push(...gs(t.plan));let n=t.status;if(n!==void 0){let s=ak(n);s!==null&&e.push(s)}return e}function ak(t){switch(t){case"completed":case"succeeded":case"ok":return{prefix:" ",body:"\u2713 Approved",bodyStyle:"tool-status-ok"};case"failed":case"error":case"rejected":return{prefix:" ",body:"\u2717 Rejected",bodyStyle:"tool-status-fail"};case"cancelled":return{prefix:" ",body:"\u229D Cancelled",bodyStyle:"tool-status-cancelled"};case"pending":case"in_progress":case"running":case"updated":return{prefix:" ",body:"awaiting approval\u2026",bodyStyle:"dim"};default:return null}}function ck(t,e){let n=t.length;if(e<=0||n<=e)return{start:0,end:n};let s=t.findIndex(c=>(c.status??"pending")==="in_progress"),r=t.findIndex(c=>(c.status??"pending")==="pending"),i=s>=0?s:r>=0?r:n-1,o=Math.floor((e-1)/2),a=Math.max(0,i-o),d=Math.min(n,a+e);return d-a<e&&(a=Math.max(0,d-e)),{start:a,end:d}}function lk(t,e){let n=t.stopped===!0,r=t.amended===!0?"tool-status-cancelled":"tool-status-fail",o=t.entries.every(p=>(p.status??"pending")==="completed")?"plan-done":n?r:"plan",a=t.entries.length,{start:d,end:c}=ck(t.entries,e),l=c-d<a,f="Plan";if(l){let p=0;for(let g of t.entries)(g.status??"pending")==="completed"&&(p+=1);let m=a-p;f=m===0?`Plan \xB7 ${p} done`:`Plan \xB7 ${p} done \xB7 ${m} left`}let u=[{prefix:"\u25A3 ",prefixStyle:o,body:f,bodyStyle:o}];for(let p=d;p<c;p++){let m=t.entries[p];if(!m)continue;let g=m.status??"pending",y=g==="completed"?"[x]":g==="in_progress"?"[~]":"[ ]",v=g==="completed"?"plan-done":g==="in_progress"?n?"plan-pending":"plan":"plan-pending",b=m.content.replace(/^\d+\/\d+\s+/,"").replace(/\s*\(?\d+\/\d+\)?\s*$/,""),k=rl(b,qS(v));u.push({prefix:" ",body:`${y} ${k}`,bodyStyle:v})}return u}function uk(t){switch(t){case"completed":case"succeeded":case"ok":return"tool-status-ok";case"failed":case"error":case"rejected":return"tool-status-fail";case"in_progress":case"running":case"updated":return"tool-status-running";case"cancelled":return"tool-status-cancelled";default:return"tool-status-pending"}}var Dh,JS,zS,He,XS,ZS,nk,qh,dk,ni=q(()=>{"use strict";ge();cs();Dh=6,JS=2,zS=3;He=new US.Instance({level:3}),XS={keyword:He.blueBright,built_in:He.cyan,type:He.cyanBright,literal:He.blue,number:He.greenBright,string:He.yellow,regexp:He.red,comment:He.gray,function:He.yellow,title:He.yellow,class:He.yellowBright,attr:He.cyan,attribute:He.cyan,variable:He.white,params:He.white,meta:He.magenta,symbol:He.magenta,addition:He.greenBright,deletion:He.redBright,section:He.cyan,tag:He.cyan,name:He.cyanBright};ZS={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".json":"json",".jsonc":"json",".py":"python",".rb":"ruby",".go":"go",".rs":"rust",".java":"java",".kt":"kotlin",".kts":"kotlin",".c":"c",".h":"c",".cc":"cpp",".cpp":"cpp",".cxx":"cpp",".hpp":"cpp",".hh":"cpp",".cs":"csharp",".swift":"swift",".m":"objectivec",".mm":"objectivec",".php":"php",".scala":"scala",".sh":"bash",".bash":"bash",".zsh":"bash",".fish":"bash",".ps1":"powershell",".sql":"sql",".html":"xml",".htm":"xml",".xml":"xml",".svg":"xml",".css":"css",".scss":"scss",".sass":"scss",".less":"less",".yaml":"yaml",".yml":"yaml",".toml":"ini",".ini":"ini",".md":"markdown",".markdown":"markdown",".lua":"lua",".pl":"perl",".pm":"perl",".r":"r",".dart":"dart",".ex":"elixir",".exs":"elixir",".erl":"erlang",".hs":"haskell",".clj":"clojure",".cljs":"clojure",".vim":"vim",".dockerfile":"dockerfile",".diff":"diff",".patch":"diff",".tf":"terraform",".proto":"protobuf",".graphql":"graphql",".gql":"graphql",".el":"lisp"};nk=40,qh=Number.POSITIVE_INFINITY;dk=5});import{highlight as fk,supportsLanguage as pk}from"cli-highlight";async function Gh(t,e={}){t||(process.stderr.write(`Usage: hydra-acp session diff <session-id> [--json] [--no-color]
91
+ `)}function zh(t,e){let n=0,s=Math.min(t.length,e.length);for(;n<s&&t[n]===e[n];)n++;let r=t.length,i=e.length;for(;r>n&&i>n&&t[r-1]===e[i-1];)r--,i--;let o=[];for(let a=0;a<n;a++)o.push({op:"=",text:t[a]});o.push(...rk(t.slice(n,r),e.slice(n,i)));for(let a=r;a<t.length;a++)o.push({op:"=",text:t[a]});return o}function rk(t,e){let n=t.length,s=e.length;if(n===0||s===0){let d=[];for(let c of t)d.push({op:"-",text:c});for(let c of e)d.push({op:"+",text:c});return d}let r=Array.from({length:n+1},()=>new Array(s+1).fill(0));for(let d=n-1;d>=0;d--)for(let c=s-1;c>=0;c--)t[d]===e[c]?r[d][c]=r[d+1][c+1]+1:r[d][c]=Math.max(r[d+1][c],r[d][c+1]);let i=[],o=0,a=0;for(;o<n&&a<s;)t[o]===e[a]?(i.push({op:"=",text:t[o]}),o++,a++):r[o+1][a]>=r[o][a+1]?(i.push({op:"-",text:t[o]}),o++):(i.push({op:"+",text:e[a]}),a++);for(;o<n;)i.push({op:"-",text:t[o]}),o++;for(;a<s;)i.push({op:"+",text:e[a]}),a++;return i}function Kh(t){switch(t){case"completed":case"succeeded":case"ok":case"failed":case"error":case"rejected":case"cancelled":return!0;default:return!1}}function ik(t){switch(t){case"completed":case"succeeded":case"ok":return"\u2713";case"failed":case"error":return"\u2717";case"rejected":return"\u2298";case"cancelled":return"\u229D";default:return"\u25D0"}}function ok(t){switch(t){case"completed":case"succeeded":case"ok":return"tool-status-ok";case"failed":case"error":case"rejected":return"tool-status-fail";case"cancelled":return"tool-status-cancelled";default:return"tool-status-running"}}function Vh(t){let e=[{prefix:"\u25A3 ",prefixStyle:"plan",body:"Plan",bodyStyle:"plan"}];e.push(...gs(t.plan));let n=t.status;if(n!==void 0){let s=ak(n);s!==null&&e.push(s)}return e}function ak(t){switch(t){case"completed":case"succeeded":case"ok":return{prefix:" ",body:"\u2713 Approved",bodyStyle:"tool-status-ok"};case"failed":case"error":case"rejected":return{prefix:" ",body:"\u2717 Rejected",bodyStyle:"tool-status-fail"};case"cancelled":return{prefix:" ",body:"\u229D Cancelled",bodyStyle:"tool-status-cancelled"};case"pending":case"in_progress":case"running":case"updated":return{prefix:" ",body:"awaiting approval\u2026",bodyStyle:"dim"};default:return null}}function ck(t,e){let n=t.length;if(e<=0||n<=e)return{start:0,end:n};let s=t.findIndex(c=>(c.status??"pending")==="in_progress"),r=t.findIndex(c=>(c.status??"pending")==="pending"),i=s>=0?s:r>=0?r:n-1,o=Math.floor((e-1)/2),a=Math.max(0,i-o),d=Math.min(n,a+e);return d-a<e&&(a=Math.max(0,d-e)),{start:a,end:d}}function lk(t,e){let n=t.stopped===!0,r=t.amended===!0?"tool-status-cancelled":"tool-status-fail",o=t.entries.every(p=>(p.status??"pending")==="completed")?"plan-done":n?r:"plan",a=t.entries.length,{start:d,end:c}=ck(t.entries,e),l=c-d<a,f="Plan";if(l){let p=0;for(let g of t.entries)(g.status??"pending")==="completed"&&(p+=1);let m=a-p;f=m===0?`Plan \xB7 ${p} done`:`Plan \xB7 ${p} done \xB7 ${m} left`}let u=[{prefix:"\u25A3 ",prefixStyle:o,body:f,bodyStyle:o}];for(let p=d;p<c;p++){let m=t.entries[p];if(!m)continue;let g=m.status??"pending",y=g==="completed"?"[x]":g==="in_progress"?"[~]":"[ ]",v=g==="completed"?"plan-done":g==="in_progress"?n?"plan-pending":"plan":"plan-pending",b=m.content.replace(/^\d+\/\d+\s+/,"").replace(/\s*\(?\d+\/\d+\)?\s*$/,""),k=rl(b,qS(v));u.push({prefix:" ",body:`${y} ${k}`,bodyStyle:v})}return u}function uk(t){switch(t){case"completed":case"succeeded":case"ok":return"tool-status-ok";case"failed":case"error":case"rejected":return"tool-status-fail";case"in_progress":case"running":case"updated":return"tool-status-running";case"cancelled":return"tool-status-cancelled";default:return"tool-status-pending"}}var Dh,JS,zS,De,XS,ZS,nk,qh,dk,ni=J(()=>{"use strict";ge();cs();Dh=6,JS=2,zS=3;De=new US.Instance({level:3}),XS={keyword:De.blueBright,built_in:De.cyan,type:De.cyanBright,literal:De.blue,number:De.greenBright,string:De.yellow,regexp:De.red,comment:De.gray,function:De.yellow,title:De.yellow,class:De.yellowBright,attr:De.cyan,attribute:De.cyan,variable:De.white,params:De.white,meta:De.magenta,symbol:De.magenta,addition:De.greenBright,deletion:De.redBright,section:De.cyan,tag:De.cyan,name:De.cyanBright};ZS={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".json":"json",".jsonc":"json",".py":"python",".rb":"ruby",".go":"go",".rs":"rust",".java":"java",".kt":"kotlin",".kts":"kotlin",".c":"c",".h":"c",".cc":"cpp",".cpp":"cpp",".cxx":"cpp",".hpp":"cpp",".hh":"cpp",".cs":"csharp",".swift":"swift",".m":"objectivec",".mm":"objectivec",".php":"php",".scala":"scala",".sh":"bash",".bash":"bash",".zsh":"bash",".fish":"bash",".ps1":"powershell",".sql":"sql",".html":"xml",".htm":"xml",".xml":"xml",".svg":"xml",".css":"css",".scss":"scss",".sass":"scss",".less":"less",".yaml":"yaml",".yml":"yaml",".toml":"ini",".ini":"ini",".md":"markdown",".markdown":"markdown",".lua":"lua",".pl":"perl",".pm":"perl",".r":"r",".dart":"dart",".ex":"elixir",".exs":"elixir",".erl":"erlang",".hs":"haskell",".clj":"clojure",".cljs":"clojure",".vim":"vim",".dockerfile":"dockerfile",".diff":"diff",".patch":"diff",".tf":"terraform",".proto":"protobuf",".graphql":"graphql",".gql":"graphql",".el":"lisp"};nk=40,qh=Number.POSITIVE_INFINITY;dk=5});import{highlight as fk,supportsLanguage as pk}from"cli-highlight";async function Gh(t,e={}){t||(process.stderr.write(`Usage: hydra-acp session diff <session-id> [--json] [--no-color]
92
92
  `),process.exit(2));let n=e.fold===!0?"?fold=true":"",s=await Re(`/v1/sessions/${encodeURIComponent(t)}/diff${n}`),r;if(s.ok)r=s.body;else if(s.status===404){let c=(await Re(`/v1/sessions/${encodeURIComponent(t)}/export`,{expectStatus:200})).body,l;try{l=Gt(c)}catch(u){process.stderr.write(`Failed to decode session bundle: ${u.message}
93
93
  `),process.exit(1)}let f=Hr(l.history);r=e.fold===!0?f.map(u=>({...u,hunks:Ur(u.hunks)})):f}else process.stderr.write(`Daemon returned HTTP ${s.status}
94
94
  `),process.exit(1);if(e.json){process.stdout.write(JSON.stringify(r,null,2)+`
@@ -99,19 +99,19 @@ Use empty arrays/strings where a field doesn't apply.`});import*as Lr from"fs/pr
99
99
  `)+`
100
100
 
101
101
  `;return!e||!pk("diff")?i:fk(i,{language:"diff"})}function Yh(t){if(t.length===0)return 0;let e=t.split(`
102
- `);return e[e.length-1]===""&&e.pop(),e.length}var dl=q(()=>{"use strict";ps();Ws();Ra();ni();nl()});async function Qh(t,e={}){t||(process.stderr.write(`Usage: hydra-acp sessions info <session-id> [--verbose] [--json] [--diff] [--fold] [--no-color] [--no-pager]
102
+ `);return e[e.length-1]===""&&e.pop(),e.length}var dl=J(()=>{"use strict";ps();Ws();Ra();ni();nl()});async function Qh(t,e={}){t||(process.stderr.write(`Usage: hydra-acp sessions info <session-id> [--verbose] [--json] [--diff] [--fold] [--no-color] [--no-pager]
103
103
  `),process.exit(2));let n=await Re(`/v1/sessions/${encodeURIComponent(t)}`,{expectStatus:[200,404]}),s=n.status===200?n.body.status:void 0,i=(await Re(`/v1/sessions/${encodeURIComponent(t)}/export`,{expectStatus:200})).body,o;try{o=Gt(i)}catch(u){process.stderr.write(`Failed to decode session bundle: ${u.message}
104
104
  `),process.exit(1)}let a=ul(o,s??"cold"),d=e.diff===!0,c=null;if(d){let u=Hr(o.history);c=e.fold===!0?u.map(p=>({...p,hunks:Ur(p.hunks)})):u}if(e.json){let u={...a};c!==null&&(u.diff=c),process.stdout.write(JSON.stringify(u,null,2)+`
105
105
  `);return}let l=process.stdout.isTTY===!0,f=!e.noColor&&l;if(d){let u=Ya({disabled:e.noPager===!0});u.stream.write(Za(a,e.verbose===!0)),u.stream.write(`
106
106
  `),u.stream.write(al(c??[],f)),await u.flush();return}process.stdout.write(Za(a,e.verbose===!0))}function ul(t,e){let n=t.session,s=t.history,r=Jf(s),i=xc(s),o=Ac(s),a=n.currentUsage,d=Date.parse(n.createdAt),c=Date.parse(n.updatedAt),l=Number.isFinite(d)&&Number.isFinite(c)?c-d:null;return{sessionId:n.sessionId,...n.upstreamSessionId!==void 0?{upstreamSessionId:n.upstreamSessionId}:{},...n.title!==void 0?{title:n.title}:{},cwd:n.cwd,agentId:n.agentId,...n.currentModel!==void 0?{currentModel:n.currentModel}:{},status:e,createdAt:n.createdAt,updatedAt:n.updatedAt,synopsis:n.synopsis??null,summarizedThroughEntry:n.summarizedThroughEntry??null,turns:r,tools:i,files:o,cost:{amount:a?.costAmount??null,currency:a?.costCurrency??null,cumulative:a?.cumulativeCost??null,inputTokens:a?.used??null,outputTokens:a?.size??null},duration:{totalMs:l},historyEntries:s.length}}function Za(t,e){let n=[],s=a=>a.padEnd(14);n.push(`${s("Session:")}${t.sessionId}`),t.upstreamSessionId&&n.push(`${s("Upstream:")}${t.upstreamSessionId}`),t.title&&n.push(`${s("Title:")}${t.title}`),n.push(`${s("Cwd:")}${t.cwd}`);let r=t.currentModel?` \xB7 ${t.currentModel}`:"";n.push(`${s("Agent:")}${t.agentId}${r}`),n.push(`${s("Status:")}${t.status}`),n.push(`${s("Created:")}${t.createdAt}`),n.push(`${s("Last active:")}${t.updatedAt}`),t.duration.totalMs!==null&&n.push(`${s("Duration:")}${wk(t.duration.totalMs)}`),n.push(`${s("Turns:")}${t.turns}`);let i=[];if(t.cost.amount!==null){let a=t.cost.currency??"USD";i.push(`${a} ${t.cost.amount.toFixed(4)}`)}else if(t.cost.cumulative!==null){let a=t.cost.currency??"USD";i.push(`${a} ${t.cost.cumulative.toFixed(4)} (cumulative)`)}if(t.cost.inputTokens!==null||t.cost.outputTokens!==null){let a=[];t.cost.inputTokens!==null&&a.push(`${t.cost.inputTokens.toLocaleString()} in`),t.cost.outputTokens!==null&&a.push(`${t.cost.outputTokens.toLocaleString()} out`),i.push(a.join(" / "))}if(i.length>0&&n.push(`${s("Cost:")}${i.join(" | ")}`),t.synopsis){n.push(""),n.push("Synopsis:");let a=" ",d=c=>c.padEnd(22);if(t.synopsis.goal&&n.push(`${a}${d("Goal:")}${t.synopsis.goal}`),t.synopsis.outcome&&n.push(`${a}${d("Outcome:")}${t.synopsis.outcome}`),t.synopsis.rejected_approaches&&t.synopsis.rejected_approaches.length>0){n.push(`${a}${d("Rejected approaches:")}`);for(let c of t.synopsis.rejected_approaches)n.push(`${a} - ${c}`)}if(t.synopsis.open_threads&&t.synopsis.open_threads.length>0){n.push(`${a}${d("Open threads:")}`);for(let c of t.synopsis.open_threads)n.push(`${a} - ${c}`)}}else n.push(""),n.push("Synopsis: (none yet \u2014 generated on idle-close or daemon shutdown)");if(t.tools.length>0){n.push("");let a=t.tools.reduce((l,f)=>l+f.count,0);n.push(`Tools (${a} calls):`);let d=e?t.tools:t.tools.slice(0,cl),c=Math.max(...d.map(l=>l.name.length),4);for(let l of d)n.push(` ${l.name.padEnd(c)} ${l.count}`);!e&&t.tools.length>cl&&n.push(` ... ${t.tools.length-cl} more (use --verbose to see all)`)}let o=e?t.files:t.files.map(a=>{let d=a.byTool.filter(l=>yk.has(l.name)),c=d.reduce((l,f)=>l+f.count,0);return{path:a.path,count:c,byTool:d}}).filter(a=>a.count>0);if(o.length>0){n.push("");let a=e?"Files touched":"Files edited";n.push(`${a} (${o.length}):`);let d=e?o:o.slice(0,ll),c=Math.max(...d.map(l=>l.path.length),4);for(let l of d)if(e){let f=l.byTool.map(u=>`${u.name}\xD7${u.count}`).join(", ");n.push(` ${l.path.padEnd(c)} ${l.count} (${f})`)}else n.push(` ${l.path.padEnd(c)} ${l.count}`);!e&&o.length>ll&&n.push(` ... ${o.length-ll} more (use --verbose to see all)`)}return n.join(`
107
107
  `)+`
108
- `}function wk(t){if(t<0)return"0s";let e=Math.floor(t/1e3),n=Math.floor(e/86400),s=Math.floor(e%86400/3600),r=Math.floor(e%3600/60),i=e%60,o=[];return n>0&&o.push(`${n}d`),s>0&&o.push(`${s}h`),r>0&&o.push(`${r}m`),(o.length===0||i>0)&&o.push(`${i}s`),o.join(" ")}var cl,ll,yk,fl=q(()=>{"use strict";ps();Ws();Cc();Ra();nl();dl();cl=10,ll=15,yk=new Set(["Edit","MultiEdit","Write","NotebookEdit"])});var nd,Hn,ri,io,xm,oo,yl,sd,Zs,Am,er,Cm,tr,Rm,nr,ii,oi,Tm,ai,Em,Pm,Mm,wl,_m,$m,ao=q(()=>{"use strict";nd="\x1B[?2004h",Hn="\x1B[?2004l",ri="\x1B[200~",io="\x1B[201~",xm="\x1B[?1049l",oo="\x1B[?7h",yl="\x1B[?7l",sd="\x1B[?25h",Zs="\x1B[?1l",Am="\x1B[>1u",er="\x1B[<u",Cm="\x1B[>4;2m",tr="\x1B[>4;0m",Rm="\x1B[>5;1m",nr="\x1B[>5;0m",ii="\x1B[?1000l",oi="\x1B[?1002l",Tm="\x1B[?1003l",ai="\x1B[?1006l",Em="\x1B[?1015l",Pm="\x1B[?w",Mm="\x1B[=24;1w",wl="\x1B[=0;0w",_m="\x1B[?2026h",$m="\x1B[?2026l"});function Un(){process.stdout.write(er),process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(ii),process.stdout.write(oi),process.stdout.write(ai),process.stdout.write(Zs),process.stdout.write("\x1B>")}function Xt(t){return t.width??80}function sr(t){return t.height??24}function jn(t,e){let n=Xt(t),s=sr(t),r=e.contentWidth??vk,i=Math.max(10,n-4),o=Math.min(r,i),a=o+2,d=Math.max(1,Math.min(e.contentHeight,s-4)),c=d+2,l=Math.max(1,Math.floor((n-a)/2)+1),f=Math.max(1,Math.floor((s-c)/2)+1);t.moveTo(1,1).eraseDisplayBelow();let u=Om.repeat(a-2),p=Ak(u,e.title);t.moveTo(l,f),t.dim.noFormat(Ik),Ck(t,p),t.dim.noFormat(Sk);for(let m=1;m<=d;m++)t.moveTo(l,f+m),t.dim.noFormat(Fm),t.moveTo(l+a-1,f+m),t.dim.noFormat(Fm);return t.moveTo(l,f+c-1),t.dim.noFormat(kk+Om.repeat(a-2)+xk),{x:l,y:f,w:a,h:c,contentX:l+1,contentY:f+1,contentW:o,contentH:d}}function Ak(t,e){if(!e)return{dashes:t};let n=` ${e} `;if(n.length+4>t.length)return{dashes:t};let s=2;return{dashes:t.slice(0,s)+" ".repeat(n.length)+t.slice(s+n.length),title:{offset:s,text:n}}}function Ck(t,e){if(!e.title){t.dim.noFormat(e.dashes);return}t.dim.noFormat(e.dashes.slice(0,e.title.offset)),t.brightCyan.noFormat(e.title.text),t.dim.noFormat(e.dashes.slice(e.title.offset+e.title.text.length))}function Xe(t,e){return e<=1?"":t.length<=e?t:t.slice(0,Math.max(0,e-1))+"\u2026"}function rd(t,e){return t.length>=e?t.slice(0,e):t+" ".repeat(e-t.length)}async function ys(t){let{term:e,render:n,onKey:s,onResize:r}=t,i=t.hideCursor!==!1;return n(),i&&e.hideCursor(),await new Promise(o=>{let a=!1,d=()=>{a||(r??n)()},c=(u,p,m)=>{a||s(u,p,m,f)},l=()=>{a||(a=!0,e.off("key",c),e.off("resize",d),e.grabInput(!1),e.hideCursor(!1),e.moveTo(1,1).eraseDisplayBelow())},f=u=>{l(),o(u)};e.grabInput({}),e.on("key",c),e.on("resize",d)})}var vk,Om,Fm,Ik,Sk,kk,xk,ci=q(()=>{"use strict";ao();vk=64,Om="\u2500",Fm="\u2502",Ik="\u250C",Sk="\u2510",kk="\u2514",xk="\u2518"});function Lm(t){let e=(t.name&&t.name.length>0?t.name:void 0)??(t.description&&t.description.length>0?t.description:void 0);return e?`${e} (${t.id})`:t.id}function Ek(t,e,n){let s={title:`Agent "${t}" needs to be set up`,description:e?.description??Rk,footer:Tk};if(e?.command&&(s.command=e.command),e?.url&&(s.url=e.url),n&&n.length>0){s.authMethods=n;let r=n.map((d,c)=>({index:c,label:`[${c+1}] ${Lm(d)}`,method:d}));s.methodLines=r;let i=Math.min(n.length,9),o=i===1?"[1]":`[1\u2026${i}]`,a=n.length===1?" \xB7 [Enter] choose":"";s.footer=`${o} choose method${a} \xB7 [r] retry \xB7 [Esc] back`}return s}function Pk(t,e,n=0){if(t==="CTRL_C"||t==="CTRL_D")return{kind:"cancel"};if(t==="ESCAPE")return{kind:"back"};if(t==="ENTER"||t==="KP_ENTER")return n===1?{kind:"selectMethod",index:0}:{kind:"retry"};if(e?.isCharacter&&/^[1-9]$/.test(t)){let s=Number(t)-1;return s<n?{kind:"selectMethod",index:s}:{kind:"ignore"}}return e?.isCharacter&&t.toLowerCase()==="r"?{kind:"retry"}:{kind:"ignore"}}function Mk(t){return typeof t!="object"||t===null?!1:t.code===D.AuthRequired}function Bm(t){if(typeof t!="object"||t===null)return;let e=t.data;if(typeof e!="object"||e===null)return;let n=e._meta;if(typeof n!="object"||n===null)return;let s=n[lt];if(!(typeof s!="object"||s===null))return s}function _k(t){let e=Bm(t);if(!e)return;let n=e.agentId;return typeof n=="string"?n:void 0}function $k(t){let e=Bm(t);if(!e)return;let n=e.authMethods;if(!Array.isArray(n))return;let s=[];for(let r of n){if(typeof r!="object"||r===null)continue;let i=r.id;if(typeof i!="string"||i.length===0)continue;let o=r.description,a=r.type,d=r.name,c=r._meta,l={id:i,description:typeof o=="string"?o:""};(a==="agent"||a==="terminal")&&(l.type=a),typeof d=="string"&&(l.name=d),c!==null&&typeof c=="object"&&!Array.isArray(c)&&(l._meta=c),s.push(l)}return s.length>0?s:void 0}async function Nm(t){for(;;)try{return{kind:"ok",result:await t.request()}}catch(e){if(!Mk(e))throw e;let n=_k(e)??t.fallbackAgentId??"",s=$k(e),r=await t.resolveOnboarding(n),i=await t.showBanner(n,r,s);if(i==="back")return{kind:"back"};if(i==="cancel")return{kind:"cancel"}}}async function Ok(t,e,n){t.grabInput(!1),Un(),t.moveTo(1,1).eraseDisplayBelow();let s=`\u2500 Running ${e.command} ${e.args.join(" ")} \u2014 finish setup, then return to hydra \u2500`;process.stdout.write(s+`
108
+ `}function wk(t){if(t<0)return"0s";let e=Math.floor(t/1e3),n=Math.floor(e/86400),s=Math.floor(e%86400/3600),r=Math.floor(e%3600/60),i=e%60,o=[];return n>0&&o.push(`${n}d`),s>0&&o.push(`${s}h`),r>0&&o.push(`${r}m`),(o.length===0||i>0)&&o.push(`${i}s`),o.join(" ")}var cl,ll,yk,fl=J(()=>{"use strict";ps();Ws();Cc();Ra();nl();dl();cl=10,ll=15,yk=new Set(["Edit","MultiEdit","Write","NotebookEdit"])});var nd,Hn,ri,io,xm,oo,yl,sd,Zs,Am,er,Cm,tr,Rm,nr,ii,oi,Tm,ai,Em,Pm,Mm,wl,_m,$m,ao=J(()=>{"use strict";nd="\x1B[?2004h",Hn="\x1B[?2004l",ri="\x1B[200~",io="\x1B[201~",xm="\x1B[?1049l",oo="\x1B[?7h",yl="\x1B[?7l",sd="\x1B[?25h",Zs="\x1B[?1l",Am="\x1B[>1u",er="\x1B[<u",Cm="\x1B[>4;2m",tr="\x1B[>4;0m",Rm="\x1B[>5;1m",nr="\x1B[>5;0m",ii="\x1B[?1000l",oi="\x1B[?1002l",Tm="\x1B[?1003l",ai="\x1B[?1006l",Em="\x1B[?1015l",Pm="\x1B[?w",Mm="\x1B[=24;1w",wl="\x1B[=0;0w",_m="\x1B[?2026h",$m="\x1B[?2026l"});function Un(){process.stdout.write(er),process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(ii),process.stdout.write(oi),process.stdout.write(ai),process.stdout.write(Zs),process.stdout.write("\x1B>")}function Xt(t){return t.width??80}function sr(t){return t.height??24}function jn(t,e){let n=Xt(t),s=sr(t),r=e.contentWidth??vk,i=Math.max(10,n-4),o=Math.min(r,i),a=o+2,d=Math.max(1,Math.min(e.contentHeight,s-4)),c=d+2,l=Math.max(1,Math.floor((n-a)/2)+1),f=Math.max(1,Math.floor((s-c)/2)+1);t.moveTo(1,1).eraseDisplayBelow();let u=Om.repeat(a-2),p=Ak(u,e.title);t.moveTo(l,f),t.dim.noFormat(Ik),Ck(t,p),t.dim.noFormat(Sk);for(let m=1;m<=d;m++)t.moveTo(l,f+m),t.dim.noFormat(Fm),t.moveTo(l+a-1,f+m),t.dim.noFormat(Fm);return t.moveTo(l,f+c-1),t.dim.noFormat(kk+Om.repeat(a-2)+xk),{x:l,y:f,w:a,h:c,contentX:l+1,contentY:f+1,contentW:o,contentH:d}}function Ak(t,e){if(!e)return{dashes:t};let n=` ${e} `;if(n.length+4>t.length)return{dashes:t};let s=2;return{dashes:t.slice(0,s)+" ".repeat(n.length)+t.slice(s+n.length),title:{offset:s,text:n}}}function Ck(t,e){if(!e.title){t.dim.noFormat(e.dashes);return}t.dim.noFormat(e.dashes.slice(0,e.title.offset)),t.brightCyan.noFormat(e.title.text),t.dim.noFormat(e.dashes.slice(e.title.offset+e.title.text.length))}function Xe(t,e){return e<=1?"":t.length<=e?t:t.slice(0,Math.max(0,e-1))+"\u2026"}function rd(t,e){return t.length>=e?t.slice(0,e):t+" ".repeat(e-t.length)}async function ys(t){let{term:e,render:n,onKey:s,onResize:r}=t,i=t.hideCursor!==!1;return n(),i&&e.hideCursor(),await new Promise(o=>{let a=!1,d=()=>{a||(r??n)()},c=(u,p,m)=>{a||s(u,p,m,f)},l=()=>{a||(a=!0,e.off("key",c),e.off("resize",d),e.grabInput(!1),e.hideCursor(!1),e.moveTo(1,1).eraseDisplayBelow())},f=u=>{l(),o(u)};e.grabInput({}),e.on("key",c),e.on("resize",d)})}var vk,Om,Fm,Ik,Sk,kk,xk,ci=J(()=>{"use strict";ao();vk=64,Om="\u2500",Fm="\u2502",Ik="\u250C",Sk="\u2510",kk="\u2514",xk="\u2518"});function Lm(t){let e=(t.name&&t.name.length>0?t.name:void 0)??(t.description&&t.description.length>0?t.description:void 0);return e?`${e} (${t.id})`:t.id}function Ek(t,e,n){let s={title:`Agent "${t}" needs to be set up`,description:e?.description??Rk,footer:Tk};if(e?.command&&(s.command=e.command),e?.url&&(s.url=e.url),n&&n.length>0){s.authMethods=n;let r=n.map((d,c)=>({index:c,label:`[${c+1}] ${Lm(d)}`,method:d}));s.methodLines=r;let i=Math.min(n.length,9),o=i===1?"[1]":`[1\u2026${i}]`,a=n.length===1?" \xB7 [Enter] choose":"";s.footer=`${o} choose method${a} \xB7 [r] retry \xB7 [Esc] back`}return s}function Pk(t,e,n=0){if(t==="CTRL_C"||t==="CTRL_D")return{kind:"cancel"};if(t==="ESCAPE")return{kind:"back"};if(t==="ENTER"||t==="KP_ENTER")return n===1?{kind:"selectMethod",index:0}:{kind:"retry"};if(e?.isCharacter&&/^[1-9]$/.test(t)){let s=Number(t)-1;return s<n?{kind:"selectMethod",index:s}:{kind:"ignore"}}return e?.isCharacter&&t.toLowerCase()==="r"?{kind:"retry"}:{kind:"ignore"}}function Mk(t){return typeof t!="object"||t===null?!1:t.code===D.AuthRequired}function Bm(t){if(typeof t!="object"||t===null)return;let e=t.data;if(typeof e!="object"||e===null)return;let n=e._meta;if(typeof n!="object"||n===null)return;let s=n[lt];if(!(typeof s!="object"||s===null))return s}function _k(t){let e=Bm(t);if(!e)return;let n=e.agentId;return typeof n=="string"?n:void 0}function $k(t){let e=Bm(t);if(!e)return;let n=e.authMethods;if(!Array.isArray(n))return;let s=[];for(let r of n){if(typeof r!="object"||r===null)continue;let i=r.id;if(typeof i!="string"||i.length===0)continue;let o=r.description,a=r.type,d=r.name,c=r._meta,l={id:i,description:typeof o=="string"?o:""};(a==="agent"||a==="terminal")&&(l.type=a),typeof d=="string"&&(l.name=d),c!==null&&typeof c=="object"&&!Array.isArray(c)&&(l._meta=c),s.push(l)}return s.length>0?s:void 0}async function Nm(t){for(;;)try{return{kind:"ok",result:await t.request()}}catch(e){if(!Mk(e))throw e;let n=_k(e)??t.fallbackAgentId??"",s=$k(e),r=await t.resolveOnboarding(n),i=await t.showBanner(n,r,s);if(i==="back")return{kind:"back"};if(i==="cancel")return{kind:"cancel"}}}async function Ok(t,e,n){t.grabInput(!1),Un(),t.moveTo(1,1).eraseDisplayBelow();let s=`\u2500 Running ${e.command} ${e.args.join(" ")} \u2014 finish setup, then return to hydra \u2500`;process.stdout.write(s+`
109
109
  `);let r=n?.spawn??(await import("child_process")).spawn;return await new Promise(i=>{let o=()=>{try{t.grabInput({})}catch{}};try{let a=r(e.command,e.args,{stdio:"inherit",env:e.env,cwd:e.cwd});a.on("exit",d=>{o(),i({exitCode:d})}),a.on("error",d=>{o(),process.stdout.write(`
110
110
  failed to spawn ${e.command}: ${d.message}
111
111
  `),i({exitCode:-1})})}catch(a){o(),process.stdout.write(`
112
112
  failed to spawn ${e.command}: ${a.message}
113
- `),i({exitCode:-1})}})}function Fk(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.kind==="terminal"&&typeof e.command=="string"&&Array.isArray(e.args)}async function bl(t,e){let n;try{n=await e.authenticate(t.id)}catch(s){return{kind:"error",message:s instanceof Error&&s.message.length>0?s.message:String(s)}}if(Fk(n)){let s={command:n.command,args:n.args,env:n.env,cwd:n.cwd},r=await e.runTerminalAuth(s);return r.exitCode===0?{kind:"terminal-completed"}:{kind:"exit-nonzero",exitCode:r.exitCode}}return{kind:"retry"}}async function Dm(t,e,n,s,r){Un();let i=Ek(e,n,s),o=!1,a,d,c=()=>{let f=4;i.command&&f++,i.url&&f++,i.methodLines&&(f+=1+i.methodLines.length),a&&f++,d&&f++;let u=jn(t,{contentHeight:f,contentWidth:80,title:"Authentication required"}),p=u.contentW,m=0;if(a&&(t.moveTo(u.contentX,u.contentY+m),t.brightYellow.noFormat(Xe(` ${a}`,p)),m++),d&&(t.moveTo(u.contentX,u.contentY+m),t.brightRed.noFormat(Xe(` ${d}`,p)),m++),t.moveTo(u.contentX,u.contentY+m),t.brightWhite.bold.noFormat(Xe(` ${i.title}`,p)),m+=2,t.moveTo(u.contentX,u.contentY+m),t.noFormat(Xe(` ${i.description}`,p)),m++,i.command&&(t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" Run: "),t.brightWhite.noFormat(Xe(i.command,p-7)),m++),i.url&&(t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" Docs: "),t.brightWhite.noFormat(Xe(i.url,p-7)),m++),i.methodLines){t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" Methods reported by the agent:"),m++;for(let g of i.methodLines)t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" "),t.noFormat(Xe(g.label,p-3)),m++}return m++,t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(` ${i.footer}`),u},l=i.methodLines?.length??0;return ys({term:t,render:()=>{c()},onKey:(f,u,p,m)=>{if(o)return;let g=Pk(f,p,l);if(g.kind!=="ignore"){if(g.kind==="retry"||g.kind==="back"||g.kind==="cancel"){m(g.kind);return}if(g.kind==="selectMethod"){let y=i.methodLines?.[g.index]?.method;if(!y||!r?.authenticate)return;o=!0,d=void 0,a=`Authenticating with ${Lm(y)}\u2026`,c();let v=r.runTerminalAuth??(b=>Ok(t,b));(async()=>{let b=await bl(y,{authenticate:r.authenticate,runTerminalAuth:v});if(b.kind==="terminal-completed"){m("terminal-completed");return}if(b.kind==="retry"){m("retry");return}if(b.kind==="error"){d=b.message,a=void 0,o=!1,c();return}a=void 0,d=`auth process exited with code ${b.exitCode??"(signal)"}`,o=!1,c()})()}}}})}var Rk,Tk,vl=q(()=>{"use strict";Jo();Ko();ci();Rk="This agent requires authentication before use.",Tk="[r] retry \xB7 [Esc] back to picker"});import{setTimeout as Wm}from"timers/promises";function Wk(t){return!("method"in t)&&"id"in t&&t.id!==void 0}var Hk,Uk,jk,qk,li,Il=q(()=>{"use strict";eo();qr();Hk=200,Uk=5e3,jk=2,qk=60,li=class{constructor(e){this.opts=e}opts;current;outboundQueue=[];flushing=!1;messageHandlers=[];closeHandlers=[];destroyed=!1;firstConnect=!0;reconnectInFlight;connectGate;releaseConnectGate;pendingRequests=new Map;async start(){await this.connectWithRetry()}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}async send(e){if(this.destroyed)throw new Error("resilient ws stream is destroyed");if(this.connectGate||!this.current||this.flushing){this.outboundQueue.push(e);return}this.outboundQueue.push(e),await this.flushQueue()}async request(e){if(this.destroyed)throw new Error("resilient ws stream is destroyed");if(!this.current)throw new Error("resilient ws stream not connected");let n=e.id,s=new Promise((r,i)=>{this.pendingRequests.set(n,{resolve:r,reject:i})});try{await this.current.send(e)}catch(r){throw this.pendingRequests.delete(n),r}return s}async close(){if(this.destroyed=!0,this.reconnectInFlight&&await Promise.race([this.reconnectInFlight.catch(()=>{}),Wm(2e3)]),this.current&&await this.current.close().catch(()=>{}),this.pendingRequests.size>0){let e=new Error("resilient ws stream is destroyed");for(let{reject:n}of this.pendingRequests.values())n(e);this.pendingRequests.clear()}for(let e of this.closeHandlers)e()}async connectWithRetry(){let e=0,n=Hk;for(;!this.destroyed;)try{let s=await Gs(this.opts.url,this.opts.subprotocols);this.bindStream(wn(s));let r=this.firstConnect;this.firstConnect=!1,this.connectGate=new Promise(i=>{this.releaseConnectGate=i});try{if(this.opts.onConnect)try{await this.opts.onConnect(r)}catch(i){this.log(`hydra-acp: post-connect handler failed: ${i.message}`)}}finally{this.releaseConnectGate?.(),this.releaseConnectGate=void 0,this.connectGate=void 0}await this.flushQueue();return}catch(s){if(e+=1,this.opts.onConnectFailure&&this.opts.onConnectFailure(s),e>=qk)throw new Error(`hydra-acp: gave up reconnecting after ${e} attempts: ${s.message}`);if(this.log(`hydra-acp: connect attempt ${e} failed (${s.message}); retrying in ${n}ms`),await Wm(n),this.destroyed)return;n=Math.min(n*jk,Uk)}}bindStream(e){this.current=e,e.onMessage(n=>{if(Wk(n)&&n.id!==null){let s=this.pendingRequests.get(n.id);s&&(this.pendingRequests.delete(n.id),s.resolve(n))}for(let s of this.messageHandlers)s(n)}),e.onClose(n=>{if(!this.destroyed){if(this.current=void 0,this.pendingRequests.size>0){let s=n??new Error("ws closed before response");for(let{reject:r}of this.pendingRequests.values())r(s);this.pendingRequests.clear()}this.scheduleReconnect(n)}})}async flushQueue(){if(!this.flushing){this.flushing=!0;try{for(;!this.destroyed&&this.current&&this.outboundQueue.length>0;){let e=this.outboundQueue[0];try{await this.current.send(e)}catch(n){this.scheduleReconnect(n);return}this.outboundQueue.shift()}}finally{this.flushing=!1}}}scheduleReconnect(e){if(!(this.destroyed||this.reconnectInFlight)){if(this.log(`hydra-acp: connection lost (${e?.message??"no error"}); reconnecting...`),this.opts.onDisconnect)try{this.opts.onDisconnect(e)}catch(n){this.log(`hydra-acp: onDisconnect handler threw: ${n.message}`)}this.reconnectInFlight=(async()=>{try{await this.connectWithRetry()}catch(n){for(let s of this.closeHandlers)s(n);this.destroyed=!0}finally{this.reconnectInFlight=void 0}})()}}log(e){if(this.opts.log){this.opts.log(e);return}process.stderr.write(`${e}
114
- `)}}});function Jm(t,e){let n=t&&typeof t=="object"?t.options:void 0;if(Array.isArray(n)){for(let i of e){let o=n.find(a=>typeof a=="object"&&a!==null&&a.kind===i&&typeof a.optionId=="string");if(o?.optionId!==void 0)return o.optionId}let r=n.find(i=>typeof i=="object"&&i!==null&&typeof i.optionId=="string");if(r?.optionId!==void 0)return r.optionId}let s=e[0]??"allow";return console.warn(`[permission-pick] no optionId match for preferredKinds=${JSON.stringify(e)}; falling back to kind name ${JSON.stringify(s)} (agent will likely reject)`),s}function rr(t){return{outcome:{outcome:"selected",optionId:Jm(t,["allow_once","allow_always"])}}}function zm(t){return{outcome:{outcome:"selected",optionId:Jm(t,["reject_once","reject_always"])}}}function ad(t){return t&&typeof t=="object"?t:void 0}function co(t){return typeof t=="string"&&t.length>0?t:void 0}function Km(t){let e=ad(t),n=ad(e?.toolCall),s={paths:[]};if(!n)return s;let r=co(n.kind);r&&(s.kind=r);let i=new Set,o=c=>{let l=co(c);l&&!i.has(l)&&(i.add(l),s.paths.push(l))},a=n.locations;if(Array.isArray(a))for(let c of a)o(ad(c)?.path);let d=ad(n.rawInput);if(d){o(d.file_path),o(d.filePath),o(d.path);let c=co(d.command);c&&(s.command=c);let l=co(d.url);l&&(s.url=l);let f=co(d.description);f&&(s.description=f)}return s}function Vm(t){let e=[];return t.command?e.push(`$ ${t.command}`):t.url?e.push(t.url):t.paths.length===1?e.push(t.paths[0]):t.paths.length>1?e.push(`${t.paths[0]} (+${t.paths.length-1} more)`):t.description&&e.push(t.description),e.join(" ").replace(/\s+/g," ").trim()}var dd=q(()=>{"use strict"});function qx(){return!!(process.env.NO_UPDATE_NOTIFIER==="1"||process.argv.includes("--no-update-notifier"))}function pg(t){let n=(t.split("-",1)[0]??t).split("."),s=Number(n[0]),r=Number(n[1]),i=Number(n[2]);return!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i)?null:[s,r,i]}function Wx(t,e){let n=pg(t),s=pg(e);if(!n||!s)return t!==e;for(let r=0;r<3;r++){let i=n[r],o=s[r];if(i>o)return!0;if(i<o)return!1}return!1}async function lo(){if(bs!==void 0)return bs;if(qx())return bs=null,bs;try{let t=await import("update-notifier"),n=(t.default??t)({pkg:{name:hg,version:fe}}),s=n.update;if(s&&typeof s.latest=="string"&&typeof s.current=="string"&&Wx(s.latest,s.current)){try{n.config?.set?.("update",s)}catch{}bs={current:s.current,latest:s.latest,type:typeof s.type=="string"?s.type:"unknown"}}else{if(s&&typeof s.latest=="string"&&typeof s.current=="string")try{n.config?.set?.("update",void 0)}catch{}bs=null}}catch{bs=null}return bs}function uo(t){return`hydra-acp ${t.latest} available (current ${t.current}) \xB7 run: npm update -g ${hg}`}var hg,bs,xl=q(()=>{"use strict";_t();hg="@hydra-acp/cli"});import*as fo from"fs/promises";import*as Al from"path";async function po(t){let e=t.trim();if(e.length===0)return{ok:!1,reason:"path is empty"};let n=Al.resolve(Nt(e)),s;try{s=await fo.stat(n)}catch{return{ok:!1,reason:`${n} does not exist`}}return s.isDirectory()?{ok:!0,path:n}:{ok:!1,reason:`${n} is not a directory`}}async function mg(t){let e=[],n=new Set,s=r=>{n.has(r)||(n.add(r),e.push(r))};s(t),t.startsWith("/Users/")?s("/home/"+t.slice(7)):t.startsWith("/home/")&&s("/Users/"+t.slice(6));for(let r of e)try{if((await fo.stat(r)).isDirectory())return r}catch{}return null}async function gg(t){let e=t.lastIndexOf("/"),n,s,r;e===-1?(n="",s=t,r="."):(n=t.slice(0,e+1),s=t.slice(e+1),r=e===0?"/":n);let i=Al.resolve(Nt(r)),o;try{o=(await fo.readdir(i,{withFileTypes:!0})).map(l=>({name:l.name,isDir:l.isDirectory()}))}catch{return{prefix:n,basePrefix:s,matches:[]}}let a=s.startsWith("."),d=o.filter(c=>c.name.startsWith(s)).filter(c=>a||!c.name.startsWith(".")).map(c=>c.isDir?`${c.name}/`:c.name).sort();return{prefix:n,basePrefix:s,matches:d}}var Cl=q(()=>{"use strict";qe()});import{EventEmitter as Jx}from"events";import{WebSocket as zx}from"ws";function Kx(t,e){return new Promise((n,s)=>{let r=new zx(t,e),i=()=>{r.off("error",o),n(wn(r))},o=a=>{r.off("open",i),s(a)};r.once("open",i),r.once("error",o)})}function yg(t,e,n,s={}){return new Promise((r,i)=>{(async()=>{let o=s.fetchImpl??fetch,a=s._streamFactory??Kx,d=["acp.v1",`hydra-acp-token.${t.token}`],c=await a(t.wsUrl,d),l=new kt(c),f;try{try{await l.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-sidechain"}})}catch{}if(s.reuseSessionId!==void 0)f=s.reuseSessionId;else{let g=n.replace(/\s+/g," ").trim().slice(0,60);f=(await Wa(t,e,{forkAt:s.forkAt,cwd:s.cwd,agentId:s.agentId,title:`btw: ${g}`},o)).sessionId}}catch(g){throw c.close().catch(()=>{}),g}let u=new Rl(l,c,f,t,o),p=!1,m=g=>{p||(p=!0,u.emit("event",g),c.close().catch(()=>{}))};l.onNotification("session/update",g=>{let y=g?.update;y!==void 0&&u.emit("event",{kind:"update",update:y})}),l.onClose(()=>{p||m({kind:"completed"})});try{await l.request("session/attach",{sessionId:f,historyPolicy:"full",clientInfo:{name:"hydra-acp-sidechain"}})}catch(g){throw c.close().catch(()=>{}),vn(t,f,o).catch(()=>{}),g}r(u),setImmediate(()=>{l.request("session/prompt",{sessionId:f,prompt:[{type:"text",text:n}],_meta:{[lt]:{ancillary:!0}}}).then(g=>{let y=g&&typeof g=="object"?g.stopReason:void 0;m(y==="cancelled"?{kind:"cancelled"}:y==="error"||y==="errored"?{kind:"errored",error:new Error("turn ended with error stopReason")}:{kind:"completed"})}).catch(g=>{m({kind:"errored",error:g instanceof Error?g:new Error(String(g))})})})})().catch(i)})}var Rl,wg=q(()=>{"use strict";to();Us();qr();yt();Rl=class extends Jx{_conn;_stream;_sessionId;_target;_fetchImpl;_cancelled=!1;constructor(e,n,s,r,i){super(),this._conn=e,this._stream=n,this._sessionId=s,this._target=r,this._fetchImpl=i}get sessionId(){return this._sessionId}cancel(){this._cancelled||(this._cancelled=!0,this._conn.notify("session/cancel",{sessionId:this._sessionId}).catch(()=>{}),this._stream.close().catch(()=>{}),vn(this._target,this._sessionId,this._fetchImpl).catch(()=>{}))}once(e,n){return super.once(e,n)}on(e,n){return super.on(e,n)}off(e,n){return super.off(e,n)}}});var Tl,pd,bg=q(()=>{"use strict";ni();cs();Tl=class{_listeners=new Map;on(e,n){let s=this._listeners.get(e);s||(s=new Set,this._listeners.set(e,s)),s.add(n)}off(e,n){this._listeners.get(e)?.delete(n)}emit(e){this._listeners.get(e)?.forEach(s=>s())}},pd=class extends Tl{_lines=[];_toolStates=new Map;_toolRanges=new Map;_pendingAgentText=null;_pendingAgentRange=null;_pendingThoughtText=null;_pendingThoughtRange=null;_emitChanged;_getMaxWidth;constructor(e={}){super(),this._emitChanged=e.emitChanged??!0,this._getMaxWidth=e.getMaxWidth}append(e){let n=yn(e);if(!n)return 0;switch(n.kind!=="agent-text"&&(this._pendingAgentText=null,this._pendingAgentRange=null),n.kind!=="agent-thought"&&(this._pendingThoughtText=null,this._pendingThoughtRange=null),n.kind){case"agent-text":{let s=n.text;if(this._pendingAgentText!==null&&this._pendingAgentRange!==null){this._pendingAgentText+=s;let o=this._parseAgent(this._pendingAgentText);return this._replaceAgentRange(this._pendingAgentRange,o),o.length}this._pendingAgentText=s;let r=this._parseAgent(s),i=this._lines.length;return this._pushLines(r),this._pendingAgentRange={start:i,length:r.length},r.length}case"agent-thought":{let s=n.text;if(this._pendingThoughtText!==null&&this._pendingThoughtRange!==null){this._pendingThoughtText+=s;let o=ti(this._pendingThoughtText);return this._replaceThoughtRange(this._pendingThoughtRange,o),o.length}this._pendingThoughtText=s;let r=ti(s),i=this._lines.length;return this._pushLines(r),this._pendingThoughtRange={start:i,length:r.length},r.length}case"tool-call":{let s={initialTitle:n.title,latestTitle:n.title,status:n.status??"pending"};n.detail!==void 0&&(s.detail=n.detail),this._toolStates.set(n.toolCallId,s);let r=ro(s),i=this._lines.length;return this._pushLines(r),this._toolRanges.set(n.toolCallId,{start:i,length:r.length}),r.length}case"tool-call-update":{let s=this._toolStates.get(n.toolCallId);if(!s)return 0;n.title!==void 0&&(s.latestTitle=n.title),n.status!==void 0&&(s.status=n.status),n.detail!==void 0&&(s.detail=n.detail),n.errorText!==void 0&&(s.errorText=n.errorText);let r=ro(s),i=this._toolRanges.get(n.toolCallId);if(!i){let o=this._lines.length;return this._pushLines(r),this._toolRanges.set(n.toolCallId,{start:o,length:r.length}),r.length}return this._replaceRange(n.toolCallId,i,r),r.length}default:{let s=ms(n);return this._pushLines(s),s.length}}}_parseAgent(e){let n=this._getMaxWidth?.();return gs(e,n!==void 0&&n>0?{maxWidth:n}:void 0)}_replaceAgentRange(e,n){let s=n.length-e.length;if(this._lines.splice(e.start,e.length,...n),e.length=n.length,s!==0){for(let r of this._toolRanges.values())r.start>e.start&&(r.start+=s);this._pendingThoughtRange&&this._pendingThoughtRange.start>e.start&&(this._pendingThoughtRange.start+=s)}this._emitChanged&&this.emit("changed")}_replaceThoughtRange(e,n){let s=n.length-e.length;if(this._lines.splice(e.start,e.length,...n),e.length=n.length,s!==0){for(let r of this._toolRanges.values())r.start>e.start&&(r.start+=s);this._pendingAgentRange&&this._pendingAgentRange.start>e.start&&(this._pendingAgentRange.start+=s)}this._emitChanged&&this.emit("changed")}_replaceRange(e,n,s){let r=s.length-n.length;if(this._lines.splice(n.start,n.length,...s),n.length=s.length,r!==0){for(let[i,o]of this._toolRanges)i!==e&&o.start>n.start&&(o.start+=r);this._pendingAgentRange&&this._pendingAgentRange.start>n.start&&(this._pendingAgentRange.start+=r),this._pendingThoughtRange&&this._pendingThoughtRange.start>n.start&&(this._pendingThoughtRange.start+=r)}this._emitChanged&&this.emit("changed")}getLines(){return this._lines.slice()}clear(){(this._lines.length>0||this._toolStates.size>0)&&(this._lines.length=0,this._toolStates.clear(),this._toolRanges.clear(),this._pendingAgentText=null,this._pendingAgentRange=null,this._pendingThoughtText=null,this._pendingThoughtRange=null,this.emit("changed"))}get size(){return this._lines.length}_pushLines(e){let n=this._lines.length;for(let s of e)this._lines.push(s);this._emitChanged&&this._lines.length>n&&this.emit("changed")}}});function Yx(t,e){return`[pasted #${t} +${e} lines]`}var Vx,hd,El,qn,Pl=q(()=>{"use strict";Vx=/\[pasted #(\d+) \+\d+ lines\]/g,hd=/\[pasted #(\d+) \+\d+ lines\]$/,El=/^\[pasted #(\d+) \+\d+ lines\]/;qn=class{buffer=[""];row=0;col=0;planMode=!1;historyIndex=-1;queueIndex=-1;savedDraft=null;history=[];historySearch=null;queue=[];turnRunning=!1;killBuffer="";attachments=[];savedAttachments=null;pastes=new Map;nextPasteId=1;collapsePastes;lastEscapeAt=null;constructor(e={}){this.history=[...e.history??[]],this.planMode=e.planMode??!1,this.collapsePastes=e.collapsePastes??!0}expandedText(){return this.expandPastes(this.bufferText())}state(){return Object.freeze({buffer:this.buffer,row:this.row,col:this.col,planMode:this.planMode,historyIndex:this.historyIndex,queueIndex:this.queueIndex,attachments:this.attachments,historySearchQuery:this.historySearch?.query??null})}addAttachment(e){this.attachments.push(e)}removeAttachment(e){e<0||e>=this.attachments.length||this.attachments.splice(e,1)}setTurnRunning(e){this.turnRunning=e}setHistory(e){this.history=[...e],this.historyIndex=-1,this.savedDraft=null,this.historySearch=null}setQueue(e){this.queue=[...e],this.queueIndex>=this.queue.length&&(this.queueIndex=-1)}replaceFirstLine(e){this.buffer[0]=e,this.row===0&&(this.col=e.length)}replaceRangeOnCurrentLine(e,n,s){let r=this.currentLine(),i=Math.max(0,Math.min(e,r.length)),o=Math.max(i,Math.min(n,r.length));this.setCurrentLine(r.slice(0,i)+s+r.slice(o)),this.col=i+s.length}setBuffer(e,n=[]){this.loadEntry(e),this.historyIndex=-1,this.queueIndex=-1,this.savedDraft=null,this.savedAttachments=null,this.historySearch=null,this.attachments=[...n]}feed(e){if(this.historySearch!==null){if(e.type==="char")return this.mutateHistorySearchQuery(this.historySearch.query+e.ch.toLowerCase());if(e.type==="paste")return this.mutateHistorySearchQuery(this.historySearch.query+e.text.replace(/\n/g," ").toLowerCase());if(e.type==="key"){if(e.name==="ctrl-r")return this.advanceHistorySearch();if(e.name==="ctrl-s")return this.retreatHistorySearch(),[];if(e.name==="escape"||e.name==="ctrl-c")return this.cancelHistorySearch(),[];if(e.name==="backspace")return this.historySearch.query.length===0?(this.cancelHistorySearch(),[]):this.mutateHistorySearchQuery(this.historySearch.query.slice(0,-1));this.historySearch=null}}if(e.type==="char")return this.lastEscapeAt=null,this.insertChar(e.ch),[];if(e.type==="paste"){this.lastEscapeAt=null;let n=e.text.split(`
113
+ `),i({exitCode:-1})}})}function Fk(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.kind==="terminal"&&typeof e.command=="string"&&Array.isArray(e.args)}async function bl(t,e){let n;try{n=await e.authenticate(t.id)}catch(s){return{kind:"error",message:s instanceof Error&&s.message.length>0?s.message:String(s)}}if(Fk(n)){let s={command:n.command,args:n.args,env:n.env,cwd:n.cwd},r=await e.runTerminalAuth(s);return r.exitCode===0?{kind:"terminal-completed"}:{kind:"exit-nonzero",exitCode:r.exitCode}}return{kind:"retry"}}async function Dm(t,e,n,s,r){Un();let i=Ek(e,n,s),o=!1,a,d,c=()=>{let f=4;i.command&&f++,i.url&&f++,i.methodLines&&(f+=1+i.methodLines.length),a&&f++,d&&f++;let u=jn(t,{contentHeight:f,contentWidth:80,title:"Authentication required"}),p=u.contentW,m=0;if(a&&(t.moveTo(u.contentX,u.contentY+m),t.brightYellow.noFormat(Xe(` ${a}`,p)),m++),d&&(t.moveTo(u.contentX,u.contentY+m),t.brightRed.noFormat(Xe(` ${d}`,p)),m++),t.moveTo(u.contentX,u.contentY+m),t.brightWhite.bold.noFormat(Xe(` ${i.title}`,p)),m+=2,t.moveTo(u.contentX,u.contentY+m),t.noFormat(Xe(` ${i.description}`,p)),m++,i.command&&(t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" Run: "),t.brightWhite.noFormat(Xe(i.command,p-7)),m++),i.url&&(t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" Docs: "),t.brightWhite.noFormat(Xe(i.url,p-7)),m++),i.methodLines){t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" Methods reported by the agent:"),m++;for(let g of i.methodLines)t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(" "),t.noFormat(Xe(g.label,p-3)),m++}return m++,t.moveTo(u.contentX,u.contentY+m),t.dim.noFormat(` ${i.footer}`),u},l=i.methodLines?.length??0;return ys({term:t,render:()=>{c()},onKey:(f,u,p,m)=>{if(o)return;let g=Pk(f,p,l);if(g.kind!=="ignore"){if(g.kind==="retry"||g.kind==="back"||g.kind==="cancel"){m(g.kind);return}if(g.kind==="selectMethod"){let y=i.methodLines?.[g.index]?.method;if(!y||!r?.authenticate)return;o=!0,d=void 0,a=`Authenticating with ${Lm(y)}\u2026`,c();let v=r.runTerminalAuth??(b=>Ok(t,b));(async()=>{let b=await bl(y,{authenticate:r.authenticate,runTerminalAuth:v});if(b.kind==="terminal-completed"){m("terminal-completed");return}if(b.kind==="retry"){m("retry");return}if(b.kind==="error"){d=b.message,a=void 0,o=!1,c();return}a=void 0,d=`auth process exited with code ${b.exitCode??"(signal)"}`,o=!1,c()})()}}}})}var Rk,Tk,vl=J(()=>{"use strict";Jo();Ko();ci();Rk="This agent requires authentication before use.",Tk="[r] retry \xB7 [Esc] back to picker"});import{setTimeout as Wm}from"timers/promises";function Wk(t){return!("method"in t)&&"id"in t&&t.id!==void 0}var Hk,Uk,jk,qk,li,Il=J(()=>{"use strict";eo();qr();Hk=200,Uk=5e3,jk=2,qk=60,li=class{constructor(e){this.opts=e}opts;current;outboundQueue=[];flushing=!1;messageHandlers=[];closeHandlers=[];destroyed=!1;firstConnect=!0;reconnectInFlight;connectGate;releaseConnectGate;pendingRequests=new Map;async start(){await this.connectWithRetry()}onMessage(e){this.messageHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}async send(e){if(this.destroyed)throw new Error("resilient ws stream is destroyed");if(this.connectGate||!this.current||this.flushing){this.outboundQueue.push(e);return}this.outboundQueue.push(e),await this.flushQueue()}async request(e){if(this.destroyed)throw new Error("resilient ws stream is destroyed");if(!this.current)throw new Error("resilient ws stream not connected");let n=e.id,s=new Promise((r,i)=>{this.pendingRequests.set(n,{resolve:r,reject:i})});try{await this.current.send(e)}catch(r){throw this.pendingRequests.delete(n),r}return s}async close(){if(this.destroyed=!0,this.reconnectInFlight&&await Promise.race([this.reconnectInFlight.catch(()=>{}),Wm(2e3)]),this.current&&await this.current.close().catch(()=>{}),this.pendingRequests.size>0){let e=new Error("resilient ws stream is destroyed");for(let{reject:n}of this.pendingRequests.values())n(e);this.pendingRequests.clear()}for(let e of this.closeHandlers)e()}async connectWithRetry(){let e=0,n=Hk;for(;!this.destroyed;)try{let s=await Gs(this.opts.url,this.opts.subprotocols);this.bindStream(wn(s));let r=this.firstConnect;this.firstConnect=!1,this.connectGate=new Promise(i=>{this.releaseConnectGate=i});try{if(this.opts.onConnect)try{await this.opts.onConnect(r)}catch(i){this.log(`hydra-acp: post-connect handler failed: ${i.message}`)}}finally{this.releaseConnectGate?.(),this.releaseConnectGate=void 0,this.connectGate=void 0}await this.flushQueue();return}catch(s){if(e+=1,this.opts.onConnectFailure&&this.opts.onConnectFailure(s),e>=qk)throw new Error(`hydra-acp: gave up reconnecting after ${e} attempts: ${s.message}`);if(this.log(`hydra-acp: connect attempt ${e} failed (${s.message}); retrying in ${n}ms`),await Wm(n),this.destroyed)return;n=Math.min(n*jk,Uk)}}bindStream(e){this.current=e,e.onMessage(n=>{if(Wk(n)&&n.id!==null){let s=this.pendingRequests.get(n.id);s&&(this.pendingRequests.delete(n.id),s.resolve(n))}for(let s of this.messageHandlers)s(n)}),e.onClose(n=>{if(!this.destroyed){if(this.current=void 0,this.pendingRequests.size>0){let s=n??new Error("ws closed before response");for(let{reject:r}of this.pendingRequests.values())r(s);this.pendingRequests.clear()}this.scheduleReconnect(n)}})}async flushQueue(){if(!this.flushing){this.flushing=!0;try{for(;!this.destroyed&&this.current&&this.outboundQueue.length>0;){let e=this.outboundQueue[0];try{await this.current.send(e)}catch(n){this.scheduleReconnect(n);return}this.outboundQueue.shift()}}finally{this.flushing=!1}}}scheduleReconnect(e){if(!(this.destroyed||this.reconnectInFlight)){if(this.log(`hydra-acp: connection lost (${e?.message??"no error"}); reconnecting...`),this.opts.onDisconnect)try{this.opts.onDisconnect(e)}catch(n){this.log(`hydra-acp: onDisconnect handler threw: ${n.message}`)}this.reconnectInFlight=(async()=>{try{await this.connectWithRetry()}catch(n){for(let s of this.closeHandlers)s(n);this.destroyed=!0}finally{this.reconnectInFlight=void 0}})()}}log(e){if(this.opts.log){this.opts.log(e);return}process.stderr.write(`${e}
114
+ `)}}});function Jm(t,e){let n=t&&typeof t=="object"?t.options:void 0;if(Array.isArray(n)){for(let i of e){let o=n.find(a=>typeof a=="object"&&a!==null&&a.kind===i&&typeof a.optionId=="string");if(o?.optionId!==void 0)return o.optionId}let r=n.find(i=>typeof i=="object"&&i!==null&&typeof i.optionId=="string");if(r?.optionId!==void 0)return r.optionId}let s=e[0]??"allow";return console.warn(`[permission-pick] no optionId match for preferredKinds=${JSON.stringify(e)}; falling back to kind name ${JSON.stringify(s)} (agent will likely reject)`),s}function rr(t){return{outcome:{outcome:"selected",optionId:Jm(t,["allow_once","allow_always"])}}}function zm(t){return{outcome:{outcome:"selected",optionId:Jm(t,["reject_once","reject_always"])}}}function ad(t){return t&&typeof t=="object"?t:void 0}function co(t){return typeof t=="string"&&t.length>0?t:void 0}function Km(t){let e=ad(t),n=ad(e?.toolCall),s={paths:[]};if(!n)return s;let r=co(n.kind);r&&(s.kind=r);let i=new Set,o=c=>{let l=co(c);l&&!i.has(l)&&(i.add(l),s.paths.push(l))},a=n.locations;if(Array.isArray(a))for(let c of a)o(ad(c)?.path);let d=ad(n.rawInput);if(d){o(d.file_path),o(d.filePath),o(d.path);let c=co(d.command);c&&(s.command=c);let l=co(d.url);l&&(s.url=l);let f=co(d.description);f&&(s.description=f)}return s}function Vm(t){let e=[];return t.command?e.push(`$ ${t.command}`):t.url?e.push(t.url):t.paths.length===1?e.push(t.paths[0]):t.paths.length>1?e.push(`${t.paths[0]} (+${t.paths.length-1} more)`):t.description&&e.push(t.description),e.join(" ").replace(/\s+/g," ").trim()}var dd=J(()=>{"use strict"});function qx(){return!!(process.env.NO_UPDATE_NOTIFIER==="1"||process.argv.includes("--no-update-notifier"))}function pg(t){let n=(t.split("-",1)[0]??t).split("."),s=Number(n[0]),r=Number(n[1]),i=Number(n[2]);return!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i)?null:[s,r,i]}function Wx(t,e){let n=pg(t),s=pg(e);if(!n||!s)return t!==e;for(let r=0;r<3;r++){let i=n[r],o=s[r];if(i>o)return!0;if(i<o)return!1}return!1}async function lo(){if(bs!==void 0)return bs;if(qx())return bs=null,bs;try{let t=await import("update-notifier"),n=(t.default??t)({pkg:{name:hg,version:fe}}),s=n.update;if(s&&typeof s.latest=="string"&&typeof s.current=="string"&&Wx(s.latest,s.current)){try{n.config?.set?.("update",s)}catch{}bs={current:s.current,latest:s.latest,type:typeof s.type=="string"?s.type:"unknown"}}else{if(s&&typeof s.latest=="string"&&typeof s.current=="string")try{n.config?.set?.("update",void 0)}catch{}bs=null}}catch{bs=null}return bs}function uo(t){return`hydra-acp ${t.latest} available (current ${t.current}) \xB7 run: npm update -g ${hg}`}var hg,bs,xl=J(()=>{"use strict";_t();hg="@hydra-acp/cli"});import*as fo from"fs/promises";import*as Al from"path";async function po(t){let e=t.trim();if(e.length===0)return{ok:!1,reason:"path is empty"};let n=Al.resolve(Nt(e)),s;try{s=await fo.stat(n)}catch{return{ok:!1,reason:`${n} does not exist`}}return s.isDirectory()?{ok:!0,path:n}:{ok:!1,reason:`${n} is not a directory`}}async function mg(t){let e=[],n=new Set,s=r=>{n.has(r)||(n.add(r),e.push(r))};s(t),t.startsWith("/Users/")?s("/home/"+t.slice(7)):t.startsWith("/home/")&&s("/Users/"+t.slice(6));for(let r of e)try{if((await fo.stat(r)).isDirectory())return r}catch{}return null}async function gg(t){let e=t.lastIndexOf("/"),n,s,r;e===-1?(n="",s=t,r="."):(n=t.slice(0,e+1),s=t.slice(e+1),r=e===0?"/":n);let i=Al.resolve(Nt(r)),o;try{o=(await fo.readdir(i,{withFileTypes:!0})).map(l=>({name:l.name,isDir:l.isDirectory()}))}catch{return{prefix:n,basePrefix:s,matches:[]}}let a=s.startsWith("."),d=o.filter(c=>c.name.startsWith(s)).filter(c=>a||!c.name.startsWith(".")).map(c=>c.isDir?`${c.name}/`:c.name).sort();return{prefix:n,basePrefix:s,matches:d}}var Cl=J(()=>{"use strict";je()});import{EventEmitter as Jx}from"events";import{WebSocket as zx}from"ws";function Kx(t,e){return new Promise((n,s)=>{let r=new zx(t,e),i=()=>{r.off("error",o),n(wn(r))},o=a=>{r.off("open",i),s(a)};r.once("open",i),r.once("error",o)})}function yg(t,e,n,s={}){return new Promise((r,i)=>{(async()=>{let o=s.fetchImpl??fetch,a=s._streamFactory??Kx,d=["acp.v1",`hydra-acp-token.${t.token}`],c=await a(t.wsUrl,d),l=new kt(c),f;try{try{await l.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-sidechain"}})}catch{}if(s.reuseSessionId!==void 0)f=s.reuseSessionId;else{let g=n.replace(/\s+/g," ").trim().slice(0,60);f=(await Wa(t,e,{forkAt:s.forkAt,cwd:s.cwd,agentId:s.agentId,title:`btw: ${g}`},o)).sessionId}}catch(g){throw c.close().catch(()=>{}),g}let u=new Rl(l,c,f,t,o),p=!1,m=g=>{p||(p=!0,u.emit("event",g),c.close().catch(()=>{}))};l.onNotification("session/update",g=>{let y=g?.update;y!==void 0&&u.emit("event",{kind:"update",update:y})}),l.onClose(()=>{p||m({kind:"completed"})});try{await l.request("session/attach",{sessionId:f,historyPolicy:"full",clientInfo:{name:"hydra-acp-sidechain"}})}catch(g){throw c.close().catch(()=>{}),vn(t,f,o).catch(()=>{}),g}r(u),setImmediate(()=>{l.request("session/prompt",{sessionId:f,prompt:[{type:"text",text:n}],_meta:{[lt]:{ancillary:!0}}}).then(g=>{let y=g&&typeof g=="object"?g.stopReason:void 0;m(y==="cancelled"?{kind:"cancelled"}:y==="error"||y==="errored"?{kind:"errored",error:new Error("turn ended with error stopReason")}:{kind:"completed"})}).catch(g=>{m({kind:"errored",error:g instanceof Error?g:new Error(String(g))})})})})().catch(i)})}var Rl,wg=J(()=>{"use strict";to();Us();qr();yt();Rl=class extends Jx{_conn;_stream;_sessionId;_target;_fetchImpl;_cancelled=!1;constructor(e,n,s,r,i){super(),this._conn=e,this._stream=n,this._sessionId=s,this._target=r,this._fetchImpl=i}get sessionId(){return this._sessionId}cancel(){this._cancelled||(this._cancelled=!0,this._conn.notify("session/cancel",{sessionId:this._sessionId}).catch(()=>{}),this._stream.close().catch(()=>{}),vn(this._target,this._sessionId,this._fetchImpl).catch(()=>{}))}once(e,n){return super.once(e,n)}on(e,n){return super.on(e,n)}off(e,n){return super.off(e,n)}}});var Tl,pd,bg=J(()=>{"use strict";ni();cs();Tl=class{_listeners=new Map;on(e,n){let s=this._listeners.get(e);s||(s=new Set,this._listeners.set(e,s)),s.add(n)}off(e,n){this._listeners.get(e)?.delete(n)}emit(e){this._listeners.get(e)?.forEach(s=>s())}},pd=class extends Tl{_lines=[];_toolStates=new Map;_toolRanges=new Map;_pendingAgentText=null;_pendingAgentRange=null;_pendingThoughtText=null;_pendingThoughtRange=null;_emitChanged;_getMaxWidth;constructor(e={}){super(),this._emitChanged=e.emitChanged??!0,this._getMaxWidth=e.getMaxWidth}append(e){let n=yn(e);if(!n)return 0;switch(n.kind!=="agent-text"&&(this._pendingAgentText=null,this._pendingAgentRange=null),n.kind!=="agent-thought"&&(this._pendingThoughtText=null,this._pendingThoughtRange=null),n.kind){case"agent-text":{let s=n.text;if(this._pendingAgentText!==null&&this._pendingAgentRange!==null){this._pendingAgentText+=s;let o=this._parseAgent(this._pendingAgentText);return this._replaceAgentRange(this._pendingAgentRange,o),o.length}this._pendingAgentText=s;let r=this._parseAgent(s),i=this._lines.length;return this._pushLines(r),this._pendingAgentRange={start:i,length:r.length},r.length}case"agent-thought":{let s=n.text;if(this._pendingThoughtText!==null&&this._pendingThoughtRange!==null){this._pendingThoughtText+=s;let o=ti(this._pendingThoughtText);return this._replaceThoughtRange(this._pendingThoughtRange,o),o.length}this._pendingThoughtText=s;let r=ti(s),i=this._lines.length;return this._pushLines(r),this._pendingThoughtRange={start:i,length:r.length},r.length}case"tool-call":{let s={initialTitle:n.title,latestTitle:n.title,status:n.status??"pending"};n.detail!==void 0&&(s.detail=n.detail),this._toolStates.set(n.toolCallId,s);let r=ro(s),i=this._lines.length;return this._pushLines(r),this._toolRanges.set(n.toolCallId,{start:i,length:r.length}),r.length}case"tool-call-update":{let s=this._toolStates.get(n.toolCallId);if(!s)return 0;n.title!==void 0&&(s.latestTitle=n.title),n.status!==void 0&&(s.status=n.status),n.detail!==void 0&&(s.detail=n.detail),n.errorText!==void 0&&(s.errorText=n.errorText);let r=ro(s),i=this._toolRanges.get(n.toolCallId);if(!i){let o=this._lines.length;return this._pushLines(r),this._toolRanges.set(n.toolCallId,{start:o,length:r.length}),r.length}return this._replaceRange(n.toolCallId,i,r),r.length}default:{let s=ms(n);return this._pushLines(s),s.length}}}_parseAgent(e){let n=this._getMaxWidth?.();return gs(e,n!==void 0&&n>0?{maxWidth:n}:void 0)}_replaceAgentRange(e,n){let s=n.length-e.length;if(this._lines.splice(e.start,e.length,...n),e.length=n.length,s!==0){for(let r of this._toolRanges.values())r.start>e.start&&(r.start+=s);this._pendingThoughtRange&&this._pendingThoughtRange.start>e.start&&(this._pendingThoughtRange.start+=s)}this._emitChanged&&this.emit("changed")}_replaceThoughtRange(e,n){let s=n.length-e.length;if(this._lines.splice(e.start,e.length,...n),e.length=n.length,s!==0){for(let r of this._toolRanges.values())r.start>e.start&&(r.start+=s);this._pendingAgentRange&&this._pendingAgentRange.start>e.start&&(this._pendingAgentRange.start+=s)}this._emitChanged&&this.emit("changed")}_replaceRange(e,n,s){let r=s.length-n.length;if(this._lines.splice(n.start,n.length,...s),n.length=s.length,r!==0){for(let[i,o]of this._toolRanges)i!==e&&o.start>n.start&&(o.start+=r);this._pendingAgentRange&&this._pendingAgentRange.start>n.start&&(this._pendingAgentRange.start+=r),this._pendingThoughtRange&&this._pendingThoughtRange.start>n.start&&(this._pendingThoughtRange.start+=r)}this._emitChanged&&this.emit("changed")}getLines(){return this._lines.slice()}clear(){(this._lines.length>0||this._toolStates.size>0)&&(this._lines.length=0,this._toolStates.clear(),this._toolRanges.clear(),this._pendingAgentText=null,this._pendingAgentRange=null,this._pendingThoughtText=null,this._pendingThoughtRange=null,this.emit("changed"))}get size(){return this._lines.length}_pushLines(e){let n=this._lines.length;for(let s of e)this._lines.push(s);this._emitChanged&&this._lines.length>n&&this.emit("changed")}}});function Yx(t,e){return`[pasted #${t} +${e} lines]`}var Vx,hd,El,qn,Pl=J(()=>{"use strict";Vx=/\[pasted #(\d+) \+\d+ lines\]/g,hd=/\[pasted #(\d+) \+\d+ lines\]$/,El=/^\[pasted #(\d+) \+\d+ lines\]/;qn=class{buffer=[""];row=0;col=0;planMode=!1;historyIndex=-1;queueIndex=-1;savedDraft=null;history=[];historySearch=null;queue=[];turnRunning=!1;killBuffer="";attachments=[];savedAttachments=null;pastes=new Map;nextPasteId=1;collapsePastes;lastEscapeAt=null;constructor(e={}){this.history=[...e.history??[]],this.planMode=e.planMode??!1,this.collapsePastes=e.collapsePastes??!0}expandedText(){return this.expandPastes(this.bufferText())}state(){return Object.freeze({buffer:this.buffer,row:this.row,col:this.col,planMode:this.planMode,historyIndex:this.historyIndex,queueIndex:this.queueIndex,attachments:this.attachments,historySearchQuery:this.historySearch?.query??null})}addAttachment(e){this.attachments.push(e)}removeAttachment(e){e<0||e>=this.attachments.length||this.attachments.splice(e,1)}setTurnRunning(e){this.turnRunning=e}setHistory(e){this.history=[...e],this.historyIndex=-1,this.savedDraft=null,this.historySearch=null}setQueue(e){this.queue=[...e],this.queueIndex>=this.queue.length&&(this.queueIndex=-1)}replaceFirstLine(e){this.buffer[0]=e,this.row===0&&(this.col=e.length)}replaceRangeOnCurrentLine(e,n,s){let r=this.currentLine(),i=Math.max(0,Math.min(e,r.length)),o=Math.max(i,Math.min(n,r.length));this.setCurrentLine(r.slice(0,i)+s+r.slice(o)),this.col=i+s.length}setBuffer(e,n=[]){this.loadEntry(e),this.historyIndex=-1,this.queueIndex=-1,this.savedDraft=null,this.savedAttachments=null,this.historySearch=null,this.attachments=[...n]}feed(e){if(this.historySearch!==null){if(e.type==="char")return this.mutateHistorySearchQuery(this.historySearch.query+e.ch.toLowerCase());if(e.type==="paste")return this.mutateHistorySearchQuery(this.historySearch.query+e.text.replace(/\n/g," ").toLowerCase());if(e.type==="key"){if(e.name==="ctrl-r")return this.advanceHistorySearch();if(e.name==="ctrl-s")return this.retreatHistorySearch(),[];if(e.name==="escape"||e.name==="ctrl-c")return this.cancelHistorySearch(),[];if(e.name==="backspace")return this.historySearch.query.length===0?(this.cancelHistorySearch(),[]):this.mutateHistorySearchQuery(this.historySearch.query.slice(0,-1));this.historySearch=null}}if(e.type==="char")return this.lastEscapeAt=null,this.insertChar(e.ch),[];if(e.type==="paste"){this.lastEscapeAt=null;let n=e.text.split(`
115
115
  `).length;if(this.collapsePastes&&n>10){let s=this.nextPasteId++;this.pastes.set(s,e.text),this.insertText(Yx(s,n))}else this.insertText(e.text);return[]}return e.type==="attachment-paths"?[]:this.handleKey(e.name)}handleKey(e){switch(e!=="escape"&&(this.lastEscapeAt=null),e){case"enter":return this.send();case"shift-enter":case"ctrl-enter":return this.amend();case"alt-enter":return this.insertNewline(),[];case"shift-tab":return this.planMode=!this.planMode,[{type:"plan-toggle",on:this.planMode},{type:"redraw-banner"}];case"tab":return this.insertText(" "),[];case"up":return this.handleUp();case"down":return this.handleDown();case"left":return this.moveLeft(),[];case"right":return this.moveRight(),[];case"ctrl-a":return this.col=0,[];case"ctrl-e":return this.col=this.currentLine().length,[];case"home":return this.handleHome();case"end":return this.handleEnd();case"ctrl-b":return this.moveLeft(),[];case"ctrl-f":return this.moveRight(),[];case"ctrl-g":return[{type:"show-help"}];case"alt-b":return this.moveWordBackward(),[];case"alt-f":return this.moveWordForward(),[];case"ctrl-k":return this.killToEnd(),[];case"ctrl-n":return this.handleDown();case"ctrl-o":return[{type:"toggle-options"}];case"backspace":return this.backspace(),[];case"delete":return this.deleteForward(),[];case"ctrl-c":return this.handleCtrlC();case"ctrl-d":return this.bufferIsEmpty()?[{type:"exit"}]:(this.deleteForward(),[]);case"ctrl-l":return[{type:"redraw"}];case"ctrl-p":return[{type:"switch-session"}];case"ctrl-t":return[{type:"toggle-thoughts"}];case"alt-n":case"alt-tab":return[{type:"next-live-session"}];case"ctrl-r":return this.startHistorySearch();case"ctrl-s":return this.amend();case"ctrl-u":return this.killLine(),[];case"ctrl-v":return[{type:"attachment-request",source:"clipboard"}];case"ctrl-w":return this.killWord(),[];case"ctrl-x":return[{type:"toggle-mouse"}];case"ctrl-y":return this.yank(),[];case"escape":{if(this.turnRunning)return this.lastEscapeAt=null,[{type:"cancel",prefill:!0}];let n=Date.now();return this.lastEscapeAt!==null&&n-this.lastEscapeAt<=500?(this.lastEscapeAt=null,[{type:"switch-session"}]):(this.lastEscapeAt=n,[])}}}currentLine(){return this.buffer[this.row]??""}setCurrentLine(e){this.buffer[this.row]=e}bufferText(){return this.buffer.join(`
116
116
  `)}expandPastes(e){return e.replace(Vx,(n,s)=>{let r=parseInt(s,10),i=this.pastes.get(r);return i!==void 0?i:n})}bufferIsEmpty(){return this.buffer.length===1&&this.buffer[0]===""}clearBuffer(){this.buffer=[""],this.row=0,this.col=0,this.historyIndex=-1,this.queueIndex=-1,this.savedDraft=null,this.savedAttachments=null,this.historySearch=null,this.attachments=[]}insertChar(e){if(e.length===0)return;if(e.includes(`
117
117
  `)){this.insertText(e);return}let n=this.currentLine();this.setCurrentLine(n.slice(0,this.col)+e+n.slice(this.col)),this.col+=e.length}insertText(e){let n=e.split(`
@@ -120,63 +120,63 @@ failed to spawn ${e.command}: ${a.message}
120
120
  `,this.buffer.splice(this.row-1,1),this.row-=1}killToEnd(){let e=this.currentLine();if(this.col<e.length){this.killBuffer=e.slice(this.col),this.setCurrentLine(e.slice(0,this.col));return}if(this.row>=this.buffer.length-1)return;if(e.length===0){this.killBuffer=`
121
121
  `,this.buffer.splice(this.row,1);return}let n=this.buffer[this.row+1]??"";this.killBuffer=`
122
122
  `+n,this.buffer.splice(this.row+1,1)}killWord(){let e=this.currentLine();if(this.col===0){this.backspace();return}let s=e.slice(0,this.col).match(hd);if(s!==null){this.killBuffer=s[0];let o=this.col-s[0].length;this.setCurrentLine(e.slice(0,o)+e.slice(this.col)),this.col=o;return}let r=this.col;for(;r>0&&/\s/.test(e[r-1]??"");)r-=1;for(;r>0&&!/\s/.test(e[r-1]??"");)r-=1;let i=e.slice(r,this.col);i.length>0&&(this.killBuffer=i),this.setCurrentLine(e.slice(0,r)+e.slice(this.col)),this.col=r}yank(){this.killBuffer.length!==0&&this.insertText(this.killBuffer)}moveLeft(){if(this.col>0){let n=this.currentLine().slice(0,this.col).match(hd);if(n!==null){this.col-=n[0].length;return}this.col-=1;return}this.row>0&&(this.row-=1,this.col=this.currentLine().length)}moveRight(){let e=this.currentLine();if(this.col<e.length){let s=e.slice(this.col).match(El);if(s!==null){this.col+=s[0].length;return}this.col+=1;return}this.row<this.buffer.length-1&&(this.row+=1,this.col=0)}moveWordBackward(){if(this.col===0){if(this.row===0)return;this.row-=1,this.col=this.currentLine().length;return}let e=this.currentLine(),n=this.col;for(;n>0&&/\s/.test(e[n-1]??"");)n-=1;let r=e.slice(0,n).match(hd);if(r!==null){this.col=n-r[0].length;return}for(;n>0&&!/\s/.test(e[n-1]??"");)n-=1;this.col=n}moveWordForward(){let e=this.currentLine();if(this.col>=e.length){if(this.row>=this.buffer.length-1)return;this.row+=1,this.col=0;return}let n=this.col;for(;n<e.length&&/\s/.test(e[n]??"");)n+=1;let r=e.slice(n).match(El);if(r!==null){this.col=n+r[0].length;return}for(;n<e.length&&!/\s/.test(e[n]??"");)n+=1;this.col=n}handleUp(){return this.row>0?(this.row-=1,this.col=Math.min(this.col,this.currentLine().length),[]):this.queueIndex===-1&&this.historyIndex===-1?this.queue.length===0&&this.history.length===0?[]:(this.savedDraft={buffer:[...this.buffer],row:this.row,col:this.col},this.savedAttachments=[...this.attachments],this.attachments=[],this.queue.length>0?(this.queueIndex=this.queue.length-1,this.loadEntry(this.queue[this.queueIndex]??"")):(this.historyIndex=this.history.length-1,this.loadEntry(this.history[this.historyIndex]??"")),[]):this.queueIndex>=0?this.queueIndex>0?(this.queueIndex-=1,this.loadEntry(this.queue[this.queueIndex]??""),[]):this.history.length===0?[]:(this.queueIndex=-1,this.historyIndex=this.history.length-1,this.loadEntry(this.history[this.historyIndex]??""),[]):(this.historyIndex>0&&(this.historyIndex-=1,this.loadEntry(this.history[this.historyIndex]??"")),[])}handleDown(){return this.row<this.buffer.length-1&&this.historyIndex===-1&&this.queueIndex===-1?(this.row+=1,this.col=Math.min(this.col,this.currentLine().length),[]):this.historyIndex>=0?this.historyIndex<this.history.length-1?(this.historyIndex+=1,this.loadEntry(this.history[this.historyIndex]??""),[]):(this.historyIndex=-1,this.queue.length>0?(this.queueIndex=0,this.loadEntry(this.queue[this.queueIndex]??""),[]):(this.restoreDraft(),[])):this.queueIndex>=0?this.queueIndex<this.queue.length-1?(this.queueIndex+=1,this.loadEntry(this.queue[this.queueIndex]??""),[]):(this.queueIndex=-1,this.restoreDraft(),[]):[]}restoreDraft(){this.savedDraft?(this.buffer=[...this.savedDraft.buffer],this.row=this.savedDraft.row,this.col=this.savedDraft.col,this.savedDraft=null,this.attachments=this.savedAttachments??[],this.savedAttachments=null):this.clearBuffer()}startHistorySearch(){let e=this.bufferText().toLowerCase();if(e.length===0)return this.historySearch={query:"",matchIndices:[],cursor:0,savedDraft:{buffer:[...this.buffer],row:this.row,col:this.col}},[];let n=this.findHistoryMatches(e);return n.length===0?[{type:"escalate-search",query:e}]:(this.historySearch={query:e,matchIndices:n,cursor:0,savedDraft:{buffer:[...this.buffer],row:this.row,col:this.col}},this.loadEntry(this.history[n[0]]??""),[])}advanceHistorySearch(){if(this.historySearch===null)return[];let e=this.historySearch;if(e.cursor>=e.matchIndices.length-1){if(e.query.length===0)return[];let r=e.query,i=e.savedDraft;return this.historySearch=null,this.buffer=[...i.buffer],this.row=i.row,this.col=i.col,[{type:"escalate-search",query:r}]}e.cursor+=1;let s=e.matchIndices[e.cursor];return this.loadEntry(this.history[s]??""),[]}retreatHistorySearch(){if(this.historySearch===null||this.historySearch.cursor===0)return;this.historySearch.cursor-=1;let e=this.historySearch.matchIndices[this.historySearch.cursor];this.loadEntry(this.history[e]??"")}mutateHistorySearchQuery(e){if(this.historySearch===null)return[];if(e.length===0){this.historySearch.query="",this.historySearch.matchIndices=[],this.historySearch.cursor=0;let s=this.historySearch.savedDraft;return this.buffer=[...s.buffer],this.row=s.row,this.col=s.col,[]}let n=this.findHistoryMatches(e);if(n.length===0){let s=this.historySearch.savedDraft;return this.historySearch=null,this.buffer=[...s.buffer],this.row=s.row,this.col=s.col,[{type:"escalate-search",query:e}]}return this.historySearch.query=e,this.historySearch.matchIndices=n,this.historySearch.cursor=0,this.loadEntry(this.history[n[0]]??""),[]}findHistoryMatches(e){let n=[];for(let s=this.history.length-1;s>=0;s--){let r=this.history[s]??"";(e.length===0||r.toLowerCase().includes(e))&&n.push(s)}return n}cancelHistorySearch(){if(this.historySearch===null)return;let e=this.historySearch.savedDraft;this.historySearch=null,this.buffer=[...e.buffer],this.row=e.row,this.col=e.col}loadEntry(e){this.buffer=e.split(`
123
- `),this.buffer.length===0&&(this.buffer=[""]),this.row=this.buffer.length-1,this.col=(this.buffer[this.row]??"").length}send(){let e=this.bufferText(),n=this.expandPastes(e);if(this.queueIndex>=0&&this.queueIndex<this.queue.length){let i=this.queueIndex,o=[...this.attachments];return this.clearBuffer(),n.trim().length===0?[{type:"queue-remove",index:i}]:[{type:"queue-edit",index:i,text:n,displayText:e,attachments:o}]}if(n.trim().length===0&&this.attachments.length===0)return[];let s=this.planMode,r=[...this.attachments];return this.clearBuffer(),[{type:"send",text:n,displayText:e,planMode:s,attachments:r}]}amend(){let e=this.bufferText(),n=this.expandPastes(e);if(this.queueIndex>=0&&this.queueIndex<this.queue.length){let i=this.queueIndex,o=this.planMode,a=[...this.attachments],d=n.trim().length===0&&a.length===0;return this.clearBuffer(),d?[{type:"queue-remove",index:i}]:[{type:"queue-remove",index:i},{type:"amend",text:n,displayText:e,planMode:o,attachments:a}]}if(n.trim().length===0&&this.attachments.length===0)return[];let s=this.planMode,r=[...this.attachments];return this.clearBuffer(),[{type:"amend",text:n,displayText:e,planMode:s,attachments:r}]}handleHome(){return this.row!==0||this.col!==0?(this.row=0,this.col=0,[]):[{type:"scroll-to-top"}]}handleEnd(){let e=this.buffer.length-1,n=(this.buffer[e]??"").length;return this.row!==e||this.col!==n?(this.row=e,this.col=n,[]):[{type:"scroll-to-bottom"}]}handleCtrlC(){if(this.queueIndex>=0){let e=this.queueIndex;return this.queueIndex=-1,this.restoreDraft(),[{type:"queue-remove",index:e}]}return!this.bufferIsEmpty()||this.attachments.length>0?(this.buffer=[""],this.row=0,this.col=0,this.attachments=[],this.historyIndex=-1,this.savedDraft=null,this.savedAttachments=null,[]):this.turnRunning?[{type:"cancel"}]:[{type:"exit"}]}}});var pi,md,Ml=q(()=>{"use strict";pi=class{constructor(e){this.term=e}term;lastFrameRows=new Map;lastFrameW=0;lastFrameH=0;clearCache(){this.lastFrameRows.clear(),this.lastFrameW=0,this.lastFrameH=0}ensureSize(e,n){return e!==this.lastFrameW||n!==this.lastFrameH?(this.lastFrameRows.clear(),this.lastFrameW=e,this.lastFrameH=n,!0):!1}paintRow(e,n,s){e<1||e>this.term.height||this.lastFrameRows.get(e)!==n&&(this.lastFrameRows.set(e,n),this.term.moveTo(1,e),s(),this.term.styleReset(),this.term.eraseLineAfter())}},md=class{constructor(e){this.deps=e}deps;lastRepaintAt=0;timer=null;get pendingTimer(){return this.timer}schedule(){if(!this.deps.isStarted())return;if(this.deps.isRepaintPaused()){this.deps.markRepaintPending();return}let e=this.deps.throttleMs();if(e<=0){this.deps.doRepaint();return}let s=Date.now()-this.lastRepaintAt;if(s>=e){this.cancel(),this.deps.doRepaint();return}this.timer===null&&(this.timer=setTimeout(()=>{this.timer=null,this.deps.doRepaint()},e-s))}noteRepaintStart(){this.lastRepaintAt=Date.now(),this.cancel()}cancel(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}}});import Gx from"path";function ho(t){return vg[Gx.extname(t).toLowerCase()]??null}function Qx(t){return ho(t)!==null}function _l(t){let e=t.match(/^data:(image\/[a-z0-9.+\-]+);base64,([A-Za-z0-9+/=]+)$/);if(!e)return null;let n=e[1].toLowerCase();if(!Xx.has(n))return null;let s=e[2],r=s.endsWith("==")?2:s.endsWith("=")?1:0,i=Math.floor(s.length*3/4)-r;return{mimeType:n,data:s,sizeBytes:i}}function Zx(t){return _l(t)!==null}function qt(t){return t>=1024*1024?`${(t/(1024*1024)).toFixed(1)}MB`:t>=1024?`${(t/1024).toFixed(0)}KB`:`${t}B`}function Ig(t){let e=t.trim();if(e.length===0)return null;let n=[],s=0;for(;s<e.length;){for(;s<e.length&&/\s/.test(e[s]??"");)s++;if(s>=e.length)break;let r=e[s],i="";if(r==="'"||r==='"'){let a=r;for(s++;s<e.length&&e[s]!==a;)i+=e[s],s++;if(s>=e.length)return null;s++}else for(;s<e.length&&!/\s/.test(e[s]??"");)e[s]==="\\"&&s+1<e.length?(i+=e[s+1],s+=2):(i+=e[s],s++);if(i.startsWith("data:")){if(!Zx(i))return null;n.push(i);continue}let o=i;if(o.startsWith("file://")&&(o=decodeURI(o.slice(7))),!o.startsWith("/")||!Qx(o))return null;n.push(o)}return n.length>0?n:null}var Sn,vg,Xx,gd=q(()=>{"use strict";Sn=10*1024*1024,vg={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"};Xx=new Set(Object.values(vg))});import eA from"string-width";function Sg(t,e){if(!t||e<=0)return 0;let n=0;for(let s of tA.segment(t)){let r=eA(s.segment);if(e<n+r)return s.index;if(n+=r,e===n)return s.index+s.segment.length}return t.length}function kg(t,e){if(e<=0)return 0;let n=0,s=0;for(let r of t)if(r.width>0&&e<n+r.width||(n+=r.width,s+=r.text.length,r.width>0&&e===n))return s;return s}var tA,xg=q(()=>{"use strict";tA=new Intl.Segmenter(void 0,{granularity:"grapheme"})});import{spawn as nA}from"child_process";import $l from"fs/promises";import sA from"os";import rA from"path";async function Rg(t={}){let e={...Ol,...t};return e.platform==="darwin"?dA(e):e.platform==="linux"?cA(e):{ok:!1,reason:`clipboard paste is not supported on ${e.platform}`}}async function Tg(t={}){let e={...Ol,...t},n,s;if(e.platform==="darwin")n="pbpaste",s=[];else if(e.platform==="linux")if(e.env.WAYLAND_DISPLAY&&await hi(e,"wl-paste"))n="wl-paste",s=["--primary","-n"];else if(e.env.DISPLAY&&await hi(e,"xclip"))n="xclip",s=["-selection","primary","-o"];else return{ok:!1,reason:"install wl-clipboard (Wayland) or xclip (X11) to paste the selection"};else return{ok:!1,reason:`selection paste is not supported on ${e.platform}`};try{let r=await mo(e.spawn,n,s);return r.length===0?{ok:!1,reason:"selection is empty"}:{ok:!0,kind:"text",text:Fl(r.toString("utf-8"))}}catch{return{ok:!1,reason:"selection read failed"}}}async function Eg(t,e={}){let{target:n="both",...s}=e,r={...Ol,...s},i=await iA(r,t,n);if(i.ok)return i;let o=oA(r,t,n);return o.ok||o.reason!==Pg?o:i}async function iA(t,e,n){let s=Buffer.from(e,"utf-8");if(t.platform==="darwin")try{return await yd(t.spawn,"pbcopy",[],s),{ok:!0,method:"pbcopy"}}catch{return{ok:!1,reason:"pbcopy failed"}}if(t.platform==="linux"){let r=n==="clipboard"||n==="both",i=n==="primary"||n==="both";return t.env.WAYLAND_DISPLAY&&await hi(t,"wl-copy")?Cg(t,s,"wl-copy",[],["--primary"],r,i):t.env.DISPLAY&&await hi(t,"xclip")?Cg(t,s,"xclip",["-selection","clipboard","-i"],["-selection","primary","-i"],r,i):{ok:!1,reason:"install wl-clipboard (Wayland) or xclip (X11) to copy to the clipboard"}}return{ok:!1,reason:`clipboard copy is not supported on ${t.platform}`}}async function Cg(t,e,n,s,r,i,o){let a=n;if(i){try{await yd(t.spawn,n,s,e)}catch{return{ok:!1,reason:`${n} failed`}}if(o)try{await yd(t.spawn,n,r,e)}catch{}return{ok:!0,method:a}}try{return await yd(t.spawn,n,r,e),{ok:!0,method:a}}catch{return{ok:!1,reason:`${n} failed`}}}function oA(t,e,n){let s=Buffer.from(e,"utf-8").toString("base64");if(s.length>Ag)return{ok:!1,reason:`selection is too large for terminal clipboard escape (${s.length} > ${Ag} bytes)`};let i=`\x1B]52;${n==="both"?"cp":n==="primary"?"p":"c"};${s}\x07`;return t.env.TMUX&&(i=`\x1BPtmux;${i.replace(/\x1b/g,"\x1B\x1B")}\x1B\\`),(t.ttyWrite??aA)(i)?{ok:!0,method:"osc52"}:{ok:!1,reason:Pg}}function aA(t){let e=[process.stderr,process.stdout];for(let n of e)if(n&&n.isTTY)try{return n.write(t),!0}catch{}return!1}async function dA(t){let e=rA.join(t.tmpdir(),`hydra-clipboard-${Date.now()}-${process.pid}.png`),n=["set png_data to the clipboard as \xABclass PNGf\xBB",`set out_file to (open for access (POSIX file "${e}") with write permission)`,"write png_data to out_file","close access out_file"],s=[];for(let r of n)s.push("-e",r);try{await Mg(t.spawn,"osascript",s);let r=await hA(e,!0);if(r.ok||r.reason.startsWith("clipboard image is"))return r}catch{await $l.unlink(e).catch(()=>{})}try{let r=await mo(t.spawn,"pbpaste",[]);return r.length===0?{ok:!1,reason:"clipboard is empty"}:{ok:!0,kind:"text",text:Fl(r.toString("utf-8"))}}catch{return{ok:!1,reason:"clipboard read failed"}}}async function cA(t){let e=await lA(t);if(!e)return{ok:!1,reason:"install wl-clipboard (Wayland) or xclip (X11) to paste from the clipboard"};let n=await pA(t,e),s=fA(n);if(s)try{let r=await mo(t.spawn,e.cmd,e.imageArgs(s));if(r.length>0)return r.length>Sn?{ok:!1,reason:`clipboard image is ${qt(r.length)}, max ${qt(Sn)}`}:{ok:!0,kind:"image",attachment:{mimeType:s,data:r.toString("base64"),sizeBytes:r.length}}}catch{}try{let r=await mo(t.spawn,e.cmd,e.textArgs);return r.length===0?{ok:!1,reason:"clipboard is empty"}:{ok:!0,kind:"text",text:Fl(r.toString("utf-8"))}}catch{return{ok:!1,reason:"clipboard read failed"}}}async function lA(t){return t.env.WAYLAND_DISPLAY&&await hi(t,"wl-paste")?{cmd:"wl-paste",listTargetsArgs:["--list-types"],imageArgs:e=>["-t",e],textArgs:["-n"]}:t.env.DISPLAY&&await hi(t,"xclip")?{cmd:"xclip",listTargetsArgs:["-selection","clipboard","-t","TARGETS","-o"],imageArgs:e=>["-selection","clipboard","-t",e,"-o"],textArgs:["-selection","clipboard","-o"]}:null}function fA(t){let e=new Set(t.map(n=>n.toLowerCase()));for(let n of uA)if(e.has(n))return n;return null}async function pA(t,e){try{return(await mo(t.spawn,e.cmd,e.listTargetsArgs)).toString("utf-8").split(`
123
+ `),this.buffer.length===0&&(this.buffer=[""]),this.row=this.buffer.length-1,this.col=(this.buffer[this.row]??"").length}send(){let e=this.bufferText(),n=this.expandPastes(e);if(this.queueIndex>=0&&this.queueIndex<this.queue.length){let i=this.queueIndex,o=[...this.attachments];return this.clearBuffer(),n.trim().length===0?[{type:"queue-remove",index:i}]:[{type:"queue-edit",index:i,text:n,displayText:e,attachments:o}]}if(n.trim().length===0&&this.attachments.length===0)return[];let s=this.planMode,r=[...this.attachments];return this.clearBuffer(),[{type:"send",text:n,displayText:e,planMode:s,attachments:r}]}amend(){let e=this.bufferText(),n=this.expandPastes(e);if(this.queueIndex>=0&&this.queueIndex<this.queue.length){let i=this.queueIndex,o=this.planMode,a=[...this.attachments],d=n.trim().length===0&&a.length===0;return this.clearBuffer(),d?[{type:"queue-remove",index:i}]:[{type:"queue-remove",index:i},{type:"amend",text:n,displayText:e,planMode:o,attachments:a}]}if(n.trim().length===0&&this.attachments.length===0)return[];let s=this.planMode,r=[...this.attachments];return this.clearBuffer(),[{type:"amend",text:n,displayText:e,planMode:s,attachments:r}]}handleHome(){return this.row!==0||this.col!==0?(this.row=0,this.col=0,[]):[{type:"scroll-to-top"}]}handleEnd(){let e=this.buffer.length-1,n=(this.buffer[e]??"").length;return this.row!==e||this.col!==n?(this.row=e,this.col=n,[]):[{type:"scroll-to-bottom"}]}handleCtrlC(){if(this.queueIndex>=0){let e=this.queueIndex;return this.queueIndex=-1,this.restoreDraft(),[{type:"queue-remove",index:e}]}return!this.bufferIsEmpty()||this.attachments.length>0?(this.buffer=[""],this.row=0,this.col=0,this.attachments=[],this.historyIndex=-1,this.savedDraft=null,this.savedAttachments=null,[]):this.turnRunning?[{type:"cancel"}]:[{type:"exit"}]}}});var pi,md,Ml=J(()=>{"use strict";pi=class{constructor(e){this.term=e}term;lastFrameRows=new Map;lastFrameW=0;lastFrameH=0;clearCache(){this.lastFrameRows.clear(),this.lastFrameW=0,this.lastFrameH=0}ensureSize(e,n){return e!==this.lastFrameW||n!==this.lastFrameH?(this.lastFrameRows.clear(),this.lastFrameW=e,this.lastFrameH=n,!0):!1}paintRow(e,n,s){e<1||e>this.term.height||this.lastFrameRows.get(e)!==n&&(this.lastFrameRows.set(e,n),this.term.moveTo(1,e),s(),this.term.styleReset(),this.term.eraseLineAfter())}},md=class{constructor(e){this.deps=e}deps;lastRepaintAt=0;timer=null;get pendingTimer(){return this.timer}schedule(){if(!this.deps.isStarted())return;if(this.deps.isRepaintPaused()){this.deps.markRepaintPending();return}let e=this.deps.throttleMs();if(e<=0){this.deps.doRepaint();return}let s=Date.now()-this.lastRepaintAt;if(s>=e){this.cancel(),this.deps.doRepaint();return}this.timer===null&&(this.timer=setTimeout(()=>{this.timer=null,this.deps.doRepaint()},e-s))}noteRepaintStart(){this.lastRepaintAt=Date.now(),this.cancel()}cancel(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}}});import Gx from"path";function ho(t){return vg[Gx.extname(t).toLowerCase()]??null}function Qx(t){return ho(t)!==null}function _l(t){let e=t.match(/^data:(image\/[a-z0-9.+\-]+);base64,([A-Za-z0-9+/=]+)$/);if(!e)return null;let n=e[1].toLowerCase();if(!Xx.has(n))return null;let s=e[2],r=s.endsWith("==")?2:s.endsWith("=")?1:0,i=Math.floor(s.length*3/4)-r;return{mimeType:n,data:s,sizeBytes:i}}function Zx(t){return _l(t)!==null}function qt(t){return t>=1024*1024?`${(t/(1024*1024)).toFixed(1)}MB`:t>=1024?`${(t/1024).toFixed(0)}KB`:`${t}B`}function Ig(t){let e=t.trim();if(e.length===0)return null;let n=[],s=0;for(;s<e.length;){for(;s<e.length&&/\s/.test(e[s]??"");)s++;if(s>=e.length)break;let r=e[s],i="";if(r==="'"||r==='"'){let a=r;for(s++;s<e.length&&e[s]!==a;)i+=e[s],s++;if(s>=e.length)return null;s++}else for(;s<e.length&&!/\s/.test(e[s]??"");)e[s]==="\\"&&s+1<e.length?(i+=e[s+1],s+=2):(i+=e[s],s++);if(i.startsWith("data:")){if(!Zx(i))return null;n.push(i);continue}let o=i;if(o.startsWith("file://")&&(o=decodeURI(o.slice(7))),!o.startsWith("/")||!Qx(o))return null;n.push(o)}return n.length>0?n:null}var Sn,vg,Xx,gd=J(()=>{"use strict";Sn=10*1024*1024,vg={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"};Xx=new Set(Object.values(vg))});import eA from"string-width";function Sg(t,e){if(!t||e<=0)return 0;let n=0;for(let s of tA.segment(t)){let r=eA(s.segment);if(e<n+r)return s.index;if(n+=r,e===n)return s.index+s.segment.length}return t.length}function kg(t,e){if(e<=0)return 0;let n=0,s=0;for(let r of t)if(r.width>0&&e<n+r.width||(n+=r.width,s+=r.text.length,r.width>0&&e===n))return s;return s}var tA,xg=J(()=>{"use strict";tA=new Intl.Segmenter(void 0,{granularity:"grapheme"})});import{spawn as nA}from"child_process";import $l from"fs/promises";import sA from"os";import rA from"path";async function Rg(t={}){let e={...Ol,...t};return e.platform==="darwin"?dA(e):e.platform==="linux"?cA(e):{ok:!1,reason:`clipboard paste is not supported on ${e.platform}`}}async function Tg(t={}){let e={...Ol,...t},n,s;if(e.platform==="darwin")n="pbpaste",s=[];else if(e.platform==="linux")if(e.env.WAYLAND_DISPLAY&&await hi(e,"wl-paste"))n="wl-paste",s=["--primary","-n"];else if(e.env.DISPLAY&&await hi(e,"xclip"))n="xclip",s=["-selection","primary","-o"];else return{ok:!1,reason:"install wl-clipboard (Wayland) or xclip (X11) to paste the selection"};else return{ok:!1,reason:`selection paste is not supported on ${e.platform}`};try{let r=await mo(e.spawn,n,s);return r.length===0?{ok:!1,reason:"selection is empty"}:{ok:!0,kind:"text",text:Fl(r.toString("utf-8"))}}catch{return{ok:!1,reason:"selection read failed"}}}async function Eg(t,e={}){let{target:n="both",...s}=e,r={...Ol,...s},i=await iA(r,t,n);if(i.ok)return i;let o=oA(r,t,n);return o.ok||o.reason!==Pg?o:i}async function iA(t,e,n){let s=Buffer.from(e,"utf-8");if(t.platform==="darwin")try{return await yd(t.spawn,"pbcopy",[],s),{ok:!0,method:"pbcopy"}}catch{return{ok:!1,reason:"pbcopy failed"}}if(t.platform==="linux"){let r=n==="clipboard"||n==="both",i=n==="primary"||n==="both";return t.env.WAYLAND_DISPLAY&&await hi(t,"wl-copy")?Cg(t,s,"wl-copy",[],["--primary"],r,i):t.env.DISPLAY&&await hi(t,"xclip")?Cg(t,s,"xclip",["-selection","clipboard","-i"],["-selection","primary","-i"],r,i):{ok:!1,reason:"install wl-clipboard (Wayland) or xclip (X11) to copy to the clipboard"}}return{ok:!1,reason:`clipboard copy is not supported on ${t.platform}`}}async function Cg(t,e,n,s,r,i,o){let a=n;if(i){try{await yd(t.spawn,n,s,e)}catch{return{ok:!1,reason:`${n} failed`}}if(o)try{await yd(t.spawn,n,r,e)}catch{}return{ok:!0,method:a}}try{return await yd(t.spawn,n,r,e),{ok:!0,method:a}}catch{return{ok:!1,reason:`${n} failed`}}}function oA(t,e,n){let s=Buffer.from(e,"utf-8").toString("base64");if(s.length>Ag)return{ok:!1,reason:`selection is too large for terminal clipboard escape (${s.length} > ${Ag} bytes)`};let i=`\x1B]52;${n==="both"?"cp":n==="primary"?"p":"c"};${s}\x07`;return t.env.TMUX&&(i=`\x1BPtmux;${i.replace(/\x1b/g,"\x1B\x1B")}\x1B\\`),(t.ttyWrite??aA)(i)?{ok:!0,method:"osc52"}:{ok:!1,reason:Pg}}function aA(t){let e=[process.stderr,process.stdout];for(let n of e)if(n&&n.isTTY)try{return n.write(t),!0}catch{}return!1}async function dA(t){let e=rA.join(t.tmpdir(),`hydra-clipboard-${Date.now()}-${process.pid}.png`),n=["set png_data to the clipboard as \xABclass PNGf\xBB",`set out_file to (open for access (POSIX file "${e}") with write permission)`,"write png_data to out_file","close access out_file"],s=[];for(let r of n)s.push("-e",r);try{await Mg(t.spawn,"osascript",s);let r=await hA(e,!0);if(r.ok||r.reason.startsWith("clipboard image is"))return r}catch{await $l.unlink(e).catch(()=>{})}try{let r=await mo(t.spawn,"pbpaste",[]);return r.length===0?{ok:!1,reason:"clipboard is empty"}:{ok:!0,kind:"text",text:Fl(r.toString("utf-8"))}}catch{return{ok:!1,reason:"clipboard read failed"}}}async function cA(t){let e=await lA(t);if(!e)return{ok:!1,reason:"install wl-clipboard (Wayland) or xclip (X11) to paste from the clipboard"};let n=await pA(t,e),s=fA(n);if(s)try{let r=await mo(t.spawn,e.cmd,e.imageArgs(s));if(r.length>0)return r.length>Sn?{ok:!1,reason:`clipboard image is ${qt(r.length)}, max ${qt(Sn)}`}:{ok:!0,kind:"image",attachment:{mimeType:s,data:r.toString("base64"),sizeBytes:r.length}}}catch{}try{let r=await mo(t.spawn,e.cmd,e.textArgs);return r.length===0?{ok:!1,reason:"clipboard is empty"}:{ok:!0,kind:"text",text:Fl(r.toString("utf-8"))}}catch{return{ok:!1,reason:"clipboard read failed"}}}async function lA(t){return t.env.WAYLAND_DISPLAY&&await hi(t,"wl-paste")?{cmd:"wl-paste",listTargetsArgs:["--list-types"],imageArgs:e=>["-t",e],textArgs:["-n"]}:t.env.DISPLAY&&await hi(t,"xclip")?{cmd:"xclip",listTargetsArgs:["-selection","clipboard","-t","TARGETS","-o"],imageArgs:e=>["-selection","clipboard","-t",e,"-o"],textArgs:["-selection","clipboard","-o"]}:null}function fA(t){let e=new Set(t.map(n=>n.toLowerCase()));for(let n of uA)if(e.has(n))return n;return null}async function pA(t,e){try{return(await mo(t.spawn,e.cmd,e.listTargetsArgs)).toString("utf-8").split(`
124
124
  `).map(s=>s.trim()).filter(s=>s.length>0)}catch{return[]}}function Fl(t){return t.replace(/\r\n?/g,`
125
- `)}async function hi(t,e){try{return await Mg(t.spawn,"which",[e]),!0}catch{return!1}}async function hA(t,e){try{let n=await $l.readFile(t);return e&&await $l.unlink(t).catch(()=>{}),n.length===0?{ok:!1,reason:"no image on clipboard"}:n.length>Sn?{ok:!1,reason:`clipboard image is ${qt(n.length)}, max ${qt(Sn)}`}:{ok:!0,kind:"image",attachment:{mimeType:ho(t)??"image/png",data:n.toString("base64"),sizeBytes:n.length}}}catch{return{ok:!1,reason:"failed to read clipboard image"}}}function Mg(t,e,n){return new Promise((s,r)=>{let i=t(e,n);i.stdout?.on("data",()=>{}),i.stderr?.on("data",()=>{}),i.on("error",r),i.on("close",o=>{o===0?s():r(new Error(`${e} exited ${o}`))})})}function yd(t,e,n,s){return new Promise((r,i)=>{let o=t(e,n,{stdio:["pipe","ignore","ignore"]});o.stdout?.on("data",()=>{}),o.stderr?.on("data",()=>{}),o.on("error",i),o.on("close",d=>{d===0?r():i(new Error(`${e} exited ${d}`))});let a=o.stdin;if(!a){i(new Error(`${e} has no stdin`));return}a.on("error",i),a.end(s)})}function mo(t,e,n){return new Promise((s,r)=>{let i=t(e,n),o=[],a=i.stdout===null,d=null,c=!1,l=()=>{c||!a||d===null||(c=!0,d===0?s(Buffer.concat(o)):r(new Error(`${e} exited ${d}`)))};i.stdout?.on("data",f=>{o.push(typeof f=="string"?Buffer.from(f):f)}),i.stdout?.on("end",()=>{a=!0,l()}),i.stderr?.on("data",()=>{}),i.on("error",f=>{c||(c=!0,r(f))}),i.on("close",f=>{d=f??0,l()})})}var Ol,Ag,Pg,uA,Ll=q(()=>{"use strict";gd();Ol={platform:process.platform,env:process.env,spawn:nA,tmpdir:sA.tmpdir};Ag=74994;Pg="no TTY available for OSC 52 clipboard write";uA=["image/png","image/jpeg","image/gif","image/webp"]});function mA(){go===0&&process.stdout.write(_m),go++}function gA(){go!==0&&(go--,go===0&&process.stdout.write($m))}function Be(t){mA();try{t()}finally{gA()}}var go,Bl=q(()=>{"use strict";ao();go=0});import{spawn as yA}from"child_process";import{statSync as wA}from"fs";import{homedir as _g}from"os";import{isAbsolute as $g,resolve as bA}from"path";import or from"string-width";import vA from"wrap-ansi";function TA(t){let e=t.replace(/\r\n?$|\n$/,"");return RA.test(e)?e:null}function EA(t){return t.includes("LEFT")?"left":t.includes("RIGHT")?"right":t.includes("MIDDLE")?"middle":t==="MOUSE_DRAG"||t==="MOUSE_BUTTON_RELEASED"?"left":"other"}function Og(t,e,n,s=null,r=null,i=null){let o=r===null?"":`a${r}`,a=i===null?"":`s${i.start}:${i.end}${i.toEndOfLine?"f":""}`;if(!n)return`${t}|${e}|empty|${s??""}|${o}|${a}`;let d=n.iterm2Image?`i${n.iterm2Image.heightCells}:${n.iterm2Image.data.length}`:"";return`${t}|${e}|${n.prefix??""}|${n.prefixStyle??""}|${n.body}|${n.bodyStyle??""}|${n.ansi?"1":"0"}|${n.fillRow?"1":"0"}|${s??""}|${o}|${a}|${d}`}function Jn(t,e){let n=[];for(let s=0;s<t.length;s++){let r=t[s]??"";if(r.length===0){n.push({bufferIdx:s,startCol:0,endCol:0});continue}let i=0;for(;i<r.length;){if(r.length-i<=e){n.push({bufferIdx:s,startCol:i,endCol:r.length}),i=r.length;break}let o=-1;for(let a=i+e-1;a>=i;a--){let d=r[a];if(d===" "||d===" "){o=a+1;break}}o===-1&&(o=i+e),n.push({bufferIdx:s,startCol:i,endCol:o}),i=o}}return n.length===0&&n.push({bufferIdx:0,startCol:0,endCol:0}),n}function Is(t,e,n){let s=0,r=0,i=-1;for(let d=0;d<t.length;d++){let c=t[d];if(!(!c||c.bufferIdx!==e.row)&&(i=d,e.col>=c.startCol&&e.col<c.endCol)){s=d,r=e.col-c.startCol,i=-1;break}}if(i!==-1){let d=t[i];d&&(s=i,r=e.col-d.startCol)}let o=Math.min(n,Math.max(1,t.length)),a=0;return t.length>o&&(a=Math.max(0,Math.min(t.length-o,s-(o-1))),s<a&&(a=s),s>=a+o&&(a=s-o+1)),{cursorVisualRow:s,cursorVisualCol:r,windowStart:a,rendered:o}}function Fg(t,e,n,s,r=null,i=0){if(e.length===0)return;if(s.length===0){Wn(t,e,n);return}let o=e.toLowerCase(),a=0;for(;a<e.length;){let d=o.indexOf(s,a);if(d===-1){Wn(t,e.slice(a),n);return}d>a&&Wn(t,e.slice(a,d),n);let c=r!==null&&d===r;Wn(t,e.slice(d,d+s.length),c?"search-highlight-active":"search-highlight"),a=d+s.length}}function bd(t){return t==="agent"||t==="thought"||t==="heading-1"||t==="heading-2"||t==="heading-3"||t==="plan"||t==="plan-done"||t==="plan-pending"}function Wn(t,e,n){if(e.length!==0)switch(n){case"user":t.bgColorGrayscale.bold.noFormat(43,e);return;case"agent":t(e);return;case"thought":t.brightBlack(e);return;case"tool":t.brightBlue.noFormat(e);return;case"tool-status-ok":t.green.noFormat(e);return;case"tool-status-fail":t.bold.red.noFormat(e);return;case"tool-status-pending":t.dim.noFormat(e);return;case"tool-status-running":t.brightYellow.noFormat(e);return;case"tool-status-cancelled":t.dim.noFormat(e);return;case"plan":t.brightYellow(e);return;case"plan-done":t.green(e);return;case"plan-pending":t.dim(e);return;case"system":t.brightYellow.noFormat(e);return;case"info":t.cyan.noFormat(e);return;case"dim":t.dim.noFormat(e);return;case"code":t.bgColorGrayscale.white.noFormat(28,e);return;case"heading-1":t.bold.brightYellow(e);return;case"heading-2":t.bold.brightCyan(e);return;case"heading-3":t.bold(e);return;case"search-highlight":t.bgBrightYellow.black.noFormat(e);return;case"selection-highlight":t.inverse.noFormat(e);return;case"search-highlight-active":t.bgRed.brightWhite.noFormat(e);return;default:t.noFormat(e)}}function PA(t,e){return e<=0?[t]:t.length===0?[""]:vA(t,e,{hard:!0,trim:!1}).split(`
125
+ `)}async function hi(t,e){try{return await Mg(t.spawn,"which",[e]),!0}catch{return!1}}async function hA(t,e){try{let n=await $l.readFile(t);return e&&await $l.unlink(t).catch(()=>{}),n.length===0?{ok:!1,reason:"no image on clipboard"}:n.length>Sn?{ok:!1,reason:`clipboard image is ${qt(n.length)}, max ${qt(Sn)}`}:{ok:!0,kind:"image",attachment:{mimeType:ho(t)??"image/png",data:n.toString("base64"),sizeBytes:n.length}}}catch{return{ok:!1,reason:"failed to read clipboard image"}}}function Mg(t,e,n){return new Promise((s,r)=>{let i=t(e,n);i.stdout?.on("data",()=>{}),i.stderr?.on("data",()=>{}),i.on("error",r),i.on("close",o=>{o===0?s():r(new Error(`${e} exited ${o}`))})})}function yd(t,e,n,s){return new Promise((r,i)=>{let o=t(e,n,{stdio:["pipe","ignore","ignore"]});o.stdout?.on("data",()=>{}),o.stderr?.on("data",()=>{}),o.on("error",i),o.on("close",d=>{d===0?r():i(new Error(`${e} exited ${d}`))});let a=o.stdin;if(!a){i(new Error(`${e} has no stdin`));return}a.on("error",i),a.end(s)})}function mo(t,e,n){return new Promise((s,r)=>{let i=t(e,n),o=[],a=i.stdout===null,d=null,c=!1,l=()=>{c||!a||d===null||(c=!0,d===0?s(Buffer.concat(o)):r(new Error(`${e} exited ${d}`)))};i.stdout?.on("data",f=>{o.push(typeof f=="string"?Buffer.from(f):f)}),i.stdout?.on("end",()=>{a=!0,l()}),i.stderr?.on("data",()=>{}),i.on("error",f=>{c||(c=!0,r(f))}),i.on("close",f=>{d=f??0,l()})})}var Ol,Ag,Pg,uA,Ll=J(()=>{"use strict";gd();Ol={platform:process.platform,env:process.env,spawn:nA,tmpdir:sA.tmpdir};Ag=74994;Pg="no TTY available for OSC 52 clipboard write";uA=["image/png","image/jpeg","image/gif","image/webp"]});function mA(){go===0&&process.stdout.write(_m),go++}function gA(){go!==0&&(go--,go===0&&process.stdout.write($m))}function Le(t){mA();try{t()}finally{gA()}}var go,Bl=J(()=>{"use strict";ao();go=0});import{spawn as yA}from"child_process";import{statSync as wA}from"fs";import{homedir as _g}from"os";import{isAbsolute as $g,resolve as bA}from"path";import or from"string-width";import vA from"wrap-ansi";function TA(t){let e=t.replace(/\r\n?$|\n$/,"");return RA.test(e)?e:null}function EA(t){return t.includes("LEFT")?"left":t.includes("RIGHT")?"right":t.includes("MIDDLE")?"middle":t==="MOUSE_DRAG"||t==="MOUSE_BUTTON_RELEASED"?"left":"other"}function Og(t,e,n,s=null,r=null,i=null){let o=r===null?"":`a${r}`,a=i===null?"":`s${i.start}:${i.end}${i.toEndOfLine?"f":""}`;if(!n)return`${t}|${e}|empty|${s??""}|${o}|${a}`;let d=n.iterm2Image?`i${n.iterm2Image.heightCells}:${n.iterm2Image.data.length}`:"";return`${t}|${e}|${n.prefix??""}|${n.prefixStyle??""}|${n.body}|${n.bodyStyle??""}|${n.ansi?"1":"0"}|${n.fillRow?"1":"0"}|${s??""}|${o}|${a}|${d}`}function Jn(t,e){let n=[];for(let s=0;s<t.length;s++){let r=t[s]??"";if(r.length===0){n.push({bufferIdx:s,startCol:0,endCol:0});continue}let i=0;for(;i<r.length;){if(r.length-i<=e){n.push({bufferIdx:s,startCol:i,endCol:r.length}),i=r.length;break}let o=-1;for(let a=i+e-1;a>=i;a--){let d=r[a];if(d===" "||d===" "){o=a+1;break}}o===-1&&(o=i+e),n.push({bufferIdx:s,startCol:i,endCol:o}),i=o}}return n.length===0&&n.push({bufferIdx:0,startCol:0,endCol:0}),n}function Is(t,e,n){let s=0,r=0,i=-1;for(let d=0;d<t.length;d++){let c=t[d];if(!(!c||c.bufferIdx!==e.row)&&(i=d,e.col>=c.startCol&&e.col<c.endCol)){s=d,r=e.col-c.startCol,i=-1;break}}if(i!==-1){let d=t[i];d&&(s=i,r=e.col-d.startCol)}let o=Math.min(n,Math.max(1,t.length)),a=0;return t.length>o&&(a=Math.max(0,Math.min(t.length-o,s-(o-1))),s<a&&(a=s),s>=a+o&&(a=s-o+1)),{cursorVisualRow:s,cursorVisualCol:r,windowStart:a,rendered:o}}function Fg(t,e,n,s,r=null,i=0){if(e.length===0)return;if(s.length===0){Wn(t,e,n);return}let o=e.toLowerCase(),a=0;for(;a<e.length;){let d=o.indexOf(s,a);if(d===-1){Wn(t,e.slice(a),n);return}d>a&&Wn(t,e.slice(a,d),n);let c=r!==null&&d===r;Wn(t,e.slice(d,d+s.length),c?"search-highlight-active":"search-highlight"),a=d+s.length}}function bd(t){return t==="agent"||t==="thought"||t==="heading-1"||t==="heading-2"||t==="heading-3"||t==="plan"||t==="plan-done"||t==="plan-pending"}function Wn(t,e,n){if(e.length!==0)switch(n){case"user":t.bgColorGrayscale.bold.noFormat(43,e);return;case"agent":t(e);return;case"thought":t.brightBlack(e);return;case"tool":t.brightBlue.noFormat(e);return;case"tool-status-ok":t.green.noFormat(e);return;case"tool-status-fail":t.bold.red.noFormat(e);return;case"tool-status-pending":t.dim.noFormat(e);return;case"tool-status-running":t.brightYellow.noFormat(e);return;case"tool-status-cancelled":t.dim.noFormat(e);return;case"plan":t.brightYellow(e);return;case"plan-done":t.green(e);return;case"plan-pending":t.dim(e);return;case"system":t.brightYellow.noFormat(e);return;case"info":t.cyan.noFormat(e);return;case"dim":t.dim.noFormat(e);return;case"code":t.bgColorGrayscale.white.noFormat(28,e);return;case"heading-1":t.bold.brightYellow(e);return;case"heading-2":t.bold.brightCyan(e);return;case"heading-3":t.bold(e);return;case"search-highlight":t.bgBrightYellow.black.noFormat(e);return;case"selection-highlight":t.inverse.noFormat(e);return;case"search-highlight-active":t.bgRed.brightWhite.noFormat(e);return;default:t.noFormat(e)}}function PA(t,e){return e<=0?[t]:t.length===0?[""]:vA(t,e,{hard:!0,trim:!1}).split(`
126
126
  `)}function jg(t){Ug=t}function vs(t){return or(t,{ambiguousIsNarrow:!Ug})}function yo(t,e){if(t.charCodeAt(e)!==94)return null;let n=t[e+1];if(n===void 0)return null;if(n==="^")return{text:"^^",width:1};if(n==="["){let s=t.indexOf("]",e+2);if(s!==-1)return{text:t.slice(e,s+1),width:0}}return MA.test(n)?{text:t.slice(e,e+2),width:0}:null}function _A(t){let e=new Array(t.length+1).fill(0),n="",s=0;for(;s<t.length;){e[s]=n.length;let r=yo(t,s);if(r){r.width>0&&(n+="^");for(let i=1;i<r.text.length;i++)e[s+i]=n.length;s+=r.text.length;continue}n+=t[s],s+=1}return e[t.length]=n.length,{clean:n,rawToClean:e}}function $A(t){if(!t.includes("^"))return t;let e="",n=0;for(;n<t.length;){let s=yo(t,n);if(s){s.width>0&&(e+="^"),n+=s.text.length;continue}e+=t[n],n+=1}return e}function qg(t){if(!t.includes("^"))return!1;for(let e=0;e<t.length;e++)if(yo(t,e))return!0;return!1}function*Vl(t){let e=0;for(;e<t.length;){let n=yo(t,e);if(n){yield{text:n.text,width:n.width},e+=n.text.length;continue}let s=t.length,r=t.indexOf("^",e);for(;r!==-1&&r<t.length;){if(yo(t,r)){s=r;break}r=t.indexOf("^",r+1)}if(s===e){yield{text:"^",width:1},e+=1;continue}for(let{segment:i}of Kl.segment(t.slice(e,s)))yield{text:i,width:vs(i)};e=s}}function OA(t,e,n){let s=`\x1B]1337;File=inline=1;height=${e};preserveAspectRatio=1:${t}\x07`;return n?`\x1BPtmux;${s.replace(/\x1b/g,"\x1B\x1B")}\x1B\\`:s}function FA(t,e,n={}){if(e<=0)return[t];if(t.length===0)return[""];let s=n.stripMarkup===!0&&qg(t);return!s&&!Hg.test(t)?LA(t,e):BA(t,e,s)}function LA(t,e){let n=[],s=t;for(;s.length>e;){let r=s.slice(0,e+1),i=-1;for(let o=Math.min(e,r.length-1);o>=0;o--)if(r[o]===" "){i=o;break}i<=0?(n.push(s.slice(0,e)),s=s.slice(e)):(n.push(s.slice(0,i)),s=s.slice(i+1))}return n.push(s),n}function BA(t,e,n){let s=[],r=n?[...Vl(t)]:NA(t),i=0;for(;i<r.length;){let o="",a=0,d=-1,c="";for(;i<r.length;){let l=r[i];if(a+l.width>e){l.text===" "&&l.width===1&&(d=i,c=o);break}l.text===" "&&l.width===1&&(d=i,c=o),o+=l.text,a+=l.width,i+=1}if(i>=r.length){s.push(o);break}d>=0?(s.push(c),i=d+1):o.length===0?(s.push(r[i].text),i+=1):s.push(o)}return s}function NA(t){let e=[];for(let{segment:n}of Kl.segment(t))e.push({text:n,width:vs(n)});return e}function bt(t,e,n={}){if(e<=0)return"";let s=n.stripMarkup===!0&&qg(t);if(!s&&t.length<=e&&!Hg.test(t))return t;if(!s)return vs(t)<=e?t:e<=1?Lg(t,e):Lg(t,e-1)+"\u2026";let r=[...Vl(t)],i=0;for(let o of r)i+=o.width;return i<=e?t:e<=1?Bg(r,e):Bg(r,e-1)+"\u2026"}function Lg(t,e){if(e<=0)return"";let n="",s=0;for(let{segment:r}of Kl.segment(t)){let i=vs(r);if(s+i>e)break;n+=r,s+=i}return n}function Bg(t,e){if(e<=0)return"";let n="",s=0;for(let r of t){if(s+r.width>e)break;n+=r.text,s+=r.width}return n}function DA(t){let e=t.indexOf(`
127
- `);return e===-1?t:`${t.slice(0,e)} \u21B5`}function Ng(t){if(!t)return null;let e=[];return typeof t.used=="number"?typeof t.size=="number"&&t.size>0?e.push(`${vd(t.used)}/${vd(t.size)}`):e.push(vd(t.used)):typeof t.size=="number"&&e.push(`/${vd(t.size)}`),typeof t.costAmount=="number"&&e.push(Zc(t.costAmount,t.costCurrency)),e.length===0?null:e.join(" \xB7 ")}function vd(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function kd(t){switch(t){case"ENTER":case"KP_ENTER":return"enter";case"ALT_ENTER":case"META_ENTER":return"alt-enter";case"SHIFT_ENTER":return"shift-enter";case"CTRL_ENTER":return"ctrl-enter";case"CTRL_J":return"ctrl-enter";case"ALT_B":case"META_B":return"alt-b";case"ALT_F":case"META_F":return"alt-f";case"ALT_N":case"META_N":return"alt-n";case"ALT_TAB":case"META_TAB":return"alt-tab";case"CTRL_T":return"ctrl-t";case"SHIFT_TAB":return"shift-tab";case"TAB":return"tab";case"UP":return"up";case"DOWN":return"down";case"LEFT":return"left";case"RIGHT":return"right";case"HOME":return"home";case"END":return"end";case"BACKSPACE":return"backspace";case"DELETE":return"delete";case"CTRL_A":return"ctrl-a";case"CTRL_B":return"ctrl-b";case"CTRL_C":return"ctrl-c";case"CTRL_D":return"ctrl-d";case"CTRL_E":return"ctrl-e";case"CTRL_F":return"ctrl-f";case"CTRL_G":return"ctrl-g";case"CTRL_K":return"ctrl-k";case"CTRL_L":return"ctrl-l";case"CTRL_N":return"ctrl-n";case"CTRL_O":return"ctrl-o";case"CTRL_P":return"ctrl-p";case"CTRL_R":return"ctrl-r";case"CTRL_S":return"ctrl-s";case"CTRL_U":return"ctrl-u";case"CTRL_V":return"ctrl-v";case"CTRL_W":return"ctrl-w";case"CTRL_X":return"ctrl-x";case"CTRL_Y":return"ctrl-y";case"ESCAPE":return"escape";default:return null}}function Id(){let t=[ii,oi,Tm,ai,Em,wl,Hn,tr,nr,er,Zs,"\x1B>",oo,sd,"\x1B]9;4;0\x07",xm].join("");try{process.stdout.write(t)}catch{}}function Wg(t){let e=[["width",80],["height",24]];for(let[n,s]of e){let r=Object.getOwnPropertyDescriptor(t,n);if(r&&r.get)continue;let i=Symbol(`raw-${n}`),o=t;o[i]=r?r.value:void 0,Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get(){let a=this[i];return typeof a=="number"&&Number.isFinite(a)&&a>0?a:s},set(a){this[i]=a}})}}function Dg(t,e){let n={97:"ctrl-a",98:"ctrl-b",99:"ctrl-c",100:"ctrl-d",101:"ctrl-e",102:"ctrl-f",103:"ctrl-g",104:"backspace",105:"tab",106:"ctrl-enter",107:"ctrl-k",108:"ctrl-l",109:"enter",110:"ctrl-n",111:"ctrl-o",112:"ctrl-p",114:"ctrl-r",115:"ctrl-s",116:"ctrl-t",117:"ctrl-u",118:"ctrl-v",119:"ctrl-w",120:"ctrl-x",121:"ctrl-y"};return e===5?n[t]??null:t===27?"escape":t===9?e===2?"shift-tab":e===3?"alt-tab":e===1?"tab":null:t===13?e===2?"shift-enter":e===3?"alt-enter":e===5?"ctrl-enter":e===1?"enter":null:t===127&&e===1?"backspace":e===3?t===98||t===66?"alt-b":t===102||t===70?"alt-f":t===110||t===78?"alt-n":null:null}var Nl,wd,Dl,Hl,IA,We,Ze,Je,Ul,jl,SA,kA,xA,ql,Wl,Jl,AA,CA,RA,Sd,Hg,Kl,Ug,MA,zl,Yl=q(()=>{"use strict";Ml();el();ge();hn();gd();ni();xg();Ll();Bl();ao();Nl=500,wd=1,Dl=/[A-Za-z0-9_]/,Hl=/[A-Za-z0-9_./\-~+@]/,IA=/\x1b\[[0-9;]*[A-Za-z]/g,We=1,Ze=1,Je=1,Ul=8,jl=5,SA=12,kA=12,xA=30,ql=6,Wl=4,Jl=2,AA=1e3,CA=1e4,RA=/^(https?|ftp):\/\/\S+$/;Sd=class{term;dispatcher;onKey;onBlockClick;onBlockDoubleClick;onMouse;onBlockVisible;onSuspend;pendingVisibleKeys=new Set;lines=[];keyedBlocks=new Map;stickyBottomKey=null;streamingActive=!1;hideThoughts=!1;lastPromptRows=0;queuedTexts=[];lastQueueEditingIndex=-1;attachments=[];repaintPaused=0;repaintPending=!1;contentRepaintThrottleMs;painter;scheduler;maxScrollbackLines;nextLineId=1;lineIds=new WeakMap;wrapCache=new Map;wrapCacheWidth=0;wrapOrigin=new WeakMap;permissionPrompt=null;optionsPrompt=null;confirmPrompt=null;helpPrompt=null;completions=[];scrollOffset=0;scrollbackSearch=null;scrollbackHighlight=null;selection=null;selectionRenderBounds=null;bannerNotification=null;bannerNotificationTimer=null;bannerSearchIndicator=null;btwOverlayOpen=!1;btwOverlayMaxHeight=12;btwOverlayLines=[];btwOverlayLabel="";btwOverlayStatus="busy";btwOverlaySessionId=null;btwOverlayUsage=void 0;focusedPane="main";banner={status:"ready",currentMode:void 0,hint:"\u21E7\u21E5 mode \xB7 \u2303P pick \xB7 \u2303G guide \xB7 \u2303D detach",queued:0};sessionbar={agent:"?",cwd:"?",sessionId:"?"};lastWindowTitle=null;resizeHandler;keyHandler;mouseHandler;pressCell=null;selectionAnchor=null;selectionDragStarted=!1;doubleClickPending=!1;lastLeftClick=null;pendingBlockClick=null;started=!1;terminalKitStdinHandler=null;pasteActive=!1;pasteBuffer="";rawStdinHandler;mouseEnabled;inAppSelectionEnabled;selectionClipboard;openFileCommand;progressIndicatorEnabled;emergencyCleanupInstalled=!1;onProcessExit=null;onProcessSignal=null;onProcessUncaught=null;selectiveMouseSupported=!1;selectiveMouseProbing=!1;selectiveMouseProbeTimer=null;lastProgressState=0;readonly;constructor(e){this.term=e.term,this.dispatcher=e.dispatcher;let n=e.onKey;this.onKey=i=>{this.selection!==null&&i.length>0&&this.clearSelection(),n(i)},this.onBlockClick=e.onBlockClick,this.onBlockDoubleClick=e.onBlockDoubleClick,this.onMouse=e.onMouse,this.onBlockVisible=e.onBlockVisible,this.onSuspend=e.onSuspend,this.contentRepaintThrottleMs=e.repaintThrottleMs??AA,this.painter=new pi(this.term),this.scheduler=new md({isStarted:()=>this.started,isRepaintPaused:()=>this.repaintPaused>0,markRepaintPending:()=>{this.repaintPending=!0},throttleMs:()=>this.contentRepaintThrottleMs,doRepaint:()=>this.repaint()}),this.maxScrollbackLines=e.maxScrollbackLines??CA,this.mouseEnabled=e.mouse??!1,this.inAppSelectionEnabled=e.inAppSelection??this.mouseEnabled,this.selectionClipboard=e.selectionClipboard??"both";let s=e.openFileCommand,r=typeof s=="string"?s.split(/\s+/).filter(i=>i.length>0):s;this.openFileCommand=r&&r.length>0?r:null,this.progressIndicatorEnabled=e.progressIndicator??!0,this.readonly=e.readonly??!1,this.resizeHandler=()=>this.repaint(),this.keyHandler=(i,o,a)=>this.handleKey(i,a),this.mouseHandler=(i,o)=>this.handleMouse(i,o),this.rawStdinHandler=i=>this.handleRawStdin(i)}start(e={}){this.started||(this.started=!0,e.skipFullscreen||this.term.fullscreen(!0),this.painter.clearCache(),this.lastWindowTitle=null,process.stdout.write(yl),this.mouseEnabled?this.term.grabInput({mouse:"drag"}):this.term.grabInput(!0),this.term.hideCursor(!1),this.term.on("key",this.keyHandler),this.mouseEnabled&&this.term.on("mouse",this.mouseHandler),this.term.on("resize",this.resizeHandler),this.installBracketedPaste(),this.installSelectiveMouseReporting(),this.installEmergencyCleanup(),this.lastProgressState=0,this.writeProgressIndicator(this.banner.status==="busy"?3:0),this.repaint())}stop(e={}){this.started&&(this.bannerNotificationTimer&&(clearTimeout(this.bannerNotificationTimer),this.bannerNotificationTimer=null),this.scheduler.cancel(),this.cancelPendingBlockClick(),this.uninstallSelectiveMouseReporting(),this.uninstallBracketedPaste(),this.uninstallEmergencyCleanup(),this.term.off("key",this.keyHandler),this.mouseEnabled&&this.term.off("mouse",this.mouseHandler),this.term.off("resize",this.resizeHandler),this.term.grabInput(!1),this.term.hideCursor(!1),e.keepFullscreen||process.stdout.write(oo),this.writeProgressIndicator(0),this.started=!1,e.keepFullscreen||(Id(),this.term.fullscreen(!1),this.term(`
127
+ `);return e===-1?t:`${t.slice(0,e)} \u21B5`}function Ng(t){if(!t)return null;let e=[];return typeof t.used=="number"?typeof t.size=="number"&&t.size>0?e.push(`${vd(t.used)}/${vd(t.size)}`):e.push(vd(t.used)):typeof t.size=="number"&&e.push(`/${vd(t.size)}`),typeof t.costAmount=="number"&&e.push(Zc(t.costAmount,t.costCurrency)),e.length===0?null:e.join(" \xB7 ")}function vd(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function kd(t){switch(t){case"ENTER":case"KP_ENTER":return"enter";case"ALT_ENTER":case"META_ENTER":return"alt-enter";case"SHIFT_ENTER":return"shift-enter";case"CTRL_ENTER":return"ctrl-enter";case"CTRL_J":return"ctrl-enter";case"ALT_B":case"META_B":return"alt-b";case"ALT_F":case"META_F":return"alt-f";case"ALT_N":case"META_N":return"alt-n";case"ALT_TAB":case"META_TAB":return"alt-tab";case"CTRL_T":return"ctrl-t";case"SHIFT_TAB":return"shift-tab";case"TAB":return"tab";case"UP":return"up";case"DOWN":return"down";case"LEFT":return"left";case"RIGHT":return"right";case"HOME":return"home";case"END":return"end";case"BACKSPACE":return"backspace";case"DELETE":return"delete";case"CTRL_A":return"ctrl-a";case"CTRL_B":return"ctrl-b";case"CTRL_C":return"ctrl-c";case"CTRL_D":return"ctrl-d";case"CTRL_E":return"ctrl-e";case"CTRL_F":return"ctrl-f";case"CTRL_G":return"ctrl-g";case"CTRL_K":return"ctrl-k";case"CTRL_L":return"ctrl-l";case"CTRL_N":return"ctrl-n";case"CTRL_O":return"ctrl-o";case"CTRL_P":return"ctrl-p";case"CTRL_R":return"ctrl-r";case"CTRL_S":return"ctrl-s";case"CTRL_U":return"ctrl-u";case"CTRL_V":return"ctrl-v";case"CTRL_W":return"ctrl-w";case"CTRL_X":return"ctrl-x";case"CTRL_Y":return"ctrl-y";case"ESCAPE":return"escape";default:return null}}function Id(){let t=[ii,oi,Tm,ai,Em,wl,Hn,tr,nr,er,Zs,"\x1B>",oo,sd,"\x1B]9;4;0\x07",xm].join("");try{process.stdout.write(t)}catch{}}function Wg(t){let e=[["width",80],["height",24]];for(let[n,s]of e){let r=Object.getOwnPropertyDescriptor(t,n);if(r&&r.get)continue;let i=Symbol(`raw-${n}`),o=t;o[i]=r?r.value:void 0,Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get(){let a=this[i];return typeof a=="number"&&Number.isFinite(a)&&a>0?a:s},set(a){this[i]=a}})}}function Dg(t,e){let n={97:"ctrl-a",98:"ctrl-b",99:"ctrl-c",100:"ctrl-d",101:"ctrl-e",102:"ctrl-f",103:"ctrl-g",104:"backspace",105:"tab",106:"ctrl-enter",107:"ctrl-k",108:"ctrl-l",109:"enter",110:"ctrl-n",111:"ctrl-o",112:"ctrl-p",114:"ctrl-r",115:"ctrl-s",116:"ctrl-t",117:"ctrl-u",118:"ctrl-v",119:"ctrl-w",120:"ctrl-x",121:"ctrl-y"};return e===5?n[t]??null:t===27?"escape":t===9?e===2?"shift-tab":e===3?"alt-tab":e===1?"tab":null:t===13?e===2?"shift-enter":e===3?"alt-enter":e===5?"ctrl-enter":e===1?"enter":null:t===127&&e===1?"backspace":e===3?t===98||t===66?"alt-b":t===102||t===70?"alt-f":t===110||t===78?"alt-n":null:null}var Nl,wd,Dl,Hl,IA,qe,Ze,We,Ul,jl,SA,kA,xA,ql,Wl,Jl,AA,CA,RA,Sd,Hg,Kl,Ug,MA,zl,Yl=J(()=>{"use strict";Ml();el();ge();hn();gd();ni();xg();Ll();Bl();ao();Nl=500,wd=1,Dl=/[A-Za-z0-9_]/,Hl=/[A-Za-z0-9_./\-~+@]/,IA=/\x1b\[[0-9;]*[A-Za-z]/g,qe=1,Ze=1,We=1,Ul=8,jl=5,SA=12,kA=12,xA=30,ql=6,Wl=4,Jl=2,AA=1e3,CA=1e4,RA=/^(https?|ftp):\/\/\S+$/;Sd=class{term;dispatcher;onKey;onBlockClick;onBlockDoubleClick;onMouse;onBlockVisible;onSuspend;pendingVisibleKeys=new Set;lines=[];keyedBlocks=new Map;stickyBottomKey=null;streamingActive=!1;hideThoughts=!1;lastPromptRows=0;queuedTexts=[];lastQueueEditingIndex=-1;attachments=[];repaintPaused=0;repaintPending=!1;contentRepaintThrottleMs;painter;scheduler;maxScrollbackLines;nextLineId=1;lineIds=new WeakMap;wrapCache=new Map;wrapCacheWidth=0;wrapOrigin=new WeakMap;permissionPrompt=null;optionsPrompt=null;confirmPrompt=null;helpPrompt=null;completions=[];scrollOffset=0;scrollbackSearch=null;scrollbackHighlight=null;selection=null;selectionRenderBounds=null;bannerNotification=null;bannerNotificationTimer=null;bannerSearchIndicator=null;btwOverlayOpen=!1;btwOverlayMaxHeight=12;btwOverlayLines=[];btwOverlayLabel="";btwOverlayStatus="busy";btwOverlaySessionId=null;btwOverlayUsage=void 0;focusedPane="main";banner={status:"ready",currentMode:void 0,hint:"\u21E7\u21E5 mode \xB7 \u2303P pick \xB7 \u2303G guide \xB7 \u2303D detach",queued:0};sessionbar={agent:"?",cwd:"?",sessionId:"?"};lastWindowTitle=null;resizeHandler;keyHandler;mouseHandler;pressCell=null;selectionAnchor=null;selectionDragStarted=!1;doubleClickPending=!1;lastLeftClick=null;pendingBlockClick=null;started=!1;terminalKitStdinHandler=null;pasteActive=!1;pasteBuffer="";rawStdinHandler;mouseEnabled;inAppSelectionEnabled;selectionClipboard;openFileCommand;progressIndicatorEnabled;emergencyCleanupInstalled=!1;onProcessExit=null;onProcessSignal=null;onProcessUncaught=null;selectiveMouseSupported=!1;selectiveMouseProbing=!1;selectiveMouseProbeTimer=null;lastProgressState=0;readonly;constructor(e){this.term=e.term,this.dispatcher=e.dispatcher;let n=e.onKey;this.onKey=i=>{this.selection!==null&&i.length>0&&this.clearSelection(),n(i)},this.onBlockClick=e.onBlockClick,this.onBlockDoubleClick=e.onBlockDoubleClick,this.onMouse=e.onMouse,this.onBlockVisible=e.onBlockVisible,this.onSuspend=e.onSuspend,this.contentRepaintThrottleMs=e.repaintThrottleMs??AA,this.painter=new pi(this.term),this.scheduler=new md({isStarted:()=>this.started,isRepaintPaused:()=>this.repaintPaused>0,markRepaintPending:()=>{this.repaintPending=!0},throttleMs:()=>this.contentRepaintThrottleMs,doRepaint:()=>this.repaint()}),this.maxScrollbackLines=e.maxScrollbackLines??CA,this.mouseEnabled=e.mouse??!1,this.inAppSelectionEnabled=e.inAppSelection??this.mouseEnabled,this.selectionClipboard=e.selectionClipboard??"both";let s=e.openFileCommand,r=typeof s=="string"?s.split(/\s+/).filter(i=>i.length>0):s;this.openFileCommand=r&&r.length>0?r:null,this.progressIndicatorEnabled=e.progressIndicator??!0,this.readonly=e.readonly??!1,this.resizeHandler=()=>this.repaint(),this.keyHandler=(i,o,a)=>this.handleKey(i,a),this.mouseHandler=(i,o)=>this.handleMouse(i,o),this.rawStdinHandler=i=>this.handleRawStdin(i)}start(e={}){this.started||(this.started=!0,e.skipFullscreen||this.term.fullscreen(!0),this.painter.clearCache(),this.lastWindowTitle=null,process.stdout.write(yl),this.mouseEnabled?this.term.grabInput({mouse:"drag"}):this.term.grabInput(!0),this.term.hideCursor(!1),this.term.on("key",this.keyHandler),this.mouseEnabled&&this.term.on("mouse",this.mouseHandler),this.term.on("resize",this.resizeHandler),this.installBracketedPaste(),this.installSelectiveMouseReporting(),this.installEmergencyCleanup(),this.lastProgressState=0,this.writeProgressIndicator(this.banner.status==="busy"?3:0),this.repaint())}stop(e={}){this.started&&(this.bannerNotificationTimer&&(clearTimeout(this.bannerNotificationTimer),this.bannerNotificationTimer=null),this.scheduler.cancel(),this.cancelPendingBlockClick(),this.uninstallSelectiveMouseReporting(),this.uninstallBracketedPaste(),this.uninstallEmergencyCleanup(),this.term.off("key",this.keyHandler),this.mouseEnabled&&this.term.off("mouse",this.mouseHandler),this.term.off("resize",this.resizeHandler),this.term.grabInput(!1),this.term.hideCursor(!1),e.keepFullscreen||process.stdout.write(oo),this.writeProgressIndicator(0),this.started=!1,e.keepFullscreen||(Id(),this.term.fullscreen(!1),this.term(`
128
128
  `)))}installBracketedPaste(){process.stdout.write(nd),process.stdout.write(Cm),process.stdout.write(Rm),process.stdout.write(Am);let e=this.term;!e.stdin||typeof e.onStdin!="function"||(this.terminalKitStdinHandler=e.onStdin,e.stdin.removeListener("data",e.onStdin),e.stdin.on("data",this.rawStdinHandler))}uninstallBracketedPaste(){process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(er),process.stdout.write(Zs),process.stdout.write("\x1B>");let e=this.term;!e.stdin||this.terminalKitStdinHandler===null||(e.stdin.removeListener("data",this.rawStdinHandler),e.stdin.on("data",this.terminalKitStdinHandler),this.terminalKitStdinHandler=null,this.pasteActive=!1,this.pasteBuffer="")}installSelectiveMouseReporting(){this.mouseEnabled||this.selectiveMouseProbing||this.selectiveMouseSupported||(this.selectiveMouseProbing=!0,process.stdout.write(Pm),this.selectiveMouseProbeTimer=setTimeout(()=>{this.selectiveMouseProbing=!1,this.selectiveMouseProbeTimer=null},250))}uninstallSelectiveMouseReporting(){this.selectiveMouseProbeTimer&&(clearTimeout(this.selectiveMouseProbeTimer),this.selectiveMouseProbeTimer=null),this.selectiveMouseProbing=!1,this.selectiveMouseSupported&&(process.stdout.write(wl),this.selectiveMouseSupported=!1)}installEmergencyCleanup(){this.emergencyCleanupInstalled||(this.emergencyCleanupInstalled=!0,this.onProcessExit=()=>Id(),this.onProcessSignal=e=>{Id(),process.off(e,this.onProcessSignal),process.kill(process.pid,e)},this.onProcessUncaught=e=>{Id(),process.stderr.write(`
129
129
  uncaught: ${e.stack??e.message}
130
130
  `),process.exit(1)},process.on("exit",this.onProcessExit),process.on("SIGTERM",this.onProcessSignal),process.on("SIGHUP",this.onProcessSignal),process.on("uncaughtException",this.onProcessUncaught))}uninstallEmergencyCleanup(){this.emergencyCleanupInstalled&&(this.emergencyCleanupInstalled=!1,this.onProcessExit&&(process.off("exit",this.onProcessExit),this.onProcessExit=null),this.onProcessSignal&&(process.off("SIGTERM",this.onProcessSignal),process.off("SIGHUP",this.onProcessSignal),this.onProcessSignal=null),this.onProcessUncaught&&(process.off("uncaughtException",this.onProcessUncaught),this.onProcessUncaught=null))}consumeSelectiveMouseSequences(e){if(!e.includes("\x1B["))return e;if(this.selectiveMouseProbing){let a=/\x1b\[\?(\d+);(\d+) w/.exec(e);a&&(this.selectiveMouseProbing=!1,this.selectiveMouseProbeTimer&&(clearTimeout(this.selectiveMouseProbeTimer),this.selectiveMouseProbeTimer=null),this.selectiveMouseSupported=!0,process.stdout.write(Mm),e=e.slice(0,a.index)+e.slice(a.index+a[0].length))}if(!this.selectiveMouseSupported)return e;let n=/\x1b\[<(64|65);\d+;\d+M/g,s="",r=0,i;for(;(i=n.exec(e))!==null;)s+=e.slice(r,i.index),i[1]==="64"?this.scrollBy(3):this.scrollBy(-3),r=i.index+i[0].length;return s+=e.slice(r),s}handleRawStdin(e){let n=e.toString("binary");if(n=this.consumeSelectiveMouseSequences(n),n.length!==0){if(this.pasteActive){this.handleRawStdinSegment(n);return}if(n===""&&this.onSuspend){this.onSuspend();return}if(this.onSuspend&&(n==="\x1B[27;5;122~"||n==="\x1B[122;5u")){this.onSuspend();return}if(/\x1b\[27;\d+;\d+~/.test(n)){this.handleCsi27Stdin(n);return}if(n.includes(ri)){this.handleRawStdinSegment(n);return}if(n.includes(`
131
131
  `)){let s=n.split(`
132
132
  `);if(s.filter(i=>i.length>0).length>1){this.onKey([{type:"paste",text:n.replace(/\r/g,"")}]);return}for(let i=0;i<s.length;i++)s[i].length>0&&this.handleRawStdin(Buffer.from(s[i],"binary")),i<s.length-1&&this.onKey([{type:"key",name:"ctrl-enter"}]);return}if(n.includes("\x1B[")&&/\x1b\[\d+(?:;\d+)?u/.test(n)){this.handleCsiUStdin(n);return}this.handleRawStdinSegment(n)}}handleCsi27Stdin(e){let n=/\x1b\[27;(\d+);(\d+)~/g,s=0,r;for(;(r=n.exec(e))!==null;){r.index>s&&this.handleRawStdin(Buffer.from(e.slice(s,r.index),"binary"));let i=parseInt(r[1],10),o=parseInt(r[2],10),a=Dg(o,i);a!==null?this.onKey([{type:"key",name:a}]):(i===1||i===2)&&o>=32&&o<127&&this.handleRawStdinSegment(String.fromCharCode(o)),s=r.index+r[0].length}s<e.length&&this.handleRawStdin(Buffer.from(e.slice(s),"binary"))}handleCsiUStdin(e){let n=/\x1b\[(\d+)(?:;(\d+))?u/g,s=0,r;for(;(r=n.exec(e))!==null;){r.index>s&&this.handleRawStdin(Buffer.from(e.slice(s,r.index),"binary"));let i=parseInt(r[1],10),o=r[2]!==void 0?parseInt(r[2],10):1,a=Dg(i,o);a!==null&&this.onKey([{type:"key",name:a}]),s=r.index+r[0].length}s<e.length&&this.handleRawStdin(Buffer.from(e.slice(s),"binary"))}handleRawStdinSegment(e){let n=ri,s=io;for(;e.length>0;){if(this.pasteActive){let i=e.indexOf(s);if(i===-1){this.pasteBuffer+=e;return}this.pasteBuffer+=e.slice(0,i),e=e.slice(i+s.length),this.pasteActive=!1;let o=Buffer.from(this.pasteBuffer,"binary").toString("utf-8").replace(/\r\n?/g,`
133
133
  `);this.pasteBuffer="";let a=Ig(o);a!==null?this.onKey([{type:"attachment-paths",paths:a}]):this.onKey([{type:"paste",text:o}]);continue}let r=e.indexOf(n);if(r===-1){let i=TA(e);i!==null?this.onKey([{type:"paste",text:i}]):this.terminalKitStdinHandler&&this.terminalKitStdinHandler(Buffer.from(e,"binary"));return}r>0&&this.terminalKitStdinHandler&&this.terminalKitStdinHandler(Buffer.from(e.slice(0,r),"binary")),e=e.slice(r+n.length),this.pasteActive=!0}}width(){return this.term.width||0}appendLines(e){e.length!==0&&(this.streamingActive=!1,this.lines.push(...e),this.trackLines(e),this.adjustScrollForRowChange(this.wrappedRowsOfMany(e)),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint())}appendLine(e){this.streamingActive=!1,this.lines.push(e),this.trackLine(e),this.adjustScrollForRowChange(this.wrappedRowsOf(e)),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}adjustScrollForRowChange(e){this.scrollOffset>0&&e!==0&&(this.scrollOffset=Math.max(0,this.scrollOffset+e))}wrappedRowsOf(e){let n=this.term.width;return this.wrapCacheWidth!==n&&(this.wrapCache.clear(),this.wrapCacheWidth=n),this.wrapOne(e,n).length}wrappedRowsOfMany(e){let n=0;for(let s of e)n+=this.wrappedRowsOf(s);return n}trackLine(e){this.lineIds.set(e,this.nextLineId++)}trackLines(e){for(let n of e)this.trackLine(n)}forgetLine(e){let n=this.lineIds.get(e);n!==void 0&&this.wrapCache.delete(n)}trimScrollback(){let e=this.lines.length-this.maxScrollbackLines;if(e<=0)return;let n=this.lines.splice(0,e);for(let s of n)this.forgetLine(s);this.invalidateSelectionIfTouches(n);for(let[s,r]of[...this.keyedBlocks.entries()])r.start-=e,r.start<0&&this.keyedBlocks.delete(s)}upsertLine(e,n){this.upsertLines(e,[n])}upsertLines(e,n){if(n.length===0)return;for(let o of n)o.blockKey=e;let s=this.keyedBlocks.get(e),r=!1,i=0;if(s){let o=s.start+s.count;r=o>=this.lines.length;let a=this.wrappedRowsOfMany(this.lines.slice(s.start,o)),d=n.length-s.count,c=this.lines.splice(s.start,s.count,...n);for(let l of c)this.forgetLine(l);if(this.trackLines(n),this.invalidateSelectionIfTouches(c),s.count=n.length,d!==0)for(let[l,f]of this.keyedBlocks)l!==e&&f.start>s.start&&(f.start+=d);i=this.wrappedRowsOfMany(n)-a}else r=!0,this.keyedBlocks.set(e,{start:this.lines.length,count:n.length}),this.lines.push(...n),this.trackLines(n),i=this.wrappedRowsOfMany(n);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(i),e!==this.stickyBottomKey&&this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}appendStreaming(e,n,s,r){if(e.length===0)return;let i=e.split(`
134
- `),[o,...a]=i,d=0;if(this.streamingActive&&this.lines.length>0){let l=this.lines[this.lines.length-1];if(l){let f=this.wrappedRowsOf(l);this.forgetLine(l),l.body+=o??"",d+=this.wrappedRowsOf(l)-f}}else{if(this.lines.length>0){let f=this.lines[this.lines.length-1];if(!(f&&f.body===""&&(!f.prefix||f.prefix===""))){let p={body:""};this.lines.push(p),this.trackLine(p),d+=this.wrappedRowsOf(p)}}let l={prefix:n,body:o??"",bodyStyle:s};r!==void 0&&(l.prefixStyle=r),this.lines.push(l),this.trackLine(l),d+=this.wrappedRowsOf(l)}let c=" ".repeat(n.length);for(let l of a){let f={prefix:c,body:l,bodyStyle:s};this.lines.push(f),this.trackLine(f),d+=this.wrappedRowsOf(f)}this.streamingActive=!0,this.adjustScrollForRowChange(d),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}setSessionbar(e){this.sessionbar={...this.sessionbar,...e},this.syncWindowTitle(),this.repaint()}syncWindowTitle(){let e=this.sessionbar.title?.trim(),n=zl(this.sessionbar.sessionId)||"hydra",s=e&&e.length>0?e:n,i=(this.readonly?`${s} [VIEW ONLY]`:s).replace(/[\x00-\x1f\x7f]/g,"").slice(0,200);i!==this.lastWindowTitle&&(this.lastWindowTitle=i,process.stdout.write(`\x1B]0;${i}\x1B\\`))}clearWindowTitle(){this.lastWindowTitle=null,process.stdout.write("\x1B]0;\x1B\\")}setBanner(e){this.banner={...this.banner,...e},this.writeProgressIndicator(this.banner.status==="busy"?3:0),this.syncedPartialRepaint(()=>this.drawBanner())}syncedPartialRepaint(e){this.started&&Be(()=>{e(),this.placeCursor()})}currentModeId(){return this.banner.currentMode}writeProgressIndicator(e){this.started&&this.progressIndicatorEnabled&&e!==this.lastProgressState&&(this.lastProgressState=e,process.stdout.write(`\x1B]9;4;${e}\x1B\\`))}notify(e,n=4e3){this.bannerNotificationTimer&&clearTimeout(this.bannerNotificationTimer),this.bannerNotification=e,this.bannerNotificationTimer=setTimeout(()=>{this.bannerNotification=null,this.bannerNotificationTimer=null,this.syncedPartialRepaint(()=>this.drawBanner())},n),this.syncedPartialRepaint(()=>this.drawBanner())}setMouseEnabled(e){this.mouseEnabled!==e&&(this.mouseEnabled=e,this.started&&(e?(this.term.grabInput({mouse:"drag"}),this.term.on("mouse",this.mouseHandler)):(this.term.off("mouse",this.mouseHandler),this.term.grabInput(!0)),this.reclaimStdinAfterGrabInput()))}reclaimStdinAfterGrabInput(){if(this.terminalKitStdinHandler===null)return;let e=this.term;!e.stdin||typeof e.onStdin!="function"||(this.terminalKitStdinHandler=e.onStdin,e.stdin.removeListener("data",e.onStdin),e.stdin.removeListener("data",this.rawStdinHandler),e.stdin.on("data",this.rawStdinHandler))}isMouseEnabled(){return this.mouseEnabled}setInAppSelectionEnabled(e){this.inAppSelectionEnabled=e}isInAppSelectionEnabled(){return this.inAppSelectionEnabled}setSelection(e,n){let s=this.lineIndexById(e.sourceLineId),r=this.lineIndexById(n.sourceLineId),i=s<r||s===r&&e.offset<=n.offset,o=i?e:n,a=i?n:e;if(o.sourceLineId===a.sourceLineId&&o.offset===a.offset){this.clearSelection();return}let d={startLineId:o.sourceLineId,startOffset:o.offset,endLineId:a.sourceLineId,endOffset:a.offset},c=this.selection;c&&c.startLineId===d.startLineId&&c.startOffset===d.startOffset&&c.endLineId===d.endLineId&&c.endOffset===d.endOffset||(this.selection=d,this.repaint())}clearSelection(){this.selection!==null&&(this.selection=null,this.repaint())}hasSelection(){return this.selection!==null}getSelection(){return this.selection===null?null:{start:{sourceLineId:this.selection.startLineId,offset:this.selection.startOffset},end:{sourceLineId:this.selection.endLineId,offset:this.selection.endOffset}}}getSelectionText(){let e=this.selectionLineBounds();if(e===null)return"";let n=[];for(let s=e.loIdx;s<=e.hiIdx;s++){let r=this.lines[s];if(!r)continue;let i=this.lineIds.get(r),o=i===void 0?void 0:e.byId.get(i);if(!o)continue;let a=r.body??"",d;r.ansi?d=s===e.loIdx||s===e.hiIdx?"":a.replace(IA,""):(d=a.slice(o.start,o.end),bd(r.bodyStyle)&&(d=$A(d))),n.push(d)}return n.join(`
135
- `)}selectionLineBounds(){let e=this.selection;if(e===null)return null;let n=this.lineIndexById(e.startLineId),s=this.lineIndexById(e.endLineId);if(n===-1||s===-1)return null;let r=n,i=s,o=e.startOffset,a=e.endOffset;n>s&&(r=s,i=n,o=e.endOffset,a=e.startOffset);let d=new Map;for(let c=r;c<=i;c++){let l=this.lines[c];if(!l)continue;let f=this.lineIds.get(l);if(f===void 0)continue;let u=(l.body??"").length,p=c===r?Math.max(0,Math.min(u,o)):0,m=c===i?Math.max(0,Math.min(u,a)):u;d.set(f,{start:p,end:m,toEnd:c<i})}return{loIdx:r,hiIdx:i,byId:d}}selectionRangeForChunk(e){if(this.selection===null||e.ansi)return null;let n=this.selectionRenderBounds??this.selectionLineBounds()?.byId??null;if(n===null)return null;let s=this.wrapOrigin.get(e);if(!s)return null;let r=n.get(s.sourceLineId);if(!r)return null;let i=s.sourceColOffset,o=i+e.body.length,a=Math.max(r.start,i),d=Math.min(r.end,o);return d<=a?null:{start:a-i,end:d-i,toEndOfLine:r.toEnd||r.end>o}}setBannerSearchIndicator(e){this.bannerSearchIndicator!==e&&(this.bannerSearchIndicator=e,this.syncedPartialRepaint(()=>this.drawBanner()))}bannerRightContent(){if(this.scrollbackSearch!==null){let e=this.scrollbackSearch,n=e.matches.length>0?` ${e.matchIndex+1}/${e.matches.length}`:e.term.length===0?"":" 0/0";return{text:`\u{1F50D} ${e.term}${n}`,kind:"search"}}return this.bannerSearchIndicator!==null?{text:`\u{1F50D} ${this.bannerSearchIndicator}`,kind:"search"}:this.bannerNotification!==null?{text:this.bannerNotification,kind:"notify"}:null}clearScrollback(){this.lines=[],this.keyedBlocks.clear(),this.wrapCache.clear(),this.wrapCacheWidth=0,this.streamingActive=!1,this.scrollOffset=0,this.selection!==null&&(this.selection=null),this.repaint()}invalidateSelectionIfTouches(e){if(this.selection!==null)for(let n of e){let s=this.lineIds.get(n);if(s!==void 0&&(s===this.selection.startLineId||s===this.selection.endLineId)){this.selection=null;return}}}setHideThoughts(e){this.hideThoughts!==e&&(this.hideThoughts=e,this.repaint())}clearKey(e){this.keyedBlocks.delete(e)}hasKey(e){return this.keyedBlocks.has(e)}removeKey(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count,r=s>=this.lines.length,i=this.wrappedRowsOfMany(this.lines.slice(n.start,s)),o=this.lines.splice(n.start,n.count);for(let a of o)this.forgetLine(a);this.invalidateSelectionIfTouches(o),this.keyedBlocks.delete(e);for(let[a,d]of this.keyedBlocks)a!==e&&d.start>n.start&&(d.start-=n.count);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(-i),this.moveStickyToEnd(),this.scheduleRepaint()}setStickyBottomKey(e){this.stickyBottomKey=e,this.moveStickyToEnd(),this.scheduleRepaint()}moveStickyToEnd(){if(this.stickyBottomKey===null)return;let e=this.keyedBlocks.get(this.stickyBottomKey);if(!e)return;let n=e.start+e.count;if(n>=this.lines.length)return;let s=this.lines.splice(e.start,e.count);for(let[r,i]of this.keyedBlocks)r!==this.stickyBottomKey&&i.start>=n&&(i.start-=e.count);e.start=this.lines.length,this.lines.push(...s),this.streamingActive=!1}removeBlock(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count>=this.lines.length,r=this.wrappedRowsOfMany(this.lines.slice(n.start,n.start+n.count)),i=this.lines.splice(n.start,n.count);for(let o of i)this.forgetLine(o);this.invalidateSelectionIfTouches(i),this.keyedBlocks.delete(e);for(let[,o]of this.keyedBlocks)o.start>n.start&&(o.start-=n.count);s&&(this.streamingActive=!1),this.adjustScrollForRowChange(-r),this.scheduleRepaint()}contiguousRun(e,n){if(!this.keyedBlocks.has(e))return[];let s=[...n].map(d=>{let c=this.keyedBlocks.get(d);return c?{key:d,start:c.start,count:c.count}:null}).filter(d=>d!==null).sort((d,c)=>d.start-c.start),r=s.findIndex(d=>d.key===e);if(r<0)return[];let i=(d,c)=>{for(let[l,f]of this.keyedBlocks)if(!n.has(l)&&f.start>=d&&f.start<c)return!0;return!1},o=r;for(;o>0&&!i(s[o-1].start+s[o-1].count,s[o].start);)o--;let a=r;for(;a<s.length-1&&!i(s[a].start+s[a].count,s[a+1].start);)a++;return s.slice(o,a+1).map(d=>d.key)}setRunCollapsed(e,n,s){if(e.length===0)return;let r=e[0];if(!this.keyedBlocks.has(r))return;this.upsertLines(r,s);let i=this.keyedBlocks.get(r),o=i.start+i.count;for(let a of e){let d=this.keyedBlocks.get(a);d&&(o=Math.max(o,d.start+d.count))}for(let a=i.start+i.count;a<o;a++){let d=this.lines[a];d&&(d.collapsed=n)}this.scheduleRepaint()}redraw(){this.repaint()}fullRedraw(){this.painter.clearCache(),this.lastWindowTitle=null,this.wrapCache.clear(),this.wrapCacheWidth=0,process.stdout.write(yl),this.term.clear(),this.repaint()}pauseRepaint(){this.repaintPaused+=1}resumeRepaint(){this.repaintPaused!==0&&(this.repaintPaused-=1,this.repaintPaused===0&&this.repaintPending&&(this.repaintPending=!1,this.repaint()))}setQueuedPrompts(e){this.queuedTexts=[...e],this.lastQueueEditingIndex=this.dispatcher.state().queueIndex,this.repaint()}repaintNow(){this.repaint()}setPermissionPrompt(e){e!==null&&this.permissionPrompt===null&&this.clearSelection(),this.permissionPrompt=e?{...e}:null,this.repaint()}setOptionsPrompt(e){e!==null&&this.optionsPrompt===null&&this.clearSelection(),this.optionsPrompt=e?{...e,options:e.options.map(n=>({...n}))}:null,this.repaint()}isOptionsPromptActive(){return this.optionsPrompt!==null}setConfirmPrompt(e){e!==null&&this.confirmPrompt===null&&this.clearSelection(),this.confirmPrompt=e?{...e}:null,this.repaint()}setHelpPrompt(e){e!==null&&this.helpPrompt===null&&this.clearSelection(),this.helpPrompt=e?{...e,entries:[...e.entries]}:null,this.repaint()}isHelpPromptActive(){return this.helpPrompt!==null}openBtwOverlay(e){let n=e?.height??12;this.btwOverlayOpen=!0,this.btwOverlayMaxHeight=n,this.focusedPane="btw",this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.scheduleRepaint()}setBtwOverlayMeta(e){let n=!1;if(e.sessionId!==void 0&&this.btwOverlaySessionId!==e.sessionId&&(this.btwOverlaySessionId=e.sessionId,n=!0),e.usage!==void 0){let s=this.btwOverlayUsage,r=e.usage;(!s||s.used!==r.used||s.size!==r.size||s.costAmount!==r.costAmount||s.costCurrency!==r.costCurrency)&&(this.btwOverlayUsage={...r},n=!0)}n&&this.scheduleRepaint()}setBtwOverlayContent(e){if(this.btwOverlayLines.length===e.length){let n=!0;for(let s=0;s<e.length;s++)if(this.btwOverlayLines[s]!==e[s]){n=!1;break}if(n)return}this.btwOverlayLines=[...e],this.scheduleRepaint()}setBtwOverlayStatus(e){let n=this.btwOverlayLabel===e.label,s=this.btwOverlayStatus===e.style;n&&s||(this.btwOverlayLabel=e.label,this.btwOverlayStatus=e.style,this.scheduleRepaint())}closeBtwOverlay(){this.btwOverlayOpen&&(this.btwOverlayOpen=!1,this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.focusedPane="main",this.scheduleRepaint())}toggleFocusedPane(){this.focusedPane=this.focusedPane==="main"?"btw":"main",this.scheduleRepaint()}getFocusedPane(){return this.focusedPane}isOverlayOpen(){return this.btwOverlayOpen}setCompletions(e){e.length===this.completions.length&&e.every((s,r)=>{let i=this.completions[r];return i!==void 0&&i.name===s.name&&i.description===s.description})||(this.completions=[...e],this.repaint())}ensureSeparator(e){if(this.lines.length===0)return;let n=this.stickyBottomKey!==null?this.keyedBlocks.get(this.stickyBottomKey):void 0,s=n!==void 0&&n.start+n.count===this.lines.length,r=s?n.start-1:this.lines.length-1;if(r<0)return;let i=this.lines[r];if(i&&i.body===""&&(i.prefix===void 0||i.prefix===""))return;let o={body:""};e!==void 0&&(o.bodyStyle=e),s?(this.lines.splice(n.start,0,o),n.start+=1):this.lines.push(o),this.trackLine(o),this.streamingActive=!1,this.adjustScrollForRowChange(this.wrappedRowsOf(o)),this.trimScrollback(),this.scheduleRepaint()}refreshPrompt(){if(this.promptRows()!==this.lastPromptRows){this.repaint();return}this.syncedPartialRepaint(()=>{let e=this.dispatcher.state().queueIndex;e!==this.lastQueueEditingIndex&&(this.lastQueueEditingIndex=e,this.drawQueuedZone()),this.drawPrompt()})}handleKey(e,n){if(n.isCharacter){this.onKey([{type:"char",ch:e}]);return}if(e==="PAGE_UP"){this.scrollBy(this.scrollPageSize());return}if(e==="PAGE_DOWN"){this.scrollBy(-this.scrollPageSize());return}let s=kd(e);s&&this.onKey([{type:"key",name:s}])}handleMouse(e,n){if(e==="MOUSE_WHEEL_UP"){this.scrollBy(3);return}if(e==="MOUSE_WHEEL_DOWN"){this.scrollBy(-3);return}let s=this.mouseCell(n),r=EA(e),i=null;if(e==="MOUSE_DRAG"||e==="MOUSE_MOTION"?i="move":e.endsWith("_PRESSED")?i="press":e.endsWith("_RELEASED")&&(i="release"),i!==null&&s!==null&&this.onMouse&&this.onMouse({kind:i,button:r,x:s.x,y:s.y,name:e}),e==="MOUSE_LEFT_BUTTON_PRESSED"){let o=this.lastLeftClick;o!==null&&s!==null&&Math.abs(s.x-o.x)<=wd&&Math.abs(s.y-o.y)<=wd&&Date.now()-o.t<=Nl||this.flushPendingBlockClick(),this.pressCell=s,this.handleSelectionPress(s);return}if(e.endsWith("_PRESSED")&&e!=="MOUSE_LEFT_BUTTON_PRESSED"&&this.flushPendingBlockClick(),e==="MOUSE_DRAG"&&s!==null){this.handleSelectionDrag(s);return}if(e==="MOUSE_LEFT_BUTTON_RELEASED"||e==="MOUSE_BUTTON_RELEASED"){let o=this.pressCell;this.pressCell=null;let a=this.inAppSelectionEnabled&&(this.selectionDragStarted||this.doubleClickPending);if(this.onBlockClick&&o!==null&&s!==null&&s.x===o.x&&s.y===o.y&&!a){let d=this.keyAtRow(s.y);if(d!==null){let c=s.y;for(;c>1&&this.keyAtRow(c-1)===d;)c-=1;this.schedulePendingBlockClick(d,s.y-c)}}this.handleSelectionRelease(s)}}handleSelectionPress(e){if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,!this.inAppSelectionEnabled||e===null)return;let n=this.resolveCellToSource(e.x,e.y);if(n===null){this.lastLeftClick=null;return}this.selectionAnchor=n;let s=Date.now(),r=this.lastLeftClick;if(r!==null&&s-r.t<=Nl&&Math.abs(e.x-r.x)<=wd&&Math.abs(e.y-r.y)<=wd){if(this.cancelPendingBlockClick(),this.onBlockDoubleClick&&e!==null){let a=this.keyAtRow(e.y);if(a!==null){let d=e.y;for(;d>1&&this.keyAtRow(d-1)===a;)d-=1;let c=e.y-d;if(this.onBlockDoubleClick(a,c)){this.doubleClickPending=!0,this.lastLeftClick=null;return}}}if(this.tryOpenFileAt(n)){this.doubleClickPending=!0,this.lastLeftClick=null;return}let o=this.wordBoundsAt(n);o!==null&&(this.setSelection({sourceLineId:n.sourceLineId,offset:o.start},{sourceLineId:n.sourceLineId,offset:o.end}),this.doubleClickPending=!0),this.lastLeftClick=null}}handleSelectionDrag(e){if(!this.inAppSelectionEnabled||this.selectionAnchor===null||this.doubleClickPending)return;let n=this.resolveCellToSource(e.x,e.y);n!==null&&(this.selectionDragStarted=!0,this.setSelection(this.selectionAnchor,n))}handleSelectionRelease(e){let n=this.selectionDragStarted,s=this.doubleClickPending;if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,e!==null&&(this.lastLeftClick={x:e.x,y:e.y,t:Date.now()}),!!this.inAppSelectionEnabled){if(n||s){this.finalizeSelection();return}this.selection!==null&&this.clearSelection()}}wordBoundsAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let r=Math.max(0,Math.min(s.length-1,e.offset));if(e.offset>=s.length&&(r=s.length-1),!Dl.test(s[r]))return null;let i=r;for(;i>0&&Dl.test(s[i-1]);)i--;let o=r+1;for(;o<s.length&&Dl.test(s[o]);)o++;return{start:i,end:o}}pathTokenAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let{clean:r,rawToClean:i}=_A(s);if(r.length===0)return null;let o=i[Math.min(e.offset,i.length-1)]??r.length;if(n.links){for(let p of n.links)if(o>=p.start&&o<p.end){let m=p.url;return{raw:m.startsWith("file://")?m.slice(7):m,line:null}}}let a=Math.max(0,Math.min(r.length-1,o));if(o>=r.length&&(a=r.length-1),!Hl.test(r[a]))return null;let d=a;for(;d>0&&Hl.test(r[d-1]);)d--;let c=a+1;for(;c<r.length&&Hl.test(r[c]);)c++;let l=r.slice(d,c);if(l=l.replace(/[.]+$/,""),l.length===0)return null;let f=null,u=r.slice(c).match(/^:(\d+)(?::\d+)?/);return u&&(f=Number.parseInt(u[1],10)),{raw:l,line:f}}resolvePathToken(e){let n=e;(n==="~"||n.startsWith("~/"))&&(n=n==="~"?_g():`${_g()}/${n.slice(2)}`);let s=$g(n)||e.startsWith("~"),r=n.includes("/");if(!s&&!r)return null;let i=$g(n)?n:bA(this.sessionbar.cwd,n);if(s)return i;try{if(wA(i).isFile())return i}catch{return null}return null}tryOpenFileAt(e){if(this.openFileCommand===null)return!1;let n=this.pathTokenAt(e);if(n===null)return!1;let s=n.line===null?"":`:${n.line}`;return this.tryOpenPathString(n.raw+s)}tryOpenPathString(e){if(this.openFileCommand===null)return!1;let n=e,s=null,r=e.match(/^(.*?):(\d+)(?::\d+)?$/);r&&(n=r[1],s=Number.parseInt(r[2],10));let i=this.resolvePathToken(n);if(i===null)return!1;let o=s===null?"":String(s),[a,...d]=this.openFileCommand;if(!a)return!1;let c=!1,l=[];for(let f of d)f.includes("%f")&&(c=!0),!(o===""&&f.includes("%n"))&&l.push(f.replaceAll("%f",i).replaceAll("%n",o));c||l.push(i);try{let f=yA(a,l,{detached:!0,stdio:"ignore",cwd:this.sessionbar.cwd});f.on("error",p=>{this.notify(`open file failed: ${p.message}`)}),f.unref();let u=s===null?i:`${i}:${s}`;this.notify(`opening ${u}`)}catch(f){this.notify(`open file failed: ${f.message}`)}return!0}schedulePendingBlockClick(e,n){if(!this.onBlockClick)return;if(this.openFileCommand===null){this.onBlockClick(e,n);return}this.cancelPendingBlockClick();let s=this.onBlockClick,r=setTimeout(()=>{this.pendingBlockClick=null,s(e,n)},Nl);typeof r.unref=="function"&&r.unref(),this.pendingBlockClick={timer:r,key:e,rowOffset:n}}cancelPendingBlockClick(){this.pendingBlockClick!==null&&(clearTimeout(this.pendingBlockClick.timer),this.pendingBlockClick=null)}flushPendingBlockClick(){let e=this.pendingBlockClick;e!==null&&(clearTimeout(e.timer),this.pendingBlockClick=null,this.onBlockClick&&this.onBlockClick(e.key,e.rowOffset))}lineById(e){for(let n of this.lines)if(this.lineIds.get(n)===e)return n;return null}lineIndexById(e){for(let n=0;n<this.lines.length;n++){let s=this.lines[n];if(s&&this.lineIds.get(s)===e)return n}return-1}finalizeSelection(){let e=this.getSelectionText();e.length!==0&&Eg(e,{target:this.selectionClipboard}).then(n=>{if(n.ok){let s=e.length;this.notify(`copied ${s} char${s===1?"":"s"} to clipboard`)}else this.notify(`clipboard copy failed: ${n.reason}`)},n=>{this.notify(`clipboard copy failed: ${n.message}`)})}mouseCell(e){if(!e||typeof e!="object")return null;let n=e,s=Number(n.x),r=Number(n.y);return!Number.isFinite(s)||!Number.isFinite(r)?null:{x:s,y:r}}keyAtRow(e){let n=this.term.width,s=1,r=this.scrollbackVisibleRows();if(r<=0)return null;let i=e-s;if(i<0||i>=r)return null;let{rows:o}=this.wrapTail(n,r+this.scrollOffset),a=o.length-this.scrollOffset,d=Math.max(0,a-r),c=o.slice(d,a),l=Math.max(0,r-c.length),f=i-l;return f<0||f>=c.length?null:c[f]?.blockKey??null}resolveCellToSource(e,n){if(!Number.isFinite(e)||!Number.isFinite(n))return null;let s=this.term.width,r=1,i=this.scrollbackVisibleRows();if(i<=0)return null;let o=n-r;if(o<0||o>=i||e<1||e>s)return null;let{rows:a}=this.wrapTail(s,i+this.scrollOffset),d=a.length-this.scrollOffset,c=Math.max(0,d-i),l=a.slice(c,d),f=Math.max(0,i-l.length),u=o-f;if(u<0||u>=l.length)return null;let p=l[u];if(!p)return null;let m=this.wrapOrigin.get(p);if(!m)return null;let g=vs(p.prefix??""),y=e-1-g;if(y<0)return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset};let v=bd(p.bodyStyle)?kg(Vl(p.body),y):Sg(p.body,y);return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset+v}}scrollBy(e){if(e===0)return;this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let n=this.maxScrollOffset(),s=Math.min(n,Math.max(0,this.scrollOffset+e));s!==this.scrollOffset&&(this.scrollOffset=s,this.repaint())}scrollToBottom(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch(),this.scrollOffset!==0&&(this.scrollOffset=0,this.repaint())}scrollToTop(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let e=this.maxScrollOffset();this.scrollOffset!==e&&(this.scrollOffset=e,this.repaint())}isScrolledBack(){return this.scrollOffset>0}isScrollbackSearchActive(){return this.scrollbackSearch!==null}enterScrollbackSearch(){this.scrollbackSearch===null&&(this.scrollbackSearch={term:"",matchIndex:0,matches:[],baselineScroll:this.scrollOffset},this.scrollbackHighlight=null,this.repaint())}updateScrollbackSearchTerm(e){if(this.scrollbackSearch===null)return;let n=e.toLowerCase(),s=[];if(n.length>0)for(let r=this.lines.length-1;r>=0;r--){let i=this.lines[r];if(!i||i.body.length===0||i.ansi)continue;let o=i.body.toLowerCase(),a=[],d=0;for(;d<o.length;){let c=o.indexOf(n,d);if(c===-1)break;a.push(c),d=c+n.length}for(let c=a.length-1;c>=0;c--)s.push({lineIdx:r,col:a[c]})}this.scrollbackSearch.term=e,this.scrollbackSearch.matches=s,this.scrollbackSearch.matchIndex=0,this.scrollbackHighlight=n.length>0?n:null,s.length>0&&this.scrollToMatch(s[0]),this.repaint()}advanceScrollbackSearch(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return;let e=Math.min(this.scrollbackSearch.matches.length-1,this.scrollbackSearch.matchIndex+1);e!==this.scrollbackSearch.matchIndex&&(this.scrollbackSearch.matchIndex=e,this.scrollToMatch(this.scrollbackSearch.matches[e]),this.repaint())}retreatScrollbackSearch(){this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0||this.scrollbackSearch.matchIndex!==0&&(this.scrollbackSearch.matchIndex-=1,this.scrollToMatch(this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex]),this.repaint())}acceptScrollbackSearch(){this.scrollbackSearch!==null&&(this.scrollbackSearch=null,this.scrollbackHighlight=null,this.repaint())}cancelScrollbackSearch(){if(this.scrollbackSearch===null)return;let e=this.scrollbackSearch.baselineScroll;this.scrollbackSearch=null,this.scrollbackHighlight=null,this.scrollOffset=e,this.repaint()}scrollbackSearchTerm(){return this.scrollbackSearch?.term??""}currentMatchInfo(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return null;let e=this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex];if(!e)return null;let n=this.lines[e.lineIdx];if(!n)return null;let s=this.lineIds.get(n);return s===void 0?null:{lineId:s,col:e.col,length:this.scrollbackSearch.term.length}}activeMatchCol(e,n){if(!e||n===null)return null;let s=this.wrapOrigin.get(e);if(!s||s.sourceLineId!==n.lineId)return null;let r=n.col-s.sourceColOffset;return r<0||r>=e.body.length?null:r}scrollToMatch(e){let n=this.term.width,s=this.scrollbackVisibleRows();if(s<=0)return;let r=0;for(let l=this.lines.length-1;l>e.lineIdx;l--){let f=this.lines[l];f&&(r+=this.wrapOne(f,n).length)}let i=this.lines[e.lineIdx],o=0;if(i){let l=this.wrapOne(i,n),f=0;for(let u=0;u<l.length;u++){let p=l[u];if(!p)continue;let m=p.body.length;if(e.col<f+m){o=l.length-1-u;break}f+=m}}let a=r+o,d=Math.max(0,a-Math.floor(s/2)),c=this.maxScrollOffset();this.scrollOffset=Math.min(c,d)}scrollPageSize(){return Math.max(1,this.scrollbackVisibleRows()-2)}scrollbackVisibleRows(){let n=this.term.height-this.promptRows()-We-Je-Ze-Je-this.chipRows()-this.queuedRows()-this.completionRows()-this.btwOverlayRows();return Math.max(0,n-1+1)}maxScrollOffset(){let{rows:e}=this.wrapTail(this.term.width,Number.POSITIVE_INFINITY);return Math.max(0,e.length-this.scrollbackVisibleRows())}scheduleRepaint(){this.scheduler.schedule()}paintRow(e,n,s){this.started&&this.painter.paintRow(e,n,s)}repaint(){if(!this.started)return;if(this.repaintPaused>0){this.repaintPending=!0;return}this.scheduler.noteRepaintStart();let e=this.term.width,n=this.term.height;e<20||n<8||(this.painter.ensureSize(e,n),Be(()=>{this.term.hideCursor(),this.drawScrollback(),this.drawBtwOverlay(),this.drawCompletionZone(),this.drawQueuedZone(),this.drawAttachmentChipZone();let s=this.promptRows(),r=n-s-Ze-Je-We;this.drawSeparator(r),this.drawPrompt(),this.drawBanner(),this.drawSeparator(n-We),this.drawSessionbar(),this.placeCursor(),(this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt)&&this.term.hideCursor(!1),this.lastPromptRows=s}))}drawSessionbar(){let e=this.term.width,n=this.term.height,s=zl(this.sessionbar.sessionId),r=this.sessionbar.title?.trim(),i=kh(this.sessionbar.agent,this.sessionbar.model),o=je(this.sessionbar.cwd),a=Ng(this.sessionbar.usage),d=`sbar|${e}|${s}|${i}|${o}|${r??""}|${a??""}`;this.paintRow(n,d,()=>{let c=a?a.length+3:0,l=s.length+3+i.length+3+(r?3:0)+c,f=Math.max(8,e-l),u,p;if(r){let m=Math.min(r.length,8);u=Math.min(o.length,Math.max(8,f-m)),p=Math.max(0,f-u)}else p=0,u=f;if(this.term.yellow(s)(" \xB7 ").cyan.noFormat(i)(" \xB7 ").dim.noFormat(bt(o,u)),r&&this.term(" \xB7 ").bold.noFormat(bt(r,p)),this.term.eraseLineAfter(),a){let m=or(a),g=Math.max(1,e-m);this.term.moveTo(g,n).eraseLineAfter(),this.term.dim.noFormat(a)}})}drawSeparator(e){let n=this.term.width;this.paintRow(e,`sep|${n}`,()=>{this.term.dim("\u2500".repeat(n))})}buildBtwHeaderSegments(){let e=this.term.width,n="By the way",s="\u2500\u2500 ",r=this.btwOverlaySessionId?zl(this.btwOverlaySessionId):"",i=r?" \xB7 ":" ",o=Ng(this.btwOverlayUsage),a=o?` ${o} `:"",d=o?"\u2500\u2500":"",c=s.length+or(n)+i.length+or(r)+or(a)+d.length,l="\u2500".repeat(Math.max(0,e-c)),f=`${e}|${r}|${this.btwOverlayStatus}|${o??""}`;return{left:s,label:n,sidSep:i,sid:r,middle:l,usage:a,right:d,signature:f}}paintBtwHeader(e){switch(this.term.dim(e.left),this.btwOverlayStatus){case"busy":this.term.brightYellow(e.label);break;case"done":this.term(e.label);break;case"cancelled":case"errored":this.term.brightRed(e.label);break;default:this.term(e.label)}this.term.dim(e.sidSep),e.sid&&this.term.yellow(e.sid),this.term.dim(e.middle),e.usage&&this.term.dim.noFormat(e.usage),this.term.dim(e.right)}drawScrollback(){let e=this.term.width,n=1,s=this.scrollbackVisibleRows();if(s<=0)return;let{rows:r,exhausted:i}=this.wrapTail(e,s+this.scrollOffset);if(i){let u=Math.max(0,r.length-s);this.scrollOffset>u&&(this.scrollOffset=u)}let o=r.length-this.scrollOffset,a=Math.max(0,o-s),d=r.slice(a,o),c=Math.max(0,s-d.length),l=this.currentMatchInfo(),f=l?.length??0;this.selectionRenderBounds=this.selectionLineBounds()?.byId??null;for(let u=0;u<s;u++){let p=n+u,m=u-c,g=m>=0?d[m]:void 0,y=this.activeMatchCol(g,l),v=g?this.selectionRangeForChunk(g):null,b=Og("sb",e,g,this.scrollbackHighlight,y,v);this.paintRow(p,b,()=>{g&&this.writeFormattedLine(g,e,y,f,v)})}if(this.onBlockVisible&&this.pendingVisibleKeys.size>0){let u=new Set;for(let m of d)m.blockKey!==void 0&&u.add(m.blockKey);let p=[];for(let m of this.pendingVisibleKeys)u.has(m)&&p.push(m);for(let m of p)this.pendingVisibleKeys.delete(m),this.onBlockVisible(m)}}notifyWhenVisible(e){this.onBlockVisible&&(this.pendingVisibleKeys.add(e),this.scheduleRepaint())}queuedRows(){return Math.min(jl,this.queuedTexts.length)}chipRows(){return Math.min(Wl,this.attachments.length)}setAttachments(e){this.attachments.length===e.length&&this.attachments.every((n,s)=>n===e[s])||(this.attachments=[...e],this.repaint())}completionRows(){return this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt?0:Math.min(ql,this.completions.length)}drawCompletionZone(){let e=this.completionRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-We-Je-Ze,i=this.queuedRows(),o=this.chipRows(),d=r-1-i-o-e+1,c=0;for(let l of this.completions.slice(0,e))l.name.length>c&&(c=l.name.length);for(let l=0;l<e;l++){let f=d+l,u=this.completions[l],p=l===e-1&&this.completions.length>ql,m=this.completions.length-ql+1,g=u?p?`comp|${n}|overflow|${m}`:`comp|${n}|${c}|${u.name}|${u.description??""}`:`comp|${n}|empty`;this.paintRow(f,g,()=>{if(!u)return;if(p){this.term.dim(` + ${m} more match(es)`);return}let y=u.name.padEnd(c),v=u.description??"",b=n-y.length-4,k=b>0?bt(v,b):"";this.term(" ").brightCyan(y),k.length>0&&this.term(" ").dim(k)})}}drawAttachmentChipZone(){let e=this.chipRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),o=this.term.height-s-We-Je-Ze-1-e+1,a=this.isIterm2();for(let d=0;d<e;d++){let c=o+d,l=d===e-1&&this.attachments.length>Wl,f=this.attachments.length-Wl,u=this.attachments[d],p=u?`${u.name??"image"} \xB7 ${qt(u.sizeBytes)}`:"",m=l?`chip|${n}|overflow|${f}`:u?`chip|${n}|${a?"i":"t"}|${p}|${u.sizeBytes}`:`chip|${n}|empty`;this.paintRow(c,m,()=>{if(l){this.term.dim(` \u{1F4CE} + ${f+1} more attached`);return}u&&(this.term(" ").yellow(`\u{1F4CE} ${p}`),a&&(this.term(" "),this.writeIterm2Image(u.data,1)))})}}isIterm2(){let e=process.env;return e.LC_TERMINAL==="iTerm2"||e.TERM_PROGRAM==="iTerm.app"}writeIterm2Image(e,n){process.stdout.write(OA(e,n,!!process.env.TMUX))}drawQueuedZone(){let e=this.queuedRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-We-Je-Ze,i=this.chipRows(),a=r-1-i-e+1,d=this.dispatcher.state().queueIndex;for(let c=0;c<e;c++){let l=a+c,f=this.queuedTexts[c],u=c===e-1&&this.queuedTexts.length>jl,p=this.queuedTexts.length-jl,m=f===void 0?"":u?`+ ${p+1} more queued`:bt(DA(f),n-4),g=!u&&c===d,y=f===void 0?`queued|${n}|empty`:`queued|${n}|${g?"edit":u?"ovf":"row"}|${m}`;this.paintRow(l,y,()=>{if(f===void 0)return;let v=`\u23F3 ${m}`,b=v+" ".repeat(Math.max(0,n-1-v.length));g?this.term.bgBlue.brightYellow("\u25B8"):this.term.bgBlue(" "),this.term.bgBlue.brightWhite.noFormat(b)})}}drawPrompt(){if(this.permissionPrompt){this.drawPermissionPrompt();return}if(this.optionsPrompt){this.drawOptionsPrompt();return}if(this.confirmPrompt){this.drawConfirmPrompt();return}if(this.helpPrompt){this.drawHelpPrompt();return}if(this.readonly)return;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),o=this.term.height-i.rendered-Ze-Je-We+1,a=!1;for(let d=0;d<i.rendered;d++){let c=r[i.windowStart+d],l=o+d,f="wrap",u="";c&&(c.bufferIdx===0&&c.startCol===0?f="first":c.startCol===0&&(f="newline"),u=(s.buffer[c.bufferIdx]??"").slice(c.startCol,c.endCol));let p=c?`prompt|${this.term.width}|${f}|${u}`:`prompt|${this.term.width}|empty`;this.paintRow(l,p,()=>{c&&(f==="first"?a?this.term.dim("> "):this.term.brightWhite("> "):f==="newline"?this.term.dim("\xB7 "):this.term(" "),a?this.term.dim(u):this.term.noFormat(u))})}}drawConfirmPrompt(){let e=this.confirmPrompt;if(!e)return;let n=this.term.width,s=this.term.height-Jl-Ze-Je-We+1;this.paintRow(s,`confirm|q|${n}|${e.question}`,()=>{this.term.brightYellow(` ? ${bt(e.question,n-4)}`)}),this.paintRow(s+1,`confirm|h|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}drawHelpPrompt(){let e=this.helpPrompt;if(!e)return;let n=this.term.width,s=this.helpRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`help|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2753 ${bt(e.title,n-5)}`)});let a=Math.min(24,Math.max(...e.entries.map(d=>d===null?0:d[0].length),4));for(let d of e.entries){if(i>=r+s-1)break;if(d===null){o(`help|sep|${n}|${i}`,()=>{});continue}let[c,l]=d,f=c.padEnd(a);o(`help|e|${n}|${c}|${l}`,()=>{this.term(" "),this.term.brightCyan.noFormat(f),this.term.noFormat(` ${bt(l,n-2-a-1)}`)})}o(`help|hint|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}helpRows(){return this.helpPrompt?Math.min(xA,2+this.helpPrompt.entries.length):0}drawPermissionPrompt(){let e=this.permissionPrompt;if(!e)return;let n=this.term.width,s=this.permissionRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`perm|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u{1F512} ${bt(e.title,n-5)}`)});let a=e.detail&&e.detail.length>0?e.detail:"This action requires approval";o(`perm|sub|${n}|${a}`,()=>{this.term.dim(` ${bt(a,n-2)}`)}),o(`perm|q|${n}`,()=>{this.term(" Do you want to proceed?")});for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. ${bt(c.label,n-8)}`;o(`perm|o|${n}|${d}|${l?"1":"0"}|${c.label}`,()=>{l?this.term.brightYellow(u):this.term.dim(u)})}o(`perm|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter submit \xB7 Esc cancel \xB7 1\u20139 quick-pick")})}drawBanner(){let e=this.term.height-We-Je,n=this.term.width,s=this.banner.status==="busy"&&this.banner.elapsedMs!==void 0&&this.banner.elapsedMs>=1e3?In(this.banner.elapsedMs):"",r=this.bannerRightContent(),i=r?`${r.kind}|${r.text}`:"",o=this.banner.status==="busy"&&this.banner.stalled===!0,a=`bnr|${n}|${this.banner.status}|${s}|${o?"1":"0"}|${this.banner.queued}|${this.scrollOffset}|${this.banner.currentMode??""}|${this.banner.hint}|`+i;this.paintRow(e,a,()=>{let d=this.banner.status==="busy"?"\u25CF":"\u25CB";this.banner.status==="busy"?(o?this.term.brightRed(`${d} stalled`):this.term.brightYellow(`${d} ${this.banner.status}`),s&&this.term(" ").dim(s)):this.banner.status==="disconnected"?this.term.brightRed(`${d} ${this.banner.status}`):this.banner.status==="cold"?this.term.brightMagenta(`${d} ${this.banner.status}`):this.term.brightGreen(`${d} ${this.banner.status}`),this.banner.queued>0&&this.term(" \xB7 ").brightYellow(`${this.banner.queued} queued`),this.scrollOffset>0&&this.term(" \xB7 ").brightCyan(`\u2191 ${this.scrollOffset}`);let c=this.banner.currentMode?this.banner.hint.replace("\u21E7\u21E5 mode",`\u21E7\u21E5 mode: ${this.banner.currentMode}`):this.banner.hint;if(this.term(" \xB7 ").dim(c),this.term.eraseLineAfter(),r){let l=or(r.text),f=Math.max(1,n-l);this.term.moveTo(f,e).eraseLineAfter(),r.kind==="search"?this.term.brightCyan.noFormat(r.text):this.term.brightYellow.noFormat(r.text)}})}placeCursor(){if(!this.started)return;if(this.permissionPrompt){let l=this.permissionRows(),u=this.term.height-l-Ze-Je-We+1+3+this.permissionPrompt.selectedIndex,p=this.term.height-Ze-Je-We;this.term.moveTo(2,Math.min(u,p));return}if(this.optionsPrompt){let l=this.optionsRows(),u=this.term.height-l-Ze-Je-We+1+1+this.optionsPrompt.selectedIndex,p=this.term.height-Ze-Je-We;this.term.moveTo(2,Math.min(u,p));return}if(this.confirmPrompt){let l=this.term.height-Jl-Ze-Je-We+1;this.term.moveTo(2,l);return}if(this.helpPrompt){let l=this.helpRows(),f=this.term.height-l-Ze-Je-We+1;this.term.moveTo(2,f);return}if(this.scrollbackSearch){this.term.hideCursor(!0);return}if(this.readonly){this.term.hideCursor(!0);return}this.term.hideCursor(!1);let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),a=this.term.height-i.rendered-Ze-Je-We+1+Math.max(0,i.cursorVisualRow-i.windowStart),d=i.cursorVisualCol+3,c=this.term.height-Ze-Je-We;this.term.moveTo(Math.min(d,this.term.width),Math.min(a,c))}promptRows(){if(this.permissionPrompt)return this.permissionRows();if(this.optionsPrompt)return this.optionsRows();if(this.confirmPrompt)return Jl;if(this.helpPrompt)return this.helpRows();if(this.readonly)return 0;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n);return Math.min(Ul,Math.max(1,r.length))}permissionRows(){return this.permissionPrompt?Math.min(SA,4+this.permissionPrompt.options.length):0}optionsRows(){return this.optionsPrompt?Math.min(kA,2+this.optionsPrompt.options.length):0}drawOptionsPrompt(){let e=this.optionsPrompt;if(!e)return;let n=this.term.width,s=this.optionsRows(),r=this.term.height-s-Ze-Je-We+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`opts|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2699 ${bt(e.title,n-5)}`)});let a=Math.max(...e.options.map(d=>d.label.length),0);for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. `,p=c.label.padEnd(a),m=n-u.length-3,g=`${u}${bt(`${p} ${c.value}`,m)}`;o(`opts|o|${n}|${d}|${l?"1":"0"}|${c.value}|${c.label}`,()=>{l?this.term.brightYellow(g):this.term.dim(g)})}o(`opts|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter this session \xB7 s save default \xB7 Esc close")})}btwOverlayRows(){return!this.btwOverlayOpen||this.btwOverlayLines.length===0?0:Math.min(this.btwOverlayMaxHeight,1+this.btwOverlayLines.length)}drawBtwOverlay(){if(!this.btwOverlayOpen)return;let e=this.btwOverlayRows();if(e===0)return;let n=this.term.width,r=this.term.height-this.promptRows()-Ze-Je-We,i=this.chipRows()+this.queuedRows()+this.completionRows(),a=r-1-i-e+1,d=e-1,c=a,l=this.buildBtwHeaderSegments();this.paintRow(c,`btw|h|${l.signature}`,()=>{this.paintBtwHeader(l)});for(let f=0;f<d;f++){let u=c+1+f,p=this.btwOverlayLines.length-d+f,m=p>=0?this.btwOverlayLines[p]:void 0,g=Og(`btw|c${f}`,n,m);this.paintRow(u,g,()=>{m?this.writeFormattedLine(m,n):this.term.noFormat(" ".repeat(n))})}}wrapTail(e,n){let s=c=>c.collapsed===!0||this.hideThoughts&&c.bodyStyle==="thought";if(e<=4){let c=[];for(let f of this.lines)s(f)||c.push(f);let l=Math.min(n,c.length);return{rows:c.slice(c.length-l),exhausted:n>=c.length}}if(this.wrapCacheWidth!==e&&(this.wrapCache.clear(),this.wrapCacheWidth=e),n<=0||this.lines.length===0)return{rows:[],exhausted:!0};let r=[],i=0,o=0,a=!1;for(let c=this.lines.length-1;c>=0;c--){let l=this.lines[c];if(s(l)){c===0&&(a=!0);continue}let f=this.wrapOne(l,e);if(r.push(f),i+=f.length,o=c,i>=n)break}let d=[];for(let c=r.length-1;c>=0;c--)d.push(...r[c]);return{rows:d,exhausted:o===0||a}}wrapOne(e,n){let s=this.lineIds.get(e);if(s!==void 0){let f=this.wrapCache.get(s);if(f)return f}let r=e.prefix??"",i=vs(r),o=Math.max(1,n-i),a=bd(e.bodyStyle),d=e.ansi?PA(e.body,o):FA(e.body,o,{stripMarkup:a}),c=[],l=0;for(let f=0;f<d.length;f++){let u=d[f]??"",p={prefix:f===0?e.prefix:" ".repeat(i),body:u};if(e.prefixStyle!==void 0&&(p.prefixStyle=e.prefixStyle),e.bodyStyle!==void 0&&(p.bodyStyle=e.bodyStyle),e.blockKey!==void 0&&(p.blockKey=e.blockKey),e.fillRow&&(p.fillRow=!0),e.ansi&&(p.ansi=!0),f===0&&e.iterm2Image&&(p.iterm2Image=e.iterm2Image),s!==void 0&&u.length>0){let m=e.body.indexOf(u,l),g=m===-1?l:m;this.wrapOrigin.set(p,{sourceLineId:s,sourceColOffset:g}),l=g+u.length}c.push(p)}return s!==void 0&&this.wrapCache.set(s,c),c}writeFormattedLine(e,n,s=null,r=0,i=null){e.prefix&&Wn(this.term,e.prefix,e.prefixStyle??e.bodyStyle);let o=Math.max(0,n-vs(e.prefix??"")),a=bd(e.bodyStyle),d=e.ansi?e.body:bt(e.body,o,{stripMarkup:a}),c=(l,f)=>{if(l.length!==0)if(this.scrollbackHighlight!==null&&!e.ansi){let u=s!==null&&s>=f?s-f:null;Fg(this.term,l,e.bodyStyle,this.scrollbackHighlight,u,r)}else Wn(this.term,l,e.bodyStyle)};if(i!==null&&!e.ansi){let l=Math.max(0,Math.min(d.length,i.start)),f=Math.max(l,Math.min(d.length,i.end));c(d.slice(0,l),0),f>l&&Wn(this.term,d.slice(l,f),"selection-highlight"),c(d.slice(f),f)}else this.scrollbackHighlight!==null&&!e.ansi?Fg(this.term,d,e.bodyStyle,this.scrollbackHighlight,s,r):Wn(this.term,d,e.bodyStyle);if(e.fillRow){let l=e.ansi?or(d):vs(d),f=o-l;if(f>0){let u=i!==null&&i.toEndOfLine?"selection-highlight":e.bodyStyle;Wn(this.term," ".repeat(f),u)}}(e.ansi||e.body.includes("^"))&&this.term.styleReset(),e.iterm2Image&&this.isIterm2()&&this.writeIterm2Image(e.iterm2Image.data,e.iterm2Image.heightCells)}};Hg=/[^\x20-\x7e]/,Kl=new Intl.Segmenter(void 0,{granularity:"grapheme"}),Ug=!1;MA=/[a-zA-Z+\-:_!#/]/;zl=ze});function HA(t,e,n=xd){if(e.kind==="cancel")return{kind:"cancel"};if(e.kind==="back")return{kind:"back"};if(e.kind==="enter"){let s=n[t];return s?{kind:"resolve",action:s.key}:{kind:"back"}}if(e.kind==="up")return{kind:"continue",selected:Math.max(0,t-1)};if(e.kind==="down")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(e.kind==="char"){let s=e.ch.toLowerCase();if(s==="n")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(s==="p")return{kind:"continue",selected:Math.max(0,t-1)};let r=n.findIndex(i=>i.hotkey.toLowerCase()===s);if(r>=0){let i=n[r];if(i)return{kind:"resolve",action:i.key}}}return{kind:"continue",selected:t}}async function Jg(t,e){Un();let n=ze(e.sessionId),s=e.importedFromMachine??"another machine",r=je(e.cwd),i=xd.findIndex(a=>a.key==="view");i<0&&(i=0);let o=()=>{let d=7+xd.length*2+2,c=jn(t,{contentHeight:d,title:"Imported session"}),l=c.contentW,f=[{label:"session: ",value:n},{label:"from: ",value:s},{label:"cwd: ",value:r}],u=0;for(let p of f)t.moveTo(c.contentX,c.contentY+u),t.dim.noFormat(` ${p.label}`),t.noFormat(Xe(p.value,l-p.label.length-2)),u++;return u++,zg(t,c,u,{intro:"What do you want to do?",choices:xd,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 f/v jump \xB7 Esc back"}),c};return ys({term:t,render:o,onKey:(a,d,c,l)=>{let f=UA(a,c);if(!f)return;let u=HA(i,f);if(u.kind==="cancel"){l("cancel");return}if(u.kind==="back"){l("back");return}if(u.kind==="resolve"){l(u.action);return}u.selected!==i&&(i=u.selected,o())}})}function zg(t,e,n,s){let r=e.contentW,i=n;t.moveTo(e.contentX,e.contentY+i),t.noFormat(` ${s.intro}`),i+=2;for(let o=0;o<s.choices.length;o++){let a=s.choices[o];if(!a)continue;let c=` ${o===s.selected?"\u276F":" "} ${a.label}`;t.moveTo(e.contentX,e.contentY+i),o===s.selected?t.brightWhite.bgBlue.noFormat(rd(c,r)):t.noFormat(c),i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${a.description}`),i++}i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${s.footer}`)}function UA(t,e){return t==="UP"?{kind:"up"}:t==="DOWN"?{kind:"down"}:t==="ENTER"||t==="KP_ENTER"?{kind:"enter"}:t==="ESCAPE"?{kind:"back"}:t==="CTRL_C"||t==="CTRL_D"?{kind:"cancel"}:e?.isCharacter?{kind:"char",ch:t}:null}async function Kg(t,e,n){let s=ze(e.sessionId),r=e.title??je(e.cwd),i=1,o=[{label:"Launch",hotkey:"l",description:"start a new agent session"},{label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}],a=()=>{let d=jn(t,{contentHeight:11,title:"Open session"}),c=d.contentW,l=0;t.moveTo(d.contentX,d.contentY+l),t.dim.noFormat(" session: "),t.noFormat(Xe(s,c-10)),l++,t.moveTo(d.contentX,d.contentY+l),t.noFormat(" "+Xe(r,c-2)),l++,l++,zg(t,d,l,{intro:"What do you want to do?",choices:o,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 l/v jump \xB7 Esc back"})};return a(),t.hideCursor(),await new Promise(d=>{let c=!1,l=()=>{c=!0},f=p=>{l(),n.pop(),d(p)},u=(p,m,g)=>{if(p==="CTRL_C"||p==="CTRL_D"){f("cancel");return}if(p==="ESCAPE"){f("back");return}if(p==="ENTER"||p==="KP_ENTER"){f(i===0?"launch":"view");return}if(p==="UP"||p==="SHIFT_TAB"){i>0&&(i--,a());return}if(p==="DOWN"||p==="TAB"){i<o.length-1&&(i++,a());return}if(g?.isCharacter){let y=p.toLowerCase();if(y==="l"){f("launch");return}if(y==="v"){f("view");return}if(y==="n"){i<o.length-1&&(i++,a());return}if(y==="p"){i>0&&(i--,a());return}}};n.push({onKey:(p,m,g)=>{c||u(p,m,g)},onResize:()=>{c||a()}})})}var xd,Gl=q(()=>{"use strict";ge();hn();ci();xd=[{key:"fork-local",label:"Fork locally",hotkey:"f",description:"spawn a local fork \u2014 original imported copy stays as-is"},{key:"view",label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}]});function wo(t){if(t.length===0)return"";let e=t[0]??"";for(let n=1;n<t.length;n++){let s=t[n]??"",r=0;for(;r<e.length&&r<s.length&&e[r]===s[r];)r+=1;if(e=e.slice(0,r),e.length===0)break}return e}function Vg(t){let{matches:e,firstLine:n}=t;if(e.length===0)return null;let s=n.indexOf(" "),r=s===-1?n:n.slice(0,s),i=s===-1?"":n.slice(s);if(e.length===1){let a=e[0]??"",d=i.startsWith(" ")?"":" ";return a+d+i}let o=wo(e);return o.length<=r.length?null:o+i}var Ad=q(()=>{"use strict"});import*as Yg from"os";async function ar(t,e,n={}){let s=n.defaultCwd??(e?await mg(e.cwd):void 0)??Yg.homedir();Un();let r=n.title??"Fork locally \u2014 choose cwd",i=n.intro??"Pick a local cwd for this session:",o=e?[{label:"session: ",value:ze(e.sessionId)},...e.importedFromMachine?[{label:"from: ",value:e.importedFromMachine}]:[],{label:"cwd: ",value:je(e.cwd)}]:[],a=s,d=null,c=!1,l=null,f=()=>{let g=o.length+6;l=jn(t,{contentHeight:g,title:r});let y=l.contentW,v=0;for(let b of o)t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(` ${b.label}`),t.noFormat(Xe(b.value,y-b.label.length-2)),v++;v++,t.moveTo(l.contentX,l.contentY+v),t.noFormat(` ${i}`),v+=2,p(v),v+=2,d!==null?(t.moveTo(l.contentX,l.contentY+v),t.red.noFormat(` ${Xe(d,y-2)}`)):(t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear"))},u=()=>o.length+3,p=g=>{if(!l)return;let y=g??u();t.moveTo(l.contentX,l.contentY+y).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+y),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+y),t.bold.noFormat(" cwd: ");let v=l.contentW-6-2;t.noFormat(jA(a,v)),c||t.bgWhite(" ")},m=()=>{if(p(),!l)return;let g=u()+2;t.moveTo(l.contentX,l.contentY+g).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+g),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+g),d!==null?t.red.noFormat(` ${Xe(d,l.contentW-2)}`):t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear")};return ys({term:t,render:f,hideCursor:!1,onKey:(g,y,v,b)=>{if(!c){if(g==="ENTER"||g==="KP_ENTER"){let k=a;c=!0,d=null,m(),po(k).then(R=>{if(c=!1,R.ok){b({kind:"ok",path:R.path});return}d=R.reason,m()});return}if(g==="ESCAPE"){b({kind:"back"});return}if(g==="CTRL_C"||g==="CTRL_D"){b({kind:"cancel"});return}if(g==="TAB"){c=!0,gg(a).then(k=>{if(c=!1,k.matches.length===0)return;let R;if(k.matches.length===1)R=k.prefix+k.matches[0];else{let H=wo(k.matches);if(H.length<=k.basePrefix.length)return;R=k.prefix+H}R!==a&&(a=R,d=null,m())});return}if(g==="BACKSPACE"){a.length>0&&(a=a.slice(0,-1),d=null,m());return}if(g==="CTRL_U"){a="",d=null,m();return}if(g==="CTRL_W"){let k=a.replace(/[/\s]+$/,""),R=Math.max(k.lastIndexOf("/"),k.lastIndexOf(" "));a=R>=0?k.slice(0,R+1):"",d=null,m();return}if(v?.isCharacter){a+=g,d=null,m();return}}}})}function jA(t,e){return e<=1?"":t.length<=e?t:"\u2026"+t.slice(t.length-(e-1))}var Ql=q(()=>{"use strict";ge();hn();Cl();Ad();ci()});function Zl(){return{filters:{cwdOnly:!1,hostFilter:"__local",includeNonInteractive:!1}}}async function eu(t,e){let n=()=>{process.stdout.write(er),process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(ii),process.stdout.write(oi),process.stdout.write(ai),process.stdout.write(Zs),process.stdout.write("\x1B>")};n();let s=e.prefs??Zl();e.prefs===void 0&&e.currentSessionId!==void 0&&e.sessions.find(E=>E.sessionId===e.currentSessionId)?.importedFromMachine&&(s.filters.hostFilter="__all");let r=e.cwd,i=Rd(e.sessions,r),o=C=>{let E=C;return s.filters.cwdOnly&&(E=E.filter($=>$.cwd===r)),s.filters.includeNonInteractive||(E=E.filter($=>$.interactive===!0)),E=KA(E,s.filters.hostFilter),E},a=o(i),d={columns:e.config.tui.sessionColumns??Gr,cwdMaxWidth:e.config.tui.cwdColumnMaxWidth},c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,u=0,p=0;if(e.currentSessionId!==void 0){let C=a.findIndex(E=>E.sessionId===e.currentSessionId);C>=0&&(u=C+1)}let m=!1,g="",y=120,v=!1,b=0,k="normal",R=null,H=!1,z="input",K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Y=null,te=!1,Z="",ee=null,Q=!1,oe=new qn({history:[]});e.initialPrompt&&oe.setBuffer(e.initialPrompt);let Oe=e.config.tui.promptHistoryMaxEntries;Hi(M.globalTuiHistoryFile()).then(C=>{let E=C.length>Oe?C.slice(C.length-Oe):C;oe.setHistory(E)}).catch(()=>{});let j=new pi(t),ue=sr(t),_e=Xt(t),$e=0,kn="",ks=0,Ot=[],nt=1,zn=0,Kn=0,xn=0,dr="",mi=[],be=1,gi=0,yi=[],at=1,An=0,xs=0,wi=0,cr=()=>{ue=sr(t),_e=Xt(t);let C=Math.max(10,_e-Xl);ks=Math.max(10,_e-Gg);let E=Math.max(10,_e-8);kn=zA(r,E);let $=oe.state();Ot=Jn($.buffer,ks);let X=Is(Ot,$,Cd);nt=X.rendered,zn=X.windowStart,Kn=X.cursorVisualRow,xn=X.cursorVisualCol;let ie=6+nt,Ue=Math.max(3,ue-ie);$e=Math.min(a.length,Ue),dr=hs(Qr,l,C,d).padEnd(C),mi=c.map(xe=>hs(xe,l,C,d).padEnd(C))},vo=()=>{c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,cr()},ve=()=>{let C=o(i);m&&g.length>0?a=C.filter(E=>YA(E,g)):a=C,vo(),m?(p=0,u=a.length>0?1:0):u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke()},At=C=>{if(C!==void 0){let E=a.findIndex($=>$.sessionId===C);if(E>=0){u=E+1,Ke();return}}u=a.length>0?1:0,p=0,Ke()},Ke=()=>{if(u===0)return;let C=u-1;C<p?p=C:C>=p+$e?p=C-$e+1:p+$e>a.length&&(p=Math.max(0,a.length-$e))},Zt=()=>Math.max(2,_e-2),Vn=()=>{let C=Zt(),E=`\u2500 ${kn} `,$=Math.max(1,C-E.length),X="\u2500".repeat($);u===0?t.brightBlue.noFormat(`\u256D${E}${X}\u256E`):t.dim.noFormat(`\u256D${E}${X}\u256E`)},lr=()=>{let C=Zt(),E="\u2500".repeat(C);u===0?t.brightBlue.noFormat(`\u2570${E}\u256F`):t.dim.noFormat(`\u2570${E}\u256F`)},As=C=>{let E=Ot[C];return E?(oe.state().buffer[E.bufferIdx]??"").slice(E.startCol,E.endCol):""},Cs=C=>{let E=Zt(),$=As(C),X=Math.max(0,E-1-$.length),ie=" ".repeat(X);u===0?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.dim.noFormat("\u2502"))},Yn=C=>{let E=mi[C]??"",$=a[C],X=$&&$.priority&&$.priority>0?"* ":" ";u===C+1?t.brightWhite.bgBlue.noFormat(`${X}${E}`):t.noFormat(`${X}${E}`)},ur=()=>{let C=p,E=Math.max(0,a.length-p-$e),$=[];return s.filters.cwdOnly&&$.push("cwd-only"),s.filters.hostFilter!=="__all"&&$.push(s.filters.hostFilter==="__local"?"host: local":`host: ${s.filters.hostFilter}`),s.filters.includeNonInteractive&&$.push("+non-interactive"),C>0&&$.push(`\u2191 ${C} above`),E>0&&$.push(`\u2193 ${E} below`),$.length===0?"":` ${$.join(" \xB7 ")}`},en=C=>ze(C),bi=()=>{let C=R?`${R.sessionId}|${R.status}`:"";return["ind",k,C,Z,ee??"",m?`1|${g}|${a.length}`:"0",ur()].join("")},Ie=()=>{Be(()=>{j.paintRow(Wt(),bi(),()=>{if(k==="confirm-kill"&&R)t.brightYellow.noFormat(` kill ${en(R.sessionId)}? [y/N]`);else if(k==="confirm-delete"&&R)R.status==="live"?t.brightRed.noFormat(` kill + delete ${en(R.sessionId)}? [y/N]`):t.brightRed.noFormat(` delete ${en(R.sessionId)}? [y/N]`);else if(k==="busy"&&R)t.dim.noFormat(` working on ${en(R.sessionId)}\u2026`);else if(k==="rename"&&R)t.brightYellow.noFormat(` title: ${Z}`),t.bgBrightYellow(" "),t.dim.noFormat(" Enter saves \xB7 Esc cancels");else if(ee!==null)t.dim.noFormat(` ${ee}`);else if(m){t.brightYellow.noFormat(` /${g}`),t.bgBrightYellow(" ");let C=a.length===0?" no matches":` ${a.length} match${a.length===1?"":"es"}`;t.dim.noFormat(`${C} \xB7 ^c clears`)}else t.dim.noFormat(ur())})})},tn=C=>be+1+C,fr=()=>be+nt+1,Ve=()=>be+nt+3,Ft=C=>Ve()+1+(C-p),Wt=()=>Ve()+1+$e,he=()=>{let C=Kn-zn;if(C<0||C>=nt)return;let E=3+xn;t.moveTo(E,tn(C))},vi=()=>`ct|${u===0?"f":"u"}|${Zt()}|${kn}`,Gn=()=>`cb|${u===0?"f":"u"}|${Zt()}`,ft=C=>`cbb|${u===0?"f":"u"}|${Zt()}|${As(C)}`,Rs=()=>`h|${dr}`,Cn=C=>{let E=a[C],$=E&&E.priority&&E.priority>0?"* ":" ",X=mi[C]??"";return`sr|${u===C+1?"1":"0"}|${$}${X}`},I=()=>{Be(()=>{t.hideCursor(),cr(),Ke(),be=1,j.ensureSize(_e,ue),j.paintRow(be,vi(),()=>{Vn()});for(let C=0;C<nt;C++){let E=zn+C;j.paintRow(tn(C),ft(E),()=>{Cs(E)})}j.paintRow(fr(),Gn(),()=>{lr()}),j.paintRow(fr()+1,"blank",()=>{}),j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=p+C,$=Ve()+1+C;E<a.length?j.paintRow($,Cn(E),()=>{Yn(E)}):j.paintRow($,"blank",()=>{})}Ie(),j.paintRow(Wt()+1,"blank",()=>{}),u===0&&(he(),t.hideCursor(!1))})},Ii=()=>{j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),I()},Io=()=>{Be(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(" Picker hotkeys")(`
134
+ `),[o,...a]=i,d=0;if(this.streamingActive&&this.lines.length>0){let l=this.lines[this.lines.length-1];if(l){let f=this.wrappedRowsOf(l);this.forgetLine(l),l.body+=o??"",d+=this.wrappedRowsOf(l)-f}}else{if(this.lines.length>0){let f=this.lines[this.lines.length-1];if(!(f&&f.body===""&&(!f.prefix||f.prefix===""))){let p={body:""};this.lines.push(p),this.trackLine(p),d+=this.wrappedRowsOf(p)}}let l={prefix:n,body:o??"",bodyStyle:s};r!==void 0&&(l.prefixStyle=r),this.lines.push(l),this.trackLine(l),d+=this.wrappedRowsOf(l)}let c=" ".repeat(n.length);for(let l of a){let f={prefix:c,body:l,bodyStyle:s};this.lines.push(f),this.trackLine(f),d+=this.wrappedRowsOf(f)}this.streamingActive=!0,this.adjustScrollForRowChange(d),this.moveStickyToEnd(),this.trimScrollback(),this.scheduleRepaint()}setSessionbar(e){this.sessionbar={...this.sessionbar,...e},this.syncWindowTitle(),this.repaint()}syncWindowTitle(){let e=this.sessionbar.title?.trim(),n=zl(this.sessionbar.sessionId)||"hydra",s=e&&e.length>0?e:n,i=(this.readonly?`${s} [VIEW ONLY]`:s).replace(/[\x00-\x1f\x7f]/g,"").slice(0,200);i!==this.lastWindowTitle&&(this.lastWindowTitle=i,process.stdout.write(`\x1B]0;${i}\x1B\\`))}clearWindowTitle(){this.lastWindowTitle=null,process.stdout.write("\x1B]0;\x1B\\")}setBanner(e){this.banner={...this.banner,...e},this.writeProgressIndicator(this.banner.status==="busy"?3:0),this.syncedPartialRepaint(()=>this.drawBanner())}syncedPartialRepaint(e){this.started&&Le(()=>{e(),this.placeCursor()})}currentModeId(){return this.banner.currentMode}writeProgressIndicator(e){this.started&&this.progressIndicatorEnabled&&e!==this.lastProgressState&&(this.lastProgressState=e,process.stdout.write(`\x1B]9;4;${e}\x1B\\`))}notify(e,n=4e3){this.bannerNotificationTimer&&clearTimeout(this.bannerNotificationTimer),this.bannerNotification=e,this.bannerNotificationTimer=setTimeout(()=>{this.bannerNotification=null,this.bannerNotificationTimer=null,this.syncedPartialRepaint(()=>this.drawBanner())},n),this.syncedPartialRepaint(()=>this.drawBanner())}setMouseEnabled(e){this.mouseEnabled!==e&&(this.mouseEnabled=e,this.started&&(e?(this.term.grabInput({mouse:"drag"}),this.term.on("mouse",this.mouseHandler)):(this.term.off("mouse",this.mouseHandler),this.term.grabInput(!0)),this.reclaimStdinAfterGrabInput()))}reclaimStdinAfterGrabInput(){if(this.terminalKitStdinHandler===null)return;let e=this.term;!e.stdin||typeof e.onStdin!="function"||(this.terminalKitStdinHandler=e.onStdin,e.stdin.removeListener("data",e.onStdin),e.stdin.removeListener("data",this.rawStdinHandler),e.stdin.on("data",this.rawStdinHandler))}isMouseEnabled(){return this.mouseEnabled}setInAppSelectionEnabled(e){this.inAppSelectionEnabled=e}isInAppSelectionEnabled(){return this.inAppSelectionEnabled}setSelection(e,n){let s=this.lineIndexById(e.sourceLineId),r=this.lineIndexById(n.sourceLineId),i=s<r||s===r&&e.offset<=n.offset,o=i?e:n,a=i?n:e;if(o.sourceLineId===a.sourceLineId&&o.offset===a.offset){this.clearSelection();return}let d={startLineId:o.sourceLineId,startOffset:o.offset,endLineId:a.sourceLineId,endOffset:a.offset},c=this.selection;c&&c.startLineId===d.startLineId&&c.startOffset===d.startOffset&&c.endLineId===d.endLineId&&c.endOffset===d.endOffset||(this.selection=d,this.repaint())}clearSelection(){this.selection!==null&&(this.selection=null,this.repaint())}hasSelection(){return this.selection!==null}getSelection(){return this.selection===null?null:{start:{sourceLineId:this.selection.startLineId,offset:this.selection.startOffset},end:{sourceLineId:this.selection.endLineId,offset:this.selection.endOffset}}}getSelectionText(){let e=this.selectionLineBounds();if(e===null)return"";let n=[];for(let s=e.loIdx;s<=e.hiIdx;s++){let r=this.lines[s];if(!r)continue;let i=this.lineIds.get(r),o=i===void 0?void 0:e.byId.get(i);if(!o)continue;let a=r.body??"",d;r.ansi?d=s===e.loIdx||s===e.hiIdx?"":a.replace(IA,""):(d=a.slice(o.start,o.end),bd(r.bodyStyle)&&(d=$A(d))),n.push(d)}return n.join(`
135
+ `)}selectionLineBounds(){let e=this.selection;if(e===null)return null;let n=this.lineIndexById(e.startLineId),s=this.lineIndexById(e.endLineId);if(n===-1||s===-1)return null;let r=n,i=s,o=e.startOffset,a=e.endOffset;n>s&&(r=s,i=n,o=e.endOffset,a=e.startOffset);let d=new Map;for(let c=r;c<=i;c++){let l=this.lines[c];if(!l)continue;let f=this.lineIds.get(l);if(f===void 0)continue;let u=(l.body??"").length,p=c===r?Math.max(0,Math.min(u,o)):0,m=c===i?Math.max(0,Math.min(u,a)):u;d.set(f,{start:p,end:m,toEnd:c<i})}return{loIdx:r,hiIdx:i,byId:d}}selectionRangeForChunk(e){if(this.selection===null||e.ansi)return null;let n=this.selectionRenderBounds??this.selectionLineBounds()?.byId??null;if(n===null)return null;let s=this.wrapOrigin.get(e);if(!s)return null;let r=n.get(s.sourceLineId);if(!r)return null;let i=s.sourceColOffset,o=i+e.body.length,a=Math.max(r.start,i),d=Math.min(r.end,o);return d<=a?null:{start:a-i,end:d-i,toEndOfLine:r.toEnd||r.end>o}}setBannerSearchIndicator(e){this.bannerSearchIndicator!==e&&(this.bannerSearchIndicator=e,this.syncedPartialRepaint(()=>this.drawBanner()))}bannerRightContent(){if(this.scrollbackSearch!==null){let e=this.scrollbackSearch,n=e.matches.length>0?` ${e.matchIndex+1}/${e.matches.length}`:e.term.length===0?"":" 0/0";return{text:`\u{1F50D} ${e.term}${n}`,kind:"search"}}return this.bannerSearchIndicator!==null?{text:`\u{1F50D} ${this.bannerSearchIndicator}`,kind:"search"}:this.bannerNotification!==null?{text:this.bannerNotification,kind:"notify"}:null}clearScrollback(){this.lines=[],this.keyedBlocks.clear(),this.wrapCache.clear(),this.wrapCacheWidth=0,this.streamingActive=!1,this.scrollOffset=0,this.selection!==null&&(this.selection=null),this.repaint()}invalidateSelectionIfTouches(e){if(this.selection!==null)for(let n of e){let s=this.lineIds.get(n);if(s!==void 0&&(s===this.selection.startLineId||s===this.selection.endLineId)){this.selection=null;return}}}setHideThoughts(e){this.hideThoughts!==e&&(this.hideThoughts=e,this.repaint())}clearKey(e){this.keyedBlocks.delete(e)}hasKey(e){return this.keyedBlocks.has(e)}removeKey(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count,r=s>=this.lines.length,i=this.wrappedRowsOfMany(this.lines.slice(n.start,s)),o=this.lines.splice(n.start,n.count);for(let a of o)this.forgetLine(a);this.invalidateSelectionIfTouches(o),this.keyedBlocks.delete(e);for(let[a,d]of this.keyedBlocks)a!==e&&d.start>n.start&&(d.start-=n.count);r&&(this.streamingActive=!1),this.adjustScrollForRowChange(-i),this.moveStickyToEnd(),this.scheduleRepaint()}setStickyBottomKey(e){this.stickyBottomKey=e,this.moveStickyToEnd(),this.scheduleRepaint()}moveStickyToEnd(){if(this.stickyBottomKey===null)return;let e=this.keyedBlocks.get(this.stickyBottomKey);if(!e)return;let n=e.start+e.count;if(n>=this.lines.length)return;let s=this.lines.splice(e.start,e.count);for(let[r,i]of this.keyedBlocks)r!==this.stickyBottomKey&&i.start>=n&&(i.start-=e.count);e.start=this.lines.length,this.lines.push(...s),this.streamingActive=!1}removeBlock(e){let n=this.keyedBlocks.get(e);if(!n)return;let s=n.start+n.count>=this.lines.length,r=this.wrappedRowsOfMany(this.lines.slice(n.start,n.start+n.count)),i=this.lines.splice(n.start,n.count);for(let o of i)this.forgetLine(o);this.invalidateSelectionIfTouches(i),this.keyedBlocks.delete(e);for(let[,o]of this.keyedBlocks)o.start>n.start&&(o.start-=n.count);s&&(this.streamingActive=!1),this.adjustScrollForRowChange(-r),this.scheduleRepaint()}contiguousRun(e,n){if(!this.keyedBlocks.has(e))return[];let s=[...n].map(d=>{let c=this.keyedBlocks.get(d);return c?{key:d,start:c.start,count:c.count}:null}).filter(d=>d!==null).sort((d,c)=>d.start-c.start),r=s.findIndex(d=>d.key===e);if(r<0)return[];let i=(d,c)=>{for(let[l,f]of this.keyedBlocks)if(!n.has(l)&&f.start>=d&&f.start<c)return!0;return!1},o=r;for(;o>0&&!i(s[o-1].start+s[o-1].count,s[o].start);)o--;let a=r;for(;a<s.length-1&&!i(s[a].start+s[a].count,s[a+1].start);)a++;return s.slice(o,a+1).map(d=>d.key)}setRunCollapsed(e,n,s){if(e.length===0)return;let r=e[0];if(!this.keyedBlocks.has(r))return;this.upsertLines(r,s);let i=this.keyedBlocks.get(r),o=i.start+i.count;for(let a of e){let d=this.keyedBlocks.get(a);d&&(o=Math.max(o,d.start+d.count))}for(let a=i.start+i.count;a<o;a++){let d=this.lines[a];d&&(d.collapsed=n)}this.scheduleRepaint()}redraw(){this.repaint()}fullRedraw(){this.painter.clearCache(),this.lastWindowTitle=null,this.wrapCache.clear(),this.wrapCacheWidth=0,process.stdout.write(yl),this.term.clear(),this.repaint()}pauseRepaint(){this.repaintPaused+=1}resumeRepaint(){this.repaintPaused!==0&&(this.repaintPaused-=1,this.repaintPaused===0&&this.repaintPending&&(this.repaintPending=!1,this.repaint()))}setQueuedPrompts(e){this.queuedTexts=[...e],this.lastQueueEditingIndex=this.dispatcher.state().queueIndex,this.repaint()}repaintNow(){this.repaint()}setPermissionPrompt(e){e!==null&&this.permissionPrompt===null&&this.clearSelection(),this.permissionPrompt=e?{...e}:null,this.repaint()}setOptionsPrompt(e){e!==null&&this.optionsPrompt===null&&this.clearSelection(),this.optionsPrompt=e?{...e,options:e.options.map(n=>({...n}))}:null,this.repaint()}isOptionsPromptActive(){return this.optionsPrompt!==null}setConfirmPrompt(e){e!==null&&this.confirmPrompt===null&&this.clearSelection(),this.confirmPrompt=e?{...e}:null,this.repaint()}setHelpPrompt(e){e!==null&&this.helpPrompt===null&&this.clearSelection(),this.helpPrompt=e?{...e,entries:[...e.entries]}:null,this.repaint()}isHelpPromptActive(){return this.helpPrompt!==null}openBtwOverlay(e){let n=e?.height??12;this.btwOverlayOpen=!0,this.btwOverlayMaxHeight=n,this.focusedPane="btw",this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.scheduleRepaint()}setBtwOverlayMeta(e){let n=!1;if(e.sessionId!==void 0&&this.btwOverlaySessionId!==e.sessionId&&(this.btwOverlaySessionId=e.sessionId,n=!0),e.usage!==void 0){let s=this.btwOverlayUsage,r=e.usage;(!s||s.used!==r.used||s.size!==r.size||s.costAmount!==r.costAmount||s.costCurrency!==r.costCurrency)&&(this.btwOverlayUsage={...r},n=!0)}n&&this.scheduleRepaint()}setBtwOverlayContent(e){if(this.btwOverlayLines.length===e.length){let n=!0;for(let s=0;s<e.length;s++)if(this.btwOverlayLines[s]!==e[s]){n=!1;break}if(n)return}this.btwOverlayLines=[...e],this.scheduleRepaint()}setBtwOverlayStatus(e){let n=this.btwOverlayLabel===e.label,s=this.btwOverlayStatus===e.style;n&&s||(this.btwOverlayLabel=e.label,this.btwOverlayStatus=e.style,this.scheduleRepaint())}closeBtwOverlay(){this.btwOverlayOpen&&(this.btwOverlayOpen=!1,this.btwOverlayLines=[],this.btwOverlaySessionId=null,this.btwOverlayUsage=void 0,this.focusedPane="main",this.scheduleRepaint())}toggleFocusedPane(){this.focusedPane=this.focusedPane==="main"?"btw":"main",this.scheduleRepaint()}getFocusedPane(){return this.focusedPane}isOverlayOpen(){return this.btwOverlayOpen}setCompletions(e){e.length===this.completions.length&&e.every((s,r)=>{let i=this.completions[r];return i!==void 0&&i.name===s.name&&i.description===s.description})||(this.completions=[...e],this.repaint())}ensureSeparator(e){if(this.lines.length===0)return;let n=this.stickyBottomKey!==null?this.keyedBlocks.get(this.stickyBottomKey):void 0,s=n!==void 0&&n.start+n.count===this.lines.length,r=s?n.start-1:this.lines.length-1;if(r<0)return;let i=this.lines[r];if(i&&i.body===""&&(i.prefix===void 0||i.prefix===""))return;let o={body:""};e!==void 0&&(o.bodyStyle=e),s?(this.lines.splice(n.start,0,o),n.start+=1):this.lines.push(o),this.trackLine(o),this.streamingActive=!1,this.adjustScrollForRowChange(this.wrappedRowsOf(o)),this.trimScrollback(),this.scheduleRepaint()}refreshPrompt(){if(this.promptRows()!==this.lastPromptRows){this.repaint();return}this.syncedPartialRepaint(()=>{let e=this.dispatcher.state().queueIndex;e!==this.lastQueueEditingIndex&&(this.lastQueueEditingIndex=e,this.drawQueuedZone()),this.drawPrompt()})}handleKey(e,n){if(n.isCharacter){this.onKey([{type:"char",ch:e}]);return}if(e==="PAGE_UP"){this.scrollBy(this.scrollPageSize());return}if(e==="PAGE_DOWN"){this.scrollBy(-this.scrollPageSize());return}let s=kd(e);s&&this.onKey([{type:"key",name:s}])}handleMouse(e,n){if(e==="MOUSE_WHEEL_UP"){this.scrollBy(3);return}if(e==="MOUSE_WHEEL_DOWN"){this.scrollBy(-3);return}let s=this.mouseCell(n),r=EA(e),i=null;if(e==="MOUSE_DRAG"||e==="MOUSE_MOTION"?i="move":e.endsWith("_PRESSED")?i="press":e.endsWith("_RELEASED")&&(i="release"),i!==null&&s!==null&&this.onMouse&&this.onMouse({kind:i,button:r,x:s.x,y:s.y,name:e}),e==="MOUSE_LEFT_BUTTON_PRESSED"){let o=this.lastLeftClick;o!==null&&s!==null&&Math.abs(s.x-o.x)<=wd&&Math.abs(s.y-o.y)<=wd&&Date.now()-o.t<=Nl||this.flushPendingBlockClick(),this.pressCell=s,this.handleSelectionPress(s);return}if(e.endsWith("_PRESSED")&&e!=="MOUSE_LEFT_BUTTON_PRESSED"&&this.flushPendingBlockClick(),e==="MOUSE_DRAG"&&s!==null){this.handleSelectionDrag(s);return}if(e==="MOUSE_LEFT_BUTTON_RELEASED"||e==="MOUSE_BUTTON_RELEASED"){let o=this.pressCell;this.pressCell=null;let a=this.inAppSelectionEnabled&&(this.selectionDragStarted||this.doubleClickPending);if(this.onBlockClick&&o!==null&&s!==null&&s.x===o.x&&s.y===o.y&&!a){let d=this.keyAtRow(s.y);if(d!==null){let c=s.y;for(;c>1&&this.keyAtRow(c-1)===d;)c-=1;this.schedulePendingBlockClick(d,s.y-c)}}this.handleSelectionRelease(s)}}handleSelectionPress(e){if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,!this.inAppSelectionEnabled||e===null)return;let n=this.resolveCellToSource(e.x,e.y);if(n===null){this.lastLeftClick=null;return}this.selectionAnchor=n;let s=Date.now(),r=this.lastLeftClick;if(r!==null&&s-r.t<=Nl&&Math.abs(e.x-r.x)<=wd&&Math.abs(e.y-r.y)<=wd){if(this.cancelPendingBlockClick(),this.onBlockDoubleClick&&e!==null){let a=this.keyAtRow(e.y);if(a!==null){let d=e.y;for(;d>1&&this.keyAtRow(d-1)===a;)d-=1;let c=e.y-d;if(this.onBlockDoubleClick(a,c)){this.doubleClickPending=!0,this.lastLeftClick=null;return}}}if(this.tryOpenFileAt(n)){this.doubleClickPending=!0,this.lastLeftClick=null;return}let o=this.wordBoundsAt(n);o!==null&&(this.setSelection({sourceLineId:n.sourceLineId,offset:o.start},{sourceLineId:n.sourceLineId,offset:o.end}),this.doubleClickPending=!0),this.lastLeftClick=null}}handleSelectionDrag(e){if(!this.inAppSelectionEnabled||this.selectionAnchor===null||this.doubleClickPending)return;let n=this.resolveCellToSource(e.x,e.y);n!==null&&(this.selectionDragStarted=!0,this.setSelection(this.selectionAnchor,n))}handleSelectionRelease(e){let n=this.selectionDragStarted,s=this.doubleClickPending;if(this.selectionAnchor=null,this.selectionDragStarted=!1,this.doubleClickPending=!1,e!==null&&(this.lastLeftClick={x:e.x,y:e.y,t:Date.now()}),!!this.inAppSelectionEnabled){if(n||s){this.finalizeSelection();return}this.selection!==null&&this.clearSelection()}}wordBoundsAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let r=Math.max(0,Math.min(s.length-1,e.offset));if(e.offset>=s.length&&(r=s.length-1),!Dl.test(s[r]))return null;let i=r;for(;i>0&&Dl.test(s[i-1]);)i--;let o=r+1;for(;o<s.length&&Dl.test(s[o]);)o++;return{start:i,end:o}}pathTokenAt(e){let n=this.lineById(e.sourceLineId);if(n===null||n.ansi)return null;let s=n.body??"";if(s.length===0)return null;let{clean:r,rawToClean:i}=_A(s);if(r.length===0)return null;let o=i[Math.min(e.offset,i.length-1)]??r.length;if(n.links){for(let p of n.links)if(o>=p.start&&o<p.end){let m=p.url;return{raw:m.startsWith("file://")?m.slice(7):m,line:null}}}let a=Math.max(0,Math.min(r.length-1,o));if(o>=r.length&&(a=r.length-1),!Hl.test(r[a]))return null;let d=a;for(;d>0&&Hl.test(r[d-1]);)d--;let c=a+1;for(;c<r.length&&Hl.test(r[c]);)c++;let l=r.slice(d,c);if(l=l.replace(/[.]+$/,""),l.length===0)return null;let f=null,u=r.slice(c).match(/^:(\d+)(?::\d+)?/);return u&&(f=Number.parseInt(u[1],10)),{raw:l,line:f}}resolvePathToken(e){let n=e;(n==="~"||n.startsWith("~/"))&&(n=n==="~"?_g():`${_g()}/${n.slice(2)}`);let s=$g(n)||e.startsWith("~"),r=n.includes("/");if(!s&&!r)return null;let i=$g(n)?n:bA(this.sessionbar.cwd,n);if(s)return i;try{if(wA(i).isFile())return i}catch{return null}return null}tryOpenFileAt(e){if(this.openFileCommand===null)return!1;let n=this.pathTokenAt(e);if(n===null)return!1;let s=n.line===null?"":`:${n.line}`;return this.tryOpenPathString(n.raw+s)}tryOpenPathString(e){if(this.openFileCommand===null)return!1;let n=e,s=null,r=e.match(/^(.*?):(\d+)(?::\d+)?$/);r&&(n=r[1],s=Number.parseInt(r[2],10));let i=this.resolvePathToken(n);if(i===null)return!1;let o=s===null?"":String(s),[a,...d]=this.openFileCommand;if(!a)return!1;let c=!1,l=[];for(let f of d)f.includes("%f")&&(c=!0),!(o===""&&f.includes("%n"))&&l.push(f.replaceAll("%f",i).replaceAll("%n",o));c||l.push(i);try{let f=yA(a,l,{detached:!0,stdio:"ignore",cwd:this.sessionbar.cwd});f.on("error",p=>{this.notify(`open file failed: ${p.message}`)}),f.unref();let u=s===null?i:`${i}:${s}`;this.notify(`opening ${u}`)}catch(f){this.notify(`open file failed: ${f.message}`)}return!0}schedulePendingBlockClick(e,n){if(!this.onBlockClick)return;if(this.openFileCommand===null){this.onBlockClick(e,n);return}this.cancelPendingBlockClick();let s=this.onBlockClick,r=setTimeout(()=>{this.pendingBlockClick=null,s(e,n)},Nl);typeof r.unref=="function"&&r.unref(),this.pendingBlockClick={timer:r,key:e,rowOffset:n}}cancelPendingBlockClick(){this.pendingBlockClick!==null&&(clearTimeout(this.pendingBlockClick.timer),this.pendingBlockClick=null)}flushPendingBlockClick(){let e=this.pendingBlockClick;e!==null&&(clearTimeout(e.timer),this.pendingBlockClick=null,this.onBlockClick&&this.onBlockClick(e.key,e.rowOffset))}lineById(e){for(let n of this.lines)if(this.lineIds.get(n)===e)return n;return null}lineIndexById(e){for(let n=0;n<this.lines.length;n++){let s=this.lines[n];if(s&&this.lineIds.get(s)===e)return n}return-1}finalizeSelection(){let e=this.getSelectionText();e.length!==0&&Eg(e,{target:this.selectionClipboard}).then(n=>{if(n.ok){let s=e.length;this.notify(`copied ${s} char${s===1?"":"s"} to clipboard`)}else this.notify(`clipboard copy failed: ${n.reason}`)},n=>{this.notify(`clipboard copy failed: ${n.message}`)})}mouseCell(e){if(!e||typeof e!="object")return null;let n=e,s=Number(n.x),r=Number(n.y);return!Number.isFinite(s)||!Number.isFinite(r)?null:{x:s,y:r}}keyAtRow(e){let n=this.term.width,s=1,r=this.scrollbackVisibleRows();if(r<=0)return null;let i=e-s;if(i<0||i>=r)return null;let{rows:o}=this.wrapTail(n,r+this.scrollOffset),a=o.length-this.scrollOffset,d=Math.max(0,a-r),c=o.slice(d,a),l=Math.max(0,r-c.length),f=i-l;return f<0||f>=c.length?null:c[f]?.blockKey??null}resolveCellToSource(e,n){if(!Number.isFinite(e)||!Number.isFinite(n))return null;let s=this.term.width,r=1,i=this.scrollbackVisibleRows();if(i<=0)return null;let o=n-r;if(o<0||o>=i||e<1||e>s)return null;let{rows:a}=this.wrapTail(s,i+this.scrollOffset),d=a.length-this.scrollOffset,c=Math.max(0,d-i),l=a.slice(c,d),f=Math.max(0,i-l.length),u=o-f;if(u<0||u>=l.length)return null;let p=l[u];if(!p)return null;let m=this.wrapOrigin.get(p);if(!m)return null;let g=vs(p.prefix??""),y=e-1-g;if(y<0)return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset};let v=bd(p.bodyStyle)?kg(Vl(p.body),y):Sg(p.body,y);return{sourceLineId:m.sourceLineId,offset:m.sourceColOffset+v}}scrollBy(e){if(e===0)return;this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let n=this.maxScrollOffset(),s=Math.min(n,Math.max(0,this.scrollOffset+e));s!==this.scrollOffset&&(this.scrollOffset=s,this.repaint())}scrollToBottom(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch(),this.scrollOffset!==0&&(this.scrollOffset=0,this.repaint())}scrollToTop(){this.scrollbackSearch!==null&&this.acceptScrollbackSearch();let e=this.maxScrollOffset();this.scrollOffset!==e&&(this.scrollOffset=e,this.repaint())}isScrolledBack(){return this.scrollOffset>0}isScrollbackSearchActive(){return this.scrollbackSearch!==null}enterScrollbackSearch(){this.scrollbackSearch===null&&(this.scrollbackSearch={term:"",matchIndex:0,matches:[],baselineScroll:this.scrollOffset},this.scrollbackHighlight=null,this.repaint())}updateScrollbackSearchTerm(e){if(this.scrollbackSearch===null)return;let n=e.toLowerCase(),s=[];if(n.length>0)for(let r=this.lines.length-1;r>=0;r--){let i=this.lines[r];if(!i||i.body.length===0||i.ansi)continue;let o=i.body.toLowerCase(),a=[],d=0;for(;d<o.length;){let c=o.indexOf(n,d);if(c===-1)break;a.push(c),d=c+n.length}for(let c=a.length-1;c>=0;c--)s.push({lineIdx:r,col:a[c]})}this.scrollbackSearch.term=e,this.scrollbackSearch.matches=s,this.scrollbackSearch.matchIndex=0,this.scrollbackHighlight=n.length>0?n:null,s.length>0&&this.scrollToMatch(s[0]),this.repaint()}advanceScrollbackSearch(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return;let e=Math.min(this.scrollbackSearch.matches.length-1,this.scrollbackSearch.matchIndex+1);e!==this.scrollbackSearch.matchIndex&&(this.scrollbackSearch.matchIndex=e,this.scrollToMatch(this.scrollbackSearch.matches[e]),this.repaint())}retreatScrollbackSearch(){this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0||this.scrollbackSearch.matchIndex!==0&&(this.scrollbackSearch.matchIndex-=1,this.scrollToMatch(this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex]),this.repaint())}acceptScrollbackSearch(){this.scrollbackSearch!==null&&(this.scrollbackSearch=null,this.scrollbackHighlight=null,this.repaint())}cancelScrollbackSearch(){if(this.scrollbackSearch===null)return;let e=this.scrollbackSearch.baselineScroll;this.scrollbackSearch=null,this.scrollbackHighlight=null,this.scrollOffset=e,this.repaint()}scrollbackSearchTerm(){return this.scrollbackSearch?.term??""}currentMatchInfo(){if(this.scrollbackSearch===null||this.scrollbackSearch.matches.length===0)return null;let e=this.scrollbackSearch.matches[this.scrollbackSearch.matchIndex];if(!e)return null;let n=this.lines[e.lineIdx];if(!n)return null;let s=this.lineIds.get(n);return s===void 0?null:{lineId:s,col:e.col,length:this.scrollbackSearch.term.length}}activeMatchCol(e,n){if(!e||n===null)return null;let s=this.wrapOrigin.get(e);if(!s||s.sourceLineId!==n.lineId)return null;let r=n.col-s.sourceColOffset;return r<0||r>=e.body.length?null:r}scrollToMatch(e){let n=this.term.width,s=this.scrollbackVisibleRows();if(s<=0)return;let r=0;for(let l=this.lines.length-1;l>e.lineIdx;l--){let f=this.lines[l];f&&(r+=this.wrapOne(f,n).length)}let i=this.lines[e.lineIdx],o=0;if(i){let l=this.wrapOne(i,n),f=0;for(let u=0;u<l.length;u++){let p=l[u];if(!p)continue;let m=p.body.length;if(e.col<f+m){o=l.length-1-u;break}f+=m}}let a=r+o,d=Math.max(0,a-Math.floor(s/2)),c=this.maxScrollOffset();this.scrollOffset=Math.min(c,d)}scrollPageSize(){return Math.max(1,this.scrollbackVisibleRows()-2)}scrollbackVisibleRows(){let n=this.term.height-this.promptRows()-qe-We-Ze-We-this.chipRows()-this.queuedRows()-this.completionRows()-this.btwOverlayRows();return Math.max(0,n-1+1)}maxScrollOffset(){let{rows:e}=this.wrapTail(this.term.width,Number.POSITIVE_INFINITY);return Math.max(0,e.length-this.scrollbackVisibleRows())}scheduleRepaint(){this.scheduler.schedule()}paintRow(e,n,s){this.started&&this.painter.paintRow(e,n,s)}repaint(){if(!this.started)return;if(this.repaintPaused>0){this.repaintPending=!0;return}this.scheduler.noteRepaintStart();let e=this.term.width,n=this.term.height;e<20||n<8||(this.painter.ensureSize(e,n),Le(()=>{this.term.hideCursor(),this.drawScrollback(),this.drawBtwOverlay(),this.drawCompletionZone(),this.drawQueuedZone(),this.drawAttachmentChipZone();let s=this.promptRows(),r=n-s-Ze-We-qe;this.drawSeparator(r),this.drawPrompt(),this.drawBanner(),this.drawSeparator(n-qe),this.drawSessionbar(),this.placeCursor(),(this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt)&&this.term.hideCursor(!1),this.lastPromptRows=s}))}drawSessionbar(){let e=this.term.width,n=this.term.height,s=zl(this.sessionbar.sessionId),r=this.sessionbar.title?.trim(),i=kh(this.sessionbar.agent,this.sessionbar.model),o=Ue(this.sessionbar.cwd),a=Ng(this.sessionbar.usage),d=`sbar|${e}|${s}|${i}|${o}|${r??""}|${a??""}`;this.paintRow(n,d,()=>{let c=a?a.length+3:0,l=s.length+3+i.length+3+(r?3:0)+c,f=Math.max(8,e-l),u,p;if(r){let m=Math.min(r.length,8);u=Math.min(o.length,Math.max(8,f-m)),p=Math.max(0,f-u)}else p=0,u=f;if(this.term.yellow(s)(" \xB7 ").cyan.noFormat(i)(" \xB7 ").dim.noFormat(bt(o,u)),r&&this.term(" \xB7 ").bold.noFormat(bt(r,p)),this.term.eraseLineAfter(),a){let m=or(a),g=Math.max(1,e-m);this.term.moveTo(g,n).eraseLineAfter(),this.term.dim.noFormat(a)}})}drawSeparator(e){let n=this.term.width;this.paintRow(e,`sep|${n}`,()=>{this.term.dim("\u2500".repeat(n))})}buildBtwHeaderSegments(){let e=this.term.width,n="By the way",s="\u2500\u2500 ",r=this.btwOverlaySessionId?zl(this.btwOverlaySessionId):"",i=r?" \xB7 ":" ",o=Ng(this.btwOverlayUsage),a=o?` ${o} `:"",d=o?"\u2500\u2500":"",c=s.length+or(n)+i.length+or(r)+or(a)+d.length,l="\u2500".repeat(Math.max(0,e-c)),f=`${e}|${r}|${this.btwOverlayStatus}|${o??""}`;return{left:s,label:n,sidSep:i,sid:r,middle:l,usage:a,right:d,signature:f}}paintBtwHeader(e){switch(this.term.dim(e.left),this.btwOverlayStatus){case"busy":this.term.brightYellow(e.label);break;case"done":this.term(e.label);break;case"cancelled":case"errored":this.term.brightRed(e.label);break;default:this.term(e.label)}this.term.dim(e.sidSep),e.sid&&this.term.yellow(e.sid),this.term.dim(e.middle),e.usage&&this.term.dim.noFormat(e.usage),this.term.dim(e.right)}drawScrollback(){let e=this.term.width,n=1,s=this.scrollbackVisibleRows();if(s<=0)return;let{rows:r,exhausted:i}=this.wrapTail(e,s+this.scrollOffset);if(i){let u=Math.max(0,r.length-s);this.scrollOffset>u&&(this.scrollOffset=u)}let o=r.length-this.scrollOffset,a=Math.max(0,o-s),d=r.slice(a,o),c=Math.max(0,s-d.length),l=this.currentMatchInfo(),f=l?.length??0;this.selectionRenderBounds=this.selectionLineBounds()?.byId??null;for(let u=0;u<s;u++){let p=n+u,m=u-c,g=m>=0?d[m]:void 0,y=this.activeMatchCol(g,l),v=g?this.selectionRangeForChunk(g):null,b=Og("sb",e,g,this.scrollbackHighlight,y,v);this.paintRow(p,b,()=>{g&&this.writeFormattedLine(g,e,y,f,v)})}if(this.onBlockVisible&&this.pendingVisibleKeys.size>0){let u=new Set;for(let m of d)m.blockKey!==void 0&&u.add(m.blockKey);let p=[];for(let m of this.pendingVisibleKeys)u.has(m)&&p.push(m);for(let m of p)this.pendingVisibleKeys.delete(m),this.onBlockVisible(m)}}notifyWhenVisible(e){this.onBlockVisible&&(this.pendingVisibleKeys.add(e),this.scheduleRepaint())}queuedRows(){return Math.min(jl,this.queuedTexts.length)}chipRows(){return Math.min(Wl,this.attachments.length)}setAttachments(e){this.attachments.length===e.length&&this.attachments.every((n,s)=>n===e[s])||(this.attachments=[...e],this.repaint())}completionRows(){return this.permissionPrompt||this.optionsPrompt||this.confirmPrompt||this.helpPrompt?0:Math.min(ql,this.completions.length)}drawCompletionZone(){let e=this.completionRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-qe-We-Ze,i=this.queuedRows(),o=this.chipRows(),d=r-1-i-o-e+1,c=0;for(let l of this.completions.slice(0,e))l.name.length>c&&(c=l.name.length);for(let l=0;l<e;l++){let f=d+l,u=this.completions[l],p=l===e-1&&this.completions.length>ql,m=this.completions.length-ql+1,g=u?p?`comp|${n}|overflow|${m}`:`comp|${n}|${c}|${u.name}|${u.description??""}`:`comp|${n}|empty`;this.paintRow(f,g,()=>{if(!u)return;if(p){this.term.dim(` + ${m} more match(es)`);return}let y=u.name.padEnd(c),v=u.description??"",b=n-y.length-4,k=b>0?bt(v,b):"";this.term(" ").brightCyan(y),k.length>0&&this.term(" ").dim(k)})}}drawAttachmentChipZone(){let e=this.chipRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),o=this.term.height-s-qe-We-Ze-1-e+1,a=this.isIterm2();for(let d=0;d<e;d++){let c=o+d,l=d===e-1&&this.attachments.length>Wl,f=this.attachments.length-Wl,u=this.attachments[d],p=u?`${u.name??"image"} \xB7 ${qt(u.sizeBytes)}`:"",m=l?`chip|${n}|overflow|${f}`:u?`chip|${n}|${a?"i":"t"}|${p}|${u.sizeBytes}`:`chip|${n}|empty`;this.paintRow(c,m,()=>{if(l){this.term.dim(` \u{1F4CE} + ${f+1} more attached`);return}u&&(this.term(" ").yellow(`\u{1F4CE} ${p}`),a&&(this.term(" "),this.writeIterm2Image(u.data,1)))})}}isIterm2(){let e=process.env;return e.LC_TERMINAL==="iTerm2"||e.TERM_PROGRAM==="iTerm.app"}writeIterm2Image(e,n){process.stdout.write(OA(e,n,!!process.env.TMUX))}drawQueuedZone(){let e=this.queuedRows();if(e===0)return;let n=this.term.width,s=this.promptRows(),r=this.term.height-s-qe-We-Ze,i=this.chipRows(),a=r-1-i-e+1,d=this.dispatcher.state().queueIndex;for(let c=0;c<e;c++){let l=a+c,f=this.queuedTexts[c],u=c===e-1&&this.queuedTexts.length>jl,p=this.queuedTexts.length-jl,m=f===void 0?"":u?`+ ${p+1} more queued`:bt(DA(f),n-4),g=!u&&c===d,y=f===void 0?`queued|${n}|empty`:`queued|${n}|${g?"edit":u?"ovf":"row"}|${m}`;this.paintRow(l,y,()=>{if(f===void 0)return;let v=`\u23F3 ${m}`,b=v+" ".repeat(Math.max(0,n-1-v.length));g?this.term.bgBlue.brightYellow("\u25B8"):this.term.bgBlue(" "),this.term.bgBlue.brightWhite.noFormat(b)})}}drawPrompt(){if(this.permissionPrompt){this.drawPermissionPrompt();return}if(this.optionsPrompt){this.drawOptionsPrompt();return}if(this.confirmPrompt){this.drawConfirmPrompt();return}if(this.helpPrompt){this.drawHelpPrompt();return}if(this.readonly)return;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),o=this.term.height-i.rendered-Ze-We-qe+1,a=!1;for(let d=0;d<i.rendered;d++){let c=r[i.windowStart+d],l=o+d,f="wrap",u="";c&&(c.bufferIdx===0&&c.startCol===0?f="first":c.startCol===0&&(f="newline"),u=(s.buffer[c.bufferIdx]??"").slice(c.startCol,c.endCol));let p=c?`prompt|${this.term.width}|${f}|${u}`:`prompt|${this.term.width}|empty`;this.paintRow(l,p,()=>{c&&(f==="first"?a?this.term.dim("> "):this.term.brightWhite("> "):f==="newline"?this.term.dim("\xB7 "):this.term(" "),a?this.term.dim(u):this.term.noFormat(u))})}}drawConfirmPrompt(){let e=this.confirmPrompt;if(!e)return;let n=this.term.width,s=this.term.height-Jl-Ze-We-qe+1;this.paintRow(s,`confirm|q|${n}|${e.question}`,()=>{this.term.brightYellow(` ? ${bt(e.question,n-4)}`)}),this.paintRow(s+1,`confirm|h|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}drawHelpPrompt(){let e=this.helpPrompt;if(!e)return;let n=this.term.width,s=this.helpRows(),r=this.term.height-s-Ze-We-qe+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`help|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2753 ${bt(e.title,n-5)}`)});let a=Math.min(24,Math.max(...e.entries.map(d=>d===null?0:d[0].length),4));for(let d of e.entries){if(i>=r+s-1)break;if(d===null){o(`help|sep|${n}|${i}`,()=>{});continue}let[c,l]=d,f=c.padEnd(a);o(`help|e|${n}|${c}|${l}`,()=>{this.term(" "),this.term.brightCyan.noFormat(f),this.term.noFormat(` ${bt(l,n-2-a-1)}`)})}o(`help|hint|${n}|${e.hint}`,()=>{this.term.dim(` ${bt(e.hint,n-2)}`)})}helpRows(){return this.helpPrompt?Math.min(xA,2+this.helpPrompt.entries.length):0}drawPermissionPrompt(){let e=this.permissionPrompt;if(!e)return;let n=this.term.width,s=this.permissionRows(),r=this.term.height-s-Ze-We-qe+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`perm|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u{1F512} ${bt(e.title,n-5)}`)});let a=e.detail&&e.detail.length>0?e.detail:"This action requires approval";o(`perm|sub|${n}|${a}`,()=>{this.term.dim(` ${bt(a,n-2)}`)}),o(`perm|q|${n}`,()=>{this.term(" Do you want to proceed?")});for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. ${bt(c.label,n-8)}`;o(`perm|o|${n}|${d}|${l?"1":"0"}|${c.label}`,()=>{l?this.term.brightYellow(u):this.term.dim(u)})}o(`perm|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter submit \xB7 Esc cancel \xB7 1\u20139 quick-pick")})}drawBanner(){let e=this.term.height-qe-We,n=this.term.width,s=this.banner.status==="busy"&&this.banner.elapsedMs!==void 0&&this.banner.elapsedMs>=1e3?In(this.banner.elapsedMs):"",r=this.bannerRightContent(),i=r?`${r.kind}|${r.text}`:"",o=this.banner.status==="busy"&&this.banner.stalled===!0,a=`bnr|${n}|${this.banner.status}|${s}|${o?"1":"0"}|${this.banner.queued}|${this.scrollOffset}|${this.banner.currentMode??""}|${this.banner.hint}|`+i;this.paintRow(e,a,()=>{let d=this.banner.status==="busy"?"\u25CF":"\u25CB";this.banner.status==="busy"?(o?this.term.brightRed(`${d} stalled`):this.term.brightYellow(`${d} ${this.banner.status}`),s&&this.term(" ").dim(s)):this.banner.status==="disconnected"?this.term.brightRed(`${d} ${this.banner.status}`):this.banner.status==="cold"?this.term.brightMagenta(`${d} ${this.banner.status}`):this.term.brightGreen(`${d} ${this.banner.status}`),this.banner.queued>0&&this.term(" \xB7 ").brightYellow(`${this.banner.queued} queued`),this.scrollOffset>0&&this.term(" \xB7 ").brightCyan(`\u2191 ${this.scrollOffset}`);let c=this.banner.currentMode?this.banner.hint.replace("\u21E7\u21E5 mode",`\u21E7\u21E5 mode: ${this.banner.currentMode}`):this.banner.hint;if(this.term(" \xB7 ").dim(c),this.term.eraseLineAfter(),r){let l=or(r.text),f=Math.max(1,n-l);this.term.moveTo(f,e).eraseLineAfter(),r.kind==="search"?this.term.brightCyan.noFormat(r.text):this.term.brightYellow.noFormat(r.text)}})}placeCursor(){if(!this.started)return;if(this.permissionPrompt){let l=this.permissionRows(),u=this.term.height-l-Ze-We-qe+1+3+this.permissionPrompt.selectedIndex,p=this.term.height-Ze-We-qe;this.term.moveTo(2,Math.min(u,p));return}if(this.optionsPrompt){let l=this.optionsRows(),u=this.term.height-l-Ze-We-qe+1+1+this.optionsPrompt.selectedIndex,p=this.term.height-Ze-We-qe;this.term.moveTo(2,Math.min(u,p));return}if(this.confirmPrompt){let l=this.term.height-Jl-Ze-We-qe+1;this.term.moveTo(2,l);return}if(this.helpPrompt){let l=this.helpRows(),f=this.term.height-l-Ze-We-qe+1;this.term.moveTo(2,f);return}if(this.scrollbackSearch){this.term.hideCursor(!0);return}if(this.readonly){this.term.hideCursor(!0);return}this.term.hideCursor(!1);let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n),i=Is(r,s,Ul),a=this.term.height-i.rendered-Ze-We-qe+1+Math.max(0,i.cursorVisualRow-i.windowStart),d=i.cursorVisualCol+3,c=this.term.height-Ze-We-qe;this.term.moveTo(Math.min(d,this.term.width),Math.min(a,c))}promptRows(){if(this.permissionPrompt)return this.permissionRows();if(this.optionsPrompt)return this.optionsRows();if(this.confirmPrompt)return Jl;if(this.helpPrompt)return this.helpRows();if(this.readonly)return 0;let e=this.term.width,n=Math.max(1,e-2),s=this.dispatcher.state(),r=Jn(s.buffer,n);return Math.min(Ul,Math.max(1,r.length))}permissionRows(){return this.permissionPrompt?Math.min(SA,4+this.permissionPrompt.options.length):0}optionsRows(){return this.optionsPrompt?Math.min(kA,2+this.optionsPrompt.options.length):0}drawOptionsPrompt(){let e=this.optionsPrompt;if(!e)return;let n=this.term.width,s=this.optionsRows(),r=this.term.height-s-Ze-We-qe+1,i=r,o=(d,c)=>{i>=r+s||(this.paintRow(i,d,c),i+=1)};o(`opts|t|${n}|${e.title}`,()=>{this.term.brightYellow(` \u2699 ${bt(e.title,n-5)}`)});let a=Math.max(...e.options.map(d=>d.label.length),0);for(let d=0;d<e.options.length&&!(i>=r+s-1);d++){let c=e.options[d];if(!c)continue;let l=d===e.selectedIndex,u=` ${l?"\u276F":" "} ${d+1}. `,p=c.label.padEnd(a),m=n-u.length-3,g=`${u}${bt(`${p} ${c.value}`,m)}`;o(`opts|o|${n}|${d}|${l?"1":"0"}|${c.value}|${c.label}`,()=>{l?this.term.brightYellow(g):this.term.dim(g)})}o(`opts|hint|${n}`,()=>{this.term.dim(" \u2191/\u2193 choose \xB7 Enter this session \xB7 s save default \xB7 Esc close")})}btwOverlayRows(){return!this.btwOverlayOpen||this.btwOverlayLines.length===0?0:Math.min(this.btwOverlayMaxHeight,1+this.btwOverlayLines.length)}drawBtwOverlay(){if(!this.btwOverlayOpen)return;let e=this.btwOverlayRows();if(e===0)return;let n=this.term.width,r=this.term.height-this.promptRows()-Ze-We-qe,i=this.chipRows()+this.queuedRows()+this.completionRows(),a=r-1-i-e+1,d=e-1,c=a,l=this.buildBtwHeaderSegments();this.paintRow(c,`btw|h|${l.signature}`,()=>{this.paintBtwHeader(l)});for(let f=0;f<d;f++){let u=c+1+f,p=this.btwOverlayLines.length-d+f,m=p>=0?this.btwOverlayLines[p]:void 0,g=Og(`btw|c${f}`,n,m);this.paintRow(u,g,()=>{m?this.writeFormattedLine(m,n):this.term.noFormat(" ".repeat(n))})}}wrapTail(e,n){let s=c=>c.collapsed===!0||this.hideThoughts&&c.bodyStyle==="thought";if(e<=4){let c=[];for(let f of this.lines)s(f)||c.push(f);let l=Math.min(n,c.length);return{rows:c.slice(c.length-l),exhausted:n>=c.length}}if(this.wrapCacheWidth!==e&&(this.wrapCache.clear(),this.wrapCacheWidth=e),n<=0||this.lines.length===0)return{rows:[],exhausted:!0};let r=[],i=0,o=0,a=!1;for(let c=this.lines.length-1;c>=0;c--){let l=this.lines[c];if(s(l)){c===0&&(a=!0);continue}let f=this.wrapOne(l,e);if(r.push(f),i+=f.length,o=c,i>=n)break}let d=[];for(let c=r.length-1;c>=0;c--)d.push(...r[c]);return{rows:d,exhausted:o===0||a}}wrapOne(e,n){let s=this.lineIds.get(e);if(s!==void 0){let f=this.wrapCache.get(s);if(f)return f}let r=e.prefix??"",i=vs(r),o=Math.max(1,n-i),a=bd(e.bodyStyle),d=e.ansi?PA(e.body,o):FA(e.body,o,{stripMarkup:a}),c=[],l=0;for(let f=0;f<d.length;f++){let u=d[f]??"",p={prefix:f===0?e.prefix:" ".repeat(i),body:u};if(e.prefixStyle!==void 0&&(p.prefixStyle=e.prefixStyle),e.bodyStyle!==void 0&&(p.bodyStyle=e.bodyStyle),e.blockKey!==void 0&&(p.blockKey=e.blockKey),e.fillRow&&(p.fillRow=!0),e.ansi&&(p.ansi=!0),f===0&&e.iterm2Image&&(p.iterm2Image=e.iterm2Image),s!==void 0&&u.length>0){let m=e.body.indexOf(u,l),g=m===-1?l:m;this.wrapOrigin.set(p,{sourceLineId:s,sourceColOffset:g}),l=g+u.length}c.push(p)}return s!==void 0&&this.wrapCache.set(s,c),c}writeFormattedLine(e,n,s=null,r=0,i=null){e.prefix&&Wn(this.term,e.prefix,e.prefixStyle??e.bodyStyle);let o=Math.max(0,n-vs(e.prefix??"")),a=bd(e.bodyStyle),d=e.ansi?e.body:bt(e.body,o,{stripMarkup:a}),c=(l,f)=>{if(l.length!==0)if(this.scrollbackHighlight!==null&&!e.ansi){let u=s!==null&&s>=f?s-f:null;Fg(this.term,l,e.bodyStyle,this.scrollbackHighlight,u,r)}else Wn(this.term,l,e.bodyStyle)};if(i!==null&&!e.ansi){let l=Math.max(0,Math.min(d.length,i.start)),f=Math.max(l,Math.min(d.length,i.end));c(d.slice(0,l),0),f>l&&Wn(this.term,d.slice(l,f),"selection-highlight"),c(d.slice(f),f)}else this.scrollbackHighlight!==null&&!e.ansi?Fg(this.term,d,e.bodyStyle,this.scrollbackHighlight,s,r):Wn(this.term,d,e.bodyStyle);if(e.fillRow){let l=e.ansi?or(d):vs(d),f=o-l;if(f>0){let u=i!==null&&i.toEndOfLine?"selection-highlight":e.bodyStyle;Wn(this.term," ".repeat(f),u)}}(e.ansi||e.body.includes("^"))&&this.term.styleReset(),e.iterm2Image&&this.isIterm2()&&this.writeIterm2Image(e.iterm2Image.data,e.iterm2Image.heightCells)}};Hg=/[^\x20-\x7e]/,Kl=new Intl.Segmenter(void 0,{granularity:"grapheme"}),Ug=!1;MA=/[a-zA-Z+\-:_!#/]/;zl=ze});function HA(t,e,n=xd){if(e.kind==="cancel")return{kind:"cancel"};if(e.kind==="back")return{kind:"back"};if(e.kind==="enter"){let s=n[t];return s?{kind:"resolve",action:s.key}:{kind:"back"}}if(e.kind==="up")return{kind:"continue",selected:Math.max(0,t-1)};if(e.kind==="down")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(e.kind==="char"){let s=e.ch.toLowerCase();if(s==="n")return{kind:"continue",selected:Math.min(n.length-1,t+1)};if(s==="p")return{kind:"continue",selected:Math.max(0,t-1)};let r=n.findIndex(i=>i.hotkey.toLowerCase()===s);if(r>=0){let i=n[r];if(i)return{kind:"resolve",action:i.key}}}return{kind:"continue",selected:t}}async function Jg(t,e){Un();let n=ze(e.sessionId),s=e.importedFromMachine??"another machine",r=Ue(e.cwd),i=xd.findIndex(a=>a.key==="view");i<0&&(i=0);let o=()=>{let d=7+xd.length*2+2,c=jn(t,{contentHeight:d,title:"Imported session"}),l=c.contentW,f=[{label:"session: ",value:n},{label:"from: ",value:s},{label:"cwd: ",value:r}],u=0;for(let p of f)t.moveTo(c.contentX,c.contentY+u),t.dim.noFormat(` ${p.label}`),t.noFormat(Xe(p.value,l-p.label.length-2)),u++;return u++,zg(t,c,u,{intro:"What do you want to do?",choices:xd,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 f/v jump \xB7 Esc back"}),c};return ys({term:t,render:o,onKey:(a,d,c,l)=>{let f=UA(a,c);if(!f)return;let u=HA(i,f);if(u.kind==="cancel"){l("cancel");return}if(u.kind==="back"){l("back");return}if(u.kind==="resolve"){l(u.action);return}u.selected!==i&&(i=u.selected,o())}})}function zg(t,e,n,s){let r=e.contentW,i=n;t.moveTo(e.contentX,e.contentY+i),t.noFormat(` ${s.intro}`),i+=2;for(let o=0;o<s.choices.length;o++){let a=s.choices[o];if(!a)continue;let c=` ${o===s.selected?"\u276F":" "} ${a.label}`;t.moveTo(e.contentX,e.contentY+i),o===s.selected?t.brightWhite.bgBlue.noFormat(rd(c,r)):t.noFormat(c),i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${a.description}`),i++}i++,t.moveTo(e.contentX,e.contentY+i),t.dim.noFormat(` ${s.footer}`)}function UA(t,e){return t==="UP"?{kind:"up"}:t==="DOWN"?{kind:"down"}:t==="ENTER"||t==="KP_ENTER"?{kind:"enter"}:t==="ESCAPE"?{kind:"back"}:t==="CTRL_C"||t==="CTRL_D"?{kind:"cancel"}:e?.isCharacter?{kind:"char",ch:t}:null}async function Kg(t,e,n){let s=ze(e.sessionId),r=e.title??Ue(e.cwd),i=1,o=[{label:"Launch",hotkey:"l",description:"start a new agent session"},{label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}],a=()=>{let d=jn(t,{contentHeight:11,title:"Open session"}),c=d.contentW,l=0;t.moveTo(d.contentX,d.contentY+l),t.dim.noFormat(" session: "),t.noFormat(Xe(s,c-10)),l++,t.moveTo(d.contentX,d.contentY+l),t.noFormat(" "+Xe(r,c-2)),l++,l++,zg(t,d,l,{intro:"What do you want to do?",choices:o,selected:i,footer:"\u2191/\u2193 navigate \xB7 Enter select \xB7 l/v jump \xB7 Esc back"})};return a(),t.hideCursor(),await new Promise(d=>{let c=!1,l=()=>{c=!0},f=p=>{l(),n.pop(),d(p)},u=(p,m,g)=>{if(p==="CTRL_C"||p==="CTRL_D"){f("cancel");return}if(p==="ESCAPE"){f("back");return}if(p==="ENTER"||p==="KP_ENTER"){f(i===0?"launch":"view");return}if(p==="UP"||p==="SHIFT_TAB"){i>0&&(i--,a());return}if(p==="DOWN"||p==="TAB"){i<o.length-1&&(i++,a());return}if(g?.isCharacter){let y=p.toLowerCase();if(y==="l"){f("launch");return}if(y==="v"){f("view");return}if(y==="n"){i<o.length-1&&(i++,a());return}if(y==="p"){i>0&&(i--,a());return}}};n.push({onKey:(p,m,g)=>{c||u(p,m,g)},onResize:()=>{c||a()}})})}var xd,Gl=J(()=>{"use strict";ge();hn();ci();xd=[{key:"fork-local",label:"Fork locally",hotkey:"f",description:"spawn a local fork \u2014 original imported copy stays as-is"},{key:"view",label:"View transcript",hotkey:"v",description:"open read-only, no agent spawn"}]});function wo(t){if(t.length===0)return"";let e=t[0]??"";for(let n=1;n<t.length;n++){let s=t[n]??"",r=0;for(;r<e.length&&r<s.length&&e[r]===s[r];)r+=1;if(e=e.slice(0,r),e.length===0)break}return e}function Vg(t){let{matches:e,firstLine:n}=t;if(e.length===0)return null;let s=n.indexOf(" "),r=s===-1?n:n.slice(0,s),i=s===-1?"":n.slice(s);if(e.length===1){let a=e[0]??"",d=i.startsWith(" ")?"":" ";return a+d+i}let o=wo(e);return o.length<=r.length?null:o+i}var Ad=J(()=>{"use strict"});import*as Yg from"os";async function ar(t,e,n={}){let s=n.defaultCwd??(e?await mg(e.cwd):void 0)??Yg.homedir();Un();let r=n.title??"Fork locally \u2014 choose cwd",i=n.intro??"Pick a local cwd for this session:",o=e?[{label:"session: ",value:ze(e.sessionId)},...e.importedFromMachine?[{label:"from: ",value:e.importedFromMachine}]:[],{label:"cwd: ",value:Ue(e.cwd)}]:[],a=s,d=null,c=!1,l=null,f=()=>{let g=o.length+6;l=jn(t,{contentHeight:g,title:r});let y=l.contentW,v=0;for(let b of o)t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(` ${b.label}`),t.noFormat(Xe(b.value,y-b.label.length-2)),v++;v++,t.moveTo(l.contentX,l.contentY+v),t.noFormat(` ${i}`),v+=2,p(v),v+=2,d!==null?(t.moveTo(l.contentX,l.contentY+v),t.red.noFormat(` ${Xe(d,y-2)}`)):(t.moveTo(l.contentX,l.contentY+v),t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear"))},u=()=>o.length+3,p=g=>{if(!l)return;let y=g??u();t.moveTo(l.contentX,l.contentY+y).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+y),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+y),t.bold.noFormat(" cwd: ");let v=l.contentW-6-2;t.noFormat(jA(a,v)),c||t.bgWhite(" ")},m=()=>{if(p(),!l)return;let g=u()+2;t.moveTo(l.contentX,l.contentY+g).eraseLineAfter(),t.moveTo(l.x+l.w-1,l.contentY+g),t.dim.noFormat("\u2502"),t.moveTo(l.contentX,l.contentY+g),d!==null?t.red.noFormat(` ${Xe(d,l.contentW-2)}`):t.dim.noFormat(" Enter accept \xB7 Tab complete \xB7 Esc back \xB7 ^U clear")};return ys({term:t,render:f,hideCursor:!1,onKey:(g,y,v,b)=>{if(!c){if(g==="ENTER"||g==="KP_ENTER"){let k=a;c=!0,d=null,m(),po(k).then(R=>{if(c=!1,R.ok){b({kind:"ok",path:R.path});return}d=R.reason,m()});return}if(g==="ESCAPE"){b({kind:"back"});return}if(g==="CTRL_C"||g==="CTRL_D"){b({kind:"cancel"});return}if(g==="TAB"){c=!0,gg(a).then(k=>{if(c=!1,k.matches.length===0)return;let R;if(k.matches.length===1)R=k.prefix+k.matches[0];else{let H=wo(k.matches);if(H.length<=k.basePrefix.length)return;R=k.prefix+H}R!==a&&(a=R,d=null,m())});return}if(g==="BACKSPACE"){a.length>0&&(a=a.slice(0,-1),d=null,m());return}if(g==="CTRL_U"){a="",d=null,m();return}if(g==="CTRL_W"){let k=a.replace(/[/\s]+$/,""),R=Math.max(k.lastIndexOf("/"),k.lastIndexOf(" "));a=R>=0?k.slice(0,R+1):"",d=null,m();return}if(v?.isCharacter){a+=g,d=null,m();return}}}})}function jA(t,e){return e<=1?"":t.length<=e?t:"\u2026"+t.slice(t.length-(e-1))}var Ql=J(()=>{"use strict";ge();hn();Cl();Ad();ci()});function Zl(){return{filters:{cwdOnly:!1,hostFilter:"__local",includeNonInteractive:!1}}}async function eu(t,e){let n=()=>{process.stdout.write(er),process.stdout.write(Hn),process.stdout.write(tr),process.stdout.write(nr),process.stdout.write(ii),process.stdout.write(oi),process.stdout.write(ai),process.stdout.write(Zs),process.stdout.write("\x1B>")};n();let s=e.prefs??Zl();e.prefs===void 0&&e.currentSessionId!==void 0&&e.sessions.find(E=>E.sessionId===e.currentSessionId)?.importedFromMachine&&(s.filters.hostFilter="__all");let r=e.cwd,i=Rd(e.sessions,r),o=C=>{let E=C;return s.filters.cwdOnly&&(E=E.filter($=>$.cwd===r)),s.filters.includeNonInteractive||(E=E.filter($=>$.interactive===!0)),E=KA(E,s.filters.hostFilter),E},a=o(i),d={columns:e.config.tui.sessionColumns??Gr,cwdMaxWidth:e.config.tui.cwdColumnMaxWidth},c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,u=0,p=0;if(e.currentSessionId!==void 0){let C=a.findIndex(E=>E.sessionId===e.currentSessionId);C>=0&&(u=C+1)}let m=!1,g="",y=120,v=!1,b=0,k="normal",R=null,H=!1,q="input",K=new qn({history:[],collapsePastes:!1}),z=[],W=!1,O=0,U=0,V=null,se=!1,Z="",ne=null,Q=!1,ue=new qn({history:[]});e.initialPrompt&&ue.setBuffer(e.initialPrompt);let Je=e.config.tui.promptHistoryMaxEntries;Hi(M.globalTuiHistoryFile()).then(C=>{let E=C.length>Je?C.slice(C.length-Je):C;ue.setHistory(E)}).catch(()=>{});let j=new pi(t),de=sr(t),_e=Xt(t),$e=0,kn="",ks=0,Ot=[],nt=1,zn=0,Kn=0,xn=0,dr="",mi=[],be=1,gi=0,yi=[],at=1,An=0,xs=0,wi=0,cr=()=>{de=sr(t),_e=Xt(t);let C=Math.max(10,_e-Xl);ks=Math.max(10,_e-Gg);let E=Math.max(10,_e-8);kn=zA(r,E);let $=ue.state();Ot=Jn($.buffer,ks);let X=Is(Ot,$,Cd);nt=X.rendered,zn=X.windowStart,Kn=X.cursorVisualRow,xn=X.cursorVisualCol;let ie=6+nt,He=Math.max(3,de-ie);$e=Math.min(a.length,He),dr=hs(Qr,l,C,d).padEnd(C),mi=c.map(Ae=>hs(Ae,l,C,d).padEnd(C))},vo=()=>{c=a.map(C=>Xr(C,Date.now())),l=Zr(c,d),f=1+a.length,cr()},ve=()=>{let C=o(i);m&&g.length>0?a=C.filter(E=>YA(E,g)):a=C,vo(),m?(p=0,u=a.length>0?1:0):u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke()},At=C=>{if(C!==void 0){let E=a.findIndex($=>$.sessionId===C);if(E>=0){u=E+1,Ke();return}}u=a.length>0?1:0,p=0,Ke()},Ke=()=>{if(u===0)return;let C=u-1;C<p?p=C:C>=p+$e?p=C-$e+1:p+$e>a.length&&(p=Math.max(0,a.length-$e))},Zt=()=>Math.max(2,_e-2),Vn=()=>{let C=Zt(),E=`\u2500 ${kn} `,$=Math.max(1,C-E.length),X="\u2500".repeat($);u===0?t.brightBlue.noFormat(`\u256D${E}${X}\u256E`):t.dim.noFormat(`\u256D${E}${X}\u256E`)},lr=()=>{let C=Zt(),E="\u2500".repeat(C);u===0?t.brightBlue.noFormat(`\u2570${E}\u256F`):t.dim.noFormat(`\u2570${E}\u256F`)},As=C=>{let E=Ot[C];return E?(ue.state().buffer[E.bufferIdx]??"").slice(E.startCol,E.endCol):""},Cs=C=>{let E=Zt(),$=As(C),X=Math.max(0,E-1-$.length),ie=" ".repeat(X);u===0?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${$}${ie}`),t.dim.noFormat("\u2502"))},Yn=C=>{let E=mi[C]??"",$=a[C],X=$&&$.priority&&$.priority>0?"* ":" ";u===C+1?t.brightWhite.bgBlue.noFormat(`${X}${E}`):t.noFormat(`${X}${E}`)},ur=()=>{let C=p,E=Math.max(0,a.length-p-$e),$=[];return s.filters.cwdOnly&&$.push("cwd-only"),s.filters.hostFilter!=="__all"&&$.push(s.filters.hostFilter==="__local"?"host: local":`host: ${s.filters.hostFilter}`),s.filters.includeNonInteractive&&$.push("+non-interactive"),C>0&&$.push(`\u2191 ${C} above`),E>0&&$.push(`\u2193 ${E} below`),$.length===0?"":` ${$.join(" \xB7 ")}`},en=C=>ze(C),bi=()=>{let C=R?`${R.sessionId}|${R.status}`:"";return["ind",k,C,Z,ne??"",m?`1|${g}|${a.length}`:"0",ur()].join("")},Ie=()=>{Le(()=>{j.paintRow(Wt(),bi(),()=>{if(k==="confirm-kill"&&R)t.brightYellow.noFormat(` kill ${en(R.sessionId)}? [y/N]`);else if(k==="confirm-delete"&&R)R.status==="live"?t.brightRed.noFormat(` kill + delete ${en(R.sessionId)}? [y/N]`):t.brightRed.noFormat(` delete ${en(R.sessionId)}? [y/N]`);else if(k==="busy"&&R)t.dim.noFormat(` working on ${en(R.sessionId)}\u2026`);else if(k==="rename"&&R)t.brightYellow.noFormat(` title: ${Z}`),t.bgBrightYellow(" "),t.dim.noFormat(" Enter saves \xB7 Esc cancels");else if(ne!==null)t.dim.noFormat(` ${ne}`);else if(m){t.brightYellow.noFormat(` /${g}`),t.bgBrightYellow(" ");let C=a.length===0?" no matches":` ${a.length} match${a.length===1?"":"es"}`;t.dim.noFormat(`${C} \xB7 ^c clears`)}else t.dim.noFormat(ur())})})},tn=C=>be+1+C,fr=()=>be+nt+1,Ve=()=>be+nt+3,Ft=C=>Ve()+1+(C-p),Wt=()=>Ve()+1+$e,he=()=>{let C=Kn-zn;if(C<0||C>=nt)return;let E=3+xn;t.moveTo(E,tn(C))},vi=()=>`ct|${u===0?"f":"u"}|${Zt()}|${kn}`,Gn=()=>`cb|${u===0?"f":"u"}|${Zt()}`,ft=C=>`cbb|${u===0?"f":"u"}|${Zt()}|${As(C)}`,Rs=()=>`h|${dr}`,Cn=C=>{let E=a[C],$=E&&E.priority&&E.priority>0?"* ":" ",X=mi[C]??"";return`sr|${u===C+1?"1":"0"}|${$}${X}`},I=()=>{Le(()=>{t.hideCursor(),cr(),Ke(),be=1,j.ensureSize(_e,de),j.paintRow(be,vi(),()=>{Vn()});for(let C=0;C<nt;C++){let E=zn+C;j.paintRow(tn(C),ft(E),()=>{Cs(E)})}j.paintRow(fr(),Gn(),()=>{lr()}),j.paintRow(fr()+1,"blank",()=>{}),j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=p+C,$=Ve()+1+C;E<a.length?j.paintRow($,Cn(E),()=>{Yn(E)}):j.paintRow($,"blank",()=>{})}Ie();for(let C=Wt()+1;C<=de;C++)j.paintRow(C,"blank",()=>{});u===0&&(he(),t.hideCursor(!1))})},Ii=()=>{j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),I()},Io=()=>{Le(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(" Picker hotkeys")(`
136
136
 
137
137
  `);for(let C of JA){if(C===null){t(`
138
138
  `);continue}let[E,$]=C;t.brightCyan.noFormat(` ${E.padEnd(WA)}`),t.noFormat($)(`
139
139
  `)}t(`
140
140
  `),t.dim.noFormat(" press any key to dismiss")(`
141
- `)})},vt=()=>at+4,pr=2,Fe=0,nn=()=>{ue=sr(t);let C=Math.max(2,ue-(at+3)-pr);return Math.max(1,Math.floor(C/2))},So=()=>{let C=nn();F<Fe?Fe=F:F>=Fe+C&&(Fe=F-C+1),Fe+C>J.length&&(Fe=Math.max(0,J.length-C)),Fe<0&&(Fe=0)},ko=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500 Find sessions ",X="\u2500".repeat(Math.max(1,E-$.length));C?t.brightBlue.noFormat(`\u256D${$}${X}\u256E`):t.dim.noFormat(`\u256D${$}${X}\u256E`),t.styleReset()},Qn=()=>{_e=Xt(t),gi=Math.max(10,_e-Gg);let C=K.state();yi=Jn(C.buffer,gi);let E=Is(yi,C,qA);at=E.rendered,An=E.windowStart,xs=E.cursorVisualRow,wi=E.cursorVisualCol},sn=(C,E)=>{_e=Xt(t);let $=Math.max(2,_e-2),X=yi[C],ie="";X&&(ie=(K.state().buffer[X.bufferIdx]??"").slice(X.startCol,X.endCol));let Ue=Math.max(0,$-1-ie.length),xe=" ".repeat(Ue);E?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${ie}${xe}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${ie}${xe}`),t.dim.noFormat("\u2502")),t.styleReset()},Si=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500".repeat(E);C?t.brightBlue.noFormat(`\u2570${$}\u256F`):t.dim.noFormat(`\u2570${$}\u256F`),t.styleReset()},Ts=()=>3+wi,Es=()=>2+(xs-An),ki=()=>{let C=z==="input";Be(()=>{C&&t.hideCursor(),t.moveTo(1,1),ko(C);for(let E=0;E<at;E++)t.moveTo(1,2+E),sn(An+E,C);t.moveTo(1,2+at),Si(C),C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},xo=()=>{Be(()=>{t.hideCursor();for(let C=0;C<at;C++)t.moveTo(1,2+C),sn(An+C,!0);t.moveTo(Ts(),Es()),t.hideCursor(!1)})},Ed={user:"user",agent:"agent",thought:"thought",tool:"tool","tool-input":"tool-input"},Ao=(C,E)=>{let $=J[C];if(!$)return{rowBudget:20,line1:"",line2:"",focusedRow:!1};let X=Xt(t),ie=Math.max(20,X-Xl),Ue=ze($.sessionId),xe=$.title??je($.cwd),Rt=E&&$.snippets.length>1?` [${U+1}/${$.snippets.length}]`:E&&$.totalMatches>$.snippets.length?` [${$.snippets.length} of ${$.totalMatches}]`:"",St=`${Ue} ${$.status==="live"?"live":"cold"}`,pt=Math.max(5,ie-St.length-Rt.length-2),Tt=no(xe,pt),dn=`${St} ${Tt}${Rt}`.padEnd(ie),rt=$.snippets[E?U:0],ht=rt?Ed[rt.kind]??rt.kind:"",Ye=rt?.toolName?`${ht} \xB7 ${rt.toolName}`:ht,Ps=Math.max(10,ie-Ye.length-6),Ms=rt?no(rt.text,Ps):"",En=rt?` ${Ye} ${Ms}`:" (no snippet)";return{rowBudget:ie,line1:dn,line2:En.padEnd(ie+Xl),focusedRow:E}},It=(C,E)=>{let{line1:$,focusedRow:X}=Ao(C,E);X?t.brightWhite.bgBlue.noFormat(`\u276F ${$}`):t.noFormat(` ${$}`),t.styleReset()},st=(C,E)=>{let{line2:$}=Ao(C,E);t.dim.noFormat($),t.styleReset()},hr=()=>{if(te)t.dim.noFormat(" searching\u2026"),t.styleReset(),t.eraseLineAfter();else if(Y!==null)t.brightRed.noFormat(` ${Y}`),t.styleReset(),t.eraseLineAfter();else if(z==="input")J.length>0?t.dim.noFormat(" Enter to search \xB7 \u2193 browse results \xB7 Esc cancel"):t.dim.noFormat(" Enter to search \xB7 Esc cancel"),t.styleReset(),t.eraseLineAfter();else{let C=J.length,E=W?" \xB7 truncated":"",$=C>0?` ${C} ${C===1?"session":"sessions"} match${E} \xB7 `:" ";t.dim.noFormat(`${$}\u2191 edit query \xB7 Up/Down sessions \xB7 n/p snippets \xB7 Enter open \xB7 Esc back`),t.styleReset(),t.eraseLineAfter()}},rn=()=>{Qn();let C=z==="input",E=K.state().buffer.join(`
142
- `);Be(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),ko(C);for(let X=0;X<at;X++)t.moveTo(1,2+X),sn(An+X,C);t.moveTo(1,2+at),Si(C);let $=J.length;if($===0)t.moveTo(1,vt()),te||(Y===null&&E.trim().length===0?(t.dim.noFormat(" type a query in the box above, then press Enter"),t.eraseLineAfter()):Y===null&&(t.dim.noFormat(" no matches"),t.eraseLineAfter())),t.moveTo(1,vt()+1),hr();else{So();let X=nn(),ie=z!=="input";for(let Ue=0;Ue<X;Ue++){let xe=Fe+Ue;t.moveTo(1,vt()+Ue*2),xe<$?It(xe,ie&&xe===F):t.eraseLineAfter(),t.moveTo(1,vt()+Ue*2+1),xe<$?st(xe,ie&&xe===F):t.eraseLineAfter()}t.moveTo(1,vt()+X*2),hr()}C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},on=(C,E)=>{let $=C-Fe;$<0||$>=nn()||Be(()=>{t.moveTo(1,vt()+$*2),It(C,E),t.moveTo(1,vt()+$*2+1),st(C,E)})},an=()=>{Be(()=>{t.moveTo(1,vt()+nn()*2),hr()})},mr=()=>{Be(()=>{let C=nn(),E=J.length,$=z!=="input";for(let X=0;X<C;X++){let ie=Fe+X;t.moveTo(1,vt()+X*2),ie<E?It(ie,$&&ie===F):t.eraseLineAfter(),t.moveTo(1,vt()+X*2+1),ie<E?st(ie,$&&ie===F):t.eraseLineAfter()}t.moveTo(1,vt()+C*2),hr()})},Co=()=>K.state().buffer.join(`
143
- `),Pd=C=>{let E=at;K.feed({type:"paste",text:C}),Qn(),at!==E?rn():xo()},Md=async()=>{let C=Co().trim();if(C.length!==0){if(a.length===0){Y="no sessions in view to search",rn();return}te=!0,Y=null,rn();try{let E=await Ih(e.target,C,{sessionIds:a.map($=>$.sessionId)});J=E.results,W=E.truncated,F=0,U=0,Fe=0,z=E.results.length>0?"results":"input",Qn()}catch(E){Y=`search failed: ${E.message}`}finally{te=!1,rn()}}},Rn=()=>{},Jt=()=>{Be(()=>{let C=u===0;C&&t.hideCursor(),j.paintRow(be,vi(),()=>{Vn()}),j.paintRow(fr(),Gn(),()=>{lr()});for(let E=0;E<nt;E++){let $=zn+E;j.paintRow(tn(E),ft($),()=>{Cs($)})}C&&(he(),t.hideCursor(!1))})},xi=()=>{Be(()=>{let C=oe.state();Ot=Jn(C.buffer,ks);let E=Is(Ot,C,Cd);zn=E.windowStart,Kn=E.cursorVisualRow,xn=E.cursorVisualCol;let $=u===0;$&&t.hideCursor();for(let X=0;X<nt;X++){let ie=zn+X;j.paintRow(tn(X),ft(ie),()=>{Cs(ie)})}$&&(he(),t.hideCursor(!1))})},Ro=C=>{C<p||C>=p+$e||Be(()=>{j.paintRow(Ft(C),Cn(C),()=>{Yn(C)})})},To=()=>{Be(()=>{for(let C=0;C<$e;C++){let E=Ve()+1+C,$=p+C;$<a.length?j.paintRow(E,Cn($),()=>{Yn($)}):j.paintRow(E,"blank",()=>{})}Ie()})},Ai=()=>{Be(()=>{j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=Ve()+1+C,$=p+C;$<a.length?j.paintRow(E,Cn($),()=>{Yn($)}):j.paintRow(E,"blank",()=>{})}Ie(),u===0&&(he(),t.hideCursor(!1))})},Xn=!1,Tn="",Ct=null,Ci=null,gr=C=>{let E=C.toString("binary");if(!Xn&&E===""&&Ci){Ci();return}if(Xn){let X=E.indexOf(io);if(X===-1){Tn+=E;return}Tn+=E.slice(0,X),Xn=!1;let ie=Buffer.from(Tn,"binary").toString("utf-8").replace(/\r\n?/g,`
144
- `);Tn="";let Ue=E.slice(X+io.length);if(H)z==="input"&&!te&&Pd(ie);else if(u===0&&!m){oe.feed({type:"paste",text:ie});let xe=oe.state(),Rt=Jn(xe.buffer,ks);Is(Rt,xe,Cd).rendered!==nt?I():xi()}Ue.length>0&&Ct&&Ct(Buffer.from(Ue,"binary"));return}let $=E.indexOf(ri);if($===-1){Ct?.(C);return}$>0&&Ct?.(Buffer.from(E.slice(0,$),"binary")),E=E.slice($+ri.length),Xn=!0,E.length>0&&gr(Buffer.from(E,"binary"))};return I(),await new Promise(C=>{let E=!1,$=null,X=!1,ie=null,Ue=!1,xe=[],Rt=T=>{xe.push(T)},St=()=>{xe.pop(),E||xe[xe.length-1]?.onResize()},pt={push:Rt,pop:St},Tt=()=>({kind:"new",cwd:r}),dn=async()=>{Os(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),Rt({onKey:()=>{},onResize:()=>{}});let B;try{B=await ar(t,void 0,{defaultCwd:r,title:"Change cwd",intro:"New cwd for the picker and any new sessions:"})}finally{St(),On()}B.kind==="ok"&&B.path!==r&&(r=B.path,i=Rd(i,r),ve()),E||I()};Rn=()=>{K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Fe=0,Y=null,te=!1,z="input",H=!1,St()};let rt=(T,B,ae)=>{Ms(),xe[xe.length-1]?.onKey(T,B,ae)},ht=()=>{E||xe[xe.length-1]?.onResize()},Ye=()=>{if(E)return;E=!0,xe.length=0,$&&(clearInterval($),$=null),ie&&(ie.abort(),ie=null,X=!1),t.off("key",rt),t.off("resize",ht),process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.grabInput(!1),t.hideCursor(!1),t.moveTo(1,Wt()+1),t(`
145
- `)},Ps=()=>{if(E||xe.length>1||k!=="normal"||m||Ue)return;X&&ie&&(ie.abort(),ie=null,X=!1);let T=u>0?a[u-1]?.sessionId:void 0;X=!0;let B=new AbortController;ie=B,Zn(T,{silent:!0,signal:B.signal}).finally(()=>{ie===B&&(ie=null),X=!1})},Ms=()=>{E||($&&clearInterval($),$=setInterval(Ps,3e3))},En=()=>(Ye(),C({kind:Q?"exit":"abort"}),!0),Eo=()=>{let T=c.map(B=>`${B.session}|${B.upstream}|${B.host}|${B.state}|${B.agent}|${B.model}|${B.age}|${B.title}|${B.cwd}|${B.cost}`).join(`
146
- `);return`${u}:${p}:${ee??""}
147
- ${T}`},Zn=async(T,B={})=>{try{let ae=B.silent?Eo():"",O=f,ne=await bn(e.target,{includeNonInteractive:!0,signal:B.signal}),ce=T??(u>0?a[u-1]?.sessionId:void 0);if(i=Rd(ne,r),ve(),ce!==void 0){let Te=a.findIndex(Ne=>Ne.sessionId===ce);Te>=0?u=Te+1:u=0}if(u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke(),B.silent&&Eo()===ae)return;f===O?Ai():I()}catch(ae){if(B.silent)return;ee=`refresh failed: ${ae.message}`,I()}},Ri=async T=>{if(!R)return;let B=R;k="busy",Ie();try{await wh(e.target,B.sessionId,T),k="normal",R=null,Z="",await Zn(B.sessionId)}catch(ae){k="normal",R=null,Z="",ee=`rename failed: ${ae.message}`,Ie()}},et=async T=>{try{await vh(e.target,T.sessionId),ee="title regen queued (press r to refresh)",Ie()}catch(B){ee=`regen failed: ${B.message}`,Ie()}},Pn=async T=>{let ae=(T.priority&&T.priority>0?T.priority:0)>0?null:1,O=ae??0;for(let ce of i)ce.sessionId===T.sessionId&&(ce.priority=O>0?O:void 0);let ne=T.sessionId;i=Rd(i,r),ve(),At(ne),I(),ee=O>0?"priority: high":"priority: normal",Ie();try{await bh(e.target,T.sessionId,ae)}catch(ce){ee=`priority failed: ${ce.message}`,Ie()}},Mn=async()=>{if(Ue)return;Ue=!0;let T=u>0?a[u-1]?.sessionId:void 0;ee="syncing agents\u2026",Ie();try{let{synced:B,skipped:ae,agents:O}=await yh(e.target);await Zn(T),ee=`synced ${B} new (${ae} known) from ${O} agent${O===1?"":"s"}`,Ie()}catch(B){ee=`sync failed: ${B.message}`,Ie()}finally{Ue=!1}},es=async T=>{if(!R)return;let B=R;k="busy",Ie();try{T==="kill"?await vn(e.target,B.sessionId):await Sh(e.target,B.sessionId),k="normal",R=null,B.sessionId===e.currentSessionId&&(Q=!0);let ae;if(T==="kill")ae=B.sessionId;else{let O=a.findIndex(ne=>ne.sessionId===B.sessionId);O>=0&&(ae=a[O+1]?.sessionId??a[O-1]?.sessionId)}await Zn(ae)}catch(ae){k="normal",R=null,ee=`${T} failed: ${ae.message}`,Ie()}},_n=(T,B)=>{T===0!=(B===0)&&(Jt(),B===0?(t.hideCursor(!1),he()):t.hideCursor())},it=T=>{let B=Math.min(f-1,Math.max(0,u+T));if(B===u)return;let ae=u;u=B,Ke(),Be(()=>{To(),_n(ae,u)})},zt=()=>ee===null?!1:(ee=null,Ie(),!0),$n=()=>{Io(),Rt({onKey:T=>{if(T==="CTRL_C"){Ye(),C({kind:"abort"});return}St()},onResize:()=>Io()})},_s=T=>{let B=null,ae=null,O=!0,ne=()=>{Be(()=>{if(t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(` Session info \u2014 ${ze(T.sessionId)}`)(`
141
+ `)})},vt=()=>at+4,pr=2,Oe=0,nn=()=>{de=sr(t);let C=Math.max(2,de-(at+3)-pr);return Math.max(1,Math.floor(C/2))},So=()=>{let C=nn();O<Oe?Oe=O:O>=Oe+C&&(Oe=O-C+1),Oe+C>z.length&&(Oe=Math.max(0,z.length-C)),Oe<0&&(Oe=0)},ko=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500 Find sessions ",X="\u2500".repeat(Math.max(1,E-$.length));C?t.brightBlue.noFormat(`\u256D${$}${X}\u256E`):t.dim.noFormat(`\u256D${$}${X}\u256E`),t.styleReset()},Qn=()=>{_e=Xt(t),gi=Math.max(10,_e-Gg);let C=K.state();yi=Jn(C.buffer,gi);let E=Is(yi,C,qA);at=E.rendered,An=E.windowStart,xs=E.cursorVisualRow,wi=E.cursorVisualCol},sn=(C,E)=>{_e=Xt(t);let $=Math.max(2,_e-2),X=yi[C],ie="";X&&(ie=(K.state().buffer[X.bufferIdx]??"").slice(X.startCol,X.endCol));let He=Math.max(0,$-1-ie.length),Ae=" ".repeat(He);E?(t.brightBlue.noFormat("\u2502"),t.noFormat(` ${ie}${Ae}`),t.brightBlue.noFormat("\u2502")):(t.dim.noFormat("\u2502"),t.noFormat(` ${ie}${Ae}`),t.dim.noFormat("\u2502")),t.styleReset()},Si=C=>{_e=Xt(t);let E=Math.max(2,_e-2),$="\u2500".repeat(E);C?t.brightBlue.noFormat(`\u2570${$}\u256F`):t.dim.noFormat(`\u2570${$}\u256F`),t.styleReset()},Ts=()=>3+wi,Es=()=>2+(xs-An),ki=()=>{let C=q==="input";Le(()=>{C&&t.hideCursor(),t.moveTo(1,1),ko(C);for(let E=0;E<at;E++)t.moveTo(1,2+E),sn(An+E,C);t.moveTo(1,2+at),Si(C),C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},xo=()=>{Le(()=>{t.hideCursor();for(let C=0;C<at;C++)t.moveTo(1,2+C),sn(An+C,!0);t.moveTo(Ts(),Es()),t.hideCursor(!1)})},Ed={user:"user",agent:"agent",thought:"thought",tool:"tool","tool-input":"tool-input"},Ao=(C,E)=>{let $=z[C];if(!$)return{rowBudget:20,line1:"",line2:"",focusedRow:!1};let X=Xt(t),ie=Math.max(20,X-Xl),He=ze($.sessionId),Ae=$.title??Ue($.cwd),Rt=E&&$.snippets.length>1?` [${U+1}/${$.snippets.length}]`:E&&$.totalMatches>$.snippets.length?` [${$.snippets.length} of ${$.totalMatches}]`:"",St=`${He} ${$.status==="live"?"live":"cold"}`,pt=Math.max(5,ie-St.length-Rt.length-2),Tt=no(Ae,pt),dn=`${St} ${Tt}${Rt}`.padEnd(ie),rt=$.snippets[E?U:0],ht=rt?Ed[rt.kind]??rt.kind:"",Ye=rt?.toolName?`${ht} \xB7 ${rt.toolName}`:ht,Ps=Math.max(10,ie-Ye.length-6),Ms=rt?no(rt.text,Ps):"",En=rt?` ${Ye} ${Ms}`:" (no snippet)";return{rowBudget:ie,line1:dn,line2:En.padEnd(ie+Xl),focusedRow:E}},It=(C,E)=>{let{line1:$,focusedRow:X}=Ao(C,E);X?t.brightWhite.bgBlue.noFormat(`\u276F ${$}`):t.noFormat(` ${$}`),t.styleReset()},st=(C,E)=>{let{line2:$}=Ao(C,E);t.dim.noFormat($),t.styleReset()},hr=()=>{if(se)t.dim.noFormat(" searching\u2026"),t.styleReset(),t.eraseLineAfter();else if(V!==null)t.brightRed.noFormat(` ${V}`),t.styleReset(),t.eraseLineAfter();else if(q==="input")z.length>0?t.dim.noFormat(" Enter to search \xB7 \u2193 browse results \xB7 Esc cancel"):t.dim.noFormat(" Enter to search \xB7 Esc cancel"),t.styleReset(),t.eraseLineAfter();else{let C=z.length,E=W?" \xB7 truncated":"",$=C>0?` ${C} ${C===1?"session":"sessions"} match${E} \xB7 `:" ";t.dim.noFormat(`${$}\u2191 edit query \xB7 Up/Down sessions \xB7 n/p snippets \xB7 Enter open \xB7 Esc back`),t.styleReset(),t.eraseLineAfter()}},rn=()=>{Qn();let C=q==="input",E=K.state().buffer.join(`
142
+ `);Le(()=>{t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),ko(C);for(let X=0;X<at;X++)t.moveTo(1,2+X),sn(An+X,C);t.moveTo(1,2+at),Si(C);let $=z.length;if($===0)t.moveTo(1,vt()),se||(V===null&&E.trim().length===0?(t.dim.noFormat(" type a query in the box above, then press Enter"),t.eraseLineAfter()):V===null&&(t.dim.noFormat(" no matches"),t.eraseLineAfter())),t.moveTo(1,vt()+1),hr();else{So();let X=nn(),ie=q!=="input";for(let He=0;He<X;He++){let Ae=Oe+He;t.moveTo(1,vt()+He*2),Ae<$?It(Ae,ie&&Ae===O):t.eraseLineAfter(),t.moveTo(1,vt()+He*2+1),Ae<$?st(Ae,ie&&Ae===O):t.eraseLineAfter()}t.moveTo(1,vt()+X*2),hr()}C&&(t.moveTo(Ts(),Es()),t.hideCursor(!1))})},on=(C,E)=>{let $=C-Oe;$<0||$>=nn()||Le(()=>{t.moveTo(1,vt()+$*2),It(C,E),t.moveTo(1,vt()+$*2+1),st(C,E)})},an=()=>{Le(()=>{t.moveTo(1,vt()+nn()*2),hr()})},mr=()=>{Le(()=>{let C=nn(),E=z.length,$=q!=="input";for(let X=0;X<C;X++){let ie=Oe+X;t.moveTo(1,vt()+X*2),ie<E?It(ie,$&&ie===O):t.eraseLineAfter(),t.moveTo(1,vt()+X*2+1),ie<E?st(ie,$&&ie===O):t.eraseLineAfter()}t.moveTo(1,vt()+C*2),hr()})},Co=()=>K.state().buffer.join(`
143
+ `),Pd=C=>{let E=at;K.feed({type:"paste",text:C}),Qn(),at!==E?rn():xo()},Md=async()=>{let C=Co().trim();if(C.length!==0){if(a.length===0){V="no sessions in view to search",rn();return}se=!0,V=null,rn();try{let E=await Ih(e.target,C,{sessionIds:a.map($=>$.sessionId)});z=E.results,W=E.truncated,O=0,U=0,Oe=0,q=E.results.length>0?"results":"input",Qn()}catch(E){V=`search failed: ${E.message}`}finally{se=!1,rn()}}},Rn=()=>{},Jt=()=>{Le(()=>{let C=u===0;C&&t.hideCursor(),j.paintRow(be,vi(),()=>{Vn()}),j.paintRow(fr(),Gn(),()=>{lr()});for(let E=0;E<nt;E++){let $=zn+E;j.paintRow(tn(E),ft($),()=>{Cs($)})}C&&(he(),t.hideCursor(!1))})},xi=()=>{Le(()=>{let C=ue.state();Ot=Jn(C.buffer,ks);let E=Is(Ot,C,Cd);zn=E.windowStart,Kn=E.cursorVisualRow,xn=E.cursorVisualCol;let $=u===0;$&&t.hideCursor();for(let X=0;X<nt;X++){let ie=zn+X;j.paintRow(tn(X),ft(ie),()=>{Cs(ie)})}$&&(he(),t.hideCursor(!1))})},Ro=C=>{C<p||C>=p+$e||Le(()=>{j.paintRow(Ft(C),Cn(C),()=>{Yn(C)})})},To=()=>{Le(()=>{for(let C=0;C<$e;C++){let E=Ve()+1+C,$=p+C;$<a.length?j.paintRow(E,Cn($),()=>{Yn($)}):j.paintRow(E,"blank",()=>{})}Ie()})},Ai=()=>{Le(()=>{j.paintRow(Ve(),Rs(),()=>{t.dim.noFormat(` ${dr}`)});for(let C=0;C<$e;C++){let E=Ve()+1+C,$=p+C;$<a.length?j.paintRow(E,Cn($),()=>{Yn($)}):j.paintRow(E,"blank",()=>{})}Ie(),u===0&&(he(),t.hideCursor(!1))})},Xn=!1,Tn="",Ct=null,Ci=null,gr=C=>{let E=C.toString("binary");if(!Xn&&E===""&&Ci){Ci();return}if(Xn){let X=E.indexOf(io);if(X===-1){Tn+=E;return}Tn+=E.slice(0,X),Xn=!1;let ie=Buffer.from(Tn,"binary").toString("utf-8").replace(/\r\n?/g,`
144
+ `);Tn="";let He=E.slice(X+io.length);if(H)q==="input"&&!se&&Pd(ie);else if(u===0&&!m){ue.feed({type:"paste",text:ie});let Ae=ue.state(),Rt=Jn(Ae.buffer,ks);Is(Rt,Ae,Cd).rendered!==nt?I():xi()}He.length>0&&Ct&&Ct(Buffer.from(He,"binary"));return}let $=E.indexOf(ri);if($===-1){Ct?.(C);return}$>0&&Ct?.(Buffer.from(E.slice(0,$),"binary")),E=E.slice($+ri.length),Xn=!0,E.length>0&&gr(Buffer.from(E,"binary"))};return I(),await new Promise(C=>{let E=!1,$=null,X=!1,ie=null,He=!1,Ae=[],Rt=T=>{Ae.push(T)},St=()=>{Ae.pop(),E||Ae[Ae.length-1]?.onResize()},pt={push:Rt,pop:St},Tt=()=>({kind:"new",cwd:r}),dn=async()=>{Os(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),Rt({onKey:()=>{},onResize:()=>{}});let B;try{B=await ar(t,void 0,{defaultCwd:r,title:"Change cwd",intro:"New cwd for the picker and any new sessions:"})}finally{St(),On()}B.kind==="ok"&&B.path!==r&&(r=B.path,i=Rd(i,r),ve()),E||I()};Rn=()=>{K=new qn({history:[],collapsePastes:!1}),z=[],W=!1,O=0,U=0,Oe=0,V=null,se=!1,q="input",H=!1,St()};let rt=(T,B,oe)=>{Ms(),Ae[Ae.length-1]?.onKey(T,B,oe)},ht=()=>{E||Ae[Ae.length-1]?.onResize()},Ye=()=>{if(E)return;E=!0,Ae.length=0,$&&(clearInterval($),$=null),ie&&(ie.abort(),ie=null,X=!1),t.off("key",rt),t.off("resize",ht),process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.grabInput(!1),t.hideCursor(!1),t.moveTo(1,Wt()+1),t(`
145
+ `)},Ps=()=>{if(E||Ae.length>1||k!=="normal"||m||He)return;X&&ie&&(ie.abort(),ie=null,X=!1);let T=u>0?a[u-1]?.sessionId:void 0;X=!0;let B=new AbortController;ie=B,Zn(T,{silent:!0,signal:B.signal}).finally(()=>{ie===B&&(ie=null),X=!1})},Ms=()=>{E||($&&clearInterval($),$=setInterval(Ps,3e3))},En=()=>(Ye(),C({kind:Q?"exit":"abort"}),!0),Eo=()=>{let T=c.map(B=>`${B.session}|${B.upstream}|${B.host}|${B.state}|${B.agent}|${B.model}|${B.age}|${B.title}|${B.cwd}|${B.cost}`).join(`
146
+ `);return`${u}:${p}:${ne??""}
147
+ ${T}`},Zn=async(T,B={})=>{try{let oe=B.silent?Eo():"",F=f,ee=await bn(e.target,{includeNonInteractive:!0,signal:B.signal}),ce=T??(u>0?a[u-1]?.sessionId:void 0);if(i=Rd(ee,r),ve(),ce!==void 0){let Te=a.findIndex(Be=>Be.sessionId===ce);Te>=0?u=Te+1:u=0}if(u>f-1&&(u=Math.max(0,f-1)),p+$e>a.length&&(p=Math.max(0,a.length-$e)),Ke(),B.silent&&Eo()===oe)return;f===F?Ai():I()}catch(oe){if(B.silent)return;ne=`refresh failed: ${oe.message}`,I()}},Ri=async T=>{if(!R)return;let B=R;k="busy",Ie();try{await wh(e.target,B.sessionId,T),k="normal",R=null,Z="",await Zn(B.sessionId)}catch(oe){k="normal",R=null,Z="",ne=`rename failed: ${oe.message}`,Ie()}},et=async T=>{try{await vh(e.target,T.sessionId),ne="title regen queued (press r to refresh)",Ie()}catch(B){ne=`regen failed: ${B.message}`,Ie()}},Pn=async T=>{let oe=(T.priority&&T.priority>0?T.priority:0)>0?null:1,F=oe??0;for(let ce of i)ce.sessionId===T.sessionId&&(ce.priority=F>0?F:void 0);let ee=T.sessionId;i=Rd(i,r),ve(),At(ee),I(),ne=F>0?"priority: high":"priority: normal",Ie();try{await bh(e.target,T.sessionId,oe)}catch(ce){ne=`priority failed: ${ce.message}`,Ie()}},Mn=async()=>{if(He)return;He=!0;let T=u>0?a[u-1]?.sessionId:void 0;ne="syncing agents\u2026",Ie();try{let{synced:B,skipped:oe,agents:F}=await yh(e.target);await Zn(T),ne=`synced ${B} new (${oe} known) from ${F} agent${F===1?"":"s"}`,Ie()}catch(B){ne=`sync failed: ${B.message}`,Ie()}finally{He=!1}},es=async T=>{if(!R)return;let B=R;k="busy",Ie();try{T==="kill"?await vn(e.target,B.sessionId):await Sh(e.target,B.sessionId),k="normal",R=null,B.sessionId===e.currentSessionId&&(Q=!0);let oe;if(T==="kill")oe=B.sessionId;else{let F=a.findIndex(ee=>ee.sessionId===B.sessionId);F>=0&&(oe=a[F+1]?.sessionId??a[F-1]?.sessionId)}await Zn(oe)}catch(oe){k="normal",R=null,ne=`${T} failed: ${oe.message}`,Ie()}},_n=(T,B)=>{T===0!=(B===0)&&(Jt(),B===0?(t.hideCursor(!1),he()):t.hideCursor())},it=T=>{let B=Math.min(f-1,Math.max(0,u+T));if(B===u)return;let oe=u;u=B,Ke(),Le(()=>{To(),_n(oe,u)})},zt=()=>ne===null?!1:(ne=null,Ie(),!0),$n=()=>{Io(),Rt({onKey:T=>{if(T==="CTRL_C"){Ye(),C({kind:"abort"});return}St()},onResize:()=>Io()})},_s=T=>{let B=null,oe=null,F=!0,ee=()=>{Le(()=>{if(t.hideCursor(),j.clearCache(),t.moveTo(1,1).eraseDisplayBelow(),t.brightWhite.bold.noFormat(` Session info \u2014 ${ze(T.sessionId)}`)(`
148
148
 
149
- `),O)t.dim.noFormat(" loading\u2026")(`
150
- `);else if(ae!==null)t.brightRed.noFormat(` ${ae}`)(`
151
- `);else if(B!==null)for(let Ne of B)t.noFormat(` ${Ne}`)(`
149
+ `),F)t.dim.noFormat(" loading\u2026")(`
150
+ `);else if(oe!==null)t.brightRed.noFormat(` ${oe}`)(`
151
+ `);else if(B!==null)for(let Be of B)t.noFormat(` ${Be}`)(`
152
152
  `);t(`
153
153
  `),t.dim.noFormat(" Esc / ^C to return")(`
154
- `)})};ne();let ce=new AbortController,Te={onKey:Ne=>{if(Ne==="ESCAPE"||Ne==="CTRL_C"){ce.abort(),St();return}},onResize:()=>ne()};Rt(Te),(async()=>{try{let Ne=await $t(`${e.target.baseUrl}/v1/sessions/${encodeURIComponent(T.sessionId)}/export`,{headers:{Authorization:`Bearer ${e.target.token}`},signal:ce.signal});if(!Ne.ok)throw new Error(`daemon returned HTTP ${Ne.status}`);let Ge=await Ne.json(),mt=Gt(Ge),Me=ul(mt,T.status);B=Za(Me,!1).replace(/\n$/,"").split(`
155
- `)}catch(Ne){if(ce.signal.aborted)return;ae=`failed to load info: ${Ne.message}`}finally{O=!1,!E&&xe[xe.length-1]===Te&&ne()}})()},yr=()=>{if(a.length===0){ee="no sessions to search",Ie();return}K=new qn({history:[],collapsePastes:!1}),J=[],W=!1,F=0,U=0,Fe=0,Y=null,te=!1,z="input",H=!0,Qn(),rn(),Rt({onKey:(B,ae,O)=>{if(z==="input"){if(te)return;if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="ENTER"||B==="KP_ENTER"){if(Co().trim().length===0)return;Md();return}if((B==="DOWN"||B==="TAB"||B==="CTRL_N")&&J.length>0){z="results",F=0,U=0,Be(()=>{ki(),on(0,!0),an(),t.hideCursor()});return}let ne=K.state(),ce=null;if(O?.isCharacter)ce={type:"char",ch:B};else{let mt=kd(B);mt!==null&&(ce={type:"key",name:mt})}if(ce===null){t.moveTo(Ts(),Es());return}K.feed(ce);let Te=K.state();if(ne.buffer.length===Te.buffer.length&&ne.buffer.every((mt,Me)=>mt===Te.buffer[Me])&&ne.row===Te.row&&ne.col===Te.col){t.moveTo(Ts(),Es());return}let Ge=at;Qn(),at!==Ge?rn():xo();return}if(z==="results"){if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="CTRL_F"){z="input",mr(),an(),ki();return}if(B==="ENTER"||B==="KP_ENTER"){let ce=J[F];if(!ce)return;let Te=a.find(Ge=>Ge.sessionId===ce.sessionId);if(!!Te?.importedFromMachine&&!Te.upstreamSessionId){Ye();let Ge={kind:"attach",sessionId:ce.sessionId};Te.agentId!==void 0&&(Ge.agentId=Te.agentId),C(Ge);return}(async()=>{let Ge=await Kg(t,{sessionId:ce.sessionId,title:ce.title,cwd:ce.cwd},pt);if(Ge==="cancel"){Ye(),C({kind:"abort"});return}if(Ge==="back")return;Ye();let mt={kind:"attach",sessionId:ce.sessionId,readonly:Ge==="view"};Te?.agentId!==void 0&&(mt.agentId=Te.agentId),C(mt)})();return}if(O?.isCharacter&&(B==="n"||B==="N")){let ce=J[F];if(!ce||ce.snippets.length<=1)return;U=(U+1)%ce.snippets.length,on(F,!0);return}if(O?.isCharacter&&(B==="p"||B==="P")){let ce=J[F];if(!ce||ce.snippets.length<=1)return;U=(U-1+ce.snippets.length)%ce.snippets.length,on(F,!0);return}let ne=ce=>{if(ce<0&&F===0){z="input",Be(()=>{on(0,!1),an(),ki()});return}let Te=Math.min(J.length-1,Math.max(0,F+ce));if(Te===F)return;let Ne=F,Ge=Fe;F=Te,U=0,So(),Fe!==Ge?mr():(Be(()=>{on(Ne,!1),on(F,!0)}),an())};switch(B){case"UP":case"SHIFT_TAB":case"CTRL_P":ne(-1);return;case"DOWN":case"TAB":case"CTRL_N":ne(1);return;case"PAGE_UP":ne(-nn());return;case"PAGE_DOWN":ne(nn());return;case"HOME":ne(-F);return;case"END":ne(J.length);return}return}},onResize:()=>rn()})},$s=(T,B,ae)=>{if(k!=="busy"){if(T==="CTRL_O"){dn();return}if(T==="CTRL_L"){Ii();return}if(k==="rename"){if(T==="ENTER"||T==="KP_ENTER"){let O=Z.trim();if(O.length===0){k="normal",R=null,Z="",Ie();return}Ri(O);return}if(T==="ESCAPE"||T==="CTRL_C"){k="normal",R=null,Z="",Ie();return}if(T==="BACKSPACE"){Z.length>0&&(Z=Z.slice(0,-1),Ie());return}if(T==="CTRL_U"){Z="",Ie();return}if(T==="CTRL_W"){let O=Z.replace(/\s+$/,""),ne=O.lastIndexOf(" ");Z=ne>=0?O.slice(0,ne):"",Ie();return}if(ae?.isCharacter){Z+=T,Ie();return}return}if(k==="confirm-kill"||k==="confirm-delete"){if(ae?.isCharacter&&(T==="y"||T==="Y")){es(k==="confirm-kill"?"kill":"delete");return}if(T==="ESCAPE"||T==="CTRL_C"||T==="ENTER"||T==="KP_ENTER"||ae?.isCharacter&&(T==="n"||T==="N")){k="normal",R=null,Ie();return}return}if(zt(),T==="CTRL_F"){yr();return}if(u===0&&!m){if(T==="ESCAPE"){En();return}if(T==="ENTER"||T==="KP_ENTER"){Ye();let Me=oe.expandedText(),Lt=Tt();Me.trim().length>0&&(Lt.prompt=Me),C(Lt);return}if(T==="UP"&&v){let Me=Date.now(),Lt=Me-b;if(b=Me,Lt<y){he();return}v=!1}if(T==="DOWN"){let Me=oe.state(),Lt=Me.historyIndex!==-1||Me.queueIndex!==-1,_d=Ot.length===0||Kn===Ot.length-1;if(!Lt&&_d&&a.length>0){it(1);return}}if(T==="PAGE_DOWN"&&(Ot.length===0||Kn===Ot.length-1)&&a.length>0){it(1);return}if(T==="CTRL_P"){a.length>0&&it(1);return}v=!1;let O=oe.state(),ne=null;if(ae?.isCharacter)ne={type:"char",ch:T};else{let Me=kd(T);Me!==null&&(ne={type:"key",name:Me})}if(ne===null){he();return}let ce=oe.feed(ne),Te=oe.state(),Ne=O.buffer.length===Te.buffer.length&&O.buffer.every((Me,Lt)=>Me===Te.buffer[Lt])&&O.row===Te.row&&O.col===Te.col;if(ce.some(Me=>Me.type==="exit")){En();return}if(Ne){he();return}let Ge=Jn(Te.buffer,ks);if(Is(Ge,Te,Cd).rendered!==nt){I();return}xi();return}if(!m&&ae?.isCharacter&&T==="?"){$n();return}if(m){if(ae?.isCharacter){g+=T,ve(),I();return}if(T==="BACKSPACE"){g.length>0?(g=g.slice(0,-1),ve(),I()):(m=!1,ve(),I());return}if(T==="ESCAPE"||T==="CTRL_C"){m=!1,g="",ve(),I();return}}if(ae?.isCharacter){if(T==="/"){m=!0,g="",ve(),I();return}if(T==="n"||T==="N"){it(1);return}if(T==="p"||T==="P"){it(-1);return}if(T==="c"||T==="C"){let O=u>0?a[u-1]:void 0,ne=Tt();O?.cwd&&(ne.cwd=O.cwd),Ye(),C(ne);return}if(T==="q"||T==="Q"){En();return}if(T==="o"||T==="O"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.cwdOnly=!s.filters.cwdOnly,ve(),At(O),I();return}if(T==="h"||T==="H"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.hostFilter=VA(s.filters.hostFilter,i),ve(),At(O),I();return}if(T==="i"&&u>0){let O=a[u-1];if(!O)return;_s(O);return}if(T==="I"){let O=u>0?a[u-1]?.sessionId:void 0;s.filters.includeNonInteractive=!s.filters.includeNonInteractive,ve(),At(O),I();return}if(T==="r"||T==="R"){let O=u>0?a[u-1]?.sessionId:void 0;Zn(O);return}if(T==="s"||T==="S"){Mn();return}if((T==="v"||T==="V")&&u>0){let O=a[u-1];if(!O)return;Ye();let ne={kind:"attach",sessionId:O.sessionId,readonly:!0};O.agentId!==void 0&&(ne.agentId=O.agentId),C(ne);return}if((T==="f"||T==="F")&&u>0){let O=a[u-1];if(!O)return;Ye();let ne={kind:"fork",sourceSessionId:O.sessionId,sourceCwd:O.cwd};O.agentId!==void 0&&(ne.sourceAgentId=O.agentId),O.importedFromMachine!==void 0&&(ne.sourceImportedFromMachine=O.importedFromMachine),O.upstreamSessionId!==void 0&&(ne.sourceUpstreamSessionId=O.upstreamSessionId),C(ne);return}if((T==="k"||T==="K")&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},k="confirm-kill",Ie();return}if(T==="t"&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},Z=O.title??"",k="rename",Ie();return}if(T==="T"&&u>0){let O=a[u-1];if(!O||O.status!=="live")return;et({sessionId:O.sessionId});return}if(T==="*"&&u>0){let O=a[u-1];if(!O)return;Pn(O);return}if((T==="d"||T==="D")&&u>0){let O=a[u-1];if(!O)return;R={sessionId:O.sessionId,cwd:O.cwd,status:O.status},k="confirm-delete",Ie();return}return}switch(T){case"UP":case"SHIFT_TAB":case"CTRL_P":T==="UP"&&(u===1&&(v=!0),b=Date.now()),it(-1);return;case"DOWN":case"TAB":case"CTRL_N":it(1);return;case"PAGE_UP":it(-$e);return;case"PAGE_DOWN":it($e);return;case"HOME":it(1-u);return;case"END":it(f);return;case"ENTER":case"KP_ENTER":{if(Ye(),u===0){C(Tt());return}let O=a[u-1];if(!O){C({kind:"abort"});return}let ne={kind:"attach",sessionId:O.sessionId};O.agentId!==void 0&&(ne.agentId=O.agentId),C(ne);return}case"ESCAPE":case"CTRL_C":case"CTRL_D":En();return}}};Rt({onKey:(T,B,ae)=>$s(T,B,ae),onResize:()=>{E||I()}});let On=()=>{t.grabInput({});let T=t;T.stdin&&typeof T.onStdin=="function"&&(Ct=T.onStdin,T.stdin.removeListener("data",T.onStdin),T.stdin.on("data",gr),process.stdout.write(nd)),t.on("key",rt),t.on("resize",ht)},Os=()=>{process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.off("key",rt),t.off("resize",ht),t.grabInput(!1),t.hideCursor(!1)};if(On(),process.platform!=="win32"){let T=!1,B=()=>{T&&(T=!1,t.fullscreen(!0),n(),t.hideCursor(),On(),E||Ii())};Ci=()=>{T||E||(T=!0,Os(),t.fullscreen(!1),process.stdout.write(`${oo}${sd}
156
- `),process.once("SIGCONT",B),process.kill(process.pid,"SIGTSTP"))}}$=setInterval(Ps,3e3)})}function zA(t,e){let n="Create new session in ",s=Math.max(1,e-n.length);return n+no(je(t),s)}function Rd(t,e){let n=r=>r.priority&&r.priority>0?r.priority:0,s=r=>{let i=r.status==="live",o=n(r)>0;return i&&r.awaitingInput?5:i&&r.busy?4:i&&o?3:i?2:o?1:0};return[...t].sort((r,i)=>{let o=s(i)-s(r);if(o!==0)return o;let a=n(i)-n(r);return a!==0?a:i.updatedAt.slice(0,16).localeCompare(r.updatedAt.slice(0,16))})}function KA(t,e){return e==="__all"?t:e==="__local"?t.filter(n=>!n.importedFromMachine||!!n.upstreamSessionId):t.filter(n=>n.importedFromMachine===e&&!n.upstreamSessionId)}function VA(t,e){let n=new Set;for(let i of e)i.importedFromMachine&&!i.upstreamSessionId&&n.add(i.importedFromMachine);let s=["__local",...[...n].sort(),"__all"],r=s.indexOf(t);return r===-1?"__local":s[(r+1)%s.length]??"__local"}function YA(t,e){if(e.length===0)return!0;let n=e.toLowerCase(),s=[ze(t.sessionId),t.upstreamSessionId??"",t.agentId??"",t.title??"",t.cwd,je(t.cwd)];for(let r of s)if(r.toLowerCase().includes(n))return!0;return!1}var Xl,Cd,qA,Gg,WA,JA,Qg=q(()=>{"use strict";Va();ge();hn();to();da();Pl();Yl();Gl();Ql();ci();Ml();Bl();ao();Ws();fl();Xl=2,Cd=4,qA=4,Gg=4,WA=20,JA=[["Composer","type prompt for new session; Enter creates + submits"],["\u2193 from composer","drop focus into session list"],null,["\u2191 / \u2193, n / p, ^p / ^n","navigate sessions"],["PgUp / PgDn","page up / page down"],["Home / End","first / last"],["Enter","open selected session"],["v","view-only (open transcript without spawning the agent)"],null,["/","search sessions (metadata)"],["^f","find in session history (content + tool inputs)"],["o","toggle cwd-only filter"],["h","cycle host filter (local / <peer> / all)"],["^o","change cwd (for the picker and any new sessions)"],["i","show info for the selected session"],["I","toggle include-cat filter"],["r","refresh from daemon"],["s","sync sessions from installed agents"],null,["k","kill the selected live session"],["d","delete the selected session (kills first if live)"],["t","retitle the selected session"],["T","regenerate title + synopsis via agent (live session)"],["*","toggle high priority on the selected session (floats to top)"],null,["?","toggle this help"],["q / Esc / ^C / ^D","quit picker (detach)"]]});function ZA(t,e){let n=t.findIndex(s=>s.id===e);return n===-1?0:n}async function Xg(t,e,n){Un();let s=ZA(e,n??GA),r=0,i=()=>{let l=sr(t)-8;return Math.max(1,Math.min(QA,e.length,l))},o=()=>{let l=i();s<r?r=s:s>=r+l&&(r=s-l+1);let f=Math.max(0,e.length-l);r>f&&(r=f),r<0&&(r=0)},a=()=>{o();let l=i(),f=l+4,u=Math.min(XA,Math.max(40,Xt(t)-8)),p=jn(t,{contentHeight:f,contentWidth:u,title:"Select agent"}),m=p.contentW,g=0;t.moveTo(p.contentX,p.contentY+g),t.noFormat(" Which agent should this session use?"),g+=2;let y=Math.min(e.length,r+l);for(let b=r;b<y;b++){let k=e[b];if(!k)continue;let R=b===s?"\u276F":" ",H=k.description??k.name,z=` ${R} ${k.id}`;if(t.moveTo(p.contentX,p.contentY+g),b===s){let K=`${z} ${H}`;t.brightWhite.bgBlue.noFormat(rd(Xe(K,m),m))}else{t.noFormat(z);let K=m-z.length-2;K>1&&t.dim.noFormat(` ${Xe(H,K)}`)}g++}g++,t.moveTo(p.contentX,p.contentY+g);let v=e.length>l?` (${s+1}/${e.length})`:"";return t.dim.noFormat(` \u2191/\u2193 navigate \xB7 Enter this session \xB7 s set default \xB7 Esc back${v}`),p},d=()=>{s<e.length-1&&(s++,a())},c=()=>{s>0&&(s--,a())};return ys({term:t,render:a,onKey:(l,f,u,p)=>{if(l==="CTRL_C"||l==="CTRL_D"){p({kind:"cancel"});return}if(l==="ESCAPE"){p({kind:"back"});return}if(l==="ENTER"||l==="KP_ENTER"){let m=e[s];m&&p({kind:"select",agentId:m.id,persist:!1});return}if(l==="UP"||l==="SHIFT_TAB"){c();return}if(l==="DOWN"||l==="TAB"){d();return}if(u?.isCharacter){let m=l.toLowerCase();if(m==="s"){let g=e[s];g&&p({kind:"select",agentId:g.id,persist:!0});return}if(m==="j"){d();return}if(m==="k"){c();return}}}})}var GA,QA,XA,Zg=q(()=>{"use strict";ci();GA="opencode",QA=20,XA=88});import*as ty from"fs";import*as ny from"os";import*as Td from"path";function sy(t,e){let n=e;for(;n>0;){let s=t[n-1]??"";if(/\s/.test(s)){if(s===" "&&t[n-2]==="\\"){n-=2;continue}break}n-=1}return n===e?null:{token:t.slice(n,e),start:n}}function eC(t){return t.length===0?!1:t.includes("/")?!0:t==="~"||t==="."||t===".."}function tC(t){return t.replace(/\\ /g," ")}function ey(t){return t.replace(/ /g,"\\ ")}function nC(t){let e=t.lastIndexOf("/");return e===-1?{dirPrefix:"",base:t}:{dirPrefix:t.slice(0,e+1),base:t.slice(e+1)}}function sC(t,e){let n=t.length===0?".":t;return(n==="~"||n.startsWith("~/"))&&(n=ny.homedir()+n.slice(1)),Td.isAbsolute(n)?n:Td.resolve(e,n)}function rC(t){let e;try{e=ty.readdirSync(t,{withFileTypes:!0})}catch{return null}return e.map(n=>({name:n.name,isDir:n.isDirectory()}))}function ry(t,e,n=rC){if(!eC(t))return null;let s=tC(t),{dirPrefix:r,base:i}=nC(s),o=sC(r,e),a=n(o);if(a===null)return null;let d=i.startsWith("."),c=a.filter(u=>u.name.startsWith(i)&&(d||!u.name.startsWith(".")));if(c.length===0)return null;let l=c.map(u=>u.isDir?u.name+"/":u.name);if(c.length===1){let u=c[0],p=u.isDir?u.name+"/":u.name;return{replacement:ey(r+p),candidates:l}}let f=wo(c.map(u=>u.name));return{replacement:ey(r+f),candidates:l}}var iy=q(()=>{"use strict";Ad()});function oy(t){let e={};if(!t||typeof t!="object")return e;let n=t;typeof n.historyPolicy=="string"&&(e.appliedPolicy=n.historyPolicy),typeof n.clientId=="string"&&n.clientId.length>0&&(e.clientId=n.clientId);let s=n._meta;if(s&&typeof s=="object"){let r=s["hydra-acp"];if(r&&typeof r=="object"){let i=r.turnStartedAt;typeof i=="number"&&(e.turnStartedAt=i)}}return e}function ay(t){return!t.replayDraining&&!t.amended&&t.pendingTurns>0&&t.queueSize===0&&!t.ownTurnInFlight&&!t.hasInFlightHead}function dy(t){return t.daemonTurnStartedAt!==void 0?{pendingTurnsDelta:t.pendingTurns===0?1:0,banner:"busy",busySince:t.daemonTurnStartedAt}:{pendingTurnsDelta:t.pendingTurns>0?-t.pendingTurns:0,banner:"ready"}}var cy=q(()=>{"use strict"});import{appendFileSync as iC,readFileSync as oC,statSync as aC,renameSync as dC}from"fs";import{nanoid as ly}from"nanoid";import cC from"terminal-kit";import lC from"fs/promises";import bo from"path";function uy(t){if(!Array.isArray(t))return;let e=yn({sessionUpdate:"config_option_update",configOptions:t});return e&&e.kind==="config-options"?e.options:void 0}function fy(t){switch(t.type){case"send":case"amend":case"queue-edit":case"queue-remove":case"plan-toggle":case"attachment-request":return!0;default:return!1}}function pC(t,e){e.has(t)?e.delete(t):e.add(t)}async function my(t){let e=await ye(),n=t.target??await Dt(e);wy=e.tui.logMaxBytes,n.isLocal&&!t.target&&await fs(e);let s=cC.terminal;Wg(s);let r={},i={showThoughts:e.tui.showThoughts,toolsExpanded:!1,planExpanded:!1,showFileUpdates:e.tui.showFileUpdates,mouseEnabled:e.tui.mouse,inAppSelectionEnabled:wu(e),defaultEnterAction:e.tui.defaultEnterAction},o=Zl(),a=!1,d=()=>{a||(s.fullscreen(!0),a=!0)},c=()=>{a&&(s.fullscreen(!1),a=!1,process.stdout.write(`
154
+ `)})};ee();let ce=new AbortController,Te={onKey:Be=>{if(Be==="ESCAPE"||Be==="CTRL_C"){ce.abort(),St();return}},onResize:()=>ee()};Rt(Te),(async()=>{try{let Be=await $t(`${e.target.baseUrl}/v1/sessions/${encodeURIComponent(T.sessionId)}/export`,{headers:{Authorization:`Bearer ${e.target.token}`},signal:ce.signal});if(!Be.ok)throw new Error(`daemon returned HTTP ${Be.status}`);let Ge=await Be.json(),mt=Gt(Ge),Me=ul(mt,T.status);B=Za(Me,!1).replace(/\n$/,"").split(`
155
+ `)}catch(Be){if(ce.signal.aborted)return;oe=`failed to load info: ${Be.message}`}finally{F=!1,!E&&Ae[Ae.length-1]===Te&&ee()}})()},yr=()=>{if(a.length===0){ne="no sessions to search",Ie();return}K=new qn({history:[],collapsePastes:!1}),z=[],W=!1,O=0,U=0,Oe=0,V=null,se=!1,q="input",H=!0,Qn(),rn(),Rt({onKey:(B,oe,F)=>{if(q==="input"){if(se)return;if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="ENTER"||B==="KP_ENTER"){if(Co().trim().length===0)return;Md();return}if((B==="DOWN"||B==="TAB"||B==="CTRL_N")&&z.length>0){q="results",O=0,U=0,Le(()=>{ki(),on(0,!0),an(),t.hideCursor()});return}let ee=K.state(),ce=null;if(F?.isCharacter)ce={type:"char",ch:B};else{let mt=kd(B);mt!==null&&(ce={type:"key",name:mt})}if(ce===null){t.moveTo(Ts(),Es());return}K.feed(ce);let Te=K.state();if(ee.buffer.length===Te.buffer.length&&ee.buffer.every((mt,Me)=>mt===Te.buffer[Me])&&ee.row===Te.row&&ee.col===Te.col){t.moveTo(Ts(),Es());return}let Ge=at;Qn(),at!==Ge?rn():xo();return}if(q==="results"){if(B==="ESCAPE"||B==="CTRL_C"){Rn();return}if(B==="CTRL_F"){q="input",mr(),an(),ki();return}if(B==="ENTER"||B==="KP_ENTER"){let ce=z[O];if(!ce)return;let Te=a.find(Ge=>Ge.sessionId===ce.sessionId);if(!!Te?.importedFromMachine&&!Te.upstreamSessionId){Ye();let Ge={kind:"attach",sessionId:ce.sessionId};Te.agentId!==void 0&&(Ge.agentId=Te.agentId),C(Ge);return}(async()=>{let Ge=await Kg(t,{sessionId:ce.sessionId,title:ce.title,cwd:ce.cwd},pt);if(Ge==="cancel"){Ye(),C({kind:"abort"});return}if(Ge==="back")return;Ye();let mt={kind:"attach",sessionId:ce.sessionId,readonly:Ge==="view"};Te?.agentId!==void 0&&(mt.agentId=Te.agentId),C(mt)})();return}if(F?.isCharacter&&(B==="n"||B==="N")){let ce=z[O];if(!ce||ce.snippets.length<=1)return;U=(U+1)%ce.snippets.length,on(O,!0);return}if(F?.isCharacter&&(B==="p"||B==="P")){let ce=z[O];if(!ce||ce.snippets.length<=1)return;U=(U-1+ce.snippets.length)%ce.snippets.length,on(O,!0);return}let ee=ce=>{if(ce<0&&O===0){q="input",Le(()=>{on(0,!1),an(),ki()});return}let Te=Math.min(z.length-1,Math.max(0,O+ce));if(Te===O)return;let Be=O,Ge=Oe;O=Te,U=0,So(),Oe!==Ge?mr():(Le(()=>{on(Be,!1),on(O,!0)}),an())};switch(B){case"UP":case"SHIFT_TAB":case"CTRL_P":ee(-1);return;case"DOWN":case"TAB":case"CTRL_N":ee(1);return;case"PAGE_UP":ee(-nn());return;case"PAGE_DOWN":ee(nn());return;case"HOME":ee(-O);return;case"END":ee(z.length);return}return}},onResize:()=>rn()})},$s=(T,B,oe)=>{if(k!=="busy"){if(T==="CTRL_O"){dn();return}if(T==="CTRL_L"){Ii();return}if(k==="rename"){if(T==="ENTER"||T==="KP_ENTER"){let F=Z.trim();if(F.length===0){k="normal",R=null,Z="",Ie();return}Ri(F);return}if(T==="ESCAPE"||T==="CTRL_C"){k="normal",R=null,Z="",Ie();return}if(T==="BACKSPACE"){Z.length>0&&(Z=Z.slice(0,-1),Ie());return}if(T==="CTRL_U"){Z="",Ie();return}if(T==="CTRL_W"){let F=Z.replace(/\s+$/,""),ee=F.lastIndexOf(" ");Z=ee>=0?F.slice(0,ee):"",Ie();return}if(oe?.isCharacter){Z+=T,Ie();return}return}if(k==="confirm-kill"||k==="confirm-delete"){if(oe?.isCharacter&&(T==="y"||T==="Y")){es(k==="confirm-kill"?"kill":"delete");return}if(T==="ESCAPE"||T==="CTRL_C"||T==="ENTER"||T==="KP_ENTER"||oe?.isCharacter&&(T==="n"||T==="N")){k="normal",R=null,Ie();return}return}if(zt(),T==="CTRL_F"){yr();return}if(u===0&&!m){if(T==="ESCAPE"){En();return}if(T==="ENTER"||T==="KP_ENTER"){Ye();let Me=ue.expandedText(),Lt=Tt();Me.trim().length>0&&(Lt.prompt=Me),C(Lt);return}if(T==="UP"&&v){let Me=Date.now(),Lt=Me-b;if(b=Me,Lt<y){he();return}v=!1}if(T==="DOWN"){let Me=ue.state(),Lt=Me.historyIndex!==-1||Me.queueIndex!==-1,_d=Ot.length===0||Kn===Ot.length-1;if(!Lt&&_d&&a.length>0){it(1);return}}if(T==="PAGE_DOWN"&&(Ot.length===0||Kn===Ot.length-1)&&a.length>0){it(1);return}if(T==="CTRL_P"){a.length>0&&it(1);return}v=!1;let F=ue.state(),ee=null;if(oe?.isCharacter)ee={type:"char",ch:T};else{let Me=kd(T);Me!==null&&(ee={type:"key",name:Me})}if(ee===null){he();return}let ce=ue.feed(ee),Te=ue.state(),Be=F.buffer.length===Te.buffer.length&&F.buffer.every((Me,Lt)=>Me===Te.buffer[Lt])&&F.row===Te.row&&F.col===Te.col;if(ce.some(Me=>Me.type==="exit")){En();return}if(Be){he();return}let Ge=Jn(Te.buffer,ks);if(Is(Ge,Te,Cd).rendered!==nt){I();return}xi();return}if(!m&&oe?.isCharacter&&T==="?"){$n();return}if(m){if(oe?.isCharacter){g+=T,ve(),I();return}if(T==="BACKSPACE"){g.length>0?(g=g.slice(0,-1),ve(),I()):(m=!1,ve(),I());return}if(T==="ESCAPE"||T==="CTRL_C"){m=!1,g="",ve(),I();return}}if(oe?.isCharacter){if(T==="/"){m=!0,g="",ve(),I();return}if(T==="n"||T==="N"){it(1);return}if(T==="p"||T==="P"){it(-1);return}if(T==="c"||T==="C"){let F=u>0?a[u-1]:void 0,ee=Tt();F?.cwd&&(ee.cwd=F.cwd),Ye(),C(ee);return}if(T==="q"||T==="Q"){En();return}if(T==="o"||T==="O"){let F=u>0?a[u-1]?.sessionId:void 0;s.filters.cwdOnly=!s.filters.cwdOnly,ve(),At(F),I();return}if(T==="h"||T==="H"){let F=u>0?a[u-1]?.sessionId:void 0;s.filters.hostFilter=VA(s.filters.hostFilter,i),ve(),At(F),I();return}if(T==="i"&&u>0){let F=a[u-1];if(!F)return;_s(F);return}if(T==="I"){let F=u>0?a[u-1]?.sessionId:void 0;s.filters.includeNonInteractive=!s.filters.includeNonInteractive,ve(),At(F),I();return}if(T==="r"||T==="R"){let F=u>0?a[u-1]?.sessionId:void 0;Zn(F);return}if(T==="s"||T==="S"){Mn();return}if((T==="v"||T==="V")&&u>0){let F=a[u-1];if(!F)return;Ye();let ee={kind:"attach",sessionId:F.sessionId,readonly:!0};F.agentId!==void 0&&(ee.agentId=F.agentId),C(ee);return}if((T==="f"||T==="F")&&u>0){let F=a[u-1];if(!F)return;Ye();let ee={kind:"fork",sourceSessionId:F.sessionId,sourceCwd:F.cwd};F.agentId!==void 0&&(ee.sourceAgentId=F.agentId),F.importedFromMachine!==void 0&&(ee.sourceImportedFromMachine=F.importedFromMachine),F.upstreamSessionId!==void 0&&(ee.sourceUpstreamSessionId=F.upstreamSessionId),C(ee);return}if((T==="k"||T==="K")&&u>0){let F=a[u-1];if(!F)return;R={sessionId:F.sessionId,cwd:F.cwd,status:F.status},k="confirm-kill",Ie();return}if(T==="t"&&u>0){let F=a[u-1];if(!F)return;R={sessionId:F.sessionId,cwd:F.cwd,status:F.status},Z=F.title??"",k="rename",Ie();return}if(T==="T"&&u>0){let F=a[u-1];if(!F||F.status!=="live")return;et({sessionId:F.sessionId});return}if(T==="*"&&u>0){let F=a[u-1];if(!F)return;Pn(F);return}if((T==="d"||T==="D")&&u>0){let F=a[u-1];if(!F)return;R={sessionId:F.sessionId,cwd:F.cwd,status:F.status},k="confirm-delete",Ie();return}return}switch(T){case"UP":case"SHIFT_TAB":case"CTRL_P":T==="UP"&&(u===1&&(v=!0),b=Date.now()),it(-1);return;case"DOWN":case"TAB":case"CTRL_N":it(1);return;case"PAGE_UP":it(-$e);return;case"PAGE_DOWN":it($e);return;case"HOME":it(1-u);return;case"END":it(f);return;case"ENTER":case"KP_ENTER":{if(Ye(),u===0){C(Tt());return}let F=a[u-1];if(!F){C({kind:"abort"});return}let ee={kind:"attach",sessionId:F.sessionId};F.agentId!==void 0&&(ee.agentId=F.agentId),C(ee);return}case"ESCAPE":case"CTRL_C":case"CTRL_D":En();return}}};Rt({onKey:(T,B,oe)=>$s(T,B,oe),onResize:()=>{E||I()}});let On=()=>{t.grabInput({});let T=t;T.stdin&&typeof T.onStdin=="function"&&(Ct=T.onStdin,T.stdin.removeListener("data",T.onStdin),T.stdin.on("data",gr),process.stdout.write(nd)),t.on("key",rt),t.on("resize",ht)},Os=()=>{process.stdout.write(Hn);let T=t;T.stdin&&Ct&&(T.stdin.removeListener("data",gr),T.stdin.on("data",Ct),Ct=null),Xn=!1,Tn="",t.off("key",rt),t.off("resize",ht),t.grabInput(!1),t.hideCursor(!1)};if(On(),process.platform!=="win32"){let T=!1,B=()=>{T&&(T=!1,t.fullscreen(!0),n(),t.hideCursor(),On(),E||Ii())};Ci=()=>{T||E||(T=!0,Os(),t.fullscreen(!1),process.stdout.write(`${oo}${sd}
156
+ `),process.once("SIGCONT",B),process.kill(process.pid,"SIGTSTP"))}}$=setInterval(Ps,3e3)})}function zA(t,e){let n="Create new session in ",s=Math.max(1,e-n.length);return n+no(Ue(t),s)}function Rd(t,e){let n=r=>r.priority&&r.priority>0?r.priority:0,s=r=>{let i=r.status==="live",o=n(r)>0;return i&&r.awaitingInput?5:i&&r.busy?4:i&&o?3:i?2:o?1:0};return[...t].sort((r,i)=>{let o=s(i)-s(r);if(o!==0)return o;let a=n(i)-n(r);return a!==0?a:i.updatedAt.slice(0,16).localeCompare(r.updatedAt.slice(0,16))})}function KA(t,e){return e==="__all"?t:e==="__local"?t.filter(n=>!n.importedFromMachine||!!n.upstreamSessionId):t.filter(n=>n.importedFromMachine===e&&!n.upstreamSessionId)}function VA(t,e){let n=new Set;for(let i of e)i.importedFromMachine&&!i.upstreamSessionId&&n.add(i.importedFromMachine);let s=["__local",...[...n].sort(),"__all"],r=s.indexOf(t);return r===-1?"__local":s[(r+1)%s.length]??"__local"}function YA(t,e){if(e.length===0)return!0;let n=e.toLowerCase(),s=[ze(t.sessionId),t.upstreamSessionId??"",t.agentId??"",t.title??"",t.cwd,Ue(t.cwd)];for(let r of s)if(r.toLowerCase().includes(n))return!0;return!1}var Xl,Cd,qA,Gg,WA,JA,Qg=J(()=>{"use strict";Va();ge();hn();to();da();Pl();Yl();Gl();Ql();ci();Ml();Bl();ao();Ws();fl();Xl=2,Cd=4,qA=4,Gg=4,WA=20,JA=[["Composer","type prompt for new session; Enter creates + submits"],["\u2193 from composer","drop focus into session list"],null,["\u2191 / \u2193, n / p, ^p / ^n","navigate sessions"],["PgUp / PgDn","page up / page down"],["Home / End","first / last"],["Enter","open selected session"],["v","view-only (open transcript without spawning the agent)"],null,["/","search sessions (metadata)"],["^f","find in session history (content + tool inputs)"],["o","toggle cwd-only filter"],["h","cycle host filter (local / <peer> / all)"],["^o","change cwd (for the picker and any new sessions)"],["i","show info for the selected session"],["I","toggle include-cat filter"],["r","refresh from daemon"],["s","sync sessions from installed agents"],null,["k","kill the selected live session"],["d","delete the selected session (kills first if live)"],["t","retitle the selected session"],["T","regenerate title + synopsis via agent (live session)"],["*","toggle high priority on the selected session (floats to top)"],null,["?","toggle this help"],["q / Esc / ^C / ^D","quit picker (detach)"]]});function ZA(t,e){let n=t.findIndex(s=>s.id===e);return n===-1?0:n}async function Xg(t,e,n){Un();let s=ZA(e,n??GA),r=0,i=()=>{let l=sr(t)-8;return Math.max(1,Math.min(QA,e.length,l))},o=()=>{let l=i();s<r?r=s:s>=r+l&&(r=s-l+1);let f=Math.max(0,e.length-l);r>f&&(r=f),r<0&&(r=0)},a=()=>{o();let l=i(),f=l+4,u=Math.min(XA,Math.max(40,Xt(t)-8)),p=jn(t,{contentHeight:f,contentWidth:u,title:"Select agent"}),m=p.contentW,g=0;t.moveTo(p.contentX,p.contentY+g),t.noFormat(" Which agent should this session use?"),g+=2;let y=Math.min(e.length,r+l);for(let b=r;b<y;b++){let k=e[b];if(!k)continue;let R=b===s?"\u276F":" ",H=k.description??k.name,q=` ${R} ${k.id}`;if(t.moveTo(p.contentX,p.contentY+g),b===s){let K=`${q} ${H}`;t.brightWhite.bgBlue.noFormat(rd(Xe(K,m),m))}else{t.noFormat(q);let K=m-q.length-2;K>1&&t.dim.noFormat(` ${Xe(H,K)}`)}g++}g++,t.moveTo(p.contentX,p.contentY+g);let v=e.length>l?` (${s+1}/${e.length})`:"";return t.dim.noFormat(` \u2191/\u2193 navigate \xB7 Enter this session \xB7 s set default \xB7 Esc back${v}`),p},d=()=>{s<e.length-1&&(s++,a())},c=()=>{s>0&&(s--,a())};return ys({term:t,render:a,onKey:(l,f,u,p)=>{if(l==="CTRL_C"||l==="CTRL_D"){p({kind:"cancel"});return}if(l==="ESCAPE"){p({kind:"back"});return}if(l==="ENTER"||l==="KP_ENTER"){let m=e[s];m&&p({kind:"select",agentId:m.id,persist:!1});return}if(l==="UP"||l==="SHIFT_TAB"){c();return}if(l==="DOWN"||l==="TAB"){d();return}if(u?.isCharacter){let m=l.toLowerCase();if(m==="s"){let g=e[s];g&&p({kind:"select",agentId:g.id,persist:!0});return}if(m==="j"){d();return}if(m==="k"){c();return}}}})}var GA,QA,XA,Zg=J(()=>{"use strict";ci();GA="opencode",QA=20,XA=88});import*as ty from"fs";import*as ny from"os";import*as Td from"path";function sy(t,e){let n=e;for(;n>0;){let s=t[n-1]??"";if(/\s/.test(s)){if(s===" "&&t[n-2]==="\\"){n-=2;continue}break}n-=1}return n===e?null:{token:t.slice(n,e),start:n}}function eC(t){return t.length===0?!1:t.includes("/")?!0:t==="~"||t==="."||t===".."}function tC(t){return t.replace(/\\ /g," ")}function ey(t){return t.replace(/ /g,"\\ ")}function nC(t){let e=t.lastIndexOf("/");return e===-1?{dirPrefix:"",base:t}:{dirPrefix:t.slice(0,e+1),base:t.slice(e+1)}}function sC(t,e){let n=t.length===0?".":t;return(n==="~"||n.startsWith("~/"))&&(n=ny.homedir()+n.slice(1)),Td.isAbsolute(n)?n:Td.resolve(e,n)}function rC(t){let e;try{e=ty.readdirSync(t,{withFileTypes:!0})}catch{return null}return e.map(n=>({name:n.name,isDir:n.isDirectory()}))}function ry(t,e,n=rC){if(!eC(t))return null;let s=tC(t),{dirPrefix:r,base:i}=nC(s),o=sC(r,e),a=n(o);if(a===null)return null;let d=i.startsWith("."),c=a.filter(u=>u.name.startsWith(i)&&(d||!u.name.startsWith(".")));if(c.length===0)return null;let l=c.map(u=>u.isDir?u.name+"/":u.name);if(c.length===1){let u=c[0],p=u.isDir?u.name+"/":u.name;return{replacement:ey(r+p),candidates:l}}let f=wo(c.map(u=>u.name));return{replacement:ey(r+f),candidates:l}}var iy=J(()=>{"use strict";Ad()});function oy(t){let e={};if(!t||typeof t!="object")return e;let n=t;typeof n.historyPolicy=="string"&&(e.appliedPolicy=n.historyPolicy),typeof n.clientId=="string"&&n.clientId.length>0&&(e.clientId=n.clientId);let s=n._meta;if(s&&typeof s=="object"){let r=s["hydra-acp"];if(r&&typeof r=="object"){let i=r.turnStartedAt;typeof i=="number"&&(e.turnStartedAt=i)}}return e}function ay(t){return!t.replayDraining&&!t.amended&&t.pendingTurns>0&&t.queueSize===0&&!t.ownTurnInFlight&&!t.hasInFlightHead}function dy(t){return t.daemonTurnStartedAt!==void 0?{pendingTurnsDelta:t.pendingTurns===0?1:0,banner:"busy",busySince:t.daemonTurnStartedAt}:{pendingTurnsDelta:t.pendingTurns>0?-t.pendingTurns:0,banner:"ready"}}var cy=J(()=>{"use strict"});import{appendFileSync as iC,readFileSync as oC,statSync as aC,renameSync as dC}from"fs";import{nanoid as ly}from"nanoid";import cC from"terminal-kit";import lC from"fs/promises";import bo from"path";function uy(t){if(!Array.isArray(t))return;let e=yn({sessionUpdate:"config_option_update",configOptions:t});return e&&e.kind==="config-options"?e.options:void 0}function fy(t){switch(t.type){case"send":case"amend":case"queue-edit":case"queue-remove":case"plan-toggle":case"attachment-request":return!0;default:return!1}}function pC(t,e){e.has(t)?e.delete(t):e.add(t)}async function my(t){let e=await ye(),n=t.target??await Dt(e);wy=e.tui.logMaxBytes,n.isLocal&&!t.target&&await fs(e);let s=cC.terminal;Wg(s);let r={},i={showThoughts:e.tui.showThoughts,toolsExpanded:!1,planExpanded:!1,showFileUpdates:e.tui.showFileUpdates,mouseEnabled:e.tui.mouse,inAppSelectionEnabled:wu(e),defaultEnterAction:e.tui.defaultEnterAction},o=Zl(),a=!1,d=()=>{a||(s.fullscreen(!0),a=!0)},c=()=>{a&&(s.fullscreen(!1),a=!1,process.stdout.write(`
157
157
  `))};d();let l=()=>{a&&(s.fullscreen(!1),a=!1)};process.once("exit",l);let f=t;try{for(;f!==null;)f=await mC(s,e,n,f,r,i,o)}finally{c(),process.off("exit",l)}let u=await lo();if(u&&process.stderr.write(`\u2728 ${uo(u)}
158
158
  `),process.stdout.isTTY){let p=await Vs(e);if(p?.version!==void 0){let m=p.version!==fe,g=ds(e),y=p.configDigest!==void 0&&p.configDigest!==g;if(m||y){let v=m?`daemon ${p.version} \u2260 cli ${fe}`:"config changed since daemon started",b=k=>`\x1B[33m${k}\x1B[0m`;process.stderr.write(b(`! ${v} \u2014 run \`${cn()} daemon restart\` to apply.`)+`
159
159
  `)}}}if(r.sessionId&&process.stdout.isTTY){let p=ze(r.sessionId),m=r.readonly?" --readonly":"";process.stdout.write(`Continue: ${cn()} --session ${p}${m}
160
- `)}}function hC(t){let{order:e,states:n,startedAt:s,endedAt:r,stopReason:i,perToolExpanded:o,collapsedLimit:a=20}=t,d=e.length,c=a>0,l=!c||t.expanded?e:e.slice(Math.max(0,d-a)),f=d-l.length,u=r===null,p=r??Date.now(),m=p-s,g=!u&&i!==null&&i!=="end_turn"?i:null,y=g==="amended",v=y?`amended \xB7 ${In(m)}`:`stopped (${g}) \xB7 ${In(m)}`,b;if(d===0)g!==null?b=v:b=u?`thinking \xB7 ${In(m)}`:`thought \xB7 ${In(m)}`;else{let W=d===1?"tool":"tools",F=g!==null?v:u?In(m):`took ${In(m)}`,U=[`${d} ${W}`,F];u&&c&&f>0&&U.push(`${f} hidden`),b=U.join(" \xB7 ")}let k=d===0&&u,R=y?"tool-status-cancelled":"tool-status-fail",K=[{prefix:"\u2699 ",prefixStyle:k?"tool-status-running":g!==null?R:"tool",body:b,bodyStyle:k?"tool-status-running":g!==null?R:"dim"}],J=[null];for(let W of l){let F=n.get(W);if(F){let U=ro(F,p);if(K.push(...U),J.push(...U.map(()=>W)),o?.has(W)){let Y=jh(F);K.push(...Y),J.push(...Y.map(()=>W))}}}return{lines:K,rowOwners:J}}async function mC(t,e,n,s,r,i,o){let a=await gC(t,e,n,s,o);if(!a)return t.grabInput(!1),null;let d=a.sessionId==="__new__"?"Starting new session\u2026":"Resuming session\u2026",c=bC(t,d);c.write(d);let l=n.wsUrl,f=["acp.v1",`hydra-acp-token.${n.token}`],u=null,p=null,m=new li({url:l,subprotocols:f,onConnect:async h=>{h||u&&await u()},onDisconnect:h=>{p&&p(h)},log:()=>{}}),g=new kt(m);await m.start(),g.onNotification(Yo,h=>{let w=gf.safeParse(h);w.success&&c.applyProgress(w.data)});let y=[],v=null,b=!1,k=!1,R=(h,w)=>{h&&(v?v(h,w):y.push({event:h,rawUpdate:w}))},H,z=h=>{h!==H&&(H=h,h!==void 0&&I.appendLines([{prefix:" ",body:`\u2500\u2500 T${h} \u2500\u2500`,bodyStyle:"dim"}]))},K=null,J=null,W=!1,F=0,U=0,Y=!1,te,Z=null,ee=null,Q=null,oe=()=>setInterval(()=>{if(Z===null||ue===null)return;let h=Q===null?0:Date.now()-Q;ue.setBanner({elapsedMs:Date.now()-Z,stalled:h>=uC}),Kt()},1e3),Oe=!1,j=h=>{let w=U;U=Math.max(0,U+h);let S=typeof ue<"u"&&ue!==null;w===0&&U>0?(Y=!1,Z=Date.now(),Q=Date.now(),_e?.setTurnRunning(!0),S&&ue.setBanner({status:"busy",elapsedMs:0,stalled:!1}),ee===null&&S&&(ee=oe())):w>0&&U===0?(Y=!1,Z=null,Q=null,_e?.setTurnRunning(!1),ee!==null&&(clearInterval(ee),ee=null),S&&ue.setBanner({status:"ready",elapsedMs:void 0,stalled:!1})):U>0&&Y&&(Y=!1,S&&ue.setBanner({status:"busy",stalled:!1}))},ue=null,_e=null,$e,kn=null,ks=new Set(["session_info_update","current_model_update","current_mode_update","available_commands_update","available_modes_update","usage_update","config_option_update"]),Ot=h=>{let{update:w}=h??{},S=yn(w,{cwd:Ke});yC(w,S),Q=Date.now();let x=w?.sessionUpdate;if(typeof x=="string"&&!ks.has(x)){let A=w??{};typeof A.messageId=="string"&&($e=A.messageId)}if(x==="prompt_received"?j(1):S?.kind==="turn-complete"&&(j(-1),W=!0),x==="permission_resolved"){mi(w);return}R(S,w),yi(w)};g.onNotification("session/update",h=>{if(!b){if(kn!==null){kn.push(h);return}Ot(h)}}),g.onNotification("hydra-acp/session/closed",()=>{if(b)return;U>0&&j(-U),typeof ue<"u"&&ue!==null&&ue.setBanner({status:"cold",elapsedMs:void 0})});let nt=new Map,zn=200,Kn=0,xn=!1,dr=4e3;g.onNotification("hydra-acp/prompt_queue/added",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;if(typeof w._meta?.["hydra-acp"]?.amending=="string"){let x=w.messageId,A=w.prompt,P=setTimeout(()=>{b||(nt.delete(x),pt.set(x,St(x,A)),ue&&_e&&Ye())},zn);nt.set(x,P)}else pt.set(w.messageId,St(w.messageId,w.prompt)),ue&&_e&&Ye();if(Vn!==void 0&&w.originator?.clientId===Vn){let x=Tt.shift();x&&(x.messageId=w.messageId,dn.set(w.messageId,x))}}),g.onNotification("hydra-acp/prompt_queue/updated",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string"||!pt.has(w.messageId))return;pt.set(w.messageId,St(w.messageId,w.prompt));let S=dn.get(w.messageId);if(S){let x=Array.isArray(w.prompt)?w.prompt:[],A="",P=[];for(let L of x){if(!L||typeof L!="object")continue;let _=L;_.type==="text"&&typeof _.text=="string"?A+=_.text:_.type==="image"&&typeof _.data=="string"&&typeof _.mimeType=="string"&&P.push({data:_.data,mimeType:_.mimeType,sizeBytes:Math.floor(_.data.length*3/4)})}S.text=A,S.attachments=P}ue&&_e&&Ye()}),g.onNotification("hydra-acp/prompt_queue/removed",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;w.reason==="started"&&(te=w.messageId);let S=nt.get(w.messageId);S!==void 0&&(clearTimeout(S),nt.delete(w.messageId)),pt.delete(w.messageId)&&ue&&_e&&Ye();let A=dn.get(w.messageId);A&&(dn.delete(w.messageId),w.reason==="started"&&(A.flushed=!0,R({kind:"user-text",text:A.displayText,attachments:A.attachments}),ht=A))}),g.onNotification("hydra-acp/cancel_failed",h=>{if(b)return;let w=h??{};if(!(typeof ue<"u"&&ue!==null))return;Kn=Date.now(),xn=!0;let x=typeof w.code=="number"?` (${w.code})`:"",A=typeof w.message=="string"&&w.message.length>0?`: ${w.message}`:"";ue.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`cancel rejected by agent${x}${A} \u2014 this agent build may not support cancellation. Cancel again to force-stop (restarts the agent).`,bodyStyle:"tool-status-fail"}])}),g.onNotification("hydra-acp/prompt/amended",h=>{if(b)return;let w=h??{};if(typeof w.cancelledMessageId!="string")return;let S=w.cancelledMessageId;rt.add(S),ht!==null&&ht.messageId!==void 0&&ht.messageId===S&&(R({kind:"turn-complete",stopReason:"cancelled",amended:!0}),ht=null,rt.delete(S))});let mi=h=>{let w=h??{},S=typeof w.toolCallId=="string"?w.toolCallId:void 0,x;w.outcome&&typeof w.outcome=="object"?x=w.outcome:typeof w.chosenOptionId=="string"&&(x={kind:"selected",optionId:w.chosenOptionId}),gi(S,x?{outcome:x}:void 0)},be=null,gi=(h,w)=>{if(!be||be.toolCallId&&h&&be.toolCallId!==h)return;let S=be.resolve;be=null,I.setPermissionPrompt(null),S(w??{outcome:{outcome:"cancelled"}})},yi=h=>{if(!be?.toolCallId)return;let w=h??{};w.sessionUpdate!=="tool_call"&&w.sessionUpdate!=="tool_call_update"||w.toolCallId===be.toolCallId&&(!w.status||w.status==="pending"||gi(w.toolCallId,void 0))},at=()=>{if(!be){I.setPermissionPrompt(null);return}I.setPermissionPrompt({title:be.title,detail:be.detail,options:be.options.map(h=>({label:h.name})),selectedIndex:be.selectedIndex})},An=h=>{if(!be)return;let{options:w,resolve:S}=be;if(be=null,I.setPermissionPrompt(null),h===null){S({outcome:{outcome:"cancelled"}});return}S({outcome:{outcome:"selected",optionId:h}})};g.onRequest("session/request_permission",async h=>{if(b)return{outcome:{outcome:"cancelled"}};if(s.dangerouslySkipPermissions)return rr(h);let w=h??{},x=(Array.isArray(w.options)?w.options:[]).map(G=>({optionId:G.optionId,name:Ae(G.name??""),...G.kind!==void 0?{kind:G.kind}:{}})),A=w.toolCall?.title??w.toolCall?.name??"tool",P=Ae(A),L=Ae(Vm(Km(h))),_=w.toolCall?.toolCallId;return x.length===0?(I.appendLines([{prefix:"\u{1F512} ",body:`Permission requested \xB7 ${P} \xB7 (no options offered, cancelling)`,bodyStyle:"tool-status-fail"}]),{outcome:{outcome:"cancelled"}}):new Promise(G=>{be={title:P,detail:L,options:x,selectedIndex:0,resolve:G,toolCallId:_},at()})}),g.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}}));let xs,wi,cr=!0,vo=!1;try{let h=await g.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}});wi=h?.agentInfo?.name,h?.agentCapabilities?.promptCapabilities?.image===!1&&(cr=!1),vo=Mt(h?._meta??void 0).prompt?.amending===!0}catch{}let ve=a.sessionId,At=a.agentId,Ke=a.cwd,Zt,Vn,lr,As,Cs,Yn,ur,en,bi,Ie;if(a.sessionId==="__new__"){let h={};s.agentId&&(h.agentId=s.agentId),s.name&&(h.title=s.name),s.model&&(h.model=s.model);let w={cwd:a.cwd,...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}},S=await Nm({request:()=>g.request("session/new",w),showBanner:(P,L,_)=>Dm(t,P,L,_,{authenticate:G=>g.request("authenticate",{methodId:G})}),resolveOnboarding:async P=>{if(P)try{return(await Qc(n)).find(G=>G.id===P)?.onboarding}catch{return}},fallbackAgentId:s.agentId});if(S.kind==="cancel")return t.grabInput(!1),m.close().catch(()=>{}),null;if(S.kind==="back"){t.grabInput(!1),m.close().catch(()=>{});let P={...s};return delete P.sessionId,delete P.forceNew,delete P.resume,delete P.agentId,P}let x=S.result;c.write(d),ve=x.sessionId,r.sessionId=ve,r.readonly=!1;let A=Mt(x._meta??void 0);A.clientId&&(Vn=A.clientId),xs=A.upstreamSessionId,A.agentId&&(At=A.agentId),A.cwd&&(Ke=A.cwd),A.title&&(Zt=A.title),lr=A.currentModel,As=A.currentMode,bi=A.currentUsage,Ie=A.turnStartedAt,A.availableCommands&&(Cs=Aa(A.availableCommands)),A.availableModes&&(Yn=A.availableModes),ur=uy(x.configOptions),en=A.queue}else{let h={};s.readonly===!0&&(h.readonly=!0),e.tui.toolContent==="references"&&(h.toolContent="references"),s.drip===!0&&(h.replayMode="drip",s.dripSpeed!==void 0&&(h.dripSpeed=s.dripSpeed)),a.resumeHint!==void 0&&(h.resume={upstreamSessionId:a.resumeHint.upstreamSessionId,agentId:a.resumeHint.agentId,cwd:a.resumeHint.cwd});let w=await g.request("session/attach",{sessionId:a.sessionId,historyPolicy:"full",clientInfo:{name:"hydra-acp-tui",version:fe},...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}});ve=w.sessionId,w.clientId&&(Vn=w.clientId),r.sessionId=ve,r.readonly=s.readonly===!0;let S=Mt(w._meta??void 0);xs=S.upstreamSessionId,S.agentId&&(At=S.agentId),S.cwd&&(Ke=S.cwd),S.title&&(Zt=S.title),lr=S.currentModel,As=S.currentMode,bi=S.currentUsage,Ie=S.turnStartedAt,S.availableCommands&&(Cs=Aa(S.availableCommands)),S.availableModes&&(Yn=S.availableModes),ur=uy(w.configOptions),en=S.queue}let tn=M.tuiHistoryFile(ve),fr=M.globalTuiHistoryFile(),Ve=await Hi(tn).catch(()=>[]),Ft=await Hi(fr).catch(()=>[]);Ft.length>e.tui.promptHistoryMaxEntries&&(Ft=Ft.slice(Ft.length-e.tui.promptHistoryMaxEntries));let Wt=[...Ve],he=new qn({history:aa(Ft,Wt)});_e=he;let vi=!1,Gn=(h,w)=>{let S=h.replace(/\n+$/,"");if(S.length===0)return;let x=(w??h).replace(/\n+$/,""),A=Ui(Ve,S),P=A!==Ve;Ve=A,Wt=Ui(Wt,x);let L=Ui(Ft,S,e.tui.promptHistoryMaxEntries),_=L!==Ft;Ft=L,he.setHistory(aa(Ft,Wt)),P&&qs(tn,Ve).catch(()=>{}),_&&tp(fr,S).catch(()=>{})};U>0&&he.setTurnRunning(!0);let ft=null,Rs=null;jg(e.tui.ambiguousWidth==="wide"),Wh(e.tui.diffContextLines);let Cn=!1,I,Ii=()=>{Cn&&(Cn=!1,I.start())},Io=()=>{Cn||(Cn=!0,I.stop(),process.kill(process.pid,"SIGTSTP"))};process.platform!=="win32"&&process.on("SIGCONT",Ii),I=new Sd({term:t,dispatcher:he,repaintThrottleMs:e.tui.repaintThrottleMs,maxScrollbackLines:e.tui.maxScrollbackLines,mouse:i.mouseEnabled,inAppSelection:i.inAppSelectionEnabled,selectionClipboard:e.tui.selectionClipboard,openFileCommand:e.tui.openFileCommand,progressIndicator:e.tui.progressIndicator,readonly:s.readonly===!0,onSuspend:process.platform!=="win32"?Io:void 0,onBlockClick:(h,w)=>{Uy(h,w)},onBlockDoubleClick:(h,w)=>Hy(h,w),onBlockVisible:h=>{By(h)},onMouse:h=>{if(h.kind!=="press"||h.button!=="middle")return;let w={type:"attachment-request",source:"primary"};s.readonly===!0&&fy(w)||ie(w)},onKey:h=>{for(let w of h){if(be&&Ed(w)||Md(w)||Ci(w)||xo(w)||Ts(w)||ki(w))continue;if(w.type==="key"&&w.name==="escape"&&I.isScrolledBack()){I.scrollToBottom();continue}if(w.type==="attachment-paths"){Ue(w.paths);continue}let S=he.feed(w);for(let x of S)s.readonly===!0&&fy(x)||ie(x)}Si(),I.setBannerSearchIndicator(he.state().historySearchQuery),I.setAttachments(he.state().attachments),I.refreshPrompt()}}),ue=I,I.setStickyBottomKey("plan");let vt=[{name:"/help",description:"Show TUI built-in commands"},{name:"/quit",description:"Exit the TUI"},{name:"/clear",description:"Clear scrollback"},{name:"/sessions",description:"List sessions"},{name:"/resume",description:"Switch sessions (open the picker)"},{name:"/session",description:"Switch session: /session <id|next|prev> (no arg opens picker)"},{name:"/rename",description:"Rename this session (alias for /hydra title): /rename [title]"},{name:"/model",description:"Switch model: /model <model-id>"},{name:"/agent",description:"Switch agent via config option: /agent <agent-id>"},{name:"/btw",description:"Run an ancillary forked session: /btw <prompt>"}],pr=Cs??[],Fe=Yn??[],nn=ur??[],So=()=>nn.find(h=>h.id==="agent"),ko=()=>{let h=new Set,w=[];for(let S of[...vt,...pr])h.has(S.name)||(h.add(S.name),w.push(S));return w},Qn=()=>{let h=he.state().buffer,w=h[0]??"";if(!w.startsWith("/"))return[];if(h.length>1)return[];let S=w.indexOf(" "),x=S===-1?w:w.slice(0,S);if(x.lastIndexOf("/")>0)return[];let A=ko().filter(P=>P.name.startsWith(x));return A.length===1&&A[0]?.name===x?[]:A},sn=[],Si=()=>{let h=Qn();if(h.length>0){sn=[],I.setCompletions(h);return}I.setCompletions(sn)},Ts=h=>{if(h.type!=="key"||h.name!=="tab")return sn.length>0&&(sn=[]),!1;let w=Qn();if(I.isOverlayOpen()&&w.length===0)return I.toggleFocusedPane(),!0;if(w.length>0){sn=[];let S=he.state().buffer[0]??"",x=Vg({matches:w.map(A=>A.name),firstLine:S});return x===null||he.replaceFirstLine(x),!0}return Es()},Es=()=>{let h=he.state(),w=h.buffer[h.row]??"",S=sy(w,h.col);if(S===null)return!1;let x=ry(S.token,Ke);return x===null?!1:(x.replacement!==S.token&&he.replaceRangeOnCurrentLine(S.start,h.col,x.replacement),sn=x.candidates.length>1?x.candidates.map(A=>({name:A})):[],!0)},ki=h=>!I.isOverlayOpen()||h.type!=="key"||h.name!=="escape"&&h.name!=="ctrl-c"?!1:(K&&(K.cancel(),K=null,J=null),I.closeBtwOverlay(),!0),xo=h=>{if(!I.isScrollbackSearchActive())return h.type==="key"&&h.name==="ctrl-r"&&I.isScrolledBack()?(I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(""),!0):!1;if(h.type==="char"){let w=I.scrollbackSearchTerm()+h.ch;return I.updateScrollbackSearchTerm(w),!0}if(h.type==="paste"){let w=I.scrollbackSearchTerm()+h.text.replace(/\n/g," ");return I.updateScrollbackSearchTerm(w),!0}if(h.type==="key")switch(h.name){case"ctrl-r":return I.advanceScrollbackSearch(),!0;case"ctrl-s":return I.retreatScrollbackSearch(),!0;case"backspace":{let w=I.scrollbackSearchTerm();return w.length===0?I.cancelScrollbackSearch():I.updateScrollbackSearchTerm(w.slice(0,-1)),!0}case"enter":return I.acceptScrollbackSearch(),!0;case"escape":case"ctrl-c":return I.cancelScrollbackSearch(),!0;default:return!0}return!0},Ed=h=>{if(!be)return!1;let w=be.options;if(h.type==="key")switch(h.name){case"up":return be.selectedIndex=Math.max(0,be.selectedIndex-1),at(),!0;case"down":return be.selectedIndex=Math.min(w.length-1,be.selectedIndex+1),at(),!0;case"enter":{let S=w[be.selectedIndex];return S&&An(S.optionId),!0}case"escape":case"ctrl-c":return An(null),!0;default:return!0}if(h.type==="char"&&/^[1-9]$/.test(h.ch)){let S=parseInt(h.ch,10)-1,x=w[S];return x&&An(x.optionId),!0}return!0},Ao=At||wi||"?",It={...bi??{}};c.finalize(),I.start({skipFullscreen:!0}),I.setHideThoughts(!i.showThoughts),I.setSessionbar({agent:Ao,cwd:Ke,sessionId:ve,title:Zt,model:lr,usage:{...It}}),As&&I.setBanner({currentMode:As}),lo().then(h=>{h&&I.notify(`\u2728 ${uo(h)}`,3e4)}).catch(()=>{});let st=null,hr=new Promise(h=>{st=h}),rn=()=>{g.notify("session/cancel",{sessionId:ve}).catch(()=>{})},on=()=>{ue!==null&&U===1&&(Y=!0,ue.setBanner({status:"cancelling",elapsedMs:void 0,stalled:!1}))},an=()=>{if(ft){ft.cancel(),on();return}if(U>0){rn(),on();return}mr()},mr=()=>{C(0)},Co=()=>{let h="enqueue prompt (sends now, or queues during a turn)",w="amend the in-flight turn (cancel + replace)";return[...i.defaultEnterAction==="amend"?[["Enter",w],["Ctrl+Enter / Shift+Enter / ^S",h]]:[["Enter",h],["Ctrl+Enter / Shift+Enter / ^S",w]],...fC]},Pd=()=>{if(I.isHelpPromptActive()){I.setHelpPrompt(null);return}I.setHelpPrompt({title:"Hotkeys",entries:Co(),hint:"any key dismisses \xB7 /help lists commands"})},Md=h=>I.isHelpPromptActive()?(h.type==="key"&&h.name==="ctrl-g",I.setHelpPrompt(null),!0):!1,Rn=["tools","plan","thoughts","diffs","mouse","enter"],Jt=0,xi=h=>{switch(h){case"tools":return i.toolsExpanded?"expanded":"collapsed";case"plan":return i.planExpanded?"expanded":"collapsed";case"thoughts":return i.showThoughts?"shown":"hidden";case"diffs":return i.showFileUpdates;case"mouse":return i.mouseEnabled?"on":"off";case"enter":return i.defaultEnterAction}},Ro=h=>{switch(h){case"tools":return"Tools";case"plan":return"Plan";case"thoughts":return"Thoughts";case"diffs":return"File updates";case"mouse":return"Mouse capture";case"enter":return"Enter key"}},To=()=>({title:"Session options",options:Rn.map(h=>({label:Ro(h),value:xi(h)})),selectedIndex:Jt}),Ai=()=>{I.isOptionsPromptActive()&&I.setOptionsPrompt(To())},Xn=()=>{if(I.isOptionsPromptActive()){I.setOptionsPrompt(null);return}Jt=0,I.setOptionsPrompt(To())},Tn=h=>{switch(h){case"tools":i.toolsExpanded=!i.toolsExpanded,_s.clear(),yr.clear(),$y();break;case"plan":i.planExpanded=!i.planExpanded,ne=null,Ge();break;case"thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts);break;case"diffs":i.showFileUpdates=i.showFileUpdates==="diff"?"edit":"diff",Mn.clear(),Ny();break;case"mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w;break}case"enter":i.defaultEnterAction=i.defaultEnterAction==="amend"?"enqueue":"amend";break}Ai()},Ct=h=>{(async()=>{try{switch(h){case"tools":case"plan":I.notify(`${Ro(h)} is session-only \u2014 not saved`);return;case"thoughts":await Ei("showThoughts",i.showThoughts);break;case"diffs":await Ei("showFileUpdates",i.showFileUpdates);break;case"mouse":await Ei("mouse",i.mouseEnabled);break;case"enter":await Ei("defaultEnterAction",i.defaultEnterAction);break}I.notify(`saved default: ${Ro(h)} ${xi(h)}`)}catch(w){I.notify(`save failed: ${w instanceof Error?w.message:String(w)}`)}})()},Ci=h=>{if(!I.isOptionsPromptActive())return!1;if(h.type==="key")switch(h.name){case"up":return Jt=Math.max(0,Jt-1),Ai(),!0;case"down":return Jt=Math.min(Rn.length-1,Jt+1),Ai(),!0;case"enter":{let w=Rn[Jt];return w&&Tn(w),!0}case"ctrl-o":case"escape":case"ctrl-c":return I.setOptionsPrompt(null),!0;case"ctrl-d":return I.setOptionsPrompt(null),!1;default:return!0}if(h.type==="char"){if(/^[1-9]$/.test(h.ch)){let w=parseInt(h.ch,10)-1,S=Rn[w];return S&&(Jt=w,Tn(S)),!0}if(h.ch==="s"||h.ch==="S"){let w=Rn[Jt];return w&&Ct(w),!0}}return!0},gr=()=>{b=!0,K?(K.cancel(),K=null,J=null):J!==null&&(vn(n,J).catch(()=>{}),J=null),process.off("SIGINT",an),process.platform!=="win32"&&process.off("SIGCONT",Ii),ee!==null&&(clearInterval(ee),ee=null);for(let h of nt.values())clearTimeout(h);nt.clear(),I.clearWindowTitle(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{}),m.close().catch(()=>{})},C=(h=0)=>{gr(),st&&(st(null),st=null),h!==0&&process.exit(h)},E=async()=>{if(!st)return;K?(K.cancel(),K=null,J=null):J!==null&&(vn(n,J).catch(()=>{}),J=null);let h=he.state().buffer.join(`
161
- `);h.replace(/\s+$/,"").length>0&&Gn(h),I.pauseRepaint(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{});let w=null,S=null;for(;w===null;){let L=await bn(n,{includeNonInteractive:!0}),_=await eu(t,{cwd:Ke,sessions:L,config:e,target:n,currentSessionId:ve,prefs:o});if(_.kind==="abort"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(_.kind==="exit"){C(0);return}if(_.kind==="new"){w={choice:_,sessions:L};break}if(_.kind==="fork"){let le=await yy(t,n,_,L);if(le.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(le.kind==="back")continue;w={choice:{kind:"attach",sessionId:le.ctx.sessionId,...le.ctx.agentId?{agentId:le.ctx.agentId}:{}},sessions:L},S={readonly:!1,cwd:le.ctx.cwd},le.ctx.resumeHint!==void 0&&(S.resumeHint=le.ctx.resumeHint);break}let G=L.find(le=>le.sessionId===_.sessionId);if(!(G!==void 0&&!!G.importedFromMachine&&!G.upstreamSessionId&&_.readonly!==!0)){if(n.isLocal&&G&&!G.importedFromMachine&&_.readonly!==!0&&!(await po(G.cwd)).ok){let Pe=await ar(t,G,{defaultCwd:Nt(e.defaultCwd),title:"Working directory missing \u2014 choose cwd",intro:"This session's working directory no longer exists. Pick a new one:"});if(Pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(Pe.kind==="back")continue;w={choice:_,sessions:L},S={readonly:!1,cwd:Pe.path,resumeHint:{agentId:_.agentId??G.agentId??"",cwd:Pe.path,upstreamSessionId:""}};break}w={choice:_,sessions:L};break}let Ee={...s,readonly:!1},pe=await gy(t,G,_,Ee);if(pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}pe.kind!=="back"&&(w={choice:_,sessions:L},S={readonly:Ee.readonly===!0,cwd:pe.ctx.cwd},pe.ctx.resumeHint!==void 0&&(S.resumeHint=pe.ctx.resumeHint))}let{choice:x}=w,A=st;if(st=null,process.off("SIGINT",an),m.close().catch(()=>{}),x.kind==="new"){let{sessionId:L,..._}=s,G={..._,cwd:x.cwd??Ke,forceNew:!0,readonly:!1};x.prompt!==void 0&&(G.initialPrompt=x.prompt),A(G);return}if(x.kind!=="attach")return;let P={...s,sessionId:x.sessionId,cwd:S?.cwd??Ke,readonly:S?.readonly??x.readonly===!0};x.agentId!==void 0&&(P.agentId=x.agentId),S?.resumeHint!==void 0?P.resumeHint=S.resumeHint:delete P.resumeHint,A(P)},$=async(h="next")=>{if(!st)return;let S=(await bn(n)).filter(Ee=>Ee.status==="live");if(S.length<=1)return;let x=S.findIndex(Ee=>Ee.sessionId===ve),L=((x===-1?0:x)+(h==="prev"?-1:1)+S.length)%S.length,_=S[L],G=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let Le={...s,sessionId:_.sessionId,cwd:Ke,readonly:!1};_.agentId!==void 0&&(Le.agentId=_.agentId),G(Le)},X=async h=>{if(!st)return;let w=await bn(n,{includeNonInteractive:!0}),S=h.trim();if(!S){I.notify("usage: /session <id|next|prev>");return}let x=S.startsWith(Ht)?[S]:[S,Ht+S],A=w.find(_=>x.includes(_.sessionId));if(!A){let _=w.filter(G=>x.some(Le=>G.sessionId.startsWith(Le)));if(_.length===1)A=_[0];else if(_.length>1){I.notify(`ambiguous session id: ${S} (${_.length} matches)`);return}}if(!A){I.notify(`no session matches: ${S}`);return}if(A.sessionId===ve){I.notify("already on that session");return}let P=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let L={...s,sessionId:A.sessionId,cwd:A.cwd??Ke,readonly:A.status!=="live"};A.agentId!==void 0&&(L.agentId=A.agentId),delete L.resumeHint,P(L)},ie=h=>{switch(h.type){case"send":i.defaultEnterAction==="amend"?En(h.text,h.attachments,h.displayText):Ms(h.text,h.attachments,h.displayText);return;case"amend":i.defaultEnterAction==="amend"?Ms(h.text,h.attachments,h.displayText):En(h.text,h.attachments,h.displayText);return;case"queue-edit":{let w=Ps(h.index);if(!w)return;let S=[];h.text.length>0&&S.push({type:"text",text:h.text});for(let x of h.attachments)S.push({type:"image",data:x.data,mimeType:x.mimeType});g.request("hydra-acp/prompt/update",{sessionId:ve,messageId:w,prompt:S}).then(x=>{let A=x;!A.updated&&A.reason!=="ok"&&I.notify(`queue edit skipped (${A.reason})`)}).catch(x=>{I.notify(`queue edit failed: ${x.message}`)});return}case"queue-remove":{let w=Ps(h.index);if(!w)return;g.request("hydra-acp/prompt/cancel",{sessionId:ve,messageId:w}).then(S=>{let x=S;!x.cancelled&&x.reason!=="ok"&&I.notify(`queue cancel skipped (${x.reason})`)}).catch(S=>{I.notify(`queue cancel failed: ${S.message}`)});return}case"cancel":{if(I.isOverlayOpen()){K&&(K.cancel(),K=null,J=null),I.closeBtwOverlay();return}if(h.prefill&&ft){let w=pt.size===0,S=he.state().buffer.every(x=>x==="");w&&S&&(Rs={text:ft.text,attachments:ft.attachments})}ft?ft.cancel():U>0&&rn(),on();return}case"exit":mr();return;case"plan-toggle":Eo(h.on);return;case"redraw-banner":I.setBanner({});return;case"redraw":I.fullRedraw();return;case"scroll-to-top":I.scrollToTop();return;case"scroll-to-bottom":I.scrollToBottom();return;case"switch-session":E().catch(()=>{});return;case"next-live-session":$().catch(()=>{});return;case"toggle-options":Xn();return;case"toggle-thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts),I.notify(i.showThoughts?"thoughts shown":"thoughts hidden");return;case"toggle-mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w,I.notify(w?"mouse capture on \u2014 wheel scrolls; shift+drag to select text":"mouse capture off \u2014 click-drag selects text; PgUp/PgDn scrolls");return}case"show-help":Pd();return;case"escalate-search":I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(h.query);return;case"attachment-request":xe(h.source);return}},Ue=async h=>{if(!cr){I.notify("agent does not accept image attachments");return}let w=0;for(let S of h){if(S.startsWith("data:")){let A=_l(S);if(!A){I.notify("unsupported data: URI");continue}if(A.sizeBytes>Sn){I.notify(`image too large (${qt(A.sizeBytes)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:A.mimeType,data:A.data,name:"pasted image",sizeBytes:A.sizeBytes}),w++;continue}let x=ho(S);if(!x){I.notify(`unsupported image type: ${bo.basename(S)}`);continue}try{let A=await lC.readFile(S);if(A.length>Sn){I.notify(`image too large (${qt(A.length)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:x,data:A.toString("base64"),name:bo.basename(S),sizeBytes:A.length}),w++}catch(A){I.notify(`cannot read ${bo.basename(S)}: ${A.message}`)}}w>0&&(I.setAttachments(he.state().attachments),I.refreshPrompt())},xe=async(h="clipboard")=>{let w=h==="primary"?await Tg():await Rg();if(!w.ok){I.notify(w.reason);return}if(w.kind==="image"){if(!cr){I.notify("agent does not accept image attachments");return}he.addAttachment(w.attachment),I.setAttachments(he.state().attachments),I.refreshPrompt();return}let S=he.feed({type:"paste",text:w.text});for(let x of S)ie(x);I.refreshPrompt()},Rt=h=>h.attachmentCount>0?`${h.text} \xB7 \u{1F4CE}\xD7${h.attachmentCount}`:h.text,St=(h,w)=>{let S=Array.isArray(w)?w:[],x="",A=0;for(let P of S){if(!P||typeof P!="object")continue;let L=P;L.type==="text"&&typeof L.text=="string"?x+=L.text:L.type==="image"&&(A+=1)}return{messageId:h,text:Ae(x),attachmentCount:A}},pt=new Map,Tt=[],dn=new Map,rt=new Set,ht=null,Ye=()=>{let h=[...pt.values()],w=h.map(Rt);I.setQueuedPrompts(w),I.setBanner({queued:h.length}),he.setQueue(h.map(S=>S.text))},Ps=h=>[...pt.values()][h]?.messageId;if(en&&en.length>0){for(let h of en){if(h.position===0){te=h.messageId;continue}pt.set(h.messageId,St(h.messageId,h.prompt))}pt.size>0&&Ye()}let Ms=(h,w,S)=>{I.scrollToBottom(),!Zn(h)&&(Gn(h,S),Ri(h,w,S))},En=(h,w,S)=>{if(I.scrollToBottom(),Zn(h))return;if(Gn(h,S),!vo||te===void 0){Ri(h,w,S);return}let x=te,A=[];h.length>0&&A.push({type:"text",text:h});for(let _ of w)A.push({type:"image",data:_.data,mimeType:_.mimeType});let P={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(P);let L=()=>{let _=Tt.indexOf(P);_>=0&&Tt.splice(_,1),P.messageId!==void 0&&dn.delete(P.messageId)};g.request("hydra-acp/prompt/amend",{sessionId:ve,targetMessageId:x,prompt:A}).then(_=>{let G=_;if(G.amended&&G.reason==="ok"){j(1);return}if(L(),G.reason==="target_completed"){I.notify("previous response finished \u2014 press Enter to send as a new turn"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_cancelled"){I.notify("amend skipped \u2014 previous turn was cancelled"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_not_found"){I.notify("amend skipped \u2014 no matching prompt"),he.setBuffer(h,w),I.refreshPrompt();return}}).catch(_=>{L(),I.notify(`amend failed: ${_.message}`),he.setBuffer(h,w),I.refreshPrompt()})},Eo=async h=>{if(Fe.length===0){I.notify("no modes advertised by agent");return}let w=I.currentModeId(),S=Fe.findIndex(P=>P.id===w),x=S===-1?0:(S+1)%Fe.length,A=Fe[x]?.id;if(A){I.setBanner({currentMode:A});try{await g.request("session/set_mode",{sessionId:ve,modeId:A})}catch(P){I.notify(`set_mode failed: ${P.message}`)}}},Zn=h=>{let w=h.replace(/\s+$/,"");if(!w.startsWith("/")||w.includes(`
162
- `))return!1;let S=w.indexOf(" ");switch(S===-1?w:w.slice(0,S)){case"/quit":case"/exit":return mr(),!0;case"/clear":return et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null,Pn.clear(),Mn.clear(),$n.clear(),_s.clear(),On.clear(),Os.clear(),I.clearScrollback(),!0;case"/help":{let A=[{prefix:" ",body:"Built-in commands:",bodyStyle:"system"}];for(let P of vt)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"});if(pr.length>0){A.push({prefix:" ",body:"Agent commands:",bodyStyle:"system"});for(let P of pr)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"})}return I.appendLines(A),!0}case"/agent":{let A=S===-1?"":w.slice(S+1).trim(),P=So();if(!P)return I.appendLines([{prefix:" ",body:"no agent config option advertised for this session",bodyStyle:"info"}]),!0;if(!A){let L=[{prefix:" ",body:"Available agents:",bodyStyle:"system"}];for(let _ of P.options){let G=_.value===P.currentValue?"* ":" ";L.push({prefix:" ",body:`${G}${_.value.padEnd(16)} ${_.name}`,bodyStyle:"info"})}return I.appendLines(L),!0}return P.options.some(L=>L.value===A)?A===P.currentValue?(I.notify(`already on agent ${A}`),!0):(I.notify(`switching to ${A}\u2026`),g.request("session/set_config_option",{sessionId:ve,configId:"agent",value:A}).catch(L=>{I.notify(`set_config_option failed: ${L.message}`)}),!0):(I.notify(`unknown agent: ${A}`),!0)}case"/sessions":return I.appendLines([{prefix:" ",body:"Run `hydra-acp sessions` (or `hydra sessions`) for the full list.",bodyStyle:"info"}]),!0;case"/resume":return E().catch(()=>{}),!0;case"/session":{let A=S===-1?"":w.slice(S+1).trim();return A?A==="next"||A==="prev"?($(A).catch(P=>{I.notify(`session ${A} failed: ${P.message}`)}),!0):(X(A).catch(P=>{I.notify(`session switch failed: ${P.message}`)}),!0):(E().catch(()=>{}),!0)}case"/rename":{let A=S===-1?"":w.slice(S+1).trim(),P=A.length>0?`/hydra title ${A}`:"/hydra title";return Gn(w,w),Ri(P,[],w),!0}case"/btw":{let A=S===-1?"":w.slice(S+1).trim();if(!A)return I.appendLines([{prefix:" ",body:"/btw requires a prompt",bodyStyle:"info"}]),!0;if(ve==="__new__")return I.appendLines([{prefix:" ",body:"no active session to fork",bodyStyle:"info"}]),!0;F+=1;let P=F;K&&(K.cancel(),K=null);let L=null;J!==null&&!W?L=J:J!==null&&(vn(n,J).catch(()=>{}),J=null),W=!1,I.openBtwOverlay(),I.setBtwOverlayStatus({label:"busy",style:"busy"});let _=new pd({getMaxWidth:()=>{let pe=I.width();return pe>0?pe:void 0}});_.on("changed",()=>{I.setBtwOverlayContent(_.getLines())});let G={};_.append({sessionUpdate:"prompt_received",prompt:[{type:"text",text:A}]});let Le=pe=>{_.append({sessionUpdate:"agent_message_chunk",content:{type:"text",text:pe}})},Ee={};return L!==null&&(Ee.reuseSessionId=L),yg(n,ve,A,Ee).then(pe=>{if(P!==F){pe.cancel();return}K=pe,J=pe.sessionId,I.setBtwOverlayMeta({sessionId:pe.sessionId}),pe.on("event",le=>{if(P===F)if(le.kind==="update"){_.append(le.update);let Pe=yn(le.update);if(Pe&&Pe.kind==="usage-update"){let Ls=!1;Pe.used!==void 0&&G.used!==Pe.used&&(G.used=Pe.used,Ls=!0),Pe.size!==void 0&&G.size!==Pe.size&&(G.size=Pe.size,Ls=!0),Pe.costAmount!==void 0&&G.costAmount!==Pe.costAmount&&(G.costAmount=Pe.costAmount,Ls=!0),Pe.costCurrency!==void 0&&G.costCurrency!==Pe.costCurrency&&(G.costCurrency=Pe.costCurrency,Ls=!0),Ls&&I.setBtwOverlayMeta({usage:{...G}})}}else le.kind==="completed"?(I.setBtwOverlayStatus({label:"done",style:"done"}),K=null):le.kind==="cancelled"?(I.setBtwOverlayStatus({label:"cancelled",style:"cancelled"}),K=null,J=null):le.kind==="errored"&&(I.setBtwOverlayStatus({label:"errored",style:"errored"}),Le(`btw errored: ${le.error.message}`),J!==null&&vn(n,J).catch(()=>{}),K=null,J=null)})}).catch(pe=>{if(P!==F)return;let le=pe instanceof Error?pe.message:String(pe);I.setBtwOverlayStatus({label:"errored",style:"errored"}),Le(`btw startup failed: ${le}`),I.appendLines([{prefix:" ",body:`btw startup failed: ${le}`,bodyStyle:"tool-status-fail"}])}),!0}default:return!1}},Ri=async(h,w,S)=>{let x=[];h.length>0&&x.push({type:"text",text:h});for(let Ee of w)x.push({type:"image",data:Ee.data,mimeType:Ee.mimeType});j(1);let A={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(A),xn=!1;let P=!1,L=null,_=Ee=>{typeof ue<"u"&&ue!==null&&ue.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:Ee,bodyStyle:"tool-status-fail"}])},G=!1;ft={text:h,attachments:w,cancel:()=>{if(xn){xn=!1,G=!0,_("force-stopping agent \u2014 turn aborted; resumes on your next message\u2026"),g.request("hydra-acp/session/force_cancel",{sessionId:ve}).catch(pe=>{_(`force-stop failed: ${pe.message}`)});return}if(P)return;P=!0,g.notify("session/cancel",{sessionId:ve}).catch(()=>{});let Ee=Date.now();L=setTimeout(()=>{ft!==null&&(Kn>=Ee||(xn=!0,_("cancel not acknowledged by agent \u2014 the turn is still running. Cancel again to force-stop (restarts the agent).")))},dr)}};let Le;try{let Ee=await g.request("session/prompt",{sessionId:ve,prompt:x});Ee&&typeof Ee.stopReason=="string"&&(Le=Ee.stopReason)}catch(Ee){let pe=Tt.indexOf(A);pe>=0&&Tt.splice(pe,1),A.messageId!==void 0&&dn.delete(A.messageId),G?I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"turn force-stopped",bodyStyle:"tool-status-fail"}]):I.appendLines([{prefix:"\u2717 ",prefixStyle:"tool-status-fail",body:Ee.message,bodyStyle:"tool-status-fail"}])}finally{if(ft=null,L!==null&&(clearTimeout(L),L=null),j(-1),A.flushed&&ht===A){let Ee=A.messageId!==void 0&&rt.has(A.messageId);Ee&&A.messageId!==void 0&&rt.delete(A.messageId);let pe={kind:"turn-complete"};Le!==void 0&&(pe.stopReason=Le),Ee&&(pe.amended=!0),R(pe),ht=null}if(Rs!==null){let{text:Ee,attachments:pe}=Rs;Rs=null,he.state().buffer.every(Pe=>Pe==="")&&(he.setBuffer(Ee,pe),I.refreshPrompt())}}},et=new Map,Pn=new Map,Mn=new Map,es=new Map,_n=[],it=0,zt=`tools:${it}`,$n=new Map,_s=new Map,yr=new Set,$s=new Map,On=new Map,Os=new Map,T=null,B=null,ae=null,O=null,ne=null,ce=e.tui.maxToolItems,Te=e.tui.maxPlanItems,Ne=()=>({maxPlanItems:ne??i.planExpanded?1/0:Te}),Ge=()=>{if(O===null)return;let h=ms(O,Ne());h.length>0&&I.upsertLines("plan",[{body:""},...h])},mt="",Me=null,Lt=0,_d=()=>{if(Me===null)return;let h=I.width(),w=gs(mt,h>0?{maxWidth:h}:void 0);w.length!==0&&I.upsertLines(Me,w)},Ty=h=>{h.length!==0&&(Me===null&&(I.ensureSeparator(),Me=`agent:${Lt}`,Lt+=1,mt=""),mt+=h,_d())},ts=()=>{Me=null,mt=""},wr="",Fs=null,ru=0,Ey=()=>({prefix:" ",body:"\u25B8 Thoughts",bodyStyle:"thought"}),Py=()=>{if(Fs===null||wr.length===0)return;let h=ti(wr);h.length!==0&&I.upsertLines(Fs,h)},My=h=>{let w=On.get(h);if(w===void 0)return[];let S=ti(w.text);return w.workerTaskId&&S.unshift({prefix:" ",body:`[T${w.workerTaskId}] `,bodyStyle:"dim"}),S},_y=(h,w)=>{h.length!==0&&(Fs===null&&(I.ensureSeparator("thought"),Fs=`thought:${ru}`,ru+=1,wr=""),wr+=h,On.set(Fs,{text:wr,workerTaskId:w}),Py())},ns=()=>{Fs=null,wr=""},iu=h=>hC({...h,collapsedLimit:ce}),ou=h=>_s.get(h)??i.toolsExpanded,Kt=()=>{if(T===null)return;let{lines:h,rowOwners:w}=iu({order:_n,states:et,startedAt:T,endedAt:B,stopReason:ae,expanded:ou(zt),perToolExpanded:yr});I.upsertLines(zt,h),$s.set(zt,w)},Po=h=>{let w=$n.get(h);if(!w)return;let{lines:S,rowOwners:x}=iu({order:w.order,states:w.states,startedAt:w.startedAt,endedAt:w.endedAt,stopReason:w.stopReason,expanded:ou(h),perToolExpanded:yr});I.upsertLines(h,S),$s.set(h,x)},$y=()=>{T!==null&&!$n.has(zt)&&Kt();for(let h of $n.keys())Po(h)},$d=()=>{T!==null&&$n.set(zt,{order:[..._n],states:new Map(et),startedAt:T,endedAt:B??Date.now(),stopReason:ae,rowOwners:$s.get(zt)??[]})},au=()=>{it+=1,zt=`tools:${it}`,T=Date.now(),B=null,ae=null,Kt()};function Oy(h){if(!h||typeof h!="object")return null;let w=h,S=Array.isArray(w.content)?w.content:void 0;if(!S)return null;let x=[],A=P=>{if(typeof P=="string"){x.push({text:Qe(P)});return}if(P&&typeof P=="object"){let L=P;typeof L.__hydraBlob=="string"&&x.push({hash:L.__hydraBlob})}};for(let P of S){if(!P||typeof P!="object")continue;let L=P;if(L.type==="content"&&L.content&&typeof L.content=="object"){let _=L.content;if(_.text!==void 0){A(_.text);continue}}if(L.type==="text"&&L.text!==void 0){A(L.text);continue}L.text!==void 0&&A(L.text)}return x.length>0?x:null}let du=(h,w)=>{let S=w.map(P=>"text"in P?P.text:"").join(`
163
- `);if(S.length===0)return;let{text:x,truncated:A}=Uh(S);h.resultText=x,h.resultTruncated=A},Mo=new Set,Fy=(h,w)=>{!w.some(x=>"hash"in x)||Mo.has(h)||(Mo.add(h),(async()=>{let x=await Promise.all(w.map(async P=>"text"in P?P:{text:await Od(P.hash)??""}));Mo.delete(h);let A=et.get(h);if(!A)for(let P of $n.values()){let L=P.states.get(h);if(L){A=L;break}}if(A){du(A,x),et.has(h)&&Kt();for(let[P,L]of $n)L.states.has(h)&&Po(P);I.repaintNow()}})().catch(()=>{Mo.delete(h)}))},cu=(h,w,S,x,A,P,L,_,G,Le)=>{let Ee=!et.has(h),pe=et.get(h),le=pe??{initialTitle:w??"tool",latestTitle:w??"tool",status:S??"pending",startedAt:Date.now()};if(!pe&&G!==void 0&&(le.workerTaskId=G),pe&&w!==void 0&&(le.latestTitle=w),P!==void 0&&le.detail===void 0&&(le.detail=P),L!==void 0&&le.detailFull===void 0&&(le.detailFull=L),_!==void 0&&_.length>0&&(le.locations=_),pe&&S!==void 0&&(le.status=S),pe||(le.status=S??"pending"),le.endedAt===void 0&&Kh(le.status)&&(le.endedAt=Date.now()),x!==void 0&&(le.errorText=x),A!==void 0&&(le.editDiff=A),Le!==void 0){let Pe=Oy(Le);Pe!==null&&(du(le,Pe),Pe.some(Ls=>"hash"in Ls)&&Fy(h,Pe))}et.set(h,le),Ee&&(T===null&&(it+=1,zt=`tools:${it}`,T=Date.now(),B=null,ae=null),_n.push(h))},Od=async h=>{try{let w=await g.request("hydra-acp/session/tool_content",{sessionId:ve,hash:h});return typeof w?.content=="string"?w.content:null}catch{return null}},_o=new Set,Ly=(h,w)=>{_o.has(h)||w.oldRef===void 0&&w.newRef===void 0||(_o.add(h),(async()=>{let[S,x]=await Promise.all([w.oldRef?Od(w.oldRef.hash):Promise.resolve(w.oldText),w.newRef?Od(w.newRef.hash):Promise.resolve(w.newText)]);if(w.oldRef!==void 0&&S===null||w.newRef!==void 0&&x===null){_o.delete(h);let Le=il(w,"diff",{deferredStatus:"error"});Le.length>0&&(I.upsertLines(`editdiff:${h}`,Le),I.repaintNow());return}let P={...w.path!==void 0?{path:w.path}:{},oldText:S??"",newText:x??""};Pn.set(h,P);let L=et.get(h);L?.editDiff&&(L.editDiff=P),_o.delete(h);let _=Mn.get(h),G=_===void 0?i.showFileUpdates:_?"diff":"edit";G!=="none"&&($o(h,P,G==="diff"?"diff":"edit"),I.repaintNow())})())},$o=(h,w,S)=>{let x=`editdiff:${h}`,A=il(w,S);if(A.length===0){I.removeKey(x);return}I.upsertLines(x,A),S==="diff"&&(w.oldRef!==void 0||w.newRef!==void 0)&&I.notifyWhenVisible(x)},By=h=>{if(!h.startsWith("editdiff:"))return;let w=h.slice(9),S=Pn.get(w);S&&(S.oldRef!==void 0||S.newRef!==void 0)&&Ly(w,S)},lu=h=>{let w=`editdiff:${h}`,S=i.showFileUpdates,x=et.get(h),A;if(S==="none"||!x?.editDiff||x.status!=="completed")A=null;else{let L=Mn.get(h);A=L!==void 0?L?"diff":"edit":S==="diff"?"diff":"edit"}if(A===null){I.removeKey(w);return}let P=x.editDiff;Pn.set(h,P),$o(h,P,A)},Ny=()=>{let h=i.showFileUpdates;for(let[w,S]of Pn){let x=`editdiff:${w}`,A=Mn.get(w),P=A===void 0?h:A?"diff":"edit";if(P==="none"){I.removeKey(x);continue}$o(w,S,P==="diff"?"diff":"edit")}},Dy=h=>{if(!h.path)return null;let w=Qe(h.oldText).split(`
160
+ `)}}function hC(t){let{order:e,states:n,startedAt:s,endedAt:r,stopReason:i,perToolExpanded:o,collapsedLimit:a=20}=t,d=e.length,c=a>0,l=!c||t.expanded?e:e.slice(Math.max(0,d-a)),f=d-l.length,u=r===null,p=r??Date.now(),m=p-s,g=!u&&i!==null&&i!=="end_turn"?i:null,y=g==="amended",v=y?`amended \xB7 ${In(m)}`:`stopped (${g}) \xB7 ${In(m)}`,b;if(d===0)g!==null?b=v:b=u?`thinking \xB7 ${In(m)}`:`thought \xB7 ${In(m)}`;else{let W=d===1?"tool":"tools",O=g!==null?v:u?In(m):`took ${In(m)}`,U=[`${d} ${W}`,O];u&&c&&f>0&&U.push(`${f} hidden`),b=U.join(" \xB7 ")}let k=d===0&&u,R=y?"tool-status-cancelled":"tool-status-fail",K=[{prefix:"\u2699 ",prefixStyle:k?"tool-status-running":g!==null?R:"tool",body:b,bodyStyle:k?"tool-status-running":g!==null?R:"dim"}],z=[null];for(let W of l){let O=n.get(W);if(O){let U=ro(O,p);if(K.push(...U),z.push(...U.map(()=>W)),o?.has(W)){let V=jh(O);K.push(...V),z.push(...V.map(()=>W))}}}return{lines:K,rowOwners:z}}async function mC(t,e,n,s,r,i,o){let a=await gC(t,e,n,s,o);if(!a)return t.grabInput(!1),null;let d=a.sessionId==="__new__"?"Starting new session\u2026":"Resuming session\u2026",c=bC(t,d);c.write(d);let l=n.wsUrl,f=["acp.v1",`hydra-acp-token.${n.token}`],u=null,p=null,m=new li({url:l,subprotocols:f,onConnect:async h=>{h||u&&await u()},onDisconnect:h=>{p&&p(h)},log:()=>{}}),g=new kt(m);await m.start(),g.onNotification(Yo,h=>{let w=gf.safeParse(h);w.success&&c.applyProgress(w.data)});let y=[],v=null,b=!1,k=!1,R=(h,w)=>{h&&(v?v(h,w):y.push({event:h,rawUpdate:w}))},H,q=h=>{h!==H&&(H=h,h!==void 0&&I.appendLines([{prefix:" ",body:`\u2500\u2500 T${h} \u2500\u2500`,bodyStyle:"dim"}]))},K=null,z=null,W=!1,O=0,U=0,V=!1,se,Z=null,ne=null,Q=null,ue=()=>setInterval(()=>{if(Z===null||de===null)return;let h=Q===null?0:Date.now()-Q;de.setBanner({elapsedMs:Date.now()-Z,stalled:h>=uC}),Kt()},1e3),Je=!1,j=h=>{let w=U;U=Math.max(0,U+h);let S=typeof de<"u"&&de!==null;w===0&&U>0?(V=!1,Z=Date.now(),Q=Date.now(),_e?.setTurnRunning(!0),S&&de.setBanner({status:"busy",elapsedMs:0,stalled:!1}),ne===null&&S&&(ne=ue())):w>0&&U===0?(V=!1,Z=null,Q=null,_e?.setTurnRunning(!1),ne!==null&&(clearInterval(ne),ne=null),S&&de.setBanner({status:"ready",elapsedMs:void 0,stalled:!1})):U>0&&V&&(V=!1,S&&de.setBanner({status:"busy",stalled:!1}))},de=null,_e=null,$e,kn=null,ks=new Set(["session_info_update","current_model_update","current_mode_update","available_commands_update","available_modes_update","usage_update","config_option_update"]),Ot=h=>{let{update:w}=h??{},S=yn(w,{cwd:Ke});yC(w,S),Q=Date.now();let x=w?.sessionUpdate;if(typeof x=="string"&&!ks.has(x)){let A=w??{};typeof A.messageId=="string"&&($e=A.messageId)}if(x==="prompt_received"?j(1):S?.kind==="turn-complete"&&(j(-1),W=!0),x==="permission_resolved"){mi(w);return}R(S,w),yi(w)};g.onNotification("session/update",h=>{if(!b){if(kn!==null){kn.push(h);return}Ot(h)}}),g.onNotification("hydra-acp/session/closed",()=>{if(b)return;U>0&&j(-U),typeof de<"u"&&de!==null&&de.setBanner({status:"cold",elapsedMs:void 0})});let nt=new Map,zn=200,Kn=0,xn=!1,dr=4e3;g.onNotification("hydra-acp/prompt_queue/added",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;if(typeof w._meta?.["hydra-acp"]?.amending=="string"){let x=w.messageId,A=w.prompt,P=setTimeout(()=>{b||(nt.delete(x),pt.set(x,St(x,A)),de&&_e&&Ye())},zn);nt.set(x,P)}else pt.set(w.messageId,St(w.messageId,w.prompt)),de&&_e&&Ye();if(Vn!==void 0&&w.originator?.clientId===Vn){let x=Tt.shift();x&&(x.messageId=w.messageId,dn.set(w.messageId,x))}}),g.onNotification("hydra-acp/prompt_queue/updated",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string"||!pt.has(w.messageId))return;pt.set(w.messageId,St(w.messageId,w.prompt));let S=dn.get(w.messageId);if(S){let x=Array.isArray(w.prompt)?w.prompt:[],A="",P=[];for(let L of x){if(!L||typeof L!="object")continue;let _=L;_.type==="text"&&typeof _.text=="string"?A+=_.text:_.type==="image"&&typeof _.data=="string"&&typeof _.mimeType=="string"&&P.push({data:_.data,mimeType:_.mimeType,sizeBytes:Math.floor(_.data.length*3/4)})}S.text=A,S.attachments=P}de&&_e&&Ye()}),g.onNotification("hydra-acp/prompt_queue/removed",h=>{if(b)return;let w=h??{};if(typeof w.messageId!="string")return;w.reason==="started"&&(se=w.messageId);let S=nt.get(w.messageId);S!==void 0&&(clearTimeout(S),nt.delete(w.messageId)),pt.delete(w.messageId)&&de&&_e&&Ye();let A=dn.get(w.messageId);A&&(dn.delete(w.messageId),w.reason==="started"&&(A.flushed=!0,R({kind:"user-text",text:A.displayText,attachments:A.attachments}),ht=A))}),g.onNotification("hydra-acp/cancel_failed",h=>{if(b)return;let w=h??{};if(!(typeof de<"u"&&de!==null))return;Kn=Date.now(),xn=!0;let x=typeof w.code=="number"?` (${w.code})`:"",A=typeof w.message=="string"&&w.message.length>0?`: ${w.message}`:"";de.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`cancel rejected by agent${x}${A} \u2014 this agent build may not support cancellation. Cancel again to force-stop (restarts the agent).`,bodyStyle:"tool-status-fail"}])}),g.onNotification("hydra-acp/prompt/amended",h=>{if(b)return;let w=h??{};if(typeof w.cancelledMessageId!="string")return;let S=w.cancelledMessageId;rt.add(S),ht!==null&&ht.messageId!==void 0&&ht.messageId===S&&(R({kind:"turn-complete",stopReason:"cancelled",amended:!0}),ht=null,rt.delete(S))});let mi=h=>{let w=h??{},S=typeof w.toolCallId=="string"?w.toolCallId:void 0,x;w.outcome&&typeof w.outcome=="object"?x=w.outcome:typeof w.chosenOptionId=="string"&&(x={kind:"selected",optionId:w.chosenOptionId}),gi(S,x?{outcome:x}:void 0)},be=null,gi=(h,w)=>{if(!be||be.toolCallId&&h&&be.toolCallId!==h)return;let S=be.resolve;be=null,I.setPermissionPrompt(null),S(w??{outcome:{outcome:"cancelled"}})},yi=h=>{if(!be?.toolCallId)return;let w=h??{};w.sessionUpdate!=="tool_call"&&w.sessionUpdate!=="tool_call_update"||w.toolCallId===be.toolCallId&&(!w.status||w.status==="pending"||gi(w.toolCallId,void 0))},at=()=>{if(!be){I.setPermissionPrompt(null);return}I.setPermissionPrompt({title:be.title,detail:be.detail,options:be.options.map(h=>({label:h.name})),selectedIndex:be.selectedIndex})},An=h=>{if(!be)return;let{options:w,resolve:S}=be;if(be=null,I.setPermissionPrompt(null),h===null){S({outcome:{outcome:"cancelled"}});return}S({outcome:{outcome:"selected",optionId:h}})};g.onRequest("session/request_permission",async h=>{if(b)return{outcome:{outcome:"cancelled"}};if(s.dangerouslySkipPermissions)return rr(h);let w=h??{},x=(Array.isArray(w.options)?w.options:[]).map(G=>({optionId:G.optionId,name:xe(G.name??""),...G.kind!==void 0?{kind:G.kind}:{}})),A=w.toolCall?.title??w.toolCall?.name??"tool",P=xe(A),L=xe(Vm(Km(h))),_=w.toolCall?.toolCallId;return x.length===0?(I.appendLines([{prefix:"\u{1F512} ",body:`Permission requested \xB7 ${P} \xB7 (no options offered, cancelling)`,bodyStyle:"tool-status-fail"}]),{outcome:{outcome:"cancelled"}}):new Promise(G=>{be={title:P,detail:L,options:x,selectedIndex:0,resolve:G,toolCallId:_},at()})}),g.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}}));let xs,wi,cr=!0,vo=!1;try{let h=await g.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}});wi=h?.agentInfo?.name,h?.agentCapabilities?.promptCapabilities?.image===!1&&(cr=!1),vo=Mt(h?._meta??void 0).prompt?.amending===!0}catch{}let ve=a.sessionId,At=a.agentId,Ke=a.cwd,Zt,Vn,lr,As,Cs,Yn,ur,en,bi,Ie;if(a.sessionId==="__new__"){let h={};s.agentId&&(h.agentId=s.agentId),s.name&&(h.title=s.name),s.model&&(h.model=s.model);let w={cwd:a.cwd,...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}},S=await Nm({request:()=>g.request("session/new",w),showBanner:(P,L,_)=>Dm(t,P,L,_,{authenticate:G=>g.request("authenticate",{methodId:G})}),resolveOnboarding:async P=>{if(P)try{return(await Qc(n)).find(G=>G.id===P)?.onboarding}catch{return}},fallbackAgentId:s.agentId});if(S.kind==="cancel")return t.grabInput(!1),m.close().catch(()=>{}),null;if(S.kind==="back"){t.grabInput(!1),m.close().catch(()=>{});let P={...s};return delete P.sessionId,delete P.forceNew,delete P.resume,delete P.agentId,P}let x=S.result;c.write(d),ve=x.sessionId,r.sessionId=ve,r.readonly=!1;let A=Mt(x._meta??void 0);A.clientId&&(Vn=A.clientId),xs=A.upstreamSessionId,A.agentId&&(At=A.agentId),A.cwd&&(Ke=A.cwd),A.title&&(Zt=A.title),lr=A.currentModel,As=A.currentMode,bi=A.currentUsage,Ie=A.turnStartedAt,A.availableCommands&&(Cs=Aa(A.availableCommands)),A.availableModes&&(Yn=A.availableModes),ur=uy(x.configOptions),en=A.queue}else{let h={};s.readonly===!0&&(h.readonly=!0),e.tui.toolContent==="references"&&(h.toolContent="references"),s.drip===!0&&(h.replayMode="drip",s.dripSpeed!==void 0&&(h.dripSpeed=s.dripSpeed)),a.resumeHint!==void 0&&(h.resume={upstreamSessionId:a.resumeHint.upstreamSessionId,agentId:a.resumeHint.agentId,cwd:a.resumeHint.cwd});let w=await g.request("session/attach",{sessionId:a.sessionId,historyPolicy:"full",clientInfo:{name:"hydra-acp-tui",version:fe},...Object.keys(h).length>0?{_meta:{[lt]:h}}:{}});ve=w.sessionId,w.clientId&&(Vn=w.clientId),r.sessionId=ve,r.readonly=s.readonly===!0;let S=Mt(w._meta??void 0);xs=S.upstreamSessionId,S.agentId&&(At=S.agentId),S.cwd&&(Ke=S.cwd),S.title&&(Zt=S.title),lr=S.currentModel,As=S.currentMode,bi=S.currentUsage,Ie=S.turnStartedAt,S.availableCommands&&(Cs=Aa(S.availableCommands)),S.availableModes&&(Yn=S.availableModes),ur=uy(w.configOptions),en=S.queue}let tn=M.tuiHistoryFile(ve),fr=M.globalTuiHistoryFile(),Ve=await Hi(tn).catch(()=>[]),Ft=await Hi(fr).catch(()=>[]);Ft.length>e.tui.promptHistoryMaxEntries&&(Ft=Ft.slice(Ft.length-e.tui.promptHistoryMaxEntries));let Wt=[...Ve],he=new qn({history:aa(Ft,Wt)});_e=he;let vi=!1,Gn=(h,w)=>{let S=h.replace(/\n+$/,"");if(S.length===0)return;let x=(w??h).replace(/\n+$/,""),A=Ui(Ve,S),P=A!==Ve;Ve=A,Wt=Ui(Wt,x);let L=Ui(Ft,S,e.tui.promptHistoryMaxEntries),_=L!==Ft;Ft=L,he.setHistory(aa(Ft,Wt)),P&&qs(tn,Ve).catch(()=>{}),_&&tp(fr,S).catch(()=>{})};U>0&&he.setTurnRunning(!0);let ft=null,Rs=null;jg(e.tui.ambiguousWidth==="wide"),Wh(e.tui.diffContextLines);let Cn=!1,I,Ii=()=>{Cn&&(Cn=!1,I.start())},Io=()=>{Cn||(Cn=!0,I.stop(),process.kill(process.pid,"SIGTSTP"))};process.platform!=="win32"&&process.on("SIGCONT",Ii),I=new Sd({term:t,dispatcher:he,repaintThrottleMs:e.tui.repaintThrottleMs,maxScrollbackLines:e.tui.maxScrollbackLines,mouse:i.mouseEnabled,inAppSelection:i.inAppSelectionEnabled,selectionClipboard:e.tui.selectionClipboard,openFileCommand:e.tui.openFileCommand,progressIndicator:e.tui.progressIndicator,readonly:s.readonly===!0,onSuspend:process.platform!=="win32"?Io:void 0,onBlockClick:(h,w)=>{Uy(h,w)},onBlockDoubleClick:(h,w)=>Hy(h,w),onBlockVisible:h=>{By(h)},onMouse:h=>{if(h.kind!=="press"||h.button!=="middle")return;let w={type:"attachment-request",source:"primary"};s.readonly===!0&&fy(w)||ie(w)},onKey:h=>{for(let w of h){if(be&&Ed(w)||Md(w)||Ci(w)||xo(w)||Ts(w)||ki(w))continue;if(w.type==="key"&&w.name==="escape"&&I.isScrolledBack()){I.scrollToBottom();continue}if(w.type==="attachment-paths"){He(w.paths);continue}let S=he.feed(w);for(let x of S)s.readonly===!0&&fy(x)||ie(x)}Si(),I.setBannerSearchIndicator(he.state().historySearchQuery),I.setAttachments(he.state().attachments),I.refreshPrompt()}}),de=I,I.setStickyBottomKey("plan");let vt=[{name:"/help",description:"Show TUI built-in commands"},{name:"/quit",description:"Exit the TUI"},{name:"/clear",description:"Clear scrollback"},{name:"/sessions",description:"List sessions"},{name:"/resume",description:"Switch sessions (open the picker)"},{name:"/session",description:"Switch session: /session <id|next|prev> (no arg opens picker)"},{name:"/rename",description:"Rename this session (alias for /hydra title): /rename [title]"},{name:"/model",description:"Switch model: /model <model-id>"},{name:"/agent",description:"Switch agent via config option: /agent <agent-id>"},{name:"/btw",description:"Run an ancillary forked session: /btw <prompt>"}],pr=Cs??[],Oe=Yn??[],nn=ur??[],So=()=>nn.find(h=>h.id==="agent"),ko=()=>{let h=new Set,w=[];for(let S of[...vt,...pr])h.has(S.name)||(h.add(S.name),w.push(S));return w},Qn=()=>{let h=he.state().buffer,w=h[0]??"";if(!w.startsWith("/"))return[];if(h.length>1)return[];let S=w.indexOf(" "),x=S===-1?w:w.slice(0,S);if(x.lastIndexOf("/")>0)return[];let A=ko().filter(P=>P.name.startsWith(x));return A.length===1&&A[0]?.name===x?[]:A},sn=[],Si=()=>{let h=Qn();if(h.length>0){sn=[],I.setCompletions(h);return}I.setCompletions(sn)},Ts=h=>{if(h.type!=="key"||h.name!=="tab")return sn.length>0&&(sn=[]),!1;let w=Qn();if(I.isOverlayOpen()&&w.length===0)return I.toggleFocusedPane(),!0;if(w.length>0){sn=[];let S=he.state().buffer[0]??"",x=Vg({matches:w.map(A=>A.name),firstLine:S});return x===null||he.replaceFirstLine(x),!0}return Es()},Es=()=>{let h=he.state(),w=h.buffer[h.row]??"",S=sy(w,h.col);if(S===null)return!1;let x=ry(S.token,Ke);return x===null?!1:(x.replacement!==S.token&&he.replaceRangeOnCurrentLine(S.start,h.col,x.replacement),sn=x.candidates.length>1?x.candidates.map(A=>({name:A})):[],!0)},ki=h=>!I.isOverlayOpen()||h.type!=="key"||h.name!=="escape"&&h.name!=="ctrl-c"?!1:(K&&(K.cancel(),K=null,z=null),I.closeBtwOverlay(),!0),xo=h=>{if(!I.isScrollbackSearchActive())return h.type==="key"&&h.name==="ctrl-r"&&I.isScrolledBack()?(I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(""),!0):!1;if(h.type==="char"){let w=I.scrollbackSearchTerm()+h.ch;return I.updateScrollbackSearchTerm(w),!0}if(h.type==="paste"){let w=I.scrollbackSearchTerm()+h.text.replace(/\n/g," ");return I.updateScrollbackSearchTerm(w),!0}if(h.type==="key")switch(h.name){case"ctrl-r":return I.advanceScrollbackSearch(),!0;case"ctrl-s":return I.retreatScrollbackSearch(),!0;case"backspace":{let w=I.scrollbackSearchTerm();return w.length===0?I.cancelScrollbackSearch():I.updateScrollbackSearchTerm(w.slice(0,-1)),!0}case"enter":return I.acceptScrollbackSearch(),!0;case"escape":case"ctrl-c":return I.cancelScrollbackSearch(),!0;default:return!0}return!0},Ed=h=>{if(!be)return!1;let w=be.options;if(h.type==="key")switch(h.name){case"up":return be.selectedIndex=Math.max(0,be.selectedIndex-1),at(),!0;case"down":return be.selectedIndex=Math.min(w.length-1,be.selectedIndex+1),at(),!0;case"enter":{let S=w[be.selectedIndex];return S&&An(S.optionId),!0}case"escape":case"ctrl-c":return An(null),!0;default:return!0}if(h.type==="char"&&/^[1-9]$/.test(h.ch)){let S=parseInt(h.ch,10)-1,x=w[S];return x&&An(x.optionId),!0}return!0},Ao=At||wi||"?",It={...bi??{}};c.finalize(),I.start({skipFullscreen:!0}),I.setHideThoughts(!i.showThoughts),I.setSessionbar({agent:Ao,cwd:Ke,sessionId:ve,title:Zt,model:lr,usage:{...It}}),As&&I.setBanner({currentMode:As}),lo().then(h=>{h&&I.notify(`\u2728 ${uo(h)}`,3e4)}).catch(()=>{});let st=null,hr=new Promise(h=>{st=h}),rn=()=>{g.notify("session/cancel",{sessionId:ve}).catch(()=>{})},on=()=>{de!==null&&U===1&&(V=!0,de.setBanner({status:"cancelling",elapsedMs:void 0,stalled:!1}))},an=()=>{if(ft){ft.cancel(),on();return}if(U>0){rn(),on();return}mr()},mr=()=>{C(0)},Co=()=>{let h="enqueue prompt (sends now, or queues during a turn)",w="amend the in-flight turn (cancel + replace)";return[...i.defaultEnterAction==="amend"?[["Enter",w],["Ctrl+Enter / Shift+Enter / ^S",h]]:[["Enter",h],["Ctrl+Enter / Shift+Enter / ^S",w]],...fC]},Pd=()=>{if(I.isHelpPromptActive()){I.setHelpPrompt(null);return}I.setHelpPrompt({title:"Hotkeys",entries:Co(),hint:"any key dismisses \xB7 /help lists commands"})},Md=h=>I.isHelpPromptActive()?(h.type==="key"&&h.name==="ctrl-g",I.setHelpPrompt(null),!0):!1,Rn=["tools","plan","thoughts","diffs","mouse","enter"],Jt=0,xi=h=>{switch(h){case"tools":return i.toolsExpanded?"expanded":"collapsed";case"plan":return i.planExpanded?"expanded":"collapsed";case"thoughts":return i.showThoughts?"shown":"hidden";case"diffs":return i.showFileUpdates;case"mouse":return i.mouseEnabled?"on":"off";case"enter":return i.defaultEnterAction}},Ro=h=>{switch(h){case"tools":return"Tools";case"plan":return"Plan";case"thoughts":return"Thoughts";case"diffs":return"File updates";case"mouse":return"Mouse capture";case"enter":return"Enter key"}},To=()=>({title:"Session options",options:Rn.map(h=>({label:Ro(h),value:xi(h)})),selectedIndex:Jt}),Ai=()=>{I.isOptionsPromptActive()&&I.setOptionsPrompt(To())},Xn=()=>{if(I.isOptionsPromptActive()){I.setOptionsPrompt(null);return}Jt=0,I.setOptionsPrompt(To())},Tn=h=>{switch(h){case"tools":i.toolsExpanded=!i.toolsExpanded,_s.clear(),yr.clear(),$y();break;case"plan":i.planExpanded=!i.planExpanded,ee=null,Ge();break;case"thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts);break;case"diffs":i.showFileUpdates=i.showFileUpdates==="diff"?"edit":"diff",Mn.clear(),Ny();break;case"mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w;break}case"enter":i.defaultEnterAction=i.defaultEnterAction==="amend"?"enqueue":"amend";break}Ai()},Ct=h=>{(async()=>{try{switch(h){case"tools":case"plan":I.notify(`${Ro(h)} is session-only \u2014 not saved`);return;case"thoughts":await Ei("showThoughts",i.showThoughts);break;case"diffs":await Ei("showFileUpdates",i.showFileUpdates);break;case"mouse":await Ei("mouse",i.mouseEnabled);break;case"enter":await Ei("defaultEnterAction",i.defaultEnterAction);break}I.notify(`saved default: ${Ro(h)} ${xi(h)}`)}catch(w){I.notify(`save failed: ${w instanceof Error?w.message:String(w)}`)}})()},Ci=h=>{if(!I.isOptionsPromptActive())return!1;if(h.type==="key")switch(h.name){case"up":return Jt=Math.max(0,Jt-1),Ai(),!0;case"down":return Jt=Math.min(Rn.length-1,Jt+1),Ai(),!0;case"enter":{let w=Rn[Jt];return w&&Tn(w),!0}case"ctrl-o":case"escape":case"ctrl-c":return I.setOptionsPrompt(null),!0;case"ctrl-d":return I.setOptionsPrompt(null),!1;default:return!0}if(h.type==="char"){if(/^[1-9]$/.test(h.ch)){let w=parseInt(h.ch,10)-1,S=Rn[w];return S&&(Jt=w,Tn(S)),!0}if(h.ch==="s"||h.ch==="S"){let w=Rn[Jt];return w&&Ct(w),!0}}return!0},gr=()=>{b=!0,K?(K.cancel(),K=null,z=null):z!==null&&(vn(n,z).catch(()=>{}),z=null),process.off("SIGINT",an),process.platform!=="win32"&&process.off("SIGCONT",Ii),ne!==null&&(clearInterval(ne),ne=null);for(let h of nt.values())clearTimeout(h);nt.clear(),I.clearWindowTitle(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{}),m.close().catch(()=>{})},C=(h=0)=>{gr(),st&&(st(null),st=null),h!==0&&process.exit(h)},E=async()=>{if(!st)return;K?(K.cancel(),K=null,z=null):z!==null&&(vn(n,z).catch(()=>{}),z=null);let h=he.state().buffer.join(`
161
+ `);h.replace(/\s+$/,"").length>0&&Gn(h),I.pauseRepaint(),I.stop({keepFullscreen:!0}),qs(tn,Ve).catch(()=>{});let w=null,S=null;for(;w===null;){let L=await bn(n,{includeNonInteractive:!0}),_=await eu(t,{cwd:Ke,sessions:L,config:e,target:n,currentSessionId:ve,prefs:o});if(_.kind==="abort"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(_.kind==="exit"){C(0);return}if(_.kind==="new"){w={choice:_,sessions:L};break}if(_.kind==="fork"){let le=await yy(t,n,_,L);if(le.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(le.kind==="back")continue;w={choice:{kind:"attach",sessionId:le.ctx.sessionId,...le.ctx.agentId?{agentId:le.ctx.agentId}:{}},sessions:L},S={readonly:!1,cwd:le.ctx.cwd},le.ctx.resumeHint!==void 0&&(S.resumeHint=le.ctx.resumeHint);break}let G=L.find(le=>le.sessionId===_.sessionId);if(!(G!==void 0&&!!G.importedFromMachine&&!G.upstreamSessionId&&_.readonly!==!0)){if(n.isLocal&&G&&!G.importedFromMachine&&_.readonly!==!0&&!(await po(G.cwd)).ok){let Pe=await ar(t,G,{defaultCwd:Nt(e.defaultCwd),title:"Working directory missing \u2014 choose cwd",intro:"This session's working directory no longer exists. Pick a new one:"});if(Pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}if(Pe.kind==="back")continue;w={choice:_,sessions:L},S={readonly:!1,cwd:Pe.path,resumeHint:{agentId:_.agentId??G.agentId??"",cwd:Pe.path,upstreamSessionId:""}};break}w={choice:_,sessions:L};break}let Ee={...s,readonly:!1},pe=await gy(t,G,_,Ee);if(pe.kind==="cancel"){I.start({skipFullscreen:!0}),I.resumeRepaint();return}pe.kind!=="back"&&(w={choice:_,sessions:L},S={readonly:Ee.readonly===!0,cwd:pe.ctx.cwd},pe.ctx.resumeHint!==void 0&&(S.resumeHint=pe.ctx.resumeHint))}let{choice:x}=w,A=st;if(st=null,process.off("SIGINT",an),m.close().catch(()=>{}),x.kind==="new"){let{sessionId:L,..._}=s,G={..._,cwd:x.cwd??Ke,forceNew:!0,readonly:!1};x.prompt!==void 0&&(G.initialPrompt=x.prompt),A(G);return}if(x.kind!=="attach")return;let P={...s,sessionId:x.sessionId,cwd:S?.cwd??Ke,readonly:S?.readonly??x.readonly===!0};x.agentId!==void 0&&(P.agentId=x.agentId),S?.resumeHint!==void 0?P.resumeHint=S.resumeHint:delete P.resumeHint,A(P)},$=async(h="next")=>{if(!st)return;let S=(await bn(n)).filter(Ee=>Ee.status==="live");if(S.length<=1)return;let x=S.findIndex(Ee=>Ee.sessionId===ve),L=((x===-1?0:x)+(h==="prev"?-1:1)+S.length)%S.length,_=S[L],G=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let Fe={...s,sessionId:_.sessionId,cwd:Ke,readonly:!1};_.agentId!==void 0&&(Fe.agentId=_.agentId),G(Fe)},X=async h=>{if(!st)return;let w=await bn(n,{includeNonInteractive:!0}),S=h.trim();if(!S){I.notify("usage: /session <id|next|prev>");return}let x=S.startsWith(Ht)?[S]:[S,Ht+S],A=w.find(_=>x.includes(_.sessionId));if(!A){let _=w.filter(G=>x.some(Fe=>G.sessionId.startsWith(Fe)));if(_.length===1)A=_[0];else if(_.length>1){I.notify(`ambiguous session id: ${S} (${_.length} matches)`);return}}if(!A){I.notify(`no session matches: ${S}`);return}if(A.sessionId===ve){I.notify("already on that session");return}let P=st;st=null,process.off("SIGINT",an),m.close().catch(()=>{});let L={...s,sessionId:A.sessionId,cwd:A.cwd??Ke,readonly:A.status!=="live"};A.agentId!==void 0&&(L.agentId=A.agentId),delete L.resumeHint,P(L)},ie=h=>{switch(h.type){case"send":i.defaultEnterAction==="amend"?En(h.text,h.attachments,h.displayText):Ms(h.text,h.attachments,h.displayText);return;case"amend":i.defaultEnterAction==="amend"?Ms(h.text,h.attachments,h.displayText):En(h.text,h.attachments,h.displayText);return;case"queue-edit":{let w=Ps(h.index);if(!w)return;let S=[];h.text.length>0&&S.push({type:"text",text:h.text});for(let x of h.attachments)S.push({type:"image",data:x.data,mimeType:x.mimeType});g.request("hydra-acp/prompt/update",{sessionId:ve,messageId:w,prompt:S}).then(x=>{let A=x;!A.updated&&A.reason!=="ok"&&I.notify(`queue edit skipped (${A.reason})`)}).catch(x=>{I.notify(`queue edit failed: ${x.message}`)});return}case"queue-remove":{let w=Ps(h.index);if(!w)return;g.request("hydra-acp/prompt/cancel",{sessionId:ve,messageId:w}).then(S=>{let x=S;!x.cancelled&&x.reason!=="ok"&&I.notify(`queue cancel skipped (${x.reason})`)}).catch(S=>{I.notify(`queue cancel failed: ${S.message}`)});return}case"cancel":{if(I.isOverlayOpen()){K&&(K.cancel(),K=null,z=null),I.closeBtwOverlay();return}if(h.prefill&&ft){let w=pt.size===0,S=he.state().buffer.every(x=>x==="");w&&S&&(Rs={text:ft.text,attachments:ft.attachments})}ft?ft.cancel():U>0&&rn(),on();return}case"exit":mr();return;case"plan-toggle":Eo(h.on);return;case"redraw-banner":I.setBanner({});return;case"redraw":I.fullRedraw();return;case"scroll-to-top":I.scrollToTop();return;case"scroll-to-bottom":I.scrollToBottom();return;case"switch-session":E().catch(()=>{});return;case"next-live-session":$().catch(()=>{});return;case"toggle-options":Xn();return;case"toggle-thoughts":i.showThoughts=!i.showThoughts,I.setHideThoughts(!i.showThoughts),I.notify(i.showThoughts?"thoughts shown":"thoughts hidden");return;case"toggle-mouse":{let w=!I.isMouseEnabled();I.setMouseEnabled(w),i.mouseEnabled=w,I.notify(w?"mouse capture on \u2014 wheel scrolls; shift+drag to select text":"mouse capture off \u2014 click-drag selects text; PgUp/PgDn scrolls");return}case"show-help":Pd();return;case"escalate-search":I.enterScrollbackSearch(),I.updateScrollbackSearchTerm(h.query);return;case"attachment-request":Ae(h.source);return}},He=async h=>{if(!cr){I.notify("agent does not accept image attachments");return}let w=0;for(let S of h){if(S.startsWith("data:")){let A=_l(S);if(!A){I.notify("unsupported data: URI");continue}if(A.sizeBytes>Sn){I.notify(`image too large (${qt(A.sizeBytes)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:A.mimeType,data:A.data,name:"pasted image",sizeBytes:A.sizeBytes}),w++;continue}let x=ho(S);if(!x){I.notify(`unsupported image type: ${bo.basename(S)}`);continue}try{let A=await lC.readFile(S);if(A.length>Sn){I.notify(`image too large (${qt(A.length)}, max ${qt(Sn)})`);continue}he.addAttachment({mimeType:x,data:A.toString("base64"),name:bo.basename(S),sizeBytes:A.length}),w++}catch(A){I.notify(`cannot read ${bo.basename(S)}: ${A.message}`)}}w>0&&(I.setAttachments(he.state().attachments),I.refreshPrompt())},Ae=async(h="clipboard")=>{let w=h==="primary"?await Tg():await Rg();if(!w.ok){I.notify(w.reason);return}if(w.kind==="image"){if(!cr){I.notify("agent does not accept image attachments");return}he.addAttachment(w.attachment),I.setAttachments(he.state().attachments),I.refreshPrompt();return}let S=he.feed({type:"paste",text:w.text});for(let x of S)ie(x);I.refreshPrompt()},Rt=h=>h.attachmentCount>0?`${h.text} \xB7 \u{1F4CE}\xD7${h.attachmentCount}`:h.text,St=(h,w)=>{let S=Array.isArray(w)?w:[],x="",A=0;for(let P of S){if(!P||typeof P!="object")continue;let L=P;L.type==="text"&&typeof L.text=="string"?x+=L.text:L.type==="image"&&(A+=1)}return{messageId:h,text:xe(x),attachmentCount:A}},pt=new Map,Tt=[],dn=new Map,rt=new Set,ht=null,Ye=()=>{let h=[...pt.values()],w=h.map(Rt);I.setQueuedPrompts(w),I.setBanner({queued:h.length}),he.setQueue(h.map(S=>S.text))},Ps=h=>[...pt.values()][h]?.messageId;if(en&&en.length>0){for(let h of en){if(h.position===0){se=h.messageId;continue}pt.set(h.messageId,St(h.messageId,h.prompt))}pt.size>0&&Ye()}let Ms=(h,w,S)=>{I.scrollToBottom(),!Zn(h)&&(Gn(h,S),Ri(h,w,S))},En=(h,w,S)=>{if(I.scrollToBottom(),Zn(h))return;if(Gn(h,S),!vo||se===void 0){Ri(h,w,S);return}let x=se,A=[];h.length>0&&A.push({type:"text",text:h});for(let _ of w)A.push({type:"image",data:_.data,mimeType:_.mimeType});let P={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(P);let L=()=>{let _=Tt.indexOf(P);_>=0&&Tt.splice(_,1),P.messageId!==void 0&&dn.delete(P.messageId)};g.request("hydra-acp/prompt/amend",{sessionId:ve,targetMessageId:x,prompt:A}).then(_=>{let G=_;if(G.amended&&G.reason==="ok"){j(1);return}if(L(),G.reason==="target_completed"){I.notify("previous response finished \u2014 press Enter to send as a new turn"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_cancelled"){I.notify("amend skipped \u2014 previous turn was cancelled"),he.setBuffer(h,w),I.refreshPrompt();return}if(G.reason==="target_not_found"){I.notify("amend skipped \u2014 no matching prompt"),he.setBuffer(h,w),I.refreshPrompt();return}}).catch(_=>{L(),I.notify(`amend failed: ${_.message}`),he.setBuffer(h,w),I.refreshPrompt()})},Eo=async h=>{if(Oe.length===0){I.notify("no modes advertised by agent");return}let w=I.currentModeId(),S=Oe.findIndex(P=>P.id===w),x=S===-1?0:(S+1)%Oe.length,A=Oe[x]?.id;if(A){I.setBanner({currentMode:A});try{await g.request("session/set_mode",{sessionId:ve,modeId:A})}catch(P){I.notify(`set_mode failed: ${P.message}`)}}},Zn=h=>{let w=h.replace(/\s+$/,"");if(!w.startsWith("/")||w.includes(`
162
+ `))return!1;let S=w.indexOf(" ");switch(S===-1?w:w.slice(0,S)){case"/quit":case"/exit":return mr(),!0;case"/clear":return et.clear(),es.clear(),_n.length=0,T=null,B=null,oe=null,Pn.clear(),Mn.clear(),$n.clear(),_s.clear(),On.clear(),Os.clear(),I.clearScrollback(),!0;case"/help":{let A=[{prefix:" ",body:"Built-in commands:",bodyStyle:"system"}];for(let P of vt)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"});if(pr.length>0){A.push({prefix:" ",body:"Agent commands:",bodyStyle:"system"});for(let P of pr)A.push({prefix:" ",body:` ${P.name.padEnd(12)} ${P.description??""}`,bodyStyle:"info"})}return I.appendLines(A),!0}case"/agent":{let A=S===-1?"":w.slice(S+1).trim(),P=So();if(!P)return I.appendLines([{prefix:" ",body:"no agent config option advertised for this session",bodyStyle:"info"}]),!0;if(!A){let L=[{prefix:" ",body:"Available agents:",bodyStyle:"system"}];for(let _ of P.options){let G=_.value===P.currentValue?"* ":" ";L.push({prefix:" ",body:`${G}${_.value.padEnd(16)} ${_.name}`,bodyStyle:"info"})}return I.appendLines(L),!0}return P.options.some(L=>L.value===A)?A===P.currentValue?(I.notify(`already on agent ${A}`),!0):(I.notify(`switching to ${A}\u2026`),g.request("session/set_config_option",{sessionId:ve,configId:"agent",value:A}).catch(L=>{I.notify(`set_config_option failed: ${L.message}`)}),!0):(I.notify(`unknown agent: ${A}`),!0)}case"/sessions":return I.appendLines([{prefix:" ",body:"Run `hydra-acp sessions` (or `hydra sessions`) for the full list.",bodyStyle:"info"}]),!0;case"/resume":return E().catch(()=>{}),!0;case"/session":{let A=S===-1?"":w.slice(S+1).trim();return A?A==="next"||A==="prev"?($(A).catch(P=>{I.notify(`session ${A} failed: ${P.message}`)}),!0):(X(A).catch(P=>{I.notify(`session switch failed: ${P.message}`)}),!0):(E().catch(()=>{}),!0)}case"/rename":{let A=S===-1?"":w.slice(S+1).trim(),P=A.length>0?`/hydra title ${A}`:"/hydra title";return Gn(w,w),Ri(P,[],w),!0}case"/btw":{let A=S===-1?"":w.slice(S+1).trim();if(!A)return I.appendLines([{prefix:" ",body:"/btw requires a prompt",bodyStyle:"info"}]),!0;if(ve==="__new__")return I.appendLines([{prefix:" ",body:"no active session to fork",bodyStyle:"info"}]),!0;O+=1;let P=O;K&&(K.cancel(),K=null);let L=null;z!==null&&!W?L=z:z!==null&&(vn(n,z).catch(()=>{}),z=null),W=!1,I.openBtwOverlay(),I.setBtwOverlayStatus({label:"busy",style:"busy"});let _=new pd({getMaxWidth:()=>{let pe=I.width();return pe>0?pe:void 0}});_.on("changed",()=>{I.setBtwOverlayContent(_.getLines())});let G={};_.append({sessionUpdate:"prompt_received",prompt:[{type:"text",text:A}]});let Fe=pe=>{_.append({sessionUpdate:"agent_message_chunk",content:{type:"text",text:pe}})},Ee={};return L!==null&&(Ee.reuseSessionId=L),yg(n,ve,A,Ee).then(pe=>{if(P!==O){pe.cancel();return}K=pe,z=pe.sessionId,I.setBtwOverlayMeta({sessionId:pe.sessionId}),pe.on("event",le=>{if(P===O)if(le.kind==="update"){_.append(le.update);let Pe=yn(le.update);if(Pe&&Pe.kind==="usage-update"){let Ls=!1;Pe.used!==void 0&&G.used!==Pe.used&&(G.used=Pe.used,Ls=!0),Pe.size!==void 0&&G.size!==Pe.size&&(G.size=Pe.size,Ls=!0),Pe.costAmount!==void 0&&G.costAmount!==Pe.costAmount&&(G.costAmount=Pe.costAmount,Ls=!0),Pe.costCurrency!==void 0&&G.costCurrency!==Pe.costCurrency&&(G.costCurrency=Pe.costCurrency,Ls=!0),Ls&&I.setBtwOverlayMeta({usage:{...G}})}}else le.kind==="completed"?(I.setBtwOverlayStatus({label:"done",style:"done"}),K=null):le.kind==="cancelled"?(I.setBtwOverlayStatus({label:"cancelled",style:"cancelled"}),K=null,z=null):le.kind==="errored"&&(I.setBtwOverlayStatus({label:"errored",style:"errored"}),Fe(`btw errored: ${le.error.message}`),z!==null&&vn(n,z).catch(()=>{}),K=null,z=null)})}).catch(pe=>{if(P!==O)return;let le=pe instanceof Error?pe.message:String(pe);I.setBtwOverlayStatus({label:"errored",style:"errored"}),Fe(`btw startup failed: ${le}`),I.appendLines([{prefix:" ",body:`btw startup failed: ${le}`,bodyStyle:"tool-status-fail"}])}),!0}default:return!1}},Ri=async(h,w,S)=>{let x=[];h.length>0&&x.push({type:"text",text:h});for(let Ee of w)x.push({type:"image",data:Ee.data,mimeType:Ee.mimeType});j(1);let A={text:h,displayText:S??h,attachments:w,flushed:!1};Tt.push(A),xn=!1;let P=!1,L=null,_=Ee=>{typeof de<"u"&&de!==null&&de.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:Ee,bodyStyle:"tool-status-fail"}])},G=!1;ft={text:h,attachments:w,cancel:()=>{if(xn){xn=!1,G=!0,_("force-stopping agent \u2014 turn aborted; resumes on your next message\u2026"),g.request("hydra-acp/session/force_cancel",{sessionId:ve}).catch(pe=>{_(`force-stop failed: ${pe.message}`)});return}if(P)return;P=!0,g.notify("session/cancel",{sessionId:ve}).catch(()=>{});let Ee=Date.now();L=setTimeout(()=>{ft!==null&&(Kn>=Ee||(xn=!0,_("cancel not acknowledged by agent \u2014 the turn is still running. Cancel again to force-stop (restarts the agent).")))},dr)}};let Fe;try{let Ee=await g.request("session/prompt",{sessionId:ve,prompt:x});Ee&&typeof Ee.stopReason=="string"&&(Fe=Ee.stopReason)}catch(Ee){let pe=Tt.indexOf(A);pe>=0&&Tt.splice(pe,1),A.messageId!==void 0&&dn.delete(A.messageId),G?I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"turn force-stopped",bodyStyle:"tool-status-fail"}]):I.appendLines([{prefix:"\u2717 ",prefixStyle:"tool-status-fail",body:Ee.message,bodyStyle:"tool-status-fail"}])}finally{if(ft=null,L!==null&&(clearTimeout(L),L=null),j(-1),A.flushed&&ht===A){let Ee=A.messageId!==void 0&&rt.has(A.messageId);Ee&&A.messageId!==void 0&&rt.delete(A.messageId);let pe={kind:"turn-complete"};Fe!==void 0&&(pe.stopReason=Fe),Ee&&(pe.amended=!0),R(pe),ht=null}if(Rs!==null){let{text:Ee,attachments:pe}=Rs;Rs=null,he.state().buffer.every(Pe=>Pe==="")&&(he.setBuffer(Ee,pe),I.refreshPrompt())}}},et=new Map,Pn=new Map,Mn=new Map,es=new Map,_n=[],it=0,zt=`tools:${it}`,$n=new Map,_s=new Map,yr=new Set,$s=new Map,On=new Map,Os=new Map,T=null,B=null,oe=null,F=null,ee=null,ce=e.tui.maxToolItems,Te=e.tui.maxPlanItems,Be=()=>({maxPlanItems:ee??i.planExpanded?1/0:Te}),Ge=()=>{if(F===null)return;let h=ms(F,Be());h.length>0&&I.upsertLines("plan",[{body:""},...h])},mt="",Me=null,Lt=0,_d=()=>{if(Me===null)return;let h=I.width(),w=gs(mt,h>0?{maxWidth:h}:void 0);w.length!==0&&I.upsertLines(Me,w)},Ty=h=>{h.length!==0&&(Me===null&&(I.ensureSeparator(),Me=`agent:${Lt}`,Lt+=1,mt=""),mt+=h,_d())},ts=()=>{Me=null,mt=""},wr="",Fs=null,ru=0,Ey=()=>({prefix:" ",body:"\u25B8 Thoughts",bodyStyle:"thought"}),Py=()=>{if(Fs===null||wr.length===0)return;let h=ti(wr);h.length!==0&&I.upsertLines(Fs,h)},My=h=>{let w=On.get(h);if(w===void 0)return[];let S=ti(w.text);return w.workerTaskId&&S.unshift({prefix:" ",body:`[T${w.workerTaskId}] `,bodyStyle:"dim"}),S},_y=(h,w)=>{h.length!==0&&(Fs===null&&(I.ensureSeparator("thought"),Fs=`thought:${ru}`,ru+=1,wr=""),wr+=h,On.set(Fs,{text:wr,workerTaskId:w}),Py())},ns=()=>{Fs=null,wr=""},iu=h=>hC({...h,collapsedLimit:ce}),ou=h=>_s.get(h)??i.toolsExpanded,Kt=()=>{if(T===null)return;let{lines:h,rowOwners:w}=iu({order:_n,states:et,startedAt:T,endedAt:B,stopReason:oe,expanded:ou(zt),perToolExpanded:yr});I.upsertLines(zt,h),$s.set(zt,w)},Po=h=>{let w=$n.get(h);if(!w)return;let{lines:S,rowOwners:x}=iu({order:w.order,states:w.states,startedAt:w.startedAt,endedAt:w.endedAt,stopReason:w.stopReason,expanded:ou(h),perToolExpanded:yr});I.upsertLines(h,S),$s.set(h,x)},$y=()=>{T!==null&&!$n.has(zt)&&Kt();for(let h of $n.keys())Po(h)},$d=()=>{T!==null&&$n.set(zt,{order:[..._n],states:new Map(et),startedAt:T,endedAt:B??Date.now(),stopReason:oe,rowOwners:$s.get(zt)??[]})},au=()=>{it+=1,zt=`tools:${it}`,T=Date.now(),B=null,oe=null,Kt()};function Oy(h){if(!h||typeof h!="object")return null;let w=h,S=Array.isArray(w.content)?w.content:void 0;if(!S)return null;let x=[],A=P=>{if(typeof P=="string"){x.push({text:Qe(P)});return}if(P&&typeof P=="object"){let L=P;typeof L.__hydraBlob=="string"&&x.push({hash:L.__hydraBlob})}};for(let P of S){if(!P||typeof P!="object")continue;let L=P;if(L.type==="content"&&L.content&&typeof L.content=="object"){let _=L.content;if(_.text!==void 0){A(_.text);continue}}if(L.type==="text"&&L.text!==void 0){A(L.text);continue}L.text!==void 0&&A(L.text)}return x.length>0?x:null}let du=(h,w)=>{let S=w.map(P=>"text"in P?P.text:"").join(`
163
+ `);if(S.length===0)return;let{text:x,truncated:A}=Uh(S);h.resultText=x,h.resultTruncated=A},Mo=new Set,Fy=(h,w)=>{!w.some(x=>"hash"in x)||Mo.has(h)||(Mo.add(h),(async()=>{let x=await Promise.all(w.map(async P=>"text"in P?P:{text:await Od(P.hash)??""}));Mo.delete(h);let A=et.get(h);if(!A)for(let P of $n.values()){let L=P.states.get(h);if(L){A=L;break}}if(A){du(A,x),et.has(h)&&Kt();for(let[P,L]of $n)L.states.has(h)&&Po(P);I.repaintNow()}})().catch(()=>{Mo.delete(h)}))},cu=(h,w,S,x,A,P,L,_,G,Fe)=>{let Ee=!et.has(h),pe=et.get(h),le=pe??{initialTitle:w??"tool",latestTitle:w??"tool",status:S??"pending",startedAt:Date.now()};if(!pe&&G!==void 0&&(le.workerTaskId=G),pe&&w!==void 0&&(le.latestTitle=w),P!==void 0&&le.detail===void 0&&(le.detail=P),L!==void 0&&le.detailFull===void 0&&(le.detailFull=L),_!==void 0&&_.length>0&&(le.locations=_),pe&&S!==void 0&&(le.status=S),pe||(le.status=S??"pending"),le.endedAt===void 0&&Kh(le.status)&&(le.endedAt=Date.now()),x!==void 0&&(le.errorText=x),A!==void 0&&(le.editDiff=A),Fe!==void 0){let Pe=Oy(Fe);Pe!==null&&(du(le,Pe),Pe.some(Ls=>"hash"in Ls)&&Fy(h,Pe))}et.set(h,le),Ee&&(T===null&&(it+=1,zt=`tools:${it}`,T=Date.now(),B=null,oe=null),_n.push(h))},Od=async h=>{try{let w=await g.request("hydra-acp/session/tool_content",{sessionId:ve,hash:h});return typeof w?.content=="string"?w.content:null}catch{return null}},_o=new Set,Ly=(h,w)=>{_o.has(h)||w.oldRef===void 0&&w.newRef===void 0||(_o.add(h),(async()=>{let[S,x]=await Promise.all([w.oldRef?Od(w.oldRef.hash):Promise.resolve(w.oldText),w.newRef?Od(w.newRef.hash):Promise.resolve(w.newText)]);if(w.oldRef!==void 0&&S===null||w.newRef!==void 0&&x===null){_o.delete(h);let Fe=il(w,"diff",{deferredStatus:"error"});Fe.length>0&&(I.upsertLines(`editdiff:${h}`,Fe),I.repaintNow());return}let P={...w.path!==void 0?{path:w.path}:{},oldText:S??"",newText:x??""};Pn.set(h,P);let L=et.get(h);L?.editDiff&&(L.editDiff=P),_o.delete(h);let _=Mn.get(h),G=_===void 0?i.showFileUpdates:_?"diff":"edit";G!=="none"&&($o(h,P,G==="diff"?"diff":"edit"),I.repaintNow())})())},$o=(h,w,S)=>{let x=`editdiff:${h}`,A=il(w,S);if(A.length===0){I.removeKey(x);return}I.upsertLines(x,A),S==="diff"&&(w.oldRef!==void 0||w.newRef!==void 0)&&I.notifyWhenVisible(x)},By=h=>{if(!h.startsWith("editdiff:"))return;let w=h.slice(9),S=Pn.get(w);S&&(S.oldRef!==void 0||S.newRef!==void 0)&&Ly(w,S)},lu=h=>{let w=`editdiff:${h}`,S=i.showFileUpdates,x=et.get(h),A;if(S==="none"||!x?.editDiff||x.status!=="completed")A=null;else{let L=Mn.get(h);A=L!==void 0?L?"diff":"edit":S==="diff"?"diff":"edit"}if(A===null){I.removeKey(w);return}let P=x.editDiff;Pn.set(h,P),$o(h,P,A)},Ny=()=>{let h=i.showFileUpdates;for(let[w,S]of Pn){let x=`editdiff:${w}`,A=Mn.get(w),P=A===void 0?h:A?"diff":"edit";if(P==="none"){I.removeKey(x);continue}$o(w,S,P==="diff"?"diff":"edit")}},Dy=h=>{if(!h.path)return null;let w=Qe(h.oldText).split(`
164
164
  `),S=Qe(h.newText).split(`
165
165
  `),x=0,A=Math.min(w.length,S.length);for(;x<A&&w[x]===S[x];)x++;let P=S[x];if(!P)return null;let L=bo.isAbsolute(h.path)?h.path:bo.resolve(Ke,h.path),_;try{_=oC(L,"utf8")}catch{return null}let G=_.split(`
166
- `);for(let Le=0;Le<G.length;Le++)if(G[Le]===P)return Le+1;return null},Hy=(h,w)=>{if(h.startsWith("editdiff:")){let S=h.slice(9),x=Pn.get(S),P=et.get(S)?.locations?.[0],L=P?.path??x?.path;if(!L)return!1;let _=null;P?.line!==void 0?_=P.line:x&&(_=Dy(x));let G=_===null?"":`:${_}`;return I.tryOpenPathString(L+G)}if(h.startsWith("tools:")){if(w===0)return!1;let S=$s.get(h),x=S?S[w]:void 0;if(!x)return!1;let A=et.get(x),P=A?.locations?.[0];if(P){let _=P.line===void 0?"":`:${P.line}`;if(I.tryOpenPathString(P.path+_))return!0}let L=A?.detailFull??A?.detail;if(L)return I.tryOpenPathString(L)}return!1},Uy=(h,w)=>{if(h.startsWith("editdiff:")){let S=h.slice(9),x=Pn.get(S);if(!x)return;let A=Mn.get(S)??i.showFileUpdates==="diff";Mn.set(S,!A),$o(S,x,A?"edit":"diff"),I.repaintNow();return}if(h==="plan"){if(O===null)return;ne=!(ne??i.planExpanded),Ge(),I.repaintNow();return}if(h.startsWith("tools:")){if(w===0){let A=_s.get(h)??i.toolsExpanded;_s.set(h,!A),h===zt&&T!==null?Kt():Po(h),I.repaintNow();return}let S=$s.get(h);if(!S)return;let x=S[w];if(!x)return;pC(x,yr),Po(h),I.repaintNow();return}if(h.startsWith("thought:")){if(!On.has(h))return;let S=Os.get(h);if(S!==void 0){Os.delete(h),I.setRunCollapsed(S,!1,My(h)),I.repaintNow();return}let x=I.contiguousRun(h,new Set(On.keys()));if(x.length===0)return;let A=x[0];Os.set(A,x),I.setRunCollapsed(x,!0,[Ey()]),I.repaintNow();return}};v=(h,w)=>{if(h.kind==="available-commands"){pr=h.commands,Si();return}if(h.kind==="available-modes"){Fe=h.modes;return}if(h.kind==="config-options"){nn=h.options;let x=h.options.find(P=>P.id==="agent");x&&x.currentValue&&x.currentValue!==At&&(At=x.currentValue,I.setSessionbar({agent:x.currentValue}));let A=h.options.find(P=>P.id==="mode");A&&(Fe=A.options.map(P=>({id:P.value,name:P.name??P.value,...P.description!==void 0?{description:P.description}:{}})));return}if(h.kind==="mode-changed"){I.setBanner({currentMode:h.mode||void 0});return}if(h.kind==="session-info"){h.title!==void 0&&I.setSessionbar({title:h.title}),h.agentId!==void 0&&h.agentId!==At&&(At=h.agentId,I.setSessionbar({agent:h.agentId}));return}if(h.kind==="usage-update"){let x=!1;h.used!==void 0&&It.used!==h.used&&(It.used=h.used,x=!0),h.size!==void 0&&It.size!==h.size&&(It.size=h.size,x=!0),h.costAmount!==void 0&&It.costAmount!==h.costAmount&&(It.costAmount=h.costAmount,x=!0),h.costCurrency!==void 0&&It.costCurrency!==h.costCurrency&&(It.costCurrency=h.costCurrency,x=!0),x&&I.setSessionbar({usage:{...It}});return}if(h.kind==="user-text"){vi&&Gn(h.text),ts(),ns(),T!==null&&(B=Date.now(),Kt()),ht=null,I.ensureSeparator();let x=ms(h);x.length>0&&I.appendLines(x),$d(),I.clearKey("plan"),O=null,ne=null,et.clear(),es.clear(),_n.length=0,B=null,au(),I.redraw();return}if(h.kind==="agent-text"){ns(),Me===null&&z(h.workerTaskId),Ty(h.text);return}if(h.kind==="agent-thought"){ts(),Fs===null&&z(h.workerTaskId),_y(h.text,h.workerTaskId);return}if(h.kind==="exit-plan-mode"){ts(),ns();let x=es.get(h.toolCallId),A={plan:h.plan??x?.plan??"",status:h.status??x?.status};if(es.set(h.toolCallId,A),A.plan.length===0)return;let P=Vh(A);P.length>0&&I.upsertLines(h.toolCallId,P);return}if(h.kind==="tool-call"){ts(),ns(),et.has(h.toolCallId)||z(h.workerTaskId),cu(h.toolCallId,h.title,h.status,void 0,h.editDiff,h.detail,h.detailFull,h.locations,h.workerTaskId,w),Kt(),lu(h.toolCallId);return}if(h.kind==="plan"){ts(),ns(),O=h;let x=ms(h,Ne());x.length>0&&I.upsertLines("plan",[{body:""},...x]);let A=h.entries.length>0&&h.entries.every(P=>(P.status??"pending")==="completed");I.setStickyBottomKey(A?null:"plan");return}if(h.kind==="tool-call-update"){ts(),ns(),cu(h.toolCallId,h.title,h.status,h.errorText,h.editDiff,h.detail,h.detailFull,h.locations,h.workerTaskId,w),h.upstreamInterrupted&&(Oe=!0),Kt(),lu(h.toolCallId);return}h.kind==="model-changed"&&I.setSessionbar({model:h.model});let S=ms(h);if(S.length>0&&I.appendLines(S),h.kind==="turn-complete"){te=void 0,ts(),ns();let x=h.amended?"amended":h.stopReason;if(!h.amended&&Oe&&(x===void 0||x==="end_turn")&&(x="error"),O!==null&&x!==void 0&&x!=="end_turn"){let A=ms({...O,stopped:!0,amended:h.amended===!0},Ne());A.length>0&&I.upsertLines("plan",[{body:""},...A])}O=null,ne=null,I.clearKey("plan"),I.setStickyBottomKey("plan"),T!==null?(B=Date.now(),ae=x??null,Kt(),$d()):x!==void 0&&x!=="end_turn"&&x!=="amended"&&I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`turn ended: ${x}`,bodyStyle:"tool-status-fail"}]),et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null,Oe=!1,I.ensureSeparator(),ay({pendingTurns:U,queueSize:pt.size,ownTurnInFlight:ft!==null,hasInFlightHead:te!==void 0,replayDraining:k,amended:h.amended===!0})&&j(-U)}};let uu=y;y=[];let Oo=[];for(let{event:h}of uu)h.kind==="user-text"&&typeof h.text=="string"&&Oo.push(h.text);I.pauseRepaint(),k=!0;try{for(let{event:h,rawUpdate:w}of uu)v(h,w)}finally{k=!1,I.resumeRepaint()}if(Oo.length>0){let h=$c(Ve,Oo);h!==Ve&&(Ve=h,Wt=$c(Wt,Oo),he.setHistory(aa(Ft,Wt)),qs(tn,Ve).catch(()=>{}))}vi=!0,Ie!==void 0&&U>0?(Z=Ie,I.setBanner({status:"busy",elapsedMs:Date.now()-Ie}),ee===null&&(ee=oe()),T===null&&au(),T=Ie,Kt()):Ie===void 0&&U>0&&j(-U);let jy=()=>{if(be){let h=be.resolve;be=null,I.setPermissionPrompt(null),h({outcome:{outcome:"cancelled"}})}ts(),ns()},fu=()=>{T!==null&&(B=Date.now(),ae="reconnect-recovery-failed",Kt(),$d(),et.clear(),es.clear(),_n.length=0,T=null,B=null,ae=null)};return p=()=>{I.setBanner({status:"disconnected",elapsedMs:void 0})},u=async()=>{jy();let h={jsonrpc:"2.0",id:`tui-reinit-${ly()}`,method:"initialize",params:{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}}};try{await m.request(h)}catch{}let w=$e!==void 0,S={jsonrpc:"2.0",id:`tui-reattach-${ly()}`,method:"session/attach",params:{sessionId:ve,historyPolicy:w?"after_message":"none",...w?{afterMessageId:$e}:{},clientInfo:{name:"hydra-acp-tui",version:fe},...(()=>{let _={};return xs!==void 0&&(_.resume={upstreamSessionId:xs,agentId:At,cwd:Ke}),e.tui.toolContent==="references"&&(_.toolContent="references"),Object.keys(_).length>0?{_meta:{[lt]:_}}:{}})()}};kn=[];let x,A,P;try{let _=await m.request(S);if(_.error)throw new Error(_.error.message);P=oy(_.result),x=P.appliedPolicy,P.clientId!==void 0&&(Vn=P.clientId)}catch(_){A=_}let L=kn??[];if(kn=null,A)fu(),I.appendLines([{prefix:" ",body:`reattach failed: ${A.message}`,bodyStyle:"tool-status-fail"}]);else if(w&&x!=="after_message")fu(),I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"reconnect couldn't replay events since last seen \u2014 scrollback may be incomplete",bodyStyle:"tool-status-fail"}]);else{k=!0;try{for(let _ of L)Ot(_)}finally{k=!1}}if(P){let _=dy({daemonTurnStartedAt:P.turnStartedAt,pendingTurns:U});_.pendingTurnsDelta!==0&&j(_.pendingTurnsDelta),_.banner==="busy"&&_.busySince!==void 0?(Z=_.busySince,I.setBanner({status:"busy",elapsedMs:Date.now()-_.busySince}),ee===null&&(ee=oe())):I.setBanner({status:"ready",elapsedMs:void 0})}else I.setBanner({status:U>0?"busy":"ready",elapsedMs:U>0?0:void 0})},g.onClose(h=>{h&&t.red(`
166
+ `);for(let Fe=0;Fe<G.length;Fe++)if(G[Fe]===P)return Fe+1;return null},Hy=(h,w)=>{if(h.startsWith("editdiff:")){let S=h.slice(9),x=Pn.get(S),P=et.get(S)?.locations?.[0],L=P?.path??x?.path;if(!L)return!1;let _=null;P?.line!==void 0?_=P.line:x&&(_=Dy(x));let G=_===null?"":`:${_}`;return I.tryOpenPathString(L+G)}if(h.startsWith("tools:")){if(w===0)return!1;let S=$s.get(h),x=S?S[w]:void 0;if(!x)return!1;let A=et.get(x),P=A?.locations?.[0];if(P){let _=P.line===void 0?"":`:${P.line}`;if(I.tryOpenPathString(P.path+_))return!0}let L=A?.detailFull??A?.detail;if(L)return I.tryOpenPathString(L)}return!1},Uy=(h,w)=>{if(h.startsWith("editdiff:")){let S=h.slice(9),x=Pn.get(S);if(!x)return;let A=Mn.get(S)??i.showFileUpdates==="diff";Mn.set(S,!A),$o(S,x,A?"edit":"diff"),I.repaintNow();return}if(h==="plan"){if(F===null)return;ee=!(ee??i.planExpanded),Ge(),I.repaintNow();return}if(h.startsWith("tools:")){if(w===0){let A=_s.get(h)??i.toolsExpanded;_s.set(h,!A),h===zt&&T!==null?Kt():Po(h),I.repaintNow();return}let S=$s.get(h);if(!S)return;let x=S[w];if(!x)return;pC(x,yr),Po(h),I.repaintNow();return}if(h.startsWith("thought:")){if(!On.has(h))return;let S=Os.get(h);if(S!==void 0){Os.delete(h),I.setRunCollapsed(S,!1,My(h)),I.repaintNow();return}let x=I.contiguousRun(h,new Set(On.keys()));if(x.length===0)return;let A=x[0];Os.set(A,x),I.setRunCollapsed(x,!0,[Ey()]),I.repaintNow();return}};v=(h,w)=>{if(h.kind==="available-commands"){pr=h.commands,Si();return}if(h.kind==="available-modes"){Oe=h.modes;return}if(h.kind==="config-options"){nn=h.options;let x=h.options.find(P=>P.id==="agent");x&&x.currentValue&&x.currentValue!==At&&(At=x.currentValue,I.setSessionbar({agent:x.currentValue}));let A=h.options.find(P=>P.id==="mode");A&&(Oe=A.options.map(P=>({id:P.value,name:P.name??P.value,...P.description!==void 0?{description:P.description}:{}})));return}if(h.kind==="mode-changed"){I.setBanner({currentMode:h.mode||void 0});return}if(h.kind==="session-info"){h.title!==void 0&&I.setSessionbar({title:h.title}),h.agentId!==void 0&&h.agentId!==At&&(At=h.agentId,I.setSessionbar({agent:h.agentId}));return}if(h.kind==="usage-update"){let x=!1;h.used!==void 0&&It.used!==h.used&&(It.used=h.used,x=!0),h.size!==void 0&&It.size!==h.size&&(It.size=h.size,x=!0),h.costAmount!==void 0&&It.costAmount!==h.costAmount&&(It.costAmount=h.costAmount,x=!0),h.costCurrency!==void 0&&It.costCurrency!==h.costCurrency&&(It.costCurrency=h.costCurrency,x=!0),x&&I.setSessionbar({usage:{...It}});return}if(h.kind==="user-text"){vi&&Gn(h.text),ts(),ns(),T!==null&&(B=Date.now(),Kt()),ht=null,I.ensureSeparator();let x=ms(h);x.length>0&&I.appendLines(x),$d(),I.clearKey("plan"),F=null,ee=null,et.clear(),es.clear(),_n.length=0,B=null,au(),I.redraw();return}if(h.kind==="agent-text"){ns(),Me===null&&q(h.workerTaskId),Ty(h.text);return}if(h.kind==="agent-thought"){ts(),Fs===null&&q(h.workerTaskId),_y(h.text,h.workerTaskId);return}if(h.kind==="exit-plan-mode"){ts(),ns();let x=es.get(h.toolCallId),A={plan:h.plan??x?.plan??"",status:h.status??x?.status};if(es.set(h.toolCallId,A),A.plan.length===0)return;let P=Vh(A);P.length>0&&I.upsertLines(h.toolCallId,P);return}if(h.kind==="tool-call"){ts(),ns(),et.has(h.toolCallId)||q(h.workerTaskId),cu(h.toolCallId,h.title,h.status,void 0,h.editDiff,h.detail,h.detailFull,h.locations,h.workerTaskId,w),Kt(),lu(h.toolCallId);return}if(h.kind==="plan"){ts(),ns(),F=h;let x=ms(h,Be());x.length>0&&I.upsertLines("plan",[{body:""},...x]);let A=h.entries.length>0&&h.entries.every(P=>(P.status??"pending")==="completed");I.setStickyBottomKey(A?null:"plan");return}if(h.kind==="tool-call-update"){ts(),ns(),cu(h.toolCallId,h.title,h.status,h.errorText,h.editDiff,h.detail,h.detailFull,h.locations,h.workerTaskId,w),h.upstreamInterrupted&&(Je=!0),Kt(),lu(h.toolCallId);return}h.kind==="model-changed"&&I.setSessionbar({model:h.model});let S=ms(h);if(S.length>0&&I.appendLines(S),h.kind==="turn-complete"){se=void 0,ts(),ns();let x=h.amended?"amended":h.stopReason;if(!h.amended&&Je&&(x===void 0||x==="end_turn")&&(x="error"),F!==null&&x!==void 0&&x!=="end_turn"){let A=ms({...F,stopped:!0,amended:h.amended===!0},Be());A.length>0&&I.upsertLines("plan",[{body:""},...A])}F=null,ee=null,I.clearKey("plan"),I.setStickyBottomKey("plan"),T!==null?(B=Date.now(),oe=x??null,Kt(),$d()):x!==void 0&&x!=="end_turn"&&x!=="amended"&&I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:`turn ended: ${x}`,bodyStyle:"tool-status-fail"}]),et.clear(),es.clear(),_n.length=0,T=null,B=null,oe=null,Je=!1,I.ensureSeparator(),ay({pendingTurns:U,queueSize:pt.size,ownTurnInFlight:ft!==null,hasInFlightHead:se!==void 0,replayDraining:k,amended:h.amended===!0})&&j(-U)}};let uu=y;y=[];let Oo=[];for(let{event:h}of uu)h.kind==="user-text"&&typeof h.text=="string"&&Oo.push(h.text);I.pauseRepaint(),k=!0;try{for(let{event:h,rawUpdate:w}of uu)v(h,w)}finally{k=!1,I.resumeRepaint()}if(Oo.length>0){let h=$c(Ve,Oo);h!==Ve&&(Ve=h,Wt=$c(Wt,Oo),he.setHistory(aa(Ft,Wt)),qs(tn,Ve).catch(()=>{}))}vi=!0,Ie!==void 0&&U>0?(Z=Ie,I.setBanner({status:"busy",elapsedMs:Date.now()-Ie}),ne===null&&(ne=ue()),T===null&&au(),T=Ie,Kt()):Ie===void 0&&U>0&&j(-U);let jy=()=>{if(be){let h=be.resolve;be=null,I.setPermissionPrompt(null),h({outcome:{outcome:"cancelled"}})}ts(),ns()},fu=()=>{T!==null&&(B=Date.now(),oe="reconnect-recovery-failed",Kt(),$d(),et.clear(),es.clear(),_n.length=0,T=null,B=null,oe=null)};return p=()=>{I.setBanner({status:"disconnected",elapsedMs:void 0})},u=async()=>{jy();let h={jsonrpc:"2.0",id:`tui-reinit-${ly()}`,method:"initialize",params:{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:"hydra-acp-tui",version:fe}}};try{await m.request(h)}catch{}let w=$e!==void 0,S={jsonrpc:"2.0",id:`tui-reattach-${ly()}`,method:"session/attach",params:{sessionId:ve,historyPolicy:w?"after_message":"none",...w?{afterMessageId:$e}:{},clientInfo:{name:"hydra-acp-tui",version:fe},...(()=>{let _={};return xs!==void 0&&(_.resume={upstreamSessionId:xs,agentId:At,cwd:Ke}),e.tui.toolContent==="references"&&(_.toolContent="references"),Object.keys(_).length>0?{_meta:{[lt]:_}}:{}})()}};kn=[];let x,A,P;try{let _=await m.request(S);if(_.error)throw new Error(_.error.message);P=oy(_.result),x=P.appliedPolicy,P.clientId!==void 0&&(Vn=P.clientId)}catch(_){A=_}let L=kn??[];if(kn=null,A)fu(),I.appendLines([{prefix:" ",body:`reattach failed: ${A.message}`,bodyStyle:"tool-status-fail"}]);else if(w&&x!=="after_message")fu(),I.appendLines([{prefix:"\u26A0 ",prefixStyle:"tool-status-fail",body:"reconnect couldn't replay events since last seen \u2014 scrollback may be incomplete",bodyStyle:"tool-status-fail"}]);else{k=!0;try{for(let _ of L)Ot(_)}finally{k=!1}}if(P){let _=dy({daemonTurnStartedAt:P.turnStartedAt,pendingTurns:U});_.pendingTurnsDelta!==0&&j(_.pendingTurnsDelta),_.banner==="busy"&&_.busySince!==void 0?(Z=_.busySince,I.setBanner({status:"busy",elapsedMs:Date.now()-_.busySince}),ne===null&&(ne=ue())):I.setBanner({status:"ready",elapsedMs:void 0})}else I.setBanner({status:U>0?"busy":"ready",elapsedMs:U>0?0:void 0})},g.onClose(h=>{h&&t.red(`
167
167
  connection lost: ${h.message}
168
168
  `),C(h?1:0)}),process.on("SIGINT",an),s.initialPrompt&&a.sessionId==="__new__"&&Ms(s.initialPrompt,[]),await hr}async function gC(t,e,n,s,r){let i=s.cwd??process.cwd();if(s.sessionId){let o={sessionId:s.sessionId,agentId:s.agentId??"",cwd:i};return s.resumeHint!==void 0&&(o.resumeHint=s.resumeHint),o}if(s.forceNew)return await hy(t,n,s)!=="ok"?null:py(s,i,e);if(s.resume){let o=await bn(n,{cwd:i,all:!0}),a=Ja(o,i);return a?{sessionId:a.sessionId,agentId:a.agentId??"",cwd:i}:(t.yellow(`No sessions found for ${i}.
169
169
  `),null)}for(;;){let o=await bn(n,{includeNonInteractive:!0}),a=await eu(t,{cwd:i,sessions:o,config:e,target:n,prefs:r,...s.initialPrompt!==void 0?{initialPrompt:s.initialPrompt}:{}});if(a.kind==="abort"||a.kind==="exit")return null;if(a.kind==="new"){a.prompt!==void 0&&(s.initialPrompt=a.prompt),a.cwd!==void 0&&(i=a.cwd,s.cwd=a.cwd);let l=await hy(t,n,s);if(l==="cancel")return null;if(l==="back")continue;return py(s,i,e)}if(a.kind==="fork"){let l=await yy(t,n,a,o);if(l.kind==="cancel")return null;if(l.kind==="back")continue;return l.ctx}s.readonly=a.readonly===!0;let d=o.find(l=>l.sessionId===a.sessionId);if(d!==void 0&&!!d.importedFromMachine&&!d.upstreamSessionId&&!s.readonly){let l=await gy(t,d,a,s);if(l.kind==="cancel")return null;if(l.kind==="back")continue;return l.ctx}if(n.isLocal&&d&&!d.importedFromMachine&&!s.readonly&&!(await po(d.cwd)).ok){let f=await ar(t,d,{defaultCwd:Nt(e.defaultCwd),title:"Working directory missing \u2014 choose cwd",intro:"This session's working directory no longer exists. Pick a new one:"});if(f.kind==="cancel")return null;if(f.kind==="back")continue;let u=a.agentId??d.agentId??"";return{sessionId:a.sessionId,agentId:u,cwd:f.path,resumeHint:{agentId:u,cwd:f.path,upstreamSessionId:""}}}return{sessionId:a.sessionId,agentId:a.agentId??"",cwd:i}}}async function gy(t,e,n,s){for(;;){let r=await Jg(t,e);if(r==="cancel")return{kind:"cancel"};if(r==="back")return{kind:"back"};if(r==="view"){s.readonly=!0;let a=n.agentId??e.agentId??"";return{kind:"ctx",ctx:{sessionId:n.sessionId,agentId:a,cwd:e.cwd}}}let i=await ar(t,e);if(i.kind==="cancel")return{kind:"cancel"};if(i.kind==="back")continue;let o=n.agentId??e.agentId??"";return{kind:"ctx",ctx:{sessionId:n.sessionId,agentId:o,cwd:i.path,resumeHint:{agentId:o,cwd:i.path,upstreamSessionId:""}}}}}async function yy(t,e,n,s){let r=s.find(d=>d.sessionId===n.sourceSessionId),i=!!n.sourceImportedFromMachine&&!n.sourceUpstreamSessionId,o=n.sourceCwd;if(i){if(!r)return{kind:"back"};let d=await ar(t,r);if(d.kind==="cancel")return{kind:"cancel"};if(d.kind==="back")return{kind:"back"};o=d.path}let a;try{a=await Wa(e,n.sourceSessionId,i?{cwd:o}:{})}catch(d){return t.red(`
170
170
  fork failed: ${d.message}
171
171
  `),{kind:"cancel"}}return{kind:"ctx",ctx:{sessionId:a.sessionId,agentId:n.sourceAgentId??"",cwd:o,...i?{resumeHint:{agentId:n.sourceAgentId??"",cwd:o,upstreamSessionId:""}}:{}}}}function py(t,e,n){return{sessionId:"__new__",agentId:t.agentId??n.defaultAgent??"",cwd:e}}async function hy(t,e,n){if(n.agentId||await xu())return"ok";let s;try{s=await Qc(e)}catch{return"ok"}if(s.length===0)return"ok";let r=await ye(),i=await Xg(t,s,r.defaultAgent);if(i.kind==="cancel")return"cancel";if(i.kind==="back")return"back";if(n.agentId=i.agentId,i.persist)try{await Bo(i.agentId)}catch{}return"ok"}function yC(t,e){wC({src:"session/update",update:t,event:e===null?null:{kind:e.kind}})}function wC(t){let e=process.env.HYDRA_TUI_DEBUG_LOG,n=e===void 0?M.tuiLogFile():e;if(n.length!==0)try{vC(n);let s=JSON.stringify({t:new Date().toISOString(),...t});iC(n,`${s}
172
172
  `)}catch{}}function bC(t,e){let n=!1,s="",r=!1,i=d=>{n||d===3&&r||d===0&&!r||(r=d===3,process.stdout.write(`\x1B]9;4;${d}\x1B\\`))},o=d=>{n||(process.stdout.write("\r"),t.eraseLineAfter(),t.brightYellow(d),s=d)},a=d=>{let c=`${d.agentId}@${d.version}`;if(d.source==="npm")return d.phase==="install_start"||d.phase==="download_start"?`${e} installing ${c} via npm\u2026`:d.phase==="installed"?`${e} ${c} installed`:`${e} installing ${c} via npm\u2026`;if(d.phase==="download_start"||d.phase==="download_progress"){let l=d.receivedBytes??0,f=d.totalBytes??0,u=(l/1e6).toFixed(1);if(f>0){let p=(f/1e6).toFixed(1),m=Math.min(100,Math.floor(l/f*100));return`${e} downloading ${c} ${u}/${p} MB (${m}%)`}return`${e} downloading ${c} ${u} MB`}return d.phase==="download_done"?`${e} downloaded ${c}, verifying\u2026`:d.phase==="extract"?`${e} extracting ${c}\u2026`:d.phase==="installed"?`${e} ${c} installed`:s||e};return{write(d){n||(t.brightYellow(d),s=d)},applyProgress(d){if(n)return;d.phase==="download_start"||d.phase==="download_progress"||d.phase==="install_start"||d.phase==="extract"||d.phase==="download_done"?i(3):d.phase==="installed"&&i(0),o(a(d))},finalize(){n||(n=!0,i(0),process.stdout.write(`
173
- `))}}}function vC(t){try{if(aC(t).size<wy)return;dC(t,`${t}.0`)}catch{}}var uC,fC,wy,by=q(()=>{"use strict";Us();yt();Il();qe();Cl();Ds();Ys();Vi();Mi();hn();ge();_t();dd();xl();da();to();wg();bg();Qg();Ql();Gl();Zg();vl();Yl();Pl();gd();Ll();Ad();iy();cy();cs();ni();uC=12e4;fC=[["Alt+Enter","newline in prompt"],["Shift+Tab","cycle agent modes (plan / accept-edits / etc.)"],["Tab","indent \xB7 slash-command / file-path completion"],null,["\u2191 / \u2193","prompt history \xB7 queue navigation"],["\u2190/\u2192 Home/End","cursor movement"],["Alt+B / Alt+F","word back / forward"],["^A / ^E","line start / end"],["^W / ^U / ^K","kill word / line / to end"],["^Y","yank last kill"],null,["^P","switch session (picker)"],["Alt+N / Alt+Tab","next live session"],["^T","show / hide thoughts"],["^V","paste image from clipboard"],["^O","session options (tools \xB7 plan \xB7 thoughts \xB7 diffs \xB7 mouse \xB7 enter)"],null,["^R","history reverse search (^S walks forward once engaged)"],["PgUp / PgDn","scroll scrollback"],["Mouse wheel","scroll scrollback (when mouse capture is on)"],["Middle-click","paste PRIMARY selection (terminal-style)"],["^X","toggle mouse capture (wheel scroll vs. text selection)"],null,["^C","cancel turn (twice to exit)"],["Esc","cancel turn and prefill draft"],["^D","exit (or delete-forward in prompt)"],["^L","force full redraw"],["^G","toggle this help"]];wy=5*1024*1024});var vy={};Wy(vy,{runTui:()=>my});var Iy=q(()=>{"use strict";by()});import{readFileSync as IC}from"fs";import{fileURLToPath as SC}from"url";import{dirname as kC,resolve as xC}from"path";var pu=new Set(["all","dangerously-skip-permissions","detach","diff","disabled","drip","fold","follow","force","foreground","help","include-cat","info","json","new","no-color","no-pager","raw","reattach","readonly","replace","rotate-token","verbose","version"]),Jy=new Set(["agent","args","columns","command","cwd","drip-speed","env","host","model","name","out","prompt","session","stream-bytes","stream-threshold","tail"]);function hu(t){for(let e of Object.keys(t))if(!pu.has(e)&&!Jy.has(e))return e}function Fd(t){let e=[],n={},s=0;for(;s<t.length;){let r=t[s];if(r===void 0)break;if(r.startsWith("--")){let i=r.indexOf("=");if(i!==-1){let d=r.slice(2,i);n[d]=r.slice(i+1),s+=1;continue}let o=r.slice(2);if(pu.has(o)){n[o]=!0,s+=1;continue}let a=t[s+1];if(a!==void 0&&!a.startsWith("--")){n[o]=a,s+=2;continue}n[o]=!0,s+=1;continue}e.push(r),s+=1}return{positional:e,flags:n}}function zy(t,e){let n=t[e];if(typeof n=="string")return n}function br(t,e){return t[e]===!0||t[e]==="true"}var Ky="HYDRA_ACP_";function Vy(t){return Ky+t.toUpperCase().replace(/-/g,"_")}function tt(t,e){let n=zy(t,e);return n!==void 0?n:process.env[Vy(e)]}qe();Ds();async function $u(t,e){let n=typeof t=="string"&&t.trim().length>0?t.trim():void 0;if(n===void 0)return;if(n.startsWith("hydra://")){let i=Ud(n);return{target:await Mu(i,{allowPrompt:e.allowPrompt}),sessionId:i.sessionId,fromUrl:!0}}let s=await ye();return{target:await Dt(s),sessionId:n,fromUrl:!1}}function Kd(t){let e=t.session;if(typeof e=="string"&&e.length>0)return e;let n=process.env.HYDRA_ACP_SESSION;if(typeof n=="string"&&n.length>0)return n}ge();qe();Fn();import*as Ou from"fs/promises";async function Fu(t){if(await Ou.mkdir(M.home(),{recursive:!0}),await Lo(),!await Sr()){let n=Ir();await kr(n),process.stdout.write(`Initialized ${M.authToken()}
173
+ `))}}}function vC(t){try{if(aC(t).size<wy)return;dC(t,`${t}.0`)}catch{}}var uC,fC,wy,by=J(()=>{"use strict";Us();yt();Il();je();Cl();Ds();Ys();Vi();Mi();hn();ge();_t();dd();xl();da();to();wg();bg();Qg();Ql();Gl();Zg();vl();Yl();Pl();gd();Ll();Ad();iy();cy();cs();ni();uC=12e4;fC=[["Alt+Enter","newline in prompt"],["Shift+Tab","cycle agent modes (plan / accept-edits / etc.)"],["Tab","indent \xB7 slash-command / file-path completion"],null,["\u2191 / \u2193","prompt history \xB7 queue navigation"],["\u2190/\u2192 Home/End","cursor movement"],["Alt+B / Alt+F","word back / forward"],["^A / ^E","line start / end"],["^W / ^U / ^K","kill word / line / to end"],["^Y","yank last kill"],null,["^P","switch session (picker)"],["Alt+N / Alt+Tab","next live session"],["^T","show / hide thoughts"],["^V","paste image from clipboard"],["^O","session options (tools \xB7 plan \xB7 thoughts \xB7 diffs \xB7 mouse \xB7 enter)"],null,["^R","history reverse search (^S walks forward once engaged)"],["PgUp / PgDn","scroll scrollback"],["Mouse wheel","scroll scrollback (when mouse capture is on)"],["Middle-click","paste PRIMARY selection (terminal-style)"],["^X","toggle mouse capture (wheel scroll vs. text selection)"],null,["^C","cancel turn (twice to exit)"],["Esc","cancel turn and prefill draft"],["^D","exit (or delete-forward in prompt)"],["^L","force full redraw"],["^G","toggle this help"]];wy=5*1024*1024});var vy={};Wy(vy,{runTui:()=>my});var Iy=J(()=>{"use strict";by()});import{readFileSync as IC}from"fs";import{fileURLToPath as SC}from"url";import{dirname as kC,resolve as xC}from"path";var pu=new Set(["all","dangerously-skip-permissions","detach","diff","disabled","drip","fold","follow","force","foreground","help","include-cat","info","json","new","no-color","no-pager","raw","reattach","readonly","replace","rotate-token","verbose","version"]),Jy=new Set(["agent","args","columns","command","cwd","drip-speed","env","host","model","name","out","prompt","session","stream-bytes","stream-threshold","tail"]);function hu(t){for(let e of Object.keys(t))if(!pu.has(e)&&!Jy.has(e))return e}function Fd(t){let e=[],n={},s=0;for(;s<t.length;){let r=t[s];if(r===void 0)break;if(r.startsWith("--")){let i=r.indexOf("=");if(i!==-1){let d=r.slice(2,i);n[d]=r.slice(i+1),s+=1;continue}let o=r.slice(2);if(pu.has(o)){n[o]=!0,s+=1;continue}let a=t[s+1];if(a!==void 0&&!a.startsWith("--")){n[o]=a,s+=2;continue}n[o]=!0,s+=1;continue}e.push(r),s+=1}return{positional:e,flags:n}}function zy(t,e){let n=t[e];if(typeof n=="string")return n}function br(t,e){return t[e]===!0||t[e]==="true"}var Ky="HYDRA_ACP_";function Vy(t){return Ky+t.toUpperCase().replace(/-/g,"_")}function tt(t,e){let n=zy(t,e);return n!==void 0?n:process.env[Vy(e)]}je();Ds();async function $u(t,e){let n=typeof t=="string"&&t.trim().length>0?t.trim():void 0;if(n===void 0)return;if(n.startsWith("hydra://")){let i=Ud(n);return{target:await Mu(i,{allowPrompt:e.allowPrompt}),sessionId:i.sessionId,fromUrl:!0}}let s=await ye();return{target:await Dt(s),sessionId:n,fromUrl:!1}}function Kd(t){let e=t.session;if(typeof e=="string"&&e.length>0)return e;let n=process.env.HYDRA_ACP_SESSION;if(typeof n=="string"&&n.length>0)return n}ge();je();Fn();import*as Ou from"fs/promises";async function Fu(t){if(await Ou.mkdir(M.home(),{recursive:!0}),await Lo(),!await Sr()){let n=Ir();await kr(n),process.stdout.write(`Initialized ${M.authToken()}
174
174
  Service token: ${n}
175
175
  `);return}if(br(t,"rotate-token")){let n=Ir();await kr(n),process.stdout.write(`Rotated token in ${M.authToken()}
176
176
  New token: ${n}
177
177
  `);return}process.stdout.write(`Service token already exists at ${M.authToken()}.
178
178
  `),process.stdout.write(`Pass --rotate-token to generate a new service token.
179
- `)}ge();qe();Fn();import*as uh from"fs/promises";import{setTimeout as bS}from"timers/promises";import lh from"chalk";import*as ah from"fs";import*as us from"fs/promises";import cS from"fastify";import lS from"@fastify/websocket";var Lu="acp.v1";function Bu(t,e){return t.has(Lu)?Lu:!1}qe();import oh from"pino";import uS from"pino-roll";ge();import*as ct from"fs/promises";import{createHash as gw}from"crypto";import{gzip as yw,gunzip as ww}from"zlib";import{promisify as Nu}from"util";var Du=Nu(yw),bw=Nu(ww),Hu=/^[A-Za-z0-9_-]+$/,vw=/^[a-f0-9]{64}$/,Vd=!0;function Uu(t){Vd=t}function Ho(t,e){return Hu.test(t)?e===void 0||vw.test(e):!1}function Uo(t,e){return`${M.toolBlobFile(t,e)}.gz`}async function Yd(t,e){if(!Ho(t))return null;let n=gw("sha256").update(e,"utf8").digest("hex"),s=Uo(t,n),r=M.toolBlobFile(t,n);for(let a of[s,r])try{return await ct.access(a),n}catch{}await ct.mkdir(M.toolsDir(t),{recursive:!0});let i=Vd?s:r,o=Vd?await Du(Buffer.from(e,"utf8")):Buffer.from(e,"utf8");return await ct.writeFile(i,o,{mode:384,flag:"wx"}).catch(async a=>{if(a.code!=="EEXIST")throw a}),n}async function jo(t,e){if(!Ho(t,e))return null;try{let n=await ct.readFile(Uo(t,e));return(await bw(n)).toString("utf8")}catch{}try{return await ct.readFile(M.toolBlobFile(t,e),"utf8")}catch{return null}}async function ju(t,e){if(!Ho(t,e))return null;try{return await ct.readFile(Uo(t,e))}catch{}try{let n=await ct.readFile(M.toolBlobFile(t,e));return await Du(n)}catch{return null}}async function qu(t,e,n){if(!Ho(t,e))return;let s=Uo(t,e);try{await ct.access(s);return}catch{}await ct.mkdir(M.toolsDir(t),{recursive:!0}),await ct.writeFile(s,n,{mode:384,flag:"wx"}).catch(r=>{if(r.code!=="EEXIST")throw r})}async function Wu(t){Hu.test(t)&&await ct.rm(M.toolsDir(t),{recursive:!0,force:!0}).catch(()=>{})}ge();Ns();import*as tf from"fs/promises";import*as Wo from"path";import{z as re}from"zod";ge();import*as zu from"fs";import*as gt from"fs/promises";import*as rs from"path";import{spawn as Ku}from"child_process";import{Readable as Iw}from"stream";function ln(){let t=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(!(!t||!e))return`${t}-${e}`}function Xd(t,e=ln()){if(e)return t[e]}var Cr=t=>{process.stderr.write(t+`
179
+ `)}ge();je();Fn();import*as uh from"fs/promises";import{setTimeout as bS}from"timers/promises";import lh from"chalk";import*as ah from"fs";import*as us from"fs/promises";import cS from"fastify";import lS from"@fastify/websocket";var Lu="acp.v1";function Bu(t,e){return t.has(Lu)?Lu:!1}je();import oh from"pino";import uS from"pino-roll";ge();import*as ct from"fs/promises";import{createHash as gw}from"crypto";import{gzip as yw,gunzip as ww}from"zlib";import{promisify as Nu}from"util";var Du=Nu(yw),bw=Nu(ww),Hu=/^[A-Za-z0-9_-]+$/,vw=/^[a-f0-9]{64}$/,Vd=!0;function Uu(t){Vd=t}function Ho(t,e){return Hu.test(t)?e===void 0||vw.test(e):!1}function Uo(t,e){return`${M.toolBlobFile(t,e)}.gz`}async function Yd(t,e){if(!Ho(t))return null;let n=gw("sha256").update(e,"utf8").digest("hex"),s=Uo(t,n),r=M.toolBlobFile(t,n);for(let a of[s,r])try{return await ct.access(a),n}catch{}await ct.mkdir(M.toolsDir(t),{recursive:!0});let i=Vd?s:r,o=Vd?await Du(Buffer.from(e,"utf8")):Buffer.from(e,"utf8");return await ct.writeFile(i,o,{mode:384,flag:"wx"}).catch(async a=>{if(a.code!=="EEXIST")throw a}),n}async function jo(t,e){if(!Ho(t,e))return null;try{let n=await ct.readFile(Uo(t,e));return(await bw(n)).toString("utf8")}catch{}try{return await ct.readFile(M.toolBlobFile(t,e),"utf8")}catch{return null}}async function ju(t,e){if(!Ho(t,e))return null;try{return await ct.readFile(Uo(t,e))}catch{}try{let n=await ct.readFile(M.toolBlobFile(t,e));return await Du(n)}catch{return null}}async function qu(t,e,n){if(!Ho(t,e))return;let s=Uo(t,e);try{await ct.access(s);return}catch{}await ct.mkdir(M.toolsDir(t),{recursive:!0}),await ct.writeFile(s,n,{mode:384,flag:"wx"}).catch(r=>{if(r.code!=="EEXIST")throw r})}async function Wu(t){Hu.test(t)&&await ct.rm(M.toolsDir(t),{recursive:!0,force:!0}).catch(()=>{})}ge();Ns();import*as tf from"fs/promises";import*as Wo from"path";import{z as re}from"zod";ge();import*as zu from"fs";import*as gt from"fs/promises";import*as rs from"path";import{spawn as Ku}from"child_process";import{Readable as Iw}from"stream";function ln(){let t=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(!(!t||!e))return`${t}-${e}`}function Xd(t,e=ln()){if(e)return t[e]}var Cr=t=>{process.stderr.write(t+`
180
180
  `)};function Zd(t){Cr=t??(e=>process.stderr.write(e+`
181
181
  `))}async function Vu(t){if(!t.target.archive)throw new Error(`Agent ${t.agentId} has no archive URL for ${ln()??"this platform"}`);if(!t.target.cmd)throw new Error(`Agent ${t.agentId} has no cmd in its binary target`);let e=ln();if(!e)throw new Error(`Agent ${t.agentId}: cannot determine platform key for ${process.platform}/${process.arch}`);let n=M.agentInstallDir(t.agentId,e,t.version),s=rs.resolve(n,t.target.cmd);if(await Qd(s))return s;if(await Sw({agentId:t.agentId,version:t.version,archiveUrl:t.target.archive,installDir:n,onProgress:t.onProgress}),!await Qd(s))throw new Error(`Agent ${t.agentId}: extracted archive did not contain ${t.target.cmd} (looked in ${n})`);return process.platform!=="win32"&&await gt.chmod(s,493).catch(()=>{}),s}async function Sw(t){await gt.mkdir(rs.dirname(t.installDir),{recursive:!0});let e=await gt.mkdtemp(`${t.installDir}.partial-`);try{Cr(`hydra-acp: downloading ${t.agentId} from ${t.archiveUrl}`);let n=await kw({url:t.archiveUrl,dir:e,agentId:t.agentId,version:t.version,onProgress:t.onProgress});Cr(`hydra-acp: extracting ${t.agentId}`),Rr(t.onProgress,{phase:"extract",agentId:t.agentId,version:t.version}),await Aw(n,e),await gt.unlink(n).catch(()=>{});try{await gt.rename(e,t.installDir)}catch(s){let r=s;if((r.code==="EEXIST"||r.code==="ENOTEMPTY")&&await Qd(t.installDir)){await gt.rm(e,{recursive:!0,force:!0}).catch(()=>{}),Rr(t.onProgress,{phase:"installed",agentId:t.agentId,version:t.version});return}throw s}Cr(`hydra-acp: installed ${t.agentId} to ${t.installDir}`),Rr(t.onProgress,{phase:"installed",agentId:t.agentId,version:t.version})}catch(n){throw await gt.rm(e,{recursive:!0,force:!0}).catch(()=>{}),n}}function Rr(t,e){if(t)try{t(e)}catch{}}async function kw(t){let e=xw(t.url),n=rs.join(t.dir,e),s=await fetch(t.url,{redirect:"follow"});if(!s.ok||!s.body)throw new Error(`Failed to download ${t.url}: HTTP ${s.status} ${s.statusText}`);let r=Number(s.headers.get("content-length")??"0"),i=zu.createWriteStream(n),o=Iw.fromWeb(s.body);Rr(t.onProgress,{phase:"download_start",agentId:t.agentId,version:t.version,totalBytes:r});let a=0,d=Date.now(),c=0,l=2e3,f=150;return o.on("data",u=>{a+=u.length;let p=Date.now();p-c>=f&&(c=p,Rr(t.onProgress,{phase:"download_progress",agentId:t.agentId,version:t.version,receivedBytes:a,totalBytes:r})),p-d>=l&&(d=p,Cr(Ju(t.agentId,a,r)))}),await new Promise((u,p)=>{o.on("error",p),i.on("error",p),i.on("finish",()=>u()),o.pipe(i)}),Cr(Ju(t.agentId,a,r,!0)),Rr(t.onProgress,{phase:"download_done",agentId:t.agentId,version:t.version,receivedBytes:a,totalBytes:r}),n}function Ju(t,e,n,s=!1){let r=(e/1e6).toFixed(1);if(n>0){let o=(n/1e6).toFixed(1),a=Math.min(100,Math.floor(e/n*100));return`hydra-acp: ${s?"downloaded":"downloading"} ${t} ${r}/${o} MB (${a}%)`}return`hydra-acp: ${s?"downloaded":"downloading"} ${t} ${r} MB`}function xw(t){let e=new URL(t);return rs.posix.basename(e.pathname)||"archive"}async function Aw(t,e){let n=t.toLowerCase();if(n.endsWith(".tar.gz")||n.endsWith(".tgz")||n.endsWith(".tar")){await Gd("tar",["-xf",t,"-C",e]);return}if(n.endsWith(".zip")){if(await Cw("unzip")){await Gd("unzip",["-q",t,"-d",e]);return}await Gd("tar",["-xf",t,"-C",e]);return}throw new Error(`Unsupported archive format: ${t}`)}function Gd(t,e){return new Promise((n,s)=>{let r=Ku(t,e,{stdio:["ignore","ignore","inherit"]});r.on("error",s),r.on("exit",(i,o)=>{if(i===0){n();return}s(new Error(`${t} ${e.join(" ")} exited with ${i!==null?`code ${i}`:`signal ${o}`}`))})})}async function Cw(t){return new Promise(e=>{let n=process.platform==="win32"?"where":"which",s=Ku(n,[t],{stdio:"ignore"});s.on("error",()=>e(!1)),s.on("exit",r=>e(r===0))})}async function Qd(t){try{return await gt.access(t),!0}catch{return!1}}ge();import*as Pt from"fs/promises";import*as un from"path";import{spawn as Rw}from"child_process";var tc=t=>{process.stderr.write(t+`
182
182
  `)};function nc(t){tc=t??(e=>process.stderr.write(e+`
@@ -203,7 +203,7 @@ ${gc}`:gc;await n.connection.request("session/prompt",{sessionId:d,prompt:[{type
203
203
  `).filter(o=>o.length>0);if(r.length<=n)return;let i=r.slice(-n);await wt.writeFile(M.historyFile(e),i.join(`
204
204
  `)+`
205
205
  `,{encoding:"utf8",mode:384})})}async load(e,n={}){if(!Ni.test(e))return[];let s=(n.tools??"inline")==="inline",r=this.writeQueues.get(e);r&&await r;let i;try{i=await wt.readFile(M.historyFile(e),"utf8")}catch(f){if(f.code==="ENOENT")return[];throw f}let o=[];for(let f of i.split(`
206
- `)){if(f.length===0)continue;let u;try{u=JSON.parse(f)}catch{continue}if(!u||typeof u!="object"||Array.isArray(u))continue;let p=u;typeof p.method=="string"&&typeof p.recordedAt=="number"&&o.push({method:p.method,params:p.params,recordedAt:p.recordedAt})}let a=o.length>this.maxEntries?o.slice(-this.maxEntries):o;if(!s)return a;let d=new Map,c=async f=>{let u=d.get(f);if(u!==void 0)return u;let p=await jo(e,f);return d.set(f,p),p},l=[];for(let f of a)l.push(await Zf(f,c));return l}async flushAll(){let e=[...this.writeQueues.values()];e.length!==0&&await Promise.allSettled(e)}async delete(e){if(Ni.test(e))return this.enqueue(e,async()=>{try{await wt.unlink(M.historyFile(e))}catch(n){if(n.code!=="ENOENT")throw n}await Wu(e);try{await wt.rmdir(M.sessionDir(e))}catch(n){let s=n;if(s.code!=="ENOENT"&&s.code!=="ENOTEMPTY")throw n}})}enqueue(e,n){let r=(this.writeQueues.get(e)??Promise.resolve()).then(n,n),i=r.catch(()=>{});return this.writeQueues.set(e,i),i.finally(()=>{this.writeQueues.get(e)===i&&this.writeQueues.delete(e)}),r}};ge();qe();da();Ws();ea();yt();_t();uc();var np=900*1e3,av="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",ca=ov(av,16),ua=class t{constructor(e,n,s,r={}){this.registry=e;this.spawner=n??(i=>os.spawn(i)),this.store=s??new na,this.tombstones=r.tombstones??new sa,this.sessionHistoryMaxEntries=r.sessionHistoryMaxEntries??1e3,this.histories=new oa({maxEntries:this.sessionHistoryMaxEntries}),this.idleTimeoutMs=r.idleTimeoutMs??0,this.idleEventTimeoutMs=r.idleEventTimeoutMs??3e4,this.defaultModels=r.defaultModels??{},this.synopsisAgent=r.synopsisAgent,this.synopsisModel=r.synopsisModel,this.synopsisOnClose=r.synopsisOnClose??!1,this.defaultTransformers=r.defaultTransformers??[],this.logger=r.logger,this.npmRegistry=r.npmRegistry,this.extensionCommands=r.extensionCommands,this.defaultCwd=r.defaultCwd??"~",this.synopsisCoordinator=new ia({registry:this.registry,store:this.store,histories:this.histories,synopsisAgent:this.synopsisAgent,synopsisModel:this.synopsisModel,persistTitle:async(i,o)=>{let a=this.get(i);if(a){await a.retitle(o);return}await this.persistTitle(i,o)},persistSynopsis:(i,o,a)=>this.persistSynopsis(i,o,a),logger:this.logger,npmRegistry:this.npmRegistry}),this.refreshAgentCatalog()}registry;sessions=new Map;resurrectionInflight=new Map;pendingAuthAgents=new Map;spawner;store;tombstones;histories;idleTimeoutMs;defaultModels;synopsisAgent;synopsisModel;synopsisOnClose;defaultTransformers;idleEventTimeoutMs;sessionHistoryMaxEntries;metaWriteQueues=new Map;listCache=new Map;static LIST_CACHE_TTL_MS=500;logger;npmRegistry;extensionCommands;defaultCwd;synopsisCoordinator;agentCatalog=[];async refreshAgentCatalog(){try{let{agents:e}=await Er(this.registry);this.agentCatalog=e.map(n=>({id:n.id,name:n.name,...n.description!==void 0?{description:n.description}:{}}))}catch{}}async create(e){let n=await this.bootstrapAgent({agentId:e.agentId,cwd:e.cwd,agentArgs:e.agentArgs,mcpServers:e.mcpServers,model:e.model,onInstallProgress:e.onInstallProgress,forwardedEnv:e.forwardedEnv});if(e.transformChain&&e.transformChain.length>0){let r={...n.agentCapabilities??{}};for(let i of e.transformChain)if(i.intercepts.has("agent:initialize"))try{let o=await i.connection.request("hydra-acp/transformer/message",{token:`t_${ca()}`,phase:"response",method:"initialize",direction:"agent\u2192daemon",sessionId:"(pre-session)",envelope:r});o.action==="stop"&&o.payload&&(r=o.payload)}catch{}n.agentCapabilities=r}let s=new Fr({cwd:e.cwd,agentId:e.agentId,agent:n.agent,upstreamSessionId:n.upstreamSessionId,agentMeta:n.agentMeta,agentCapabilities:n.agentCapabilities,title:e.title,agentArgs:e.agentArgs,idleTimeoutMs:this.idleTimeoutMs,idleEventTimeoutMs:this.idleEventTimeoutMs,logger:this.logger,spawnReplacementAgent:r=>this.bootstrapAgent({...r,mcpServers:[]}),listSessions:()=>this.list(),availableAgents:()=>this.agentCatalog,historyStore:this.histories,historyMaxEntries:this.sessionHistoryMaxEntries,currentModel:n.initialModel,currentMode:n.initialMode,agentModes:n.initialModes,agentModels:n.initialModels,transformChain:e.transformChain,parentSessionId:e.parentSessionId,originatingClient:e.originatingClient,interactive:e.interactive,forwardedEnv:e.forwardedEnv,extensionCommands:this.extensionCommands,scheduleSynopsis:()=>this.synopsisCoordinator.schedule(s.sessionId)});return await this.attachManagerHooks(s),s}async resurrect(e){let n=this.sessions.get(e.hydraSessionId);if(n){if(n.upstreamSessionId!==e.upstreamSessionId){let i=new Error(`session ${e.hydraSessionId} already exists with a different upstream id`);throw i.code=D.AlreadyAttached,i}return n}let s=this.resurrectionInflight.get(e.hydraSessionId);if(s)return s;let r=this.doResurrect(e);this.resurrectionInflight.set(e.hydraSessionId,r);try{return await r}finally{this.resurrectionInflight.delete(e.hydraSessionId)}}async doResurrect(e){let n=this.sessions.get(e.hydraSessionId);if(n)return n;let s=await this.registry.getAgent(e.agentId);if(!s){let g=new Error(`agent ${e.agentId} not found in registry; cannot resurrect`);throw g.code=D.AgentNotInstalled,g}if(e.upstreamSessionId==="")return this.doResurrectFromImport(e);if(!await this.dirExists(e.cwd))return this.doResurrectFromImport(e);let r=await fn(s,e.agentArgs??[],{npmRegistry:this.npmRegistry,onInstallProgress:e.onInstallProgress}),i=this.spawner({agentId:e.agentId,cwd:e.cwd,plan:r,...e.forwardedEnv?{extraEnv:e.forwardedEnv}:{}}),o;try{let g=await i.connection.request("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:{name:"hydra",version:fe}});o=g.agentCapabilities,i.authMethods=la(g.authMethods)}catch(g){throw await i.kill().catch(()=>{}),Js(g,i)}let a;try{let g=uv(e.agentId,e.currentModel);a=await i.connection.request("session/load",{sessionId:e.upstreamSessionId,cwd:e.cwd,mcpServers:e.mcpServers??[],...g&&{_meta:g}})}catch(g){if(g&&typeof g=="object"&&g.code===D.AuthRequired)throw await i.kill().catch(()=>{}),Js(g,i);return process.stderr.write(`session/load failed for upstream ${e.upstreamSessionId} on ${e.agentId} (${g.message}); recovering via import-reseed
206
+ `)){if(f.length===0)continue;let u;try{u=JSON.parse(f)}catch{continue}if(!u||typeof u!="object"||Array.isArray(u))continue;let p=u;typeof p.method=="string"&&typeof p.recordedAt=="number"&&o.push({method:p.method,params:p.params,recordedAt:p.recordedAt})}let a=o.length>this.maxEntries?o.slice(-this.maxEntries):o;if(!s)return a;let d=new Map,c=async f=>{let u=d.get(f);if(u!==void 0)return u;let p=await jo(e,f);return d.set(f,p),p},l=[];for(let f of a)l.push(await Zf(f,c));return l}async flushAll(){let e=[...this.writeQueues.values()];e.length!==0&&await Promise.allSettled(e)}async delete(e){if(Ni.test(e))return this.enqueue(e,async()=>{try{await wt.unlink(M.historyFile(e))}catch(n){if(n.code!=="ENOENT")throw n}await Wu(e);try{await wt.rmdir(M.sessionDir(e))}catch(n){let s=n;if(s.code!=="ENOENT"&&s.code!=="ENOTEMPTY")throw n}})}enqueue(e,n){let r=(this.writeQueues.get(e)??Promise.resolve()).then(n,n),i=r.catch(()=>{});return this.writeQueues.set(e,i),i.finally(()=>{this.writeQueues.get(e)===i&&this.writeQueues.delete(e)}),r}};ge();je();da();Ws();ea();yt();_t();uc();var np=900*1e3,av="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",ca=ov(av,16),ua=class t{constructor(e,n,s,r={}){this.registry=e;this.spawner=n??(i=>os.spawn(i)),this.store=s??new na,this.tombstones=r.tombstones??new sa,this.sessionHistoryMaxEntries=r.sessionHistoryMaxEntries??1e3,this.histories=new oa({maxEntries:this.sessionHistoryMaxEntries}),this.idleTimeoutMs=r.idleTimeoutMs??0,this.idleEventTimeoutMs=r.idleEventTimeoutMs??3e4,this.defaultModels=r.defaultModels??{},this.synopsisAgent=r.synopsisAgent,this.synopsisModel=r.synopsisModel,this.synopsisOnClose=r.synopsisOnClose??!1,this.defaultTransformers=r.defaultTransformers??[],this.logger=r.logger,this.npmRegistry=r.npmRegistry,this.extensionCommands=r.extensionCommands,this.defaultCwd=r.defaultCwd??"~",this.synopsisCoordinator=new ia({registry:this.registry,store:this.store,histories:this.histories,synopsisAgent:this.synopsisAgent,synopsisModel:this.synopsisModel,persistTitle:async(i,o)=>{let a=this.get(i);if(a){await a.retitle(o);return}await this.persistTitle(i,o)},persistSynopsis:(i,o,a)=>this.persistSynopsis(i,o,a),logger:this.logger,npmRegistry:this.npmRegistry}),this.refreshAgentCatalog()}registry;sessions=new Map;resurrectionInflight=new Map;pendingAuthAgents=new Map;spawner;store;tombstones;histories;idleTimeoutMs;defaultModels;synopsisAgent;synopsisModel;synopsisOnClose;defaultTransformers;idleEventTimeoutMs;sessionHistoryMaxEntries;metaWriteQueues=new Map;listCache=new Map;static LIST_CACHE_TTL_MS=500;logger;npmRegistry;extensionCommands;defaultCwd;synopsisCoordinator;agentCatalog=[];async refreshAgentCatalog(){try{let{agents:e}=await Er(this.registry);this.agentCatalog=e.map(n=>({id:n.id,name:n.name,...n.description!==void 0?{description:n.description}:{}}))}catch{}}async create(e){let n=await this.bootstrapAgent({agentId:e.agentId,cwd:e.cwd,agentArgs:e.agentArgs,mcpServers:e.mcpServers,model:e.model,onInstallProgress:e.onInstallProgress,forwardedEnv:e.forwardedEnv});if(e.transformChain&&e.transformChain.length>0){let r={...n.agentCapabilities??{}};for(let i of e.transformChain)if(i.intercepts.has("agent:initialize"))try{let o=await i.connection.request("hydra-acp/transformer/message",{token:`t_${ca()}`,phase:"response",method:"initialize",direction:"agent\u2192daemon",sessionId:"(pre-session)",envelope:r});o.action==="stop"&&o.payload&&(r=o.payload)}catch{}n.agentCapabilities=r}let s=new Fr({cwd:e.cwd,agentId:e.agentId,agent:n.agent,upstreamSessionId:n.upstreamSessionId,agentMeta:n.agentMeta,agentCapabilities:n.agentCapabilities,title:e.title,agentArgs:e.agentArgs,idleTimeoutMs:this.idleTimeoutMs,idleEventTimeoutMs:this.idleEventTimeoutMs,logger:this.logger,spawnReplacementAgent:r=>this.bootstrapAgent({...r,mcpServers:[]}),listSessions:()=>this.list(),availableAgents:()=>this.agentCatalog,historyStore:this.histories,historyMaxEntries:this.sessionHistoryMaxEntries,currentModel:n.initialModel,currentMode:n.initialMode,agentModes:n.initialModes,agentModels:n.initialModels,transformChain:e.transformChain,parentSessionId:e.parentSessionId,originatingClient:e.originatingClient,interactive:e.interactive,forwardedEnv:e.forwardedEnv,extensionCommands:this.extensionCommands,scheduleSynopsis:()=>this.synopsisCoordinator.schedule(s.sessionId)});return await this.attachManagerHooks(s),s}async resurrect(e){let n=this.sessions.get(e.hydraSessionId);if(n){if(n.upstreamSessionId!==e.upstreamSessionId){let i=new Error(`session ${e.hydraSessionId} already exists with a different upstream id`);throw i.code=D.AlreadyAttached,i}return n}let s=this.resurrectionInflight.get(e.hydraSessionId);if(s)return s;let r=this.doResurrect(e);this.resurrectionInflight.set(e.hydraSessionId,r);try{return await r}finally{this.resurrectionInflight.delete(e.hydraSessionId)}}async doResurrect(e){let n=this.sessions.get(e.hydraSessionId);if(n)return n;let s=await this.registry.getAgent(e.agentId);if(!s){let g=new Error(`agent ${e.agentId} not found in registry; cannot resurrect`);throw g.code=D.AgentNotInstalled,g}if(e.upstreamSessionId==="")return this.doResurrectFromImport(e);if(!await this.dirExists(e.cwd))return this.doResurrectFromImport(e);let r=await fn(s,e.agentArgs??[],{npmRegistry:this.npmRegistry,onInstallProgress:e.onInstallProgress}),i=this.spawner({agentId:e.agentId,cwd:e.cwd,plan:r,...e.forwardedEnv?{extraEnv:e.forwardedEnv}:{}}),o;try{let g=await i.connection.request("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:{name:"hydra",version:fe}});o=g.agentCapabilities,i.authMethods=la(g.authMethods)}catch(g){throw await i.kill().catch(()=>{}),Js(g,i)}let a;try{let g=uv(e.agentId,e.currentModel);a=await i.connection.request("session/load",{sessionId:e.upstreamSessionId,cwd:e.cwd,mcpServers:e.mcpServers??[],...g&&{_meta:g}})}catch(g){if(g&&typeof g=="object"&&g.code===D.AuthRequired)throw await i.kill().catch(()=>{}),Js(g,i);return process.stderr.write(`session/load failed for upstream ${e.upstreamSessionId} on ${e.agentId} (${g.message}); recovering via import-reseed
207
207
  `),await i.kill().catch(()=>{}),this.doResurrectFromImport(e)}if(e.pendingHistorySync===!0)this.clearPendingHistorySync(e.hydraSessionId).catch(()=>{});else{let g=i.connection.drainBuffered("session/update");this.logger?.info(`resurrect: drain1 dropped ${g} buffered session/update(s) for sessionId=${e.hydraSessionId}`)}let d=ap(a??{}),c=e.agentModes??rp(op(a??{}));this.logger?.info(`resurrect: sessionId=${e.hydraSessionId} persistedMode=${JSON.stringify(e.currentMode)} agentReportedMode=${JSON.stringify(d)} advertisedModes=${JSON.stringify(c?.map(g=>g.id))}`);let l=await dp({agent:i,upstreamSessionId:e.upstreamSessionId,persistedMode:e.currentMode,agentReportedMode:d,advertisedModes:c,logger:this.logger});this.logger?.info(`resurrect: effectiveMode=${JSON.stringify(l)} for sessionId=${e.hydraSessionId}`);let f=sp(a??{}),u=rp(ip(a??{}))??e.agentModels;if(this.logger?.info(`resurrect: sessionId=${e.hydraSessionId} persistedModel=${JSON.stringify(e.currentModel)} agentReportedModel=${JSON.stringify(f)} advertisedModels=${JSON.stringify(u?.map(g=>g.modelId))}`),e.pendingHistorySync!==!0){let g=i.connection.drainBuffered("session/update");this.logger?.info(`resurrect: drain2 (post-mode-restore) dropped ${g} buffered session/update(s) for sessionId=${e.hydraSessionId}`)}let p=await cp({agent:i,upstreamSessionId:e.upstreamSessionId,persistedModel:e.currentModel,agentReportedModel:f,logger:this.logger});if(e.pendingHistorySync!==!0){let g=i.connection.drainBuffered("session/update");this.logger?.info(`resurrect: drain3 (post-model-restore) dropped ${g} buffered session/update(s) for sessionId=${e.hydraSessionId}`)}let m=new Fr({sessionId:e.hydraSessionId,cwd:e.cwd,agentId:e.agentId,agent:i,upstreamSessionId:e.upstreamSessionId,agentMeta:a?._meta,agentCapabilities:o,title:e.title,agentArgs:e.agentArgs,idleTimeoutMs:this.idleTimeoutMs,logger:this.logger,spawnReplacementAgent:g=>this.bootstrapAgent({...g,mcpServers:e.mcpServers??[]}),listSessions:()=>this.list(),availableAgents:()=>this.agentCatalog,historyStore:this.histories,historyMaxEntries:this.sessionHistoryMaxEntries,currentModel:p,currentMode:l,currentUsage:e.currentUsage,agentCommands:e.agentCommands,agentModes:c,agentModels:u,firstPromptSeeded:!!e.title,createdAt:e.createdAt?new Date(e.createdAt).getTime():void 0,originatingClient:e.originatingClient,interactive:e.interactive,priority:e.priority,forkedFromSessionId:e.forkedFromSessionId,forkedFromMessageId:e.forkedFromMessageId,forwardedEnv:e.forwardedEnv,extensionCommands:this.extensionCommands,scheduleSynopsis:()=>this.synopsisCoordinator.schedule(m.sessionId)});return await this.attachManagerHooks(m),m}async doResurrectFromImport(e){let n=await this.resolveResurrectCwd(e.cwd),s=await this.bootstrapAgent({agentId:e.agentId,cwd:n,agentArgs:e.agentArgs,mcpServers:e.mcpServers??[],onInstallProgress:e.onInstallProgress,forwardedEnv:e.forwardedEnv,model:e.currentModel}),r=e.agentModes??s.initialModes,i=await dp({agent:s.agent,upstreamSessionId:s.upstreamSessionId,persistedMode:e.currentMode,agentReportedMode:s.initialMode,advertisedModes:r,logger:this.logger}),o=e.agentModels??s.initialModels,a=await cp({agent:s.agent,upstreamSessionId:s.upstreamSessionId,persistedModel:e.currentModel,agentReportedModel:s.initialModel,logger:this.logger});s.agent.connection.drainBuffered("session/update");let d=new Fr({sessionId:e.hydraSessionId,cwd:n,agentId:e.agentId,agent:s.agent,upstreamSessionId:s.upstreamSessionId,agentMeta:s.agentMeta,agentCapabilities:s.agentCapabilities,title:e.title,agentArgs:e.agentArgs,idleTimeoutMs:this.idleTimeoutMs,logger:this.logger,spawnReplacementAgent:c=>this.bootstrapAgent({...c,mcpServers:e.mcpServers??[]}),listSessions:()=>this.list(),availableAgents:()=>this.agentCatalog,historyStore:this.histories,historyMaxEntries:this.sessionHistoryMaxEntries,currentModel:a,currentMode:i,currentUsage:e.currentUsage,agentCommands:e.agentCommands,agentModes:r,agentModels:o,firstPromptSeeded:!!e.title,createdAt:e.createdAt?new Date(e.createdAt).getTime():void 0,originatingClient:e.originatingClient,interactive:e.interactive,priority:e.priority,forkedFromSessionId:e.forkedFromSessionId,forkedFromMessageId:e.forkedFromMessageId,forwardedEnv:e.forwardedEnv,extensionCommands:this.extensionCommands,scheduleSynopsis:()=>this.synopsisCoordinator.schedule(d.sessionId)});return await this.attachManagerHooks(d),d.seedFromImport().catch(()=>{}),d}async dirExists(e){try{return(await zs.stat(e)).isDirectory()}catch{return!1}}async reapIfOrphanedNonInteractive(e){let n=this.sessions.get(e);!n||n.attachedCount>0||n.interactive!==!0&&(this.logger?.info(`reaping orphaned non-interactive session ${e} (agent killed, cold record kept)`),await n.close({deleteRecord:!1}).catch(()=>{}))}async resolveResurrectCwd(e){return await this.dirExists(e)?e:Nt(this.defaultCwd)}async syncFromAgent(e){let n=await this.registry.getAgent(e);if(!n){let p=new Error(`agent ${e} not found in registry`);throw p.code=D.AgentNotInstalled,p}let s=await fn(n,[],{npmRegistry:this.npmRegistry}),r=this.spawner({agentId:e,cwd:fa.homedir(),plan:s}),i;try{i=await r.connection.request("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:{name:"hydra",version:fe}})}catch(p){throw await r.kill().catch(()=>{}),Js(p,r)}if(r.authMethods=la(i.authMethods),(i.agentCapabilities??{}).sessionCapabilities?.list===void 0)throw await r.kill().catch(()=>{}),new Error(`agent ${e} does not advertise sessionCapabilities.list; cannot sync`);let a;try{a=await this.collectAgentSessions(r)}catch(p){throw await r.kill().catch(()=>{}),p}await r.kill().catch(()=>{});let d=new Set;for(let p of this.sessions.values())d.add(`${p.agentId}::${p.upstreamSessionId}`);let c=await this.store.list().catch(()=>[]);for(let p of c)d.add(`${p.agentId}::${p.upstreamSessionId}`);let l=M.sessionsDir(),f=[],u=0;for(let p of a){let m=`${e}::${p.sessionId}`;if(d.has(m)){u+=1;continue}if(dv(p.cwd,l)){u+=1;continue}let g=await this.tombstones.read(e,p.sessionId).catch(()=>{});if(g){if(!Lf(g,p.updatedAt)){u+=1;continue}await this.tombstones.remove(e,p.sessionId).catch(()=>{}),this.logger?.info(`syncFromAgent: resurrecting tombstoned ${e}/${p.sessionId} (upstream updatedAt advanced past ${g.upstreamUpdatedAt??"<unset>"})`)}d.add(m);let y=`${Ht}${ca()}`,v=new Date().toISOString(),b=p.updatedAt??v,k={sessionId:y,lineageId:Li(),upstreamSessionId:p.sessionId,agentId:e,cwd:p.cwd,pendingHistorySync:!0,interactive:!0,createdAt:b,updatedAt:b};p.title!==void 0&&(k.title=p.title);let R=Sc(k);await this.store.write(R),f.push({version:1,...R})}return{synced:f,skipped:u}}async collectAgentSessions(e){let n=[],s,r=new Set;for(let i=0;i<100;i+=1){let o={};s!==void 0&&(o.cursor=s);let a=await e.connection.request("session/list",o),d=Array.isArray(a.sessions)?a.sessions:[];for(let c of d){if(typeof c.sessionId!="string"||typeof c.cwd!="string")continue;let l={sessionId:c.sessionId,cwd:c.cwd};typeof c.title=="string"&&(l.title=c.title),typeof c.updatedAt=="string"&&(l.updatedAt=c.updatedAt),n.push(l)}if(typeof a.nextCursor!="string"||a.nextCursor.length===0||r.has(a.nextCursor))break;r.add(a.nextCursor),s=a.nextCursor}return n}async applySeedModel(e,n,s,r){try{return await e.connection.request("session/set_model",{sessionId:n,modelId:s}),this.logger?.info(`${r}: session/set_model accepted`),!0}catch(i){return this.logger?.warn(`${r} rejected by agent (${i.message}); session will use the agent's own default`),!1}}async bootstrapAgent(e){let n=await this.registry.getAgent(e.agentId);if(!n){let i=new Error(`agent ${e.agentId} not found in registry`);throw i.code=D.AgentNotInstalled,i}let s=await fn(n,e.agentArgs??[],{npmRegistry:this.npmRegistry,onInstallProgress:e.onInstallProgress}),r=this.spawner({agentId:e.agentId,cwd:e.cwd,plan:s,...e.forwardedEnv?{extraEnv:e.forwardedEnv}:{}});try{let i=await r.connection.request("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:{name:"hydra",version:fe}}),o=i.agentCapabilities;r.authMethods=la(i.authMethods);let a=await r.connection.request("session/new",{cwd:e.cwd,mcpServers:e.mcpServers??[]}),d=a.sessionId;if(typeof d!="string")throw new Error(`agent ${e.agentId} returned a non-string sessionId from session/new`);let c=sp(a),l=ip(a),f=e.model??this.defaultModels[e.agentId];if(f&&f!==c){let m=Mr(f,l),g=e.model!==void 0?`model=${JSON.stringify(f)}`:`defaultModels[${e.agentId}]=${JSON.stringify(f)}`;if(m.kind==="exact"||m.kind==="none")await this.applySeedModel(r,d,f,g)&&(c=f);else if(m.kind==="resolved")(m.modelId===c||await this.applySeedModel(r,d,m.modelId,`${g} resolved to ${JSON.stringify(m.modelId)}`))&&(c=m.modelId);else if(m.kind==="ambiguous")this.logger?.warn(`${g} is ambiguous (trailing-segment matches [${m.candidates.join(", ")}]); skipping session/set_model, session will use ${JSON.stringify(c)}`);else{let y=l.map(v=>v.modelId).join(", ");this.logger?.warn(`${g} not in agent's availableModels ([${y}]); skipping session/set_model, session will use ${JSON.stringify(c)}`)}}let u=op(a),p=ap(a);return{agent:r,upstreamSessionId:d,agentMeta:a._meta,agentCapabilities:o,initialModel:c,initialModels:l.length>0?l:void 0,initialModes:u.length>0?u:void 0,initialMode:p}}catch(i){throw await r.kill().catch(()=>{}),Js(i,r)}}async bootstrapAgentForAuth(e,n){let s=this.pendingAuthAgents.get(e);if(s&&s.isAlive())return s;let r=await this.registry.getAgent(e);if(!r){let d=new Error(`agent ${e} not found in registry`);throw d.code=D.AgentNotInstalled,d}let i=await fn(r,[],{npmRegistry:this.npmRegistry}),o=n??Nt(this.defaultCwd),a=this.spawner({agentId:e,cwd:o,plan:i});try{let d=await a.connection.request("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:{name:"hydra",version:fe}});a.authMethods=la(d.authMethods)}catch(d){throw await a.kill().catch(()=>{}),Js(d,a)}return this.pendingAuthAgents.set(e,a),a.onExit(()=>{this.pendingAuthAgents.get(e)===a&&this.pendingAuthAgents.delete(e)}),a}async planSpawnForAgent(e){let n=await this.registry.getAgent(e);if(!n){let s=new Error(`agent ${e} not found in registry`);throw s.code=D.AgentNotInstalled,s}return fn(n,[],{npmRegistry:this.npmRegistry})}consumePendingAuthAgent(e){let n=this.pendingAuthAgents.get(e);if(n&&(this.pendingAuthAgents.delete(e),!!n.isAlive()))return n}getAgentForSession(e){return this.sessions.get(e)?.agent}async attachManagerHooks(e){e.onClose(({deleteRecord:n})=>{if(this.sessions.delete(e.sessionId),this.invalidateListCache(),n){if(e.upstreamSessionId){let s=Br({interactive:e.interactive,...e.originatingClient?{originatingClient:e.originatingClient}:{}},!0);this.tombstones.add({agentId:e.agentId,upstreamSessionId:e.upstreamSessionId,deletedAt:new Date().toISOString(),upstreamUpdatedAt:new Date(e.updatedAt).toISOString(),cwd:e.cwd,title:e.title,reason:"user",...s!==void 0?{interactive:s}:{}}).catch(()=>{})}this.store.delete(e.sessionId).catch(()=>{}),this.histories.delete(e.sessionId).catch(()=>{});return}e.firstPromptSeeded&&this.synopsisOnClose&&this.synopsisCoordinator.schedule(e.sessionId)}),e.onTitleChange(n=>{this.persistTitle(e.sessionId,n).catch(()=>{})}),e.onPriorityChange(n=>{this.persistPriority(e.sessionId,n).catch(()=>{})}),e.onAgentChange(({agentId:n,upstreamSessionId:s})=>{this.persistAgentChange(e.sessionId,n,s).catch(()=>{})}),e.onModelChange(n=>{this.persistSnapshot(e.sessionId,{currentModel:n}).catch(()=>{})}),e.onModeChange(n=>{this.persistSnapshot(e.sessionId,{currentMode:n}).catch(()=>{})}),e.onInteractiveChange(n=>{this.persistSnapshot(e.sessionId,{interactive:n}).catch(()=>{})}),e.onUsageChange(n=>{this.persistSnapshot(e.sessionId,{currentUsage:up(n)}).catch(()=>{})}),e.onAgentCommandsChange(n=>{this.persistSnapshot(e.sessionId,{agentCommands:n.map(s=>({name:s.name,...s.description!==void 0?{description:s.description}:{}}))}).catch(()=>{})}),e.onAgentModesChange(n=>{this.persistSnapshot(e.sessionId,{agentModes:n.map(s=>({id:s.id,...s.name!==void 0?{name:s.name}:{},...s.description!==void 0?{description:s.description}:{}}))}).catch(()=>{})}),e.onAgentModelsChange(n=>{this.persistSnapshot(e.sessionId,{agentModels:n.map(s=>({modelId:s.modelId,...s.name!==void 0?{name:s.name}:{},...s.description!==void 0?{description:s.description}:{}}))}).catch(()=>{})}),this.sessions.set(e.sessionId,e),this.invalidateListCache(),await this.enqueueMetaWrite(e.sessionId,async()=>{let n=await this.store.read(e.sessionId),s=cv(e,n);await this.store.write(s)}).catch(()=>{})}async getHistory(e){if(this.sessions.has(e))return this.histories.load(e).catch(()=>[]);if(await this.store.read(e))return this.histories.load(e).catch(()=>[])}async loadHistory(e){return this.histories.load(e)}async loadToolBlob(e,n){return jo(e,n)}async loadFromDisk(e){let n=await this.store.read(e);if(!n)return;let s=n.title;return s||(s=await this.deriveTitleFromHistory(e)),{hydraSessionId:n.sessionId,upstreamSessionId:n.upstreamSessionId,agentId:n.agentId,cwd:n.cwd,title:s,synopsis:n.synopsis,summarizedThroughEntry:n.summarizedThroughEntry,agentArgs:n.agentArgs,currentModel:n.currentModel,currentMode:n.currentMode,currentUsage:lv(n.currentUsage?{...n.currentUsage,cumulativeCost:(n.currentUsage.cumulativeCost??0)+(n.currentUsage.costAmount??0),costAmount:void 0}:void 0),agentCommands:n.agentCommands,agentModes:n.agentModes,agentModels:n.agentModels,createdAt:n.createdAt,pendingHistorySync:n.pendingHistorySync,originatingClient:n.originatingClient,interactive:n.interactive,priority:n.priority,forkedFromSessionId:n.forkedFromSessionId,forkedFromMessageId:n.forkedFromMessageId,forwardedEnv:n.forwardedEnv}}async setForwardedEnv(e,n){if(n===void 0)return;let s=this.sessions.get(e);s&&(s.forwardedEnv=n),await this.enqueueMetaWrite(e,async()=>{let r=await this.store.read(e);if(!r)return;let i={...r,forwardedEnv:n};await this.store.write(i)})}async clearPendingHistorySync(e){await this.enqueueMetaWrite(e,async()=>{let n=await this.store.read(e);if(!n||n.pendingHistorySync!==!0)return;let s={...n};delete s.pendingHistorySync,await this.store.write(s)})}async deriveTitleFromHistory(e){let n=await this.histories.load(e).catch(()=>[]);for(let s of n){let r=s.params;if(r?.update?.sessionUpdate!=="prompt_received")continue;let i=$r(r.update.prompt),o=mc(i,200);if(o)return o}}get(e){return this.sessions.get(e)}liveSessions(){return this.sessions.values()}activeAgentVersions(){let e=new Map;for(let n of this.sessions.values()){let s=n.agent.agentId,r=n.agent.version,i=e.get(s);i||(i=new Set,e.set(s,i)),i.add(r)}return e}async resolveCanonicalId(e){if(this.sessions.has(e)||await this.store.read(e))return e;if(e.startsWith(Ht))return;let n=Ht+e;if(this.sessions.has(n)||await this.store.read(n))return n}require(e){let n=this.sessions.get(e);if(!n){let s=new Error(`session ${e} not found`);throw s.code=D.SessionNotFound,s}return n}liveListEntry(e){return{sessionId:e.sessionId,upstreamSessionId:e.upstreamSessionId,cwd:e.cwd,title:e.title,agentId:e.agentId,currentModel:e.currentModel,currentUsage:e.currentUsage,parentSessionId:e.parentSessionId,forkedFromSessionId:e.forkedFromSessionId,forkedFromMessageId:e.forkedFromMessageId,originatingClient:e.originatingClient,interactive:e.interactive,updatedAt:new Date(e.updatedAt).toISOString(),attachedClients:e.attachedCount,status:"live",busy:e.turnStartedAt!==void 0,awaitingInput:e.awaitingInput}}async getOne(e){let n=this.sessions.get(e);if(n){let a=await qi(n.sessionId),d=Br({interactive:n.interactive,...n.originatingClient?{originatingClient:n.originatingClient}:{}},a.hasContent),c=a.mtime??new Date(n.updatedAt).toISOString();return{sessionId:n.sessionId,upstreamSessionId:n.upstreamSessionId,cwd:n.cwd,title:n.title,agentId:n.agentId,currentModel:n.currentModel,currentUsage:n.currentUsage,parentSessionId:n.parentSessionId,forkedFromSessionId:n.forkedFromSessionId,forkedFromMessageId:n.forkedFromMessageId,originatingClient:n.originatingClient,interactive:d,priority:n.priority,updatedAt:c,attachedClients:n.attachedCount,status:"live",busy:n.turnStartedAt!==void 0,awaitingInput:n.awaitingInput}}let s=await this.store.read(e).catch(()=>{});if(!s)return;let r=await qi(s.sessionId),i=Br(s,r.hasContent),o=r.mtime??s.updatedAt;return{sessionId:s.sessionId,upstreamSessionId:s.upstreamSessionId,cwd:s.cwd,title:s.title,agentId:s.agentId,currentModel:s.currentModel,currentUsage:s.currentUsage?{...s.currentUsage,costAmount:(s.currentUsage.cumulativeCost??0)+(s.currentUsage.costAmount??0)||void 0}:void 0,importedFromMachine:s.importedFromMachine,importedFromUpstreamSessionId:s.importedFromUpstreamSessionId,parentSessionId:s.parentSessionId,forkedFromSessionId:s.forkedFromSessionId,forkedFromMessageId:s.forkedFromMessageId,originatingClient:s.originatingClient,interactive:i,priority:s.priority,updatedAt:o,attachedClients:0,status:"cold",busy:!1,awaitingInput:!1}}async list(e={}){let n=`${e.cwd??""}|${e.includeNonInteractive?"1":"0"}`,s=Date.now(),r=this.listCache.get(n);if(r&&r.expiresAt>s)return r.promise;let i=this.listUncached(e);return this.listCache.set(n,{expiresAt:s+t.LIST_CACHE_TTL_MS,promise:i}),i.catch(()=>{let o=this.listCache.get(n);o&&o.promise===i&&this.listCache.delete(n)}),i}invalidateListCache(){this.listCache.clear()}async listUncached(e={}){let n=[],s=new Set,r=l=>e.includeNonInteractive?!0:l===!0,i=[...this.sessions.values()].filter(l=>!e.cwd||l.cwd===e.cwd),o=await Promise.all(i.map(l=>qi(l.sessionId)));for(let l=0;l<i.length;l+=1){let f=i[l],u=o[l];s.add(f.sessionId);let p=Br({interactive:f.interactive,...f.originatingClient?{originatingClient:f.originatingClient}:{}},u.hasContent);if(!r(p))continue;let m=u.mtime??new Date(f.updatedAt).toISOString();n.push({sessionId:f.sessionId,upstreamSessionId:f.upstreamSessionId,cwd:f.cwd,title:f.title,agentId:f.agentId,currentModel:f.currentModel,currentUsage:f.currentUsage,parentSessionId:f.parentSessionId,forkedFromSessionId:f.forkedFromSessionId,forkedFromMessageId:f.forkedFromMessageId,originatingClient:f.originatingClient,interactive:p,priority:f.priority,updatedAt:m,attachedClients:f.attachedCount,status:"live",busy:f.turnStartedAt!==void 0,awaitingInput:f.awaitingInput})}let d=(await this.store.list().catch(l=>{throw this.logger?.warn(`session list: store.list() failed: ${l?.message??String(l)}`),l})).filter(l=>!s.has(l.sessionId)&&(!e.cwd||l.cwd===e.cwd)),c=await Promise.all(d.map(l=>qi(l.sessionId)));for(let l=0;l<d.length;l+=1){let f=d[l],u=c[l],p=Br(f,u.hasContent);if(!r(p))continue;let m=u.mtime??f.updatedAt;n.push({sessionId:f.sessionId,upstreamSessionId:f.upstreamSessionId,cwd:f.cwd,title:f.title,agentId:f.agentId,currentModel:f.currentModel,currentUsage:f.currentUsage?{...f.currentUsage,costAmount:(f.currentUsage.cumulativeCost??0)+(f.currentUsage.costAmount??0)||void 0}:void 0,importedFromMachine:f.importedFromMachine,importedFromUpstreamSessionId:f.importedFromUpstreamSessionId,parentSessionId:f.parentSessionId,forkedFromSessionId:f.forkedFromSessionId,forkedFromMessageId:f.forkedFromMessageId,originatingClient:f.originatingClient,interactive:p,priority:f.priority,updatedAt:m,attachedClients:0,status:"cold",busy:!1,awaitingInput:!1})}return n.sort((l,f)=>l.updatedAt<f.updatedAt?1:-1),n}async exportBundle(e,n={}){let s=await this.store.read(e);if(!s)return;let r;if(s.lineageId)r=s;else{let c=Li(),l={...s,lineageId:c};await this.enqueueMetaWrite(e,async()=>{let f=await this.store.read(e);f&&(f.lineageId||await this.store.write({...f,lineageId:c}))}).catch(()=>{}),r=l}let i=n.tools??"inline",o=await this.histories.load(e,i==="references"?{tools:"references"}:{}).catch(()=>[]),a=await lp(e);if(i!=="references")return{record:r,history:o,promptHistory:a};let d={};for(let c of Qf(o)){let l=await ju(e,c);l&&(d[c]=l.toString("base64"))}return{record:r,history:o,promptHistory:a,toolBlobs:d}}async importBundle(e,n={}){let s=await this.store.findByLineageId(e.session.lineageId);if(s){if(!n.replace){let o=new Error(`bundle already imported as ${s.sessionId}`);throw o.code=D.BundleAlreadyImported,o.existingSessionId=s.sessionId,o}let i=this.sessions.get(s.sessionId);return i&&await i.close({deleteRecord:!1}).catch(()=>{}),await this.writeImportedRecord({sessionId:s.sessionId,bundle:e,preservedCreatedAt:s.createdAt,cwd:n.cwd}),{sessionId:s.sessionId,importedFromSessionId:e.session.sessionId,replaced:!0}}let r=`${Ht}${ca()}`;return await this.writeImportedRecord({sessionId:r,bundle:e,cwd:n.cwd}),{sessionId:r,importedFromSessionId:e.session.sessionId,replaced:!1}}async forkSession(e,n={}){let s=await this.store.read(e);if(!s){let m=new Error(`source session not found: ${e}`);throw m.code=D.SessionNotFound,m}let r=n.agentId??s.agentId,i=r!==s.agentId;if(i&&!await this.registry.getAgent(r)){let g=new Error(`agent ${r} not found in registry`);throw g.code=D.AgentNotInstalled,g}let o=await this.histories.load(e).catch(()=>[]),a,d;if(n.forkAt!==void 0){if(a=hc(o,n.forkAt),a<0){let m=new Error(`forkAt messageId not found in source history: ${n.forkAt}`);throw m.code=D.InvalidParams,m}d=n.forkAt}else{let m=pv(o);m?(a=m.index,d=m.messageId):(a=-1,d="")}let c=o.slice(0,a+1),l=await lp(e),f={...s,lineageId:Li(),agentId:r,interactive:!1,...n.title!==void 0?{title:n.title}:{},currentUsage:void 0,...i?{currentModel:void 0,currentMode:void 0,agentCommands:void 0,agentModes:void 0,agentModels:void 0}:{}},u=ji({record:f,history:c,promptHistory:l.length>0?l:void 0,hydraVersion:fe,machine:fa.hostname()}),p=`${Ht}${ca()}`;return await this.writeImportedRecord({sessionId:p,bundle:u,cwd:n.cwd,forkedFromSessionId:e,forkedFromMessageId:d}),{sessionId:p,forkedFromSessionId:e,forkedAt:d}}async writeImportedRecord(e){if(await this.histories.rewrite(e.sessionId,e.bundle.history),e.bundle.toolBlobs)for(let[i,o]of Object.entries(e.bundle.toolBlobs))await qu(e.sessionId,i,Buffer.from(o,"base64")).catch(()=>{});let n=new Date(e.bundle.session.updatedAt);Number.isNaN(n.getTime())||await zs.utimes(M.historyFile(e.sessionId),n,n).catch(()=>{}),e.bundle.promptHistory&&e.bundle.promptHistory.length>0&&await qs(M.tuiHistoryFile(e.sessionId),e.bundle.promptHistory).catch(()=>{});let s=new Date().toISOString(),r=e.forkedFromSessionId!==void 0;await this.enqueueMetaWrite(e.sessionId,async()=>{await this.store.write({sessionId:e.sessionId,lineageId:e.bundle.session.lineageId,upstreamSessionId:"",...r?{forkedFromSessionId:e.forkedFromSessionId,forkedFromMessageId:e.forkedFromMessageId}:{importedFromSessionId:e.bundle.session.sessionId,importedFromUpstreamSessionId:e.bundle.session.upstreamSessionId,importedFromMachine:e.bundle.exportedFrom.machine},agentId:e.bundle.session.agentId,cwd:e.cwd??e.bundle.session.cwd,title:e.bundle.session.title,synopsis:e.bundle.session.synopsis,summarizedThroughEntry:e.bundle.session.summarizedThroughEntry,currentModel:e.bundle.session.currentModel,currentMode:e.bundle.session.currentMode,currentUsage:e.bundle.session.currentUsage,agentCommands:e.bundle.session.agentCommands,agentModes:e.bundle.session.agentModes,interactive:e.bundle.session.interactive,originatingClient:e.bundle.session.originatingClient,priority:e.bundle.session.priority,createdAt:e.preservedCreatedAt??s,updatedAt:e.bundle.session.updatedAt})})}async deleteRecord(e){let n=await this.store.read(e);if(!n)return!1;if(n.upstreamSessionId){let s=await qi(e),r=Br(n,s.hasContent);await this.tombstones.add({agentId:n.agentId,upstreamSessionId:n.upstreamSessionId,deletedAt:new Date().toISOString(),upstreamUpdatedAt:n.updatedAt,cwd:n.cwd,title:n.title,reason:"user",...r!==void 0?{interactive:r}:{}}).catch(()=>{})}return await this.store.delete(e).catch(()=>{}),await this.histories.delete(e).catch(()=>{}),this.invalidateListCache(),!0}async hasRecord(e){return await this.store.read(e).catch(()=>{})!==void 0}async setPriority(e,n){let s=this.get(e);if(s)return s.setPriority(n),!0;if(!await this.hasRecord(e))return!1;let r=n===void 0||n<=0?void 0:Math.floor(n);return await this.persistPriority(e,r),!0}async persistPriority(e,n){n===void 0?await this.mutateRecord(e,{},["priority"]):await this.mutateRecord(e,{priority:n}),this.invalidateListCache()}async setTitle(e,n){let s=this.get(e);return s?(await s.retitle(n),!0):await this.hasRecord(e)?(await this.persistTitle(e,n),!0):!1}async persistTitle(e,n){await this.mutateRecord(e,{title:n})}async persistSynopsis(e,n,s){await this.mutateRecord(e,{synopsis:n,summarizedThroughEntry:s})}async persistAgentChange(e,n,s){await this.mutateRecord(e,{agentId:n,upstreamSessionId:s})}async persistSnapshot(e,n){let s={};n.currentModel!==void 0&&(s.currentModel=n.currentModel),n.currentMode!==void 0&&(s.currentMode=n.currentMode),n.currentUsage!==void 0&&(s.currentUsage=n.currentUsage),n.agentCommands!==void 0&&(s.agentCommands=n.agentCommands),n.agentModes!==void 0&&(s.agentModes=n.agentModes),n.agentModels!==void 0&&(s.agentModels=n.agentModels),n.interactive!==void 0&&(s.interactive=n.interactive),n.cwd!==void 0&&(s.cwd=n.cwd),await this.mutateRecord(e,s)}async mutateRecord(e,n,s=[]){await this.enqueueMetaWrite(e,async()=>{let r=await this.store.read(e);if(!r)return;let i={...r,...n,updatedAt:new Date().toISOString()};for(let o of s)delete i[o];await this.store.write(i)})}enqueueMetaWrite(e,n){let r=(this.metaWriteQueues.get(e)??Promise.resolve()).catch(()=>{}).then(n),i=r.catch(()=>{});return this.metaWriteQueues.set(e,i),i.finally(()=>{this.metaWriteQueues.get(e)===i&&this.metaWriteQueues.delete(e)}),r}async closeAll(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(n=>n.close({deleteRecord:!1}))),this.sessions.clear()}async flushSynopsis(e){await this.synopsisCoordinator.flush(e)}async shutdownSynopsis(){await this.synopsisCoordinator.shutdown()}scheduleSynopsis(e){this.synopsisCoordinator.schedule(e)}async flushMetaWrites(){let e=[...this.metaWriteQueues.values()];e.length!==0&&await Promise.allSettled(e)}async flushHistoryWrites(){await this.histories.flushAll()}async resurrectPendingQueues(){let e=await this.store.list().catch(()=>[]);for(let n of e){let s=await Cf(n.sessionId).catch(()=>[]);if(s.length===0)continue;let r=Date.now(),i=s.filter(d=>r-d.enqueuedAt<np),o=s.length-i.length;if(o>0&&(this.logger?.info(`queue replay: dropping ${o} stale prompt(s) for ${n.sessionId} (TTL ${np/1e3}s)`),await $i(n.sessionId,i).catch(()=>{})),i.length===0)continue;let a=await this.loadFromDisk(n.sessionId).catch(()=>{});if(!a){this.logger?.warn(`queue replay: no meta for ${n.sessionId}; discarding ${i.length} entr${i.length===1?"y":"ies"}`),await $i(n.sessionId,[]).catch(()=>{});continue}try{let d=await this.resurrect(a);this.logger?.info(`queue replay: resurrected ${n.sessionId} and replaying ${i.length} prompt(s)`),d.replayPersistedQueue(i)}catch(d){this.logger?.warn(`queue replay: failed to resurrect ${n.sessionId}: ${d.message}`)}}}};function dv(t,e){if(typeof t!="string"||t.length===0)return!1;let n=Wi.resolve(t),s=Wi.resolve(e);return n===s||n.startsWith(s+Wi.sep)}function cv(t,e){let s=(t.mergedAvailableCommands().length>0?t.agentOnlyAdvertisedCommands().map(l=>l.description!==void 0?{name:l.name,description:l.description}:{name:l.name}):void 0)??e?.agentCommands,r=t.availableModes(),o=(r.length>0?r.map(l=>{let f={id:l.id};return l.name!==void 0&&(f.name=l.name),l.description!==void 0&&(f.description=l.description),f}):void 0)??e?.agentModes,a=t.availableModels(),c=(a.length>0?a.map(l=>{let f={modelId:l.modelId};return l.name!==void 0&&(f.name=l.name),l.description!==void 0&&(f.description=l.description),f}):void 0)??e?.agentModels;return Sc({sessionId:t.sessionId,lineageId:e?.lineageId??Li(),upstreamSessionId:t.upstreamSessionId,importedFromSessionId:e?.importedFromSessionId,importedFromUpstreamSessionId:e?.importedFromUpstreamSessionId,importedFromMachine:e?.importedFromMachine,agentId:t.agentId,cwd:t.cwd,title:t.title,synopsis:e?.synopsis,summarizedThroughEntry:e?.summarizedThroughEntry,agentArgs:t.agentArgs,currentModel:t.currentModel??e?.currentModel,currentMode:t.currentMode??e?.currentMode,currentUsage:up(t.currentUsage)??e?.currentUsage,agentCommands:s,agentModes:o,agentModels:c,parentSessionId:t.parentSessionId??e?.parentSessionId,forkedFromSessionId:t.forkedFromSessionId??e?.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId??e?.forkedFromMessageId,originatingClient:t.originatingClient??e?.originatingClient,interactive:t.interactive??e?.interactive,priority:t.priority??e?.priority,forwardedEnv:t.forwardedEnv??e?.forwardedEnv,createdAt:e?.createdAt??new Date(t.createdAt).toISOString()})}function up(t){if(!t)return;let e={};return t.used!==void 0&&(e.used=t.used),t.size!==void 0&&(e.size=t.size),t.costAmount!==void 0&&(e.costAmount=t.costAmount),t.costCurrency!==void 0&&(e.costCurrency=t.costCurrency),t.cumulativeCost!==void 0&&(e.cumulativeCost=t.cumulativeCost),Object.keys(e).length>0?e:void 0}function lv(t){return t?{...t}:void 0}function uv(t,e){if(e&&t==="claude-acp")return{claudeCode:{options:{model:e}}}}function pa(t,e){let n=e.fromObject(t);if(n!==void 0)return n;let s=t[e.nestedKey];if(s&&typeof s=="object"&&!Array.isArray(s)){let o=e.fromObject(s);if(o!==void 0)return o}let r=t._meta;if(r&&typeof r=="object"&&!Array.isArray(r)){for(let[o,a]of Object.entries(r))if(o!=="hydra-acp"&&a&&typeof a=="object"&&!Array.isArray(a)){let d=e.fromObject(a);if(d!==void 0)return d}}let i=fv(t,e.configId);if(i){let o=e.fromConfig(i);if(o!==void 0)return o}}function sp(t){return pa(t,{nestedKey:"models",configId:"model",fromObject:e=>gn(e.currentModelId)??gn(e.currentModel)??gn(e.modelId)??gn(e.model),fromConfig:e=>gn(e.currentValue)})}function Js(t,e){if(!t||typeof t!="object")return t;let n=t;if(n.code!==D.AuthRequired)return t;let s=c=>!!c&&typeof c=="object"&&!Array.isArray(c),r=s(n.data)?n.data:{},i=s(r._meta)?r._meta:{},o=s(i["hydra-acp"])?i["hydra-acp"]:{},a=typeof n.message=="string"?n.message:"authentication required",d=new Error(a);return d.code=D.AuthRequired,d.data={...r,_meta:{...i,"hydra-acp":{...o,authMethods:e.authMethods??[],agentId:e.agentId}}},d}function la(t){if(!Array.isArray(t))return;let e=[];for(let n of t){if(!n||typeof n!="object")continue;let s=n;if(typeof s.id!="string")continue;let r=typeof s.description=="string"?s.description:"",i=s.type==="agent"||s.type==="terminal"?s.type:void 0,o=typeof s.name=="string"?s.name:void 0,a=s._meta,d=a!==null&&typeof a=="object"&&!Array.isArray(a)?a:void 0;e.push({id:s.id,description:r,...i&&{type:i},...o!==void 0&&{name:o},...d&&{_meta:d}})}return e.length>0?e:void 0}function gn(t){if(typeof t!="string")return;let e=t.trim();return e.length>0?e:void 0}function fv(t,e){let n=t.configOptions;if(Array.isArray(n))for(let s of n){if(!s||typeof s!="object"||Array.isArray(s))continue;let r=s;if(r.id===e)return r}}function rp(t){return t.length>0?t:void 0}function ip(t){return pa(t,{nestedKey:"models",configId:"model",fromObject:e=>{let n=Or(e.availableModels);return n.length>0?n:void 0},fromConfig:e=>{let n=Or(e.options);return n.length>0?n:void 0}})??[]}function op(t){return pa(t,{nestedKey:"modes",configId:"mode",fromObject:e=>{let n=Oi(e.availableModes);return n.length>0?n:void 0},fromConfig:e=>{let n=Oi(e.options);return n.length>0?n:void 0}})??[]}function ap(t){return pa(t,{nestedKey:"modes",configId:"mode",fromObject:e=>gn(e.currentModeId)??gn(e.currentMode)??gn(e.modeId)??gn(e.mode),fromConfig:e=>gn(e.currentValue)})}async function dp(t){let{agent:e,upstreamSessionId:n,persistedMode:s,agentReportedMode:r,advertisedModes:i,logger:o}=t;if(!s)return r;if(s===r)return s;if(i&&i.length>0&&!i.some(a=>a.id===s)){let a=i.map(d=>d.id).join(", ");return o?.warn(`resurrect: persisted currentMode=${JSON.stringify(s)} not in agent's availableModes ([${a}]); skipping session/set_mode, session will use ${JSON.stringify(r)}`),r}try{return o?.info(`resurrect: pushing persisted modeId=${JSON.stringify(s)} to agent (agentReported=${JSON.stringify(r)})`),await e.connection.request("session/set_mode",{sessionId:n,modeId:s}),o?.info(`resurrect: session/set_mode accepted, effectiveMode=${JSON.stringify(s)}`),s}catch(a){return o?.warn(`resurrect: session/set_mode rejected by agent for modeId=${JSON.stringify(s)} (${a.message}); session will use ${JSON.stringify(r)}`),r}}async function cp(t){let{agent:e,upstreamSessionId:n,persistedModel:s,agentReportedModel:r,logger:i}=t;if(!s)return r;if(s===r)return s;try{return i?.info(`resurrect: pushing persisted modelId=${JSON.stringify(s)} to agent (agentReported=${JSON.stringify(r)})`),await e.connection.request("session/set_model",{sessionId:n,modelId:s}),i?.info(`resurrect: session/set_model accepted, effectiveModel=${JSON.stringify(s)}`),s}catch(o){return i?.warn(`resurrect: session/set_model rejected by agent for modelId=${JSON.stringify(s)} (${o.message}); session will use ${JSON.stringify(r)}`),r}}function pv(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(!n||n.method!=="session/update")continue;let s=n.params?.update;if(s?.sessionUpdate==="turn_complete"&&!(typeof s.messageId!="string"||s.messageId.length===0))return{index:e,messageId:s.messageId}}}async function lp(t){try{let e=await zs.readFile(M.tuiHistoryFile(t),"utf8"),n=[];for(let s of e.split(`
208
208
  `))if(s.length!==0)try{let r=JSON.parse(s);typeof r=="string"&&n.push(r)}catch{}return n}catch{return[]}}async function qi(t){try{let e=await zs.stat(M.historyFile(t));return{mtime:new Date(e.mtimeMs).toISOString(),hasContent:e.size>0}}catch{return{hasContent:!1}}}function Br(t,e){return t.interactive!==void 0?t.interactive:t.originatingClient?.name===js?!1:e?!0:void 0}import{spawn as hv}from"child_process";import*as Dr from"fs";import*as as from"fs/promises";import*as fp from"path";var ha=class{windowMs;maxFailures;now;recentExits=[];tripped_;constructor(e={}){this.windowMs=e.windowMs??3e5,this.maxFailures=e.maxFailuresInWindow??10,this.now=e.now??Date.now}recordExit(e,n,s){if(e===78){let o=`exited with code 78 (unrecoverable); fix and run \`${s}s start ${n}\``;return this.tripped_=o,{tripped:o}}let r=this.now();this.recentExits.push(r);let i=r-this.windowMs;for(;this.recentExits.length>0&&this.recentExits[0]<i;)this.recentExits.shift();if(this.recentExits.length>this.maxFailures){let o=Math.round(this.windowMs/6e4),a=`${this.recentExits.length} exits in ${o}m (crash loop); fix and run \`${s}s start ${n}\``;return this.tripped_=a,{tripped:a}}return"restart"}reset(){this.recentExits=[],this.tripped_=void 0}get tripped(){return this.tripped_}};var mv=1e3,gv=6e4,Oc=3e3,Nr=class{entries=new Map;stopping=!1;context;tokenRegistry;breakerOptions;restartBaseMs;restartCapMs;adapter;constructor(e,n,s,r={}){this.adapter=n,this.context=s,this.tokenRegistry=r.tokenRegistry,this.breakerOptions=r.breakerOptions,this.restartBaseMs=r.restartBaseMs??mv,this.restartCapMs=r.restartCapMs??gv;for(let i of e)this.entries.set(i.name,this.makeEntry(i))}setContext(e){this.context=e}reportVersion(e,n){let s=this.entries.get(e);s&&(s.version=n)}async start(){if(!this.context)throw new Error(`${this.managerName()}: setContext must be called before start`);await as.mkdir(this.adapter.paths.dir(),{recursive:!0}),await this.reapOrphans();for(let e of this.entries.values())e.config.enabled&&this.spawn(e,0)}async stop(){this.stopping=!0;let e=[];for(let n of this.entries.values()){n.restartTimer&&(clearTimeout(n.restartTimer),n.restartTimer=void 0);let s=n.child;if(s){try{s.kill("SIGTERM")}catch{}e.push(new Promise(r=>{if(s.exitCode!==null||s.signalCode!==null){r();return}let i=setTimeout(()=>{try{s.kill("SIGKILL")}catch{}r()},Oc);s.on("exit",()=>{clearTimeout(i),r()})}))}}await Promise.allSettled(e);for(let n of this.entries.values()){try{n.logStream?.end()}catch{}n.child=void 0,n.logStream=void 0,n.pid=void 0}}list(){return[...this.entries.values()].map(e=>this.infoFor(e))}get(e){let n=this.entries.get(e);return n?this.infoFor(n):void 0}has(e){return this.entries.has(e)}async startByName(e){let n=this.entries.get(e);if(!n)throw Ji(new Error(`unknown ${this.adapter.kind}: ${e}`),"NOT_FOUND");if(n.child)throw Ji(new Error(`${this.adapter.kind} ${e} already running`),"CONFLICT");return n.restartTimer&&(clearTimeout(n.restartTimer),n.restartTimer=void 0),n.manuallyStopped=!1,n.restartCount=0,n.breaker.reset(),n.failureReason=void 0,this.spawn(n,0),this.infoFor(n)}async stopByName(e){let n=this.entries.get(e);if(!n)throw Ji(new Error(`unknown ${this.adapter.kind}: ${e}`),"NOT_FOUND");n.manuallyStopped=!0,n.restartTimer&&(clearTimeout(n.restartTimer),n.restartTimer=void 0);let s=n.child;return s?(await this.terminate(n,s),this.infoFor(n)):this.infoFor(n)}async restartByName(e){return await this.stopByName(e),this.startByName(e)}register(e){if(this.entries.has(e.name))throw Ji(new Error(`${this.adapter.kind} ${e.name} already exists`),"CONFLICT");if(!this.context)throw new Error(`${this.managerName()}: setContext must be called before register`);let n=this.makeEntry(e);return this.entries.set(e.name,n),e.enabled&&this.spawn(n,0),this.infoFor(n)}async unregister(e){let n=this.entries.get(e);if(!n)throw Ji(new Error(`unknown ${this.adapter.kind}: ${e}`),"NOT_FOUND");n.manuallyStopped=!0,n.restartTimer&&(clearTimeout(n.restartTimer),n.restartTimer=void 0);let s=n.child;s&&await this.terminate(n,s);try{n.logStream?.end()}catch{}this.entries.delete(e)}async terminate(e,n){if(n.exitCode!==null||n.signalCode!==null)return;let s=new Promise(i=>{e.exitWaiters.push(i)});try{n.kill("SIGTERM")}catch{}let r=setTimeout(()=>{try{n.kill("SIGKILL")}catch{}},Oc);typeof r.unref=="function"&&r.unref();try{await s}finally{clearTimeout(r)}}infoFor(e){let n;return e.failureReason!==void 0?n="failed":e.child?n="running":e.restartTimer?n="restarting":e.config.enabled?n="stopped":n="disabled",{name:e.config.name,status:n,pid:e.pid,enabled:e.config.enabled,restartCount:e.restartCount,startedAt:e.startedAt,lastExitCode:e.lastExitCode,logPath:this.adapter.paths.logFile(e.config.name),version:e.version,failureReason:e.failureReason}}makeEntry(e){return{config:e,child:void 0,logStream:void 0,restartTimer:void 0,pid:void 0,startedAt:void 0,restartCount:0,lastExitCode:void 0,manuallyStopped:!1,exitWaiters:[],version:void 0,processToken:void 0,breaker:new ha(this.breakerOptions),failureReason:void 0}}async reapOrphans(){let e;try{e=await as.readdir(this.adapter.paths.dir())}catch(n){if(n.code==="ENOENT")return;throw n}for(let n of e){if(!n.endsWith(".pid"))continue;let s=fp.join(this.adapter.paths.dir(),n),r;try{let i=await as.readFile(s,"utf8"),o=Number.parseInt(i.trim(),10);Number.isInteger(o)&&o>0&&(r=o)}catch{}if(typeof r=="number"&&Fc(r)){try{process.kill(r,"SIGTERM")}catch{}let i=Date.now()+Oc;for(;Date.now()<i&&Fc(r);)await new Promise(o=>setTimeout(o,50));if(Fc(r))try{process.kill(r,"SIGKILL")}catch{}}await as.unlink(s).catch(()=>{})}}spawn(e,n){if(this.stopping||e.manuallyStopped)return;let s=this.context;if(!s)throw new Error(`${this.managerName()}.spawn called before setContext`);let r=e.config,i=r.command.length>0?r.command:[r.name],o=Dr.createWriteStream(this.adapter.paths.logFile(r.name),{flags:"a"});o.write(`[hydra-acp] ${new Date().toISOString()} starting ${this.adapter.kind} ${r.name} (attempt ${n+1})
209
209
  `);let a=this.tokenRegistry?.mint(r.name,this.adapter.tokenRole)??s.serviceToken;e.processToken=a,e.version=void 0;let d={...process.env,HYDRA_ACP_DAEMON_URL:s.daemonUrl,HYDRA_ACP_DAEMON_HOST:s.daemonHost,HYDRA_ACP_DAEMON_PORT:String(s.daemonPort),HYDRA_ACP_TOKEN:a,HYDRA_ACP_WS_URL:s.daemonWsUrl,HYDRA_ACP_HOME:s.hydraHome,[this.adapter.nameEnvVar]:r.name,...r.env},[c,...l]=i;if(c===void 0){o.write(`[hydra-acp] ${this.adapter.kind} ${r.name} has empty command
@@ -215,18 +215,18 @@ ${gc}`:gc;await n.connection.request("session/prompt",{sessionId:d,prompt:[{type
215
215
  `),e.child=void 0,e.pid=void 0,e.lastExitCode=typeof p=="number"?p:void 0,e.processToken&&(this.tokenRegistry?.revoke(r.name),e.processToken=void 0);let g=e.exitWaiters.splice(0);for(let v of g)v();if(this.stopping||e.manuallyStopped){try{o.end()}catch{}e.logStream=void 0;return}e.restartCount+=1;let y=e.breaker.recordExit(p,r.name,this.adapter.kind);if(typeof y=="object"){e.failureReason=y.tripped,o.write(`[hydra-acp] ${this.adapter.kind} ${r.name} circuit breaker tripped: ${y.tripped}
216
216
  `);try{o.end()}catch{}e.logStream=void 0;return}this.scheduleRestart(e,n+1)})}scheduleRestart(e,n){if(this.stopping||e.manuallyStopped)return;let s=Math.min(this.restartBaseMs*2**Math.min(n,10),this.restartCapMs);e.restartTimer=setTimeout(()=>{e.restartTimer=void 0,this.spawn(e,n)},s),typeof e.restartTimer.unref=="function"&&e.restartTimer.unref()}managerName(){return this.adapter.kind==="extension"?"ExtensionManager":"TransformerManager"}};function Fc(t){try{return process.kill(t,0),!0}catch{return!1}}function Ji(t,e){return t.code=e,t}ge();var yv={kind:"extension",nameEnvVar:"HYDRA_ACP_EXTENSION_NAME",tokenRole:"extension",paths:{dir:M.extensionsDir,logFile:M.extensionLogFile,pidFile:M.extensionPidFile}},ma=class extends Nr{constructor(e,n,s={}){super(e,yv,n,s)}};ge();var wv={kind:"transformer",nameEnvVar:"HYDRA_ACP_TRANSFORMER_NAME",tokenRole:"transformer",paths:{dir:M.transformersDir,logFile:M.transformerLogFile,pidFile:M.transformerPidFile}},ga=class extends Nr{connected=new Map;constructor(e,n,s={}){super(e,wv,n,s)}registerConnection(e,n,s){this.connected.set(e,{name:e,connection:n,intercepts:new Set(s)})}deregisterConnection(e){this.connected.delete(e)}resolveChain(e){let n=[];for(let s of e){let r=this.connected.get(s);r&&n.push(r)}return n}};var ya=class{entries=new Map;changeHandlers=[];register(e,n,s){this.entries.set(e,{connection:n,commands:[...s]}),this.fireChanged()}clear(e){this.entries.delete(e)&&this.fireChanged()}get(e){return this.entries.get(e)}has(e){return this.entries.has(e)}list(){let e=[];for(let[n,s]of this.entries)for(let r of s.commands)e.push({name:n,command:r});return e}onChange(e){return this.changeHandlers.push(e),()=>{let n=this.changeHandlers.indexOf(e);n>=0&&this.changeHandlers.splice(n,1)}}fireChanged(){for(let e of this.changeHandlers)try{e()}catch{}}};ge();ge();import*as Ki from"fs/promises";import*as wa from"path";var zi=t=>{process.stderr.write(t+`
217
217
  `)};function Lc(t){zi=t??(e=>process.stderr.write(e+`
218
- `))}async function pp(t,e){let n=ln();if(!n)return;let s=await t.load(),r=new Map;for(let d of s.agents)r.set(d.id,d.version??"current");let i=e.activeAgentVersions(),o=wa.join(M.agentsDir(),n),a;try{a=await Ki.readdir(o,{withFileTypes:!0})}catch(d){let c=d;if(c.code==="ENOENT")return;zi(`hydra-acp: prune: failed to read ${o}: ${c.message}`);return}for(let d of a){if(!d.isDirectory())continue;let c=d.name,l=r.get(c);if(l===void 0)continue;let f=i.get(c)??new Set,u=wa.join(o,c),p;try{p=await Ki.readdir(u,{withFileTypes:!0})}catch(m){zi(`hydra-acp: prune: failed to read ${u}: ${m.message}`);continue}for(let m of p){if(!m.isDirectory())continue;let g=m.name;if(g===l||f.has(g)||g.includes(".partial-"))continue;let y=wa.join(u,g);try{await Ki.rm(y,{recursive:!0,force:!0}),zi(`hydra-acp: pruned stale ${c} ${g} (${y})`)}catch(v){zi(`hydra-acp: prune: failed to remove ${y}: ${v.message}`)}}}}function hp(t){let e,n=!1,s=0,r=(a,d)=>{t.logger&&t.logger[a](`agent-sync: ${d}`)},i=async()=>{let a=[];try{let l=await t.registry.load();for(let f of l.agents)await rc(f)==="yes"&&a.push(f.id)}catch(l){return r("warn",`registry load failed: ${l.message}`),t.intervalMs}if(a.length===0)return t.intervalMs;let d=s%a.length;s=(s+1)%a.length;let c=a[d];try{let{synced:l,skipped:f}=await t.manager.syncFromAgent(c);r("info",`${c}: synced ${l.length}, skipped ${f}`)}catch(l){r("warn",`${c}: ${l.message}`)}return Math.max(1,Math.floor(t.intervalMs/a.length))},o=a=>{n||(e=setTimeout(()=>{i().then(d=>{o(d)}).catch(d=>{r("warn",`tick crashed: ${d.message}`),o(t.intervalMs)})},a),e.unref())};return o(t.intervalMs),()=>{n=!0,e&&(clearTimeout(e),e=void 0)}}async function Bc(t){let e=t.maxDeletions??200,n=(p,m)=>{t.logger&&t.logger[p](`session-gc: ${m}`)},s=Date.now(),r=t.maxAgeMs>0?s-t.maxAgeMs:Number.POSITIVE_INFINITY,i=await t.manager.list({includeNonInteractive:!0}).catch(p=>(n("warn",`manager.list failed: ${p.message}`),[])),o=[];for(let p of i){if(p.status!=="cold")continue;if((t.selection??"explicit")==="explicit"){if(p.interactive!==!1)continue}else if(p.interactive===!0)continue;let g=Date.parse(p.updatedAt);Number.isFinite(g)&&(t.maxAgeMs>0&&g>r||o.push({sessionId:p.sessionId,lastUsedMs:g}))}if(o.length===0)return t.verbose&&n("info","no candidates"),{considered:0,deleted:0,failed:0,deferred:0};o.sort((p,m)=>p.lastUsedMs-m.lastUsedMs);let a=o.slice(0,e),d=a[0]?.lastUsedMs,c=0,l=0;for(let{sessionId:p}of a)try{await t.manager.deleteRecord(p)&&(c+=1)}catch(m){l+=1,n("warn",`delete ${p} failed: ${m.message}`)}let f=o.length-a.length;if(t.verbose||c>0||l>0){let p=(t.selection??"explicit")==="unpromoted"?"unpromoted":"non-interactive";n("info",`swept ${c} ${p} session(s) older than ${bv(t.maxAgeMs)}`+(l>0?`; ${l} failed`:"")+(f>0?`; ${f} deferred to next sweep`:""))}let u={considered:o.length,deleted:c,failed:l,deferred:f};return d!==void 0&&(u.oldestLastUsedMs=d),u}function mp(t){let e,n=!1,s=!1,r=i=>{n||(e=setTimeout(()=>{(async()=>{if(!s){s=!0;try{await Bc({manager:t.manager,maxAgeMs:t.maxAgeMs,selection:"unpromoted",...t.maxDeletionsPerSweep!==void 0?{maxDeletions:t.maxDeletionsPerSweep}:{},...t.logger?{logger:t.logger}:{}})}finally{s=!1}}})().catch(a=>{t.logger?.warn(`session-gc: sweep crashed: ${a.message}`)}).finally(()=>{r(t.intervalMs)})},i),e.unref())};return r(t.intervalMs),()=>{n=!0,e&&(clearTimeout(e),e=void 0)}}function bv(t){if(t<=0)return"any age";let e=t/(1440*60*1e3);if(e>=1)return`${e.toFixed(e>=10?0:1)}d`;let n=t/(3600*1e3);return`${n.toFixed(n>=10?0:1)}h`}_t();Vi();ge();Ns();import*as wp from"path";import{createHash as Iv,randomBytes as Sv,timingSafeEqual as kv}from"crypto";var bp="hydra_session_",xv=3600*24*30,gp=12,Av=32,Cv=50;function Rv(){return wp.join(M.home(),"session-tokens.json")}function yp(t){return Iv("sha256").update(t).digest("hex")}function vp(t){return Sv(t).toString("hex")}function Tv(){return vp(gp).slice(0,gp*2)}function Ev(){return`${bp}${vp(Av)}`}var ba=class t{records=new Map;writeTimer=null;writeInflight=null;filePath;constructor(e,n){this.filePath=n;for(let s of e)this.records.set(s.hash,s)}static async load(){let e=[],n=Rv(),s=await Bt(n);s&&Array.isArray(s.records)&&(e=s.records.filter(Pv));let r=new t(e,n);return r.sweepExpired(new Date)>0&&await r.flush(),r}async issue(e={}){let n=Ev(),s=yp(n),r=Tv(),i=new Date,o=e.ttlSec&&e.ttlSec>0?e.ttlSec:xv,a=new Date(i.getTime()+o*1e3),d={id:r,hash:s,label:e.label,createdAt:i.toISOString(),expiresAt:a.toISOString(),lastUsedAt:i.toISOString()};return this.records.set(s,d),this.scheduleWrite(),{id:r,token:n,expiresAt:d.expiresAt}}async verify(e){if(typeof e!="string"||!e.startsWith(bp))return;let n=yp(e),s=this.records.get(n);if(!s)return;let r=Buffer.from(s.hash,"hex"),i=Buffer.from(n,"hex");if(r.length!==i.length||!kv(r,i))return;let o=new Date;if(new Date(s.expiresAt).getTime()<=o.getTime()){this.records.delete(n),this.scheduleWrite();return}return s.lastUsedAt=o.toISOString(),this.scheduleWrite(),s.id}async revoke(e){for(let[n,s]of this.records)if(s.id===e)return this.records.delete(n),this.scheduleWrite(),!0;return!1}async revokeAll(){let e=this.records.size;return this.records.clear(),this.scheduleWrite(),e}list(){return Array.from(this.records.values()).map(({id:e,label:n,createdAt:s,expiresAt:r,lastUsedAt:i})=>({id:e,label:n,createdAt:s,expiresAt:r,lastUsedAt:i})).sort((e,n)=>n.createdAt.localeCompare(e.createdAt))}sweepExpired(e=new Date){let n=0;for(let[s,r]of this.records)new Date(r.expiresAt).getTime()<=e.getTime()&&(this.records.delete(s),n+=1);return n>0&&this.scheduleWrite(),n}async flush(){this.writeTimer&&(clearTimeout(this.writeTimer),this.writeTimer=null),await this.persist()}scheduleWrite(){this.writeTimer||(this.writeTimer=setTimeout(()=>{this.writeTimer=null,this.persist().catch(()=>{})},Cv))}persist(){let e=(this.writeInflight??Promise.resolve()).catch(()=>{}).then(()=>Et(this.filePath,{records:Array.from(this.records.values())},{mode:384}));return this.writeInflight=e,e.catch(()=>{}).finally(()=>{this.writeInflight===e&&(this.writeInflight=null)}),e}};function Pv(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.id=="string"&&typeof e.hash=="string"&&typeof e.createdAt=="string"&&typeof e.expiresAt=="string"&&typeof e.lastUsedAt=="string"&&(e.label===void 0||typeof e.label=="string")}Fn();var Ip="Bearer ",va=class{constructor(e){this.token=e}token;async validate(e){return Mv(e,this.token)?"service":void 0}},Ia=class{constructor(e){this.store=e}store;async validate(e){return this.store.verify(e)}},Sa=class{constructor(e){this.validators=e}validators;async validate(e){for(let n of this.validators){let s=await n.validate(e);if(s!==void 0)return s}}};function Sp(t){return async function(n,s){let r=n.headers.authorization;if(!r||!r.startsWith(Ip)){s.code(401).send({error:"Missing bearer token"});return}let i=r.slice(Ip.length).trim(),o=await t.validator.validate(i);if(!o){s.code(403).send({error:"Invalid token"});return}n.authIdentity=o}}function kp(t){let e=t.headers["sec-websocket-protocol"],n=Array.isArray(e)?e.join(","):e;if(n)for(let s of n.split(",")){let r=s.trim(),i="hydra-acp-token.";if(r.startsWith(i))return r.slice(i.length)}if(t.url)try{let r=new URL(t.url,"http://localhost").searchParams.get("token");if(r)return r}catch{return}}var ka=class{tokens=new Map;mint(e,n){let s=Ir();return this.tokens.set(s,{name:e,kind:n}),s}revoke(e){for(let[n,s]of this.tokens)s.name===e&&this.tokens.delete(n)}resolve(e){return this.tokens.get(e)}async validate(e){let n=this.tokens.get(e);if(n)return`${n.kind}:${n.name}`}};function Mv(t,e){if(t.length!==e.length)return!1;let n=0;for(let s=0;s<t.length;s+=1)n|=t.charCodeAt(s)^e.charCodeAt(s);return n===0}var xa=class{entries=new Map;maxFails;windowMs;constructor(e=10,n=900*1e3){this.maxFails=e,this.windowMs=n}isBlocked(e){let n=this.entries.get(e);return n?Date.now()-n.windowStart>this.windowMs?(this.entries.delete(e),!1):n.fails>=this.maxFails:!1}recordFailure(e){let n=Date.now(),s=this.entries.get(e);if(!s||n-s.windowStart>this.windowMs){this.entries.set(e,{fails:1,windowStart:n});return}s.fails+=1}recordSuccess(e){this.entries.delete(e)}sweepExpired(){let e=Date.now();for(let[n,s]of this.entries)e-s.windowStart>this.windowMs&&this.entries.delete(n)}};qe();Ws();Ra();import*as Xi from"os";import*as Np from"path";cs();hn();function Ta(t){let e=iI(t),n=oI(e),s=[];aI(s,t),dI(s,e,n);let r=s.join(`
218
+ `))}async function pp(t,e){let n=ln();if(!n)return;let s=await t.load(),r=new Map;for(let d of s.agents)r.set(d.id,d.version??"current");let i=e.activeAgentVersions(),o=wa.join(M.agentsDir(),n),a;try{a=await Ki.readdir(o,{withFileTypes:!0})}catch(d){let c=d;if(c.code==="ENOENT")return;zi(`hydra-acp: prune: failed to read ${o}: ${c.message}`);return}for(let d of a){if(!d.isDirectory())continue;let c=d.name,l=r.get(c);if(l===void 0)continue;let f=i.get(c)??new Set,u=wa.join(o,c),p;try{p=await Ki.readdir(u,{withFileTypes:!0})}catch(m){zi(`hydra-acp: prune: failed to read ${u}: ${m.message}`);continue}for(let m of p){if(!m.isDirectory())continue;let g=m.name;if(g===l||f.has(g)||g.includes(".partial-"))continue;let y=wa.join(u,g);try{await Ki.rm(y,{recursive:!0,force:!0}),zi(`hydra-acp: pruned stale ${c} ${g} (${y})`)}catch(v){zi(`hydra-acp: prune: failed to remove ${y}: ${v.message}`)}}}}function hp(t){let e,n=!1,s=0,r=(a,d)=>{t.logger&&t.logger[a](`agent-sync: ${d}`)},i=async()=>{let a=[];try{let l=await t.registry.load();for(let f of l.agents)await rc(f)==="yes"&&a.push(f.id)}catch(l){return r("warn",`registry load failed: ${l.message}`),t.intervalMs}if(a.length===0)return t.intervalMs;let d=s%a.length;s=(s+1)%a.length;let c=a[d];try{let{synced:l,skipped:f}=await t.manager.syncFromAgent(c);r("info",`${c}: synced ${l.length}, skipped ${f}`)}catch(l){r("warn",`${c}: ${l.message}`)}return Math.max(1,Math.floor(t.intervalMs/a.length))},o=a=>{n||(e=setTimeout(()=>{i().then(d=>{o(d)}).catch(d=>{r("warn",`tick crashed: ${d.message}`),o(t.intervalMs)})},a),e.unref())};return o(t.intervalMs),()=>{n=!0,e&&(clearTimeout(e),e=void 0)}}async function Bc(t){let e=t.maxDeletions??200,n=(p,m)=>{t.logger&&t.logger[p](`session-gc: ${m}`)},s=Date.now(),r=t.maxAgeMs>0?s-t.maxAgeMs:Number.POSITIVE_INFINITY,i=await t.manager.list({includeNonInteractive:!0}).catch(p=>(n("warn",`manager.list failed: ${p.message}`),[])),o=[];for(let p of i){if(p.status!=="cold")continue;if((t.selection??"explicit")==="explicit"){if(p.interactive!==!1)continue}else if(p.interactive===!0)continue;let g=Date.parse(p.updatedAt);Number.isFinite(g)&&(t.maxAgeMs>0&&g>r||o.push({sessionId:p.sessionId,lastUsedMs:g}))}if(o.length===0)return t.verbose&&n("info","no candidates"),{considered:0,deleted:0,failed:0,deferred:0};o.sort((p,m)=>p.lastUsedMs-m.lastUsedMs);let a=o.slice(0,e),d=a[0]?.lastUsedMs,c=0,l=0;for(let{sessionId:p}of a)try{await t.manager.deleteRecord(p)&&(c+=1)}catch(m){l+=1,n("warn",`delete ${p} failed: ${m.message}`)}let f=o.length-a.length;if(t.verbose||c>0||l>0){let p=(t.selection??"explicit")==="unpromoted"?"unpromoted":"non-interactive";n("info",`swept ${c} ${p} session(s) older than ${bv(t.maxAgeMs)}`+(l>0?`; ${l} failed`:"")+(f>0?`; ${f} deferred to next sweep`:""))}let u={considered:o.length,deleted:c,failed:l,deferred:f};return d!==void 0&&(u.oldestLastUsedMs=d),u}function mp(t){let e,n=!1,s=!1,r=i=>{n||(e=setTimeout(()=>{(async()=>{if(!s){s=!0;try{await Bc({manager:t.manager,maxAgeMs:t.maxAgeMs,selection:"unpromoted",...t.maxDeletionsPerSweep!==void 0?{maxDeletions:t.maxDeletionsPerSweep}:{},...t.logger?{logger:t.logger}:{}})}finally{s=!1}}})().catch(a=>{t.logger?.warn(`session-gc: sweep crashed: ${a.message}`)}).finally(()=>{r(t.intervalMs)})},i),e.unref())};return r(t.intervalMs),()=>{n=!0,e&&(clearTimeout(e),e=void 0)}}function bv(t){if(t<=0)return"any age";let e=t/(1440*60*1e3);if(e>=1)return`${e.toFixed(e>=10?0:1)}d`;let n=t/(3600*1e3);return`${n.toFixed(n>=10?0:1)}h`}_t();Vi();ge();Ns();import*as wp from"path";import{createHash as Iv,randomBytes as Sv,timingSafeEqual as kv}from"crypto";var bp="hydra_session_",xv=3600*24*30,gp=12,Av=32,Cv=50;function Rv(){return wp.join(M.home(),"session-tokens.json")}function yp(t){return Iv("sha256").update(t).digest("hex")}function vp(t){return Sv(t).toString("hex")}function Tv(){return vp(gp).slice(0,gp*2)}function Ev(){return`${bp}${vp(Av)}`}var ba=class t{records=new Map;writeTimer=null;writeInflight=null;filePath;constructor(e,n){this.filePath=n;for(let s of e)this.records.set(s.hash,s)}static async load(){let e=[],n=Rv(),s=await Bt(n);s&&Array.isArray(s.records)&&(e=s.records.filter(Pv));let r=new t(e,n);return r.sweepExpired(new Date)>0&&await r.flush(),r}async issue(e={}){let n=Ev(),s=yp(n),r=Tv(),i=new Date,o=e.ttlSec&&e.ttlSec>0?e.ttlSec:xv,a=new Date(i.getTime()+o*1e3),d={id:r,hash:s,label:e.label,createdAt:i.toISOString(),expiresAt:a.toISOString(),lastUsedAt:i.toISOString()};return this.records.set(s,d),this.scheduleWrite(),{id:r,token:n,expiresAt:d.expiresAt}}async verify(e){if(typeof e!="string"||!e.startsWith(bp))return;let n=yp(e),s=this.records.get(n);if(!s)return;let r=Buffer.from(s.hash,"hex"),i=Buffer.from(n,"hex");if(r.length!==i.length||!kv(r,i))return;let o=new Date;if(new Date(s.expiresAt).getTime()<=o.getTime()){this.records.delete(n),this.scheduleWrite();return}return s.lastUsedAt=o.toISOString(),this.scheduleWrite(),s.id}async revoke(e){for(let[n,s]of this.records)if(s.id===e)return this.records.delete(n),this.scheduleWrite(),!0;return!1}async revokeAll(){let e=this.records.size;return this.records.clear(),this.scheduleWrite(),e}list(){return Array.from(this.records.values()).map(({id:e,label:n,createdAt:s,expiresAt:r,lastUsedAt:i})=>({id:e,label:n,createdAt:s,expiresAt:r,lastUsedAt:i})).sort((e,n)=>n.createdAt.localeCompare(e.createdAt))}sweepExpired(e=new Date){let n=0;for(let[s,r]of this.records)new Date(r.expiresAt).getTime()<=e.getTime()&&(this.records.delete(s),n+=1);return n>0&&this.scheduleWrite(),n}async flush(){this.writeTimer&&(clearTimeout(this.writeTimer),this.writeTimer=null),await this.persist()}scheduleWrite(){this.writeTimer||(this.writeTimer=setTimeout(()=>{this.writeTimer=null,this.persist().catch(()=>{})},Cv))}persist(){let e=(this.writeInflight??Promise.resolve()).catch(()=>{}).then(()=>Et(this.filePath,{records:Array.from(this.records.values())},{mode:384}));return this.writeInflight=e,e.catch(()=>{}).finally(()=>{this.writeInflight===e&&(this.writeInflight=null)}),e}};function Pv(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.id=="string"&&typeof e.hash=="string"&&typeof e.createdAt=="string"&&typeof e.expiresAt=="string"&&typeof e.lastUsedAt=="string"&&(e.label===void 0||typeof e.label=="string")}Fn();var Ip="Bearer ",va=class{constructor(e){this.token=e}token;async validate(e){return Mv(e,this.token)?"service":void 0}},Ia=class{constructor(e){this.store=e}store;async validate(e){return this.store.verify(e)}},Sa=class{constructor(e){this.validators=e}validators;async validate(e){for(let n of this.validators){let s=await n.validate(e);if(s!==void 0)return s}}};function Sp(t){return async function(n,s){let r=n.headers.authorization;if(!r||!r.startsWith(Ip)){s.code(401).send({error:"Missing bearer token"});return}let i=r.slice(Ip.length).trim(),o=await t.validator.validate(i);if(!o){s.code(403).send({error:"Invalid token"});return}n.authIdentity=o}}function kp(t){let e=t.headers["sec-websocket-protocol"],n=Array.isArray(e)?e.join(","):e;if(n)for(let s of n.split(",")){let r=s.trim(),i="hydra-acp-token.";if(r.startsWith(i))return r.slice(i.length)}if(t.url)try{let r=new URL(t.url,"http://localhost").searchParams.get("token");if(r)return r}catch{return}}var ka=class{tokens=new Map;mint(e,n){let s=Ir();return this.tokens.set(s,{name:e,kind:n}),s}revoke(e){for(let[n,s]of this.tokens)s.name===e&&this.tokens.delete(n)}resolve(e){return this.tokens.get(e)}async validate(e){let n=this.tokens.get(e);if(n)return`${n.kind}:${n.name}`}};function Mv(t,e){if(t.length!==e.length)return!1;let n=0;for(let s=0;s<t.length;s+=1)n|=t.charCodeAt(s)^e.charCodeAt(s);return n===0}var xa=class{entries=new Map;maxFails;windowMs;constructor(e=10,n=900*1e3){this.maxFails=e,this.windowMs=n}isBlocked(e){let n=this.entries.get(e);return n?Date.now()-n.windowStart>this.windowMs?(this.entries.delete(e),!1):n.fails>=this.maxFails:!1}recordFailure(e){let n=Date.now(),s=this.entries.get(e);if(!s||n-s.windowStart>this.windowMs){this.entries.set(e,{fails:1,windowStart:n});return}s.fails+=1}recordSuccess(e){this.entries.delete(e)}sweepExpired(){let e=Date.now();for(let[n,s]of this.entries)e-s.windowStart>this.windowMs&&this.entries.delete(n)}};je();Ws();Ra();import*as Xi from"os";import*as Np from"path";cs();hn();function Ta(t){let e=iI(t),n=oI(e),s=[];aI(s,t),dI(s,e,n);let r=s.join(`
219
219
  `);return r.endsWith(`
220
220
  `)||(r+=`
221
221
  `),r}function iI(t){let e=[];for(let n of t.history){if(n.method!=="session/update")continue;let s=n.params;if(!s||typeof s!="object")continue;let r=yn(s.update,{cwd:t.session.cwd});r!==null&&e.push({event:r,recordedAt:n.recordedAt})}return e}function oI(t){let e=new Map;for(let{event:n}of t){if(n.kind==="tool-call"){let s=e.get(n.toolCallId);e.set(n.toolCallId,{title:n.title,status:n.status??s?.status??"pending"});continue}if(n.kind==="tool-call-update"){let s=e.get(n.toolCallId)??{title:"tool call",status:"pending"};e.set(n.toolCallId,{title:n.title??s.title,status:n.status??s.status})}}return e}function aI(t,e){let n=e.session,s=ze(n.sessionId),r=n.title?.trim()||`Hydra session ${s}`;t.push(`# ${Ks(r)}`),t.push("");let i=[];i.push(`- **Session:** \`${s}\` (lineage \`${n.lineageId}\`)`);let o=[n.agentId];n.currentModel&&o.push(`model: ${n.currentModel}`),n.currentMode&&o.push(`mode: ${n.currentMode}`),i.push(`- **Agent:** ${o.filter(Boolean).join(" \xB7 ")}`),i.push(`- **Cwd:** ${n.cwd}`),i.push(`- **Exported:** ${e.exportedAt} from ${e.exportedFrom.machine} (hydra ${e.exportedFrom.hydraVersion})`);let a=n.currentUsage;if(a&&(a.used!==void 0||a.costAmount!==void 0)){let d=[];if(a.used!==void 0){let c=a.size!==void 0?`${Hc(a.size)}`:void 0;d.push(c?`${Hc(a.used)} / ${c} tokens`:`${Hc(a.used)} tokens`)}if(a.costAmount!==void 0){let c=a.costCurrency??"USD";d.push(`$${a.costAmount.toFixed(2)} ${c}`)}i.push(`- **Usage:** ${d.join(" \xB7 ")}`)}t.push(i.join(`
222
222
  `)),t.push("")}function dI(t,e,n){if(!e.some(c=>cI(c.event))){t.push("_No conversation history recorded._"),t.push("");return}let s=new Set,r=0,i="",o=!1,a=()=>{i.length!==0&&(t.push(i.trimEnd()),t.push(""),i="")},d=()=>{o||(r+=1,t.push("---"),t.push(""),t.push(`## Turn ${r}`),t.push(""),o=!0)};for(let{event:c}of e)switch(c.kind){case"user-text":{a(),r+=1,t.push("---"),t.push(""),t.push(`## Turn ${r}`),t.push(""),t.push("**User:**"),t.push("");for(let l of c.text.split(`
223
223
  `))t.push(`> ${Ks(l)}`);t.push(""),t.push("**Assistant:**"),t.push(""),o=!0;break}case"agent-text":d(),i+=c.text;break;case"agent-thought":{d(),a();let l=c.text.split(`
224
- `);for(let f of l)t.push(`> _${Ks(f)}_`);t.push("");break}case"tool-call":{if(d(),a(),s.has(c.toolCallId))break;s.add(c.toolCallId);let l=n.get(c.toolCallId)??{title:c.title,status:c.status??"pending"};t.push(`- ${uI(l.status)} ${lI(l)}`),t.push("");break}case"tool-call-update":break;case"plan":{d(),a(),t.push("**Plan:**"),t.push("");for(let l of c.entries){let f=l.status==="completed"?"[x]":"[ ]";t.push(`- ${f} ${Ks(l.content)}`)}t.push("");break}case"mode-changed":d(),a(),t.push(`_mode: ${Ks(c.mode)}_`),t.push("");break;case"model-changed":d(),a(),t.push(`_model: ${Ks(c.model)}_`),t.push("");break;case"turn-complete":a();break;case"usage-update":case"available-commands":case"session-info":case"unknown":break}a()}function cI(t){switch(t.kind){case"usage-update":case"available-commands":case"session-info":case"unknown":case"turn-complete":return!1;default:return!0}}function lI(t){let e=t.status,n=e==="completed"||e===void 0?"":` _(${e})_`;return`${Ks(t.title)}${n}`}function uI(t){switch(t){case"completed":return"\u2713";case"failed":return"\u2717";case"cancelled":case"rejected":return"\u2298";case"in_progress":return"\u21BB";default:return"\xB7"}}function Ks(t){return t.replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Hc(t){return t.toLocaleString("en-US")}yt();_t();Pi();cs();function fI(t){let e=t.trim();if(e.length===0)return{operator:"OR",terms:[]};let n=/\w+:"[^"]*"|"[^"]*"|\S+/g,s=[],r;for(;(r=n.exec(e))!==null;)s.push(r[0]);let i="OR",o=!1,a=!1,d=[];for(let l of s){let f=l.toUpperCase();f==="AND"?o=!0:f==="OR"?a=!0:d.push(l)}o?i="AND":a&&(i="OR");let c=d.map(l=>pI(l)).filter(l=>l.term.length>0);return{operator:i,terms:c}}function pI(t){let e=/^(\w+):"([^"]*)"$/.exec(t);if(e)return{scope:_p(e[1]),term:e[2]};let n=/^"([^"]*)"$/.exec(t);if(n)return{scope:"all",term:n[1]};let s=/^(prompt|response|tool):([\s\S]*)$/i.exec(t);return s?{scope:_p(s[1]),term:s[2].trim()}:{scope:"all",term:t.trim()}}function _p(t){switch(t.toLowerCase()){case"prompt":return"user";case"response":return"agent";case"tool":return"tool";default:return"all"}}function hI(t,e){return t==="all"?!0:t==="user"?e==="user":t==="agent"?e==="agent"||e==="thought":e==="tool"||e==="tool-input"}var mI=5,gI=200,$p=30;async function Lp(t,e,n={}){let s=fI(e);if(s.terms.length===0)return{query:e,truncated:!1,results:[]};let r=n.maxSnippetsPerSession??mI,i=n.maxSessions??gI,o=n.sessionIds?new Set(n.sessionIds):null,a=await t.list(),d=o?a.filter(f=>o.has(f.sessionId)):a,c=[],l=!1;for(let f of d){if(c.length>=i){l=!0;break}let u=await t.loadHistory(f.sessionId).catch(()=>[]),p=yI(u,s,r);if(p.snippets.length===0)continue;let m={sessionId:f.sessionId,cwd:f.cwd,status:f.status,updatedAt:f.updatedAt,totalMatches:p.totalMatches,snippets:p.snippets};f.title!==void 0&&(m.title=f.title),c.push(m)}return{query:e,truncated:l,results:c}}function yI(t,e,n){if(e.terms.length===0)return{totalMatches:0,snippets:[]};let s=0,r=[];for(let{scope:i,term:o}of e.terms){let a=wI(t,o,i,n-r.length);if(e.operator==="AND"&&a.totalMatches===0)return{totalMatches:0,snippets:[]};s+=a.totalMatches,r.push(...a.snippets)}return{totalMatches:s,snippets:r}}function wI(t,e,n,s){let r=e.toLowerCase(),i=0,o=[];for(let a of t){let d=bI(a).filter(c=>hI(n,c.kind));for(let c of d){let l=c.text.toLowerCase(),f=l.indexOf(r);if(f===-1)continue;let u=0;for(;f!==-1;)u++,f=l.indexOf(r,f+r.length);if(i+=u,o.length<s){let p=l.indexOf(r),m={kind:c.kind,text:xI(c.text,p,r.length),recordedAt:a.recordedAt};c.toolName!==void 0&&(m.toolName=c.toolName),o.push(m)}}}return{totalMatches:i,snippets:o}}function bI(t){if(t.method!=="session/update")return[];let e=t.params;if(!e||typeof e!="object"||Array.isArray(e))return[];let n=e.update;if(!n||typeof n!="object"||Array.isArray(n))return[];let s=n,r=typeof s.sessionUpdate=="string"?s.sessionUpdate:s.kind;if(typeof r!="string")return[];switch(r){case"agent_message_chunk":{let i=Ea(s.content);return i?[{kind:"agent",text:i}]:[]}case"agent_thought":case"agent_thought_chunk":{let i=typeof s.text=="string"?Qe(s.text):Ea(s.content);return i?[{kind:"thought",text:i}]:[]}case"user_message_chunk":{if(SI(s))return[];let i=Ea(s.content);return i?[{kind:"user",text:i}]:[]}case"prompt_received":{let i=kI(s.prompt);return i?[{kind:"user",text:i}]:[]}case"tool_call":case"tool_call_update":return vI(s);default:return[]}}function vI(t){let e=Op(t,"name"),n=Op(t,"title"),s=[];if(n!==void 0){let a=Ae(n);if(a.length>0){let d={kind:"tool",text:a};e!==void 0&&(d.toolName=e),s.push(d)}}if(e!==void 0&&e!==n){let a=Ae(e);a.length>0&&s.push({kind:"tool",toolName:e,text:a})}let r=t.rawInput;if(r&&typeof r=="object"){let a=Fp(r);if(a.length>0){let d={kind:"tool-input",text:Ae(a)};e!==void 0&&(d.toolName=e),s.push(d)}}let i=t.locations;if(Array.isArray(i)&&i.length>0){let a=Fp(i);if(a.length>0){let d={kind:"tool-input",text:Ae(a)};e!==void 0&&(d.toolName=e),s.push(d)}}let o=II(t);if(o!==null){let a={kind:"tool",text:o};e!==void 0&&(a.toolName=e),s.push(a)}return s}function II(t){let e=t.content;if(Array.isArray(e))for(let s of e){if(!s||typeof s!="object")continue;let i=s.content;if(!i||typeof i!="object")continue;let o=i;if(o.type==="text"&&typeof o.text=="string"){let a=Ae(o.text);if(a.length>0)return a}}let n=t.rawOutput;if(n&&typeof n=="object"){let s=n.error;if(typeof s=="string"){let r=Ae(s);if(r.length>0)return r}}return null}function SI(t){let e=t._meta;if(!e||typeof e!="object"||Array.isArray(e))return!1;let n=e["hydra-acp"];return!n||typeof n!="object"||Array.isArray(n)?!1:n.compatFor==="prompt_received"}function Ea(t){if(typeof t=="string")return Qe(t);if(!t||typeof t!="object"||Array.isArray(t))return"";let e=t;return typeof e.text=="string"?Qe(e.text):""}function kI(t){if(!Array.isArray(t))return"";let e=[];for(let n of t){let s=Ea(n);s.length>0&&e.push(s)}return e.join("")}function Op(t,e){let n=t[e];return typeof n=="string"?n:void 0}function Fp(t){try{return JSON.stringify(t)}catch{return""}}function xI(t,e,n){let s=t.replace(/\s+/g," ").trim();if(s.length===0)return"";let r=s.toLowerCase(),i=t.slice(e,e+n).toLowerCase().replace(/\s+/g," ").trim(),o=i.length>0?r.indexOf(i):0;o===-1&&(o=0);let a=Math.max(0,o-$p),d=Math.min(s.length,o+i.length+$p),c=a>0?"\u2026":"",l=d<s.length?"\u2026":"";return`${c}${s.slice(a,d)}${l}`}import{randomBytes as AI}from"crypto";function Qi(t){if(t.extensionMcp===void 0||t.mcpTokenRegistry===void 0||t.getDaemonOrigin===void 0)return;let e=t.extensionMcp.list();if(e.length===0)return;let n=AI(32).toString("hex"),s=t.mcpTokenRegistry.reserve(n),r=t.getDaemonOrigin(),i=e.map(a=>({name:a,type:"http",url:`${r}/mcp/${a}`,headers:[{name:"Authorization",value:`Bearer ${n}`}]})),o=t.mcpTokenRegistry;return{descriptors:i,bindToSession:a=>{s.complete(a),a.onClose(()=>{o.unbind(n)})},abandon:a=>s.abandon(a)}}function Bp(t){if(t.publicHost&&t.publicHost.length>0)return t.publicHost;if(t.host&&!Bn(t.host))return t.port!==void 0?`${t.host}:${t.port}`:t.host}function Dp(t,e,n,s={}){t.get("/v1/sessions",async r=>{let i=r.query,o=i?.includeNonInteractive==="1"||i?.includeNonInteractive==="true";return{sessions:await e.list({cwd:i?.cwd,includeNonInteractive:o})}}),t.get("/v1/sessions/:id",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=await e.getOne(a);return d||(i.code(404).send({error:"session not found"}),i)}),t.post("/v1/sessions/search",async(r,i)=>{let o=r.body??{},a=typeof o.q=="string"?o.q:"";if(a.trim().length===0)return i.code(400).send({error:"q is required"}),i;let d=Array.isArray(o.sessionIds)?o.sessionIds.filter(l=>typeof l=="string"&&l.length>0):void 0;return await Lp(e,a,{sessionIds:d})}),t.post("/v1/sessions",async(r,i)=>{let o=r.body??{},a=Nt(o.cwd??n.cwd),d=o.agentId??n.agentId,c=Qi(s),l=c!==void 0?[...o.mcpServers??[],...c.descriptors]:o.mcpServers;try{let f=await e.create({cwd:a,agentId:d,mcpServers:l});c!==void 0&&c.bindToSession(f),i.code(201).send({sessionId:f.sessionId,agentId:f.agentId,cwd:f.cwd})}catch(f){c!==void 0&&c.abandon(f instanceof Error?f:void 0),i.code(500).send({error:f.message})}}),t.post("/v1/sessions/collect",async(r,i)=>{let o=r.body??{},a=typeof o.maxAgeDays=="number"&&o.maxAgeDays>0?o.maxAgeDays*24*60*60*1e3:0,d=typeof o.limit=="number"&&o.limit>0?o.limit:1e3,c=o.selection==="explicit"||o.selection==="unpromoted"?o.selection:"unpromoted";try{let l=await Bc({manager:e,maxAgeMs:a,maxDeletions:d,selection:c,verbose:!1});i.code(200).send(l)}catch(l){i.code(500).send({error:l.message})}}),t.post("/v1/sessions/:id/kill",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(d){d.close({deleteRecord:!1}).catch(()=>{}),i.code(202).send();return}if(!await e.hasRecord(a)){i.code(404).send({error:"session not found"});return}i.code(204).send()}),t.post("/v1/sessions/:id/stdin/open",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(!d)return i.code(404).send({error:"session not found"}),i;let c=r.body??{},l={};(c.mode==="memory"||c.mode==="file")&&(l.mode=c.mode),typeof c.capacityBytes=="number"&&(l.capacityBytes=c.capacityBytes),typeof c.fileCapBytes=="number"&&(l.fileCapBytes=c.fileCapBytes),(l.mode??"memory")==="file"&&(l.filePathFor=f=>Np.join(Xi.tmpdir(),`hydra-acp-stdin-${f}.log`));try{return d.openStream(l)}catch(f){return i.code(409).send({error:f.message}),i}}),t.post("/v1/sessions/:id/stdin",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(!d)return i.code(404).send({error:"session not found"}),i;let c=r.body??{},l=typeof c.chunk=="string"?c.chunk:"",f=c.eof===!0;try{return d.streamWrite(l,f)}catch(u){return i.code(409).send({error:u.message}),i}}),t.patch("/v1/sessions/:id",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=r.body??{};if(d.priority!==void 0){let l=d.priority,f;if(l===null||l===0)f=void 0;else if(typeof l=="number"&&Number.isInteger(l)&&l>0)f=l;else{i.code(400).send({error:"priority must be a non-negative integer (or null to clear)"});return}if(!await e.setPriority(a,f)){i.code(404).send({error:"session not found"});return}i.code(204).send();return}if(d.regen===!0){if(!(e.get(a)!==void 0||await e.hasRecord(a))){i.code(404).send({error:"session not found"});return}e.scheduleSynopsis(a),i.code(202).send();return}if(typeof d.title!="string"||d.title.trim().length===0){i.code(400).send({error:"title must be a non-empty string"});return}if(!await e.setTitle(a,d.title)){i.code(404).send({error:"session not found"});return}i.code(204).send()}),t.delete("/v1/sessions/:id",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(d){await d.close({deleteRecord:!0}),i.code(204).send();return}if(!await e.deleteRecord(a)){i.code(404).send({error:"session not found"});return}i.code(204).send()}),t.get("/v1/sessions/:id/export",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=r.query?.tools,c=d==="references"?"references":Vf(d),l=await e.exportBundle(a,c==="references"?{tools:"references"}:{});if(!l){i.code(404).send({error:"session not found"});return}let f=ji({record:l.record,history:c==="summary"?Yf(l.history,"summary"):l.history,promptHistory:l.promptHistory.length>0?l.promptHistory:void 0,...l.toolBlobs!==void 0?{toolBlobs:l.toolBlobs}:{},hydraVersion:fe,machine:Xi.hostname(),hydraHost:Bp(n)}),u=new Date().toISOString().replace(/[:.]/g,"-");i.header("Content-Disposition",`attachment; filename="${a}-${u}.hydra"`),i.code(200).send(f)}),t.get("/v1/sessions/:id/diff",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=await e.exportBundle(a);if(!d){i.code(404).send({error:"session not found"});return}let c=r.query??{},l=c.fold==="true"||c.fold==="1",f=typeof c.paths=="string"&&c.paths.length>0?new Set(c.paths.split(",").map(p=>p.trim()).filter(p=>p.length>0)):void 0,u=Hr(d.history);f&&(u=u.filter(p=>f.has(p.path))),l&&(u=u.map(p=>({...p,hunks:Ur(p.hunks)}))),i.code(200).send(u)}),t.get("/v1/sessions/:id/tools/:hash",async(r,i)=>{let o=r.params,a=await e.resolveCanonicalId(o.id)??o.id,d=await e.loadToolBlob(a,o.hash);if(d===null){i.code(404).send({error:"tool blob not found"});return}i.header("Content-Type","text/plain; charset=utf-8"),i.code(200).send(d)}),t.get("/v1/sessions/:id/transcript",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=await e.exportBundle(a);if(!d){i.code(404).send({error:"session not found"});return}let c=ji({record:d.record,history:d.history,promptHistory:d.promptHistory.length>0?d.promptHistory:void 0,hydraVersion:fe,machine:Xi.hostname(),hydraHost:Bp(n)});i.header("Content-Type","text/markdown; charset=utf-8"),i.code(200).send(Ta(c))}),t.post("/v1/sessions/:id/fork",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=r.body??{},c={};if(d.forkAt!==void 0){if(typeof d.forkAt!="string"||d.forkAt.length===0){i.code(400).send({error:"forkAt must be a non-empty string"});return}c.forkAt=d.forkAt}if(d.cwd!==void 0){if(typeof d.cwd!="string"||d.cwd.length===0){i.code(400).send({error:"cwd must be a non-empty string"});return}c.cwd=Nt(d.cwd)}if(d.agentId!==void 0){if(typeof d.agentId!="string"||d.agentId.length===0){i.code(400).send({error:"agentId must be a non-empty string"});return}c.agentId=d.agentId}if(d.title!==void 0){if(typeof d.title!="string"){i.code(400).send({error:"title must be a string"});return}c.title=d.title}try{let l=await e.forkSession(a,c);i.code(201).send(l)}catch(l){let f=l;if(f.code===D.SessionNotFound){i.code(404).send({error:f.message});return}if(f.code===D.InvalidParams||f.code===D.AgentNotInstalled){i.code(400).send({error:f.message});return}i.code(500).send({error:f.message})}}),t.post("/v1/sessions/import",async(r,i)=>{let o=r.body??{};if(o.bundle===void 0){i.code(400).send({error:"missing bundle"});return}let a;if(o.cwd!==void 0){if(typeof o.cwd!="string"||o.cwd.length===0){i.code(400).send({error:"cwd must be a non-empty string"});return}a=o.cwd}let d;try{d=Gt(o.bundle)}catch(c){i.code(400).send({error:"invalid bundle",details:c.message});return}try{let c=await e.importBundle(d,{replace:o.replace===!0,...a!==void 0?{cwd:a}:{}});i.code(201).send(c)}catch(c){let l=c;if(l.code===D.BundleAlreadyImported){i.code(409).send({error:"bundle already imported",existingSessionId:l.existingSessionId});return}i.code(500).send({error:l.message})}}),t.get("/v1/sessions/:id/history",async(r,i)=>{let o=r.params.id,a=r.query,d=a?.follow==="1"||a?.follow==="true",c=await e.resolveCanonicalId(o)??o,l=e.get(c),f,u,p=!1,m=1e4,g=[];if(l){d&&(u=l.onBroadcast(v=>{i.raw.writableEnded||(p?i.raw.write(JSON.stringify(v)+`
224
+ `);for(let f of l)t.push(`> _${Ks(f)}_`);t.push("");break}case"tool-call":{if(d(),a(),s.has(c.toolCallId))break;s.add(c.toolCallId);let l=n.get(c.toolCallId)??{title:c.title,status:c.status??"pending"};t.push(`- ${uI(l.status)} ${lI(l)}`),t.push("");break}case"tool-call-update":break;case"plan":{d(),a(),t.push("**Plan:**"),t.push("");for(let l of c.entries){let f=l.status==="completed"?"[x]":"[ ]";t.push(`- ${f} ${Ks(l.content)}`)}t.push("");break}case"mode-changed":d(),a(),t.push(`_mode: ${Ks(c.mode)}_`),t.push("");break;case"model-changed":d(),a(),t.push(`_model: ${Ks(c.model)}_`),t.push("");break;case"turn-complete":a();break;case"usage-update":case"available-commands":case"session-info":case"unknown":break}a()}function cI(t){switch(t.kind){case"usage-update":case"available-commands":case"session-info":case"unknown":case"turn-complete":return!1;default:return!0}}function lI(t){let e=t.status,n=e==="completed"||e===void 0?"":` _(${e})_`;return`${Ks(t.title)}${n}`}function uI(t){switch(t){case"completed":return"\u2713";case"failed":return"\u2717";case"cancelled":case"rejected":return"\u2298";case"in_progress":return"\u21BB";default:return"\xB7"}}function Ks(t){return t.replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Hc(t){return t.toLocaleString("en-US")}yt();_t();Pi();cs();function fI(t){let e=t.trim();if(e.length===0)return{operator:"OR",terms:[]};let n=/\w+:"[^"]*"|"[^"]*"|\S+/g,s=[],r;for(;(r=n.exec(e))!==null;)s.push(r[0]);let i="OR",o=!1,a=!1,d=[];for(let l of s){let f=l.toUpperCase();f==="AND"?o=!0:f==="OR"?a=!0:d.push(l)}o?i="AND":a&&(i="OR");let c=d.map(l=>pI(l)).filter(l=>l.term.length>0);return{operator:i,terms:c}}function pI(t){let e=/^(\w+):"([^"]*)"$/.exec(t);if(e)return{scope:_p(e[1]),term:e[2]};let n=/^"([^"]*)"$/.exec(t);if(n)return{scope:"all",term:n[1]};let s=/^(prompt|response|tool):([\s\S]*)$/i.exec(t);return s?{scope:_p(s[1]),term:s[2].trim()}:{scope:"all",term:t.trim()}}function _p(t){switch(t.toLowerCase()){case"prompt":return"user";case"response":return"agent";case"tool":return"tool";default:return"all"}}function hI(t,e){return t==="all"?!0:t==="user"?e==="user":t==="agent"?e==="agent"||e==="thought":e==="tool"||e==="tool-input"}var mI=5,gI=200,$p=30;async function Lp(t,e,n={}){let s=fI(e);if(s.terms.length===0)return{query:e,truncated:!1,results:[]};let r=n.maxSnippetsPerSession??mI,i=n.maxSessions??gI,o=n.sessionIds?new Set(n.sessionIds):null,a=await t.list(),d=o?a.filter(f=>o.has(f.sessionId)):a,c=[],l=!1;for(let f of d){if(c.length>=i){l=!0;break}let u=await t.loadHistory(f.sessionId).catch(()=>[]),p=yI(u,s,r);if(p.snippets.length===0)continue;let m={sessionId:f.sessionId,cwd:f.cwd,status:f.status,updatedAt:f.updatedAt,totalMatches:p.totalMatches,snippets:p.snippets};f.title!==void 0&&(m.title=f.title),c.push(m)}return{query:e,truncated:l,results:c}}function yI(t,e,n){if(e.terms.length===0)return{totalMatches:0,snippets:[]};let s=0,r=[];for(let{scope:i,term:o}of e.terms){let a=wI(t,o,i,n-r.length);if(e.operator==="AND"&&a.totalMatches===0)return{totalMatches:0,snippets:[]};s+=a.totalMatches,r.push(...a.snippets)}return{totalMatches:s,snippets:r}}function wI(t,e,n,s){let r=e.toLowerCase(),i=0,o=[];for(let a of t){let d=bI(a).filter(c=>hI(n,c.kind));for(let c of d){let l=c.text.toLowerCase(),f=l.indexOf(r);if(f===-1)continue;let u=0;for(;f!==-1;)u++,f=l.indexOf(r,f+r.length);if(i+=u,o.length<s){let p=l.indexOf(r),m={kind:c.kind,text:xI(c.text,p,r.length),recordedAt:a.recordedAt};c.toolName!==void 0&&(m.toolName=c.toolName),o.push(m)}}}return{totalMatches:i,snippets:o}}function bI(t){if(t.method!=="session/update")return[];let e=t.params;if(!e||typeof e!="object"||Array.isArray(e))return[];let n=e.update;if(!n||typeof n!="object"||Array.isArray(n))return[];let s=n,r=typeof s.sessionUpdate=="string"?s.sessionUpdate:s.kind;if(typeof r!="string")return[];switch(r){case"agent_message_chunk":{let i=Ea(s.content);return i?[{kind:"agent",text:i}]:[]}case"agent_thought":case"agent_thought_chunk":{let i=typeof s.text=="string"?Qe(s.text):Ea(s.content);return i?[{kind:"thought",text:i}]:[]}case"user_message_chunk":{if(SI(s))return[];let i=Ea(s.content);return i?[{kind:"user",text:i}]:[]}case"prompt_received":{let i=kI(s.prompt);return i?[{kind:"user",text:i}]:[]}case"tool_call":case"tool_call_update":return vI(s);default:return[]}}function vI(t){let e=Op(t,"name"),n=Op(t,"title"),s=[];if(n!==void 0){let a=xe(n);if(a.length>0){let d={kind:"tool",text:a};e!==void 0&&(d.toolName=e),s.push(d)}}if(e!==void 0&&e!==n){let a=xe(e);a.length>0&&s.push({kind:"tool",toolName:e,text:a})}let r=t.rawInput;if(r&&typeof r=="object"){let a=Fp(r);if(a.length>0){let d={kind:"tool-input",text:xe(a)};e!==void 0&&(d.toolName=e),s.push(d)}}let i=t.locations;if(Array.isArray(i)&&i.length>0){let a=Fp(i);if(a.length>0){let d={kind:"tool-input",text:xe(a)};e!==void 0&&(d.toolName=e),s.push(d)}}let o=II(t);if(o!==null){let a={kind:"tool",text:o};e!==void 0&&(a.toolName=e),s.push(a)}return s}function II(t){let e=t.content;if(Array.isArray(e))for(let s of e){if(!s||typeof s!="object")continue;let i=s.content;if(!i||typeof i!="object")continue;let o=i;if(o.type==="text"&&typeof o.text=="string"){let a=xe(o.text);if(a.length>0)return a}}let n=t.rawOutput;if(n&&typeof n=="object"){let s=n.error;if(typeof s=="string"){let r=xe(s);if(r.length>0)return r}}return null}function SI(t){let e=t._meta;if(!e||typeof e!="object"||Array.isArray(e))return!1;let n=e["hydra-acp"];return!n||typeof n!="object"||Array.isArray(n)?!1:n.compatFor==="prompt_received"}function Ea(t){if(typeof t=="string")return Qe(t);if(!t||typeof t!="object"||Array.isArray(t))return"";let e=t;return typeof e.text=="string"?Qe(e.text):""}function kI(t){if(!Array.isArray(t))return"";let e=[];for(let n of t){let s=Ea(n);s.length>0&&e.push(s)}return e.join("")}function Op(t,e){let n=t[e];return typeof n=="string"?n:void 0}function Fp(t){try{return JSON.stringify(t)}catch{return""}}function xI(t,e,n){let s=t.replace(/\s+/g," ").trim();if(s.length===0)return"";let r=s.toLowerCase(),i=t.slice(e,e+n).toLowerCase().replace(/\s+/g," ").trim(),o=i.length>0?r.indexOf(i):0;o===-1&&(o=0);let a=Math.max(0,o-$p),d=Math.min(s.length,o+i.length+$p),c=a>0?"\u2026":"",l=d<s.length?"\u2026":"";return`${c}${s.slice(a,d)}${l}`}import{randomBytes as AI}from"crypto";function Qi(t){if(t.extensionMcp===void 0||t.mcpTokenRegistry===void 0||t.getDaemonOrigin===void 0)return;let e=t.extensionMcp.list();if(e.length===0)return;let n=AI(32).toString("hex"),s=t.mcpTokenRegistry.reserve(n),r=t.getDaemonOrigin(),i=e.map(a=>({name:a,type:"http",url:`${r}/mcp/${a}`,headers:[{name:"Authorization",value:`Bearer ${n}`}]})),o=t.mcpTokenRegistry;return{descriptors:i,bindToSession:a=>{s.complete(a),a.onClose(()=>{o.unbind(n)})},abandon:a=>s.abandon(a)}}function Bp(t){if(t.publicHost&&t.publicHost.length>0)return t.publicHost;if(t.host&&!Bn(t.host))return t.port!==void 0?`${t.host}:${t.port}`:t.host}function Dp(t,e,n,s={}){t.get("/v1/sessions",async r=>{let i=r.query,o=i?.includeNonInteractive==="1"||i?.includeNonInteractive==="true";return{sessions:await e.list({cwd:i?.cwd,includeNonInteractive:o})}}),t.get("/v1/sessions/:id",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=await e.getOne(a);return d||(i.code(404).send({error:"session not found"}),i)}),t.post("/v1/sessions/search",async(r,i)=>{let o=r.body??{},a=typeof o.q=="string"?o.q:"";if(a.trim().length===0)return i.code(400).send({error:"q is required"}),i;let d=Array.isArray(o.sessionIds)?o.sessionIds.filter(l=>typeof l=="string"&&l.length>0):void 0;return await Lp(e,a,{sessionIds:d})}),t.post("/v1/sessions",async(r,i)=>{let o=r.body??{},a=Nt(o.cwd??n.cwd),d=o.agentId??n.agentId,c=Qi(s),l=c!==void 0?[...o.mcpServers??[],...c.descriptors]:o.mcpServers;try{let f=await e.create({cwd:a,agentId:d,mcpServers:l});c!==void 0&&c.bindToSession(f),i.code(201).send({sessionId:f.sessionId,agentId:f.agentId,cwd:f.cwd})}catch(f){c!==void 0&&c.abandon(f instanceof Error?f:void 0),i.code(500).send({error:f.message})}}),t.post("/v1/sessions/collect",async(r,i)=>{let o=r.body??{},a=typeof o.maxAgeDays=="number"&&o.maxAgeDays>0?o.maxAgeDays*24*60*60*1e3:0,d=typeof o.limit=="number"&&o.limit>0?o.limit:1e3,c=o.selection==="explicit"||o.selection==="unpromoted"?o.selection:"unpromoted";try{let l=await Bc({manager:e,maxAgeMs:a,maxDeletions:d,selection:c,verbose:!1});i.code(200).send(l)}catch(l){i.code(500).send({error:l.message})}}),t.post("/v1/sessions/:id/kill",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(d){d.close({deleteRecord:!1}).catch(()=>{}),i.code(202).send();return}if(!await e.hasRecord(a)){i.code(404).send({error:"session not found"});return}i.code(204).send()}),t.post("/v1/sessions/:id/stdin/open",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(!d)return i.code(404).send({error:"session not found"}),i;let c=r.body??{},l={};(c.mode==="memory"||c.mode==="file")&&(l.mode=c.mode),typeof c.capacityBytes=="number"&&(l.capacityBytes=c.capacityBytes),typeof c.fileCapBytes=="number"&&(l.fileCapBytes=c.fileCapBytes),(l.mode??"memory")==="file"&&(l.filePathFor=f=>Np.join(Xi.tmpdir(),`hydra-acp-stdin-${f}.log`));try{return d.openStream(l)}catch(f){return i.code(409).send({error:f.message}),i}}),t.post("/v1/sessions/:id/stdin",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(!d)return i.code(404).send({error:"session not found"}),i;let c=r.body??{},l=typeof c.chunk=="string"?c.chunk:"",f=c.eof===!0;try{return d.streamWrite(l,f)}catch(u){return i.code(409).send({error:u.message}),i}}),t.patch("/v1/sessions/:id",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=r.body??{};if(d.priority!==void 0){let l=d.priority,f;if(l===null||l===0)f=void 0;else if(typeof l=="number"&&Number.isInteger(l)&&l>0)f=l;else{i.code(400).send({error:"priority must be a non-negative integer (or null to clear)"});return}if(!await e.setPriority(a,f)){i.code(404).send({error:"session not found"});return}i.code(204).send();return}if(d.regen===!0){if(!(e.get(a)!==void 0||await e.hasRecord(a))){i.code(404).send({error:"session not found"});return}e.scheduleSynopsis(a),i.code(202).send();return}if(typeof d.title!="string"||d.title.trim().length===0){i.code(400).send({error:"title must be a non-empty string"});return}if(!await e.setTitle(a,d.title)){i.code(404).send({error:"session not found"});return}i.code(204).send()}),t.delete("/v1/sessions/:id",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=e.get(a);if(d){await d.close({deleteRecord:!0}),i.code(204).send();return}if(!await e.deleteRecord(a)){i.code(404).send({error:"session not found"});return}i.code(204).send()}),t.get("/v1/sessions/:id/export",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=r.query?.tools,c=d==="references"?"references":Vf(d),l=await e.exportBundle(a,c==="references"?{tools:"references"}:{});if(!l){i.code(404).send({error:"session not found"});return}let f=ji({record:l.record,history:c==="summary"?Yf(l.history,"summary"):l.history,promptHistory:l.promptHistory.length>0?l.promptHistory:void 0,...l.toolBlobs!==void 0?{toolBlobs:l.toolBlobs}:{},hydraVersion:fe,machine:Xi.hostname(),hydraHost:Bp(n)}),u=new Date().toISOString().replace(/[:.]/g,"-");i.header("Content-Disposition",`attachment; filename="${a}-${u}.hydra"`),i.code(200).send(f)}),t.get("/v1/sessions/:id/diff",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=await e.exportBundle(a);if(!d){i.code(404).send({error:"session not found"});return}let c=r.query??{},l=c.fold==="true"||c.fold==="1",f=typeof c.paths=="string"&&c.paths.length>0?new Set(c.paths.split(",").map(p=>p.trim()).filter(p=>p.length>0)):void 0,u=Hr(d.history);f&&(u=u.filter(p=>f.has(p.path))),l&&(u=u.map(p=>({...p,hunks:Ur(p.hunks)}))),i.code(200).send(u)}),t.get("/v1/sessions/:id/tools/:hash",async(r,i)=>{let o=r.params,a=await e.resolveCanonicalId(o.id)??o.id,d=await e.loadToolBlob(a,o.hash);if(d===null){i.code(404).send({error:"tool blob not found"});return}i.header("Content-Type","text/plain; charset=utf-8"),i.code(200).send(d)}),t.get("/v1/sessions/:id/transcript",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=await e.exportBundle(a);if(!d){i.code(404).send({error:"session not found"});return}let c=ji({record:d.record,history:d.history,promptHistory:d.promptHistory.length>0?d.promptHistory:void 0,hydraVersion:fe,machine:Xi.hostname(),hydraHost:Bp(n)});i.header("Content-Type","text/markdown; charset=utf-8"),i.code(200).send(Ta(c))}),t.post("/v1/sessions/:id/fork",async(r,i)=>{let o=r.params.id,a=await e.resolveCanonicalId(o)??o,d=r.body??{},c={};if(d.forkAt!==void 0){if(typeof d.forkAt!="string"||d.forkAt.length===0){i.code(400).send({error:"forkAt must be a non-empty string"});return}c.forkAt=d.forkAt}if(d.cwd!==void 0){if(typeof d.cwd!="string"||d.cwd.length===0){i.code(400).send({error:"cwd must be a non-empty string"});return}c.cwd=Nt(d.cwd)}if(d.agentId!==void 0){if(typeof d.agentId!="string"||d.agentId.length===0){i.code(400).send({error:"agentId must be a non-empty string"});return}c.agentId=d.agentId}if(d.title!==void 0){if(typeof d.title!="string"){i.code(400).send({error:"title must be a string"});return}c.title=d.title}try{let l=await e.forkSession(a,c);i.code(201).send(l)}catch(l){let f=l;if(f.code===D.SessionNotFound){i.code(404).send({error:f.message});return}if(f.code===D.InvalidParams||f.code===D.AgentNotInstalled){i.code(400).send({error:f.message});return}i.code(500).send({error:f.message})}}),t.post("/v1/sessions/import",async(r,i)=>{let o=r.body??{};if(o.bundle===void 0){i.code(400).send({error:"missing bundle"});return}let a;if(o.cwd!==void 0){if(typeof o.cwd!="string"||o.cwd.length===0){i.code(400).send({error:"cwd must be a non-empty string"});return}a=o.cwd}let d;try{d=Gt(o.bundle)}catch(c){i.code(400).send({error:"invalid bundle",details:c.message});return}try{let c=await e.importBundle(d,{replace:o.replace===!0,...a!==void 0?{cwd:a}:{}});i.code(201).send(c)}catch(c){let l=c;if(l.code===D.BundleAlreadyImported){i.code(409).send({error:"bundle already imported",existingSessionId:l.existingSessionId});return}i.code(500).send({error:l.message})}}),t.get("/v1/sessions/:id/history",async(r,i)=>{let o=r.params.id,a=r.query,d=a?.follow==="1"||a?.follow==="true",c=await e.resolveCanonicalId(o)??o,l=e.get(c),f,u,p=!1,m=1e4,g=[];if(l){d&&(u=l.onBroadcast(v=>{i.raw.writableEnded||(p?i.raw.write(JSON.stringify(v)+`
225
225
  `):(g.push(v),g.length>m&&g.shift()))})),r.raw.on("close",()=>{u?.(),i.raw.writableEnded||i.raw.end()});try{f=await l.getHistorySnapshot()}catch(v){throw u?.(),v}}else{let v=await e.getHistory(c);if(v===void 0)return i.code(404).send({error:"session not found"}),i;f=v}i.raw.setHeader("Content-Type","application/x-ndjson"),i.raw.setHeader("Cache-Control","no-cache"),i.raw.statusCode=200;let y=new Set;for(let v of f??[]){i.raw.write(JSON.stringify(v)+`
226
226
  `);let b=v;typeof b.recordedAt=="number"&&y.add(String(b.recordedAt))}for(;g.length>0;){let v=g.splice(0,g.length);for(let b of v){let k=b,R=typeof k.recordedAt=="number"?String(k.recordedAt):"";R&&y.has(R)||i.raw.write(JSON.stringify(b)+`
227
227
  `)}}return p=!0,u||i.raw.end(),i})}yt();function Hp(t,e,n,s={}){t.get("/v1/agents",async()=>Er(e)),t.get("/v1/registry",async()=>e.load()),t.post("/v1/registry/refresh",async()=>{let r=await e.refresh();return{version:r.version,agentCount:r.agents.length}}),t.post("/v1/agents/:id/install",async(r,i)=>{let o=r.params.id,a=await e.getAgent(o);if(!a){i.code(404).send({error:`agent ${o} not found in registry`});return}if(a.distribution.uvx&&!a.distribution.npx&&!a.distribution.binary){i.send({agentId:a.id,version:a.version??"current",distribution:"uvx",installed:!1,message:"uvx agents resolve on first run; nothing to pre-install."});return}try{let d=await fn(a,[],{npmRegistry:s.npmRegistry}),c=a.distribution.npx?"npx":a.distribution.binary?"binary":"unknown";i.send({agentId:a.id,version:d.version,distribution:c,installed:!0,command:d.command})}catch(d){i.code(500).send({error:d.message})}}),t.post("/v1/agents/:id/sync",async(r,i)=>{let o=r.params.id;try{let{synced:a,skipped:d}=await n.syncFromAgent(o);return{synced:a.map(c=>({sessionId:c.sessionId,upstreamSessionId:c.upstreamSessionId,agentId:c.agentId,cwd:c.cwd,title:c.title,updatedAt:c.updatedAt})),skipped:d}}catch(a){let d=a;if(d.code===D.AgentNotInstalled){i.code(404).send({error:d.message});return}i.code(409).send({error:d.message})}})}function Up(t,e,n){t.get("/v1/health",{config:{skipAuth:!0}},async()=>({status:"ok",version:e,configDigest:n}))}var CI=/^[A-Za-z0-9._-]+$/;function Pa(t,e,n){let s=e==="extension"?"extensions":"transformers",r=`/v1/${s}`;t.get(r,async()=>({[s]:n.list()})),t.get(`${r}/:name`,async(i,o)=>{let a=i.params.name,d=n.get(a);if(!d){o.code(404).send({error:`unknown ${e}: ${a}`});return}return d}),t.post(r,async(i,o)=>{let a=i.body??{},d=RI(a);if("error"in d){o.code(400).send({error:d.error});return}try{let c=n.register(d.config);o.code(201).send(c)}catch(c){Zi(o,c)}}),t.delete(`${r}/:name`,async(i,o)=>{let a=i.params.name;try{await n.unregister(a),o.code(204).send()}catch(d){Zi(o,d)}}),t.post(`${r}/:name/start`,async(i,o)=>{let a=i.params.name;try{let d=await n.startByName(a);o.code(200).send(d)}catch(d){Zi(o,d)}}),t.post(`${r}/:name/stop`,async(i,o)=>{let a=i.params.name;try{let d=await n.stopByName(a);o.code(200).send(d)}catch(d){Zi(o,d)}}),t.post(`${r}/:name/restart`,async(i,o)=>{let a=i.params.name;try{let d=await n.restartByName(a);o.code(200).send(d)}catch(d){Zi(o,d)}})}function Zi(t,e){let n=e.code,s=e.message??"unknown error";if(n==="NOT_FOUND"){t.code(404).send({error:s});return}if(n==="CONFLICT"){t.code(409).send({error:s});return}t.code(500).send({error:s})}function RI(t){let e=t.name;if(typeof e!="string"||!CI.test(e))return{error:"name must match [A-Za-z0-9._-]+"};let n=t.command;if(n!==void 0&&(!Array.isArray(n)||n.some(o=>typeof o!="string")))return{error:"command must be string[]"};let s=t.args;if(s!==void 0&&(!Array.isArray(s)||s.some(o=>typeof o!="string")))return{error:"args must be string[]"};let r=t.env;if(r!==void 0&&(typeof r!="object"||r===null||Array.isArray(r)))return{error:"env must be an object of string\u2192string"};if(r&&Object.values(r).some(o=>typeof o!="string"))return{error:"env values must be strings"};let i=t.enabled;return i!==void 0&&typeof i!="boolean"?{error:"enabled must be a boolean"}:{config:{name:e,command:n??[],args:s??[],env:r??{},enabled:i===void 0?!0:i}}}function jp(t,e){Pa(t,"extension",e)}function qp(t,e){Pa(t,"transformer",e)}function Wp(t,e){t.get("/v1/config",async()=>e)}import{z as jr}from"zod";ge();import*as ls from"fs/promises";import*as Vp from"path";import{randomBytes as TI,scrypt as EI,timingSafeEqual as PI}from"crypto";import{promisify as MI}from"util";var Yp=MI(EI);function Uc(){return Vp.join(M.home(),"password-hash")}var Jp=32768,zp=8,Kp=1,_I=64,$I=16,Gp=128*1024*1024;async function Qp(t){if(typeof t!="string"||t.length===0)throw new Error("password must be a non-empty string");let e=TI($I),n=await Yp(t,e,_I,{N:Jp,r:zp,p:Kp,maxmem:Gp}),s=`scrypt$${Jp}$${zp}$${Kp}$${e.toString("hex")}$${n.toString("hex")}
228
- `;await ls.mkdir(M.home(),{recursive:!0}),await ls.writeFile(Uc(),s,{encoding:"utf8",mode:384})}async function Ma(){try{return(await ls.readFile(Uc(),"utf8")).trim().length>0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function _a(t){if(typeof t!="string"||t.length===0)return!1;let e;try{e=(await ls.readFile(Uc(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let n=e.split("$");if(n.length!==6||n[0]!=="scrypt")return!1;let s=parseInt(n[1],10),r=parseInt(n[2],10),i=parseInt(n[3],10);if(!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i))return!1;let o=Buffer.from(n[4],"hex"),a=Buffer.from(n[5],"hex");if(o.length===0||a.length===0)return!1;let d=await Yp(t,o,a.length,{N:s,r,p:i,maxmem:Gp});return d.length!==a.length?!1:PI(d,a)}var OI=jr.object({password:jr.string().min(1),label:jr.string().min(1).max(256).optional(),ttlSec:jr.number().int().positive().optional()}),FI=jr.object({id:jr.string().optional()}).optional();function Xp(t,e){t.post("/v1/auth/login",{config:{skipAuth:!0}},async(n,s)=>{let r=LI(n);if(e.rateLimiter.isBlocked(r))return s.code(429).send({error:"Too many failed attempts; try again later."});let i;try{i=OI.parse(n.body)}catch{return s.code(400).send({error:"Invalid request body"})}if(!await Ma())return s.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await _a(i.password))return e.rateLimiter.recordFailure(r),s.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(r);let a=await e.store.issue({label:i.label,ttlSec:i.ttlSec});return s.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),t.post("/v1/auth/logout",async(n,s)=>{let r;try{r=FI.parse(n.body??void 0)}catch{return s.code(400).send({error:"Invalid request body"})}let i=r?.id??n.authIdentity;if(!i||i==="service")return s.code(200).send({revoked:!1});let o=await e.store.revoke(i);return s.code(200).send({revoked:o})}),t.get("/v1/auth/verify",async(n,s)=>s.code(200).send({ok:!0})),t.get("/v1/auth/sessions",async(n,s)=>s.code(200).send({sessions:e.store.list()})),t.delete("/v1/auth/sessions/:id",async(n,s)=>{let r=n.params.id;return await e.store.revoke(r)?s.code(204).send():s.code(404).send({error:"Not found"})})}function LI(t){return t.ip||"unknown"}Us();qr();import{nanoid as zc}from"nanoid";ea();yt();_t();import{randomBytes as UI}from"crypto";import*as eh from"os";function we(t,e,n){let s=new Error(e);return s.code=t,n!==void 0&&(s.data=n),s}function jI(t){if(!t||typeof t!="object")return 512;let s=t.params?.update;if(!s)return 512;let r=512,i=s.content;if(typeof i=="string")r+=i.length;else if(i&&typeof i=="object"){let a=i;typeof a.text=="string"&&(r+=a.text.length),typeof a.data=="string"&&(r+=a.data.length)}let o=s.toolCall;if(o&&(typeof o.rawInput=="string"?r+=o.rawInput.length:o.rawInput&&typeof o.rawInput=="object"&&(r+=256),typeof o.rawOutput=="string"?r+=o.rawOutput.length:o.rawOutput&&typeof o.rawOutput=="object"&&(r+=256),Array.isArray(o.content)))for(let a of o.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(r+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(r+=c.text.length)}}return r}function Qt(t,e,n){let s=t.get(e);if(!s)throw we(D.SessionNotFound,n??`session ${e} not found`);return s}async function jc(t,e){let n=Qi(t),s;try{s=await t.manager.resurrect({...e,mcpServers:n?.descriptors})}catch(r){throw n!==void 0&&n.abandon(r instanceof Error?r:void 0),r}return n!==void 0&&n.bindToSession(s),VI(s,t),s}function th(t,e){t.get("/acp",{websocket:!0},async(n,s)=>{let r=kp({headers:s.headers,url:s.url});if(!r||!await e.validator.validate(r)){n.close(4401,"Unauthorized");return}let i=e.processRegistry?.resolve(r),o=wn(n),a=new kt(o),d={clientId:`hydra_client_${zc(12)}`,processIdentity:i,attached:new Map};a.onClose(()=>{for(let f of d.attached.values())e.manager.get(f.sessionId)?.detach(f.clientId);d.attached.clear()});let c=(f,u)=>{if(d.attached.get(f)?.readonly)throw we(D.PermissionDenied,`${u} not permitted on a read-only attachment`)};if(a.onRequest("initialize",async f=>{let u=nf.parse(f??{});u.clientInfo?.name&&(d.clientInfo={name:u.clientInfo.name,...u.clientInfo.version!==void 0?{version:u.clientInfo.version}:{}});let p=u.clientInfo?.version;return p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p)),KI()}),i&&e.extensionCommands){let f=e.extensionCommands;a.onRequest("hydra-acp/commands/register",async u=>{let p=u??{},m=Array.isArray(p.commands)?p.commands.map(g=>{if(!g||typeof g!="object")return;let y=g;if(typeof y.verb!="string")return;let v={verb:y.verb};return typeof y.argsHint=="string"&&(v.argsHint=y.argsHint),typeof y.description=="string"&&(v.description=y.description),v}).filter(g=>g!==void 0):[];return f.register(i.name,a,m),{ok:!0,registered:m.length}}),a.onClose(()=>{f.clear(i.name)})}if(i&&e.extensionMcp){let f=e.extensionMcp;a.onRequest("hydra-acp/mcp_tools/register",async u=>{let p=u??{},m=typeof p.instructions=="string"?p.instructions:void 0,g=Array.isArray(p.tools)?p.tools.map(y=>{if(!y||typeof y!="object")return;let v=y;if(typeof v.name!="string"||v.name.length===0||typeof v.description!="string"||v.inputSchema===null||typeof v.inputSchema!="object")return;let b={name:v.name,description:v.description,inputSchema:v.inputSchema};return v.outputSchema!==null&&typeof v.outputSchema=="object"&&(b.outputSchema=v.outputSchema),b}).filter(y=>y!==void 0):[];if(g.length===0)throw new Error("register_mcp_tools requires at least one tool");return f.register(i.name,a,m,g),{ok:!0,registered:g.length}}),a.onClose(()=>{f.clear(i.name)})}i?.kind==="transformer"&&(a.onRequest("hydra-acp/transformer/initialize",async f=>{let u=f??{},p=Array.isArray(u.intercepts)?u.intercepts.filter(m=>typeof m=="string"):[];if(e.transformers&&(e.transformers.registerConnection(i.name,a,p),e.manager?.defaultTransformers.includes(i.name))){let m=e.transformers.resolveChain([i.name])[0];if(m)for(let g of e.manager.liveSessions())g.addTransformer(m)}return{ack:!0}}),a.onClose(()=>{e.transformers?.deregisterConnection(i.name)}),a.onRequest("hydra-acp/message/emit",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0,m=typeof u.method=="string"?u.method:void 0,g=u.envelope,y=u.route;if(!p||!m)throw we(-32602,"emit_message requires sessionId and method");let v=Qt(e.manager,p),b=typeof u.respondsTo=="string"?u.respondsTo:void 0;if(b)return v.dischargeClaim(b,g),{ok:!0};if(y==="chain")return{ok:!0,response:await v.emitToChain(i.name,m,g)};if(y==="daemon")return{ok:!0,response:await v.emitToChain(i.name,m,g)};throw we(-32602,`unsupported route: ${JSON.stringify(y)}`)}),a.onRequest("hydra-acp/session/request_permission",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(-32602,"hydra-acp/session/request_permission requires sessionId");return Qt(e.manager,p).requestPermissionFromClients(u)}),a.onRequest("hydra-acp/transformer/attach",async f=>JI(f,i.name,e)),a.onRequest("hydra-acp/child_session/spawn",async f=>{let u=f??{},p=typeof u.agentId=="string"?u.agentId:e.defaultAgent,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.parentSessionId=="string"?u.parentSessionId:void 0,y=u._meta&&typeof u._meta=="object"?u._meta:void 0,v=y&&y["hydra-acp"]&&typeof y["hydra-acp"]=="object"?y["hydra-acp"]:void 0,b=v&&typeof v.title=="string"?v.title:void 0,k=v&&typeof v.model=="string"?v.model:void 0;if(!m&&g){let z=e.manager.get(g);z&&(m=z.cwd)}if(!m)throw we(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let R=typeof u.interactive=="boolean"?u.interactive:!1;return{childSessionId:(await e.manager.create({agentId:p,cwd:m,parentSessionId:g,interactive:R,transformChain:[],title:b,model:k})).sessionId}}),a.onRequest("hydra-acp/session/fork",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"fork_session requires sessionId");let p=typeof u.forkAt=="string"?u.forkAt:void 0,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.agentId=="string"?u.agentId:void 0;return await e.manager.forkSession(u.sessionId,{...p!==void 0?{forkAt:p}:{},...m!==void 0?{cwd:m}:{},...g!==void 0?{agentId:g}:{}})}),a.onRequest("hydra-acp/session/delete",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"hydra-acp/session/delete requires sessionId");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=e.manager.get(p);if(m)return await m.close({deleteRecord:!0}),{deleted:!0,sessionId:p};if(!await e.manager.deleteRecord(p))throw we(D.SessionNotFound,`session ${p} not found`);return{deleted:!0,sessionId:p}}),a.onRequest("hydra-acp/child_session/await",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0,m=u.until==="idle"?"idle":"turn_complete",g=typeof u.timeoutMs=="number"?Math.min(u.timeoutMs,18e5):3e5;if(!p)throw we(-32602,"await_child requires childSessionId");let y=Qt(e.manager,p,`child session ${p} not found`);return new Promise(v=>{let R=[],H=[],z=0,K=!1,J,W,F=!1,U=()=>{F||(F=!0,clearTimeout(Y),J?.(),W?.(),v(K?{entries:R,truncated:!0}:{entries:R}))};J=y.onBroadcast(te=>{let Z=jI(te);for(R.push(te),H.push(Z),z+=Z;R.length>0&&(R.length>1e3||z>1048576);)R.shift(),z-=H.shift()??0,K=!0;m==="turn_complete"&&te.params?.update?.sessionUpdate==="turn_complete"&&U()});let Y=setTimeout(U,g);typeof Y.unref=="function"&&Y.unref(),W=y.onClose(()=>U())})}),a.onRequest("hydra-acp/child_session/close",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0;if(!p)throw we(-32602,"close_child_session requires childSessionId");let m=e.manager.get(p);return m&&await m.close({deleteRecord:!1}),{ok:!0}}),a.onRequest("hydra-acp/connection/keep_alive",async f=>{let u=f??{},p=typeof u.token=="string"?u.token:void 0,m=typeof u.sessionId=="string"?u.sessionId:void 0,g=typeof u.estimatedRemainingMs=="number"?u.estimatedRemainingMs:void 0;return p&&m&&e.manager.get(m)?.keepAliveClaim(p,g),{ok:!0}})),a.onRequest("hydra-acp/session/tool_content",async f=>{let u=f??{};if(typeof u.sessionId!="string"||typeof u.hash!="string")throw we(D.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=await e.manager.loadToolBlob(p,u.hash);if(m===null)throw we(D.SessionNotFound,"tool content not found");return{content:m}}),a.onRequest("authenticate",async f=>qI(f,e)),a.onRequest("session/new",async f=>{let u=sf.parse(f),p=Mt(f?._meta),m=Array.isArray(p.transformers)&&p.transformers.every(W=>typeof W=="string")?p.transformers:e.manager.defaultTransformers??[],g=e.transformers?.resolveChain(m)??[],y,v,b=u.mcpServers;if(p.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){y=UI(32).toString("hex"),v=e.mcpTokenRegistry.reserve(y);let F={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${y}`}]};b=[...u.mcpServers??[],F]}let k=Qi(e);k!==void 0&&(b=[...b??[],...k.descriptors]);let R;try{R=await e.manager.create({cwd:u.cwd,agentId:p.agentId??e.defaultAgent,mcpServers:b,title:p.title,agentArgs:p.agentArgs,model:p.model,onInstallProgress:Zp(a),transformChain:g,originatingClient:d.clientInfo,...p.interactive!==void 0?{interactive:p.interactive}:{},...p.env!==void 0?{forwardedEnv:p.env}:{}})}catch(W){throw v!==void 0&&v.abandon(W instanceof Error?W:void 0),k!==void 0&&k.abandon(W instanceof Error?W:void 0),W}if(y!==void 0&&v!==void 0&&e.mcpTokenRegistry!==void 0){let W=y,F=e.mcpTokenRegistry;v.complete(R),R.onClose(()=>{F.unbind(W)})}k!==void 0&&k.bindToSession(R);let H,z;try{H=$a(a,R,d),{entries:z}=await R.attach(H,"full")}catch(W){throw await R.close({deleteRecord:!1}).catch(()=>{}),W}d.attached.set(R.sessionId,{sessionId:R.sessionId,clientId:H.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let W of z){if(a.isClosed())break;await a.notify(W.method,W.params).catch(()=>{})}})()});let K=qc(R),J=Wc(R);return{sessionId:R.sessionId,...K?{modes:K}:{},...J?{models:J}:{},configOptions:R.buildConfigOptions(),_meta:Jc(e.manager,R,{clientId:H.clientId})}}),a.onRequest("session/attach",async f=>{let u=of.parse(f),p=u.clientInfo?.version;p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p));let m=Mt(u._meta),g=m.resume,y=m.readonly===!0,v=m.env;t.log.info(`session/attach sessionId=${u.sessionId} hasResumeHints=${!!g} readonly=${y}`);let b=g?u.sessionId:await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,k=e.manager.get(b);if(!k&&y){let F=await e.manager.loadFromDisk(b);if(!F)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);let U=await e.manager.loadHistory(b),Y=u.clientId??`cli_${zc(8)}`;d.attached.set(F.hydraSessionId,{sessionId:F.hydraSessionId,clientId:Y,readonly:!0}),t.log.info(`session/attach OK (viewer) sessionId=${F.hydraSessionId} clientId=${Y} attachedCount=${d.attached.size} replayed=${U.length}`);for(let te of U)await a.notify(te.method,te.params).catch(()=>{});return{sessionId:F.hydraSessionId,clientId:Y,connectedClients:[Y],historyPolicy:"full",replayed:U.length,_meta:zI(F)}}if(!k){let F=await e.manager.loadFromDisk(b),U=F;if(g&&(U={...F,hydraSessionId:u.sessionId,upstreamSessionId:g.upstreamSessionId,agentId:g.agentId,cwd:g.cwd,...g.title!==void 0?{title:g.title}:{},...g.agentArgs!==void 0?{agentArgs:g.agentArgs}:{}}),!U)throw we(D.SessionNotFound,`session ${u.sessionId} not found and no resume hints provided`);let Y=U.originatingClient?U:{...U,originatingClient:d.clientInfo},te=v!==void 0?{...Y,forwardedEnv:v}:Y;k=await jc(e,{...te,onInstallProgress:Zp(a)})}let R=$a(a,k,d,u.clientInfo,u.clientId),H=m.replayMode==="drip",{entries:z,appliedPolicy:K}=await k.attach(R,u.historyPolicy,{afterMessageId:u.afterMessageId,raw:H,...m.toolContent!==void 0?{toolContent:m.toolContent}:{}});if(d.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:R.clientId,readonly:y}),v!==void 0&&await e.manager.setForwardedEnv(k.sessionId,v).catch(()=>{}),t.log.info(`session/attach OK sessionId=${k.sessionId} clientId=${R.clientId} attachedCount=${d.attached.size} requestedPolicy=${u.historyPolicy} appliedPolicy=${K} replayed=${z.length} readonly=${y}${H?" replayMode=drip":""}`),H){let F=m.dripSpeed&&m.dripSpeed>0?m.dripSpeed:1,U=750;(async()=>{let Y=null;for(let te of z){let Z=typeof te.recordedAt=="number"?te.recordedAt:null;if(Y!==null&&Z!==null){let ee=Math.min(U,Math.max(0,(Z-Y)/F));ee>0&&await new Promise(Q=>setTimeout(Q,ee))}Z!==null&&(Y=Z);try{await a.notify(te.method,te.params)}catch{return}}})()}else for(let F=0;F<z.length&&!a.isClosed();F++){let U=z[F],Y=a.notify(U.method,U.params).catch(()=>{});(F+1)%200===0&&await Y}k.replayPendingPermissions(R);let J=qc(k),W=Wc(k);return{sessionId:k.sessionId,clientId:R.clientId,connectedClients:k.connectedClients(R.clientId),historyPolicy:K,replayed:z.length,...J?{modes:J}:{},...W?{models:W}:{},configOptions:k.buildConfigOptions(),_meta:Jc(e.manager,k)}}),a.onRequest("session/detach",async f=>{let u=af.parse(f),p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"client not attached to that session");let m=e.manager.get(u.sessionId);return m?.detach(p.clientId),d.attached.delete(u.sessionId),m&&e.manager.reapIfOrphanedNonInteractive(u.sessionId),{sessionId:u.sessionId,_meta:{[lt]:{detachStatus:"detached"}}}}),a.onRequest("session/list",async f=>{let u=df.parse(f??{});return{sessions:(await e.manager.list({cwd:u.cwd})).filter(y=>y.originatingClient?.name!==js).map(cf)}}),a.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw we(D.InternalError,"agent registry unavailable");return Er(e.registry)}),a.onRequest("session/prompt",async f=>{let u=lf.parse(f);c(u.sessionId,"session/prompt");let p=d.attached.get(u.sessionId);if(!p)throw t.log.warn(`session/prompt rejected: not attached sessionId=${u.sessionId} attachedKeys=[${[...d.attached.keys()].join(",")}]`),we(D.SessionNotFound,"not attached to session");let m=e.manager.get(u.sessionId);if(!m){let g=await e.manager.loadFromDisk(u.sessionId);if(!g)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);t.log.info(`session/prompt auto-resurrecting cold sessionId=${u.sessionId}`),m=await jc(e,g);let y=$a(a,m,d,void 0,p.clientId);await m.attach(y,"none")}return m.prompt(p.clientId,u)});let l=f=>{let u;try{u=Vo.parse(f)}catch(g){t.log.warn(`session/cancel: invalid params: ${g.message}`);return}let p=d.attached.get(u.sessionId);if(!p)return;if(p.readonly){t.log.warn(`session/cancel dropped (readonly attachment) sessionId=${u.sessionId}`);return}let m=e.manager.get(u.sessionId);m&&m.cancel(p.clientId).catch(g=>{t.log.warn(`session/cancel for ${u.sessionId}: ${g.message}`)})};a.onNotification("session/cancel",l),a.onRequest("session/cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"session/cancel"),l(f),null}),a.onRequest("hydra-acp/prompt/cancel",async f=>{let u=ff.parse(f);return c(u.sessionId,"hydra-acp/prompt/cancel"),Qt(e.manager,u.sessionId).cancelQueuedPrompt(u.messageId)}),a.onRequest("hydra-acp/session/force_cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"hydra-acp/session/force_cancel"),Qt(e.manager,u.sessionId).forceCancel()}),a.onRequest("hydra-acp/prompt/update",async f=>{let u=pf.parse(f);return c(u.sessionId,"hydra-acp/prompt/update"),Qt(e.manager,u.sessionId).updateQueuedPrompt(u.messageId,u.prompt)}),a.onRequest("hydra-acp/prompt/amend",async f=>{let u=hf.parse(f);c(u.sessionId,"hydra-acp/prompt/amend");let p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"not attached to session");return Qt(e.manager,u.sessionId).amendPrompt(p.clientId,u)}),a.onRequest("session/load",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(D.InvalidParams,"session/load requires sessionId");let m=await e.manager.resolveCanonicalId(p)??p,g=e.manager.get(m);if(!g){let R=await e.manager.loadFromDisk(m);if(!R)throw we(D.SessionNotFound,`session ${p} not found in memory or on disk`);g=await jc(e,R)}let y=$a(a,g,d),{entries:v}=await g.attach(y,"pending_only");d.attached.set(g.sessionId,{sessionId:g.sessionId,clientId:y.clientId,readonly:!1});for(let R of v){if(a.isClosed())break;await a.notify(R.method,R.params).catch(()=>{})}g.replayPendingPermissions(y);let b=qc(g),k=Wc(g);return{sessionId:g.sessionId,...b?{modes:b}:{},...k?{models:k}:{},configOptions:g.buildConfigOptions(),_meta:Jc(e.manager,g,{clientId:y.clientId})}}),a.onRequest("session/set_model",async f=>{let u=f?.sessionId;typeof u=="string"&&c(u,"session/set_model");let p=WI(f,e.manager);if(p.kind==="error")throw t.log.warn(p.logMessage),we(p.code,p.message);if(p.kind==="no_op")return t.log.warn(p.logMessage),await a.notify("session/update",{sessionId:p.sessionId,update:{sessionUpdate:"current_model_update",currentModel:p.currentModel}}).catch(()=>{}),null;t.log.info(p.logMessage);let{modelId:m}=p,g=await p.session.forwardRequest("session/set_model",{...f,modelId:m});return p.session.applyModelChange(m),g}),a.onRequest("session/set_mode",async f=>{let u=f,p=u?.sessionId;if(typeof p=="string"&&c(p,"session/set_mode"),!u||typeof u.sessionId!="string")throw we(D.InvalidParams,"session/set_mode requires string sessionId");if(typeof u.modeId!="string")throw we(D.InvalidParams,"session/set_mode requires string modeId");let m=Qt(e.manager,u.sessionId),g=await m.forwardRequest("session/set_mode",f);return m.applyModeChange(u.modeId),g}),a.onRequest("session/set_config_option",async f=>{let u=f,p=v=>we(D.InvalidParams,v),m=u?.sessionId;if(typeof m=="string"&&c(m,"session/set_config_option"),!u||typeof u.sessionId!="string")throw p("session/set_config_option requires string sessionId");if(typeof u.configId!="string")throw p("session/set_config_option requires string configId");if(typeof u.value!="string")throw p("session/set_config_option requires string value");let g=Qt(e.manager,u.sessionId),y=g.buildConfigOptions().find(v=>v.id===u.configId);if(!y)throw p(`unknown configId ${JSON.stringify(u.configId)} for this session`);if(!y.options.some(v=>v.value===u.value))throw p(`value ${JSON.stringify(u.value)} is not valid for configId ${JSON.stringify(u.configId)}`);switch(u.configId){case"model":{u.value!==g.currentModel&&await g.forwardRequest("session/set_model",{sessionId:u.sessionId,modelId:u.value}),g.applyModelChange(u.value);break}case"mode":{u.value!==g.currentMode&&await g.forwardRequest("session/set_mode",{sessionId:u.sessionId,modeId:u.value}),g.applyModeChange(u.value);break}case"agent":{u.value!==g.agentId&&await g.setAgent(u.value);break}default:throw p(`configId ${JSON.stringify(u.configId)} is not settable`)}return{configOptions:g.buildConfigOptions()}}),a.setDefaultHandler(async(f,u)=>{if(!u.startsWith("session/")||f===null||typeof f!="object")throw we(D.MethodNotFound,`Method not found: ${u}`);let p=f.sessionId;if(typeof p!="string")throw we(D.MethodNotFound,`Method not found: ${u}`);return c(p,u),Qt(e.manager,p).forwardRequest(u,f)})})}async function qI(t,e){let n=t??{};if(typeof n.methodId!="string"||n.methodId.length===0)throw we(D.InvalidParams,"authenticate requires a non-empty methodId string");let s=n.methodId,r=n._meta?.["hydra-acp"],i=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,a=i!==void 0?e.manager.getAgentForSession(i):void 0;if(!a||!a.isAlive()){let u=o??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(u)}let d=a.authMethods??[],c=d.find(u=>u.id===s);if(!c){let u=d.map(p=>p.id);throw we(D.InvalidParams,`authenticate: methodId ${JSON.stringify(s)} is not advertised by agent ${a.agentId}; valid: [${u.map(p=>JSON.stringify(p)).join(", ")}]`)}let l=c._meta?.type;if((c.type??(l==="agent"||l==="terminal"?l:"agent"))==="terminal"){let u=c._meta?.args,p=[];if(u!==void 0){if(!Array.isArray(u))throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be a string[]; got ${u===null?"null":typeof u}`);for(let v of u)if(typeof v!="string")throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be string[]; got non-string entry ${JSON.stringify(v)}`);p=u}let m=await e.manager.planSpawnForAgent(a.agentId),g={};for(let[v,b]of Object.entries(process.env))typeof b=="string"&&(g[v]=b);Object.assign(g,m.env);let y=eh.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${s}`),{kind:"terminal",command:m.command,args:[...m.args,...p],env:g,cwd:y}}try{return await a.connection.request("authenticate",{methodId:s})}catch(u){throw Js(u,a)}}function Zp(t){return e=>{let n={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(n.receivedBytes=e.receivedBytes),"totalBytes"in e&&(n.totalBytes=e.totalBytes),"packageSpec"in e&&(n.packageSpec=e.packageSpec),t.notify(Yo,n).catch(()=>{})}}function qc(t){let e=t.availableModes();if(e.length===0)return;let n=e.map(r=>{let i={id:r.id,name:r.name??r.id};return r.description!==void 0&&(i.description=r.description),i});return{currentModeId:t.currentMode??e[0].id,availableModes:n}}function Wc(t){let e=t.availableModels();if(e.length===0)return;let n=e.map(r=>{let i={modelId:r.modelId};return r.name!==void 0&&(i.name=r.name),r.description!==void 0&&(i.description=r.description),i});return{currentModelId:t.currentModel??e[0].modelId,availableModels:n}}function WI(t,e){if(!t||typeof t!="object")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let n=t;if(typeof n.sessionId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof n.modelId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${n.sessionId}`};let s=e.get(n.sessionId);if(!s)return{kind:"error",code:D.SessionNotFound,message:`session ${n.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${n.sessionId}`};let r=s.availableModels(),i=Mr(n.modelId,r);if(i.kind==="none")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="exact")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model accepted sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="resolved")return{kind:"ok",session:s,modelId:i.modelId,logMessage:`session/set_model resolved sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} \u2192 ${JSON.stringify(i.modelId)}`};let o=r.map(d=>d.modelId).join(", "),a=i.kind==="ambiguous"?`ambiguous (trailing-segment matches [${i.candidates.join(", ")}])`:"not in availableModels";return s.currentModel!==void 0&&s.currentModel.length>0?{kind:"no_op",session:s,sessionId:n.sessionId,currentModel:s.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} ${a} actual=${JSON.stringify(s.currentModel)} agentId=${s.agentId} known=[${o}]`}:{kind:"error",code:D.InvalidParams,message:`model "${n.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${s.agentId}); known models: ${o}`,logMessage:`session/set_model rejected sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)} ${a} agentId=${s.agentId} known=[${o}] (no current model to fall back to)`}}async function JI(t,e,n){let s=t??{},r=typeof s.sessionId=="string"?s.sessionId:void 0;if(!r)throw we(D.InvalidParams,"transformer/attach requires sessionId");if(!n.transformers)throw we(D.InternalError,"transformer manager not configured");let i=n.transformers.resolveChain([e])[0];if(!i)throw we(D.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return Qt(n.manager,r).addTransformer(i),{ok:!0}}function zI(t){let e={sessionId:t.hydraSessionId,upstreamSessionId:t.upstreamSessionId,cwd:t.cwd,title:t.title,agentId:t.agentId,currentModel:t.currentModel,currentUsage:t.currentUsage,forkedFromSessionId:t.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId,originatingClient:t.originatingClient,interactive:t.interactive,updatedAt:t.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,awaitingInput:!1},n={currentMode:t.currentMode,agentArgs:t.agentArgs,availableCommands:t.agentCommands,availableModes:t.agentModes,availableModels:t.agentModels};return{[lt]:zo(e,n)}}function Jc(t,e,n={}){let s=t.liveListEntry(e),r={clientId:n.clientId,currentMode:e.currentMode,agentArgs:e.agentArgs,availableCommands:e.mergedAvailableCommands(),availableModes:e.availableModes(),availableModels:e.availableModels(),turnStartedAt:e.turnStartedAt,agentCapabilities:e.agentCapabilities,queue:e.queueSnapshot()};return _i(e.agentMeta,zo(s,r))}function KI(){return{protocolVersion:1,agentInfo:{name:"hydra",version:fe},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,sessionCapabilities:{attach:{},list:{}}},authMethods:[{id:"proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:_i(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0}})}}function VI(t,e){if(!(!e.transformers||!e.manager))for(let n of e.manager.defaultTransformers){let s=e.transformers.resolveChain([n])[0];s&&t.addTransformer(s)}}function $a(t,e,n,s,r){return{clientId:r??`cli_${zc(8)}`,connection:t,clientInfo:s}}var Oa=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let n,s,r=new Promise((o,a)=>{n=o,s=a});r.catch(()=>{});let i={session:void 0,sessionReady:r,disposers:[]};return this.byToken.set(e,i),{complete:o=>{i.session=o,n(o)},abandon:o=>{this.byToken.delete(e),s(o??new Error("mcp token reservation abandoned"))}}}bind(e,n){let{complete:s}=this.reserve(e);s(n)}lookup(e){return this.byToken.get(e)}addDisposer(e,n){let s=this.byToken.get(e);s!==void 0&&s.disposers.push(n)}async unbind(e){let n=this.byToken.get(e);if(n!==void 0){this.byToken.delete(e);for(let s of n.disposers)try{await s()}catch{}}}size(){return this.byToken.size}};import{randomUUID as YI}from"crypto";import{McpServer as GI}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as QI}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as ut}from"zod";var nh="Bearer ";function Fa(t){let e=t.headers.authorization;if(typeof e!="string"||!e.startsWith(nh))return;let n=e.slice(nh.length).trim();return n.length>0?n:void 0}function XI(t){let e=new GI({name:"hydra-acp-stdin",version:"1.0.0"},{instructions:"Piped input from `hydra cat --stream` is exposed here as a byte stream. Use `tail` for the latest N bytes (good for finding the end of a log), `head` for the first N bytes (good for headers/preamble), `read` for windowed reads against an absolute byte cursor, `wait_for_more` to block until new bytes arrive past a cursor, and `info` for the current cursors/capacity/closed status. Byte payloads come back base64-encoded."});return e.registerTool("tail",{description:"Return the most recent `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means older bytes existed but have been evicted from the ring.",inputSchema:{bytes:ut.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:n})=>{let s=t.streamTail(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("head",{description:"Return the first `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means the head has already been evicted from the ring and the returned bytes start at the oldest still-resident cursor.",inputSchema:{bytes:ut.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:n})=>{let s=t.streamHead(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("read",{description:"Read up to `max_bytes` bytes starting at absolute byte `cursor`. Returns `{bytes, nextCursor, gap?, eof?}` \u2014 `gap` is the number of bytes silently skipped because the ring had evicted them; `eof:true` means the producer closed and there is nothing left to read.",inputSchema:{cursor:ut.number().int().min(0).describe("Absolute byte offset to start reading from. Use 0 to read from the very beginning (may produce a gap if old bytes have been evicted)."),max_bytes:ut.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:ut.number().int().min(0).optional().describe("If no bytes are available, block up to this many ms for more (capped server-side at 60_000).")}},async({cursor:n,max_bytes:s,wait_ms:r})=>{let i=await t.streamRead(n,s,r);return{content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i}}),e.registerTool("wait_for_more",{description:"Block until bytes are available past `cursor`, the stream closes, or `timeout_ms` elapses. Returns one of {data, eof, timeout} plus the current `writeCursor`. Use this when you've consumed everything up to a cursor and want to wait for more without busy-polling.",inputSchema:{cursor:ut.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:ut.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:n,timeout_ms:s})=>{let r=await t.streamWaitFor(n,s),i=t.streamInfo(),o={outcome:r,writeCursor:i.writeCursor,closed:i.closed};return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o}}),e.registerTool("grep",{description:"Scan piped stdin line-by-line and return lines matching `pattern`. Prefer this over `read` when the question is 'find lines that mention X' \u2014 it filters server-side so you don't pull and decode 64 KiB base64 windows. Returns `{matches: [{cursor, line, before?, after?}], truncated, nextCursor, gap?, scannedBytes, eof?}`. Lines come back as decoded UTF-8 strings (not base64). When `truncated:true`, re-call with `cursor: nextCursor` to resume.",inputSchema:{pattern:ut.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:ut.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:ut.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:ut.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:ut.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:ut.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:ut.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:ut.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:ut.number().int().min(0).optional().describe("Optional absolute byte offset to start scanning from. Omit to scan from the oldest still-resident byte. Pass the `nextCursor` from a previous truncated call to resume.")}},async n=>{let s={pattern:n.pattern};n.regex!==void 0&&(s.regex=n.regex),n.case_insensitive!==void 0&&(s.caseInsensitive=n.case_insensitive),n.invert!==void 0&&(s.invert=n.invert),n.max_matches!==void 0&&(s.maxMatches=n.max_matches),n.max_bytes!==void 0&&(s.maxBytes=n.max_bytes),n.context_before!==void 0&&(s.contextBefore=n.context_before),n.context_after!==void 0&&(s.contextAfter=n.context_after),n.cursor!==void 0&&(s.cursor=n.cursor);let r=t.streamGrep(s),i=r;return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:i}}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let n=t.streamInfo();return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}),e}var ZI=1e4;function sh(t,e){let n=new Map;async function s(o,a){let d=n.get(o);if(d!==void 0)return d.transport;let c=XI(a),l=new QI({sessionIdGenerator:()=>YI()});await c.connect(l);let f={server:c,transport:l};return n.set(o,f),e.addDisposer(o,async()=>{n.delete(o);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function r(o,a){let d=Fa(o);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown stdin token"});return}let l;if(c.session!==void 0)l=c.session;else{let u,p=new Promise(g=>{u=setTimeout(()=>g(void 0),ZI)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(u!==void 0&&clearTimeout(u),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let f=await s(d,l);a.hijack(),await f.handleRequest(o.raw,a.raw,o.body)}let i={config:{skipAuth:!0}};t.post("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.get("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.delete("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)})}var La=class{byName=new Map;changeHandlers=[];register(e,n,s,r){this.byName.set(e,{connection:n,instructions:s,tools:[...r]}),this.fireChanged(e,"register")}clear(e){this.byName.delete(e)&&this.fireChanged(e,"clear")}lookup(e){return this.byName.get(e)}list(){return Array.from(this.byName.keys())}onChange(e){return this.changeHandlers.push(e),()=>{let n=this.changeHandlers.indexOf(e);n>=0&&this.changeHandlers.splice(n,1)}}fireChanged(e,n){for(let s of this.changeHandlers)try{s(e,n)}catch{}}};import{StreamableHTTPServerTransport as oS}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as aS}from"crypto";import{Server as eS}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as tS,ListToolsRequestSchema as nS}from"@modelcontextprotocol/sdk/types.js";var sS=6e4;function rh(t,e,n,s={}){let r=s.invokeTimeoutMs??sS,i=typeof n=="function"?async()=>n():async()=>n,o=new eS({name:t,version:"1.0.0"},{capabilities:{tools:{listChanged:!1}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),a=new Map(e.tools.map(d=>[d.name,d]));return o.setRequestHandler(nS,async()=>({tools:e.tools.map(d=>({name:d.name,description:d.description,inputSchema:d.inputSchema,...d.outputSchema!==void 0?{outputSchema:d.outputSchema}:{}}))})),o.setRequestHandler(tS,async d=>{let c=d.params.name;if(!a.has(c))return Ba(`unknown tool: ${c}`);try{let l=await i(),f=await rS(e.connection,t,c,d.params.arguments??{},l,r);return iS(f,c)}catch(l){return Ba(l instanceof Error?l.message:String(l))}}),o}async function rS(t,e,n,s,r,i){let o,a=new Promise((d,c)=>{o=setTimeout(()=>c(new Error(`extension timeout after ${i}ms`)),i)});try{return await Promise.race([t.request("hydra-acp/mcp_tools/invoke",{server:e,tool:n,args:s,sessionId:r}),a])}finally{o!==void 0&&clearTimeout(o)}}function iS(t,e){if(t===null||typeof t!="object")return Ba(`extension ${e} returned non-object`);let n=t;return Array.isArray(n.content)?n:Ba(`extension ${e} omitted content array`)}function Ba(t){return{content:[{type:"text",text:t}],isError:!0}}var dS=1e4;function ih(t,e,n,s={}){let r=new Map;async function i(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let f of r.values()){let u=f.get(l);u!==void 0&&(f.delete(l),i(u))}}n.onChange(l=>{o(l)});async function a(l,f){let u=r.get(l);u===void 0&&(u=new Map,r.set(l,u),e.addDisposer(l,async()=>{let b=r.get(l);if(b!==void 0){r.delete(l);for(let k of b.values())await i(k)}}));let p=u.get(f);if(p!==void 0)return p.transport;let m=n.lookup(f);if(m===void 0)return;let y=rh(f,m,async()=>{let b=e.lookup(l);if(b===void 0)throw new Error("mcp token no longer bound");if(b.session!==void 0)return b.session.sessionId;let k,R=new Promise(z=>{k=setTimeout(()=>z(void 0),dS)}),H=await Promise.race([b.sessionReady.catch(()=>{}),R]);if(k!==void 0&&clearTimeout(k),H===void 0)throw new Error("session not ready");return H.sessionId},s.buildOptions),v=new oS({sessionIdGenerator:()=>aS()});return await y.connect(v),u.set(f,{server:y,transport:v}),v}async function d(l,f){let u=Fa(l);if(u===void 0){f.code(401).send({error:"missing bearer token"});return}if(e.lookup(u)===void 0){f.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,g=await a(u,m);if(g===void 0){f.code(404).send({error:`unknown mcp server: ${m}`});return}f.hijack(),await g.handleRequest(l.raw,f.raw,l.body)}let c={config:{skipAuth:!0}};t.post("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.get("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.delete("/mcp/:name",c,async(l,f)=>{await d(l,f)})}async function dh(t,e){pS(t);let n=t.daemon.tls?{key:await us.readFile(t.daemon.tls.key),cert:await us.readFile(t.daemon.tls.cert)}:void 0;await us.mkdir(M.home(),{recursive:!0});let{stream:s,fileStream:r}=await fS(t.daemon.logLevel),i=cS({logger:{level:t.daemon.logLevel,stream:s},https:n??null,bodyLimit:256*1024*1024});await i.register(lS,{options:{handleProtocols:Bu}}),Zd(j=>{i.log.info(j)}),nc(j=>{i.log.info(j)});let o=await ba.load(),a=new xa,d=new ka,c=new Sa([new va(e),new Ia(o),d]),l=Sp({validator:c});i.addHook("onRequest",async(j,ue)=>{j.routeOptions.config?.skipAuth||j.url==="/acp"||j.url?.startsWith("/acp?")||await l(j,ue)});let f=setInterval(()=>{o.sweepExpired()},300*1e3);f.unref();let u=setInterval(()=>{a.sweepExpired()},300*1e3);u.unref();let p=new qo(t,{onFetched:()=>{pp(p,v)}});Lc(j=>i.log.info(j));let m={info:j=>i.log.info(j),warn:j=>i.log.warn(j)},g=j=>os.spawn({...j,stderrTailBytes:t.daemon.agentStderrTailBytes,logger:m});Uu(t.compressToolContent);let y=new ya,v=new ua(p,g,void 0,{idleTimeoutMs:t.daemon.sessionIdleTimeoutSeconds*1e3,defaultModels:t.defaultModels,synopsisAgent:t.synopsisAgent,synopsisModel:t.synopsisModel,synopsisOnClose:t.synopsisOnClose,defaultTransformers:t.defaultTransformers,sessionHistoryMaxEntries:t.daemon.sessionHistoryMaxEntries,logger:m,npmRegistry:t.npmRegistry,extensionCommands:y,defaultCwd:t.defaultCwd}),b=new ma(bu(t),void 0,{tokenRegistry:d}),k=new ga(vu(t),void 0,{tokenRegistry:d});Up(i,fe,ds(t));let R=new Oa,H=new La,z,K=()=>{if(z!==void 0)return z;let j=i.server.address(),ue=j&&typeof j=="object"?j.port:t.daemon.port;return z=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${ue}`,z};Dp(i,v,{agentId:t.defaultAgent,cwd:t.defaultCwd,publicHost:t.daemon.publicHost,host:t.daemon.host,port:t.daemon.port},{extensionMcp:H,mcpTokenRegistry:R,getDaemonOrigin:K}),Hp(i,p,v,{npmRegistry:t.npmRegistry}),jp(i,b),qp(i,k),Wp(i,{defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,defaultModels:{...t.defaultModels},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},synopsisOnClose:t.synopsisOnClose,defaultTransformers:[...t.defaultTransformers]}),Xp(i,{store:o,rateLimiter:a}),sh(i,R),ih(i,R,H),th(i,{validator:c,manager:v,defaultAgent:t.defaultAgent,processRegistry:d,onExtensionVersion:(j,ue)=>b.reportVersion(j,ue),onTransformerVersion:(j,ue)=>k.reportVersion(j,ue),transformers:k,extensionCommands:y,mcpTokenRegistry:R,extensionMcp:H,getDaemonOrigin:K,registry:p}),await i.listen({host:t.daemon.host,port:t.daemon.port});let J=i.server.address(),W=J&&typeof J=="object"?J.port:t.daemon.port;await us.mkdir(M.home(),{recursive:!0}),await us.writeFile(M.pidFile(),JSON.stringify({pid:process.pid,host:t.daemon.host,port:W,startedAt:new Date().toISOString()})+`
229
- `,{encoding:"utf8",mode:384});let F=t.daemon.tls?"https":"http",U=t.daemon.tls?"wss":"ws",Y={daemonUrl:`${F}://${t.daemon.host}:${W}`,daemonHost:t.daemon.host,daemonPort:W,serviceToken:e,daemonWsUrl:`${U}://${t.daemon.host}:${W}/acp`,hydraHome:M.home()};b.setContext(Y),k.setContext(Y),await b.start(),await k.start(),v.resurrectPendingQueues().catch(j=>{i.log.warn(`queue replay scan failed: ${j.message}`)});let te=t.daemon.agentSyncIntervalMinutes*60*1e3,Z=te>0?hp({registry:p,manager:v,intervalMs:te,logger:m}):void 0,ee=t.daemon.sessionGcIntervalMinutes*60*1e3,Q=t.daemon.sessionGcMaxAgeDays*24*60*60*1e3,oe=ee>0?mp({manager:v,intervalMs:ee,maxAgeMs:Q,logger:m}):void 0;return{app:i,manager:v,registry:p,extensions:b,transformers:k,mcpTokenRegistry:R,extensionMcp:H,processRegistry:d,shutdown:async()=>{oe&&oe(),Z&&Z(),clearInterval(f),clearInterval(u);let j=async(ue,_e)=>{try{await _e()}catch($e){i.log.warn(`shutdown step ${ue} failed: ${$e instanceof Error?$e.message:String($e)}`)}};await j("sessionTokenStore.flush",()=>o.flush()),await j("extensions.stop",()=>b.stop()),await j("transformers.stop",()=>k.stop()),await j("manager.closeAll",()=>v.closeAll()),await j("manager.flushSynopsis",()=>v.flushSynopsis(3e4)),await j("manager.shutdownSynopsis",()=>v.shutdownSynopsis()),await j("manager.flushMetaWrites",()=>v.flushMetaWrites()),await j("manager.flushHistoryWrites",()=>v.flushHistoryWrites()),Zd(null),nc(null),Lc(null),await j("app.close",()=>i.close());try{ah.unlinkSync(M.pidFile())}catch{}await j("fileStream.flushSync",()=>r.flushSync())}}}async function fS(t){let e=await uS({file:M.logFile(),size:"10m",frequency:"daily",mkdir:!0,symlink:!0}),n=oh.destination(2);return{stream:oh.multistream([{stream:e,level:t},{stream:n,level:t}]),fileStream:e}}function pS(t){let e=t.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!t.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}Ys();_t();Vi();import*as ch from"fs";import*as Wr from"fs/promises";async function Jr(t,e,n){let s=wS(e),r;try{r=await Wr.stat(t)}catch(d){if(d.code==="ENOENT"){process.stderr.write(`${n} (${t})
228
+ `;await ls.mkdir(M.home(),{recursive:!0}),await ls.writeFile(Uc(),s,{encoding:"utf8",mode:384})}async function Ma(){try{return(await ls.readFile(Uc(),"utf8")).trim().length>0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function _a(t){if(typeof t!="string"||t.length===0)return!1;let e;try{e=(await ls.readFile(Uc(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let n=e.split("$");if(n.length!==6||n[0]!=="scrypt")return!1;let s=parseInt(n[1],10),r=parseInt(n[2],10),i=parseInt(n[3],10);if(!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i))return!1;let o=Buffer.from(n[4],"hex"),a=Buffer.from(n[5],"hex");if(o.length===0||a.length===0)return!1;let d=await Yp(t,o,a.length,{N:s,r,p:i,maxmem:Gp});return d.length!==a.length?!1:PI(d,a)}var OI=jr.object({password:jr.string().min(1),label:jr.string().min(1).max(256).optional(),ttlSec:jr.number().int().positive().optional()}),FI=jr.object({id:jr.string().optional()}).optional();function Xp(t,e){t.post("/v1/auth/login",{config:{skipAuth:!0}},async(n,s)=>{let r=LI(n);if(e.rateLimiter.isBlocked(r))return s.code(429).send({error:"Too many failed attempts; try again later."});let i;try{i=OI.parse(n.body)}catch{return s.code(400).send({error:"Invalid request body"})}if(!await Ma())return s.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await _a(i.password))return e.rateLimiter.recordFailure(r),s.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(r);let a=await e.store.issue({label:i.label,ttlSec:i.ttlSec});return s.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),t.post("/v1/auth/logout",async(n,s)=>{let r;try{r=FI.parse(n.body??void 0)}catch{return s.code(400).send({error:"Invalid request body"})}let i=r?.id??n.authIdentity;if(!i||i==="service")return s.code(200).send({revoked:!1});let o=await e.store.revoke(i);return s.code(200).send({revoked:o})}),t.get("/v1/auth/verify",async(n,s)=>s.code(200).send({ok:!0})),t.get("/v1/auth/sessions",async(n,s)=>s.code(200).send({sessions:e.store.list()})),t.delete("/v1/auth/sessions/:id",async(n,s)=>{let r=n.params.id;return await e.store.revoke(r)?s.code(204).send():s.code(404).send({error:"Not found"})})}function LI(t){return t.ip||"unknown"}Us();qr();import{nanoid as zc}from"nanoid";ea();yt();_t();import{randomBytes as UI}from"crypto";import*as eh from"os";function we(t,e,n){let s=new Error(e);return s.code=t,n!==void 0&&(s.data=n),s}function jI(t){if(!t||typeof t!="object")return 512;let s=t.params?.update;if(!s)return 512;let r=512,i=s.content;if(typeof i=="string")r+=i.length;else if(i&&typeof i=="object"){let a=i;typeof a.text=="string"&&(r+=a.text.length),typeof a.data=="string"&&(r+=a.data.length)}let o=s.toolCall;if(o&&(typeof o.rawInput=="string"?r+=o.rawInput.length:o.rawInput&&typeof o.rawInput=="object"&&(r+=256),typeof o.rawOutput=="string"?r+=o.rawOutput.length:o.rawOutput&&typeof o.rawOutput=="object"&&(r+=256),Array.isArray(o.content)))for(let a of o.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(r+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(r+=c.text.length)}}return r}function Qt(t,e,n){let s=t.get(e);if(!s)throw we(D.SessionNotFound,n??`session ${e} not found`);return s}async function jc(t,e){let n=Qi(t),s;try{s=await t.manager.resurrect({...e,mcpServers:n?.descriptors})}catch(r){throw n!==void 0&&n.abandon(r instanceof Error?r:void 0),r}return n!==void 0&&n.bindToSession(s),VI(s,t),s}function th(t,e){t.get("/acp",{websocket:!0},async(n,s)=>{let r=kp({headers:s.headers,url:s.url});if(!r||!await e.validator.validate(r)){n.close(4401,"Unauthorized");return}let i=e.processRegistry?.resolve(r),o=wn(n),a=new kt(o),d={clientId:`hydra_client_${zc(12)}`,processIdentity:i,attached:new Map};a.onClose(()=>{for(let f of d.attached.values())e.manager.get(f.sessionId)?.detach(f.clientId);d.attached.clear()});let c=(f,u)=>{if(d.attached.get(f)?.readonly)throw we(D.PermissionDenied,`${u} not permitted on a read-only attachment`)};if(a.onRequest("initialize",async f=>{let u=nf.parse(f??{});u.clientInfo?.name&&(d.clientInfo={name:u.clientInfo.name,...u.clientInfo.version!==void 0?{version:u.clientInfo.version}:{}});let p=u.clientInfo?.version;return p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p)),KI()}),i&&e.extensionCommands){let f=e.extensionCommands;a.onRequest("hydra-acp/commands/register",async u=>{let p=u??{},m=Array.isArray(p.commands)?p.commands.map(g=>{if(!g||typeof g!="object")return;let y=g;if(typeof y.verb!="string")return;let v={verb:y.verb};return typeof y.argsHint=="string"&&(v.argsHint=y.argsHint),typeof y.description=="string"&&(v.description=y.description),v}).filter(g=>g!==void 0):[];return f.register(i.name,a,m),{ok:!0,registered:m.length}}),a.onClose(()=>{f.clear(i.name)})}if(i&&e.extensionMcp){let f=e.extensionMcp;a.onRequest("hydra-acp/mcp_tools/register",async u=>{let p=u??{},m=typeof p.instructions=="string"?p.instructions:void 0,g=Array.isArray(p.tools)?p.tools.map(y=>{if(!y||typeof y!="object")return;let v=y;if(typeof v.name!="string"||v.name.length===0||typeof v.description!="string"||v.inputSchema===null||typeof v.inputSchema!="object")return;let b={name:v.name,description:v.description,inputSchema:v.inputSchema};return v.outputSchema!==null&&typeof v.outputSchema=="object"&&(b.outputSchema=v.outputSchema),b}).filter(y=>y!==void 0):[];if(g.length===0)throw new Error("register_mcp_tools requires at least one tool");return f.register(i.name,a,m,g),{ok:!0,registered:g.length}}),a.onClose(()=>{f.clear(i.name)})}i?.kind==="transformer"&&(a.onRequest("hydra-acp/transformer/initialize",async f=>{let u=f??{},p=Array.isArray(u.intercepts)?u.intercepts.filter(m=>typeof m=="string"):[];if(e.transformers&&(e.transformers.registerConnection(i.name,a,p),e.manager?.defaultTransformers.includes(i.name))){let m=e.transformers.resolveChain([i.name])[0];if(m)for(let g of e.manager.liveSessions())g.addTransformer(m)}return{ack:!0}}),a.onClose(()=>{e.transformers?.deregisterConnection(i.name)}),a.onRequest("hydra-acp/message/emit",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0,m=typeof u.method=="string"?u.method:void 0,g=u.envelope,y=u.route;if(!p||!m)throw we(-32602,"emit_message requires sessionId and method");let v=Qt(e.manager,p),b=typeof u.respondsTo=="string"?u.respondsTo:void 0;if(b)return v.dischargeClaim(b,g),{ok:!0};if(y==="chain")return{ok:!0,response:await v.emitToChain(i.name,m,g)};if(y==="daemon")return{ok:!0,response:await v.emitToChain(i.name,m,g)};throw we(-32602,`unsupported route: ${JSON.stringify(y)}`)}),a.onRequest("hydra-acp/session/request_permission",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(-32602,"hydra-acp/session/request_permission requires sessionId");return Qt(e.manager,p).requestPermissionFromClients(u)}),a.onRequest("hydra-acp/transformer/attach",async f=>JI(f,i.name,e)),a.onRequest("hydra-acp/child_session/spawn",async f=>{let u=f??{},p=typeof u.agentId=="string"?u.agentId:e.defaultAgent,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.parentSessionId=="string"?u.parentSessionId:void 0,y=u._meta&&typeof u._meta=="object"?u._meta:void 0,v=y&&y["hydra-acp"]&&typeof y["hydra-acp"]=="object"?y["hydra-acp"]:void 0,b=v&&typeof v.title=="string"?v.title:void 0,k=v&&typeof v.model=="string"?v.model:void 0;if(!m&&g){let q=e.manager.get(g);q&&(m=q.cwd)}if(!m)throw we(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let R=typeof u.interactive=="boolean"?u.interactive:!1;return{childSessionId:(await e.manager.create({agentId:p,cwd:m,parentSessionId:g,interactive:R,transformChain:[],title:b,model:k})).sessionId}}),a.onRequest("hydra-acp/session/fork",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"fork_session requires sessionId");let p=typeof u.forkAt=="string"?u.forkAt:void 0,m=typeof u.cwd=="string"?u.cwd:void 0,g=typeof u.agentId=="string"?u.agentId:void 0;return await e.manager.forkSession(u.sessionId,{...p!==void 0?{forkAt:p}:{},...m!==void 0?{cwd:m}:{},...g!==void 0?{agentId:g}:{}})}),a.onRequest("hydra-acp/session/delete",async f=>{let u=f??{};if(typeof u.sessionId!="string")throw we(D.InvalidParams,"hydra-acp/session/delete requires sessionId");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=e.manager.get(p);if(m)return await m.close({deleteRecord:!0}),{deleted:!0,sessionId:p};if(!await e.manager.deleteRecord(p))throw we(D.SessionNotFound,`session ${p} not found`);return{deleted:!0,sessionId:p}}),a.onRequest("hydra-acp/child_session/await",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0,m=u.until==="idle"?"idle":"turn_complete",g=typeof u.timeoutMs=="number"?Math.min(u.timeoutMs,18e5):3e5;if(!p)throw we(-32602,"await_child requires childSessionId");let y=Qt(e.manager,p,`child session ${p} not found`);return new Promise(v=>{let R=[],H=[],q=0,K=!1,z,W,O=!1,U=()=>{O||(O=!0,clearTimeout(V),z?.(),W?.(),v(K?{entries:R,truncated:!0}:{entries:R}))};z=y.onBroadcast(se=>{let Z=jI(se);for(R.push(se),H.push(Z),q+=Z;R.length>0&&(R.length>1e3||q>1048576);)R.shift(),q-=H.shift()??0,K=!0;m==="turn_complete"&&se.params?.update?.sessionUpdate==="turn_complete"&&U()});let V=setTimeout(U,g);typeof V.unref=="function"&&V.unref(),W=y.onClose(()=>U())})}),a.onRequest("hydra-acp/child_session/close",async f=>{let u=f??{},p=typeof u.childSessionId=="string"?u.childSessionId:void 0;if(!p)throw we(-32602,"close_child_session requires childSessionId");let m=e.manager.get(p);return m&&await m.close({deleteRecord:!1}),{ok:!0}}),a.onRequest("hydra-acp/connection/keep_alive",async f=>{let u=f??{},p=typeof u.token=="string"?u.token:void 0,m=typeof u.sessionId=="string"?u.sessionId:void 0,g=typeof u.estimatedRemainingMs=="number"?u.estimatedRemainingMs:void 0;return p&&m&&e.manager.get(m)?.keepAliveClaim(p,g),{ok:!0}})),a.onRequest("hydra-acp/session/tool_content",async f=>{let u=f??{};if(typeof u.sessionId!="string"||typeof u.hash!="string")throw we(D.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let p=await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,m=await e.manager.loadToolBlob(p,u.hash);if(m===null)throw we(D.SessionNotFound,"tool content not found");return{content:m}}),a.onRequest("authenticate",async f=>qI(f,e)),a.onRequest("session/new",async f=>{let u=sf.parse(f),p=Mt(f?._meta),m=Array.isArray(p.transformers)&&p.transformers.every(W=>typeof W=="string")?p.transformers:e.manager.defaultTransformers??[],g=e.transformers?.resolveChain(m)??[],y,v,b=u.mcpServers;if(p.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){y=UI(32).toString("hex"),v=e.mcpTokenRegistry.reserve(y);let O={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${y}`}]};b=[...u.mcpServers??[],O]}let k=Qi(e);k!==void 0&&(b=[...b??[],...k.descriptors]);let R;try{R=await e.manager.create({cwd:u.cwd,agentId:p.agentId??e.defaultAgent,mcpServers:b,title:p.title,agentArgs:p.agentArgs,model:p.model,onInstallProgress:Zp(a),transformChain:g,originatingClient:d.clientInfo,...p.interactive!==void 0?{interactive:p.interactive}:{},...p.env!==void 0?{forwardedEnv:p.env}:{}})}catch(W){throw v!==void 0&&v.abandon(W instanceof Error?W:void 0),k!==void 0&&k.abandon(W instanceof Error?W:void 0),W}if(y!==void 0&&v!==void 0&&e.mcpTokenRegistry!==void 0){let W=y,O=e.mcpTokenRegistry;v.complete(R),R.onClose(()=>{O.unbind(W)})}k!==void 0&&k.bindToSession(R);let H,q;try{H=$a(a,R,d),{entries:q}=await R.attach(H,"full")}catch(W){throw await R.close({deleteRecord:!1}).catch(()=>{}),W}d.attached.set(R.sessionId,{sessionId:R.sessionId,clientId:H.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let W of q){if(a.isClosed())break;await a.notify(W.method,W.params).catch(()=>{})}})()});let K=qc(R),z=Wc(R);return{sessionId:R.sessionId,...K?{modes:K}:{},...z?{models:z}:{},configOptions:R.buildConfigOptions(),_meta:Jc(e.manager,R,{clientId:H.clientId})}}),a.onRequest("session/attach",async f=>{let u=of.parse(f),p=u.clientInfo?.version;p&&i&&(i.kind==="extension"?e.onExtensionVersion?.(i.name,p):e.onTransformerVersion?.(i.name,p));let m=Mt(u._meta),g=m.resume,y=m.readonly===!0,v=m.env;t.log.info(`session/attach sessionId=${u.sessionId} hasResumeHints=${!!g} readonly=${y}`);let b=g?u.sessionId:await e.manager.resolveCanonicalId(u.sessionId)??u.sessionId,k=e.manager.get(b);if(!k&&y){let O=await e.manager.loadFromDisk(b);if(!O)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);let U=await e.manager.loadHistory(b),V=u.clientId??`cli_${zc(8)}`;d.attached.set(O.hydraSessionId,{sessionId:O.hydraSessionId,clientId:V,readonly:!0}),t.log.info(`session/attach OK (viewer) sessionId=${O.hydraSessionId} clientId=${V} attachedCount=${d.attached.size} replayed=${U.length}`);for(let se of U)await a.notify(se.method,se.params).catch(()=>{});return{sessionId:O.hydraSessionId,clientId:V,connectedClients:[V],historyPolicy:"full",replayed:U.length,_meta:zI(O)}}if(!k){let O=await e.manager.loadFromDisk(b),U=O;if(g&&(U={...O,hydraSessionId:u.sessionId,upstreamSessionId:g.upstreamSessionId,agentId:g.agentId,cwd:g.cwd,...g.title!==void 0?{title:g.title}:{},...g.agentArgs!==void 0?{agentArgs:g.agentArgs}:{}}),!U)throw we(D.SessionNotFound,`session ${u.sessionId} not found and no resume hints provided`);let V=U.originatingClient?U:{...U,originatingClient:d.clientInfo},se=v!==void 0?{...V,forwardedEnv:v}:V;k=await jc(e,{...se,onInstallProgress:Zp(a)})}let R=$a(a,k,d,u.clientInfo,u.clientId),H=m.replayMode==="drip",{entries:q,appliedPolicy:K}=await k.attach(R,u.historyPolicy,{afterMessageId:u.afterMessageId,raw:H,...m.toolContent!==void 0?{toolContent:m.toolContent}:{}});if(d.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:R.clientId,readonly:y}),v!==void 0&&await e.manager.setForwardedEnv(k.sessionId,v).catch(()=>{}),t.log.info(`session/attach OK sessionId=${k.sessionId} clientId=${R.clientId} attachedCount=${d.attached.size} requestedPolicy=${u.historyPolicy} appliedPolicy=${K} replayed=${q.length} readonly=${y}${H?" replayMode=drip":""}`),H){let O=m.dripSpeed&&m.dripSpeed>0?m.dripSpeed:1,U=750;(async()=>{let V=null;for(let se of q){let Z=typeof se.recordedAt=="number"?se.recordedAt:null;if(V!==null&&Z!==null){let ne=Math.min(U,Math.max(0,(Z-V)/O));ne>0&&await new Promise(Q=>setTimeout(Q,ne))}Z!==null&&(V=Z);try{await a.notify(se.method,se.params)}catch{return}}})()}else for(let O=0;O<q.length&&!a.isClosed();O++){let U=q[O],V=a.notify(U.method,U.params).catch(()=>{});(O+1)%200===0&&await V}k.replayPendingPermissions(R);let z=qc(k),W=Wc(k);return{sessionId:k.sessionId,clientId:R.clientId,connectedClients:k.connectedClients(R.clientId),historyPolicy:K,replayed:q.length,...z?{modes:z}:{},...W?{models:W}:{},configOptions:k.buildConfigOptions(),_meta:Jc(e.manager,k)}}),a.onRequest("session/detach",async f=>{let u=af.parse(f),p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"client not attached to that session");let m=e.manager.get(u.sessionId);return m?.detach(p.clientId),d.attached.delete(u.sessionId),m&&e.manager.reapIfOrphanedNonInteractive(u.sessionId),{sessionId:u.sessionId,_meta:{[lt]:{detachStatus:"detached"}}}}),a.onRequest("session/list",async f=>{let u=df.parse(f??{});return{sessions:(await e.manager.list({cwd:u.cwd})).filter(y=>y.originatingClient?.name!==js).map(cf)}}),a.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw we(D.InternalError,"agent registry unavailable");return Er(e.registry)}),a.onRequest("session/prompt",async f=>{let u=lf.parse(f);c(u.sessionId,"session/prompt");let p=d.attached.get(u.sessionId);if(!p)throw t.log.warn(`session/prompt rejected: not attached sessionId=${u.sessionId} attachedKeys=[${[...d.attached.keys()].join(",")}]`),we(D.SessionNotFound,"not attached to session");let m=e.manager.get(u.sessionId);if(!m){let g=await e.manager.loadFromDisk(u.sessionId);if(!g)throw we(D.SessionNotFound,`session ${u.sessionId} not found`);t.log.info(`session/prompt auto-resurrecting cold sessionId=${u.sessionId}`),m=await jc(e,g);let y=$a(a,m,d,void 0,p.clientId);await m.attach(y,"none")}return m.prompt(p.clientId,u)});let l=f=>{let u;try{u=Vo.parse(f)}catch(g){t.log.warn(`session/cancel: invalid params: ${g.message}`);return}let p=d.attached.get(u.sessionId);if(!p)return;if(p.readonly){t.log.warn(`session/cancel dropped (readonly attachment) sessionId=${u.sessionId}`);return}let m=e.manager.get(u.sessionId);m&&m.cancel(p.clientId).catch(g=>{t.log.warn(`session/cancel for ${u.sessionId}: ${g.message}`)})};a.onNotification("session/cancel",l),a.onRequest("session/cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"session/cancel"),l(f),null}),a.onRequest("hydra-acp/prompt/cancel",async f=>{let u=ff.parse(f);return c(u.sessionId,"hydra-acp/prompt/cancel"),Qt(e.manager,u.sessionId).cancelQueuedPrompt(u.messageId)}),a.onRequest("hydra-acp/session/force_cancel",async f=>{let u=Vo.parse(f);return c(u.sessionId,"hydra-acp/session/force_cancel"),Qt(e.manager,u.sessionId).forceCancel()}),a.onRequest("hydra-acp/prompt/update",async f=>{let u=pf.parse(f);return c(u.sessionId,"hydra-acp/prompt/update"),Qt(e.manager,u.sessionId).updateQueuedPrompt(u.messageId,u.prompt)}),a.onRequest("hydra-acp/prompt/amend",async f=>{let u=hf.parse(f);c(u.sessionId,"hydra-acp/prompt/amend");let p=d.attached.get(u.sessionId);if(!p)throw we(D.SessionNotFound,"not attached to session");return Qt(e.manager,u.sessionId).amendPrompt(p.clientId,u)}),a.onRequest("session/load",async f=>{let u=f??{},p=typeof u.sessionId=="string"?u.sessionId:void 0;if(!p)throw we(D.InvalidParams,"session/load requires sessionId");let m=await e.manager.resolveCanonicalId(p)??p,g=e.manager.get(m);if(!g){let R=await e.manager.loadFromDisk(m);if(!R)throw we(D.SessionNotFound,`session ${p} not found in memory or on disk`);g=await jc(e,R)}let y=$a(a,g,d),{entries:v}=await g.attach(y,"pending_only");d.attached.set(g.sessionId,{sessionId:g.sessionId,clientId:y.clientId,readonly:!1});for(let R of v){if(a.isClosed())break;await a.notify(R.method,R.params).catch(()=>{})}g.replayPendingPermissions(y);let b=qc(g),k=Wc(g);return{sessionId:g.sessionId,...b?{modes:b}:{},...k?{models:k}:{},configOptions:g.buildConfigOptions(),_meta:Jc(e.manager,g,{clientId:y.clientId})}}),a.onRequest("session/set_model",async f=>{let u=f?.sessionId;typeof u=="string"&&c(u,"session/set_model");let p=WI(f,e.manager);if(p.kind==="error")throw t.log.warn(p.logMessage),we(p.code,p.message);if(p.kind==="no_op")return t.log.warn(p.logMessage),await a.notify("session/update",{sessionId:p.sessionId,update:{sessionUpdate:"current_model_update",currentModel:p.currentModel}}).catch(()=>{}),null;t.log.info(p.logMessage);let{modelId:m}=p,g=await p.session.forwardRequest("session/set_model",{...f,modelId:m});return p.session.applyModelChange(m),g}),a.onRequest("session/set_mode",async f=>{let u=f,p=u?.sessionId;if(typeof p=="string"&&c(p,"session/set_mode"),!u||typeof u.sessionId!="string")throw we(D.InvalidParams,"session/set_mode requires string sessionId");if(typeof u.modeId!="string")throw we(D.InvalidParams,"session/set_mode requires string modeId");let m=Qt(e.manager,u.sessionId),g=await m.forwardRequest("session/set_mode",f);return m.applyModeChange(u.modeId),g}),a.onRequest("session/set_config_option",async f=>{let u=f,p=v=>we(D.InvalidParams,v),m=u?.sessionId;if(typeof m=="string"&&c(m,"session/set_config_option"),!u||typeof u.sessionId!="string")throw p("session/set_config_option requires string sessionId");if(typeof u.configId!="string")throw p("session/set_config_option requires string configId");if(typeof u.value!="string")throw p("session/set_config_option requires string value");let g=Qt(e.manager,u.sessionId),y=g.buildConfigOptions().find(v=>v.id===u.configId);if(!y)throw p(`unknown configId ${JSON.stringify(u.configId)} for this session`);if(!y.options.some(v=>v.value===u.value))throw p(`value ${JSON.stringify(u.value)} is not valid for configId ${JSON.stringify(u.configId)}`);switch(u.configId){case"model":{u.value!==g.currentModel&&await g.forwardRequest("session/set_model",{sessionId:u.sessionId,modelId:u.value}),g.applyModelChange(u.value);break}case"mode":{u.value!==g.currentMode&&await g.forwardRequest("session/set_mode",{sessionId:u.sessionId,modeId:u.value}),g.applyModeChange(u.value);break}case"agent":{u.value!==g.agentId&&await g.setAgent(u.value);break}default:throw p(`configId ${JSON.stringify(u.configId)} is not settable`)}return{configOptions:g.buildConfigOptions()}}),a.setDefaultHandler(async(f,u)=>{if(!u.startsWith("session/")||f===null||typeof f!="object")throw we(D.MethodNotFound,`Method not found: ${u}`);let p=f.sessionId;if(typeof p!="string")throw we(D.MethodNotFound,`Method not found: ${u}`);return c(p,u),Qt(e.manager,p).forwardRequest(u,f)})})}async function qI(t,e){let n=t??{};if(typeof n.methodId!="string"||n.methodId.length===0)throw we(D.InvalidParams,"authenticate requires a non-empty methodId string");let s=n.methodId,r=n._meta?.["hydra-acp"],i=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,a=i!==void 0?e.manager.getAgentForSession(i):void 0;if(!a||!a.isAlive()){let u=o??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(u)}let d=a.authMethods??[],c=d.find(u=>u.id===s);if(!c){let u=d.map(p=>p.id);throw we(D.InvalidParams,`authenticate: methodId ${JSON.stringify(s)} is not advertised by agent ${a.agentId}; valid: [${u.map(p=>JSON.stringify(p)).join(", ")}]`)}let l=c._meta?.type;if((c.type??(l==="agent"||l==="terminal"?l:"agent"))==="terminal"){let u=c._meta?.args,p=[];if(u!==void 0){if(!Array.isArray(u))throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be a string[]; got ${u===null?"null":typeof u}`);for(let v of u)if(typeof v!="string")throw we(D.InvalidParams,`authenticate: method ${JSON.stringify(s)} _meta.args must be string[]; got non-string entry ${JSON.stringify(v)}`);p=u}let m=await e.manager.planSpawnForAgent(a.agentId),g={};for(let[v,b]of Object.entries(process.env))typeof b=="string"&&(g[v]=b);Object.assign(g,m.env);let y=eh.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${s}`),{kind:"terminal",command:m.command,args:[...m.args,...p],env:g,cwd:y}}try{return await a.connection.request("authenticate",{methodId:s})}catch(u){throw Js(u,a)}}function Zp(t){return e=>{let n={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(n.receivedBytes=e.receivedBytes),"totalBytes"in e&&(n.totalBytes=e.totalBytes),"packageSpec"in e&&(n.packageSpec=e.packageSpec),t.notify(Yo,n).catch(()=>{})}}function qc(t){let e=t.availableModes();if(e.length===0)return;let n=e.map(r=>{let i={id:r.id,name:r.name??r.id};return r.description!==void 0&&(i.description=r.description),i});return{currentModeId:t.currentMode??e[0].id,availableModes:n}}function Wc(t){let e=t.availableModels();if(e.length===0)return;let n=e.map(r=>{let i={modelId:r.modelId};return r.name!==void 0&&(i.name=r.name),r.description!==void 0&&(i.description=r.description),i});return{currentModelId:t.currentModel??e[0].modelId,availableModels:n}}function WI(t,e){if(!t||typeof t!="object")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let n=t;if(typeof n.sessionId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof n.modelId!="string")return{kind:"error",code:D.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${n.sessionId}`};let s=e.get(n.sessionId);if(!s)return{kind:"error",code:D.SessionNotFound,message:`session ${n.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${n.sessionId}`};let r=s.availableModels(),i=Mr(n.modelId,r);if(i.kind==="none")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="exact")return{kind:"ok",session:s,modelId:n.modelId,logMessage:`session/set_model accepted sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)}`};if(i.kind==="resolved")return{kind:"ok",session:s,modelId:i.modelId,logMessage:`session/set_model resolved sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} \u2192 ${JSON.stringify(i.modelId)}`};let o=r.map(d=>d.modelId).join(", "),a=i.kind==="ambiguous"?`ambiguous (trailing-segment matches [${i.candidates.join(", ")}])`:"not in availableModels";return s.currentModel!==void 0&&s.currentModel.length>0?{kind:"no_op",session:s,sessionId:n.sessionId,currentModel:s.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${n.sessionId} requested=${JSON.stringify(n.modelId)} ${a} actual=${JSON.stringify(s.currentModel)} agentId=${s.agentId} known=[${o}]`}:{kind:"error",code:D.InvalidParams,message:`model "${n.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${s.agentId}); known models: ${o}`,logMessage:`session/set_model rejected sessionId=${n.sessionId} modelId=${JSON.stringify(n.modelId)} ${a} agentId=${s.agentId} known=[${o}] (no current model to fall back to)`}}async function JI(t,e,n){let s=t??{},r=typeof s.sessionId=="string"?s.sessionId:void 0;if(!r)throw we(D.InvalidParams,"transformer/attach requires sessionId");if(!n.transformers)throw we(D.InternalError,"transformer manager not configured");let i=n.transformers.resolveChain([e])[0];if(!i)throw we(D.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return Qt(n.manager,r).addTransformer(i),{ok:!0}}function zI(t){let e={sessionId:t.hydraSessionId,upstreamSessionId:t.upstreamSessionId,cwd:t.cwd,title:t.title,agentId:t.agentId,currentModel:t.currentModel,currentUsage:t.currentUsage,forkedFromSessionId:t.forkedFromSessionId,forkedFromMessageId:t.forkedFromMessageId,originatingClient:t.originatingClient,interactive:t.interactive,updatedAt:t.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,awaitingInput:!1},n={currentMode:t.currentMode,agentArgs:t.agentArgs,availableCommands:t.agentCommands,availableModes:t.agentModes,availableModels:t.agentModels};return{[lt]:zo(e,n)}}function Jc(t,e,n={}){let s=t.liveListEntry(e),r={clientId:n.clientId,currentMode:e.currentMode,agentArgs:e.agentArgs,availableCommands:e.mergedAvailableCommands(),availableModes:e.availableModes(),availableModels:e.availableModels(),turnStartedAt:e.turnStartedAt,agentCapabilities:e.agentCapabilities,queue:e.queueSnapshot()};return _i(e.agentMeta,zo(s,r))}function KI(){return{protocolVersion:1,agentInfo:{name:"hydra",version:fe},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,sessionCapabilities:{attach:{},list:{}}},authMethods:[{id:"proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:_i(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0}})}}function VI(t,e){if(!(!e.transformers||!e.manager))for(let n of e.manager.defaultTransformers){let s=e.transformers.resolveChain([n])[0];s&&t.addTransformer(s)}}function $a(t,e,n,s,r){return{clientId:r??`cli_${zc(8)}`,connection:t,clientInfo:s}}var Oa=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let n,s,r=new Promise((o,a)=>{n=o,s=a});r.catch(()=>{});let i={session:void 0,sessionReady:r,disposers:[]};return this.byToken.set(e,i),{complete:o=>{i.session=o,n(o)},abandon:o=>{this.byToken.delete(e),s(o??new Error("mcp token reservation abandoned"))}}}bind(e,n){let{complete:s}=this.reserve(e);s(n)}lookup(e){return this.byToken.get(e)}addDisposer(e,n){let s=this.byToken.get(e);s!==void 0&&s.disposers.push(n)}async unbind(e){let n=this.byToken.get(e);if(n!==void 0){this.byToken.delete(e);for(let s of n.disposers)try{await s()}catch{}}}size(){return this.byToken.size}};import{randomUUID as YI}from"crypto";import{McpServer as GI}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as QI}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as ut}from"zod";var nh="Bearer ";function Fa(t){let e=t.headers.authorization;if(typeof e!="string"||!e.startsWith(nh))return;let n=e.slice(nh.length).trim();return n.length>0?n:void 0}function XI(t){let e=new GI({name:"hydra-acp-stdin",version:"1.0.0"},{instructions:"Piped input from `hydra cat --stream` is exposed here as a byte stream. Use `tail` for the latest N bytes (good for finding the end of a log), `head` for the first N bytes (good for headers/preamble), `read` for windowed reads against an absolute byte cursor, `wait_for_more` to block until new bytes arrive past a cursor, and `info` for the current cursors/capacity/closed status. Byte payloads come back base64-encoded."});return e.registerTool("tail",{description:"Return the most recent `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means older bytes existed but have been evicted from the ring.",inputSchema:{bytes:ut.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:n})=>{let s=t.streamTail(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("head",{description:"Return the first `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means the head has already been evicted from the ring and the returned bytes start at the oldest still-resident cursor.",inputSchema:{bytes:ut.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:n})=>{let s=t.streamHead(n);return{content:[{type:"text",text:JSON.stringify(s)}],structuredContent:s}}),e.registerTool("read",{description:"Read up to `max_bytes` bytes starting at absolute byte `cursor`. Returns `{bytes, nextCursor, gap?, eof?}` \u2014 `gap` is the number of bytes silently skipped because the ring had evicted them; `eof:true` means the producer closed and there is nothing left to read.",inputSchema:{cursor:ut.number().int().min(0).describe("Absolute byte offset to start reading from. Use 0 to read from the very beginning (may produce a gap if old bytes have been evicted)."),max_bytes:ut.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:ut.number().int().min(0).optional().describe("If no bytes are available, block up to this many ms for more (capped server-side at 60_000).")}},async({cursor:n,max_bytes:s,wait_ms:r})=>{let i=await t.streamRead(n,s,r);return{content:[{type:"text",text:JSON.stringify(i)}],structuredContent:i}}),e.registerTool("wait_for_more",{description:"Block until bytes are available past `cursor`, the stream closes, or `timeout_ms` elapses. Returns one of {data, eof, timeout} plus the current `writeCursor`. Use this when you've consumed everything up to a cursor and want to wait for more without busy-polling.",inputSchema:{cursor:ut.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:ut.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:n,timeout_ms:s})=>{let r=await t.streamWaitFor(n,s),i=t.streamInfo(),o={outcome:r,writeCursor:i.writeCursor,closed:i.closed};return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o}}),e.registerTool("grep",{description:"Scan piped stdin line-by-line and return lines matching `pattern`. Prefer this over `read` when the question is 'find lines that mention X' \u2014 it filters server-side so you don't pull and decode 64 KiB base64 windows. Returns `{matches: [{cursor, line, before?, after?}], truncated, nextCursor, gap?, scannedBytes, eof?}`. Lines come back as decoded UTF-8 strings (not base64). When `truncated:true`, re-call with `cursor: nextCursor` to resume.",inputSchema:{pattern:ut.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:ut.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:ut.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:ut.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:ut.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:ut.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:ut.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:ut.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:ut.number().int().min(0).optional().describe("Optional absolute byte offset to start scanning from. Omit to scan from the oldest still-resident byte. Pass the `nextCursor` from a previous truncated call to resume.")}},async n=>{let s={pattern:n.pattern};n.regex!==void 0&&(s.regex=n.regex),n.case_insensitive!==void 0&&(s.caseInsensitive=n.case_insensitive),n.invert!==void 0&&(s.invert=n.invert),n.max_matches!==void 0&&(s.maxMatches=n.max_matches),n.max_bytes!==void 0&&(s.maxBytes=n.max_bytes),n.context_before!==void 0&&(s.contextBefore=n.context_before),n.context_after!==void 0&&(s.contextAfter=n.context_after),n.cursor!==void 0&&(s.cursor=n.cursor);let r=t.streamGrep(s),i=r;return{content:[{type:"text",text:JSON.stringify(r)}],structuredContent:i}}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let n=t.streamInfo();return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}),e}var ZI=1e4;function sh(t,e){let n=new Map;async function s(o,a){let d=n.get(o);if(d!==void 0)return d.transport;let c=XI(a),l=new QI({sessionIdGenerator:()=>YI()});await c.connect(l);let f={server:c,transport:l};return n.set(o,f),e.addDisposer(o,async()=>{n.delete(o);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function r(o,a){let d=Fa(o);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown stdin token"});return}let l;if(c.session!==void 0)l=c.session;else{let u,p=new Promise(g=>{u=setTimeout(()=>g(void 0),ZI)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(u!==void 0&&clearTimeout(u),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let f=await s(d,l);a.hijack(),await f.handleRequest(o.raw,a.raw,o.body)}let i={config:{skipAuth:!0}};t.post("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.get("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)}),t.delete("/mcp/hydra-acp-stdin",i,async(o,a)=>{await r(o,a)})}var La=class{byName=new Map;changeHandlers=[];register(e,n,s,r){this.byName.set(e,{connection:n,instructions:s,tools:[...r]}),this.fireChanged(e,"register")}clear(e){this.byName.delete(e)&&this.fireChanged(e,"clear")}lookup(e){return this.byName.get(e)}list(){return Array.from(this.byName.keys())}onChange(e){return this.changeHandlers.push(e),()=>{let n=this.changeHandlers.indexOf(e);n>=0&&this.changeHandlers.splice(n,1)}}fireChanged(e,n){for(let s of this.changeHandlers)try{s(e,n)}catch{}}};import{StreamableHTTPServerTransport as oS}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as aS}from"crypto";import{Server as eS}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as tS,ListToolsRequestSchema as nS}from"@modelcontextprotocol/sdk/types.js";var sS=6e4;function rh(t,e,n,s={}){let r=s.invokeTimeoutMs??sS,i=typeof n=="function"?async()=>n():async()=>n,o=new eS({name:t,version:"1.0.0"},{capabilities:{tools:{listChanged:!1}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),a=new Map(e.tools.map(d=>[d.name,d]));return o.setRequestHandler(nS,async()=>({tools:e.tools.map(d=>({name:d.name,description:d.description,inputSchema:d.inputSchema,...d.outputSchema!==void 0?{outputSchema:d.outputSchema}:{}}))})),o.setRequestHandler(tS,async d=>{let c=d.params.name;if(!a.has(c))return Ba(`unknown tool: ${c}`);try{let l=await i(),f=await rS(e.connection,t,c,d.params.arguments??{},l,r);return iS(f,c)}catch(l){return Ba(l instanceof Error?l.message:String(l))}}),o}async function rS(t,e,n,s,r,i){let o,a=new Promise((d,c)=>{o=setTimeout(()=>c(new Error(`extension timeout after ${i}ms`)),i)});try{return await Promise.race([t.request("hydra-acp/mcp_tools/invoke",{server:e,tool:n,args:s,sessionId:r}),a])}finally{o!==void 0&&clearTimeout(o)}}function iS(t,e){if(t===null||typeof t!="object")return Ba(`extension ${e} returned non-object`);let n=t;return Array.isArray(n.content)?n:Ba(`extension ${e} omitted content array`)}function Ba(t){return{content:[{type:"text",text:t}],isError:!0}}var dS=1e4;function ih(t,e,n,s={}){let r=new Map;async function i(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let f of r.values()){let u=f.get(l);u!==void 0&&(f.delete(l),i(u))}}n.onChange(l=>{o(l)});async function a(l,f){let u=r.get(l);u===void 0&&(u=new Map,r.set(l,u),e.addDisposer(l,async()=>{let b=r.get(l);if(b!==void 0){r.delete(l);for(let k of b.values())await i(k)}}));let p=u.get(f);if(p!==void 0)return p.transport;let m=n.lookup(f);if(m===void 0)return;let y=rh(f,m,async()=>{let b=e.lookup(l);if(b===void 0)throw new Error("mcp token no longer bound");if(b.session!==void 0)return b.session.sessionId;let k,R=new Promise(q=>{k=setTimeout(()=>q(void 0),dS)}),H=await Promise.race([b.sessionReady.catch(()=>{}),R]);if(k!==void 0&&clearTimeout(k),H===void 0)throw new Error("session not ready");return H.sessionId},s.buildOptions),v=new oS({sessionIdGenerator:()=>aS()});return await y.connect(v),u.set(f,{server:y,transport:v}),v}async function d(l,f){let u=Fa(l);if(u===void 0){f.code(401).send({error:"missing bearer token"});return}if(e.lookup(u)===void 0){f.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,g=await a(u,m);if(g===void 0){f.code(404).send({error:`unknown mcp server: ${m}`});return}f.hijack(),await g.handleRequest(l.raw,f.raw,l.body)}let c={config:{skipAuth:!0}};t.post("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.get("/mcp/:name",c,async(l,f)=>{await d(l,f)}),t.delete("/mcp/:name",c,async(l,f)=>{await d(l,f)})}async function dh(t,e){pS(t);let n=t.daemon.tls?{key:await us.readFile(t.daemon.tls.key),cert:await us.readFile(t.daemon.tls.cert)}:void 0;await us.mkdir(M.home(),{recursive:!0});let{stream:s,fileStream:r}=await fS(t.daemon.logLevel),i=cS({logger:{level:t.daemon.logLevel,stream:s},https:n??null,bodyLimit:256*1024*1024});await i.register(lS,{options:{handleProtocols:Bu}}),Zd(j=>{i.log.info(j)}),nc(j=>{i.log.info(j)});let o=await ba.load(),a=new xa,d=new ka,c=new Sa([new va(e),new Ia(o),d]),l=Sp({validator:c});i.addHook("onRequest",async(j,de)=>{j.routeOptions.config?.skipAuth||j.url==="/acp"||j.url?.startsWith("/acp?")||await l(j,de)});let f=setInterval(()=>{o.sweepExpired()},300*1e3);f.unref();let u=setInterval(()=>{a.sweepExpired()},300*1e3);u.unref();let p=new qo(t,{onFetched:()=>{pp(p,v)}});Lc(j=>i.log.info(j));let m={info:j=>i.log.info(j),warn:j=>i.log.warn(j)},g=j=>os.spawn({...j,stderrTailBytes:t.daemon.agentStderrTailBytes,logger:m});Uu(t.compressToolContent);let y=new ya,v=new ua(p,g,void 0,{idleTimeoutMs:t.daemon.sessionIdleTimeoutSeconds*1e3,defaultModels:t.defaultModels,synopsisAgent:t.synopsisAgent,synopsisModel:t.synopsisModel,synopsisOnClose:t.synopsisOnClose,defaultTransformers:t.defaultTransformers,sessionHistoryMaxEntries:t.daemon.sessionHistoryMaxEntries,logger:m,npmRegistry:t.npmRegistry,extensionCommands:y,defaultCwd:t.defaultCwd}),b=new ma(bu(t),void 0,{tokenRegistry:d}),k=new ga(vu(t),void 0,{tokenRegistry:d});Up(i,fe,ds(t));let R=new Oa,H=new La,q,K=()=>{if(q!==void 0)return q;let j=i.server.address(),de=j&&typeof j=="object"?j.port:t.daemon.port;return q=`${t.daemon.tls?"https":"http"}://${t.daemon.host}:${de}`,q};Dp(i,v,{agentId:t.defaultAgent,cwd:t.defaultCwd,publicHost:t.daemon.publicHost,host:t.daemon.host,port:t.daemon.port},{extensionMcp:H,mcpTokenRegistry:R,getDaemonOrigin:K}),Hp(i,p,v,{npmRegistry:t.npmRegistry}),jp(i,b),qp(i,k),Wp(i,{defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,defaultModels:{...t.defaultModels},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},synopsisOnClose:t.synopsisOnClose,defaultTransformers:[...t.defaultTransformers]}),Xp(i,{store:o,rateLimiter:a}),sh(i,R),ih(i,R,H),th(i,{validator:c,manager:v,defaultAgent:t.defaultAgent,processRegistry:d,onExtensionVersion:(j,de)=>b.reportVersion(j,de),onTransformerVersion:(j,de)=>k.reportVersion(j,de),transformers:k,extensionCommands:y,mcpTokenRegistry:R,extensionMcp:H,getDaemonOrigin:K,registry:p}),await i.listen({host:t.daemon.host,port:t.daemon.port});let z=i.server.address(),W=z&&typeof z=="object"?z.port:t.daemon.port;await us.mkdir(M.home(),{recursive:!0}),await us.writeFile(M.pidFile(),JSON.stringify({pid:process.pid,host:t.daemon.host,port:W,startedAt:new Date().toISOString()})+`
229
+ `,{encoding:"utf8",mode:384});let O=t.daemon.tls?"https":"http",U=t.daemon.tls?"wss":"ws",V={daemonUrl:`${O}://${t.daemon.host}:${W}`,daemonHost:t.daemon.host,daemonPort:W,serviceToken:e,daemonWsUrl:`${U}://${t.daemon.host}:${W}/acp`,hydraHome:M.home()};b.setContext(V),k.setContext(V),await b.start(),await k.start(),v.resurrectPendingQueues().catch(j=>{i.log.warn(`queue replay scan failed: ${j.message}`)});let se=t.daemon.agentSyncIntervalMinutes*60*1e3,Z=se>0?hp({registry:p,manager:v,intervalMs:se,logger:m}):void 0,ne=t.daemon.sessionGcIntervalMinutes*60*1e3,Q=t.daemon.sessionGcMaxAgeDays*24*60*60*1e3,ue=ne>0?mp({manager:v,intervalMs:ne,maxAgeMs:Q,logger:m}):void 0;return{app:i,manager:v,registry:p,extensions:b,transformers:k,mcpTokenRegistry:R,extensionMcp:H,processRegistry:d,shutdown:async()=>{ue&&ue(),Z&&Z(),clearInterval(f),clearInterval(u);let j=async(de,_e)=>{try{await _e()}catch($e){i.log.warn(`shutdown step ${de} failed: ${$e instanceof Error?$e.message:String($e)}`)}};await j("sessionTokenStore.flush",()=>o.flush()),await j("extensions.stop",()=>b.stop()),await j("transformers.stop",()=>k.stop()),await j("manager.closeAll",()=>v.closeAll()),await j("manager.flushSynopsis",()=>v.flushSynopsis(3e4)),await j("manager.shutdownSynopsis",()=>v.shutdownSynopsis()),await j("manager.flushMetaWrites",()=>v.flushMetaWrites()),await j("manager.flushHistoryWrites",()=>v.flushHistoryWrites()),Zd(null),nc(null),Lc(null),await j("app.close",()=>i.close());try{ah.unlinkSync(M.pidFile())}catch{}await j("fileStream.flushSync",()=>r.flushSync())}}}async function fS(t){let e=await uS({file:M.logFile(),size:"10m",frequency:"daily",mkdir:!0,symlink:!0}),n=oh.destination(2);return{stream:oh.multistream([{stream:e,level:t},{stream:n,level:t}]),fileStream:e}}function pS(t){let e=t.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!t.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}Ys();_t();Vi();import*as ch from"fs";import*as Wr from"fs/promises";async function Jr(t,e,n){let s=wS(e),r;try{r=await Wr.stat(t)}catch(d){if(d.code==="ENOENT"){process.stderr.write(`${n} (${t})
230
230
  `),process.exit(1);return}throw d}let i=await yS(t,r.size,s.tail);if(!s.follow)return;process.stdout.write(`-- following ${t} --
231
231
  `);let o=!1,a=ch.watch(t,()=>{o||(o=!0,setImmediate(async()=>{o=!1;try{let d=await Wr.stat(t);if(d.size<=i){d.size<i&&(i=d.size);return}let c=await Wr.open(t,"r");try{let l=Buffer.alloc(d.size-i);await c.read(l,0,l.length,i),process.stdout.write(l),i=d.size}finally{await c.close()}}catch{}}))});await new Promise(d=>{let c=()=>{a.close(),d()};process.once("SIGINT",c),process.once("SIGTERM",c)})}async function yS(t,e,n){if(n<=0||e===0)return e;let s=64*1024,r=await Wr.open(t,"r");try{let i=e,o="",a=0;for(;i>0&&a<=n;){let l=Math.min(s,i);i-=l;let f=Buffer.alloc(l);await r.read(f,0,l,i),o=f.toString("utf8")+o,a=(o.match(/\n/g)??[]).length}let c=o.split(`
232
232
  `).slice(-n-1);process.stdout.write(c.join(`
@@ -254,7 +254,7 @@ ${gc}`:gc;await n.connection.request("session/prompt",{sessionId:d,prompt:[{type
254
254
  `);return}let r=n.version===fe,i=n.configDigest!==void 0&&s!==void 0&&n.configDigest===s;if(r&&i){process.stdout.write(`Version: ${fe}
255
255
  `);return}process.stdout.write(`CLI version: ${fe}
256
256
  `),process.stdout.write(`Daemon version: ${n.version}
257
- `),r||process.stdout.write(lh.yellow("Version mismatch \u2014 run `hydra-acp daemon restart` to upgrade the daemon.\n")),r&&!i&&process.stdout.write(lh.yellow("Config changed since daemon started \u2014 run `hydra-acp daemon restart` to apply.\n"))}async function zr(){try{let t=await uh.readFile(M.pidFile(),"utf8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return;throw t}}function Kc(t){try{return process.kill(t,0),!0}catch{return!1}}qe();Fn();ps();Ds();Pi();hn();to();Ws();import*as Ut from"fs/promises";import*as jt from"path";Va();async function Th(t={}){let e=await ye(),n=t.includeNonInteractive||t.all?"?includeNonInteractive=true":"",r=(await Re(`/v1/sessions${n}`,{expectStatus:200})).body,i=r.sessions,o=t.host??"local",a=o==="all"?i:o==="local"?i.filter(y=>!y.importedFromMachine||!!y.upstreamSessionId):i.filter(y=>y.importedFromMachine===o&&!y.upstreamSessionId);if(t.json){process.stdout.write(JSON.stringify(a,null,2)+`
257
+ `),r||process.stdout.write(lh.yellow("Version mismatch \u2014 run `hydra-acp daemon restart` to upgrade the daemon.\n")),r&&!i&&process.stdout.write(lh.yellow("Config changed since daemon started \u2014 run `hydra-acp daemon restart` to apply.\n"))}async function zr(){try{let t=await uh.readFile(M.pidFile(),"utf8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return;throw t}}function Kc(t){try{return process.kill(t,0),!0}catch{return!1}}je();Fn();ps();Ds();Pi();hn();to();Ws();import*as Ut from"fs/promises";import*as jt from"path";Va();async function Th(t={}){let e=await ye(),n=t.includeNonInteractive||t.all?"?includeNonInteractive=true":"",r=(await Re(`/v1/sessions${n}`,{expectStatus:200})).body,i=r.sessions,o=t.host??"local",a=o==="all"?i:o==="local"?i.filter(y=>!y.importedFromMachine||!!y.upstreamSessionId):i.filter(y=>y.importedFromMachine===o&&!y.upstreamSessionId);if(t.json){process.stdout.write(JSON.stringify(a,null,2)+`
258
258
  `);return}if(a.length===0){if(o==="local"&&r.sessions.length>0){process.stdout.write(`No local sessions. Use --host=all to include imported sessions.
259
259
  `);return}if(o!=="local"&&o!=="all"){process.stdout.write(`No sessions from ${o}.
260
260
  `);return}process.stdout.write(`No active sessions.
@@ -306,7 +306,7 @@ history entries: ${n.history.length}`+(n.promptHistory?`, prompt history: ${n.pr
306
306
  `))}async function FS(){let t=[];for await(let e of process.stdin)t.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(t).toString("utf8")}function LS(t,e){let n=t.headers.get("content-disposition");if(n){let r=n.match(/filename="([^"]+)"/);if(r)return r[1]}let s=new Date().toISOString().replace(/[:.]/g,"-");return`hydra-${e}-${s}.hydra`}async function Fh(t,e={}){let n=await ye(),s;if(t!==void 0&&t.length>0)s=t;else{let c=await Dt(n),l=e.cwd?jt.resolve(e.cwd):process.cwd(),f=await bn(c,{cwd:l,all:!0}),u=Ja(f,l);u||(process.stderr.write(`No sessions found for ${l}.
307
307
  `),process.exit(1)),s=u.sessionId}let{host:r,port:i,isFallback:o}=BS(e.host,n),a=ze(s),d=Au({host:r,port:i,sessionId:a});process.stdout.write(d+`
308
308
  `),o&&process.stderr.write(`Note: this URL points at loopback (127.0.0.1) and only works from the same machine. Set daemon.publicHost in config.json or pass --host <name> to advertise an externally-reachable hostname.
309
- `)}function BS(t,e){if(t!==void 0&&t.length>0){let{host:n,port:s}=Rh(t,443);return{host:n,port:s,isFallback:!1}}if(e.daemon.publicHost&&e.daemon.publicHost.length>0){let{host:n,port:s}=Rh(e.daemon.publicHost,443);return{host:n,port:s,isFallback:!1}}return Bn(e.daemon.host)?{host:"127.0.0.1",port:e.daemon.port,isFallback:!0}:{host:e.daemon.host,port:e.daemon.port,isFallback:!1}}function Rh(t,e){if(t.startsWith("[")){let s=t.indexOf("]");if(s>0){let r=t.slice(1,s),i=t.slice(s+1);if(i.startsWith(":")){let o=Number(i.slice(1));return{host:r,port:Number.isInteger(o)&&o>0?o:e}}return{host:r,port:e}}}let n=t.lastIndexOf(":");if(n>0&&t.indexOf(":")===n){let s=t.slice(0,n),r=Number(t.slice(n+1));if(Number.isInteger(r)&&r>0)return{host:s,port:r}}return{host:t,port:e}}fl();Va();dl();qe();ge();ps();var bk={extension:{singular:"extension",plural:"extensions",logFile:t=>M.extensionLogFile(t)},transformer:{singular:"transformer",plural:"transformers",logFile:t=>M.transformerLogFile(t)}};function ed(t){if(t&&typeof t=="object"&&"error"in t){let e=t.error;if(typeof e=="string"&&e.length>0)return`: ${e}`}return""}function si(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}function td(t){let e=bk[t],n=`/v1/${e.plural}`;async function s(){let f=(await Re(n,{expectStatus:200})).body[e.plural]??[];if(f.length===0){process.stdout.write(`No ${e.plural} configured.
309
+ `)}function BS(t,e){if(t!==void 0&&t.length>0){let{host:n,port:s}=Rh(t,443);return{host:n,port:s,isFallback:!1}}if(e.daemon.publicHost&&e.daemon.publicHost.length>0){let{host:n,port:s}=Rh(e.daemon.publicHost,443);return{host:n,port:s,isFallback:!1}}return Bn(e.daemon.host)?{host:"127.0.0.1",port:e.daemon.port,isFallback:!0}:{host:e.daemon.host,port:e.daemon.port,isFallback:!1}}function Rh(t,e){if(t.startsWith("[")){let s=t.indexOf("]");if(s>0){let r=t.slice(1,s),i=t.slice(s+1);if(i.startsWith(":")){let o=Number(i.slice(1));return{host:r,port:Number.isInteger(o)&&o>0?o:e}}return{host:r,port:e}}}let n=t.lastIndexOf(":");if(n>0&&t.indexOf(":")===n){let s=t.slice(0,n),r=Number(t.slice(n+1));if(Number.isInteger(r)&&r>0)return{host:s,port:r}}return{host:t,port:e}}fl();Va();dl();je();ge();ps();var bk={extension:{singular:"extension",plural:"extensions",logFile:t=>M.extensionLogFile(t)},transformer:{singular:"transformer",plural:"transformers",logFile:t=>M.transformerLogFile(t)}};function ed(t){if(t&&typeof t=="object"&&"error"in t){let e=t.error;if(typeof e=="string"&&e.length>0)return`: ${e}`}return""}function si(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}function td(t){let e=bk[t],n=`/v1/${e.plural}`;async function s(){let f=(await Re(n,{expectStatus:200})).body[e.plural]??[];if(f.length===0){process.stdout.write(`No ${e.plural} configured.
310
310
  `);return}let u=f.map(y=>({name:y.name,status:y.status.toUpperCase(),version:y.version??"-",pid:y.pid!=null?String(y.pid):"-",restarts:String(y.restartCount),started:y.startedAt?Vr(y.startedAt):"-",log:y.logPath})),p={name:"NAME",status:"STATUS",version:"VERSION",pid:"PID",restarts:"RESTARTS",started:"STARTED",log:"LOG"},m={name:si(p.name,u.map(y=>y.name)),status:si(p.status,u.map(y=>y.status)),version:si(p.version,u.map(y=>y.version)),pid:si(p.pid,u.map(y=>y.pid)),restarts:si(p.restarts,u.map(y=>y.restarts)),started:si(p.started,u.map(y=>y.started))},g=y=>[y.name.padEnd(m.name),y.status.padEnd(m.status),y.version.padEnd(m.version),y.pid.padStart(m.pid),y.restarts.padStart(m.restarts),y.started.padEnd(m.started),y.log].join(" ");process.stdout.write(g(p)+`
311
311
  `);for(let y of u)process.stdout.write(g(y)+`
312
312
  `);for(let y of f)y.failureReason&&process.stdout.write(` \u21B3 ${y.name}: ${y.failureReason}
@@ -330,7 +330,7 @@ history entries: ${n.history.length}`+(n.promptHistory?`, prompt history: ${n.pr
330
330
  `),m+=1;continue}let v=y.body,b=v.pid!=null?` pid=${v.pid}`:"";process.stdout.write(`${g.name}: ${v.status}${b}
331
331
  `)}catch(y){process.stdout.write(`${g.name}: ERROR ${y.message}
332
332
  `),m+=1}m>0&&process.exit(1)}async function d(c){let{name:l,rest:f}=Ua(c);if(!l){process.stderr.write(`Usage: hydra-acp ${e.plural} log <name> [--tail N] [--follow]
333
- `),process.exit(2);return}let u=e.logFile(l);await Jr(u,f,`No log file (${e.singular} never ran?)`)}return{list:s,add:r,remove:i,start:c=>o(c,"start"),stop:c=>o(c,"stop"),restart:c=>o(c,"restart"),logs:d}}function Xh(t){return t.charAt(0).toUpperCase()+t.slice(1)}var Qs=td("extension"),Zh=Qs.list,em=Qs.add,tm=Qs.remove,nm=Qs.start,sm=Qs.stop,rm=Qs.restart,im=Qs.logs;var Xs=td("transformer"),om=Xs.list,am=Xs.add,dm=Xs.remove,cm=Xs.start,lm=Xs.stop,um=Xs.restart,fm=Xs.logs;qe();ge();ps();async function mm(){let e=(await Re("/v1/agents",{expectStatus:200})).body;if(e.agents.length===0){process.stdout.write(`No agents in registry.
333
+ `),process.exit(2);return}let u=e.logFile(l);await Jr(u,f,`No log file (${e.singular} never ran?)`)}return{list:s,add:r,remove:i,start:c=>o(c,"start"),stop:c=>o(c,"stop"),restart:c=>o(c,"restart"),logs:d}}function Xh(t){return t.charAt(0).toUpperCase()+t.slice(1)}var Qs=td("extension"),Zh=Qs.list,em=Qs.add,tm=Qs.remove,nm=Qs.start,sm=Qs.stop,rm=Qs.restart,im=Qs.logs;var Xs=td("transformer"),om=Xs.list,am=Xs.add,dm=Xs.remove,cm=Xs.start,lm=Xs.stop,um=Xs.restart,fm=Xs.logs;je();ge();ps();async function mm(){let e=(await Re("/v1/agents",{expectStatus:200})).body;if(e.agents.length===0){process.stdout.write(`No agents in registry.
334
334
  `);return}let n=e.agents.map(a=>({id:a.id,name:a.name,version:a.version,source:a.source??"registry",distributions:a.distributions.join(","),installed:a.installed,description:a.description??""})),s={id:"ID",name:"NAME",version:"VERSION",source:"SOURCE",distributions:"DIST",installed:"INSTALLED",description:"DESCRIPTION"},r={id:Dn(s.id,n.map(a=>a.id)),name:Dn(s.name,n.map(a=>a.name)),version:Dn(s.version,n.map(a=>a.version)),source:Dn(s.source,n.map(a=>a.source)),distributions:Dn(s.distributions,n.map(a=>a.distributions)),installed:Dn(s.installed,n.map(a=>a.installed))},i=a=>[a.id.padEnd(r.id),a.name.padEnd(r.name),a.version.padEnd(r.version),a.source.padEnd(r.source),a.distributions.padEnd(r.distributions),a.installed.padEnd(r.installed),a.description].join(" ");process.stdout.write(i(s)+`
335
335
  `);for(let a of n)process.stdout.write(i(a)+`
336
336
  `);let o=e.fetchedAt!==void 0?` (synced ${Vr(e.fetchedAt)})`:"";process.stdout.write(`
@@ -363,7 +363,7 @@ Synced ${n.synced.length} session(s); skipped ${n.skipped} already tracked.
363
363
  `),process.stdout.write("Restart with `hydra-acp daemon restart` to apply to new sessions.\n")}async function km(t){if(!t){process.stderr.write(`Usage: hydra-acp agent remove <id>
364
364
  `),process.exit(2);return}await Dd(t,void 0),process.stdout.write(`Removed local agent ${t}.
365
365
  `),process.stdout.write("Restart with `hydra-acp daemon restart` to apply to new sessions.\n")}async function gl(t){await ku(t),process.stdout.write(t?"Registry pinned to the on-disk cache. `hydra-acp agent refresh` still forces a fetch.\n":`Registry unpinned \u2014 the daemon will re-fetch per registry.ttlHours.
366
- `),process.stdout.write("Restart with `hydra-acp daemon restart` to apply.\n")}function Dn(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}eo();qr();Us();qe();Ds();Ys();yt();_t();Jo();vl();import Lk from"os";import{spawn as Bk}from"child_process";async function Nk({conn:t,agentId:e,authMethods:n,method:s,spawn:r}){try{return await t.request("session/new",{cwd:Lk.homedir(),mcpServers:[],_meta:{"hydra-acp":{agentId:e}}}),process.stdout.write(`agent ${e} does not currently require authentication
366
+ `),process.stdout.write("Restart with `hydra-acp daemon restart` to apply.\n")}function Dn(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}eo();qr();Us();je();Ds();Ys();yt();_t();Jo();vl();import Lk from"os";import{spawn as Bk}from"child_process";async function Nk({conn:t,agentId:e,authMethods:n,method:s,spawn:r}){try{return await t.request("session/new",{cwd:Lk.homedir(),mcpServers:[],_meta:{"hydra-acp":{agentId:e}}}),process.stdout.write(`agent ${e} does not currently require authentication
367
367
  `),{exitCode:0}}catch(i){if(i instanceof Error&&"code"in i&&i.code===D.AuthRequired){let o=i.data,a=o?._meta?.["hydra-acp"]?.authMethods??n,d=o?._meta?.["hydra-acp"]?.agentId??e,c=await Dk(a,s),f=await bl(c,{authenticate:u=>t.request("authenticate",{methodId:u,_meta:{"hydra-acp":{agentId:d}}}),runTerminalAuth:u=>new Promise(p=>{let m=r(u.command,u.args,{stdio:"inherit",env:u.env,cwd:u.cwd});m.on("exit",g=>{p({exitCode:g})}),m.on("error",()=>{p({exitCode:-1})})})});return f.kind==="terminal-completed"?{exitCode:0}:f.kind==="retry"?(process.stderr.write(`auth method completed without terminal step; you may need to retry session/new
368
368
  `),{exitCode:0}):f.kind==="error"?(process.stderr.write(`${f.message}
369
369
  `),{exitCode:1}):(process.stderr.write(`auth process exited with code ${f.exitCode}
@@ -385,25 +385,25 @@ ${s.join(`
385
385
  `),process.exit(2));let e=await Re(`/v1/auth/sessions/${t}`,{method:"DELETE"});if(e.status===204){process.stdout.write(`Revoked ${t}
386
386
  `);return}e.status===404&&(process.stderr.write(`No session token with id ${t}
387
387
  `),process.exit(1)),process.stderr.write(`Daemon returned HTTP ${e.status}
388
- `),process.exit(1)}function id(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}import*as ws from"fs";qe();Ds();Ys();Il();yt();var od=class{contexts=new Map;pending=new Map;pendingPermissions=new Map;pendingPermissionsByToolCall=new Map;lastMessageIds=new Map;observeFromClient(e){if(kl(e)){if(e.id===null)return;let n=this.pendingPermissions.get(e.id);n&&this.deletePendingPermission(n);return}if(Sl(e)){if(e.method==="session/new"){let n=e.params??{},s=typeof n.cwd=="string"?n.cwd:"";this.pending.set(e.id,{kind:"new",data:{cwd:s}});return}if(e.method==="session/attach"){let n=e.params??{},s=typeof n.sessionId=="string"?n.sessionId:"";this.pending.set(e.id,{kind:"attach",data:{sessionId:s}});return}if(e.method==="session/load"||e.method==="session/resume"){let n=e.params??{},s=typeof n.sessionId=="string"?n.sessionId:"",r=typeof n.cwd=="string"?n.cwd:"";this.pending.set(e.id,{kind:"load",data:{sessionId:s,cwd:r}})}}}observeFromServer(e){if(!Sl(e)&&!kl(e)&&"method"in e){if(e.method==="session/update"){let f=e.params??{},u=typeof f.sessionId=="string"?f.sessionId:void 0,p=typeof f.update?.messageId=="string"?f.update.messageId:void 0;u&&p&&this.lastMessageIds.set(u,p)}return}if(Sl(e)){if(e.method==="session/request_permission"){let f=e.params??{},u=typeof f.sessionId=="string"?f.sessionId:void 0;if(u){let p=f.toolCall,m=p&&typeof p.toolCallId=="string"?p.toolCallId:void 0,g={requestId:e.id,sessionId:u,toolCallId:m,params:f};if(this.pendingPermissions.set(e.id,g),m){let y=this.pendingPermissionsByToolCall.get(m);y?y.push(e.id):this.pendingPermissionsByToolCall.set(m,[e.id])}}}return}if(!kl(e)||e.id===null)return;if(e.error){this.pending.delete(e.id);return}let n=this.pending.get(e.id);if(!n)return;this.pending.delete(e.id);let s=e.result??{},r=typeof s.sessionId=="string"?s.sessionId:void 0;if(!r)return;let i=s._meta,o=Mt(i),a=o.upstreamSessionId,d=o.agentId,c="";(n.kind==="new"||n.kind==="load")&&(c=n.data.cwd);let l=o.cwd??c;!a||!d||!l||this.contexts.set(r,{sessionId:r,upstreamSessionId:a,agentId:d,cwd:l,title:o.title,agentArgs:o.agentArgs})}list(){return[...this.contexts.values()]}forget(e){this.contexts.delete(e),this.lastMessageIds.delete(e)}lastMessageId(e){return this.lastMessageIds.get(e)}clearPending(){this.pending.clear()}takePendingPermissions(){let e=[...this.pendingPermissions.values()];return this.pendingPermissions.clear(),this.pendingPermissionsByToolCall.clear(),e}takePendingPermission(e){let n=this.pendingPermissions.get(e);return n&&this.deletePendingPermission(n),n}takePendingPermissionByToolCall(e){let n=this.pendingPermissionsByToolCall.get(e);if(!n||n.length===0)return;let s=n[0],r=this.pendingPermissions.get(s);return r&&this.deletePendingPermission(r),r}deletePendingPermission(e){if(this.pendingPermissions.delete(e.requestId),e.toolCallId){let n=this.pendingPermissionsByToolCall.get(e.toolCallId);if(n){let s=n.indexOf(e.requestId);s>=0&&n.splice(s,1),n.length===0&&this.pendingPermissionsByToolCall.delete(e.toolCallId)}}}};function Sl(t){return"method"in t&&"id"in t&&t.id!==void 0}function kl(t){return!("method"in t)&&"id"in t}dd();_t();ge();Mi();import{writeFileSync as Jk}from"fs";var zk=t=>{Jk("/proc/self/comm",t)};function ui(t,e={}){if(process.title=t,(e.platform??process.platform)!=="linux")return;let s=e.writeComm??zk;try{s(e.commName??cn())}catch{}}function fi(t,e=cn()){return t.length===0?e:`${e} ${t.join(" ")}`}async function ld(t){ui(fi(process.argv.slice(2)),{commName:"hydra-shim"});let e=await ye(),n=t.target??await Dt(e);n.isLocal&&!t.target&&await fs(e);let s=new od,r=Go(process.stdin,process.stdout),i=n.wsUrl,o=["acp.v1",`hydra-acp-token.${n.token}`],a=new li({url:i,subprotocols:o,onConnect:async d=>{if(d)return;s.clearPending(),await Xk(s,r);let c=s.list();if(c.length!==0){process.stderr.write(`hydra-acp: reconnected; resuming ${c.length} session(s)
388
+ `),process.exit(1)}function id(t,e){let n=t.length;for(let s of e)s.length>n&&(n=s.length);return n}import*as ws from"fs";je();Ds();Ys();Il();yt();var od=class{contexts=new Map;pending=new Map;pendingPermissions=new Map;pendingPermissionsByToolCall=new Map;lastMessageIds=new Map;observeFromClient(e){if(kl(e)){if(e.id===null)return;let n=this.pendingPermissions.get(e.id);n&&this.deletePendingPermission(n);return}if(Sl(e)){if(e.method==="session/new"){let n=e.params??{},s=typeof n.cwd=="string"?n.cwd:"";this.pending.set(e.id,{kind:"new",data:{cwd:s}});return}if(e.method==="session/attach"){let n=e.params??{},s=typeof n.sessionId=="string"?n.sessionId:"";this.pending.set(e.id,{kind:"attach",data:{sessionId:s}});return}if(e.method==="session/load"||e.method==="session/resume"){let n=e.params??{},s=typeof n.sessionId=="string"?n.sessionId:"",r=typeof n.cwd=="string"?n.cwd:"";this.pending.set(e.id,{kind:"load",data:{sessionId:s,cwd:r}})}}}observeFromServer(e){if(!Sl(e)&&!kl(e)&&"method"in e){if(e.method==="session/update"){let f=e.params??{},u=typeof f.sessionId=="string"?f.sessionId:void 0,p=typeof f.update?.messageId=="string"?f.update.messageId:void 0;u&&p&&this.lastMessageIds.set(u,p)}return}if(Sl(e)){if(e.method==="session/request_permission"){let f=e.params??{},u=typeof f.sessionId=="string"?f.sessionId:void 0;if(u){let p=f.toolCall,m=p&&typeof p.toolCallId=="string"?p.toolCallId:void 0,g={requestId:e.id,sessionId:u,toolCallId:m,params:f};if(this.pendingPermissions.set(e.id,g),m){let y=this.pendingPermissionsByToolCall.get(m);y?y.push(e.id):this.pendingPermissionsByToolCall.set(m,[e.id])}}}return}if(!kl(e)||e.id===null)return;if(e.error){this.pending.delete(e.id);return}let n=this.pending.get(e.id);if(!n)return;this.pending.delete(e.id);let s=e.result??{},r=typeof s.sessionId=="string"?s.sessionId:void 0;if(!r)return;let i=s._meta,o=Mt(i),a=o.upstreamSessionId,d=o.agentId,c="";(n.kind==="new"||n.kind==="load")&&(c=n.data.cwd);let l=o.cwd??c;!a||!d||!l||this.contexts.set(r,{sessionId:r,upstreamSessionId:a,agentId:d,cwd:l,title:o.title,agentArgs:o.agentArgs})}list(){return[...this.contexts.values()]}forget(e){this.contexts.delete(e),this.lastMessageIds.delete(e)}lastMessageId(e){return this.lastMessageIds.get(e)}clearPending(){this.pending.clear()}takePendingPermissions(){let e=[...this.pendingPermissions.values()];return this.pendingPermissions.clear(),this.pendingPermissionsByToolCall.clear(),e}takePendingPermission(e){let n=this.pendingPermissions.get(e);return n&&this.deletePendingPermission(n),n}takePendingPermissionByToolCall(e){let n=this.pendingPermissionsByToolCall.get(e);if(!n||n.length===0)return;let s=n[0],r=this.pendingPermissions.get(s);return r&&this.deletePendingPermission(r),r}deletePendingPermission(e){if(this.pendingPermissions.delete(e.requestId),e.toolCallId){let n=this.pendingPermissionsByToolCall.get(e.toolCallId);if(n){let s=n.indexOf(e.requestId);s>=0&&n.splice(s,1),n.length===0&&this.pendingPermissionsByToolCall.delete(e.toolCallId)}}}};function Sl(t){return"method"in t&&"id"in t&&t.id!==void 0}function kl(t){return!("method"in t)&&"id"in t}dd();_t();ge();Mi();import{writeFileSync as Jk}from"fs";var zk=t=>{Jk("/proc/self/comm",t)};function ui(t,e={}){if(process.title=t,(e.platform??process.platform)!=="linux")return;let s=e.writeComm??zk;try{s(e.commName??cn())}catch{}}function fi(t,e=cn()){return t.length===0?e:`${e} ${t.join(" ")}`}async function ld(t){ui(fi(process.argv.slice(2)),{commName:"hydra-shim"});let e=await ye(),n=t.target??await Dt(e);n.isLocal&&!t.target&&await fs(e);let s=new od,r=Go(process.stdin,process.stdout),i=n.wsUrl,o=["acp.v1",`hydra-acp-token.${n.token}`],a=new li({url:i,subprotocols:o,onConnect:async d=>{if(d)return;s.clearPending(),await Xk(s,r);let c=s.list();if(c.length!==0){process.stderr.write(`hydra-acp: reconnected; resuming ${c.length} session(s)
389
389
  `);for(let l of c)await Zk(a,l,s.lastMessageId(l.sessionId))}}});Kk({opts:t,upstream:a,downstream:r,tracker:s}),a.onClose(d=>{d&&process.stderr.write(`hydra-acp: ${d.message}
390
390
  `),r.close(),process.exit(d?1:0)}),r.onClose(()=>{(async()=>(await Promise.race([a.close().catch(()=>{}),new Promise(c=>setTimeout(c,1e3))]),process.exit(0)))()}),await a.start()}function Kk({opts:t,upstream:e,downstream:n,tracker:s}){e.onMessage(i=>{if(Gm("daemon\u2192client",i),s.observeFromServer(i),t.dangerouslySkipPermissions===!0&&sx(i)){e.send({jsonrpc:"2.0",id:i.id,result:rr(i.params)});return}Vk(i,s,n),n.send(i)});let r={name:t.name,used:!1};n.onMessage(i=>{if(Gm("client\u2192daemon",i),s.observeFromClient(i),tx(i)){e.send(nx(i));return}if(ex(i)){if(t.sessionId){e.send(rx(i,t.sessionId));return}let o=i;t.agentId&&(o=cd(o,{agentId:t.agentId})),t.agentArgs&&t.agentArgs.length>0&&(o=cd(o,{agentArgs:t.agentArgs})),r.name&&!r.used&&(o=cd(o,{title:r.name}),r.used=!0),t.model&&(o=cd(o,{model:t.model})),e.send(o);return}e.send(i)})}function Vk(t,e,n){let s=Yk(t);if(!s)return;let r=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(!r)return;let i=e.takePendingPermissionByToolCall(r);if(!i)return;let o=Qk(s);n.send({jsonrpc:"2.0",id:i.requestId,result:o?{outcome:o}:null}).catch(()=>{})}function Yk(t){if(!Gk(t))return;let n=(t.params??{}).update;if(!(!n||typeof n!="object"||n.sessionUpdate!=="permission_resolved"))return n}function Gk(t){return"method"in t&&t.method==="session/update"&&!("id"in t&&t.id!==void 0)}function Qk(t){if(t.outcome&&typeof t.outcome=="object")return t.outcome;if(typeof t.chosenOptionId=="string")return{kind:"selected",optionId:t.chosenOptionId}}async function Xk(t,e){let n=t.takePendingPermissions();if(n.length!==0){process.stderr.write(`hydra-acp: cancelling ${n.length} pending permission request(s)
391
391
  `);for(let s of n){let r=typeof s.params.sessionId=="string"?s.params.sessionId:void 0;if(!r)continue;let i={sessionUpdate:"permission_resolved",outcome:{kind:"cancelled",reason:"daemon-disconnected"},resolvedBy:{clientId:"hydra-acp"}};s.toolCallId&&(i.toolCallId=s.toolCallId),await e.send({jsonrpc:"2.0",method:"session/update",params:{sessionId:r,update:i}}).catch(()=>{})}}}async function Zk(t,e,n){let s={upstreamSessionId:e.upstreamSessionId,agentId:e.agentId,cwd:e.cwd};e.title!==void 0&&(s.title=e.title),e.agentArgs&&e.agentArgs.length>0&&(s.agentArgs=e.agentArgs);let r={sessionId:e.sessionId,_meta:{"hydra-acp":{resume:s}}};n?(r.historyPolicy="after_message",r.afterMessageId=n):r.historyPolicy="pending_only";let i={jsonrpc:"2.0",id:`resume-${e.sessionId}-${Date.now()}`,method:"session/attach",params:r};try{let o=await t.request(i);o.error&&process.stderr.write(`hydra-acp: replay attach for ${e.sessionId} failed: ${o.error.message}
392
392
  `)}catch(o){process.stderr.write(`hydra-acp: failed to replay attach for ${e.sessionId}: ${o.message}
393
393
  `)}}function ex(t){return"method"in t&&"id"in t&&t.id!==void 0&&t.method==="session/new"}function tx(t){return"method"in t&&"id"in t&&t.id!==void 0&&t.method==="initialize"}function nx(t){let e=t.params??{},n=e.clientInfo,s=n&&typeof n=="object"&&!Array.isArray(n)?n:void 0;return(s&&typeof s.name=="string"?s.name.trim():"").length>0?t:{...t,params:{...e,clientInfo:{...s??{},name:"hydra-acp-shim",version:fe}}}}function sx(t){return"method"in t&&"id"in t&&t.id!==void 0&&t.method==="session/request_permission"}function rx(t,e){return{jsonrpc:"2.0",id:t.id,method:"session/attach",params:{sessionId:e,historyPolicy:"full"}}}var ix=25*1024*1024,Ym=!1,ir=null;function Gm(t,e){if(process.env.HYDRA_SHIM_WIRE_LOG){if(!Ym){Ym=!0;try{ir=M.shimWireLogFile(),ws.mkdirSync(M.home(),{recursive:!0});let n=ws.statSync(ir,{throwIfNoEntry:!1});n&&n.size>ix&&ws.renameSync(ir,`${ir}.1`)}catch{ir=null}}if(ir)try{let n=JSON.stringify({t:new Date().toISOString(),pid:process.pid,dir:t,msg:e})+`
394
- `;ws.appendFile(ir,n,()=>{})}catch{}}}function cd(t,e){let n=t.params??{},s=n._meta??{},r=s["hydra-acp"]??{};return{...t,params:{...n,_meta:{...s,"hydra-acp":{...r,...e}}}}}Us();qr();eo();qe();Ds();Ys();cs();yt();_t();dd();import{mkdtempSync as gx,rmSync as yx}from"fs";import{tmpdir as wx}from"os";import{join as bx}from"path";function Qm(t){let e="",n=!1,s=!1,r=!1,i=()=>{if(e.length===0)return;let a=e;e="",t.onChunk(a)},o=()=>{s||(s=!0,n=!1,t.scheduleFlushCheck(()=>{if(s=!1,n){o();return}i()}))};return{feed(a){r||a.length===0||(e+=a,s?n=!0:o())},eof(){r||(r=!0,i())}}}ni();import ox from"chalk";import ax from"strip-ansi";var ud=new ox.Instance({level:3});function Xm(t,e){if(t.length===0)return"";let n=gs(t);if(n.length===0)return"";let s=[];for(let i of n)s.push(dx(i,e));let r=s.join(`
394
+ `;ws.appendFile(ir,n,()=>{})}catch{}}}function cd(t,e){let n=t.params??{},s=n._meta??{},r=s["hydra-acp"]??{};return{...t,params:{...n,_meta:{...s,"hydra-acp":{...r,...e}}}}}Us();qr();eo();je();Ds();Ys();cs();yt();_t();dd();import{mkdtempSync as gx,rmSync as yx}from"fs";import{tmpdir as wx}from"os";import{join as bx}from"path";function Qm(t){let e="",n=!1,s=!1,r=!1,i=()=>{if(e.length===0)return;let a=e;e="",t.onChunk(a)},o=()=>{s||(s=!0,n=!1,t.scheduleFlushCheck(()=>{if(s=!1,n){o();return}i()}))};return{feed(a){r||a.length===0||(e+=a,s?n=!0:o())},eof(){r||(r=!0,i())}}}ni();import ox from"chalk";import ax from"strip-ansi";var ud=new ox.Instance({level:3});function Xm(t,e){if(t.length===0)return"";let n=gs(t);if(n.length===0)return"";let s=[];for(let i of n)s.push(dx(i,e));let r=s.join(`
395
395
  `);return r.endsWith(`
396
396
  `)||(r+=`
397
397
  `),r}function dx(t,e){let n=hx(t.body,e);return e==="ansi"?n=mx(n,t.bodyStyle):n=ax(n),n}var cx="\x1B[1m",lx="\x1B[96m",ux="\x1B[93m",fx="\x1B[0m",px="\0";function hx(t,e){let n=t.replace(/\^\^/g,px);return e==="ansi"&&(n=n.replace(/\^\+/g,cx).replace(/\^C/g,lx).replace(/\^Y/g,ux).replace(/\^:/g,fx)),n=n.replace(/\^[+\-:CcKY]/g,""),n=n.replace(/\x00/g,"^"),n}function mx(t,e){if(t.length===0||e===void 0)return t;switch(e){case"heading-1":return ud.bold.yellowBright(t);case"heading-2":return ud.bold.cyanBright(t);case"heading-3":return ud.bold(t);case"dim":return ud.dim(t);default:return t}}var vx=1*1024*1024,Zm="mcp__hydra-acp-stdin__";function eg(t,e){return{sessionId:t,prompt:e,_meta:{[lt]:{ancillary:!0}}}}function Ix(t){if(t)for(let e of t.split(/\r?\n/)){let n=e.trim();if(n)return n.length>80?`${n.slice(0,80)}\u2026`:n}}function Sx(t){if(!t||typeof t!="object")return!1;let e=t.toolCall;if(!e||typeof e!="object")return!1;let n=e.title;if(typeof n=="string"&&n.startsWith(Zm))return!0;let s=e.toolName;return!!(typeof s=="string"&&s.startsWith(Zm))}async function tg(t){if(ui(fi(process.argv.slice(2))),process.stdin.isTTY&&!t.prompt&&!t.sessionId){process.stderr.write(`hydra-acp cat: nothing to send. Pipe input on stdin, pass -p <text>, or attach to an existing session with --session.
398
- `),process.exit(2);return}if(!t.sessionId&&t.cwd===void 0&&process.stdin.isTTY!==!0){let d=gx(bx(wx(),"hydra-cat-"));t.cwd=d,t.detach||process.once("exit",()=>{try{yx(d,{recursive:!0,force:!0})}catch{}})}let e=await ye(),n=t.target??await Dt(e);n.isLocal&&!t.target&&await fs(e);let s=["acp.v1",`hydra-acp-token.${n.token}`],r=await Gs(n.wsUrl,s),i=wn(r),o=new kt(i),a=await xx({conn:o,opts:t,stdin:process.stdin,stdinIsTty:process.stdin.isTTY===!0,stdoutIsTty:process.stdout.isTTY===!0,stdout:d=>process.stdout.write(d),stderr:d=>{process.stderr.write(d)},streamClient:kx(n.baseUrl,n.token)});process.exit(a.exitCode)}function kx(t,e){let n={"Content-Type":"application/json",Authorization:`Bearer ${e}`},s=(r,i)=>`${t}/v1/sessions/${encodeURIComponent(r)}/stdin${i}`;return{async open(r,i){let o=await fetch(s(r,"/open"),{method:"POST",headers:n,body:JSON.stringify(i)});if(!o.ok)throw new Error(`stdin/open HTTP ${o.status}`);return await o.json()},async write(r,i,o){let a=await fetch(s(r,""),{method:"POST",headers:n,body:JSON.stringify({chunk:i,eof:o})});if(!a.ok)throw new Error(`stdin write HTTP ${a.status}`)}}}async function xx(t){let{conn:e,opts:n,stdin:s,stdinIsTty:r,stdoutIsTty:i,stdout:o,stderr:a}=t,d=i?"ansi":"plain",c=n.raw===!0,l=!r&&n.sessionId===void 0&&n.follow!==!0;e.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}})),e.onRequest("session/request_permission",async Q=>n.dangerouslySkipPermissions?rr(Q):Sx(Q)?rr(Q):zm(Q));try{await e.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:js,version:fe}})}catch{}let f=await Rx(e,n,l),u=!1,p=!0,m="",g=0,y=Q=>{Q.length!==0&&(o(Q),p=Q.charCodeAt(Q.length-1)===10,u=!0)},v=()=>{if(c||m.length===0)return;let Q=Xm(m,d);if(m="",Q.length===0)return;let oe=g>0?`
399
- `:"";y(oe+Q),g+=1},b=()=>{v(),u&&!p&&y(`
400
- `),u=!1};e.onNotification("session/update",Q=>{let oe=Q?.update,Oe=yn(oe,{cwd:n.cwd});if(Oe){if(Oe.kind==="agent-text"){c?y(Oe.text):m+=Oe.text;return}if(Oe.kind==="turn-complete"){b();return}switch(Oe.kind){case"agent-thought":case"tool-call":case"tool-call-update":case"exit-plan-mode":case"plan":case"mode-changed":case"user-text":v();return;default:return}}});let k=!1,R=async Q=>{let oe=[];if(n.prompt&&!k&&oe.push({type:"text",text:n.prompt}),Q.length>0&&oe.push({type:"text",text:Q}),oe.length!==0){try{await e.request("session/prompt",eg(f,oe)),k=!0}catch(Oe){a(`hydra-acp cat: prompt failed: ${Oe.message}
401
- `);return}b()}},H=0,z,K=new Promise(Q=>{z=Q}),J=!1,W=async Q=>{J||(J=!0,b(),n.detach||await Promise.race([(async()=>e.request("session/detach",{sessionId:f}))().catch(()=>{}),new Promise(Oe=>setTimeout(Oe,500))]),await e.close().catch(()=>{}),z({exitCode:Q}))};e.onClose(Q=>{Q&&(a(`hydra-acp cat: ${Q.message}
402
- `),H=1),J||(J=!0,b(),z({exitCode:H}))});let F=[],U=!1,Y=!1,te=async()=>{if(!U){U=!0;try{for(;F.length>0;){let Q=F.shift();if(Q===void 0)break;await R(Q)}}finally{U=!1,Y&&F.length===0&&await W(H)}}};if(r&&!n.sessionId)return n.prompt&&await R(""),await W(0),K;if(l)return typeof s.setEncoding=="function"&&s.setEncoding("utf8"),Ax({conn:e,streamClient:t.streamClient,sessionId:f,opts:n,stdin:s,stderr:a,sendInline:R,onEof:()=>{Y=!0,!U&&F.length===0&&W(H)},onError:Q=>{a(`hydra-acp cat: stdin error: ${Q.message}
403
- `),H=1,Y=!0,!U&&F.length===0&&W(H)},onPromptFailed:Q=>{a(`hydra-acp cat: ${Q.message}
404
- `),H=1,Y=!0,!U&&F.length===0&&W(H)}}),K;if(typeof s.setEncoding=="function"&&s.setEncoding("utf8"),n.follow===!0||r&&!!n.sessionId){let Q=Qm({scheduleFlushCheck:oe=>{let Oe=setImmediate(oe);return()=>clearImmediate(Oe)},onChunk:oe=>{F.push(oe),te()}});return s.on("data",oe=>{Q.feed(typeof oe=="string"?oe:oe.toString("utf8"))}),s.on("end",()=>{Q.eof(),Y=!0,!U&&F.length===0&&W(H)}),s.on("error",oe=>{a(`hydra-acp cat: stdin error: ${oe.message}
405
- `),H=1,Y=!0,!U&&F.length===0&&W(H)}),K}let ee="";return s.on("data",Q=>{ee+=typeof Q=="string"?Q:Q.toString("utf8")}),s.on("end",()=>{Y=!0,ee.length>0&&F.push(ee),te()}),s.on("error",Q=>{a(`hydra-acp cat: stdin error: ${Q.message}
406
- `),H=1,Y=!0,!U&&F.length===0&&W(H)}),K}function Ax(t){let{conn:e,streamClient:n,sessionId:s,opts:r,stdin:i,stderr:o,sendInline:a}=t,d=r.streamThreshold??vx,c="undecided",l=!1,f=[],u=0,p=!1,m=Promise.resolve(),g=(b,k)=>{let R=b.toString("base64");m=m.then(()=>n.write(s,R,k)).catch(H=>{o(`hydra-acp cat: stdin write failed: ${H.message}
398
+ `),process.exit(2);return}if(!t.sessionId&&t.cwd===void 0&&process.stdin.isTTY!==!0){let d=gx(bx(wx(),"hydra-cat-"));t.cwd=d,t.detach||process.once("exit",()=>{try{yx(d,{recursive:!0,force:!0})}catch{}})}let e=await ye(),n=t.target??await Dt(e);n.isLocal&&!t.target&&await fs(e);let s=["acp.v1",`hydra-acp-token.${n.token}`],r=await Gs(n.wsUrl,s),i=wn(r),o=new kt(i),a=await xx({conn:o,opts:t,stdin:process.stdin,stdinIsTty:process.stdin.isTTY===!0,stdoutIsTty:process.stdout.isTTY===!0,stdout:d=>process.stdout.write(d),stderr:d=>{process.stderr.write(d)},streamClient:kx(n.baseUrl,n.token)});process.exit(a.exitCode)}function kx(t,e){let n={"Content-Type":"application/json",Authorization:`Bearer ${e}`},s=(r,i)=>`${t}/v1/sessions/${encodeURIComponent(r)}/stdin${i}`;return{async open(r,i){let o=await fetch(s(r,"/open"),{method:"POST",headers:n,body:JSON.stringify(i)});if(!o.ok)throw new Error(`stdin/open HTTP ${o.status}`);return await o.json()},async write(r,i,o){let a=await fetch(s(r,""),{method:"POST",headers:n,body:JSON.stringify({chunk:i,eof:o})});if(!a.ok)throw new Error(`stdin write HTTP ${a.status}`)}}}async function xx(t){let{conn:e,opts:n,stdin:s,stdinIsTty:r,stdoutIsTty:i,stdout:o,stderr:a}=t,d=i?"ansi":"plain",c=n.raw===!0,l=!r&&n.sessionId===void 0&&n.follow!==!0;e.setDefaultHandler(async()=>({error:{code:-32601,message:"method not implemented"}})),e.onRequest("session/request_permission",async Q=>n.dangerouslySkipPermissions?rr(Q):Sx(Q)?rr(Q):zm(Q));try{await e.request("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1},clientInfo:{name:js,version:fe}})}catch{}let f=await Rx(e,n,l),u=!1,p=!0,m="",g=0,y=Q=>{Q.length!==0&&(o(Q),p=Q.charCodeAt(Q.length-1)===10,u=!0)},v=()=>{if(c||m.length===0)return;let Q=Xm(m,d);if(m="",Q.length===0)return;let ue=g>0?`
399
+ `:"";y(ue+Q),g+=1},b=()=>{v(),u&&!p&&y(`
400
+ `),u=!1};e.onNotification("session/update",Q=>{let ue=Q?.update,Je=yn(ue,{cwd:n.cwd});if(Je){if(Je.kind==="agent-text"){c?y(Je.text):m+=Je.text;return}if(Je.kind==="turn-complete"){b();return}switch(Je.kind){case"agent-thought":case"tool-call":case"tool-call-update":case"exit-plan-mode":case"plan":case"mode-changed":case"user-text":v();return;default:return}}});let k=!1,R=async Q=>{let ue=[];if(n.prompt&&!k&&ue.push({type:"text",text:n.prompt}),Q.length>0&&ue.push({type:"text",text:Q}),ue.length!==0){try{await e.request("session/prompt",eg(f,ue)),k=!0}catch(Je){a(`hydra-acp cat: prompt failed: ${Je.message}
401
+ `);return}b()}},H=0,q,K=new Promise(Q=>{q=Q}),z=!1,W=async Q=>{z||(z=!0,b(),n.detach||await Promise.race([(async()=>e.request("session/detach",{sessionId:f}))().catch(()=>{}),new Promise(Je=>setTimeout(Je,500))]),await e.close().catch(()=>{}),q({exitCode:Q}))};e.onClose(Q=>{Q&&(a(`hydra-acp cat: ${Q.message}
402
+ `),H=1),z||(z=!0,b(),q({exitCode:H}))});let O=[],U=!1,V=!1,se=async()=>{if(!U){U=!0;try{for(;O.length>0;){let Q=O.shift();if(Q===void 0)break;await R(Q)}}finally{U=!1,V&&O.length===0&&await W(H)}}};if(r&&!n.sessionId)return n.prompt&&await R(""),await W(0),K;if(l)return typeof s.setEncoding=="function"&&s.setEncoding("utf8"),Ax({conn:e,streamClient:t.streamClient,sessionId:f,opts:n,stdin:s,stderr:a,sendInline:R,onEof:()=>{V=!0,!U&&O.length===0&&W(H)},onError:Q=>{a(`hydra-acp cat: stdin error: ${Q.message}
403
+ `),H=1,V=!0,!U&&O.length===0&&W(H)},onPromptFailed:Q=>{a(`hydra-acp cat: ${Q.message}
404
+ `),H=1,V=!0,!U&&O.length===0&&W(H)}}),K;if(typeof s.setEncoding=="function"&&s.setEncoding("utf8"),n.follow===!0||r&&!!n.sessionId){let Q=Qm({scheduleFlushCheck:ue=>{let Je=setImmediate(ue);return()=>clearImmediate(Je)},onChunk:ue=>{O.push(ue),se()}});return s.on("data",ue=>{Q.feed(typeof ue=="string"?ue:ue.toString("utf8"))}),s.on("end",()=>{Q.eof(),V=!0,!U&&O.length===0&&W(H)}),s.on("error",ue=>{a(`hydra-acp cat: stdin error: ${ue.message}
405
+ `),H=1,V=!0,!U&&O.length===0&&W(H)}),K}let ne="";return s.on("data",Q=>{ne+=typeof Q=="string"?Q:Q.toString("utf8")}),s.on("end",()=>{V=!0,ne.length>0&&O.push(ne),se()}),s.on("error",Q=>{a(`hydra-acp cat: stdin error: ${Q.message}
406
+ `),H=1,V=!0,!U&&O.length===0&&W(H)}),K}function Ax(t){let{conn:e,streamClient:n,sessionId:s,opts:r,stdin:i,stderr:o,sendInline:a}=t,d=r.streamThreshold??vx,c="undecided",l=!1,f=[],u=0,p=!1,m=Promise.resolve(),g=(b,k)=>{let R=b.toString("base64");m=m.then(()=>n.write(s,R,k)).catch(H=>{o(`hydra-acp cat: stdin write failed: ${H.message}
407
407
  `)})},y=async()=>{c="inline";let b=Buffer.concat(f,u).toString("utf8");f=[],u=0;try{await a(b)}catch(k){t.onPromptFailed(k);return}t.onEof()},v=async()=>{c="pivoting";let b;try{let H={mode:"memory"};r.streamBufferBytes!==void 0&&(H.capacityBytes=r.streamBufferBytes),b=await n.open(s,H)}catch(H){t.onPromptFailed(new Error(`stdin/open failed: ${H.message}`));return}u>0&&(g(Buffer.concat(f,u),!1),f=[],u=0),c="file",l&&(l=!1,g(Buffer.alloc(0),!0)),await m.catch(()=>{});let k=Cx(r.prompt,b.capacityBytes);e.request("session/prompt",eg(s,[{type:"text",text:k}])).catch(H=>{t.onPromptFailed(new Error(`prompt failed: ${H.message}`))}).then(()=>{p||g(Buffer.alloc(0),!0),t.onEof()})};i.on("data",b=>{let k=typeof b=="string"?Buffer.from(b,"utf8"):b;if(c==="undecided"){f.push(k),u+=k.length,u>d&&v();return}if(c==="pivoting"){f.push(k),u+=k.length;return}if(c==="file"){g(k,!1);return}f.push(k),u+=k.length}),i.on("end",()=>{if(p=!0,c==="undecided"){y();return}if(c==="pivoting"){l=!0;return}c==="file"&&g(Buffer.alloc(0),!0)}),i.on("error",t.onError)}function Cx(t,e){let s=`The user has piped data into this session. The bytes are NOT in your prompt; they live in the \`hydra-acp-stdin\` MCP server and you read them via its tools:
408
408
  - \`info()\` \u2014 current writeCursor / oldestAvailable / capacity / closed. Cheap; call first to see how much data is there.
409
409
  - \`grep({pattern, regex?, case_insensitive?, context_before?, context_after?, cursor?})\` \u2014 server-side line filter; returns matching lines as decoded strings (not base64). Prefer this for "find lines that mention X" questions on multi-MB inputs.
@@ -419,7 +419,7 @@ Use those tools NOW to answer the user's question \u2014 do not ask whether to c
419
419
  User's question:
420
420
  ${t}`:`${s}
421
421
 
422
- Use those tools to inspect the piped input and report what's there. Start with \`info()\` to see the size, then \`head\` and/or \`tail\` to look at the bytes.`}async function Rx(t,e,n){if(e.sessionId)return(await t.request("session/attach",{sessionId:e.sessionId,historyPolicy:"pending_only",clientInfo:{name:js,version:fe}})).sessionId;let s={};if(e.name)s.title=e.name;else{let a=Ix(e.prompt);a&&(s.title=a)}e.model&&(s.model=e.model),n&&(s.mcpStdin=!0);let i={cwd:e.cwd??process.cwd()};e.agentId&&(s.agentId=e.agentId),Object.keys(s).length>0&&(i._meta={[lt]:s});let o=await t.request("session/new",i);return Mt(o._meta),o.sessionId}qe();ge();function fd(t){let e=t.split(".").filter(n=>n.length>0);if(e.length===0)throw new Error("config key must be a non-empty dotted path");return e}function ng(t,e){let n=t;for(let s of e){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[s]}return n}function Tx(t){try{return JSON.parse(t)}catch{return t}}function sg(t){return t===void 0?"":typeof t=="string"?t:JSON.stringify(t,null,2)}async function rg(t){t||(process.stderr.write(`usage: hydra-acp config get <dotted.key>
422
+ Use those tools to inspect the piped input and report what's there. Start with \`info()\` to see the size, then \`head\` and/or \`tail\` to look at the bytes.`}async function Rx(t,e,n){if(e.sessionId)return(await t.request("session/attach",{sessionId:e.sessionId,historyPolicy:"pending_only",clientInfo:{name:js,version:fe}})).sessionId;let s={};if(e.name)s.title=e.name;else{let a=Ix(e.prompt);a&&(s.title=a)}e.model&&(s.model=e.model),n&&(s.mcpStdin=!0);let i={cwd:e.cwd??process.cwd()};e.agentId&&(s.agentId=e.agentId),Object.keys(s).length>0&&(i._meta={[lt]:s});let o=await t.request("session/new",i);return Mt(o._meta),o.sessionId}je();ge();function fd(t){let e=t.split(".").filter(n=>n.length>0);if(e.length===0)throw new Error("config key must be a non-empty dotted path");return e}function ng(t,e){let n=t;for(let s of e){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[s]}return n}function Tx(t){try{return JSON.parse(t)}catch{return t}}function sg(t){return t===void 0?"":typeof t=="string"?t:JSON.stringify(t,null,2)}async function rg(t){t||(process.stderr.write(`usage: hydra-acp config get <dotted.key>
423
423
  `),process.exit(2));let e=fd(t),n=await ye(),s=ng(n,e);s===void 0&&(process.stderr.write(`config: key '${t}' is unset
424
424
  `),process.exit(1)),process.stdout.write(`${sg(s)}
425
425
  `)}async function ig(t,e){(!t||e===void 0)&&(process.stderr.write(`usage: hydra-acp config set <dotted.key> <value>
@@ -431,7 +431,7 @@ Use those tools to inspect the piped input and report what's there. Start with \
431
431
  `)}async function ag(t){let e=await ye(),n=t?ng(e,fd(t)):e;n===void 0&&(process.stderr.write(`config: key '${t}' is unset
432
432
  `),process.exit(1)),process.stdout.write(`${JSON.stringify(n,null,2)}
433
433
  `)}function dg(){process.stdout.write(`${M.config()}
434
- `)}qe();Fn();Ys();_t();ps();async function ug(t={}){let{report:e,configLoaded:n}=await Ex();if(t.json){process.stdout.write(JSON.stringify(e,null,2)+`
434
+ `)}je();Fn();Ys();_t();ps();async function ug(t={}){let{report:e,configLoaded:n}=await Ex();if(t.json){process.stdout.write(JSON.stringify(e,null,2)+`
435
435
  `);return}process.stdout.write(`CLI: ${e.cli}
436
436
  `),n&&(process.stdout.write(`Daemon: ${e.daemon??(e.daemonReachable?"unknown":"not running")}
437
437
  `),e.daemonReachable&&(cg("Extensions",e.extensions),cg("Transformers",e.transformers)))}function cg(t,e){if(process.stdout.write(`
@@ -442,9 +442,9 @@ ${t}:
442
442
  `),process.exit(1)),typeof n.status=="number"&&process.exit(n.status),n.signal&&process.kill(process.pid,n.signal),process.exit(1)}function fg(t){let e=Nx(t);if(e===void 0||Bx(e))return!1;let n=Ux(e);if(n===void 0)return!1;jx(n,Dx(t))}xl();var Ss=!1,Sy=!1;function ky(t){!t||Sy||(Sy=!0,process.stderr.write(`hydra-acp: --dangerously-skip-permissions is set \u2014 all tool permission requests will be auto-approved.
443
443
  `))}async function AC(){let t=process.argv.slice(2),e=t.indexOf("launch");if(e!==-1){let y=t.slice(0,e),v=t.slice(e+1),b=v[0],k=v.slice(1),{flags:R}=Fd(y);if(Ay(R),R.reattach===!0){process.stderr.write(`hydra-acp launch: --reattach is not valid here. Pass --session <id-or-url> to attach to a specific session.
444
444
  `),process.exit(2);return}let H=b??tt(R,"agent");if(!H){process.stderr.write(`Usage: hydra-acp launch <agent> [agent-args...]
445
- `),process.exit(2);return}let z=await Cy(Kd(R),{allowPrompt:!1}),K=tt(R,"name"),J=tt(R,"model");Ss=!0;let W=R["dangerously-skip-permissions"]===!0;ky(W);let F={agentId:H,agentArgs:k,name:K,model:J,dangerouslySkipPermissions:W};z?.sessionId!==void 0&&(F.sessionId=z.sessionId),z?.target!==void 0&&z.fromUrl&&(F.target=z.target),await ld(F);return}tu(t)===void 0&&!t.some(y=>y==="--prompt"||y.startsWith("--prompt="))&&fg(t);let{positional:n,flags:s}=Fd(t);if(Ay(s),s.version===!0||n[0]==="--version"){process.stdout.write(`hydra-acp ${CC()}
445
+ `),process.exit(2);return}let q=await Cy(Kd(R),{allowPrompt:!1}),K=tt(R,"name"),z=tt(R,"model");Ss=!0;let W=R["dangerously-skip-permissions"]===!0;ky(W);let O={agentId:H,agentArgs:k,name:K,model:z,dangerouslySkipPermissions:W};q?.sessionId!==void 0&&(O.sessionId=q.sessionId),q?.target!==void 0&&q.fromUrl&&(O.target=q.target),await ld(O);return}tu(t)===void 0&&!t.some(y=>y==="--prompt"||y.startsWith("--prompt="))&&fg(t);let{positional:n,flags:s}=Fd(t);if(Ay(s),s.version===!0||n[0]==="--version"){process.stdout.write(`hydra-acp ${CC()}
446
446
  `);return}if(s.help===!0){su();return}let r=tu(t)!==void 0||typeof s.prompt=="string",i=n[0],o=i!==void 0&&!i.startsWith("-")?i:r?"cat":i,a=tt(s,"name"),d=tt(s,"agent"),c=tt(s,"model"),l=s["dangerously-skip-permissions"]===!0;ky(l);let f=Kd(s),u=o==="tui"||o===void 0&&process.stdout.isTTY,p=await Cy(f,{allowPrompt:u});p!==void 0&&p.sessionId!==void 0&&s.reattach===!0&&(process.stderr.write(`hydra-acp: --session <id> and --reattach are mutually exclusive. Use one or the other.
447
- `),process.exit(2));let m=p?.sessionId,g=p?.fromUrl?p.target:void 0;if(!o){if(process.stdout.isTTY){Ss=!0,await xy(s,{sessionId:m,agentId:d,name:a,model:c,target:g,dangerouslySkipPermissions:l});return}Ss=!0;let y={name:a,model:c,agentId:d,dangerouslySkipPermissions:l};m!==void 0&&(y.sessionId=m),g!==void 0&&(y.target=g),await ld(y);return}switch(o){case"shim":{Ss=!0;let y={name:a,model:c,agentId:d,dangerouslySkipPermissions:l};m!==void 0&&(y.sessionId=m),g!==void 0&&(y.target=g),await ld(y);return}case"cat":{let y=tu(t),v=typeof s.prompt=="string"?s.prompt:void 0,b=y??v,k=tt(s,"cwd"),R={prompt:b,sessionId:m,name:a,model:c,agentId:d,detach:s.detach===!0,follow:s.follow===!0,raw:s.raw===!0,dangerouslySkipPermissions:l};k!==void 0&&(R.cwd=k),g!==void 0&&(R.target=g);let H=nu(s,"stream-threshold");H!==void 0&&(R.streamThreshold=H);let z=nu(s,"stream-bytes");z!==void 0&&(R.streamBufferBytes=z),d!==void 0&&await hl(d),Ss=!0,await tg(R);return}case"version":{Ss=!0,await ug({json:s.json===!0});return}case"init":await Fu(s);return;case"daemon":{let y=t.indexOf("daemon"),v=t.slice(y+1),b=v[0];if(b===void 0||b==="status"){await gh();return}if(b==="start"){await fh(s);return}if(b==="stop"){await ph();return}if(b==="restart"){await hh();return}if(b==="log"||b==="logs"){await mh(v.slice(1));return}process.stderr.write(`Unknown daemon subcommand: ${b}
447
+ `),process.exit(2));let m=p?.sessionId,g=p?.fromUrl?p.target:void 0;if(!o){if(process.stdout.isTTY){Ss=!0,await xy(s,{sessionId:m,agentId:d,name:a,model:c,target:g,dangerouslySkipPermissions:l});return}Ss=!0;let y={name:a,model:c,agentId:d,dangerouslySkipPermissions:l};m!==void 0&&(y.sessionId=m),g!==void 0&&(y.target=g),await ld(y);return}switch(o){case"shim":{Ss=!0;let y={name:a,model:c,agentId:d,dangerouslySkipPermissions:l};m!==void 0&&(y.sessionId=m),g!==void 0&&(y.target=g),await ld(y);return}case"cat":{let y=tu(t),v=typeof s.prompt=="string"?s.prompt:void 0,b=y??v,k=tt(s,"cwd"),R={prompt:b,sessionId:m,name:a,model:c,agentId:d,detach:s.detach===!0,follow:s.follow===!0,raw:s.raw===!0,dangerouslySkipPermissions:l};k!==void 0&&(R.cwd=k),g!==void 0&&(R.target=g);let H=nu(s,"stream-threshold");H!==void 0&&(R.streamThreshold=H);let q=nu(s,"stream-bytes");q!==void 0&&(R.streamBufferBytes=q),d!==void 0&&await hl(d),Ss=!0,await tg(R);return}case"version":{Ss=!0,await ug({json:s.json===!0});return}case"init":await Fu(s);return;case"daemon":{let y=t.indexOf("daemon"),v=t.slice(y+1),b=v[0];if(b===void 0||b==="status"){await gh();return}if(b==="start"){await fh(s);return}if(b==="stop"){await ph();return}if(b==="restart"){await hh();return}if(b==="log"||b==="logs"){await mh(v.slice(1));return}process.stderr.write(`Unknown daemon subcommand: ${b}
448
448
  `),process.exit(2);return}case"session":case"sessions":{let y=n[1];if(y===void 0||y==="list"){let v=tt(s,"columns"),b;if(v!==void 0)try{b=Ch(v)}catch(k){process.stderr.write(`${k.message}
449
449
  `),process.exit(2);return}await Th({all:s.all===!0,json:s.json===!0,host:typeof s.host=="string"?s.host:void 0,includeNonInteractive:s["include-non-interactive"]===!0,columns:b});return}if(y==="info"){await Qh(n[2],{verbose:s.verbose===!0,json:s.json===!0,diff:s.diff===!0,fold:s.fold===!0,noColor:s["no-color"]===!0,noPager:s["no-pager"]===!0});return}if(y==="diff"){await Gh(n[2],{json:s.json===!0,noColor:s["no-color"]===!0,noPager:s["no-pager"]===!0,fold:s.fold===!0});return}if(y==="kill"){await Eh(n[2]);return}if(y==="remove"){await Ph(n[2]);return}if(y==="collect"){let v=tt(s,"max-age-days"),b=tt(s,"limit"),k={json:s.json===!0,keepUndecided:s["keep-undecided"]===!0};if(v!==void 0){let R=Number(v);if(!Number.isFinite(R)||R<0){process.stderr.write(`--max-age-days must be a non-negative number
450
450
  `),process.exit(2);return}k.maxAgeDays=R}if(b!==void 0){let R=Number(b);if(!Number.isFinite(R)||R<=0){process.stderr.write(`--limit must be a positive number