@hydra-acp/cli 0.1.182 → 0.1.183

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
@@ -28,7 +28,7 @@ var W$=Object.defineProperty;var j=(n,e)=>()=>(n&&(e=n(n=0)),e);var Bi=(n,e)=>{f
28
28
  `)}});import{statSync as FF}from"fs";import{delimiter as LF,join as NF}from"path";function nI(n){try{return FF(n).isFile()}catch{return!1}}function BF(n){let e=(n.PATHEXT??DF).split(";").map(r=>r.trim()).filter(r=>r.length>0),t=[];for(let r of e)for(let s of[r,r.toLowerCase(),r.toUpperCase()])t.includes(s)||t.push(s);return t}function HF(n,e){let t=n.toLowerCase();return e.some(r=>t.endsWith(r.toLowerCase()))}function UF(n,e={}){if((e.platform??process.platform)!=="win32")return n;let r=e.env??process.env,s=BF(r);if(HF(n,s))return n;if(/[\\/]/.test(n)){for(let i of s){let a=n+i;if(nI(a))return a}return n}let o=r.PATH??r.Path??"";for(let i of o.split(LF).filter(a=>a.length>0))for(let a of s){let d=NF(i,n+a);if(nI(d))return d}return n}function rI(n){if(WF.test(n))throw new Error(`cannot pass ${JSON.stringify(n)} through cmd.exe: it contains a quote, a percent sign, or a newline, none of which can be escaped unambiguously`);return/[\s&|<>^()]/.test(n)?`"${n}"`:n}function $d(n,e,t={}){let r=t.platform??process.platform,s=UF(n,t);return r!=="win32"||!/\.(cmd|bat)$/i.test(s)?{command:s,args:[...e],shell:!1}:{command:rI(s),args:e.map(rI),shell:!0}}var DF,WF,Bf=j(()=>{"use strict";DF=".COM;.EXE;.BAT;.CMD";WF=/["%\r\n]/});import*as or from"fs/promises";import*as As from"path";import{delimiter as jF}from"path";import{spawn as qF}from"child_process";function Hy(n){By=n??(e=>process.stderr.write(e+`
29
29
  `))}async function oI(n){let e=Ar();if(!e)throw new Error(`Agent ${n.agentId}: cannot determine platform key for ${process.platform}/${process.arch}`);let t=L.agentNpmInstallDir(n.agentId,e,n.version),r=VF(n.packageSpec),s=YF(r),o={installDir:t,packageName:r,hint:n.bin,basename:s},i=As.join(t,"node_modules",".bin",n.bin);if(await Zi(i))return i;if(await Zi(t)){let u=await sI(o);if(u)return u.binPath}await zF({agentId:n.agentId,version:n.version,packageSpec:n.packageSpec,installDir:t,registry:n.registry,onProgress:n.onProgress});let a=await sI(o);if(a)return a.binPath;let d=await aI(t,r),c=typeof d=="object"&&d!==null?Object.keys(d):typeof d=="string"?[s]:[],l=c.length>0?` (package declares bins: ${c.join(", ")})`:"";throw new Error(`Agent ${n.agentId}: npm install of ${n.packageSpec} did not produce bin ${n.bin} (looked in ${t}/node_modules/.bin/)${l}`)}async function zF(n){await or.mkdir(As.dirname(n.installDir),{recursive:!0});let e=await or.mkdtemp(`${n.installDir}.partial-`);try{By(`hydra-acp: installing ${n.packageSpec} for ${n.agentId} into ${e}`),Dy(n.onProgress,{phase:"install_start",agentId:n.agentId,version:n.version,packageSpec:n.packageSpec}),await JF({packageSpec:n.packageSpec,cwd:e,registry:n.registry});try{await or.rename(e,n.installDir)}catch(t){let r=t;if((r.code==="EEXIST"||r.code==="ENOTEMPTY")&&await Zi(n.installDir)){await or.rm(e,{recursive:!0,force:!0}).catch(()=>{}),Dy(n.onProgress,{phase:"installed",agentId:n.agentId,version:n.version});return}throw t}By(`hydra-acp: installed ${n.agentId} to ${n.installDir}`),Dy(n.onProgress,{phase:"installed",agentId:n.agentId,version:n.version})}catch(t){throw await or.rm(e,{recursive:!0,force:!0}).catch(()=>{}),t}}function Dy(n,e){if(n)try{n(e)}catch{}}function JF(n){return iI(n,0)}async function iI(n,e){try{await new Promise((t,r)=>{let s=n.registry?["--registry",n.registry]:[],o=$d("npm",["install","--no-audit","--no-fund","--silent",...s,n.packageSpec]),i;try{i=qF(o.command,o.args,{cwd:n.cwd,stdio:["ignore","pipe","pipe"],shell:o.shell,windowsHide:!0})}catch(d){r(d);return}let a="";i.stdout?.on("data",d=>{}),i.stderr?.setEncoding("utf8"),i.stderr?.on("data",d=>{a=(a+d).slice(-4096)}),i.on("error",d=>{if(d.code==="ENOENT"){let l=(process.env.PATH??process.env.Path??"").split(jF).filter(u=>u.length>0);r(new Error(`npm not found on PATH: tried to run ${JSON.stringify(o.command)}${o.shell?" through a shell":""} against ${l.length} PATH entries. Install Node.js / npm, or use a binary-distributed agent.`));return}r(d)}),i.on("exit",(d,c)=>{if(d===0){t();return}let l=d!==null?`exit code ${d}`:`signal ${c??"unknown"}`,u=a.trim();r(new Error(u?`npm install ${n.packageSpec} failed (${l})
30
30
  stderr: ${u}`:`npm install ${n.packageSpec} failed (${l})`))})})}catch(t){if(t.code==="ETXTBSY"&&e<KF)return await new Promise(s=>setTimeout(s,GF*(e+1))),iI(n,e+1);throw t}}function VF(n){if(n.startsWith("@")){let t=n.indexOf("/");if(t===-1)return n;let s=n.slice(t+1).indexOf("@");return s===-1?n:n.slice(0,t+1+s)}let e=n.indexOf("@");return e<=0?n:n.slice(0,e)}function YF(n){let e=n.lastIndexOf("/");return e===-1?n:n.slice(e+1)}async function aI(n,e){let t=As.join(n,"node_modules",e,"package.json");try{let r=await or.readFile(t,"utf8"),s=JSON.parse(r);return typeof s.bin=="string"||typeof s.bin=="object"&&s.bin!==null&&!Array.isArray(s.bin)?s.bin:void 0}catch{return}}async function sI(n){let e=As.join(n.installDir,"node_modules",".bin"),t=As.join(e,n.hint);if(await Zi(t))return{binName:n.hint,binPath:t};let r=await aI(n.installDir,n.packageName);if(typeof r=="object"&&r!==null){let s=Object.keys(r);if(s.length===1){let o=s[0],i=As.join(e,o);if(await Zi(i))return{binName:o,binPath:i}}else if(s.length>1){for(let o of[n.hint,n.basename])if(s.includes(o)){let i=As.join(e,o);if(await Zi(i))return{binName:o,binPath:i}}}}if(n.basename!==n.hint){let s=As.join(e,n.basename);if(await Zi(s))return{binName:n.basename,binPath:s}}}async function Zi(n){try{return await or.access(n),!0}catch{return!1}}var By,KF,GF,Uy=j(()=>{"use strict";ke();_d();Bf();By=n=>{process.stderr.write(n+`
31
- `)};KF=5,GF=25});import*as uI from"fs/promises";import*as Uf from"path";import{z as Ie}from"zod";function fI(n){return n.installId??n.id}function jy(n){let e=n.extendsChain;return e&&e.length>0?e[e.length-1]:n.id}function Tr(n,e){if(n)for(let t of e.extendsChain??[e.id]){let r=n[t];if(r!==void 0)return{value:r,from:t}}}function Wy(n,e){return{id:n,name:e.name??n,description:e.description,version:"local",distribution:{exec:{command:gt(e.command??n),args:e.args?.map(gt),env:e.env}}}}function pI(n,e){let t=e.args?.map(gt),r=s=>({...s,...t?{args:t}:{},...e.env?{env:{...s.env,...e.env}}:{}});return{...n.npx?{npx:r(n.npx)}:{},...n.uvx?{uvx:r(n.uvx)}:{},...n.exec?{exec:r(n.exec)}:{},...n.binary?{binary:Object.fromEntries(Object.entries(n.binary).map(([s,o])=>[s,o&&r(o)]))}:{}}}function sL(n,e){let t=r=>({...r,args:[...r.args??[],...e]});return{...n.npx?{npx:t(n.npx)}:{},...n.uvx?{uvx:t(n.uvx)}:{},...n.exec?{exec:t(n.exec)}:{},...n.binary?{binary:Object.fromEntries(Object.entries(n.binary).map(([r,s])=>[r,s&&t(s)]))}:{}}}function oL(n,e,t){let r=e.command!==void 0;return{...t,id:n,name:e.name??t.name,description:e.description??t.description,version:r?"local":t.version,distribution:r?Wy(n,e).distribution:pI(t.distribution,e),installId:r?n:t.installId??t.id,extendsChain:[n,...t.extendsChain??[t.id]]}}function iL(n){let e=n.lastIndexOf("@"),r=(e>0?n.slice(e+1):"").replace(/[^a-zA-Z0-9._-]/g,"_");return r.length>0?`pin-${r}`:"pinned"}function qy(n){let e=n.distribution.npx?.package;if(!e)return;let t=e.lastIndexOf("/"),r=t===-1?e:e.slice(t+1),s=r.lastIndexOf("@");return s<=0?r:r.slice(0,s)}async function Fd(n){let e=typeof n.resolvedLocalAgents=="function"?await n.resolvedLocalAgents():typeof n.localAgents=="function"?n.localAgents():[],t;try{t=await n.load()}catch(i){if(e.length===0)throw i;t={version:"local-only",agents:[]}}let r=new Set(e.map(i=>i.id)),s=[...e,...t.agents.filter(i=>!r.has(i.id))],o=await Promise.all(s.map(async i=>({id:i.id,name:i.name,version:i.version,description:i.description,distributions:Object.keys(i.distribution),installed:await zy(i),...i.extendsChain?{extendsChain:i.extendsChain}:{},source:r.has(i.id)?"local":"registry",...i.onboarding?{onboarding:i.onboarding}:{}})));return{version:t.version,fetchedAt:n.lastFetchedAt(),agents:o}}async function zy(n){let e=Ar();if(!e)return"no";let t=n.version??"current",r=fI(n);if(n.distribution.exec)return"yes";if(n.distribution.binary){let s=Ly(n.distribution.binary,e);if(s?.cmd){let o=Uf.resolve(L.agentInstallDir(r,e,t),s.cmd);if(await lI(o))return"yes"}}if(n.distribution.npx){let s=n.distribution.npx,o=s.bin??qy(n)??s.package,i=L.agentNpmInstallDir(r,e,t),a=Uf.join(i,"node_modules",".bin",o);if(await lI(a))return"yes"}return!n.distribution.npx&&!n.distribution.binary&&n.distribution.uvx?"lazy":"no"}async function lI(n){try{return await uI.access(n),!0}catch{return!1}}async function Er(n,e=[],t={}){let r=n.version??"current",s=fI(n);if(n.distribution.npx){let o=n.distribution.npx,i=e.length>0?e:o.args??[];if(process.env.HYDRA_ACP_SKIP_NPM_PREFETCH)return{command:"npx",args:["-y",o.package,...i],env:o.env??{},version:r,installId:s};let a=o.bin??qy(n)??o.package,d=t.onInstallProgress;return{command:await oI({agentId:s,version:r,packageSpec:o.package,bin:a,registry:t.npmRegistry,onProgress:d?l=>d({source:"npm",...l}):void 0}),args:i,env:o.env??{},version:r,installId:s}}if(n.distribution.binary){let o=Ly(n.distribution.binary);if(!o)throw new Error(`Agent ${n.id} has no binary distribution for ${Ar()??"this platform"}.`);let i=t.onInstallProgress,a=await tI({agentId:s,version:r,target:o,onProgress:i?c=>i({source:"binary",...c}):void 0}),d=e.length>0?e:o.args??[];return{command:a,args:d,env:o.env??{},version:r,installId:s}}if(n.distribution.uvx){let o=n.distribution.uvx,i=e.length>0?e:o.args??[];return{command:"uvx",args:[o.package,...i],env:o.env??{},version:r,installId:s}}if(n.distribution.exec){let o=n.distribution.exec,i=e.length>0?e:o.args??[];return{command:o.command,args:i,env:o.env??{},version:r,installId:s}}throw new Error(`Agent ${n.id} has no usable distribution method.`)}var QF,Od,XF,ZF,eL,tL,nL,rL,dI,cI,Hf,Ts=j(()=>{"use strict";ke();Ze();Qr();_d();Uy();QF=Ie.object({package:Ie.string(),bin:Ie.string().optional(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),Od=Ie.object({archive:Ie.string().url().optional(),cmd:Ie.string().optional(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),XF=Ie.object({"darwin-aarch64":Od.optional(),"darwin-x86_64":Od.optional(),"linux-aarch64":Od.optional(),"linux-x86_64":Od.optional(),"windows-x86_64":Od.optional(),"windows-aarch64":Od.optional()}),ZF=Ie.object({package:Ie.string(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),eL=Ie.object({command:Ie.string(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),tL=Ie.object({command:Ie.string().optional(),url:Ie.string().optional(),description:Ie.string().optional()}),nL=Ie.object({npx:QF.optional(),binary:XF.optional(),uvx:ZF.optional(),exec:eL.optional()}),rL=Ie.object({id:Ie.string(),name:Ie.string(),version:Ie.string().optional(),description:Ie.string().optional(),authors:Ie.array(Ie.string()).optional(),license:Ie.string().optional(),icon:Ie.string().optional(),repository:Ie.string().optional(),website:Ie.string().optional(),distribution:nL,onboarding:tL.optional(),requiredEnv:Ie.array(Ie.string().min(1)).optional()}),dI=8;cI=Ie.object({version:Ie.string(),agents:Ie.array(rL),extensions:Ie.array(Ie.unknown()).optional()}),Hf=class{constructor(e,t={}){this.config=e;this.options=t}config;options;cache;async load(){if(this.cache&&(this.isPinned()||this.isFresh(this.cache.fetchedAt)))return this.cache.data;let e=await this.readDiskCache();if(e&&(this.isPinned()||this.isFresh(e.fetchedAt)))return this.cache=e,e.data;try{let t=await this.fetchFromNetwork();return this.cache=t,await this.writeDiskCache(t),t.data}catch(t){if(e){let r=this.options.onStaleFallback;if(r)try{r(t,Date.now()-e.fetchedAt)}catch{}return this.cache=e,e.data}throw t}}async refresh(){let e=await this.fetchFromNetwork();return this.cache=e,await this.writeDiskCache(e),e.data}lastFetchedAt(){return this.cache?.fetchedAt}setConfig(e){this.config=e}async getAgent(e){return this.resolveAgent(e,[])}async resolveAgent(e,t){let r=this.findLocalDef(e);if(r){if(r.def.extends===void 0)return{...Wy(r.id,r.def),extendsChain:[r.id]};if(t.includes(r.id))throw new Error(`agent ${r.id}: extends cycle (${[...t,r.id].join(" -> ")})`);if(t.length+1>=dI)throw new Error(`agent ${r.id}: extends chain deeper than ${dI} (${[...t,r.id].join(" -> ")})`);let c=await this.resolveAgent(r.def.extends,[...t,r.id]);if(!c)throw new Error(`agent ${r.id}: extends ${JSON.stringify(r.def.extends)}, which is not a known agent`);return this.applyOverride(oL(r.id,r.def,c))}let s=await this.load(),o=s.agents.find(c=>c.id===e);if(o)return this.applyOverride(o);let i=s.agents.find(c=>qy(c)===e);if(i)return this.applyOverride(i);let a=e.toLowerCase(),d=s.agents.find(c=>c.id.toLowerCase()===`${a}-acp`);if(d)return this.applyOverride(d);if(a.length>0){let c=s.agents.filter(l=>l.id.toLowerCase().startsWith(a));if(c.length===1)return this.applyOverride(c[0])}}findLocalDef(e){let t=this.config.agents??{},r=t[e];if(r)return{id:e,def:r};let s=e.toLowerCase();for(let[o,i]of Object.entries(t))if(o.toLowerCase()===`${s}-acp`)return{id:o,def:i}}localAgents(){return Object.entries(this.config.agents??{}).filter(([,e])=>e.extends===void 0).map(([e,t])=>Wy(e,t))}async resolvedLocalAgents(){let e=[];for(let t of Object.keys(this.config.agents??{}))try{let r=await this.resolveAgent(t,[]);r&&e.push(r)}catch(r){this.options.onResolveError?.(t,r)}return e}applyOverride(e){let t=e.extendsChain?e:{...e,extendsChain:[e.id]},r=this.config.agentOverrides?.[t.id];if(!r)return t;let s=t.distribution,o=t.version,i=t.installId;return r.packageSpec&&s.npx&&(o=iL(r.packageSpec),i=t.id,s={...s,npx:{...s.npx,package:r.packageSpec}}),r.extraArgs?.length&&(s=sL(s,r.extraArgs)),r.env&&Object.keys(r.env).length>0&&(s=pI(s,{env:r.env})),s===t.distribution?t:{...t,version:o,installId:i,distribution:s}}isPinned(){return this.config.registry?.pinned===!0}isFresh(e){let t=Date.now()-e,r=this.config.registry.ttlHours*60*60*1e3;return t<r}async fetchFromNetwork(){let e=await fetch(this.config.registry.url);if(!e.ok)throw new Error(`Registry fetch failed: HTTP ${e.status}`);let t=await e.json(),r=cI.parse(t),s={fetchedAt:Date.now(),raw:t,data:r},o=this.options.onFetched;return o&&Promise.resolve().then(()=>o(r)).catch(()=>{}),s}async readDiskCache(){let e=await Wt(L.registryCache());if(!(!e||typeof e.fetchedAt!="number"||e.data===void 0))try{let t=cI.parse(e.data);return{fetchedAt:e.fetchedAt,raw:e.data,data:t}}catch{return}}async writeDiskCache(e){await Zt(L.registryCache(),{fetchedAt:e.fetchedAt,data:e.raw})}}});var K,gl=j(()=>{"use strict";K={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 ut}from"zod";var hI,aL,mI,gI,yI,Ky=j(()=>{"use strict";hI=ut.object({protocolVersion:ut.number().optional(),clientCapabilities:ut.record(ut.unknown()).optional(),clientInfo:ut.object({name:ut.string(),version:ut.string().optional()}).optional()}),aL=ut.enum(["full","pending_only","none","after_message"]),mI=ut.object({cwd:ut.string(),mcpServers:ut.array(ut.unknown()).optional(),_meta:ut.record(ut.unknown()).optional()}),gI=ut.object({upstreamSessionId:ut.string(),agentId:ut.string(),cwd:ut.string(),title:ut.string().optional(),agentArgs:ut.array(ut.string()).optional()}),yI=ut.object({sessionId:ut.string(),historyPolicy:aL.default("full"),afterMessageId:ut.string().optional(),afterSeq:ut.number().optional(),clientId:ut.string().optional(),clientInfo:ut.object({name:ut.string(),version:ut.string().optional()}).optional(),_meta:ut.record(ut.unknown()).optional()})});import{z as ye}from"zod";function Wf(n,e){let t={attachedClients:n.attachedClients,status:n.status,busy:n.busy,awaitingInput:n.awaitingInput};return n.cwd!==void 0&&(t.cwd=n.cwd),n.workspace!==void 0&&(t.workspaceInfo=n.workspace),n.workspaceError!==void 0&&(t.workspaceError=n.workspaceError),n.title!==void 0&&(t.title=n.title),n.agentId!==void 0&&(t.agentId=n.agentId),n.upstreamSessionId!==void 0&&(t.upstreamSessionId=n.upstreamSessionId),n.currentModel!==void 0&&(t.currentModel=n.currentModel),n.currentUsage!==void 0&&(t.currentUsage=n.currentUsage),n.importedFromMachine!==void 0&&(t.importedFromMachine=n.importedFromMachine),n.importedFromUpstreamSessionId!==void 0&&(t.importedFromUpstreamSessionId=n.importedFromUpstreamSessionId),n.parentSessionId!==void 0&&(t.parentSessionId=n.parentSessionId),n.forkedFromSessionId!==void 0&&(t.forkedFromSessionId=n.forkedFromSessionId),n.forkedFromMessageId!==void 0&&(t.forkedFromMessageId=n.forkedFromMessageId),n.originatingClient!==void 0&&(t.originatingClient=n.originatingClient),n.interactive!==void 0&&(t.interactive=n.interactive),n.priority!==void 0&&n.priority>0&&(t.priority=n.priority),n.armedTasks!==void 0&&(t.armedTasks=n.armedTasks),n.armedSince!==void 0&&(t.armedSince=n.armedSince),n.compactionState!==void 0&&(t.compactionState=n.compactionState),n.forkSynthesisState!==void 0&&(t.forkSynthesisState=n.forkSynthesisState),e&&(e.clientId!==void 0&&(t.clientId=e.clientId),e.currentMode!==void 0&&(t.currentMode=e.currentMode),e.agentArgs!==void 0&&e.agentArgs.length>0&&(t.agentArgs=e.agentArgs),e.availableCommands!==void 0&&e.availableCommands.length>0&&(t.availableCommands=e.availableCommands),e.availableModes!==void 0&&e.availableModes.length>0&&(t.availableModes=e.availableModes),e.availableModels!==void 0&&e.availableModels.length>0&&(t.availableModels=e.availableModels),e.turnStartedAt!==void 0&&(t.turnStartedAt=e.turnStartedAt),e.agentCapabilities!==void 0&&(t.agentCapabilities=e.agentCapabilities),e.queue!==void 0&&e.queue.length>0&&(t.queue=e.queue),e.resurrected===!0&&(t.resurrected=!0),e.armedTaskList!==void 0&&(t.armedTaskList=e.armedTaskList)),t}function kI(n){let e={sessionId:n.sessionId,cwd:n.cwd,updatedAt:n.updatedAt,_meta:yl(n._meta,Wf(n))};return n.title!==void 0&&(e.title=n.title),e}var wI,bI,Gy,rV,dL,sV,Jy=j(()=>{"use strict";Ld();wI=ye.object({sessionId:ye.string()}),bI=ye.object({cwd:ye.string().optional(),cursor:ye.string().optional()}),Gy=ye.object({used:ye.number().optional(),size:ye.number().optional(),costAmount:ye.number().optional(),costCurrency:ye.string().optional()}),rV=ye.object({sessionId:ye.string(),upstreamSessionId:ye.string().optional(),cwd:ye.string(),workspace:ye.object({path:ye.string(),sourceCwd:ye.string(),label:ye.string(),provider:ye.string(),snapshot:ye.string().optional(),vcs:ye.record(ye.string(),ye.string()).optional()}).optional(),workspaceError:ye.string().optional(),title:ye.string().optional(),agentId:ye.string().optional(),currentModel:ye.string().optional(),currentUsage:Gy.optional(),importedFromMachine:ye.string().optional(),importedFromUpstreamSessionId:ye.string().optional(),parentSessionId:ye.string().optional(),forkedFromSessionId:ye.string().optional(),forkedFromMessageId:ye.string().optional(),originatingClient:ye.object({name:ye.string(),version:ye.string().optional()}).optional(),interactive:ye.boolean().optional(),priority:ye.number().int().nonnegative().optional(),updatedAt:ye.string(),attachedClients:ye.number().int().nonnegative(),status:ye.enum(["warm","cold"]).default("warm"),busy:ye.boolean().default(!1),awaitingInput:ye.boolean().default(!1),armedTasks:ye.number().int().nonnegative().optional(),armedSince:ye.number().int().positive().optional(),compactionState:ye.any().optional(),agentPid:ye.number().int().positive().optional(),forkSynthesisState:ye.enum(["running","failed"]).optional(),_meta:ye.record(ye.unknown()).optional()}),dL=ye.object({sessionId:ye.string(),cwd:ye.string(),title:ye.string().optional(),updatedAt:ye.string().optional(),_meta:ye.record(ye.unknown()).optional()}),sV=ye.object({sessions:ye.array(dL),nextCursor:ye.string().optional()})});function cL(n){if(!n||typeof n!="object"||Array.isArray(n))return;let e={};for(let[t,r]of Object.entries(n)){if(typeof t!="string"||t.length===0||typeof r!="string")return;e[t]=r}return e}function On(n){if(!n)return{};let e=n[ft];if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e,r={};if(typeof t.upstreamSessionId=="string"&&(r.upstreamSessionId=t.upstreamSessionId),typeof t.agentId=="string"&&(r.agentId=t.agentId),typeof t.cwd=="string"&&(r.cwd=t.cwd),t.workspace!==null&&typeof t.workspace=="object"&&!Array.isArray(t.workspace)){let s=t.workspace,o={};typeof s.label=="string"&&(o.label=s.label),typeof s.from=="string"&&(o.from=s.from),s.required===!0&&(o.required=!0),typeof s.provider=="string"&&(o.provider=s.provider),r.workspace=o}if(t.workspaceInfo!==null&&typeof t.workspaceInfo=="object"&&!Array.isArray(t.workspaceInfo)){let s=t.workspaceInfo;if(typeof s.path=="string"&&typeof s.sourceCwd=="string"&&typeof s.label=="string"&&typeof s.provider=="string"){let o={path:s.path,sourceCwd:s.sourceCwd,label:s.label,provider:s.provider};if(typeof s.snapshot=="string"&&(o.snapshot=s.snapshot),s.vcs!==null&&typeof s.vcs=="object"&&!Array.isArray(s.vcs)){let i={};for(let[a,d]of Object.entries(s.vcs))typeof d=="string"&&(i[a]=d);o.vcs=i}r.workspaceInfo=o}}if(typeof t.workspaceError=="string"&&(r.workspaceError=t.workspaceError),typeof t.clientId=="string"&&(r.clientId=t.clientId),typeof t.readonly=="boolean"&&(r.readonly=t.readonly),(t.replayMode==="instant"||t.replayMode==="drip")&&(r.replayMode=t.replayMode),typeof t.dripSpeed=="number"&&t.dripSpeed>0&&(r.dripSpeed=t.dripSpeed),typeof t.historyLimit=="number"&&Number.isFinite(t.historyLimit)&&t.historyLimit>=0&&(r.historyLimit=t.historyLimit),(t.toolContent==="inline"||t.toolContent==="references")&&(r.toolContent=t.toolContent),t.detachStatus==="detached"&&(r.detachStatus=t.detachStatus),typeof t.title=="string"&&(r.title=t.title),Array.isArray(t.agentArgs)&&t.agentArgs.every(s=>typeof s=="string")&&(r.agentArgs=t.agentArgs),Array.isArray(t.transformers)&&t.transformers.every(s=>typeof s=="string")&&(r.transformers=t.transformers),t.resume){let s=gI.safeParse(t.resume);s.success&&(r.resume=s.data)}if(typeof t.model=="string"&&(r.model=t.model),typeof t.currentModel=="string"&&(r.currentModel=t.currentModel),typeof t.currentMode=="string"&&(r.currentMode=t.currentMode),t.currentUsage){let s=Gy.safeParse(t.currentUsage);s.success&&(r.currentUsage=s.data)}if(typeof t.turnStartedAt=="number"&&t.turnStartedAt>0&&(r.turnStartedAt=t.turnStartedAt),typeof t.armedTasks=="number"&&t.armedTasks>=0&&(r.armedTasks=t.armedTasks),typeof t.armedSince=="number"&&t.armedSince>0&&(r.armedSince=t.armedSince),Array.isArray(t.armedTaskList)){let s=[];for(let o of t.armedTaskList){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.label!="string"||typeof i.since!="number"||s.push({label:i.label,since:i.since,...typeof i.taskId=="string"?{taskId:i.taskId}:{},...typeof i.taskType=="string"?{taskType:i.taskType}:{},...typeof i.toolCallId=="string"?{toolCallId:i.toolCallId}:{}})}r.armedTaskList=s}if(Array.isArray(t.availableCommands)){let s=[];for(let o of t.availableCommands){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;if(typeof i.name!="string")continue;let a={name:i.name};typeof i.description=="string"&&(a.description=i.description),s.push(a)}s.length>0&&(r.availableCommands=s)}if(t.prompt&&typeof t.prompt=="object"&&!Array.isArray(t.prompt)){let s=t.prompt,o={};typeof s.queueing=="boolean"&&(o.queueing=s.queueing),typeof s.cancelling=="boolean"&&(o.cancelling=s.cancelling),typeof s.updating=="boolean"&&(o.updating=s.updating),typeof s.amending=="boolean"&&(o.amending=s.amending),typeof s.pipelining=="boolean"&&(o.pipelining=s.pipelining),r.prompt=o}if(t.agents&&typeof t.agents=="object"&&!Array.isArray(t.agents)){let s=t.agents,o={};typeof s.list=="boolean"&&(o.list=s.list),typeof s.installProgress=="boolean"&&(o.installProgress=s.installProgress),r.agents=o}if(typeof t.mcpStdin=="boolean"&&(r.mcpStdin=t.mcpStdin),typeof t.interactive=="boolean"&&(r.interactive=t.interactive),typeof t.ancillary=="boolean"&&(r.ancillary=t.ancillary),t.salvaged&&typeof t.salvaged=="object"&&!Array.isArray(t.salvaged)){let s=t.salvaged;typeof s.reason=="string"&&typeof s.supersededMessageId=="string"&&(r.salvaged={reason:s.reason,supersededMessageId:s.supersededMessageId})}if(Array.isArray(t.queue)){let s=[];for(let o of t.queue){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o,a=i.originator;if(typeof i.messageId!="string"||!a||typeof a.clientId!="string"||!Array.isArray(i.prompt)||typeof i.position!="number"||typeof i.enqueuedAt!="number")continue;let d={clientId:a.clientId};typeof a.name=="string"&&(d.name=a.name),typeof a.version=="string"&&(d.version=a.version),s.push({messageId:i.messageId,originator:d,prompt:i.prompt,position:i.position,enqueuedAt:i.enqueuedAt})}s.length>0&&(r.queue=s)}if(Array.isArray(t.availableModes)){let s=[];for(let o of t.availableModes){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;if(typeof i.id!="string")continue;let a={id:i.id};typeof i.name=="string"&&(a.name=i.name),typeof i.description=="string"&&(a.description=i.description),s.push(a)}s.length>0&&(r.availableModes=s)}if(Array.isArray(t.availableModels)){let s=[];for(let o of t.availableModels){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;if(typeof i.modelId!="string")continue;let a={modelId:i.modelId};typeof i.name=="string"&&(a.name=i.name),typeof i.description=="string"&&(a.description=i.description),s.push(a)}s.length>0&&(r.availableModels=s)}if((t.status==="warm"||t.status==="cold")&&(r.status=t.status),typeof t.busy=="boolean"&&(r.busy=t.busy),typeof t.awaitingInput=="boolean"&&(r.awaitingInput=t.awaitingInput),typeof t.attachedClients=="number"&&(r.attachedClients=t.attachedClients),typeof t.resurrected=="boolean"&&(r.resurrected=t.resurrected),typeof t.importedFromMachine=="string"&&(r.importedFromMachine=t.importedFromMachine),typeof t.importedFromUpstreamSessionId=="string"&&(r.importedFromUpstreamSessionId=t.importedFromUpstreamSessionId),typeof t.parentSessionId=="string"&&(r.parentSessionId=t.parentSessionId),typeof t.forkedFromSessionId=="string"&&(r.forkedFromSessionId=t.forkedFromSessionId),typeof t.forkedFromMessageId=="string"&&(r.forkedFromMessageId=t.forkedFromMessageId),t.originatingClient&&typeof t.originatingClient=="object"&&!Array.isArray(t.originatingClient)&&typeof t.originatingClient.name=="string"){let s=t.originatingClient;r.originatingClient={name:s.name,...typeof s.version=="string"?{version:s.version}:{}}}if(t.agentCapabilities!==void 0&&(r.agentCapabilities=t.agentCapabilities),t.env!==void 0){let s=cL(t.env);s!==void 0&&(r.env=s)}return r}function Es(n,e){if(typeof e!="number"||!Number.isFinite(e)||!n||typeof n!="object"||Array.isArray(n))return n;let t=n,r=t._meta&&typeof t._meta=="object"&&!Array.isArray(t._meta)?t._meta:{},s=r[ft],o=s&&typeof s=="object"&&!Array.isArray(s)?s:{};return typeof o.recordedAt=="number"?n:{...t,_meta:{...r,[ft]:{...o,recordedAt:e}}}}function Ps(n,e){if(typeof e!="number"||!Number.isFinite(e)||!n||typeof n!="object"||Array.isArray(n))return n;let t=n,r=t._meta&&typeof t._meta=="object"&&!Array.isArray(t._meta)?t._meta:{},s=r[ft],o=s&&typeof s=="object"&&!Array.isArray(s)?s:{};return typeof o.seq=="number"?n:{...t,_meta:{...r,[ft]:{...o,seq:e}}}}function jf(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object")return;let t=e[ft];if(!t||typeof t!="object")return;let r=t.seq;return typeof r=="number"&&Number.isFinite(r)?r:void 0}function vI(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object")return;let t=e[ft];if(!t||typeof t!="object")return;let r=t.recordedAt;return typeof r=="number"&&Number.isFinite(r)?r:void 0}function yl(n,e){return{...n??{},[ft]:e}}var ft,Ld=j(()=>{"use strict";Ky();Jy();ft="hydra-acp"});import{z as ce}from"zod";var SI,qf,xI,lV,uV,fV,II,pV,CI,hV,RI,mV,AI,gV,yV,TI=j(()=>{"use strict";SI=ce.object({sessionId:ce.string(),prompt:ce.array(ce.unknown()),_meta:ce.record(ce.unknown()).optional()}),qf=ce.object({sessionId:ce.string()}),xI=ce.object({clientId:ce.string(),name:ce.string().optional(),version:ce.string().optional()}),lV=ce.object({sessionId:ce.string(),messageId:ce.string(),originator:xI,prompt:ce.array(ce.unknown()),position:ce.number().int().nonnegative(),queueDepth:ce.number().int().positive(),enqueuedAt:ce.number()}),uV=ce.object({sessionId:ce.string(),messageId:ce.string(),prompt:ce.array(ce.unknown())}),fV=ce.object({sessionId:ce.string(),messageId:ce.string(),reason:ce.enum(["started","cancelled","abandoned"])}),II=ce.object({sessionId:ce.string(),messageId:ce.string()}),pV=ce.object({cancelled:ce.boolean(),reason:ce.enum(["ok","not_found","already_running"])}),CI=ce.object({sessionId:ce.string(),messageId:ce.string(),prompt:ce.array(ce.unknown())}),hV=ce.object({updated:ce.boolean(),reason:ce.enum(["ok","not_found","already_running"])}),RI=ce.object({sessionId:ce.string(),targetMessageId:ce.string(),prompt:ce.array(ce.unknown()),replaceQueue:ce.boolean().optional(),onTargetCompleted:ce.enum(["reject","send_anyway"]).optional()}),mV=ce.object({amended:ce.boolean(),reason:ce.enum(["ok","target_completed","target_cancelled","target_not_found"]),messageId:ce.string().optional()}),AI=ce.object({sessionId:ce.string(),prompt:ce.array(ce.unknown()),_meta:ce.object({steering:ce.object({idleBehavior:ce.literal("promptRequired").optional()}).optional()}).optional()}),gV=ce.object({outcome:ce.enum(["injected","startedNewTurn","promptRequired","failed"]),reason:ce.literal("noRunningTurn").optional(),detached:ce.boolean().optional()}),yV=ce.object({sessionId:ce.string(),cancelledMessageId:ce.string(),newMessageId:ce.string(),prompt:ce.array(ce.unknown()),originator:xI,amendedAt:ce.number()})});import{z as Yo}from"zod";var EI,zf,Nd,PI=j(()=>{"use strict";EI=Yo.object({agentId:Yo.string(),version:Yo.string(),source:Yo.enum(["binary","npm"]),phase:Yo.enum(["download_start","download_progress","download_done","extract","install_start","installed"]),receivedBytes:Yo.number().optional(),totalBytes:Yo.number().optional(),packageSpec:Yo.string().optional()}),zf="hydra-acp/agents/install_progress",Nd={auth:{terminal:!0},_meta:{"terminal-auth":!0}}});var an=j(()=>{"use strict";gl();Ky();Ld();Jy();TI();PI()});import{nanoid as lL}from"nanoid";var Vy,In,Qo=j(()=>{"use strict";an();Vy=class extends Error{code="ERR_CONNECTION_CLOSED";constructor(e="connection is closed"){super(e),this.name="ConnectionClosedError"}},In=class n{constructor(e){this.stream=e;this.stream.onMessage(t=>this.handleIncoming(t)),this.stream.onClose(t=>this.handleClose(t))}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,t){this.requestHandlers.set(e,t)}setDefaultHandler(e){this.defaultRequestHandler=e}onNotification(e,t){this.notificationHandlers.set(e,t);let r=this.bufferedNotifications.get(e);if(r){this.bufferedNotifications.delete(e);for(let s of r)try{t(s.params,s.method)}catch{}}}drainBuffered(e){let r=this.bufferedNotifications.get(e)?.length??0;return this.bufferedNotifications.delete(e),r}onClose(e){this.closeHandlers.push(e)}isClosed(){return this.closed}onOrphanError(e){this.orphanErrorHandlers.push(e)}async request(e,t){return this.requestWithId(e,t).response}requestWithId(e,t){if(this.closed)throw new Vy;let r=lL(),s={jsonrpc:"2.0",id:r,method:e,params:t},o=new Promise((i,a)=>{this.pending.set(r,{resolve:d=>i(d),reject:a}),this.stream.send(s).catch(d=>{this.pending.delete(r),a(d)})});return{id:r,response:o}}notify(e,t){if(this.closed)return Promise.resolve();let r={jsonrpc:"2.0",method:e,params:t};return this.stream.send(r)}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 t=this.requestHandlers.get(e.method)??this.defaultRequestHandler;if(!t){await this.sendError(e.id,{code:K.MethodNotFound,message:`Method not found: ${e.method}`}).catch(()=>{});return}try{let r=await t(e.params,e.method),s={jsonrpc:"2.0",id:e.id,result:r};await this.stream.send(s).catch(()=>{})}catch(r){let s=r;await this.sendError(e.id,{code:s.code??K.InternalError,message:s.message,data:s.data}).catch(()=>{})}}handleNotification(e){let t=this.notificationHandlers.get(e.method);if(t){t(e.params,e.method);return}let r=this.bufferedNotifications.get(e.method);if(!r){if(this.bufferedNotifications.size>=n.MAX_BUFFERED_METHODS){let s=this.bufferedNotifications.keys().next().value;s!==void 0&&this.bufferedNotifications.delete(s)}r=[],this.bufferedNotifications.set(e.method,r)}r.push(e),r.length>n.MAX_BUFFERED_PER_METHOD&&r.shift()}handleResponse(e){let t=e.id===null?void 0:this.pending.get(e.id);if(!t){if(e.error)for(let r of this.orphanErrorHandlers)try{r({code:e.error.code,message:e.error.message,data:e.error.data})}catch{}return}if(this.pending.delete(e.id),e.error){let r=new Error(e.error.message);r.code=e.error.code,r.data=e.error.data,t.reject(r)}else t.resolve(e.result)}async sendError(e,t){let r={jsonrpc:"2.0",id:e,error:t};await this.stream.send(r)}handleClose(e){if(!this.closed){this.closed=!0;for(let t of this.pending.values())t.reject(e??new Error("connection closed"));this.pending.clear();for(let t of this.closeHandlers)t(e)}}}});import*as $I from"os";function Zo(){return $I.hostname()}function Yy(){let n=new Set;n.add(Zo());let e=process.env.HYDRA_ACP_LOCAL_HOSTS;if(e)for(let t of e.split(",")){let r=t.trim();r&&n.add(r)}return n}var wl=j(()=>{"use strict"});function Qy(n){return!n||typeof n!="object"||Array.isArray(n)?!1:Array.isArray(n.availableModels)}function NI(n){return Array.isArray(n)&&n.some(e=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.id===LI)}function Dd(n){if(!n)return;if(Qy(n)||Qy(n.models))return Ms;let e=n._meta;if(e&&typeof e=="object"&&!Array.isArray(e)){for(let[t,r]of Object.entries(e))if(t!=="hydra-acp"&&Qy(r))return Ms}if(NI(n.configOptions))return Xy}function DI(n){if(!n||typeof n!="object"||Array.isArray(n))return;let e=n.sessionUpdate;if(e==="_hydra_current_model_update")return Ms;if(e==="config_option_update"&&NI(n.configOptions))return Xy}function OI(n){return typeof n=="object"&&n!==null&&n.code===K.MethodNotFound}function FI(n,e,t,r){let s={...r??{}};return delete s.sessionId,delete s.modelId,delete s.configId,delete s.value,n===Ms?{...s,sessionId:e,modelId:t}:{...s,sessionId:e,configId:LI,value:t}}function gL(n){return n===Ms?Xy:Ms}async function ei(n){let{request:e,sessionId:t,modelId:r,extraParams:s,logger:o}=n,i=n.verb??Ms;try{let a=await e(i,FI(i,t,r,s));return{verb:i,result:a}}catch(a){if(!OI(a))throw a;let d=gL(i);o?.info(`agent does not implement ${i} (MethodNotFound); retrying model change via ${d} modelId=${JSON.stringify(r)}`);try{let c=await e(d,FI(d,t,r,s));return{verb:d,result:c}}catch(c){throw OI(c)?a:c}}}var Ms,Xy,LI,bl=j(()=>{"use strict";gl();Ms="session/set_model",Xy="session/set_config_option",LI="model"});async function ea(n){let{agent:e,upstreamSessionId:t,persistedMode:r,agentReportedMode:s,advertisedModes:o,logger:i}=n;if(!r)return s;if(r===s)return r;if(o&&o.length>0&&!o.some(a=>a.id===r)){let a=o.map(d=>d.id).join(", ");return i?.warn(`resurrect: persisted currentMode=${JSON.stringify(r)} not in agent's availableModes ([${a}]); skipping session/set_mode, session will use ${JSON.stringify(s)}`),s}try{return i?.info(`resurrect: pushing persisted modeId=${JSON.stringify(r)} to agent (agentReported=${JSON.stringify(s)})`),await e.connection.request("session/set_mode",{sessionId:t,modeId:r}),i?.info(`resurrect: session/set_mode accepted, effectiveMode=${JSON.stringify(r)}`),r}catch(a){return i?.warn(`resurrect: session/set_mode rejected by agent for modeId=${JSON.stringify(r)} (${a.message}); session will use ${JSON.stringify(s)}`),s}}async function ta(n){let{agent:e,upstreamSessionId:t,persistedModel:r,agentReportedModel:s,modelVerb:o,logger:i}=n;if(!r)return{modelId:s};if(r===s)return{modelId:r};try{i?.info(`resurrect: pushing persisted modelId=${JSON.stringify(r)} to agent (agentReported=${JSON.stringify(s)})`);let{verb:a,result:d}=await ei({request:(c,l)=>e.connection.request(c,l),sessionId:t,modelId:r,...o?{verb:o}:{},logger:i});return i?.info(`resurrect: ${a} accepted, effectiveModel=${JSON.stringify(r)}`),{modelId:r,result:d}}catch(a){return i?.warn(`resurrect: session/set_model rejected by agent for modelId=${JSON.stringify(r)} (${a.message}); session will use ${JSON.stringify(s)}`),{modelId:s}}}var Zy=j(()=>{"use strict";bl()});function ti(n){return`${n.name}:${n.localId}`}function so(n){let e=n.indexOf(":");if(e===-1)return;let t=n.slice(0,e),r=n.slice(e+1);if(!(t.length===0||r.length===0))return{name:t,localId:r}}var kl=j(()=>{"use strict"});import{createHmac as yL}from"crypto";function wL(n,e){return yL("sha256",n).update(e).digest("hex")}function ew(n,e){let t=JSON.stringify(e),r=wL(n.secret,t);fetch(n.callbackUrl,{method:"POST",headers:{"Content-Type":"application/json","X-Hydra-Turn-Notify-Signature":r},body:t}).catch(()=>{})}var BI=j(()=>{"use strict"});function HI(n){return n!==void 0&&bL.has(n)}function tw(n){if(!Array.isArray(n))return[];let e=[];for(let t of n){if(t===null||typeof t!="object")continue;let r=t.path;typeof r=="string"&&r.length>0&&e.push(r)}return e}function Vf(n){return tw(n)[0]}var bL,UI,Jf,vl=j(()=>{"use strict";bL=new Set(["edit","delete","move"]);UI="edit",Jf=class{kinds=new Map;note(e,t){t!==void 0&&t.length>0&&!this.kinds.has(e)&&this.kinds.set(e,t)}get(e){return this.kinds.get(e)}effective(e,t){return t!==void 0&&t.length>0?t:this.kinds.get(e)}clear(){this.kinds.clear()}get size(){return this.kinds.size}}});import*as jI from"fs/promises";function AL(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var kL,vL,Bd,SL,xL,IL,CL,RL,WI,Yf,qI=j(()=>{"use strict";kL=64*1024*1024,vL=1*1024*1024,Bd=64*1024,SL=6e4,xL=100,IL=1e3,CL=64*1024,RL=256*1024,WI=20;Yf=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??kL,this.maxCapacityBytes<=0)throw new Error("capacityBytes must be > 0");this.currentCapacityBytes=Math.min(vL,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,t){let r=Math.max(0,Math.min(t,Bd));if(r===0){let u={bytes:Buffer.alloc(0),nextCursor:e};return this.closed&&e>=this.writeCursor&&(u.eof=!0),u}let s=e,o=0,i=this.oldestAvailable;s<i&&(o=i-s,s=i);let a=this.writeCursor-s;if(a<=0){let u={bytes:Buffer.alloc(0),nextCursor:s};return o>0&&(u.gap=o),this.closed&&(u.eof=!0),u}let d=Math.min(a,r),l={bytes:this.sliceFromRing(s,d),nextCursor:s+d};return o>0&&(l.gap=o),this.closed&&s+d>=this.writeCursor&&(l.eof=!0),l}tail(e){let t=Math.max(0,Math.min(e,Bd)),r=this.oldestAvailable,s=this.writeCursor-t,o=Math.max(r,s),i=s<r;return{bytes:this.sliceFromRing(o,this.writeCursor-o),startCursor:o,endCursor:this.writeCursor,truncated:i}}head(e){let t=Math.max(0,Math.min(e,Bd)),r=this.oldestAvailable,s=r>0,o=r,i=Math.min(this.writeCursor,o+t);return{bytes:this.sliceFromRing(o,i-o),startCursor:o,endCursor:i,truncated:s}}waitForData(e,t){if(e<this.writeCursor)return Promise.resolve("data");if(this.closed)return Promise.resolve("eof");let r=Math.max(0,Math.min(t,SL));return r===0?Promise.resolve("timeout"):new Promise(s=>{let o={resolve:i=>{o.timer!==void 0&&(clearTimeout(o.timer),o.timer=void 0),s(i)},timer:setTimeout(()=>{let i=this.waiters.indexOf(o);i>=0&&this.waiters.splice(i,1),o.timer=void 0,s("timeout")},r)};this.waiters.push(o)})}grep(e){let t=this.oldestAvailable,r=e.cursor,s=r??t,o=0;r!==void 0&&r<t&&(o=t-r,s=t),s>this.writeCursor&&(s=this.writeCursor);let i=this.sliceFromRing(s,this.writeCursor-s),a=e.regex??!0,d=e.caseInsensitive===!0?"i":"",c=a?new RegExp(e.pattern,d):new RegExp(AL(e.pattern),d),l=e.invert??!1,u=Math.max(1,Math.min(e.maxMatches??xL,IL)),f=Math.max(1,Math.min(e.maxBytes??CL,RL)),p=Math.max(0,Math.min(e.contextBefore??0,WI)),m=Math.max(0,Math.min(e.contextAfter??0,WI)),h=[],g=[],w=[],b=0,k=!1,S=0,I=0,x=(E,P)=>{for(let U of w)U.remaining>0&&(U.match.after===void 0&&(U.match.after=[]),U.match.after.push({cursor:E,line:P}),U.remaining--,b+=P.length);for(;w.length>0&&w[0].remaining===0;)w.shift();if(c.test(P)!==l&&h.length<u){let U={cursor:E,line:P};if(p>0&&g.length>0){U.before=g.slice();for(let X of U.before)b+=X.line.length}b+=P.length,h.push(U),m>0&&w.push({match:U,remaining:m})}if(p>0)for(g.push({cursor:E,line:P});g.length>p;)g.shift();let z=h.length>=u&&w.length===0,V=b>=f;return z||V};for(let E=0;E<i.length;E++){if(i[E]!==10)continue;let P=i.subarray(S,E).toString("utf8"),F=s+S;if(S=E+1,I=S,x(F,P)){k=!0;break}}if(!k&&S<i.length&&this.closed){let E=i.subarray(S).toString("utf8"),P=s+S;x(P,E)&&(k=!0),I=i.length}let A=Math.min(s+I,this.writeCursor),M={matches:h,truncated:k,nextCursor:A,scannedBytes:I};return o>0&&(M.gap=o),this.closed&&A>=this.writeCursor&&(M.eof=!0),M}wakeWaiters(e){if(this.waiters.length===0)return;let t=this.waiters;this.waiters=[];for(let r of t)r.resolve(e)}growIfNeeded(e){if(this.currentCapacityBytes>=this.maxCapacityBytes)return;let t=this.writeCursor+e;if(t<=this.currentCapacityBytes)return;let r=this.currentCapacityBytes;for(;r<t&&r<this.maxCapacityBytes;)r=Math.min(this.maxCapacityBytes,r*2);if(r===this.currentCapacityBytes)return;let s=Buffer.alloc(r);this.storage.copy(s,0,0,this.writeCursor),this.storage=s,this.currentCapacityBytes=r}writeRing(e){let t=e.length;if(this.growIfNeeded(t),t>=this.currentCapacityBytes){let o=t-this.currentCapacityBytes;e.copy(this.storage,0,o,t);return}let r=this.writeCursor%this.currentCapacityBytes,s=this.currentCapacityBytes-r;t<=s?e.copy(this.storage,r,0,t):(e.copy(this.storage,r,0,s),e.copy(this.storage,0,s,t))}sliceFromRing(e,t){if(t<=0)return Buffer.alloc(0);let r=Buffer.alloc(t),s=e%this.currentCapacityBytes,o=Math.min(t,this.currentCapacityBytes-s);return this.storage.copy(r,0,s,s+o),o<t&&this.storage.copy(r,o,0,t-o),r}scheduleFileWrite(e){let t=this.filePath;if(t===void 0||this.fileCapReached)return;let r=this.fileCapBytes-this.fileBytesWritten;if(r<=0){this.fileCapReached=!0,this.onFileCapReached?.();return}let s=e.length<=r?e:e.subarray(0,r);this.fileBytesWritten+=s.length;let o=this.fileBytesWritten>=this.fileCapBytes;this.fileWriteChain=this.fileWriteChain.then(()=>jI.appendFile(t,s)).catch(i=>{this.logWriteError?.(i)}),o&&!this.fileCapReached&&(this.fileCapReached=!0,this.onFileCapReached?.())}async drainFileWrites(){await this.fileWriteChain.catch(()=>{})}}});var Hd,YV,zI=j(()=>{"use strict";Hd=[{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 | status>",description:"Schedule a swap to a different agent (synthesizes a brief in the target's idiom, rotates on idle); `status` reports any pending swap"},{verb:"workspace",name:"hydra workspace",argsHint:"<start [name] [--clean] | sync | merge | apply | stop | detach | clean [--deep] | discard | status>",description:"Move this session into an isolated workspace so its edits cannot collide with other work, then land or discard them. `start` copies your uncommitted changes in and leaves the real tree untouched; `start --clean` leaves them behind so the workspace begins at the last commit. `stop` merges and returns; `discard` throws the work away and returns; `detach` returns without merging, leaving the workspace and its branch intact; `merge` lands the work without leaving; `apply` also stays, but delivers the work as ONE staged, uncommitted changeset instead of as the agent's commits, so you review and commit it yourself, with no fast-forward needed, which is what makes it work once the source has moved on; `clean` throws away everything done in the workspace and stays there, putting it back exactly as `start --clean` would have made it (add `--deep` to rebuild dependencies and carried config files too, rather than keeping them); `sync` pulls the source's committed history INTO the workspace, so you can test against what you will land onto, and because landing is fast-forward-only, syncing is also how you recover once the source has moved on. `start <name>` naming a workspace another live session is already in JOINS it instead of making a second one, so two sessions can share a checkout deliberately: edits interleave, `stop` behaves as `detach` while anyone else is still there, and the work lands when the last of them leaves."},{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:"compact",name:"hydra compact",description:"Compact this session's history. Use '/hydra compact status' to inspect current compaction state without triggering."},{verb:"uncompact",name:"hydra uncompact",description:"Roll back the most recent compaction swap (only available immediately after a swap, before any new turns)"},{verb:"fork",name:"hydra fork",argsHint:"[verbatim]",description:"Fork this conversation into a new session (default: synthesis mode with a synopsis brief; pass 'verbatim' to slice at the last completed turn instead)"},{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."}],YV=new Map(Hd.map(n=>[n.verb,n]))});function KI(n){let e=n.lastIndexOf("/");return(e===-1?n:n.slice(e+1)).toLowerCase()}function Ud(n,e){return Sl(n,e.map(t=>t.modelId))}function Sl(n,e){if(e.length===0)return{kind:"none",requested:n};if(e.includes(n))return{kind:"exact",modelId:n};let t=KI(n),r=e.filter(o=>KI(o)===t);if(r.length===1)return{kind:"resolved",modelId:r[0],requested:n};if(r.length>1)return{kind:"ambiguous",requested:n,candidates:r};let s=n.toLowerCase();if(s.length>0){let o=e.filter(i=>i.toLowerCase().includes(s));if(o.length===1)return{kind:"resolved",modelId:o[0],requested:n};if(o.length>1)return{kind:"ambiguous",requested:n,candidates:o}}return{kind:"unknown",requested:n}}var Qf=j(()=>{"use strict"});function JI(n){if(n.length===0)return n;let e=new Map,t=new Map,r=new Map;for(let a=0;a<n.length;a++){let d=n[a];if(d===void 0)continue;let c=nw(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);for(let u of _L){if(!GI(c[u]))continue;let f=r.get(l);f===void 0?r.set(l,new Map([[u,c[u]]])):f.set(u,c[u])}if(Array.isArray(c.content)&&c.content.length>0){let u=t.get(l);u?u.push(...c.content):t.set(l,[...c.content])}}}let s=[],o=null,i=null;for(let a=0;a<n.length;a++){let d=n[a];if(d===void 0)continue;let c=nw(d);if(!c||typeof c.sessionUpdate!="string"){s.push(d),o=null;continue}let l=c.sessionUpdate;if(l==="agent_message_chunk"||l==="agent_thought_chunk"||l==="user_message_chunk"){o&&o.kind===l?(PL(s,o.outIndex,TL(c.content)),EL(s,o.outIndex,d.seq)):(s.push(d),o={outIndex:s.length-1,kind:l});continue}if(o=null,l==="tool_call_update"){let u=typeof c.toolCallId=="string"?c.toolCallId:void 0;if(u!==void 0&&e.get(u)!==a)continue;let f=u!==void 0&&t.has(u)?ML(d,t.get(u)??[]):d,p=u===void 0?void 0:r.get(u);if(p!==void 0)for(let[m,h]of p)GI(nw(f)?.[m])||(f=$L(f,m,h));s.push(f);continue}if(l==="plan"){i!==null?s[i]=d:(s.push(d),i=s.length-1);continue}(l==="prompt_received"||l==="turn_complete")&&(i=null),s.push(d)}return s}function nw(n){if(n.method!=="session/update")return;let t=n.params?.update;if(!(!t||typeof t!="object"||Array.isArray(t)))return t}function TL(n){if(!n||typeof n!="object")return"";let e=n;return typeof e.text=="string"?e.text:""}function EL(n,e,t){let r=n[e];r===void 0||typeof t!="number"||r.seq!==void 0&&r.seq>=t||(n[e]={...r,seq:t})}function PL(n,e,t){if(t.length===0)return;let r=n[e];if(r===void 0)return;let s=r.params??{},o=s.update??{},i=o.content??{},a=typeof i.text=="string"?i.text:"";n[e]={...r,params:{...s,update:{...o,content:{...i,text:a+t}}}}}function ML(n,e){let t=n.params??{},r=t.update??{};return{...n,params:{...t,update:{...r,content:e}}}}function GI(n){return n==null||typeof n!="object"?!1:Array.isArray(n)?n.length>0:Object.keys(n).length>0}function $L(n,e,t){let r=n.params??{},s=r.update??{};return{...n,params:{...r,update:{...s,[e]:t}}}}var _L,VI=j(()=>{"use strict";_L=["rawInput","locations"]});function Wd(n,e={}){let t=e.maxChars??4e5,r=rw(n),s=[],o="",i=e.toolOutput?.maxTotal??0,a=()=>{o.length!==0&&(s.push(`Assistant: ${o}`),o="")};for(let d of n){if(d.method!=="session/update")continue;let l=d.params?.update;if(!l||typeof l.sessionUpdate!="string")continue;let u=l.sessionUpdate;if(u==="prompt_received"){a();let f=aw(l.prompt).trim();f.length>0&&s.push(`User: ${f}`)}else if(u==="agent_message_chunk"){let f=dw(l.content);f.length>0&&(o+=f)}else if(u==="tool_call"){if(a(),s.push(iw(l,r)),e.toolOutput!==void 0){let f=ow(l),p=f!==void 0?r.get(f)?.output:void 0;if(p!==void 0&&i>0){let m=Math.min(e.toolOutput.maxPerCall,i),h=p.length<=m?p:`${p.slice(0,m)}\u2026[${p.length-m} more chars]`;s.push(`Output: ${h}`),i-=Math.min(h.length,m)}}}else u==="turn_complete"&&a()}return a(),HL(s.join(`
31
+ `)};KF=5,GF=25});import*as uI from"fs/promises";import*as Uf from"path";import{z as Ie}from"zod";function fI(n){return n.installId??n.id}function jy(n){let e=n.extendsChain;return e&&e.length>0?e[e.length-1]:n.id}function Tr(n,e){if(n)for(let t of e.extendsChain??[e.id]){let r=n[t];if(r!==void 0)return{value:r,from:t}}}function Wy(n,e){return{id:n,name:e.name??n,description:e.description,version:"local",distribution:{exec:{command:gt(e.command??n),args:e.args?.map(gt),env:e.env}}}}function pI(n,e){let t=e.args?.map(gt),r=s=>({...s,...t?{args:t}:{},...e.env?{env:{...s.env,...e.env}}:{}});return{...n.npx?{npx:r(n.npx)}:{},...n.uvx?{uvx:r(n.uvx)}:{},...n.exec?{exec:r(n.exec)}:{},...n.binary?{binary:Object.fromEntries(Object.entries(n.binary).map(([s,o])=>[s,o&&r(o)]))}:{}}}function sL(n,e){let t=r=>({...r,args:[...r.args??[],...e]});return{...n.npx?{npx:t(n.npx)}:{},...n.uvx?{uvx:t(n.uvx)}:{},...n.exec?{exec:t(n.exec)}:{},...n.binary?{binary:Object.fromEntries(Object.entries(n.binary).map(([r,s])=>[r,s&&t(s)]))}:{}}}function oL(n,e,t){let r=e.command!==void 0;return{...t,id:n,name:e.name??t.name,description:e.description??t.description,version:r?"local":t.version,distribution:r?Wy(n,e).distribution:pI(t.distribution,e),installId:r?n:t.installId??t.id,extendsChain:[n,...t.extendsChain??[t.id]]}}function iL(n){let e=n.lastIndexOf("@"),r=(e>0?n.slice(e+1):"").replace(/[^a-zA-Z0-9._-]/g,"_");return r.length>0?`pin-${r}`:"pinned"}function qy(n){let e=n.distribution.npx?.package;if(!e)return;let t=e.lastIndexOf("/"),r=t===-1?e:e.slice(t+1),s=r.lastIndexOf("@");return s<=0?r:r.slice(0,s)}async function Fd(n){let e=typeof n.resolvedLocalAgents=="function"?await n.resolvedLocalAgents():typeof n.localAgents=="function"?n.localAgents():[],t;try{t=await n.load()}catch(i){if(e.length===0)throw i;t={version:"local-only",agents:[]}}let r=new Set(e.map(i=>i.id)),s=[...e,...t.agents.filter(i=>!r.has(i.id))],o=await Promise.all(s.map(async i=>({id:i.id,name:i.name,version:i.version,description:i.description,distributions:Object.keys(i.distribution),installed:await zy(i),...i.extendsChain?{extendsChain:i.extendsChain}:{},source:r.has(i.id)?"local":"registry",...i.onboarding?{onboarding:i.onboarding}:{}})));return{version:t.version,fetchedAt:n.lastFetchedAt(),agents:o}}async function zy(n){let e=Ar();if(!e)return"no";let t=n.version??"current",r=fI(n);if(n.distribution.exec)return"yes";if(n.distribution.binary){let s=Ly(n.distribution.binary,e);if(s?.cmd){let o=Uf.resolve(L.agentInstallDir(r,e,t),s.cmd);if(await lI(o))return"yes"}}if(n.distribution.npx){let s=n.distribution.npx,o=s.bin??qy(n)??s.package,i=L.agentNpmInstallDir(r,e,t),a=Uf.join(i,"node_modules",".bin",o);if(await lI(a))return"yes"}return!n.distribution.npx&&!n.distribution.binary&&n.distribution.uvx?"lazy":"no"}async function lI(n){try{return await uI.access(n),!0}catch{return!1}}async function Er(n,e=[],t={}){let r=n.version??"current",s=fI(n);if(n.distribution.npx){let o=n.distribution.npx,i=e.length>0?e:o.args??[];if(process.env.HYDRA_ACP_SKIP_NPM_PREFETCH)return{command:"npx",args:["-y",o.package,...i],env:o.env??{},version:r,installId:s};let a=o.bin??qy(n)??o.package,d=t.onInstallProgress;return{command:await oI({agentId:s,version:r,packageSpec:o.package,bin:a,registry:t.npmRegistry,onProgress:d?l=>d({source:"npm",...l}):void 0}),args:i,env:o.env??{},version:r,installId:s}}if(n.distribution.binary){let o=Ly(n.distribution.binary);if(!o)throw new Error(`Agent ${n.id} has no binary distribution for ${Ar()??"this platform"}.`);let i=t.onInstallProgress,a=await tI({agentId:s,version:r,target:o,onProgress:i?c=>i({source:"binary",...c}):void 0}),d=e.length>0?e:o.args??[];return{command:a,args:d,env:o.env??{},version:r,installId:s}}if(n.distribution.uvx){let o=n.distribution.uvx,i=e.length>0?e:o.args??[];return{command:"uvx",args:[o.package,...i],env:o.env??{},version:r,installId:s}}if(n.distribution.exec){let o=n.distribution.exec,i=e.length>0?e:o.args??[];return{command:o.command,args:i,env:o.env??{},version:r,installId:s}}throw new Error(`Agent ${n.id} has no usable distribution method.`)}var QF,Od,XF,ZF,eL,tL,nL,rL,dI,cI,Hf,Ts=j(()=>{"use strict";ke();Ze();Qr();_d();Uy();QF=Ie.object({package:Ie.string(),bin:Ie.string().optional(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),Od=Ie.object({archive:Ie.string().url().optional(),cmd:Ie.string().optional(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),XF=Ie.object({"darwin-aarch64":Od.optional(),"darwin-x86_64":Od.optional(),"linux-aarch64":Od.optional(),"linux-x86_64":Od.optional(),"windows-x86_64":Od.optional(),"windows-aarch64":Od.optional()}),ZF=Ie.object({package:Ie.string(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),eL=Ie.object({command:Ie.string(),args:Ie.array(Ie.string()).optional(),env:Ie.record(Ie.string()).optional()}),tL=Ie.object({command:Ie.string().optional(),url:Ie.string().optional(),description:Ie.string().optional()}),nL=Ie.object({npx:QF.optional(),binary:XF.optional(),uvx:ZF.optional(),exec:eL.optional()}),rL=Ie.object({id:Ie.string(),name:Ie.string(),version:Ie.string().optional(),description:Ie.string().optional(),authors:Ie.array(Ie.string()).optional(),license:Ie.string().optional(),icon:Ie.string().optional(),repository:Ie.string().optional(),website:Ie.string().optional(),distribution:nL,onboarding:tL.optional(),requiredEnv:Ie.array(Ie.string().min(1)).optional()}),dI=8;cI=Ie.object({version:Ie.string(),agents:Ie.array(rL),extensions:Ie.array(Ie.unknown()).optional()}),Hf=class{constructor(e,t={}){this.config=e;this.options=t}config;options;cache;async load(){if(this.cache&&(this.isPinned()||this.isFresh(this.cache.fetchedAt)))return this.cache.data;let e=await this.readDiskCache();if(e&&(this.isPinned()||this.isFresh(e.fetchedAt)))return this.cache=e,e.data;try{let t=await this.fetchFromNetwork();return this.cache=t,await this.writeDiskCache(t),t.data}catch(t){if(e){let r=this.options.onStaleFallback;if(r)try{r(t,Date.now()-e.fetchedAt)}catch{}return this.cache=e,e.data}throw t}}async refresh(){let e=await this.fetchFromNetwork();return this.cache=e,await this.writeDiskCache(e),e.data}lastFetchedAt(){return this.cache?.fetchedAt}setConfig(e){this.config=e}async getAgent(e){return this.resolveAgent(e,[])}async resolveAgent(e,t){let r=this.findLocalDef(e);if(r){if(r.def.extends===void 0)return{...Wy(r.id,r.def),extendsChain:[r.id]};if(t.includes(r.id))throw new Error(`agent ${r.id}: extends cycle (${[...t,r.id].join(" -> ")})`);if(t.length+1>=dI)throw new Error(`agent ${r.id}: extends chain deeper than ${dI} (${[...t,r.id].join(" -> ")})`);let c=await this.resolveAgent(r.def.extends,[...t,r.id]);if(!c)throw new Error(`agent ${r.id}: extends ${JSON.stringify(r.def.extends)}, which is not a known agent`);return this.applyOverride(oL(r.id,r.def,c))}let s=await this.load(),o=s.agents.find(c=>c.id===e);if(o)return this.applyOverride(o);let i=s.agents.find(c=>qy(c)===e);if(i)return this.applyOverride(i);let a=e.toLowerCase(),d=s.agents.find(c=>c.id.toLowerCase()===`${a}-acp`);if(d)return this.applyOverride(d);if(a.length>0){let c=s.agents.filter(l=>l.id.toLowerCase().startsWith(a));if(c.length===1)return this.applyOverride(c[0])}}findLocalDef(e){let t=this.config.agents??{},r=t[e];if(r)return{id:e,def:r};let s=e.toLowerCase();for(let[o,i]of Object.entries(t))if(o.toLowerCase()===`${s}-acp`)return{id:o,def:i}}localAgents(){return Object.entries(this.config.agents??{}).filter(([,e])=>e.extends===void 0).map(([e,t])=>Wy(e,t))}async resolvedLocalAgents(){let e=[];for(let t of Object.keys(this.config.agents??{}))try{let r=await this.resolveAgent(t,[]);r&&e.push(r)}catch(r){this.options.onResolveError?.(t,r)}return e}applyOverride(e){let t=e.extendsChain?e:{...e,extendsChain:[e.id]},r=this.config.agentOverrides?.[t.id];if(!r)return t;let s=t.distribution,o=t.version,i=t.installId;return r.packageSpec&&s.npx&&(o=iL(r.packageSpec),i=t.id,s={...s,npx:{...s.npx,package:r.packageSpec}}),r.extraArgs?.length&&(s=sL(s,r.extraArgs)),r.env&&Object.keys(r.env).length>0&&(s=pI(s,{env:r.env})),s===t.distribution?t:{...t,version:o,installId:i,distribution:s}}isPinned(){return this.config.registry?.pinned===!0}isFresh(e){let t=Date.now()-e,r=this.config.registry.ttlHours*60*60*1e3;return t<r}async fetchFromNetwork(){let e=await fetch(this.config.registry.url);if(!e.ok)throw new Error(`Registry fetch failed: HTTP ${e.status}`);let t=await e.json(),r=cI.parse(t),s={fetchedAt:Date.now(),raw:t,data:r},o=this.options.onFetched;return o&&Promise.resolve().then(()=>o(r)).catch(()=>{}),s}async readDiskCache(){let e=await Wt(L.registryCache());if(!(!e||typeof e.fetchedAt!="number"||e.data===void 0))try{let t=cI.parse(e.data);return{fetchedAt:e.fetchedAt,raw:e.data,data:t}}catch{return}}async writeDiskCache(e){await Zt(L.registryCache(),{fetchedAt:e.fetchedAt,data:e.raw})}}});var K,gl=j(()=>{"use strict";K={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 ut}from"zod";var hI,aL,mI,gI,yI,Ky=j(()=>{"use strict";hI=ut.object({protocolVersion:ut.number().optional(),clientCapabilities:ut.record(ut.unknown()).optional(),clientInfo:ut.object({name:ut.string(),version:ut.string().optional()}).optional()}),aL=ut.enum(["full","pending_only","none","after_message"]),mI=ut.object({cwd:ut.string(),mcpServers:ut.array(ut.unknown()).optional(),_meta:ut.record(ut.unknown()).optional()}),gI=ut.object({upstreamSessionId:ut.string(),agentId:ut.string(),cwd:ut.string(),title:ut.string().optional(),agentArgs:ut.array(ut.string()).optional()}),yI=ut.object({sessionId:ut.string(),historyPolicy:aL.default("full"),afterMessageId:ut.string().optional(),afterSeq:ut.number().optional(),clientId:ut.string().optional(),clientInfo:ut.object({name:ut.string(),version:ut.string().optional()}).optional(),_meta:ut.record(ut.unknown()).optional()})});import{z as ye}from"zod";function Wf(n,e){let t={attachedClients:n.attachedClients,status:n.status,busy:n.busy,awaitingInput:n.awaitingInput};return n.cwd!==void 0&&(t.cwd=n.cwd),n.workspace!==void 0&&(t.workspaceInfo=n.workspace),n.workspaceError!==void 0&&(t.workspaceError=n.workspaceError),n.title!==void 0&&(t.title=n.title),n.agentId!==void 0&&(t.agentId=n.agentId),n.upstreamSessionId!==void 0&&(t.upstreamSessionId=n.upstreamSessionId),n.currentModel!==void 0&&(t.currentModel=n.currentModel),n.currentUsage!==void 0&&(t.currentUsage=n.currentUsage),n.importedFromMachine!==void 0&&(t.importedFromMachine=n.importedFromMachine),n.importedFromUpstreamSessionId!==void 0&&(t.importedFromUpstreamSessionId=n.importedFromUpstreamSessionId),n.parentSessionId!==void 0&&(t.parentSessionId=n.parentSessionId),n.forkedFromSessionId!==void 0&&(t.forkedFromSessionId=n.forkedFromSessionId),n.forkedFromMessageId!==void 0&&(t.forkedFromMessageId=n.forkedFromMessageId),n.originatingClient!==void 0&&(t.originatingClient=n.originatingClient),n.interactive!==void 0&&(t.interactive=n.interactive),n.priority!==void 0&&n.priority>0&&(t.priority=n.priority),n.armedTasks!==void 0&&(t.armedTasks=n.armedTasks),n.armedSince!==void 0&&(t.armedSince=n.armedSince),n.compactionState!==void 0&&(t.compactionState=n.compactionState),n.forkSynthesisState!==void 0&&(t.forkSynthesisState=n.forkSynthesisState),e&&(e.clientId!==void 0&&(t.clientId=e.clientId),e.currentMode!==void 0&&(t.currentMode=e.currentMode),e.agentArgs!==void 0&&e.agentArgs.length>0&&(t.agentArgs=e.agentArgs),e.availableCommands!==void 0&&e.availableCommands.length>0&&(t.availableCommands=e.availableCommands),e.availableModes!==void 0&&e.availableModes.length>0&&(t.availableModes=e.availableModes),e.availableModels!==void 0&&e.availableModels.length>0&&(t.availableModels=e.availableModels),e.turnStartedAt!==void 0&&(t.turnStartedAt=e.turnStartedAt),e.agentCapabilities!==void 0&&(t.agentCapabilities=e.agentCapabilities),e.queue!==void 0&&e.queue.length>0&&(t.queue=e.queue),e.resurrected===!0&&(t.resurrected=!0),e.armedTaskList!==void 0&&(t.armedTaskList=e.armedTaskList)),t}function kI(n){let e={sessionId:n.sessionId,cwd:n.cwd,updatedAt:n.updatedAt,_meta:yl(n._meta,Wf(n))};return n.title!==void 0&&(e.title=n.title),e}var wI,bI,Gy,rV,dL,sV,Jy=j(()=>{"use strict";Ld();wI=ye.object({sessionId:ye.string()}),bI=ye.object({cwd:ye.string().optional(),cursor:ye.string().optional()}),Gy=ye.object({used:ye.number().optional(),size:ye.number().optional(),costAmount:ye.number().optional(),costCurrency:ye.string().optional()}),rV=ye.object({sessionId:ye.string(),upstreamSessionId:ye.string().optional(),cwd:ye.string(),workspace:ye.object({path:ye.string(),sourceCwd:ye.string(),label:ye.string(),provider:ye.string(),snapshot:ye.string().optional(),vcs:ye.record(ye.string(),ye.string()).optional()}).optional(),workspaceError:ye.string().optional(),title:ye.string().optional(),agentId:ye.string().optional(),currentModel:ye.string().optional(),currentUsage:Gy.optional(),importedFromMachine:ye.string().optional(),importedFromUpstreamSessionId:ye.string().optional(),parentSessionId:ye.string().optional(),forkedFromSessionId:ye.string().optional(),forkedFromMessageId:ye.string().optional(),originatingClient:ye.object({name:ye.string(),version:ye.string().optional()}).optional(),interactive:ye.boolean().optional(),priority:ye.number().int().nonnegative().optional(),updatedAt:ye.string(),attachedClients:ye.number().int().nonnegative(),status:ye.enum(["warm","cold"]).default("warm"),busy:ye.boolean().default(!1),awaitingInput:ye.boolean().default(!1),armedTasks:ye.number().int().nonnegative().optional(),armedSince:ye.number().int().positive().optional(),compactionState:ye.any().optional(),agentPid:ye.number().int().positive().optional(),forkSynthesisState:ye.enum(["running","failed"]).optional(),_meta:ye.record(ye.unknown()).optional()}),dL=ye.object({sessionId:ye.string(),cwd:ye.string(),title:ye.string().optional(),updatedAt:ye.string().optional(),_meta:ye.record(ye.unknown()).optional()}),sV=ye.object({sessions:ye.array(dL),nextCursor:ye.string().optional()})});function cL(n){if(!n||typeof n!="object"||Array.isArray(n))return;let e={};for(let[t,r]of Object.entries(n)){if(typeof t!="string"||t.length===0||typeof r!="string")return;e[t]=r}return e}function On(n){if(!n)return{};let e=n[ft];if(!e||typeof e!="object"||Array.isArray(e))return{};let t=e,r={};if(typeof t.upstreamSessionId=="string"&&(r.upstreamSessionId=t.upstreamSessionId),typeof t.agentId=="string"&&(r.agentId=t.agentId),typeof t.cwd=="string"&&(r.cwd=t.cwd),t.workspace!==null&&typeof t.workspace=="object"&&!Array.isArray(t.workspace)){let s=t.workspace,o={};typeof s.label=="string"&&(o.label=s.label),typeof s.from=="string"&&(o.from=s.from),s.required===!0&&(o.required=!0),typeof s.provider=="string"&&(o.provider=s.provider),r.workspace=o}if(t.workspaceInfo!==null&&typeof t.workspaceInfo=="object"&&!Array.isArray(t.workspaceInfo)){let s=t.workspaceInfo;if(typeof s.path=="string"&&typeof s.sourceCwd=="string"&&typeof s.label=="string"&&typeof s.provider=="string"){let o={path:s.path,sourceCwd:s.sourceCwd,label:s.label,provider:s.provider};if(typeof s.snapshot=="string"&&(o.snapshot=s.snapshot),s.vcs!==null&&typeof s.vcs=="object"&&!Array.isArray(s.vcs)){let i={};for(let[a,d]of Object.entries(s.vcs))typeof d=="string"&&(i[a]=d);o.vcs=i}r.workspaceInfo=o}}if(typeof t.workspaceError=="string"&&(r.workspaceError=t.workspaceError),typeof t.clientId=="string"&&(r.clientId=t.clientId),typeof t.readonly=="boolean"&&(r.readonly=t.readonly),(t.replayMode==="instant"||t.replayMode==="drip")&&(r.replayMode=t.replayMode),typeof t.dripSpeed=="number"&&t.dripSpeed>0&&(r.dripSpeed=t.dripSpeed),typeof t.historyLimit=="number"&&Number.isFinite(t.historyLimit)&&t.historyLimit>=0&&(r.historyLimit=t.historyLimit),(t.toolContent==="inline"||t.toolContent==="references")&&(r.toolContent=t.toolContent),t.detachStatus==="detached"&&(r.detachStatus=t.detachStatus),typeof t.title=="string"&&(r.title=t.title),Array.isArray(t.agentArgs)&&t.agentArgs.every(s=>typeof s=="string")&&(r.agentArgs=t.agentArgs),Array.isArray(t.transformers)&&t.transformers.every(s=>typeof s=="string")&&(r.transformers=t.transformers),t.resume){let s=gI.safeParse(t.resume);s.success&&(r.resume=s.data)}if(typeof t.model=="string"&&(r.model=t.model),typeof t.currentModel=="string"&&(r.currentModel=t.currentModel),typeof t.currentMode=="string"&&(r.currentMode=t.currentMode),t.currentUsage){let s=Gy.safeParse(t.currentUsage);s.success&&(r.currentUsage=s.data)}if(typeof t.turnStartedAt=="number"&&t.turnStartedAt>0&&(r.turnStartedAt=t.turnStartedAt),typeof t.armedTasks=="number"&&t.armedTasks>=0&&(r.armedTasks=t.armedTasks),typeof t.armedSince=="number"&&t.armedSince>0&&(r.armedSince=t.armedSince),Array.isArray(t.armedTaskList)){let s=[];for(let o of t.armedTaskList){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.label!="string"||typeof i.since!="number"||s.push({label:i.label,since:i.since,...typeof i.taskId=="string"?{taskId:i.taskId}:{},...typeof i.taskType=="string"?{taskType:i.taskType}:{},...typeof i.toolCallId=="string"?{toolCallId:i.toolCallId}:{}})}r.armedTaskList=s}if(Array.isArray(t.availableCommands)){let s=[];for(let o of t.availableCommands){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;if(typeof i.name!="string")continue;let a={name:i.name};typeof i.description=="string"&&(a.description=i.description),s.push(a)}s.length>0&&(r.availableCommands=s)}if(t.prompt&&typeof t.prompt=="object"&&!Array.isArray(t.prompt)){let s=t.prompt,o={};typeof s.queueing=="boolean"&&(o.queueing=s.queueing),typeof s.cancelling=="boolean"&&(o.cancelling=s.cancelling),typeof s.updating=="boolean"&&(o.updating=s.updating),typeof s.amending=="boolean"&&(o.amending=s.amending),typeof s.pipelining=="boolean"&&(o.pipelining=s.pipelining),r.prompt=o}if(t.agents&&typeof t.agents=="object"&&!Array.isArray(t.agents)){let s=t.agents,o={};typeof s.list=="boolean"&&(o.list=s.list),typeof s.installProgress=="boolean"&&(o.installProgress=s.installProgress),r.agents=o}if(typeof t.mcpStdin=="boolean"&&(r.mcpStdin=t.mcpStdin),typeof t.interactive=="boolean"&&(r.interactive=t.interactive),typeof t.ancillary=="boolean"&&(r.ancillary=t.ancillary),t.salvaged&&typeof t.salvaged=="object"&&!Array.isArray(t.salvaged)){let s=t.salvaged;typeof s.reason=="string"&&typeof s.supersededMessageId=="string"&&(r.salvaged={reason:s.reason,supersededMessageId:s.supersededMessageId})}if(Array.isArray(t.queue)){let s=[];for(let o of t.queue){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o,a=i.originator;if(typeof i.messageId!="string"||!a||typeof a.clientId!="string"||!Array.isArray(i.prompt)||typeof i.position!="number"||typeof i.enqueuedAt!="number")continue;let d={clientId:a.clientId};typeof a.name=="string"&&(d.name=a.name),typeof a.version=="string"&&(d.version=a.version),s.push({messageId:i.messageId,originator:d,prompt:i.prompt,position:i.position,enqueuedAt:i.enqueuedAt})}s.length>0&&(r.queue=s)}if(Array.isArray(t.availableModes)){let s=[];for(let o of t.availableModes){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;if(typeof i.id!="string")continue;let a={id:i.id};typeof i.name=="string"&&(a.name=i.name),typeof i.description=="string"&&(a.description=i.description),s.push(a)}s.length>0&&(r.availableModes=s)}if(Array.isArray(t.availableModels)){let s=[];for(let o of t.availableModels){if(!o||typeof o!="object"||Array.isArray(o))continue;let i=o;if(typeof i.modelId!="string")continue;let a={modelId:i.modelId};typeof i.name=="string"&&(a.name=i.name),typeof i.description=="string"&&(a.description=i.description),s.push(a)}s.length>0&&(r.availableModels=s)}if((t.status==="warm"||t.status==="cold")&&(r.status=t.status),typeof t.busy=="boolean"&&(r.busy=t.busy),typeof t.awaitingInput=="boolean"&&(r.awaitingInput=t.awaitingInput),typeof t.attachedClients=="number"&&(r.attachedClients=t.attachedClients),typeof t.resurrected=="boolean"&&(r.resurrected=t.resurrected),typeof t.importedFromMachine=="string"&&(r.importedFromMachine=t.importedFromMachine),typeof t.importedFromUpstreamSessionId=="string"&&(r.importedFromUpstreamSessionId=t.importedFromUpstreamSessionId),typeof t.parentSessionId=="string"&&(r.parentSessionId=t.parentSessionId),typeof t.forkedFromSessionId=="string"&&(r.forkedFromSessionId=t.forkedFromSessionId),typeof t.forkedFromMessageId=="string"&&(r.forkedFromMessageId=t.forkedFromMessageId),t.originatingClient&&typeof t.originatingClient=="object"&&!Array.isArray(t.originatingClient)&&typeof t.originatingClient.name=="string"){let s=t.originatingClient;r.originatingClient={name:s.name,...typeof s.version=="string"?{version:s.version}:{}}}if(t.agentCapabilities!==void 0&&(r.agentCapabilities=t.agentCapabilities),t.env!==void 0){let s=cL(t.env);s!==void 0&&(r.env=s)}return r}function Es(n,e){if(typeof e!="number"||!Number.isFinite(e)||!n||typeof n!="object"||Array.isArray(n))return n;let t=n,r=t._meta&&typeof t._meta=="object"&&!Array.isArray(t._meta)?t._meta:{},s=r[ft],o=s&&typeof s=="object"&&!Array.isArray(s)?s:{};return typeof o.recordedAt=="number"?n:{...t,_meta:{...r,[ft]:{...o,recordedAt:e}}}}function Ps(n,e){if(typeof e!="number"||!Number.isFinite(e)||!n||typeof n!="object"||Array.isArray(n))return n;let t=n,r=t._meta&&typeof t._meta=="object"&&!Array.isArray(t._meta)?t._meta:{},s=r[ft],o=s&&typeof s=="object"&&!Array.isArray(s)?s:{};return typeof o.seq=="number"?n:{...t,_meta:{...r,[ft]:{...o,seq:e}}}}function jf(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object")return;let t=e[ft];if(!t||typeof t!="object")return;let r=t.seq;return typeof r=="number"&&Number.isFinite(r)?r:void 0}function vI(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object")return;let t=e[ft];if(!t||typeof t!="object")return;let r=t.recordedAt;return typeof r=="number"&&Number.isFinite(r)?r:void 0}function yl(n,e){return{...n??{},[ft]:e}}var ft,Ld=j(()=>{"use strict";Ky();Jy();ft="hydra-acp"});import{z as ce}from"zod";var SI,qf,xI,lV,uV,fV,II,pV,CI,hV,RI,mV,AI,gV,yV,TI=j(()=>{"use strict";SI=ce.object({sessionId:ce.string(),prompt:ce.array(ce.unknown()),_meta:ce.record(ce.unknown()).optional()}),qf=ce.object({sessionId:ce.string()}),xI=ce.object({clientId:ce.string(),name:ce.string().optional(),version:ce.string().optional()}),lV=ce.object({sessionId:ce.string(),messageId:ce.string(),originator:xI,prompt:ce.array(ce.unknown()),position:ce.number().int().nonnegative(),queueDepth:ce.number().int().positive(),enqueuedAt:ce.number()}),uV=ce.object({sessionId:ce.string(),messageId:ce.string(),prompt:ce.array(ce.unknown())}),fV=ce.object({sessionId:ce.string(),messageId:ce.string(),reason:ce.enum(["started","cancelled","abandoned"])}),II=ce.object({sessionId:ce.string(),messageId:ce.string()}),pV=ce.object({cancelled:ce.boolean(),reason:ce.enum(["ok","not_found","already_running"])}),CI=ce.object({sessionId:ce.string(),messageId:ce.string(),prompt:ce.array(ce.unknown())}),hV=ce.object({updated:ce.boolean(),reason:ce.enum(["ok","not_found","already_running"])}),RI=ce.object({sessionId:ce.string(),targetMessageId:ce.string(),prompt:ce.array(ce.unknown()),replaceQueue:ce.boolean().optional(),onTargetCompleted:ce.enum(["reject","send_anyway"]).optional()}),mV=ce.object({amended:ce.boolean(),reason:ce.enum(["ok","target_completed","target_cancelled","target_not_found"]),messageId:ce.string().optional()}),AI=ce.object({sessionId:ce.string(),prompt:ce.array(ce.unknown()),_meta:ce.object({steering:ce.object({idleBehavior:ce.literal("promptRequired").optional()}).optional()}).optional()}),gV=ce.object({outcome:ce.enum(["injected","startedNewTurn","promptRequired","failed"]),reason:ce.literal("noRunningTurn").optional(),detached:ce.boolean().optional()}),yV=ce.object({sessionId:ce.string(),cancelledMessageId:ce.string(),newMessageId:ce.string(),prompt:ce.array(ce.unknown()),originator:xI,amendedAt:ce.number()})});import{z as Yo}from"zod";var EI,zf,Nd,PI=j(()=>{"use strict";EI=Yo.object({agentId:Yo.string(),version:Yo.string(),source:Yo.enum(["binary","npm"]),phase:Yo.enum(["download_start","download_progress","download_done","extract","install_start","installed"]),receivedBytes:Yo.number().optional(),totalBytes:Yo.number().optional(),packageSpec:Yo.string().optional()}),zf="hydra-acp/agents/install_progress",Nd={auth:{terminal:!0},_meta:{"terminal-auth":!0}}});var an=j(()=>{"use strict";gl();Ky();Ld();Jy();TI();PI()});import{nanoid as lL}from"nanoid";var Vy,In,Qo=j(()=>{"use strict";an();Vy=class extends Error{code="ERR_CONNECTION_CLOSED";constructor(e="connection is closed"){super(e),this.name="ConnectionClosedError"}},In=class n{constructor(e){this.stream=e;this.stream.onMessage(t=>this.handleIncoming(t)),this.stream.onClose(t=>this.handleClose(t))}stream;requestHandlers=new Map;defaultRequestHandler;notificationHandlers=new Map;anyNotificationHandlers=[];bufferedNotifications=new Map;static MAX_BUFFERED_PER_METHOD=64;static MAX_BUFFERED_METHODS=256;pending=new Map;closed=!1;closeHandlers=[];orphanErrorHandlers=[];onRequest(e,t){this.requestHandlers.set(e,t)}setDefaultHandler(e){this.defaultRequestHandler=e}onNotification(e,t){this.notificationHandlers.set(e,t);let r=this.bufferedNotifications.get(e);if(r){this.bufferedNotifications.delete(e);for(let s of r)try{t(s.params,s.method)}catch{}}}drainBuffered(e){let r=this.bufferedNotifications.get(e)?.length??0;return this.bufferedNotifications.delete(e),r}onAnyNotification(e){this.anyNotificationHandlers.push(e)}onClose(e){this.closeHandlers.push(e)}isClosed(){return this.closed}onOrphanError(e){this.orphanErrorHandlers.push(e)}async request(e,t){return this.requestWithId(e,t).response}requestWithId(e,t){if(this.closed)throw new Vy;let r=lL(),s={jsonrpc:"2.0",id:r,method:e,params:t},o=new Promise((i,a)=>{this.pending.set(r,{resolve:d=>i(d),reject:a}),this.stream.send(s).catch(d=>{this.pending.delete(r),a(d)})});return{id:r,response:o}}notify(e,t){if(this.closed)return Promise.resolve();let r={jsonrpc:"2.0",method:e,params:t};return this.stream.send(r)}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 t=this.requestHandlers.get(e.method)??this.defaultRequestHandler;if(!t){await this.sendError(e.id,{code:K.MethodNotFound,message:`Method not found: ${e.method}`}).catch(()=>{});return}try{let r=await t(e.params,e.method),s={jsonrpc:"2.0",id:e.id,result:r};await this.stream.send(s).catch(()=>{})}catch(r){let s=r;await this.sendError(e.id,{code:s.code??K.InternalError,message:s.message,data:s.data}).catch(()=>{})}}handleNotification(e){for(let s of this.anyNotificationHandlers)try{s(e.params,e.method)}catch{}let t=this.notificationHandlers.get(e.method);if(t){t(e.params,e.method);return}let r=this.bufferedNotifications.get(e.method);if(!r){if(this.bufferedNotifications.size>=n.MAX_BUFFERED_METHODS){let s=this.bufferedNotifications.keys().next().value;s!==void 0&&this.bufferedNotifications.delete(s)}r=[],this.bufferedNotifications.set(e.method,r)}r.push(e),r.length>n.MAX_BUFFERED_PER_METHOD&&r.shift()}handleResponse(e){let t=e.id===null?void 0:this.pending.get(e.id);if(!t){if(e.error)for(let r of this.orphanErrorHandlers)try{r({code:e.error.code,message:e.error.message,data:e.error.data})}catch{}return}if(this.pending.delete(e.id),e.error){let r=new Error(e.error.message);r.code=e.error.code,r.data=e.error.data,t.reject(r)}else t.resolve(e.result)}async sendError(e,t){let r={jsonrpc:"2.0",id:e,error:t};await this.stream.send(r)}handleClose(e){if(!this.closed){this.closed=!0;for(let t of this.pending.values())t.reject(e??new Error("connection closed"));this.pending.clear();for(let t of this.closeHandlers)t(e)}}}});import*as $I from"os";function Zo(){return $I.hostname()}function Yy(){let n=new Set;n.add(Zo());let e=process.env.HYDRA_ACP_LOCAL_HOSTS;if(e)for(let t of e.split(",")){let r=t.trim();r&&n.add(r)}return n}var wl=j(()=>{"use strict"});function Qy(n){return!n||typeof n!="object"||Array.isArray(n)?!1:Array.isArray(n.availableModels)}function NI(n){return Array.isArray(n)&&n.some(e=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.id===LI)}function Dd(n){if(!n)return;if(Qy(n)||Qy(n.models))return Ms;let e=n._meta;if(e&&typeof e=="object"&&!Array.isArray(e)){for(let[t,r]of Object.entries(e))if(t!=="hydra-acp"&&Qy(r))return Ms}if(NI(n.configOptions))return Xy}function DI(n){if(!n||typeof n!="object"||Array.isArray(n))return;let e=n.sessionUpdate;if(e==="_hydra_current_model_update")return Ms;if(e==="config_option_update"&&NI(n.configOptions))return Xy}function OI(n){return typeof n=="object"&&n!==null&&n.code===K.MethodNotFound}function FI(n,e,t,r){let s={...r??{}};return delete s.sessionId,delete s.modelId,delete s.configId,delete s.value,n===Ms?{...s,sessionId:e,modelId:t}:{...s,sessionId:e,configId:LI,value:t}}function gL(n){return n===Ms?Xy:Ms}async function ei(n){let{request:e,sessionId:t,modelId:r,extraParams:s,logger:o}=n,i=n.verb??Ms;try{let a=await e(i,FI(i,t,r,s));return{verb:i,result:a}}catch(a){if(!OI(a))throw a;let d=gL(i);o?.info(`agent does not implement ${i} (MethodNotFound); retrying model change via ${d} modelId=${JSON.stringify(r)}`);try{let c=await e(d,FI(d,t,r,s));return{verb:d,result:c}}catch(c){throw OI(c)?a:c}}}var Ms,Xy,LI,bl=j(()=>{"use strict";gl();Ms="session/set_model",Xy="session/set_config_option",LI="model"});async function ea(n){let{agent:e,upstreamSessionId:t,persistedMode:r,agentReportedMode:s,advertisedModes:o,logger:i}=n;if(!r)return s;if(r===s)return r;if(o&&o.length>0&&!o.some(a=>a.id===r)){let a=o.map(d=>d.id).join(", ");return i?.warn(`resurrect: persisted currentMode=${JSON.stringify(r)} not in agent's availableModes ([${a}]); skipping session/set_mode, session will use ${JSON.stringify(s)}`),s}try{return i?.info(`resurrect: pushing persisted modeId=${JSON.stringify(r)} to agent (agentReported=${JSON.stringify(s)})`),await e.connection.request("session/set_mode",{sessionId:t,modeId:r}),i?.info(`resurrect: session/set_mode accepted, effectiveMode=${JSON.stringify(r)}`),r}catch(a){return i?.warn(`resurrect: session/set_mode rejected by agent for modeId=${JSON.stringify(r)} (${a.message}); session will use ${JSON.stringify(s)}`),s}}async function ta(n){let{agent:e,upstreamSessionId:t,persistedModel:r,agentReportedModel:s,modelVerb:o,logger:i}=n;if(!r)return{modelId:s};if(r===s)return{modelId:r};try{i?.info(`resurrect: pushing persisted modelId=${JSON.stringify(r)} to agent (agentReported=${JSON.stringify(s)})`);let{verb:a,result:d}=await ei({request:(c,l)=>e.connection.request(c,l),sessionId:t,modelId:r,...o?{verb:o}:{},logger:i});return i?.info(`resurrect: ${a} accepted, effectiveModel=${JSON.stringify(r)}`),{modelId:r,result:d}}catch(a){return i?.warn(`resurrect: session/set_model rejected by agent for modelId=${JSON.stringify(r)} (${a.message}); session will use ${JSON.stringify(s)}`),{modelId:s}}}var Zy=j(()=>{"use strict";bl()});function ti(n){return`${n.name}:${n.localId}`}function so(n){let e=n.indexOf(":");if(e===-1)return;let t=n.slice(0,e),r=n.slice(e+1);if(!(t.length===0||r.length===0))return{name:t,localId:r}}var kl=j(()=>{"use strict"});import{createHmac as yL}from"crypto";function wL(n,e){return yL("sha256",n).update(e).digest("hex")}function ew(n,e){let t=JSON.stringify(e),r=wL(n.secret,t);fetch(n.callbackUrl,{method:"POST",headers:{"Content-Type":"application/json","X-Hydra-Turn-Notify-Signature":r},body:t}).catch(()=>{})}var BI=j(()=>{"use strict"});function HI(n){return n!==void 0&&bL.has(n)}function tw(n){if(!Array.isArray(n))return[];let e=[];for(let t of n){if(t===null||typeof t!="object")continue;let r=t.path;typeof r=="string"&&r.length>0&&e.push(r)}return e}function Vf(n){return tw(n)[0]}var bL,UI,Jf,vl=j(()=>{"use strict";bL=new Set(["edit","delete","move"]);UI="edit",Jf=class{kinds=new Map;note(e,t){t!==void 0&&t.length>0&&!this.kinds.has(e)&&this.kinds.set(e,t)}get(e){return this.kinds.get(e)}effective(e,t){return t!==void 0&&t.length>0?t:this.kinds.get(e)}clear(){this.kinds.clear()}get size(){return this.kinds.size}}});import*as jI from"fs/promises";function AL(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var kL,vL,Bd,SL,xL,IL,CL,RL,WI,Yf,qI=j(()=>{"use strict";kL=64*1024*1024,vL=1*1024*1024,Bd=64*1024,SL=6e4,xL=100,IL=1e3,CL=64*1024,RL=256*1024,WI=20;Yf=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??kL,this.maxCapacityBytes<=0)throw new Error("capacityBytes must be > 0");this.currentCapacityBytes=Math.min(vL,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,t){let r=Math.max(0,Math.min(t,Bd));if(r===0){let u={bytes:Buffer.alloc(0),nextCursor:e};return this.closed&&e>=this.writeCursor&&(u.eof=!0),u}let s=e,o=0,i=this.oldestAvailable;s<i&&(o=i-s,s=i);let a=this.writeCursor-s;if(a<=0){let u={bytes:Buffer.alloc(0),nextCursor:s};return o>0&&(u.gap=o),this.closed&&(u.eof=!0),u}let d=Math.min(a,r),l={bytes:this.sliceFromRing(s,d),nextCursor:s+d};return o>0&&(l.gap=o),this.closed&&s+d>=this.writeCursor&&(l.eof=!0),l}tail(e){let t=Math.max(0,Math.min(e,Bd)),r=this.oldestAvailable,s=this.writeCursor-t,o=Math.max(r,s),i=s<r;return{bytes:this.sliceFromRing(o,this.writeCursor-o),startCursor:o,endCursor:this.writeCursor,truncated:i}}head(e){let t=Math.max(0,Math.min(e,Bd)),r=this.oldestAvailable,s=r>0,o=r,i=Math.min(this.writeCursor,o+t);return{bytes:this.sliceFromRing(o,i-o),startCursor:o,endCursor:i,truncated:s}}waitForData(e,t){if(e<this.writeCursor)return Promise.resolve("data");if(this.closed)return Promise.resolve("eof");let r=Math.max(0,Math.min(t,SL));return r===0?Promise.resolve("timeout"):new Promise(s=>{let o={resolve:i=>{o.timer!==void 0&&(clearTimeout(o.timer),o.timer=void 0),s(i)},timer:setTimeout(()=>{let i=this.waiters.indexOf(o);i>=0&&this.waiters.splice(i,1),o.timer=void 0,s("timeout")},r)};this.waiters.push(o)})}grep(e){let t=this.oldestAvailable,r=e.cursor,s=r??t,o=0;r!==void 0&&r<t&&(o=t-r,s=t),s>this.writeCursor&&(s=this.writeCursor);let i=this.sliceFromRing(s,this.writeCursor-s),a=e.regex??!0,d=e.caseInsensitive===!0?"i":"",c=a?new RegExp(e.pattern,d):new RegExp(AL(e.pattern),d),l=e.invert??!1,u=Math.max(1,Math.min(e.maxMatches??xL,IL)),f=Math.max(1,Math.min(e.maxBytes??CL,RL)),p=Math.max(0,Math.min(e.contextBefore??0,WI)),m=Math.max(0,Math.min(e.contextAfter??0,WI)),h=[],g=[],w=[],b=0,k=!1,S=0,I=0,x=(E,P)=>{for(let U of w)U.remaining>0&&(U.match.after===void 0&&(U.match.after=[]),U.match.after.push({cursor:E,line:P}),U.remaining--,b+=P.length);for(;w.length>0&&w[0].remaining===0;)w.shift();if(c.test(P)!==l&&h.length<u){let U={cursor:E,line:P};if(p>0&&g.length>0){U.before=g.slice();for(let X of U.before)b+=X.line.length}b+=P.length,h.push(U),m>0&&w.push({match:U,remaining:m})}if(p>0)for(g.push({cursor:E,line:P});g.length>p;)g.shift();let z=h.length>=u&&w.length===0,V=b>=f;return z||V};for(let E=0;E<i.length;E++){if(i[E]!==10)continue;let P=i.subarray(S,E).toString("utf8"),F=s+S;if(S=E+1,I=S,x(F,P)){k=!0;break}}if(!k&&S<i.length&&this.closed){let E=i.subarray(S).toString("utf8"),P=s+S;x(P,E)&&(k=!0),I=i.length}let A=Math.min(s+I,this.writeCursor),M={matches:h,truncated:k,nextCursor:A,scannedBytes:I};return o>0&&(M.gap=o),this.closed&&A>=this.writeCursor&&(M.eof=!0),M}wakeWaiters(e){if(this.waiters.length===0)return;let t=this.waiters;this.waiters=[];for(let r of t)r.resolve(e)}growIfNeeded(e){if(this.currentCapacityBytes>=this.maxCapacityBytes)return;let t=this.writeCursor+e;if(t<=this.currentCapacityBytes)return;let r=this.currentCapacityBytes;for(;r<t&&r<this.maxCapacityBytes;)r=Math.min(this.maxCapacityBytes,r*2);if(r===this.currentCapacityBytes)return;let s=Buffer.alloc(r);this.storage.copy(s,0,0,this.writeCursor),this.storage=s,this.currentCapacityBytes=r}writeRing(e){let t=e.length;if(this.growIfNeeded(t),t>=this.currentCapacityBytes){let o=t-this.currentCapacityBytes;e.copy(this.storage,0,o,t);return}let r=this.writeCursor%this.currentCapacityBytes,s=this.currentCapacityBytes-r;t<=s?e.copy(this.storage,r,0,t):(e.copy(this.storage,r,0,s),e.copy(this.storage,0,s,t))}sliceFromRing(e,t){if(t<=0)return Buffer.alloc(0);let r=Buffer.alloc(t),s=e%this.currentCapacityBytes,o=Math.min(t,this.currentCapacityBytes-s);return this.storage.copy(r,0,s,s+o),o<t&&this.storage.copy(r,o,0,t-o),r}scheduleFileWrite(e){let t=this.filePath;if(t===void 0||this.fileCapReached)return;let r=this.fileCapBytes-this.fileBytesWritten;if(r<=0){this.fileCapReached=!0,this.onFileCapReached?.();return}let s=e.length<=r?e:e.subarray(0,r);this.fileBytesWritten+=s.length;let o=this.fileBytesWritten>=this.fileCapBytes;this.fileWriteChain=this.fileWriteChain.then(()=>jI.appendFile(t,s)).catch(i=>{this.logWriteError?.(i)}),o&&!this.fileCapReached&&(this.fileCapReached=!0,this.onFileCapReached?.())}async drainFileWrites(){await this.fileWriteChain.catch(()=>{})}}});var Hd,YV,zI=j(()=>{"use strict";Hd=[{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 | status>",description:"Schedule a swap to a different agent (synthesizes a brief in the target's idiom, rotates on idle); `status` reports any pending swap"},{verb:"workspace",name:"hydra workspace",argsHint:"<start [name] [--clean] | sync | merge | apply | stop | detach | clean [--deep] | discard | status>",description:"Move this session into an isolated workspace so its edits cannot collide with other work, then land or discard them. `start` copies your uncommitted changes in and leaves the real tree untouched; `start --clean` leaves them behind so the workspace begins at the last commit. `stop` merges and returns; `discard` throws the work away and returns; `detach` returns without merging, leaving the workspace and its branch intact; `merge` lands the work without leaving; `apply` also stays, but delivers the work as ONE staged, uncommitted changeset instead of as the agent's commits, so you review and commit it yourself, with no fast-forward needed, which is what makes it work once the source has moved on; `clean` throws away everything done in the workspace and stays there, putting it back exactly as `start --clean` would have made it (add `--deep` to rebuild dependencies and carried config files too, rather than keeping them); `sync` pulls the source's committed history INTO the workspace, so you can test against what you will land onto, and because landing is fast-forward-only, syncing is also how you recover once the source has moved on. `start <name>` naming a workspace another live session is already in JOINS it instead of making a second one, so two sessions can share a checkout deliberately: edits interleave, `stop` behaves as `detach` while anyone else is still there, and the work lands when the last of them leaves."},{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:"compact",name:"hydra compact",description:"Compact this session's history. Use '/hydra compact status' to inspect current compaction state without triggering."},{verb:"uncompact",name:"hydra uncompact",description:"Roll back the most recent compaction swap (only available immediately after a swap, before any new turns)"},{verb:"fork",name:"hydra fork",argsHint:"[verbatim]",description:"Fork this conversation into a new session (default: synthesis mode with a synopsis brief; pass 'verbatim' to slice at the last completed turn instead)"},{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."}],YV=new Map(Hd.map(n=>[n.verb,n]))});function KI(n){let e=n.lastIndexOf("/");return(e===-1?n:n.slice(e+1)).toLowerCase()}function Ud(n,e){return Sl(n,e.map(t=>t.modelId))}function Sl(n,e){if(e.length===0)return{kind:"none",requested:n};if(e.includes(n))return{kind:"exact",modelId:n};let t=KI(n),r=e.filter(o=>KI(o)===t);if(r.length===1)return{kind:"resolved",modelId:r[0],requested:n};if(r.length>1)return{kind:"ambiguous",requested:n,candidates:r};let s=n.toLowerCase();if(s.length>0){let o=e.filter(i=>i.toLowerCase().includes(s));if(o.length===1)return{kind:"resolved",modelId:o[0],requested:n};if(o.length>1)return{kind:"ambiguous",requested:n,candidates:o}}return{kind:"unknown",requested:n}}var Qf=j(()=>{"use strict"});function JI(n){if(n.length===0)return n;let e=new Map,t=new Map,r=new Map;for(let a=0;a<n.length;a++){let d=n[a];if(d===void 0)continue;let c=nw(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);for(let u of _L){if(!GI(c[u]))continue;let f=r.get(l);f===void 0?r.set(l,new Map([[u,c[u]]])):f.set(u,c[u])}if(Array.isArray(c.content)&&c.content.length>0){let u=t.get(l);u?u.push(...c.content):t.set(l,[...c.content])}}}let s=[],o=null,i=null;for(let a=0;a<n.length;a++){let d=n[a];if(d===void 0)continue;let c=nw(d);if(!c||typeof c.sessionUpdate!="string"){s.push(d),o=null;continue}let l=c.sessionUpdate;if(l==="agent_message_chunk"||l==="agent_thought_chunk"||l==="user_message_chunk"){o&&o.kind===l?(PL(s,o.outIndex,TL(c.content)),EL(s,o.outIndex,d.seq)):(s.push(d),o={outIndex:s.length-1,kind:l});continue}if(o=null,l==="tool_call_update"){let u=typeof c.toolCallId=="string"?c.toolCallId:void 0;if(u!==void 0&&e.get(u)!==a)continue;let f=u!==void 0&&t.has(u)?ML(d,t.get(u)??[]):d,p=u===void 0?void 0:r.get(u);if(p!==void 0)for(let[m,h]of p)GI(nw(f)?.[m])||(f=$L(f,m,h));s.push(f);continue}if(l==="plan"){i!==null?s[i]=d:(s.push(d),i=s.length-1);continue}(l==="prompt_received"||l==="turn_complete")&&(i=null),s.push(d)}return s}function nw(n){if(n.method!=="session/update")return;let t=n.params?.update;if(!(!t||typeof t!="object"||Array.isArray(t)))return t}function TL(n){if(!n||typeof n!="object")return"";let e=n;return typeof e.text=="string"?e.text:""}function EL(n,e,t){let r=n[e];r===void 0||typeof t!="number"||r.seq!==void 0&&r.seq>=t||(n[e]={...r,seq:t})}function PL(n,e,t){if(t.length===0)return;let r=n[e];if(r===void 0)return;let s=r.params??{},o=s.update??{},i=o.content??{},a=typeof i.text=="string"?i.text:"";n[e]={...r,params:{...s,update:{...o,content:{...i,text:a+t}}}}}function ML(n,e){let t=n.params??{},r=t.update??{};return{...n,params:{...t,update:{...r,content:e}}}}function GI(n){return n==null||typeof n!="object"?!1:Array.isArray(n)?n.length>0:Object.keys(n).length>0}function $L(n,e,t){let r=n.params??{},s=r.update??{};return{...n,params:{...r,update:{...s,[e]:t}}}}var _L,VI=j(()=>{"use strict";_L=["rawInput","locations"]});function Wd(n,e={}){let t=e.maxChars??4e5,r=rw(n),s=[],o="",i=e.toolOutput?.maxTotal??0,a=()=>{o.length!==0&&(s.push(`Assistant: ${o}`),o="")};for(let d of n){if(d.method!=="session/update")continue;let l=d.params?.update;if(!l||typeof l.sessionUpdate!="string")continue;let u=l.sessionUpdate;if(u==="prompt_received"){a();let f=aw(l.prompt).trim();f.length>0&&s.push(`User: ${f}`)}else if(u==="agent_message_chunk"){let f=dw(l.content);f.length>0&&(o+=f)}else if(u==="tool_call"){if(a(),s.push(iw(l,r)),e.toolOutput!==void 0){let f=ow(l),p=f!==void 0?r.get(f)?.output:void 0;if(p!==void 0&&i>0){let m=Math.min(e.toolOutput.maxPerCall,i),h=p.length<=m?p:`${p.slice(0,m)}\u2026[${p.length-m} more chars]`;s.push(`Output: ${h}`),i-=Math.min(h.length,m)}}}else u==="turn_complete"&&a()}return a(),HL(s.join(`
32
32
  `),t)}function rw(n){let e=new Map;for(let t of n){if(t.method!=="session/update")continue;let s=t.params?.update;if(!s)continue;let o=s.sessionUpdate;if(o!=="tool_call"&&o!=="tool_call_update")continue;let i=ow(s);if(i===void 0)continue;let a=e.get(i);if(a===void 0&&(a={name:"(unnamed)",rawInput:{}},e.set(i,a)),a.name==="(unnamed)"){let c=FL(s,o);c!==void 0&&(a.name=c)}if(a.kind===void 0&&typeof s.kind=="string"&&s.kind.length>0&&(a.kind=s.kind),a.output===void 0){let c=Xf(s);c!==void 0&&(a.output=c)}let d=s.rawInput;d&&typeof d=="object"&&!Array.isArray(d)&&Object.assign(a.rawInput,d)}for(let t of e.values())t.name=sw(t);return e}function sw(n){return OL(n)?n.kind??"(unnamed)":n.name}function OL(n){for(let e of QI){let t=n.rawInput[e];if(!(typeof t!="string"||t.length===0)&&(t===n.name||n.name.length>=12&&t.startsWith(n.name)))return!0}return!1}function FL(n,e){let t=xl(n);if(t!==void 0)return t;if(typeof n.name=="string"&&n.name.length>0)return n.name;if(e==="tool_call"&&typeof n.title=="string"&&n.title.length>0)return n.title}function ow(n){let e=n.toolCallId;if(typeof e=="string"&&e.length>0)return e}function Xf(n){let e=LL(n);if(e!==void 0)return e;let t=n.rawOutput;if(typeof t=="string")return t.length>0?t:void 0;if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t.output;if(typeof r=="string")return r.length>0?r:void 0}}function LL(n){let e=n._meta;if(!e||typeof e!="object")return;let t=e.claudeCode;if(!t||typeof t!="object")return;let r=t.toolResponse;if(typeof r=="string")return r.length>0?r:void 0;if(!r||typeof r!="object")return;let{stdout:s,stderr:o}=r,i=[];if(typeof s=="string"&&s.length>0&&i.push(s),typeof o=="string"&&o.length>0&&i.push(`[stderr] ${o}`),i.length!==0)return i.join(`
33
33
  `)}function xl(n){let e=n._meta;if(!e||typeof e!="object")return;let t=e.claudeCode;if(!t||typeof t!="object")return;let r=t.toolName;if(typeof r=="string"&&r.length>0)return r}function iw(n,e){let t=ow(n),r=t!==void 0?e?.get(t):void 0,s=r?.name??NL(n),o=DL(r?.rawInput??n.rawInput);return o.length===0?`Tool: ${s}`:`Tool: ${s}(${o.join(", ")})`}function NL(n){let e=xl(n);return e!==void 0?e:typeof n.name=="string"&&n.name.length>0?n.name:typeof n.title=="string"&&n.title.length>0?n.title:"(unnamed)"}function DL(n){if(!n||typeof n!="object"||Array.isArray(n))return[];let e=n,t=[];for(let r of QI){let s=e[r];typeof s=="string"&&s.length>0&&t.push(`${r}=${BL(s,600)}`)}return t}function aw(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>{if(e&&typeof e=="object"){let t=e.text;if(typeof t=="string")return t}return""}).join(""):""}function dw(n){if(!n||typeof n!="object")return"";let e=n.text;return typeof e=="string"?e:""}function BL(n,e){return n.length<=e?n:n.slice(0,e-1)+"\u2026"}function HL(n,e){if(n.length<=e)return n;let t=n.split(`
34
34
  `);for(;t.length>0;){let r=YI+t.join(`
@@ -400,7 +400,7 @@ ${A}`)}await this.mutateRecord(e.sessionId,{cwd:e.cwd,workspace:e.workspace}),th
400
400
  `)}}return S=!0,k||f.raw.end(),f});function i(u,f,p){let m=typeof u=="string"?u.trim():"";if(m.length===0)return null;let h;try{h=JSON.parse(m)}catch{return console.debug("events endpoint: skipping malformed JSONL line"),null}if(!h||typeof h!="object"||Array.isArray(h))return console.debug("events endpoint: skipping non-object JSONL line"),null;let g=h;if(typeof g.recordedAt!="number"||p!==void 0&&g.recordedAt<p||typeof g.params!="object"||g.params===null||Array.isArray(g.params))return null;let w=g.params;if(typeof w.update!="object"||w.update===null||Array.isArray(w.update))return null;let k=w.update.sessionUpdate;return typeof k!="string"||!f.has(k)?null:{recordedAt:g.recordedAt,entry:h}}function a(u,f,p){let h=f.params.update,g={sessionId:u,ts:new Date(f.recordedAt).toISOString(),kind:p,update:h};return h.messageId!==void 0&&h.messageId!==null&&(g.messageId=h.messageId),g}async function*d(u,f,p,m){for await(let h of f){let g=i(h,p,m);if(g){let w=g.entry.params.update.sessionUpdate;yield{ts:g.recordedAt,row:a(u,g.entry,w)}}}}async function c(u,f,p,m){let h=db.createInterface({input:ab.createReadStream(f),crlfDelay:1/0}),g=d(u,h,p,m),w=await g.next(),b=w.done?null:w.value;return{sessionId:u,rl:h,gen:g,current:b,exhausted:b===null}}async function l(u){let f=await u.gen.next();f.done?(u.exhausted=!0,u.current=null):u.current=f.value}n.get("/v1/sessions/events",async(u,f)=>{let p=u.query,m=p.kinds;if(!m||m.trim().length===0)return f.code(400).send({error:"kinds parameter is required"}),f;let h=m.split(",").map(I=>I.trim());if(h.length===0)return f.code(400).send({error:"kinds parameter is required"}),f;for(let I of h)if(!th.has(I))return f.code(400).send({error:`kind "${I}" is not queryable; allowed kinds: ${[...th].join(", ")}`}),f;let g=new Set(h),w;if(p.since!==void 0&&p.since.trim().length>0){let I=new Date(p.since);if(isNaN(I.getTime()))return f.code(400).send({error:"since is not a valid ISO-8601 timestamp"}),f;w=I.getTime()}let b=await e.list({includeNonInteractive:!0}),k=w!==void 0?b.filter(I=>new Date(I.updatedAt).getTime()>=w):b;f.raw.setHeader("content-type","application/x-ndjson"),f.raw.statusCode=200;let S=[];for(let I of k)try{let x=L.historyFile(I.sessionId),A=await c(I.sessionId,x,g,w);A.exhausted||S.push(A)}catch(x){if(x.code==="ENOENT")continue;throw x}u.raw.on("close",()=>{for(let I of S)try{I.rl.close()}catch{}f.raw.writableEnded||f.raw.end()});try{for(;S.length>0;){let I=-1,x=1/0;for(let M=0;M<S.length;M++){let E=S[M];E.current!==null&&E.current.ts<x&&(x=E.current.ts,I=M)}if(I===-1)break;let A=S[I];if(f.raw.write(JSON.stringify(A.current.row)+`
401
401
  `),await l(A),A.exhausted){try{A.rl.close()}catch{}S.splice(I,1)}}}catch(I){for(let x of S)try{x.rl.close()}catch{}throw I}return f.raw.end(),f}),n.get("/v1/sessions/:id/events",async(u,f)=>{let p=u.params.id,m=u.query,h=await e.resolveCanonicalId(p)??p;if(!e.get(h)&&!await e.hasRecord(h))return f.code(404).send({error:"session not found"}),f;let w=m.kinds;if(!w||w.trim().length===0)return f.code(400).send({error:"kinds parameter is required"}),f;let b=w.split(",").map(M=>M.trim());if(b.length===0)return f.code(400).send({error:"kinds parameter is required"}),f;for(let M of b)if(!th.has(M))return f.code(400).send({error:`kind "${M}" is not queryable; allowed kinds: ${[...th].join(", ")}`}),f;let k=new Set(b),S;if(m.since!==void 0&&m.since.trim().length>0){let M=new Date(m.since);if(isNaN(M.getTime()))return f.code(400).send({error:"since is not a valid ISO-8601 timestamp"}),f;S=M.getTime()}let I=L.historyFile(h),x=ab.createReadStream(I),A=db.createInterface({input:x,crlfDelay:1/0});f.raw.setHeader("content-type","application/x-ndjson"),f.raw.statusCode=200;try{for await(let M of A){let E=typeof M=="string"?M.trim():"";if(E.length===0)continue;let P;try{P=JSON.parse(E)}catch{console.debug("events endpoint: skipping malformed JSONL line in %s",I);continue}if(!P||typeof P!="object"||Array.isArray(P)){console.debug("events endpoint: skipping non-object JSONL line in %s",I);continue}let F=P;if(typeof F.recordedAt!="number"||typeof F.params!="object"||F.params===null||Array.isArray(F.params))continue;let z=F.params;if(typeof z.update!="object"||z.update===null||Array.isArray(z.update))continue;let V=z.update,U=V.sessionUpdate;if(typeof U!="string"||!k.has(U)||S!==void 0&&F.recordedAt<S)continue;let X={ts:new Date(F.recordedAt).toISOString(),kind:U,update:V};V.messageId!==void 0&&V.messageId!==null&&(X.messageId=V.messageId),f.raw.write(JSON.stringify(X)+`
402
402
  `)}}catch(M){if(M.code==="ENOENT")return f.raw.end(),f;throw M}return f.raw.end(),f}),n.post("/v1/sessions/:id/prompt/:messageId/notify",async(u,f)=>{let p=u.params,m=p.id,h=await e.resolveCanonicalId(m)??m,g=p.messageId,w=u.body,b=typeof w?.callbackUrl=="string"?w.callbackUrl:"",k=typeof w?.secret=="string"?w.secret:"";if(!g||!b||!k){f.code(400).send({error:"messageId, callbackUrl, and secret are all required"});return}let S;try{S=new URL(b)}catch{f.code(400).send({error:"callbackUrl must be a valid absolute URL"});return}if(S.protocol!=="https:"&&S.protocol!=="http:"){f.code(400).send({error:"callbackUrl must be http or https"});return}let I=e.get(h);if(!I){f.code(404).send({error:"session not found or not warm"});return}let x=I.registerTurnNotify(g,b,k);if(x.alreadyTerminal){f.code(200).send({status:"already_terminal",stopReason:x.stopReason});return}f.code(202).send({status:"registered"})}),n.get("/v1/sessions/:id/attention",async(u,f)=>{let p=u.params.id,m=await e.resolveCanonicalId(p)??p,h=e.get(m);return!h&&!await e.hasRecord(m)?(f.code(404).send({error:"session not found"}),f):h?{flags:h.listAttentionFlags()}:{flags:(await e.store.read(m))?.attentionFlags??[]}}),n.get("/v1/sessions/attention",async(u,f)=>{let p=u.query;if(!p.source||p.source.trim().length===0)return f.code(400).send({error:"source query parameter is required"}),f;let m=await e.list({includeNonInteractive:!0}),h=[];for(let g of m){let w=e.get(g.sessionId),b;w?b=w.listAttentionFlags():b=(await e.store.read(g.sessionId))?.attentionFlags??[];for(let k of b)k.source===p.source&&h.push({...k,sessionId:g.sessionId})}return{flags:h}}),n.post("/v1/sessions/:id/attention/clear",async(u,f)=>{let p=u.params.id,m=await e.resolveCanonicalId(p)??p,g=u.body??{},w=typeof g.source=="string"?g.source:"",b=typeof g.reason=="string"?g.reason:"";if((w.length>0||b.length>0)&&!(w.length>0&&b.length>0)){f.code(400).send({error:"both source and reason are required to clear a specific flag, or omit both to clear all"});return}w.length===0&&b.length;let k=e.get(m);if(k){if(w.length>0&&b.length>0)k.clearAttentionFlag(w,b);else{let M=Array.from(k.listAttentionFlags()).map(E=>`${E.source}::${E.reason}`);for(let E of M)k.clearAttentionFlag(E.split("::")[0],E.split("::").slice(1).join("::"))}f.code(204).send();return}if(!await e.hasRecord(m)){f.code(404).send({error:"session not found"});return}let S=e.store,I=await S.read(m);if(!I){f.code(404).send({error:"session not found"});return}let x=I.attentionFlags??[],A;if(w.length>0&&b.length>0){let M=`${w}::${b}`;A=x.filter(E=>`${E.source}::${E.reason}`!==M)}else A=[];if(A.length===x.length&&A.every((M,E)=>M.source===x[E].source&&M.reason===x[E].reason)){f.code(204).send();return}await S.write({...I,attentionFlags:A}),f.code(204).send()})}Ts();an();function cA(n,e,t,r={}){n.get("/v1/agents",async()=>Fd(e)),n.get("/v1/registry",async()=>e.load()),n.post("/v1/registry/refresh",async()=>{let s=await e.refresh();return{version:s.version,agentCount:s.agents.length}}),n.post("/v1/agents/:id/install",async(s,o)=>{let i=s.params.id,a=await e.getAgent(i);if(!a){o.code(404).send({error:`agent ${i} not found in registry`});return}if(a.distribution.uvx&&!a.distribution.npx&&!a.distribution.binary){o.send({agentId:a.id,version:a.version??"current",distribution:"uvx",installed:!1,message:"uvx agents resolve on first run; nothing to pre-install."});return}try{let d=await Er(a,[],{npmRegistry:r.npmRegistry}),c=a.distribution.npx?"npx":a.distribution.binary?"binary":"unknown";o.send({agentId:a.id,version:d.version,distribution:c,installed:!0,command:d.command})}catch(d){o.code(500).send({error:d.message})}}),n.post("/v1/agents/:id/sync",async(s,o)=>{let i=s.params.id;try{let{synced:a,skipped:d}=await t.syncFromAgent(i);return{synced:a.map(c=>({sessionId:c.sessionId,upstreamSessionId:c.upstreamSessionId,agentId:c.agentId,cwd:c.cwd,title:c.title,updatedAt:c.updatedAt})),skipped:d}}catch(a){let d=a;if(d.code===K.AgentNotInstalled){o.code(404).send({error:d.message});return}o.code(409).send({error:d.message})}})}ke();function lA(n,e,t,r=()=>[]){n.get("/v1/health",{config:{skipAuth:!0}},async()=>({status:"ok",version:e,configDigest:t,home:L.home(),driftedKeys:r()}))}var cB=/^[A-Za-z0-9._-]+$/;function rh(n,e,t){let r=e==="extension"?"extensions":"transformers",s=`/v1/${r}`;n.get(s,async()=>({[r]:t.list()})),n.get(`${s}/:name`,async(o,i)=>{let a=o.params.name,d=t.get(a);if(!d){i.code(404).send({error:`unknown ${e}: ${a}`});return}return d}),n.post(s,async(o,i)=>{let a=o.body??{},d=lB(a);if("error"in d){i.code(400).send({error:d.error});return}try{let c=t.register(d.config);i.code(201).send(c)}catch(c){Ql(i,c)}}),n.delete(`${s}/:name`,async(o,i)=>{let a=o.params.name;try{await t.unregister(a),i.code(204).send()}catch(d){Ql(i,d)}}),n.post(`${s}/:name/start`,async(o,i)=>{let a=o.params.name;try{let d=await t.startByName(a);i.code(200).send(d)}catch(d){Ql(i,d)}}),n.post(`${s}/:name/stop`,async(o,i)=>{let a=o.params.name;try{let d=await t.stopByName(a);i.code(200).send(d)}catch(d){Ql(i,d)}}),n.post(`${s}/:name/restart`,async(o,i)=>{let a=o.params.name;try{let d=await t.restartByName(a);i.code(200).send(d)}catch(d){Ql(i,d)}})}function Ql(n,e){let t=e.code,r=e.message??"unknown error";if(t==="NOT_FOUND"){n.code(404).send({error:r});return}if(t==="CONFLICT"){n.code(409).send({error:r});return}n.code(500).send({error:r})}function lB(n){let e=n.name;if(typeof e!="string"||!cB.test(e))return{error:"name must match [A-Za-z0-9._-]+"};let t=n.command;if(t!==void 0&&(!Array.isArray(t)||t.some(i=>typeof i!="string")))return{error:"command must be string[]"};let r=n.args;if(r!==void 0&&(!Array.isArray(r)||r.some(i=>typeof i!="string")))return{error:"args must be string[]"};let s=n.env;if(s!==void 0&&(typeof s!="object"||s===null||Array.isArray(s)))return{error:"env must be an object of string\u2192string"};if(s&&Object.values(s).some(i=>typeof i!="string"))return{error:"env values must be strings"};let o=n.enabled;return o!==void 0&&typeof o!="boolean"?{error:"enabled must be a boolean"}:{config:{name:e,command:t??[],args:r??[],env:s??{},enabled:o===void 0?!0:o}}}function uA(n,e){rh(n,"extension",e)}function fA(n,e){rh(n,"transformer",e)}function pA(n,e){n.get("/v1/config",async()=>e())}import{z as ai}from"zod";ke();import*as ii from"fs/promises";import*as yA from"path";import{randomBytes as uB,scrypt as fB,timingSafeEqual as pB}from"crypto";import{promisify as hB}from"util";var wA=hB(fB);function cb(){return yA.join(L.home(),"password-hash")}var hA=32768,mA=8,gA=1,mB=64,gB=16,bA=128*1024*1024;async function kA(n){if(typeof n!="string"||n.length===0)throw new Error("password must be a non-empty string");let e=uB(gB),t=await wA(n,e,mB,{N:hA,r:mA,p:gA,maxmem:bA}),r=`scrypt$${hA}$${mA}$${gA}$${e.toString("hex")}$${t.toString("hex")}
403
- `;await ii.mkdir(L.home(),{recursive:!0}),await ii.writeFile(cb(),r,{encoding:"utf8",mode:384})}async function sh(){try{return(await ii.readFile(cb(),"utf8")).trim().length>0}catch(n){if(n.code==="ENOENT")return!1;throw n}}async function oh(n){if(typeof n!="string"||n.length===0)return!1;let e;try{e=(await ii.readFile(cb(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let t=e.split("$");if(t.length!==6||t[0]!=="scrypt")return!1;let r=parseInt(t[1],10),s=parseInt(t[2],10),o=parseInt(t[3],10);if(!Number.isFinite(r)||!Number.isFinite(s)||!Number.isFinite(o))return!1;let i=Buffer.from(t[4],"hex"),a=Buffer.from(t[5],"hex");if(i.length===0||a.length===0)return!1;let d=await wA(n,i,a.length,{N:r,r:s,p:o,maxmem:bA});return d.length!==a.length?!1:pB(d,a)}var yB=ai.object({password:ai.string().min(1),label:ai.string().min(1).max(256).optional(),ttlSec:ai.number().int().positive().optional()}),wB=ai.object({id:ai.string().optional()}).optional(),bB=ai.object({token:ai.string().min(32)});function vA(n,e){n.post("/v1/auth/login",{config:{skipAuth:!0}},async(t,r)=>{let s=kB(t);if(e.rateLimiter.isBlocked(s))return r.code(429).send({error:"Too many failed attempts; try again later."});let o;try{o=yB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}if(!await sh())return r.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await oh(o.password))return e.rateLimiter.recordFailure(s),r.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(s);let a=await e.store.issue({label:o.label,ttlSec:o.ttlSec});return r.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),n.post("/v1/auth/logout",async(t,r)=>{let s;try{s=wB.parse(t.body??void 0)}catch{return r.code(400).send({error:"Invalid request body"})}let o=s?.id??t.authIdentity;if(!o||o==="service")return r.code(200).send({revoked:!1});let i=await e.store.revoke(o);return r.code(200).send({revoked:i})}),n.get("/v1/auth/verify",async(t,r)=>r.code(200).send({ok:!0})),n.get("/v1/auth/sessions",async(t,r)=>r.code(200).send({sessions:e.store.list()})),n.delete("/v1/auth/sessions",async(t,r)=>{let s=await e.store.revokeAll();return r.code(200).send({revoked:s})}),n.delete("/v1/auth/sessions/:id",async(t,r)=>{let s=t.params.id;return await e.store.revoke(s)?r.code(204).send():r.code(404).send({error:"Not found"})}),n.post("/v1/auth/rotate-token",async(t,r)=>{if(t.authIdentity!=="service")return r.code(403).send({error:"Requires the service token"});let s;try{s=bB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}return e.staticTokenValidator.rotate(s.token),r.code(200).send({rotated:!0})})}function kB(n){return n.ip||"unknown"}Ze();import{z as di}from"zod";ke();Qr();var lb=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,ih=class n{data;constructor(e){this.data=e}static async load(){let e=await Wt(L.peers());return new n(vB(e))}get(e){return this.data.entries[e]}async set(e){this.data.entries[e.name]=e,await SA(this.data)}async delete(e){return e in this.data.entries?(delete this.data.entries[e],await SA(this.data),!0):!1}list(){return Object.values(this.data.entries).map(({name:e,host:t,port:r,expiresAt:s,label:o,addedAt:i,pinnedFingerprint:a,pinnedAt:d})=>({name:e,host:t,port:r,expiresAt:s,label:o,addedAt:i,pinnedFingerprint:a,pinnedAt:d})).sort((e,t)=>e.addedAt.localeCompare(t.addedAt))}};function vB(n){if(!n||typeof n!="object")return{version:1,entries:{}};let e=n,t=e.entries&&typeof e.entries=="object"?e.entries:{},r={};for(let[s,o]of Object.entries(t)){if(!o||typeof o!="object")continue;let i=o;if(typeof i.name!="string"||typeof i.host!="string"||typeof i.port!="number"||typeof i.token!="string"||typeof i.expiresAt!="string"||typeof i.addedAt!="string")continue;let a={name:i.name,host:i.host,port:i.port,token:i.token,expiresAt:i.expiresAt,addedAt:i.addedAt};typeof i.label=="string"&&(a.label=i.label),typeof i.pinnedFingerprint=="string"&&(a.pinnedFingerprint=i.pinnedFingerprint),typeof i.pinnedAt=="string"&&(a.pinnedAt=i.pinnedAt),r[s]=a}return{version:1,entries:r}}async function SA(n){await Zt(L.peers(),n,{mode:384})}Ss();var SB=3600*24*365,Ls=class extends Error{status;constructor(e,t){super(e),this.name="PeerLoginError",this.status=t}};function xA(n,e){return`${en(n)?"http":"https"}://${n}:${e}`}async function IA(n){let e=n.fetchImpl??fetch,t=`${n.host}:${n.port}`,r=xA(n.host,n.port),s;try{s=await e(`${r}/v1/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:n.password,label:n.label,ttlSec:n.ttlSec??SB})})}catch(i){throw new Ls(`Could not reach ${t}: ${i.message}`,502)}if(s.status===401)throw new Ls(`Wrong password for ${t}.`,401);if(s.status===403)throw new Ls(`No password is configured on ${t}. Run \`hydra-acp auth password\` on that daemon first.`,502);if(s.status===429)throw new Ls(`Too many failed login attempts on ${t}; try again later.`,429);if(!s.ok)throw new Ls(`Login to ${t} failed: HTTP ${s.status}`,502);let o=await s.json();if(!o.session_token||!o.expires_at)throw new Ls(`Login to ${t} returned a malformed response.`,502);return{token:o.session_token,expiresAt:o.expires_at}}async function CA(n){let e=n.fetchImpl??fetch,t=xA(n.host,n.port);try{await e(`${t}/v1/auth/logout`,{method:"POST",headers:{Authorization:`Bearer ${n.token}`,"Content-Type":"application/json"},body:JSON.stringify({})})}catch{}}Ko();var xB=di.object({name:di.string().min(1).max(64).regex(lb),host:di.string().min(1),port:di.number().int().positive().optional(),password:di.string().min(1),label:di.string().min(1).max(256).optional(),ttlSec:di.number().int().positive().optional(),pinnedFingerprint:di.string().min(1).optional()});function RA(n,e){n.post("/v1/remotes",async(t,r)=>{let s;try{s=xB.parse(t.body)}catch{return r.code(400).send({error:`Invalid request body (name must match ${lb} and the rest is a normal login request)`})}let o=s.port??vn;s.pinnedFingerprint&&qo(s.host,o,s.pinnedFingerprint);let i;try{i=await IA({host:s.host,port:o,password:s.password,label:s.label,ttlSec:s.ttlSec})}catch(c){if(c instanceof Ls)return r.code(c.status).send({error:c.message});throw c}let a=new Date().toISOString(),d={name:s.name,host:s.host,port:o,token:i.token,expiresAt:i.expiresAt,addedAt:a,...s.label!==void 0?{label:s.label}:{},...s.pinnedFingerprint!==void 0?{pinnedFingerprint:s.pinnedFingerprint,pinnedAt:a}:{}};return await e.store.set(d),e.health?.markOk(d.name),r.code(201).send({name:d.name,host:d.host,port:d.port,expiresAt:d.expiresAt,label:d.label,addedAt:d.addedAt,pinnedFingerprint:d.pinnedFingerprint,status:e.health?.get(d.name)?.status??"unknown"})}),n.get("/v1/remotes",async(t,r)=>{let s=e.store.list().map(o=>{let i=e.health?.get(o.name);return{...o,status:i?.status??"unknown",...i?.checkedAt?{lastCheckedAt:i.checkedAt}:{}}});return r.code(200).send({remotes:s})}),n.delete("/v1/remotes/:name",async(t,r)=>{let s=t.params.name,o=e.store.get(s);return o?(await CA({host:o.host,port:o.port,token:o.token}),await e.store.delete(s),e.health?.forget(s),e.store.list().some(a=>a.host===o.host&&a.port===o.port)||ty(o.host,o.port),r.code(204).send()):r.code(404).send({error:"Not found"})})}Qo();la();yd();Ss();kl();an();var IB=new Set(["session/attach","session/detach","session/prompt","session/cancel","session/close","session/delete","hydra-acp/session/delete","session/set_model","session/set_mode","session/set_config_option","_session/steering","hydra-acp/prompt/cancel","hydra-acp/prompt/update","hydra-acp/prompt/amend","hydra-acp/session/tool_content","hydra-acp/session/force_cancel"]);function CB(n){return IB.has(n)}function TA(n,e,t,r){let s=[],o=a=>{for(let d of s)d(a)},i=(a,d)=>{e.handleLocalMessage(a,d,{connection:t.connection,clientId:r}).then(c=>c?n.send(c):void 0).catch(()=>{})};return n.onMessage(a=>{if("method"in a&&CB(a.method)){let d=a.params,c=typeof d?.sessionId=="string"?d.sessionId:void 0;if(c){if(so(c)){i(a,c);return}if(a.method==="session/attach"){let l="id"in a;e.resolveLocalMiss(c).then(u=>{if(u.ok){i(a,u.foreignId);return}if(u.ambiguous&&l){n.send(Xl(a.id,K.SessionNotFound,`Session "${c}" exists on more than one remote (${u.ambiguous.join(", ")}). Address it as "<remote>:${c}".`));return}o(a)});return}}}o(a)}),{send:a=>n.send(a),onMessage:a=>s.push(a),onClose:a=>n.onClose(a),close:()=>n.close()}}var ah=class{constructor(e,t=AB,r){this.store=e;this.dial=t;this.localMiss=r}store;dial;localMiss;attachments=new Map;async resolveLocalMiss(e){if(!this.localMiss)return{ok:!1};if(await this.localMiss.resolvesLocally(e))return{ok:!1};let t=this.localMiss.cache.findByLocalId(e);return t.length===0?{ok:!1}:t.length>1?{ok:!1,ambiguous:t.map(r=>r.name)}:{ok:!0,foreignId:ti(t[0])}}async handleLocalMessage(e,t,r){let s="id"in e,o=s?e.id:void 0,i=so(t);if(!i)return s?Xl(o,K.SessionNotFound,`not a federated session id: ${t}`):void 0;let a=AA(r.clientId,t),d={...e.params,sessionId:i.localId};if(e.method==="session/attach"){let l=this.store.get(i.name);if(!l)return s?Xl(o,K.SessionNotFound,`No remote named "${i.name}". Run \`hydra remote add\` first.`):void 0;let u=this.attachments.get(a);u&&(this.attachments.delete(a),u.peerConnection.close().catch(()=>{}));let f;try{f=await this.dial(l)}catch(g){return s?Xl(o,K.InternalError,`Could not reach remote "${i.name}": ${g.message}`):void 0}let p;try{p=await f.request("session/attach",d)}catch(g){return f.close().catch(()=>{}),s?ub(o,g):void 0}let m={peerConnection:f,localId:i.localId,target:r};this.wireAttachment(i.name,m),this.attachments.set(a,m);let h=p&&typeof p.sessionId=="string"?{...p,sessionId:t}:p;return s?{jsonrpc:"2.0",id:o,result:h}:void 0}let c=this.attachments.get(a);if(!c)return s?Xl(o,K.SessionNotFound,`"${t}" is not attached through this daemon.`):void 0;if(e.method==="session/detach"){let l,u;try{l=await c.peerConnection.request("session/detach",d)}catch(f){u=f}return this.attachments.delete(a),c.peerConnection.close().catch(()=>{}),u?s?ub(o,u):void 0:s?{jsonrpc:"2.0",id:o,result:l??{}}:void 0}if(s)try{let l=await c.peerConnection.request(e.method,d);return{jsonrpc:"2.0",id:o,result:l}}catch(l){return ub(o,l)}await c.peerConnection.notify(e.method,d).catch(()=>{})}detachClient(e){for(let[t,r]of[...this.attachments.entries()])r.target.clientId===e&&(this.attachments.delete(t),r.peerConnection.request("session/detach",{sessionId:r.localId}).catch(()=>{}),r.peerConnection.close().catch(()=>{}))}wireAttachment(e,t){let{peerConnection:r,localId:s,target:o}=t,i=ti({name:e,localId:s}),a=()=>{this.attachments.delete(AA(o.clientId,i))};r.onNotification("session/update",d=>{let c=d;!c||c.sessionId!==s||o.connection.notify("session/update",{...c,sessionId:i}).catch(()=>{})}),r.onNotification("hydra-acp/session/closed",d=>{let c=d;!c||c.sessionId!==s||(a(),o.connection.notify("hydra-acp/session/closed",{sessionId:i}).catch(()=>{}))}),r.onRequest("hydra-acp/session/request_permission",async d=>{let c=d;if(!c||c.sessionId!==s)throw{code:K.MethodNotFound,message:"unexpected sessionId"};return o.connection.request("hydra-acp/session/request_permission",{...c,sessionId:i})}),r.onClose(()=>{a(),o.connection.notify("hydra-acp/session/closed",{sessionId:i}).catch(()=>{})})}};function AA(n,e){return`${n} ${e}`}function Xl(n,e,t){return{jsonrpc:"2.0",id:n,error:{code:e,message:t}}}function ub(n,e){let t=e,r=typeof t?.code=="number"?t.code:K.InternalError,s=typeof t?.message=="string"?t.message:String(e??"forward failed");return{jsonrpc:"2.0",id:n,error:{code:r,message:s,...t?.data!==void 0?{data:t.data}:{}}}}var RB=1e4;async function AB(n){let t=`${en(n.host)?"ws":"wss"}://${n.host}:${n.port}/acp`,r=await ro(t,["acp.v1",`hydra-acp-token.${n.token}`],RB);return new In(Mr(r))}Ss();var TB=3e4,EB=5e3,dh=class{constructor(e,t={}){this.store=e;this.opts=t}store;opts;snapshots=new Map;timer;start(){this.timer||(this.checkAll(),this.timer=setInterval(()=>{this.checkAll()},this.opts.intervalMs??TB),this.timer.unref?.())}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}get(e){return this.snapshots.get(e)}markOk(e){this.snapshots.set(e,{status:"ok",checkedAt:new Date().toISOString()})}forget(e){this.snapshots.delete(e)}async checkAll(){let e=this.opts.fetchImpl??fetch;await Promise.allSettled(this.store.list().map(async t=>{let r=this.store.get(t.name);if(!r)return;let o=`${en(r.host)?"http":"https"}://${r.host}:${r.port}/v1/auth/verify`,i=new AbortController,a=setTimeout(()=>i.abort(),EB);try{let d=await e(o,{headers:{Authorization:`Bearer ${r.token}`},signal:i.signal});this.snapshots.set(t.name,{status:d.ok?"ok":"unauthorized",checkedAt:new Date().toISOString()})}catch(d){this.snapshots.set(t.name,{status:"unreachable",checkedAt:new Date().toISOString(),error:d.message})}finally{clearTimeout(a)}}))}};Ko();import{z as EA}from"zod";var PB=EA.object({sessionLabel:EA.string().min(1).max(256)});function PA(n,e){n.post("/v1/process-tokens",async(t,r)=>{if(t.authIdentity!=="service")return r.code(403).send({error:"Requires the service token"});let s;try{s=PB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}let o=e.processRegistry.mint(s.sessionLabel,"script");return r.code(201).send({token:o})}),n.delete("/v1/process-tokens/:sessionLabel",async(t,r)=>t.authIdentity!=="service"?r.code(403).send({error:"Requires the service token"}):(e.processRegistry.revoke(t.params.sessionLabel),r.code(204).send()))}Qo();Gd();la();import{nanoid as fb}from"nanoid";Qf();an();Ts();id();cr();import{randomBytes as FA}from"crypto";import*as LA from"os";import*as NA from"path";Ld();var MB=200;function _B(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object"||Array.isArray(e))return;let t=e[ft];if(!t||typeof t!="object"||Array.isArray(t))return;let r=t.sentBy;if(!r||typeof r!="object"||Array.isArray(r))return;let s=r,o={};if(typeof s.sessionId=="string"&&s.sessionId.length>0&&(o.sessionId=s.sessionId),typeof s.label=="string"&&s.label.length>0&&(o.label=s.label.slice(0,MB)),s.awaiting===!0&&(o.awaiting=!0),!(o.sessionId===void 0&&o.label===void 0))return o}async function MA(n,e,t){let r=_B(n);if(!r)return;let s={};if(r.label!==void 0&&(s.fromLabel=r.label),r.awaiting===!0&&(s.awaiting=!0),r.sessionId!==void 0){let o=await e.resolveCanonicalId(r.sessionId)??r.sessionId,i=await e.getOne(o);if(i){s.fromSession=o,i.title&&(s.fromSessionTitle=i.title);let a=e.get(o)?.currentPromptDepth;s.depth=(a??0)+1}else t?.(r.sessionId)}if(!(s.fromSession===void 0&&s.fromLabel===void 0))return s}var Zl=new Map;function _A(n,e){let t=Zl.get(n);t||(t=new Set,Zl.set(n,t)),t.add(e);let r=!1;return()=>{if(r)return;r=!0;let s=Zl.get(n);s&&(s.delete(e),s.size===0&&Zl.delete(n))}}function $A(n,e){if(n===e)return!0;let t=new Set,r=[e];for(;r.length>0;){let s=r.pop();if(t.has(s))continue;t.add(s);let o=Zl.get(s);if(o){if(o.has(n))return!0;for(let i of o)r.push(i)}}return!1}function ue(n,e,t){let r=new Error(e);return r.code=n,t!==void 0&&(r.data=t),r}function NB(n){if(!n||typeof n!="object")return 512;let r=n.params?.update;if(!r)return 512;let s=512,o=r.content;if(typeof o=="string")s+=o.length;else if(o&&typeof o=="object"){let a=o;typeof a.text=="string"&&(s+=a.text.length),typeof a.data=="string"&&(s+=a.data.length)}let i=r.toolCall;if(i&&(typeof i.rawInput=="string"?s+=i.rawInput.length:i.rawInput&&typeof i.rawInput=="object"&&(s+=256),typeof i.rawOutput=="string"?s+=i.rawOutput.length:i.rawOutput&&typeof i.rawOutput=="object"&&(s+=256),Array.isArray(i.content)))for(let a of i.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(s+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(s+=c.text.length)}}return s}function lr(n,e,t){let r=n.get(e);if(!r)throw ue(K.SessionNotFound,t??`session ${e} not found`);return r}async function ua(n,e){let t=oc(n),r,s,o;typeof e.summarizedThroughEntry=="number"&&e.summarizedThroughEntry>0&&n.mcpTokenRegistry!==void 0&&n.getDaemonOrigin!==void 0&&(r=FA(32).toString("hex"),s=n.mcpTokenRegistry.reserve(r),o={name:"hydra-acp-recall",type:"http",url:`${n.getDaemonOrigin()}/mcp/hydra-acp-recall`,headers:[{name:"Authorization",value:`Bearer ${r}`}]});let a=[...t?.descriptors??[],...o!==void 0?[o]:[]],d=ib({baselineMcpServers:void 0,stdinEnabled:!1,deps:n}),c;try{c=await n.manager.resurrect({...e,mcpServers:a,...d?{mintMcpServersForSwap:d}:{}})}catch(l){throw t!==void 0&&t.abandon(l instanceof Error?l:void 0),s!==void 0&&s.abandon(l instanceof Error?l:void 0),l}if(t!==void 0&&t.bindToSession(c),r!==void 0&&s!==void 0&&n.mcpTokenRegistry!==void 0){let l=r,u=n.mcpTokenRegistry;s.complete(c),c.onClose(()=>{u.unbind(l)})}return GB(c,n),BA(c.sessionId,n),c}function DA(n,e){n.get("/acp",{websocket:!0},async(t,r)=>{let s=_R({headers:r.headers,url:r.url});if(!s||!await e.validator.validate(s)){t.close(4401,"Unauthorized");return}let o=e.processRegistry?.resolve(s),i=`hydra_client_${fb(12)}`,a=Mr(t),d={},c=e.foreignSessions?TA(a,e.foreignSessions,d,i):a,l=new In(c);d.connection=l;let u={clientId:i,processIdentity:o,attached:new Map};l.onClose(()=>{for(let m of u.attached.values())e.manager.get(m.sessionId)?.detach(m.clientId);u.attached.clear(),e.foreignSessions?.detachClient(i)});let f=(m,h)=>{if(u.attached.get(m)?.readonly)throw ue(K.PermissionDenied,`${h} not permitted on a read-only attachment`)};if(l.onRequest("initialize",async m=>{let h=hI.parse(m??{});h.clientInfo?.name&&(u.clientInfo={name:h.clientInfo.name,...h.clientInfo.version!==void 0?{version:h.clientInfo.version}:{}});let g=h.clientInfo?.version;return g&&o&&(o.kind==="extension"?e.onExtensionVersion?.(o.name,g):e.onTransformerVersion?.(o.name,g)),KB()}),o&&e.extensionCommands){let m=e.extensionCommands;l.onRequest("hydra-acp/commands/register",async h=>{let g=h??{},w=Array.isArray(g.commands)?g.commands.map(b=>{if(!b||typeof b!="object")return;let k=b;if(typeof k.verb!="string")return;let S={verb:k.verb};return typeof k.argsHint=="string"&&(S.argsHint=k.argsHint),typeof k.description=="string"&&(S.description=k.description),S}).filter(b=>b!==void 0):[];return m.register(o.name,l,w),{ok:!0,registered:w.length}}),l.onClose(()=>{m.clear(o.name)})}if(o&&e.extensionMcp){let m=e.extensionMcp;l.onRequest("hydra-acp/mcp_tools/register",async g=>{let w=g??{},b=typeof w.instructions=="string"?w.instructions:void 0,k=Array.isArray(w.tools)?w.tools.map(S=>{if(!S||typeof S!="object")return;let I=S;if(typeof I.name!="string"||I.name.length===0||typeof I.description!="string"||I.inputSchema===null||typeof I.inputSchema!="object")return;let x={name:I.name,description:I.description,inputSchema:I.inputSchema};return I.outputSchema!==null&&typeof I.outputSchema=="object"&&(x.outputSchema=I.outputSchema),x}).filter(S=>S!==void 0):[];if(k.length===0)throw new Error("register_mcp_tools requires at least one tool");return m.register(o.name,l,b,k),{ok:!0,registered:k.length}});let h=g=>{let w=g??{};if(typeof w.sessionId!="string"||w.sessionId.length===0)throw ue(K.InvalidParams,"sessionId is required");return w.sessionId};if(l.onRequest("hydra-acp/session/extension_state/get",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw ue(K.InvalidParams,"key is required");if(!e.manager)throw ue(K.InternalError,"manager not wired");return{value:await e.manager.getExtensionStateKey(w,o.name,b.key)??null}}),l.onRequest("hydra-acp/session/extension_state/list",async g=>{let w=h(g);if(!e.manager)throw ue(K.InternalError,"manager not wired");return{state:await e.manager.getExtensionState(w,o.name)}}),l.onRequest("hydra-acp/session/extension_state/set",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw ue(K.InvalidParams,"key is required");if(b.value===void 0)throw ue(K.InvalidParams,"value is required (use extension_state/delete to remove)");if(!e.manager)throw ue(K.InternalError,"manager not wired");try{await e.manager.setExtensionStateKey(w,o.name,b.key,b.value)}catch(k){throw ue(K.InvalidParams,k.message)}return{ok:!0}}),l.onRequest("hydra-acp/session/extension_state/delete",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw ue(K.InvalidParams,"key is required");if(!e.manager)throw ue(K.InternalError,"manager not wired");return await e.manager.deleteExtensionStateKey(w,o.name,b.key),{ok:!0}}),e.extensionMcpControls){let g=e.extensionMcpControls;l.onRequest("hydra-acp/mcp_tools/refresh_session",async w=>{let b=w??{};if(typeof b.sessionId!="string"||b.sessionId.length===0)throw ue(K.InvalidParams,"refresh_session requires sessionId");return await g.notifyToolListChanged(b.sessionId,o.name),{ok:!0}})}l.onClose(()=>{m.clear(o.name)})}if(o?.kind==="transformer"){l.onRequest("hydra-acp/transformer/initialize",async h=>{let g=h??{},w=Array.isArray(g.intercepts)?g.intercepts.filter(b=>typeof b=="string"):[];if(e.transformers&&(e.transformers.registerConnection(o.name,l,w),e.manager?.defaultTransformers.includes(o.name))){let b=e.transformers.resolveChain([o.name])[0];if(b)for(let k of e.manager.liveSessions())k.addTransformer(b)}return{ack:!0}}),l.onClose(()=>{e.transformers?.deregisterConnection(o.name)}),l.onRequest("hydra-acp/message/emit",async h=>{let g=h??{},w=typeof g.sessionId=="string"?g.sessionId:void 0,b=typeof g.method=="string"?g.method:void 0,k=g.envelope,S=g.route;if(!w)throw ue(-32602,"emit_message requires sessionId");if(!b&&S!=="client_broadcast")throw ue(-32602,"emit_message requires method");let I=lr(e.manager,w),x=typeof g.respondsTo=="string"?g.respondsTo:void 0;if(x)return I.dischargeClaim(x,k),{ok:!0};if(S==="chain")return{ok:!0,response:await I.emitToChain(o.name,b,k)};if(S==="queue"){if(b!=="session/prompt")throw ue(-32602,'route "queue" only supports method "session/prompt"');return{ok:!0,response:await I.emitToQueue(o.name,k)}}if(S==="daemon")return{ok:!0,response:await I.emitToChain(o.name,b,k)};if(S==="client_broadcast"){if(!k||typeof k!="object")throw ue(-32602,"client_broadcast requires an envelope object");return I.broadcastClientUpdate(k),{ok:!0}}throw ue(-32602,`unsupported route: ${JSON.stringify(S)}`)}),l.onRequest("hydra-acp/session/request_permission",async h=>{let g=h??{},w=typeof g.sessionId=="string"?g.sessionId:void 0;if(!w)throw ue(-32602,"hydra-acp/session/request_permission requires sessionId");return lr(e.manager,w).requestPermissionFromClients(g)}),l.onRequest("hydra-acp/transformer/attach",async h=>WB(h,o.name,e)),l.onRequest("hydra-acp/child_session/spawn",async h=>{let g=h??{},w=typeof g.agentId=="string"?g.agentId:void 0,b=typeof g.cwd=="string"?g.cwd:void 0,k=typeof g.parentSessionId=="string"?g.parentSessionId:void 0,S=g._meta&&typeof g._meta=="object"?g._meta:void 0,I=S&&S["hydra-acp"]&&typeof S["hydra-acp"]=="object"?S["hydra-acp"]:void 0,x=I&&typeof I.title=="string"?I.title:void 0,A=I&&typeof I.model=="string"?I.model:void 0;if(!b&&k){let X=e.manager.get(k);X&&(b=X.cwd)}if(!b)throw ue(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let M=await od(b),E=w??M.agentId??e.defaultAgent,P=await e.registry?.getAgent(E),F=Tr(M.configDefaults,P??{id:E})?.value,z=A??F?.model,V=typeof g.interactive=="boolean"?g.interactive:!1;return{childSessionId:(await e.manager.create({agentId:E,cwd:b,parentSessionId:k,interactive:V,transformChain:[],title:x,model:z,configDefaults:F})).sessionId}}),l.onRequest("hydra-acp/session/fork",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw ue(K.InvalidParams,"fork_session requires sessionId");let w=typeof g.forkAt=="string"?g.forkAt:void 0,b=typeof g.cwd=="string"?g.cwd:void 0,k=typeof g.agentId=="string"?g.agentId:void 0,S=typeof g.mode=="string"&&(g.mode==="verbatim"||g.mode==="synthesis")?g.mode:void 0,I=typeof g.model=="string"&&g.model.length>0?g.model:void 0,x=await e.manager.forkSession(g.sessionId,{...w!==void 0?{forkAt:w}:{},...b!==void 0?{cwd:b}:{},...k!==void 0?{agentId:k}:{},...S!==void 0?{mode:S}:{},...I!==void 0?{model:I}:{}}),A=e.manager.get(x.sessionId);if(!A){let P=await e.manager.loadFromDisk(x.sessionId);if(!P)throw ue(K.InternalError,`fork ${x.sessionId} vanished before it could be attached`);A=await ua(e,{...P,onInstallProgress:ch(l)})}ic(u,A,A.sessionId);let M=ci(l,A,u),{entries:E}=await A.attach(M,"full");u.attached.set(A.sessionId,{sessionId:A.sessionId,clientId:M.clientId,readonly:!1});for(let P of E){if(l.isClosed())break;await l.notify(P.method,Ps(Es(P.params,P.recordedAt),P.seq)).catch(()=>{})}return{...x,sessionId:A.sessionId}}),l.onRequest("session/fork",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw ue(K.InvalidParams,"session/fork requires sessionId");let w=typeof g.cwd=="string"?g.cwd:void 0,b=await e.manager.forkSession(g.sessionId,{...w!==void 0?{cwd:w}:{},mode:"verbatim"}),k=e.manager.get(b.sessionId);if(!k){let x=await e.manager.loadFromDisk(b.sessionId);if(!x)throw ue(K.InternalError,`fork ${b.sessionId} vanished before it could be attached`);k=await ua(e,{...x,onInstallProgress:ch(l)})}ic(u,k,k.sessionId);let S=ci(l,k,u),{entries:I}=await k.attach(S,"full");u.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:S.clientId,readonly:!1});for(let x of I){if(l.isClosed())break;await l.notify(x.method,Ps(Es(x.params,x.recordedAt),x.seq)).catch(()=>{})}return{sessionId:k.sessionId}});let m=async(h,g)=>{let w=h??{};if(typeof w.sessionId!="string")throw ue(K.InvalidParams,`${g} requires sessionId`);let b=await e.manager.resolveCanonicalId(w.sessionId)??w.sessionId,k=e.manager.get(b);if(k)return await k.close({deleteRecord:!0,by:`session/delete ${u.clientId}`}),await e.manager.waitForDeletion(b),await e.manager.hasRecord(b)&&await e.manager.deleteRecord(b),{id:b,existed:!0};let S=await e.manager.deleteRecord(b);return{id:b,existed:S}};l.onRequest("session/delete",async h=>(await m(h,"session/delete"),{})),l.onRequest("session/close",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw ue(K.InvalidParams,"session/close requires sessionId");f(g.sessionId,"session/close");let w=await e.manager.resolveCanonicalId(g.sessionId)??g.sessionId,b=e.manager.get(w);if(b)return await b.close({deleteRecord:!1,by:`session/close ${u.clientId}`+(u.processIdentity?` (${u.processIdentity.name})`:"")}),{};if(await e.manager.hasRecord(w))return{};throw ue(K.SessionNotFound,`session ${w} not found`)}),l.onRequest("hydra-acp/session/delete",async h=>{let{id:g,existed:w}=await m(h,"hydra-acp/session/delete");if(!w)throw ue(K.SessionNotFound,`session ${g} not found`);return{deleted:!0,sessionId:g}}),l.onRequest("hydra-acp/child_session/await",async h=>{let g=h??{},w=typeof g.childSessionId=="string"?g.childSessionId:void 0,b=g.until==="idle"?"idle":"turn_complete",k=typeof g.timeoutMs=="number"?Math.min(g.timeoutMs,18e5):3e5;if(!w)throw ue(-32602,"await_child requires childSessionId");let S=lr(e.manager,w,`child session ${w} not found`);return new Promise(I=>{let M=[],E=[],P=0,F=!1,z,V,U=!1,X=()=>{U||(U=!0,clearTimeout(ee),z?.(),V?.(),I(F?{entries:M,truncated:!0}:{entries:M}))};z=S.onBroadcast(ve=>{let Me=NB(ve);for(M.push(ve),E.push(Me),P+=Me;M.length>0&&(M.length>1e3||P>1048576);)M.shift(),P-=E.shift()??0,F=!0;b==="turn_complete"&&ve.params?.update?.sessionUpdate==="turn_complete"&&X()});let ee=setTimeout(X,k);typeof ee.unref=="function"&&ee.unref(),V=S.onClose(()=>X())})}),l.onRequest("hydra-acp/child_session/close",async h=>{let g=h??{},w=typeof g.childSessionId=="string"?g.childSessionId:void 0;if(!w)throw ue(-32602,"close_child_session requires childSessionId");let b=e.manager.get(w);return b&&await b.close({deleteRecord:!1,by:`child_session/close ${u.clientId}`}),{ok:!0}}),l.onRequest("hydra-acp/attention/set",async h=>jB(h,o.name,e)),l.onRequest("hydra-acp/attention/clear",async h=>qB(h,o.name,e)),l.onRequest("hydra-acp/connection/keep_alive",async h=>{let g=h??{},w=typeof g.token=="string"?g.token:void 0,b=typeof g.sessionId=="string"?g.sessionId:void 0,k=typeof g.estimatedRemainingMs=="number"?g.estimatedRemainingMs:void 0;return w&&b&&e.manager.get(b)?.keepAliveClaim(w,k),{ok:!0}})}l.onRequest("hydra-acp/session/tool_content",async m=>{let h=m??{};if(typeof h.sessionId!="string"||typeof h.hash!="string")throw ue(K.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let g=await e.manager.resolveCanonicalId(h.sessionId)??h.sessionId,w=await e.manager.loadToolBlob(g,h.hash);if(w===null)throw ue(K.SessionNotFound,"tool content not found");return{content:w}}),l.onRequest("authenticate",async m=>DB(m,e)),l.onRequest("logout",async m=>BB(m,e)),l.onRequest("session/new",async m=>{let h=mI.parse(m),g=On(m?._meta),w=Array.isArray(g.transformers)&&g.transformers.every(Ce=>typeof Ce=="string")?g.transformers:e.manager.defaultTransformers??[],b=e.transformers?.resolveChain(w)??[],k=await od(h.cwd),S=g.agentId??k.agentId??e.defaultAgent,I=await e.registry?.getAgent(S),x=Tr(k.configDefaults,I??{id:S})?.value,A,M,E=h.mcpServers;if(g.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){A=FA(32).toString("hex"),M=e.mcpTokenRegistry.reserve(A);let Ke={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${A}`}]};E=[...h.mcpServers??[],Ke]}let P,F,z=oc(e);z!==void 0&&(E=[...E??[],...z.descriptors]);let V=ib({baselineMcpServers:h.mcpServers,stdinEnabled:g.mcpStdin===!0,deps:e}),U;try{U=await e.manager.create({cwd:h.cwd,agentId:S,mcpServers:E,title:g.title,agentArgs:g.agentArgs,model:g.model??x?.model,configDefaults:x,onInstallProgress:ch(l),transformChain:b,originatingClient:u.clientInfo,...g.interactive!==void 0?{interactive:g.interactive}:{},...g.env!==void 0?{forwardedEnv:g.env}:{},...g.workspace!==void 0?{workspace:g.workspace}:{},...V?{mintMcpServersForSwap:V}:{}})}catch(Ce){throw M!==void 0&&M.abandon(Ce instanceof Error?Ce:void 0),F!==void 0&&F.abandon(Ce instanceof Error?Ce:void 0),z!==void 0&&z.abandon(Ce instanceof Error?Ce:void 0),Ce}if(A!==void 0&&M!==void 0&&e.mcpTokenRegistry!==void 0){let Ce=A,Ke=e.mcpTokenRegistry;M.complete(U),U.onClose(()=>{Ke.unbind(Ce)})}if(P!==void 0&&F!==void 0&&e.mcpTokenRegistry!==void 0){let Ce=P,Ke=e.mcpTokenRegistry;F.complete(U),U.onClose(()=>{Ke.unbind(Ce)})}z!==void 0&&z.bindToSession(U),BA(U.sessionId,e);let X,ee;try{ic(u,U,U.sessionId),X=ci(l,U,u),{entries:ee}=await U.attach(X,"full")}catch(Ce){throw await U.close({deleteRecord:!1,by:"session/new attach-failed"}).catch(()=>{}),Ce}u.attached.set(U.sessionId,{sessionId:U.sessionId,clientId:X.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let Ce of ee){if(l.isClosed())break;await l.notify(Ce.method,Ps(Es(Ce.params,Ce.recordedAt),Ce.seq)).catch(()=>{})}})()});let ve=lh(U),Me=uh(U);return{sessionId:U.sessionId,...ve?{modes:ve}:{},...Me?{models:Me}:{},configOptions:U.buildConfigOptions(),_meta:fh(e.manager,U,{clientId:X.clientId})}}),l.onRequest("session/attach",async m=>{let h=yI.parse(m),g=h.clientInfo?.version;g&&o&&(o.kind==="extension"?e.onExtensionVersion?.(o.name,g):e.onTransformerVersion?.(o.name,g));let w=On(h._meta),b=w.resume,k=w.readonly===!0,S=w.env;n.log.info(`session/attach sessionId=${h.sessionId} hasResumeHints=${!!b} readonly=${k}`);let I=b?h.sessionId:await e.manager.resolveCanonicalId(h.sessionId)??h.sessionId,x=e.manager.get(I);if(!x&&k){let U=await e.manager.loadFromDisk(I);if(!U)throw ue(K.SessionNotFound,`session ${h.sessionId} not found`);let X=await e.manager.loadHistory(I),ee=h.clientId??`cli_${fb(8)}`;u.attached.set(U.hydraSessionId,{sessionId:U.hydraSessionId,clientId:ee,readonly:!0}),n.log.info(`session/attach OK (viewer) sessionId=${U.hydraSessionId} clientId=${ee} attachedCount=${u.attached.size} replayed=${X.length}`);for(let ve of X)await l.notify(ve.method,Ps(Es(ve.params,ve.recordedAt),ve.seq)).catch(()=>{});return{sessionId:U.hydraSessionId,clientId:ee,connectedClients:[ee],historyPolicy:"full",replayed:X.length,_meta:zB(U)}}let A=!x;if(!x){let U=await e.manager.loadFromDisk(I),X=await HB(I,b,U?.upstreamSessionId,e.manager);X.kind==="ignore"&&n.log.warn(X.logMessage);let ee=U;if(b&&X.kind==="honor"&&(ee={...U,hydraSessionId:h.sessionId,upstreamSessionId:b.upstreamSessionId,agentId:b.agentId,cwd:U?.workspace?.path??b.cwd,...b.title!==void 0?{title:b.title}:{},...b.agentArgs!==void 0?{agentArgs:b.agentArgs}:{}}),!ee)throw ue(K.SessionNotFound,`session ${h.sessionId} not found and no resume hints provided`);if(await e.manager.isTombstoned(ee.agentId,ee.upstreamSessionId))throw ue(K.SessionNotFound,`session ${h.sessionId} was deleted`);let ve=ee.originatingClient?ee:{...ee,originatingClient:u.clientInfo},Me=S!==void 0?{...ve,forwardedEnv:S}:ve;x=await ua(e,{...Me,onInstallProgress:ch(l)})}ic(u,x,x.sessionId);let M=ci(l,x,u,h.clientInfo,h.clientId),E=w.replayMode==="drip",{entries:P,appliedPolicy:F}=await x.attach(M,h.historyPolicy,{afterMessageId:h.afterMessageId,afterSeq:h.afterSeq,raw:E,...w.historyLimit!==void 0?{historyLimit:w.historyLimit}:{},...w.toolContent!==void 0?{toolContent:w.toolContent}:{}});if(u.attached.set(x.sessionId,{sessionId:x.sessionId,clientId:M.clientId,readonly:k}),S!==void 0&&await e.manager.setForwardedEnv(x.sessionId,S).catch(()=>{}),n.log.info(`session/attach OK sessionId=${x.sessionId} clientId=${M.clientId} attachedCount=${u.attached.size} requestedPolicy=${h.historyPolicy} appliedPolicy=${F} replayed=${P.length} readonly=${k}${E?" replayMode=drip":""}`),E){let U=w.dripSpeed&&w.dripSpeed>0?w.dripSpeed:1,X=750;(async()=>{let ee=null;for(let ve of P){let Me=typeof ve.recordedAt=="number"?ve.recordedAt:null;if(ee!==null&&Me!==null){let Ce=Math.min(X,Math.max(0,(Me-ee)/U));Ce>0&&await new Promise(Ke=>setTimeout(Ke,Ce))}Me!==null&&(ee=Me);try{await l.notify(ve.method,Ps(Es(ve.params,Me??void 0),ve.seq))}catch{return}}})()}else for(let U=0;U<P.length&&!l.isClosed();U++){let X=P[U],ee=l.notify(X.method,Ps(Es(X.params,X.recordedAt),X.seq)).catch(()=>{});(U+1)%200===0&&await ee}x.replayPendingPermissions(M);let z=lh(x),V=uh(x);return{sessionId:x.sessionId,clientId:M.clientId,connectedClients:x.connectedClients(M.clientId),historyPolicy:F,replayed:P.length,...z?{modes:z}:{},...V?{models:V}:{},configOptions:x.buildConfigOptions(),_meta:fh(e.manager,x,{resurrected:A})}}),l.onRequest("session/detach",async m=>{let h=wI.parse(m),g=u.attached.get(h.sessionId);if(!g)throw ue(K.SessionNotFound,"client not attached to that session");let w=e.manager.get(h.sessionId);return w?.detach(g.clientId),u.attached.delete(h.sessionId),w&&e.manager.reapIfOrphanedNonInteractive(h.sessionId),{sessionId:h.sessionId,_meta:{[ft]:{detachStatus:"detached"}}}}),l.onRequest("session/list",async m=>{let h=bI.parse(m??{});return{sessions:(await e.manager.list({cwd:h.cwd})).filter(k=>k.originatingClient?.name!==sa).map(kI)}}),l.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw ue(K.InternalError,"agent registry unavailable");return Fd(e.registry)}),l.onRequest("hydra-acp/agents/auth_methods",async m=>{let h=m??{};if(typeof h.agentId!="string"||h.agentId.length===0)throw ue(K.InvalidParams,"hydra-acp/agents/auth_methods requires a non-empty agentId string");return{authMethods:(await e.manager.bootstrapAgentForAuth(h.agentId)).authMethods??[]}}),l.onRequest("session/prompt",async m=>{let h=SI.parse(m);f(h.sessionId,"session/prompt");let g=await MA(h,e.manager,S=>{n.log.warn(`session/prompt: dropping unknown sentBy.sessionId=${S} sessionId=${h.sessionId}`)});if(g?.fromSession!==void 0){if((g.depth??0)>3)throw n.log.warn(`session/prompt: refusing depth ${g.depth} chain from ${g.fromSession} to ${h.sessionId}`),ue(K.InvalidRequest,`message chain too deep (${g.depth} hops, max ${3}): refusing to continue a session-to-session loop`);if(g.awaiting===!0&&$A(g.fromSession,h.sessionId))throw n.log.warn(`session/prompt: refusing deadlock ${g.fromSession} -> ${h.sessionId}`),ue(K.InvalidRequest,`would deadlock: ${h.sessionId} is already blocked waiting on ${g.fromSession}. Send with --no-wait, or let the other turn finish first.`)}let w=u.attached.get(h.sessionId);if(!w)throw n.log.warn(`session/prompt rejected: not attached sessionId=${h.sessionId} attachedKeys=[${[...u.attached.keys()].join(",")}]`),ue(K.SessionNotFound,"not attached to session");let b=e.manager.get(h.sessionId);if(!b){let S=await e.manager.loadFromDisk(h.sessionId);if(!S)throw ue(K.SessionNotFound,`session ${h.sessionId} not found`);n.log.info(`session/prompt auto-resurrecting cold sessionId=${h.sessionId}`),b=await ua(e,S);let I=ci(l,b,u,void 0,w.clientId);await b.attach(I,"none")}let k=g?.awaiting===!0&&g.fromSession!==void 0?_A(g.fromSession,h.sessionId):void 0;try{return await b.prompt(w.clientId,h,g)}finally{k?.()}});let p=m=>{let h;try{h=qf.parse(m)}catch(b){n.log.warn(`session/cancel: invalid params: ${b.message}`);return}let g=u.attached.get(h.sessionId);if(!g)return;if(g.readonly){n.log.warn(`session/cancel dropped (readonly attachment) sessionId=${h.sessionId}`);return}let w=e.manager.get(h.sessionId);w&&w.cancel(g.clientId).catch(b=>{n.log.warn(`session/cancel for ${h.sessionId}: ${b.message}`)})};l.onNotification("session/cancel",p),l.onRequest("session/cancel",async m=>{let h=qf.parse(m);return f(h.sessionId,"session/cancel"),p(m),null}),l.onRequest("hydra-acp/prompt/cancel",async m=>{let h=II.parse(m);return f(h.sessionId,"hydra-acp/prompt/cancel"),lr(e.manager,h.sessionId).cancelQueuedPrompt(h.messageId)}),l.onRequest("hydra-acp/session/force_cancel",async m=>{let h=qf.parse(m);return f(h.sessionId,"hydra-acp/session/force_cancel"),lr(e.manager,h.sessionId).forceCancel()}),l.onRequest("hydra-acp/prompt/update",async m=>{let h=CI.parse(m);return f(h.sessionId,"hydra-acp/prompt/update"),lr(e.manager,h.sessionId).updateQueuedPrompt(h.messageId,h.prompt)}),l.onRequest("hydra-acp/prompt/amend",async m=>{let h=RI.parse(m);f(h.sessionId,"hydra-acp/prompt/amend");let g=u.attached.get(h.sessionId);if(!g)throw ue(K.SessionNotFound,"not attached to session");return lr(e.manager,h.sessionId).amendPrompt(g.clientId,h)}),l.onRequest("_session/steering",async m=>{let h=AI.parse(m);f(h.sessionId,"_session/steering");let g=u.attached.get(h.sessionId);if(!g)throw ue(K.SessionNotFound,"not attached to session");let w=e.manager.get(h.sessionId);if(!w){let b=await e.manager.loadFromDisk(h.sessionId);if(!b)throw ue(K.SessionNotFound,`session ${h.sessionId} not found`);w=await ua(e,b);let k=ci(l,w,u,void 0,g.clientId);await w.attach(k,"none")}return w.steer(g.clientId,h)}),l.onRequest("session/resume",async m=>{let h=m??{},g=typeof h.sessionId=="string"?h.sessionId:void 0;if(!g)throw ue(K.InvalidParams,"session/resume requires sessionId");let w=await e.manager.resolveCanonicalId(g)??g,b=e.manager.get(w);if(!b){let x=await e.manager.loadFromDisk(w);if(!x)throw ue(K.SessionNotFound,`session ${g} not found in memory or on disk`);b=await ua(e,x)}ic(u,b,b.sessionId);let k=ci(l,b,u);await b.attach(k,"pending_only"),u.attached.set(b.sessionId,{sessionId:b.sessionId,clientId:k.clientId,readonly:!1}),b.replayPendingPermissions(k);let S=lh(b),I=uh(b);return{sessionId:b.sessionId,...S?{modes:S}:{},...I?{models:I}:{},configOptions:b.buildConfigOptions(),_meta:fh(e.manager,b,{clientId:k.clientId})}}),l.onRequest("session/load",async m=>{let h=m??{},g=typeof h.sessionId=="string"?h.sessionId:void 0;if(!g)throw ue(K.InvalidParams,"session/load requires sessionId");let w=await e.manager.resolveCanonicalId(g)??g,b=e.manager.get(w);if(!b){let A=await e.manager.loadFromDisk(w);if(!A)throw ue(K.SessionNotFound,`session ${g} not found in memory or on disk`);b=await ua(e,A)}ic(u,b,b.sessionId);let k=ci(l,b,u),{entries:S}=await b.attach(k,"full");u.attached.set(b.sessionId,{sessionId:b.sessionId,clientId:k.clientId,readonly:!1});for(let A of S){if(l.isClosed())break;await l.notify(A.method,Ps(Es(A.params,A.recordedAt),A.seq)).catch(()=>{})}b.replayPendingPermissions(k);let I=lh(b),x=uh(b);return{sessionId:b.sessionId,...I?{modes:I}:{},...x?{models:x}:{},configOptions:b.buildConfigOptions(),_meta:fh(e.manager,b,{clientId:k.clientId})}}),l.onRequest("session/set_model",async m=>{let h=m?.sessionId;typeof h=="string"&&f(h,"session/set_model");let g=UB(m,e.manager);if(g.kind==="error")throw n.log.warn(g.logMessage),ue(g.code,g.message);if(g.kind==="no_op")return n.log.warn(g.logMessage),await l.notify("session/update",{sessionId:g.sessionId,update:{sessionUpdate:"_hydra_current_model_update",currentModel:g.currentModel}}).catch(()=>{}),null;n.log.info(g.logMessage);let{modelId:w}=g,b=await g.session.forwardModelChange(w,m);return g.session.applyAgentConfigOptionResponse(b,"model"),g.session.applyModelChange(w),b}),l.onRequest("session/set_mode",async m=>{let h=m,g=h?.sessionId;if(typeof g=="string"&&f(g,"session/set_mode"),!h||typeof h.sessionId!="string")throw ue(K.InvalidParams,"session/set_mode requires string sessionId");if(typeof h.modeId!="string")throw ue(K.InvalidParams,"session/set_mode requires string modeId");let w=lr(e.manager,h.sessionId),b=await w.forwardRequest("session/set_mode",m);return w.applyModeChange(h.modeId),b}),l.onRequest("session/set_config_option",async m=>{let h=m,g=S=>ue(K.InvalidParams,S),w=h?.sessionId;if(typeof w=="string"&&f(w,"session/set_config_option"),!h||typeof h.sessionId!="string")throw g("session/set_config_option requires string sessionId");if(typeof h.configId!="string")throw g("session/set_config_option requires string configId");if(typeof h.value!="string")throw g("session/set_config_option requires string value");let b=lr(e.manager,h.sessionId),k=b.buildConfigOptions().find(S=>S.id===h.configId);if(!k)throw g(`unknown configId ${JSON.stringify(h.configId)} for this session`);if(!k.options.some(S=>S.value===h.value))throw g(`value ${JSON.stringify(h.value)} is not valid for configId ${JSON.stringify(h.configId)}`);switch(h.configId){case"model":{if(h.value!==b.currentModel){let S=await b.forwardModelChange(h.value);b.applyAgentConfigOptionResponse(S,"model")}b.applyModelChange(h.value);break}case"mode":{h.value!==b.currentMode&&await b.forwardRequest("session/set_mode",{sessionId:h.sessionId,modeId:h.value}),b.applyModeChange(h.value);break}case"agent":{h.value!==b.agentId&&await b.setAgent(h.value);break}default:{let S=await b.forwardRequest("session/set_config_option",{sessionId:h.sessionId,configId:h.configId,value:h.value});b.applyAgentConfigOptionResponse(S,h.configId)&&b.broadcastConfigOptions()}}return{configOptions:b.buildConfigOptions()}}),l.setDefaultHandler(async(m,h)=>{let g=new Set(["hydra-acp/attention/set","hydra-acp/attention/clear"]),w=h.startsWith("session/"),b=h.startsWith("hydra-acp/");if(!w&&!b||m===null||typeof m!="object"||g.has(h))throw ue(K.MethodNotFound,`Method not found: ${h}`);let k=m.sessionId;if(typeof k!="string")throw ue(K.MethodNotFound,`Method not found: ${h}`);return f(k,h),lr(e.manager,k).forwardRequest(h,m)})})}async function DB(n,e){let t=n??{};if(typeof t.methodId!="string"||t.methodId.length===0)throw ue(K.InvalidParams,"authenticate requires a non-empty methodId string");let r=t.methodId,s=t._meta?.["hydra-acp"],o=typeof s?.sessionId=="string"?s.sessionId:void 0,i=typeof s?.agentId=="string"?s.agentId:void 0,a=o!==void 0?e.manager.getAgentForSession(o):void 0;if(!a||!a.isAlive()){let p=i??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(p)}let d=a.authMethods??[],c=d.find(p=>p.id===r);if(!c){let p=d.map(m=>m.id);throw ue(K.InvalidParams,`authenticate: methodId ${JSON.stringify(r)} is not advertised by agent ${a.agentId}; valid: [${p.map(m=>JSON.stringify(m)).join(", ")}]`)}let l=c._meta?.type,u=(()=>{let p=c._meta?.["terminal-auth"];if(p&&typeof p=="object"&&!Array.isArray(p))return p})();if((c.type??(l==="agent"||l==="terminal"?l:u!==void 0?"terminal":"agent"))==="terminal"){let p=(k,S)=>{if(!Array.isArray(k))throw ue(K.InvalidParams,`authenticate: method ${JSON.stringify(r)} ${S} must be a string[]; got ${k===null?"null":typeof k}`);for(let I of k)if(typeof I!="string")throw ue(K.InvalidParams,`authenticate: method ${JSON.stringify(r)} ${S} must be string[]; got non-string entry ${JSON.stringify(I)}`);return k},m=await e.manager.planSpawnForAgent(a.agentId),h,g;if(u?.args!==void 0){let k=typeof u.command=="string"?u.command:void 0;h=k!==void 0&&NA.isAbsolute(k)?k:m.command,g=p(u.args,'_meta["terminal-auth"].args')}else{let k=c.args!==void 0?{raw:c.args,label:"args"}:c._meta?.args!==void 0?{raw:c._meta.args,label:"_meta.args"}:void 0,S=k!==void 0?p(k.raw,k.label):[];h=m.command,g=[...m.args,...S]}let w={};for(let[k,S]of Object.entries(process.env))typeof S=="string"&&(w[k]=S);Object.assign(w,m.env);let b=LA.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${r}`),{kind:"terminal",command:h,args:g,env:w,cwd:b}}try{return await a.connection.request("authenticate",{methodId:r})}catch(p){throw si(p,a)}}async function BB(n,e){let r=(n??{})._meta?.["hydra-acp"],s=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,i=s!==void 0?e.manager.getAgentForSession(s):void 0;if(!i||!i.isAlive()){let a=o??e.defaultAgent;i=await e.manager.bootstrapAgentForAuth(a)}return await i.connection.request("logout",{})}function ch(n){return e=>{let t={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(t.receivedBytes=e.receivedBytes),"totalBytes"in e&&(t.totalBytes=e.totalBytes),"packageSpec"in e&&(t.packageSpec=e.packageSpec),n.notify(zf,t).catch(()=>{})}}function lh(n){let e=n.availableModes();if(e.length===0)return;let t=e.map(s=>{let o={id:s.id,name:s.name??s.id};return s.description!==void 0&&(o.description=s.description),o});return{currentModeId:n.currentMode??e[0].id,availableModes:t}}function uh(n){let e=n.availableModels();if(e.length===0)return;let t=e.map(s=>{let o={modelId:s.modelId};return s.name!==void 0&&(o.name=s.name),s.description!==void 0&&(o.description=s.description),o});return{currentModelId:n.currentModel??e[0].modelId,availableModels:t}}async function HB(n,e,t,r){return e?await r.isRetiredGeneration(n,e.upstreamSessionId)?{kind:"ignore",logMessage:`session/attach ignoring stale resume hint sessionId=${n} hintUpstream=${e.upstreamSessionId} recordUpstream=${t} (retired generation)`}:{kind:"honor"}:{kind:"none"}}function UB(n,e){if(!n||typeof n!="object")return{kind:"error",code:K.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let t=n;if(typeof t.sessionId!="string")return{kind:"error",code:K.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof t.modelId!="string")return{kind:"error",code:K.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${t.sessionId}`};let r=e.get(t.sessionId);if(!r)return{kind:"error",code:K.SessionNotFound,message:`session ${t.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${t.sessionId}`};let s=r.availableModels(),o=Ud(t.modelId,s);if(o.kind==="none")return{kind:"ok",session:r,modelId:t.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)}`};if(o.kind==="exact")return{kind:"ok",session:r,modelId:t.modelId,logMessage:`session/set_model accepted sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)}`};if(o.kind==="resolved")return{kind:"ok",session:r,modelId:o.modelId,logMessage:`session/set_model resolved sessionId=${t.sessionId} requested=${JSON.stringify(t.modelId)} \u2192 ${JSON.stringify(o.modelId)}`};let i=s.map(d=>d.modelId).join(", "),a=o.kind==="ambiguous"?`ambiguous (trailing-segment matches [${o.candidates.join(", ")}])`:"not in availableModels";return r.currentModel!==void 0&&r.currentModel.length>0?{kind:"no_op",session:r,sessionId:t.sessionId,currentModel:r.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${t.sessionId} requested=${JSON.stringify(t.modelId)} ${a} actual=${JSON.stringify(r.currentModel)} agentId=${r.agentId} known=[${i}]`}:{kind:"error",code:K.InvalidParams,message:`model "${t.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${r.agentId}); known models: ${i}`,logMessage:`session/set_model rejected sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)} ${a} agentId=${r.agentId} known=[${i}] (no current model to fall back to)`}}async function WB(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0;if(!s)throw ue(K.InvalidParams,"transformer/attach requires sessionId");if(!t.transformers)throw ue(K.InternalError,"transformer manager not configured");let o=t.transformers.resolveChain([e])[0];if(!o)throw ue(K.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return lr(t.manager,s).addTransformer(o),{ok:!0}}async function jB(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0,o=typeof r.reason=="string"?r.reason:void 0;if(!s)throw ue(K.InvalidParams,"hydra-acp/attention/set requires string sessionId");if(!o)throw ue(K.InvalidParams,"hydra-acp/attention/set requires string reason");return lr(t.manager,s).setAttentionFlag(e,o,r.payload),{ok:!0}}async function qB(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0,o=typeof r.reason=="string"?r.reason:void 0;if(!s)throw ue(K.InvalidParams,"hydra-acp/attention/clear requires string sessionId");if(!o)throw ue(K.InvalidParams,"hydra-acp/attention/clear requires string reason");return lr(t.manager,s).clearAttentionFlag(e,o),{ok:!0}}function zB(n){let e={sessionId:n.hydraSessionId,upstreamSessionId:n.upstreamSessionId,cwd:n.cwd,workspace:n.workspace,title:n.title,agentId:n.agentId,currentModel:n.currentModel,currentUsage:aa(n.currentUsage),forkedFromSessionId:n.forkedFromSessionId,forkedFromMessageId:n.forkedFromMessageId,forkSynthesisState:n.forkSynthesisState,originatingClient:n.originatingClient,interactive:n.interactive,updatedAt:n.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,armedTasks:0,awaitingInput:!1},t={currentMode:n.currentMode,agentArgs:n.agentArgs,availableCommands:n.agentCommands,availableModes:n.agentModes,availableModels:n.agentModels,armedTaskList:[]};return{[ft]:Wf(e,t)}}function fh(n,e,t={}){let r=n.liveListEntry(e),s={clientId:t.clientId,currentMode:e.currentMode,agentArgs:e.agentArgs,availableCommands:e.mergedAvailableCommands(),availableModes:e.availableModes(),availableModels:e.availableModels(),turnStartedAt:e.turnStartedAt,agentCapabilities:e.agentCapabilities,queue:e.queueSnapshot(),armedTaskList:e.armedBackgroundTasks,...t.resurrected===!0?{resurrected:!0}:{}};return yl(e.agentMeta,Wf(r,s))}function KB(){return{protocolVersion:1,agentInfo:{name:"hydra",version:Be},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,auth:{logout:{}},sessionCapabilities:{attach:{},list:{},resume:{},delete:{},close:{},fork:{}}},authMethods:[{id:"proxy",name:"Hydra proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:{...yl(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0},session:{fork:{forkAt:!0,agentSwap:!0,synthesis:!0,model:!0}}}),steering:{supported:!0}}}}function GB(n,e){if(!(!e.transformers||!e.manager))for(let t of e.manager.defaultTransformers){let r=e.transformers.resolveChain([t])[0];r&&n.addTransformer(r)}}function BA(n,e){if(!e.transformers)return;let t=e.transformers.interestedIn("lifecycle:session.starting");for(let r of t)r.connection.notify("hydra-acp/transformer/session_event",{event:"session.starting",sessionId:n}).catch(()=>{})}function ci(n,e,t,r,s){return{clientId:s??`cli_${fb(8)}`,connection:n,clientInfo:r}}function ic(n,e,t){let r=n.attached.get(t);r&&(e.detach(r.clientId),n.attached.delete(t))}var ph=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let t,r,s=new Promise((i,a)=>{t=i,r=a});s.catch(()=>{});let o={session:void 0,sessionReady:s,disposers:[]};return this.byToken.set(e,o),{complete:i=>{o.session=i,t(i)},abandon:i=>{this.byToken.delete(e),r(i??new Error("mcp token reservation abandoned"))}}}bind(e,t){let{complete:r}=this.reserve(e);r(t)}lookup(e){return this.byToken.get(e)}addDisposer(e,t){let r=this.byToken.get(e);r!==void 0&&r.disposers.push(t)}async unbind(e){let t=this.byToken.get(e);if(t!==void 0){this.byToken.delete(e);for(let r of t.disposers)try{await r()}catch{}}}size(){return this.byToken.size}};import{randomUUID as JB}from"crypto";import{McpServer as VB}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as YB}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as Cn}from"zod";function pb(n){if(n.method!=="session/update")return null;let t=n.params?.update;return!t||typeof t.sessionUpdate!="string"?null:{kind:t.sessionUpdate,update:t}}function Vn(n){return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}var HA="Bearer ";function ac(n){let e=n.headers.authorization;if(typeof e!="string"||!e.startsWith(HA))return;let t=e.slice(HA.length).trim();return t.length>0?t:void 0}function QB(n){let e=new VB({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:Cn.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:t})=>{let r=n.streamTail(t);return Vn(r)}),e.registerTool("head",{description:"Return the first `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means the head has already been evicted from the ring and the returned bytes start at the oldest still-resident cursor.",inputSchema:{bytes:Cn.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:t})=>{let r=n.streamHead(t);return Vn(r)}),e.registerTool("read",{description:"Read up to `max_bytes` bytes starting at absolute byte `cursor`. Returns `{bytes, nextCursor, gap?, eof?}` \u2014 `gap` is the number of bytes silently skipped because the ring had evicted them; `eof:true` means the producer closed and there is nothing left to read.",inputSchema:{cursor:Cn.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:Cn.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:Cn.number().int().min(0).optional().describe("If no bytes are available, block up to this many ms for more (capped server-side at 60_000).")}},async({cursor:t,max_bytes:r,wait_ms:s})=>{let o=await n.streamRead(t,r,s);return Vn(o)}),e.registerTool("wait_for_more",{description:"Block until bytes are available past `cursor`, the stream closes, or `timeout_ms` elapses. Returns one of {data, eof, timeout} plus the current `writeCursor`. Use this when you've consumed everything up to a cursor and want to wait for more without busy-polling.",inputSchema:{cursor:Cn.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:Cn.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:t,timeout_ms:r})=>{let s=await n.streamWaitFor(t,r),o=n.streamInfo();return Vn({outcome:s,writeCursor:o.writeCursor,closed:o.closed})}),e.registerTool("grep",{description:"Scan piped stdin line-by-line and return lines matching `pattern`. Prefer this over `read` when the question is 'find lines that mention X' \u2014 it filters server-side so you don't pull and decode 64 KiB base64 windows. Returns `{matches: [{cursor, line, before?, after?}], truncated, nextCursor, gap?, scannedBytes, eof?}`. Lines come back as decoded UTF-8 strings (not base64). When `truncated:true`, re-call with `cursor: nextCursor` to resume.",inputSchema:{pattern:Cn.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:Cn.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:Cn.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:Cn.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:Cn.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:Cn.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:Cn.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:Cn.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:Cn.number().int().min(0).optional().describe("Optional absolute byte offset to start scanning from. Omit to scan from the oldest still-resident byte. Pass the `nextCursor` from a previous truncated call to resume.")}},async t=>{let r={pattern:t.pattern};t.regex!==void 0&&(r.regex=t.regex),t.case_insensitive!==void 0&&(r.caseInsensitive=t.case_insensitive),t.invert!==void 0&&(r.invert=t.invert),t.max_matches!==void 0&&(r.maxMatches=t.max_matches),t.max_bytes!==void 0&&(r.maxBytes=t.max_bytes),t.context_before!==void 0&&(r.contextBefore=t.context_before),t.context_after!==void 0&&(r.contextAfter=t.context_after),t.cursor!==void 0&&(r.cursor=t.cursor);let s=n.streamGrep(r);return Vn(s)}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let t=n.streamInfo();return Vn(t)}),e}var XB=1e4;function UA(n,e){let t=new Map;async function r(i,a){let d=t.get(i);if(d!==void 0)return d.transport;let c=QB(a),l=new YB({sessionIdGenerator:()=>JB()});await c.connect(l);let u={server:c,transport:l};return t.set(i,u),e.addDisposer(i,async()=>{t.delete(i);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function s(i,a){let d=ac(i);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown stdin token"});return}let l;if(c.session!==void 0)l=c.session;else{let f,p=new Promise(h=>{f=setTimeout(()=>h(void 0),XB)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(f!==void 0&&clearTimeout(f),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let u=await r(d,l);a.hijack(),await u.handleRequest(i.raw,a.raw,i.body)}let o={config:{skipAuth:!0}};n.post("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)}),n.get("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)}),n.delete("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)})}Zf();import{randomUUID as ZB}from"crypto";import{McpServer as eH}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as tH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as Ns}from"zod";function nH(n){switch(n){case"prompt_received":return"user";case"tool_call":case"tool_call_update":return"tool";default:return"agent"}}var WA=2e3,jA=2e4;function rH(n,e,t){if(e!=="tool_call"&&e!=="tool_call_update")return Wd([n]);let r=[],s=xl(t);s!==void 0?r.push(`Tool: ${s}`):typeof t.title=="string"&&t.title.length>0&&r.push(`Tool: ${t.title}`);let o=t.rawInput;if(o&&typeof o=="object"&&!Array.isArray(o))for(let[a,d]of Object.entries(o))typeof d=="string"&&d.length>0&&r.push(`${a}=${d}`);if(Array.isArray(t.locations))for(let a of t.locations)typeof a?.path=="string"&&a.path.length>0&&r.push(a.path);let i=Xf(t);return i!==void 0&&r.push(i),r.join(`
403
+ `;await ii.mkdir(L.home(),{recursive:!0}),await ii.writeFile(cb(),r,{encoding:"utf8",mode:384})}async function sh(){try{return(await ii.readFile(cb(),"utf8")).trim().length>0}catch(n){if(n.code==="ENOENT")return!1;throw n}}async function oh(n){if(typeof n!="string"||n.length===0)return!1;let e;try{e=(await ii.readFile(cb(),"utf8")).trim()}catch(c){if(c.code==="ENOENT")return!1;throw c}let t=e.split("$");if(t.length!==6||t[0]!=="scrypt")return!1;let r=parseInt(t[1],10),s=parseInt(t[2],10),o=parseInt(t[3],10);if(!Number.isFinite(r)||!Number.isFinite(s)||!Number.isFinite(o))return!1;let i=Buffer.from(t[4],"hex"),a=Buffer.from(t[5],"hex");if(i.length===0||a.length===0)return!1;let d=await wA(n,i,a.length,{N:r,r:s,p:o,maxmem:bA});return d.length!==a.length?!1:pB(d,a)}var yB=ai.object({password:ai.string().min(1),label:ai.string().min(1).max(256).optional(),ttlSec:ai.number().int().positive().optional()}),wB=ai.object({id:ai.string().optional()}).optional(),bB=ai.object({token:ai.string().min(32)});function vA(n,e){n.post("/v1/auth/login",{config:{skipAuth:!0}},async(t,r)=>{let s=kB(t);if(e.rateLimiter.isBlocked(s))return r.code(429).send({error:"Too many failed attempts; try again later."});let o;try{o=yB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}if(!await sh())return r.code(403).send({error:"No password configured. Run `hydra-acp auth password` on the daemon host."});if(!await oh(o.password))return e.rateLimiter.recordFailure(s),r.code(401).send({error:"Invalid password"});e.rateLimiter.recordSuccess(s);let a=await e.store.issue({label:o.label,ttlSec:o.ttlSec});return r.code(200).send({session_token:a.token,id:a.id,expires_at:a.expiresAt})}),n.post("/v1/auth/logout",async(t,r)=>{let s;try{s=wB.parse(t.body??void 0)}catch{return r.code(400).send({error:"Invalid request body"})}let o=s?.id??t.authIdentity;if(!o||o==="service")return r.code(200).send({revoked:!1});let i=await e.store.revoke(o);return r.code(200).send({revoked:i})}),n.get("/v1/auth/verify",async(t,r)=>r.code(200).send({ok:!0})),n.get("/v1/auth/sessions",async(t,r)=>r.code(200).send({sessions:e.store.list()})),n.delete("/v1/auth/sessions",async(t,r)=>{let s=await e.store.revokeAll();return r.code(200).send({revoked:s})}),n.delete("/v1/auth/sessions/:id",async(t,r)=>{let s=t.params.id;return await e.store.revoke(s)?r.code(204).send():r.code(404).send({error:"Not found"})}),n.post("/v1/auth/rotate-token",async(t,r)=>{if(t.authIdentity!=="service")return r.code(403).send({error:"Requires the service token"});let s;try{s=bB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}return e.staticTokenValidator.rotate(s.token),r.code(200).send({rotated:!0})})}function kB(n){return n.ip||"unknown"}Ze();import{z as di}from"zod";ke();Qr();var lb=/^[A-Za-z0-9][A-Za-z0-9._-]*$/,ih=class n{data;constructor(e){this.data=e}static async load(){let e=await Wt(L.peers());return new n(vB(e))}get(e){return this.data.entries[e]}async set(e){this.data.entries[e.name]=e,await SA(this.data)}async delete(e){return e in this.data.entries?(delete this.data.entries[e],await SA(this.data),!0):!1}list(){return Object.values(this.data.entries).map(({name:e,host:t,port:r,expiresAt:s,label:o,addedAt:i,pinnedFingerprint:a,pinnedAt:d})=>({name:e,host:t,port:r,expiresAt:s,label:o,addedAt:i,pinnedFingerprint:a,pinnedAt:d})).sort((e,t)=>e.addedAt.localeCompare(t.addedAt))}};function vB(n){if(!n||typeof n!="object")return{version:1,entries:{}};let e=n,t=e.entries&&typeof e.entries=="object"?e.entries:{},r={};for(let[s,o]of Object.entries(t)){if(!o||typeof o!="object")continue;let i=o;if(typeof i.name!="string"||typeof i.host!="string"||typeof i.port!="number"||typeof i.token!="string"||typeof i.expiresAt!="string"||typeof i.addedAt!="string")continue;let a={name:i.name,host:i.host,port:i.port,token:i.token,expiresAt:i.expiresAt,addedAt:i.addedAt};typeof i.label=="string"&&(a.label=i.label),typeof i.pinnedFingerprint=="string"&&(a.pinnedFingerprint=i.pinnedFingerprint),typeof i.pinnedAt=="string"&&(a.pinnedAt=i.pinnedAt),r[s]=a}return{version:1,entries:r}}async function SA(n){await Zt(L.peers(),n,{mode:384})}Ss();var SB=3600*24*365,Ls=class extends Error{status;constructor(e,t){super(e),this.name="PeerLoginError",this.status=t}};function xA(n,e){return`${en(n)?"http":"https"}://${n}:${e}`}async function IA(n){let e=n.fetchImpl??fetch,t=`${n.host}:${n.port}`,r=xA(n.host,n.port),s;try{s=await e(`${r}/v1/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:n.password,label:n.label,ttlSec:n.ttlSec??SB})})}catch(i){throw new Ls(`Could not reach ${t}: ${i.message}`,502)}if(s.status===401)throw new Ls(`Wrong password for ${t}.`,401);if(s.status===403)throw new Ls(`No password is configured on ${t}. Run \`hydra-acp auth password\` on that daemon first.`,502);if(s.status===429)throw new Ls(`Too many failed login attempts on ${t}; try again later.`,429);if(!s.ok)throw new Ls(`Login to ${t} failed: HTTP ${s.status}`,502);let o=await s.json();if(!o.session_token||!o.expires_at)throw new Ls(`Login to ${t} returned a malformed response.`,502);return{token:o.session_token,expiresAt:o.expires_at}}async function CA(n){let e=n.fetchImpl??fetch,t=xA(n.host,n.port);try{await e(`${t}/v1/auth/logout`,{method:"POST",headers:{Authorization:`Bearer ${n.token}`,"Content-Type":"application/json"},body:JSON.stringify({})})}catch{}}Ko();var xB=di.object({name:di.string().min(1).max(64).regex(lb),host:di.string().min(1),port:di.number().int().positive().optional(),password:di.string().min(1),label:di.string().min(1).max(256).optional(),ttlSec:di.number().int().positive().optional(),pinnedFingerprint:di.string().min(1).optional()});function RA(n,e){n.post("/v1/remotes",async(t,r)=>{let s;try{s=xB.parse(t.body)}catch{return r.code(400).send({error:`Invalid request body (name must match ${lb} and the rest is a normal login request)`})}let o=s.port??vn;s.pinnedFingerprint&&qo(s.host,o,s.pinnedFingerprint);let i;try{i=await IA({host:s.host,port:o,password:s.password,label:s.label,ttlSec:s.ttlSec})}catch(c){if(c instanceof Ls)return r.code(c.status).send({error:c.message});throw c}let a=new Date().toISOString(),d={name:s.name,host:s.host,port:o,token:i.token,expiresAt:i.expiresAt,addedAt:a,...s.label!==void 0?{label:s.label}:{},...s.pinnedFingerprint!==void 0?{pinnedFingerprint:s.pinnedFingerprint,pinnedAt:a}:{}};return await e.store.set(d),e.health?.markOk(d.name),r.code(201).send({name:d.name,host:d.host,port:d.port,expiresAt:d.expiresAt,label:d.label,addedAt:d.addedAt,pinnedFingerprint:d.pinnedFingerprint,status:e.health?.get(d.name)?.status??"unknown"})}),n.get("/v1/remotes",async(t,r)=>{let s=e.store.list().map(o=>{let i=e.health?.get(o.name);return{...o,status:i?.status??"unknown",...i?.checkedAt?{lastCheckedAt:i.checkedAt}:{}}});return r.code(200).send({remotes:s})}),n.delete("/v1/remotes/:name",async(t,r)=>{let s=t.params.name,o=e.store.get(s);return o?(await CA({host:o.host,port:o.port,token:o.token}),await e.store.delete(s),e.health?.forget(s),e.store.list().some(a=>a.host===o.host&&a.port===o.port)||ty(o.host,o.port),r.code(204).send()):r.code(404).send({error:"Not found"})})}Qo();la();yd();Ss();kl();an();var IB=new Set(["session/attach","session/detach","session/prompt","session/cancel","session/close","session/delete","hydra-acp/session/delete","session/set_model","session/set_mode","session/set_config_option","_session/steering","hydra-acp/prompt/cancel","hydra-acp/prompt/update","hydra-acp/prompt/amend","hydra-acp/session/tool_content","hydra-acp/session/force_cancel"]);function CB(n){return IB.has(n)}function TA(n,e,t,r){let s=[],o=a=>{for(let d of s)d(a)},i=(a,d)=>{e.handleLocalMessage(a,d,{connection:t.connection,clientId:r}).then(c=>c?n.send(c):void 0).catch(()=>{})};return n.onMessage(a=>{if("method"in a&&CB(a.method)){let d=a.params,c=typeof d?.sessionId=="string"?d.sessionId:void 0;if(c){if(so(c)){i(a,c);return}if(a.method==="session/attach"){let l="id"in a;e.resolveLocalMiss(c).then(u=>{if(u.ok){i(a,u.foreignId);return}if(u.ambiguous&&l){n.send(Xl(a.id,K.SessionNotFound,`Session "${c}" exists on more than one remote (${u.ambiguous.join(", ")}). Address it as "<remote>:${c}".`));return}o(a)});return}}}o(a)}),{send:a=>n.send(a),onMessage:a=>s.push(a),onClose:a=>n.onClose(a),close:()=>n.close()}}var ah=class{constructor(e,t=AB,r){this.store=e;this.dial=t;this.localMiss=r}store;dial;localMiss;attachments=new Map;async resolveLocalMiss(e){if(!this.localMiss)return{ok:!1};if(await this.localMiss.resolvesLocally(e))return{ok:!1};let t=this.localMiss.cache.findByLocalId(e);return t.length===0?{ok:!1}:t.length>1?{ok:!1,ambiguous:t.map(r=>r.name)}:{ok:!0,foreignId:ti(t[0])}}async handleLocalMessage(e,t,r){let s="id"in e,o=s?e.id:void 0,i=so(t);if(!i)return s?Xl(o,K.SessionNotFound,`not a federated session id: ${t}`):void 0;let a=AA(r.clientId,t),d={...e.params,sessionId:i.localId};if(e.method==="session/attach"){let l=this.store.get(i.name);if(!l)return s?Xl(o,K.SessionNotFound,`No remote named "${i.name}". Run \`hydra remote add\` first.`):void 0;let u=this.attachments.get(a);u&&(this.attachments.delete(a),u.peerConnection.close().catch(()=>{}));let f;try{f=await this.dial(l)}catch(g){return s?Xl(o,K.InternalError,`Could not reach remote "${i.name}": ${g.message}`):void 0}let p={peerConnection:f,localId:i.localId,target:r};this.wireAttachment(i.name,p);let m;try{m=await f.request("session/attach",d)}catch(g){return f.close().catch(()=>{}),s?ub(o,g):void 0}this.attachments.set(a,p);let h=m&&typeof m.sessionId=="string"?{...m,sessionId:t}:m;return s?{jsonrpc:"2.0",id:o,result:h}:void 0}let c=this.attachments.get(a);if(!c)return s?Xl(o,K.SessionNotFound,`"${t}" is not attached through this daemon.`):void 0;if(e.method==="session/detach"){let l,u;try{l=await c.peerConnection.request("session/detach",d)}catch(f){u=f}return this.attachments.delete(a),c.peerConnection.close().catch(()=>{}),u?s?ub(o,u):void 0:s?{jsonrpc:"2.0",id:o,result:l??{}}:void 0}if(s)try{let l=await c.peerConnection.request(e.method,d);return{jsonrpc:"2.0",id:o,result:l}}catch(l){return ub(o,l)}await c.peerConnection.notify(e.method,d).catch(()=>{})}detachClient(e){for(let[t,r]of[...this.attachments.entries()])r.target.clientId===e&&(this.attachments.delete(t),r.peerConnection.request("session/detach",{sessionId:r.localId}).catch(()=>{}),r.peerConnection.close().catch(()=>{}))}wireAttachment(e,t){let{peerConnection:r,localId:s,target:o}=t,i=ti({name:e,localId:s}),a=()=>{this.attachments.delete(AA(o.clientId,i))};r.onAnyNotification((d,c)=>{let l=d;!l||l.sessionId!==s||(c==="hydra-acp/session/closed"&&a(),o.connection.notify(c,{...l,sessionId:i}).catch(()=>{}))}),r.onRequest("hydra-acp/session/request_permission",async d=>{let c=d;if(!c||c.sessionId!==s)throw{code:K.MethodNotFound,message:"unexpected sessionId"};return o.connection.request("hydra-acp/session/request_permission",{...c,sessionId:i})}),r.onClose(()=>{a(),o.connection.notify("hydra-acp/session/closed",{sessionId:i}).catch(()=>{})})}};function AA(n,e){return`${n} ${e}`}function Xl(n,e,t){return{jsonrpc:"2.0",id:n,error:{code:e,message:t}}}function ub(n,e){let t=e,r=typeof t?.code=="number"?t.code:K.InternalError,s=typeof t?.message=="string"?t.message:String(e??"forward failed");return{jsonrpc:"2.0",id:n,error:{code:r,message:s,...t?.data!==void 0?{data:t.data}:{}}}}var RB=1e4;async function AB(n){let t=`${en(n.host)?"ws":"wss"}://${n.host}:${n.port}/acp`,r=await ro(t,["acp.v1",`hydra-acp-token.${n.token}`],RB);return new In(Mr(r))}Ss();var TB=3e4,EB=5e3,dh=class{constructor(e,t={}){this.store=e;this.opts=t}store;opts;snapshots=new Map;timer;start(){this.timer||(this.checkAll(),this.timer=setInterval(()=>{this.checkAll()},this.opts.intervalMs??TB),this.timer.unref?.())}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}get(e){return this.snapshots.get(e)}markOk(e){this.snapshots.set(e,{status:"ok",checkedAt:new Date().toISOString()})}forget(e){this.snapshots.delete(e)}async checkAll(){let e=this.opts.fetchImpl??fetch;await Promise.allSettled(this.store.list().map(async t=>{let r=this.store.get(t.name);if(!r)return;let o=`${en(r.host)?"http":"https"}://${r.host}:${r.port}/v1/auth/verify`,i=new AbortController,a=setTimeout(()=>i.abort(),EB);try{let d=await e(o,{headers:{Authorization:`Bearer ${r.token}`},signal:i.signal});this.snapshots.set(t.name,{status:d.ok?"ok":"unauthorized",checkedAt:new Date().toISOString()})}catch(d){this.snapshots.set(t.name,{status:"unreachable",checkedAt:new Date().toISOString(),error:d.message})}finally{clearTimeout(a)}}))}};Ko();import{z as EA}from"zod";var PB=EA.object({sessionLabel:EA.string().min(1).max(256)});function PA(n,e){n.post("/v1/process-tokens",async(t,r)=>{if(t.authIdentity!=="service")return r.code(403).send({error:"Requires the service token"});let s;try{s=PB.parse(t.body)}catch{return r.code(400).send({error:"Invalid request body"})}let o=e.processRegistry.mint(s.sessionLabel,"script");return r.code(201).send({token:o})}),n.delete("/v1/process-tokens/:sessionLabel",async(t,r)=>t.authIdentity!=="service"?r.code(403).send({error:"Requires the service token"}):(e.processRegistry.revoke(t.params.sessionLabel),r.code(204).send()))}Qo();Gd();la();import{nanoid as fb}from"nanoid";Qf();an();Ts();id();cr();import{randomBytes as FA}from"crypto";import*as LA from"os";import*as NA from"path";Ld();var MB=200;function _B(n){if(!n||typeof n!="object")return;let e=n._meta;if(!e||typeof e!="object"||Array.isArray(e))return;let t=e[ft];if(!t||typeof t!="object"||Array.isArray(t))return;let r=t.sentBy;if(!r||typeof r!="object"||Array.isArray(r))return;let s=r,o={};if(typeof s.sessionId=="string"&&s.sessionId.length>0&&(o.sessionId=s.sessionId),typeof s.label=="string"&&s.label.length>0&&(o.label=s.label.slice(0,MB)),s.awaiting===!0&&(o.awaiting=!0),!(o.sessionId===void 0&&o.label===void 0))return o}async function MA(n,e,t){let r=_B(n);if(!r)return;let s={};if(r.label!==void 0&&(s.fromLabel=r.label),r.awaiting===!0&&(s.awaiting=!0),r.sessionId!==void 0){let o=await e.resolveCanonicalId(r.sessionId)??r.sessionId,i=await e.getOne(o);if(i){s.fromSession=o,i.title&&(s.fromSessionTitle=i.title);let a=e.get(o)?.currentPromptDepth;s.depth=(a??0)+1}else t?.(r.sessionId)}if(!(s.fromSession===void 0&&s.fromLabel===void 0))return s}var Zl=new Map;function _A(n,e){let t=Zl.get(n);t||(t=new Set,Zl.set(n,t)),t.add(e);let r=!1;return()=>{if(r)return;r=!0;let s=Zl.get(n);s&&(s.delete(e),s.size===0&&Zl.delete(n))}}function $A(n,e){if(n===e)return!0;let t=new Set,r=[e];for(;r.length>0;){let s=r.pop();if(t.has(s))continue;t.add(s);let o=Zl.get(s);if(o){if(o.has(n))return!0;for(let i of o)r.push(i)}}return!1}function ue(n,e,t){let r=new Error(e);return r.code=n,t!==void 0&&(r.data=t),r}function NB(n){if(!n||typeof n!="object")return 512;let r=n.params?.update;if(!r)return 512;let s=512,o=r.content;if(typeof o=="string")s+=o.length;else if(o&&typeof o=="object"){let a=o;typeof a.text=="string"&&(s+=a.text.length),typeof a.data=="string"&&(s+=a.data.length)}let i=r.toolCall;if(i&&(typeof i.rawInput=="string"?s+=i.rawInput.length:i.rawInput&&typeof i.rawInput=="object"&&(s+=256),typeof i.rawOutput=="string"?s+=i.rawOutput.length:i.rawOutput&&typeof i.rawOutput=="object"&&(s+=256),Array.isArray(i.content)))for(let a of i.content){if(!a||typeof a!="object")continue;let d=a;if(typeof d.text=="string"&&(s+=d.text.length),d.content&&typeof d.content=="object"){let c=d.content;typeof c.text=="string"&&(s+=c.text.length)}}return s}function lr(n,e,t){let r=n.get(e);if(!r)throw ue(K.SessionNotFound,t??`session ${e} not found`);return r}async function ua(n,e){let t=oc(n),r,s,o;typeof e.summarizedThroughEntry=="number"&&e.summarizedThroughEntry>0&&n.mcpTokenRegistry!==void 0&&n.getDaemonOrigin!==void 0&&(r=FA(32).toString("hex"),s=n.mcpTokenRegistry.reserve(r),o={name:"hydra-acp-recall",type:"http",url:`${n.getDaemonOrigin()}/mcp/hydra-acp-recall`,headers:[{name:"Authorization",value:`Bearer ${r}`}]});let a=[...t?.descriptors??[],...o!==void 0?[o]:[]],d=ib({baselineMcpServers:void 0,stdinEnabled:!1,deps:n}),c;try{c=await n.manager.resurrect({...e,mcpServers:a,...d?{mintMcpServersForSwap:d}:{}})}catch(l){throw t!==void 0&&t.abandon(l instanceof Error?l:void 0),s!==void 0&&s.abandon(l instanceof Error?l:void 0),l}if(t!==void 0&&t.bindToSession(c),r!==void 0&&s!==void 0&&n.mcpTokenRegistry!==void 0){let l=r,u=n.mcpTokenRegistry;s.complete(c),c.onClose(()=>{u.unbind(l)})}return GB(c,n),BA(c.sessionId,n),c}function DA(n,e){n.get("/acp",{websocket:!0},async(t,r)=>{let s=_R({headers:r.headers,url:r.url});if(!s||!await e.validator.validate(s)){t.close(4401,"Unauthorized");return}let o=e.processRegistry?.resolve(s),i=`hydra_client_${fb(12)}`,a=Mr(t),d={},c=e.foreignSessions?TA(a,e.foreignSessions,d,i):a,l=new In(c);d.connection=l;let u={clientId:i,processIdentity:o,attached:new Map};l.onClose(()=>{for(let m of u.attached.values())e.manager.get(m.sessionId)?.detach(m.clientId);u.attached.clear(),e.foreignSessions?.detachClient(i)});let f=(m,h)=>{if(u.attached.get(m)?.readonly)throw ue(K.PermissionDenied,`${h} not permitted on a read-only attachment`)};if(l.onRequest("initialize",async m=>{let h=hI.parse(m??{});h.clientInfo?.name&&(u.clientInfo={name:h.clientInfo.name,...h.clientInfo.version!==void 0?{version:h.clientInfo.version}:{}});let g=h.clientInfo?.version;return g&&o&&(o.kind==="extension"?e.onExtensionVersion?.(o.name,g):e.onTransformerVersion?.(o.name,g)),KB()}),o&&e.extensionCommands){let m=e.extensionCommands;l.onRequest("hydra-acp/commands/register",async h=>{let g=h??{},w=Array.isArray(g.commands)?g.commands.map(b=>{if(!b||typeof b!="object")return;let k=b;if(typeof k.verb!="string")return;let S={verb:k.verb};return typeof k.argsHint=="string"&&(S.argsHint=k.argsHint),typeof k.description=="string"&&(S.description=k.description),S}).filter(b=>b!==void 0):[];return m.register(o.name,l,w),{ok:!0,registered:w.length}}),l.onClose(()=>{m.clear(o.name)})}if(o&&e.extensionMcp){let m=e.extensionMcp;l.onRequest("hydra-acp/mcp_tools/register",async g=>{let w=g??{},b=typeof w.instructions=="string"?w.instructions:void 0,k=Array.isArray(w.tools)?w.tools.map(S=>{if(!S||typeof S!="object")return;let I=S;if(typeof I.name!="string"||I.name.length===0||typeof I.description!="string"||I.inputSchema===null||typeof I.inputSchema!="object")return;let x={name:I.name,description:I.description,inputSchema:I.inputSchema};return I.outputSchema!==null&&typeof I.outputSchema=="object"&&(x.outputSchema=I.outputSchema),x}).filter(S=>S!==void 0):[];if(k.length===0)throw new Error("register_mcp_tools requires at least one tool");return m.register(o.name,l,b,k),{ok:!0,registered:k.length}});let h=g=>{let w=g??{};if(typeof w.sessionId!="string"||w.sessionId.length===0)throw ue(K.InvalidParams,"sessionId is required");return w.sessionId};if(l.onRequest("hydra-acp/session/extension_state/get",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw ue(K.InvalidParams,"key is required");if(!e.manager)throw ue(K.InternalError,"manager not wired");return{value:await e.manager.getExtensionStateKey(w,o.name,b.key)??null}}),l.onRequest("hydra-acp/session/extension_state/list",async g=>{let w=h(g);if(!e.manager)throw ue(K.InternalError,"manager not wired");return{state:await e.manager.getExtensionState(w,o.name)}}),l.onRequest("hydra-acp/session/extension_state/set",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw ue(K.InvalidParams,"key is required");if(b.value===void 0)throw ue(K.InvalidParams,"value is required (use extension_state/delete to remove)");if(!e.manager)throw ue(K.InternalError,"manager not wired");try{await e.manager.setExtensionStateKey(w,o.name,b.key,b.value)}catch(k){throw ue(K.InvalidParams,k.message)}return{ok:!0}}),l.onRequest("hydra-acp/session/extension_state/delete",async g=>{let w=h(g),b=g??{};if(typeof b.key!="string"||b.key.length===0)throw ue(K.InvalidParams,"key is required");if(!e.manager)throw ue(K.InternalError,"manager not wired");return await e.manager.deleteExtensionStateKey(w,o.name,b.key),{ok:!0}}),e.extensionMcpControls){let g=e.extensionMcpControls;l.onRequest("hydra-acp/mcp_tools/refresh_session",async w=>{let b=w??{};if(typeof b.sessionId!="string"||b.sessionId.length===0)throw ue(K.InvalidParams,"refresh_session requires sessionId");return await g.notifyToolListChanged(b.sessionId,o.name),{ok:!0}})}l.onClose(()=>{m.clear(o.name)})}if(o?.kind==="transformer"){l.onRequest("hydra-acp/transformer/initialize",async h=>{let g=h??{},w=Array.isArray(g.intercepts)?g.intercepts.filter(b=>typeof b=="string"):[];if(e.transformers&&(e.transformers.registerConnection(o.name,l,w),e.manager?.defaultTransformers.includes(o.name))){let b=e.transformers.resolveChain([o.name])[0];if(b)for(let k of e.manager.liveSessions())k.addTransformer(b)}return{ack:!0}}),l.onClose(()=>{e.transformers?.deregisterConnection(o.name)}),l.onRequest("hydra-acp/message/emit",async h=>{let g=h??{},w=typeof g.sessionId=="string"?g.sessionId:void 0,b=typeof g.method=="string"?g.method:void 0,k=g.envelope,S=g.route;if(!w)throw ue(-32602,"emit_message requires sessionId");if(!b&&S!=="client_broadcast")throw ue(-32602,"emit_message requires method");let I=lr(e.manager,w),x=typeof g.respondsTo=="string"?g.respondsTo:void 0;if(x)return I.dischargeClaim(x,k),{ok:!0};if(S==="chain")return{ok:!0,response:await I.emitToChain(o.name,b,k)};if(S==="queue"){if(b!=="session/prompt")throw ue(-32602,'route "queue" only supports method "session/prompt"');return{ok:!0,response:await I.emitToQueue(o.name,k)}}if(S==="daemon")return{ok:!0,response:await I.emitToChain(o.name,b,k)};if(S==="client_broadcast"){if(!k||typeof k!="object")throw ue(-32602,"client_broadcast requires an envelope object");return I.broadcastClientUpdate(k),{ok:!0}}throw ue(-32602,`unsupported route: ${JSON.stringify(S)}`)}),l.onRequest("hydra-acp/session/request_permission",async h=>{let g=h??{},w=typeof g.sessionId=="string"?g.sessionId:void 0;if(!w)throw ue(-32602,"hydra-acp/session/request_permission requires sessionId");return lr(e.manager,w).requestPermissionFromClients(g)}),l.onRequest("hydra-acp/transformer/attach",async h=>WB(h,o.name,e)),l.onRequest("hydra-acp/child_session/spawn",async h=>{let g=h??{},w=typeof g.agentId=="string"?g.agentId:void 0,b=typeof g.cwd=="string"?g.cwd:void 0,k=typeof g.parentSessionId=="string"?g.parentSessionId:void 0,S=g._meta&&typeof g._meta=="object"?g._meta:void 0,I=S&&S["hydra-acp"]&&typeof S["hydra-acp"]=="object"?S["hydra-acp"]:void 0,x=I&&typeof I.title=="string"?I.title:void 0,A=I&&typeof I.model=="string"?I.model:void 0;if(!b&&k){let X=e.manager.get(k);X&&(b=X.cwd)}if(!b)throw ue(-32602,"child_session/spawn requires cwd (or a parentSessionId pointing at a live session whose cwd we can inherit)");let M=await od(b),E=w??M.agentId??e.defaultAgent,P=await e.registry?.getAgent(E),F=Tr(M.configDefaults,P??{id:E})?.value,z=A??F?.model,V=typeof g.interactive=="boolean"?g.interactive:!1;return{childSessionId:(await e.manager.create({agentId:E,cwd:b,parentSessionId:k,interactive:V,transformChain:[],title:x,model:z,configDefaults:F})).sessionId}}),l.onRequest("hydra-acp/session/fork",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw ue(K.InvalidParams,"fork_session requires sessionId");let w=typeof g.forkAt=="string"?g.forkAt:void 0,b=typeof g.cwd=="string"?g.cwd:void 0,k=typeof g.agentId=="string"?g.agentId:void 0,S=typeof g.mode=="string"&&(g.mode==="verbatim"||g.mode==="synthesis")?g.mode:void 0,I=typeof g.model=="string"&&g.model.length>0?g.model:void 0,x=await e.manager.forkSession(g.sessionId,{...w!==void 0?{forkAt:w}:{},...b!==void 0?{cwd:b}:{},...k!==void 0?{agentId:k}:{},...S!==void 0?{mode:S}:{},...I!==void 0?{model:I}:{}}),A=e.manager.get(x.sessionId);if(!A){let P=await e.manager.loadFromDisk(x.sessionId);if(!P)throw ue(K.InternalError,`fork ${x.sessionId} vanished before it could be attached`);A=await ua(e,{...P,onInstallProgress:ch(l)})}ic(u,A,A.sessionId);let M=ci(l,A,u),{entries:E}=await A.attach(M,"full");u.attached.set(A.sessionId,{sessionId:A.sessionId,clientId:M.clientId,readonly:!1});for(let P of E){if(l.isClosed())break;await l.notify(P.method,Ps(Es(P.params,P.recordedAt),P.seq)).catch(()=>{})}return{...x,sessionId:A.sessionId}}),l.onRequest("session/fork",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw ue(K.InvalidParams,"session/fork requires sessionId");let w=typeof g.cwd=="string"?g.cwd:void 0,b=await e.manager.forkSession(g.sessionId,{...w!==void 0?{cwd:w}:{},mode:"verbatim"}),k=e.manager.get(b.sessionId);if(!k){let x=await e.manager.loadFromDisk(b.sessionId);if(!x)throw ue(K.InternalError,`fork ${b.sessionId} vanished before it could be attached`);k=await ua(e,{...x,onInstallProgress:ch(l)})}ic(u,k,k.sessionId);let S=ci(l,k,u),{entries:I}=await k.attach(S,"full");u.attached.set(k.sessionId,{sessionId:k.sessionId,clientId:S.clientId,readonly:!1});for(let x of I){if(l.isClosed())break;await l.notify(x.method,Ps(Es(x.params,x.recordedAt),x.seq)).catch(()=>{})}return{sessionId:k.sessionId}});let m=async(h,g)=>{let w=h??{};if(typeof w.sessionId!="string")throw ue(K.InvalidParams,`${g} requires sessionId`);let b=await e.manager.resolveCanonicalId(w.sessionId)??w.sessionId,k=e.manager.get(b);if(k)return await k.close({deleteRecord:!0,by:`session/delete ${u.clientId}`}),await e.manager.waitForDeletion(b),await e.manager.hasRecord(b)&&await e.manager.deleteRecord(b),{id:b,existed:!0};let S=await e.manager.deleteRecord(b);return{id:b,existed:S}};l.onRequest("session/delete",async h=>(await m(h,"session/delete"),{})),l.onRequest("session/close",async h=>{let g=h??{};if(typeof g.sessionId!="string")throw ue(K.InvalidParams,"session/close requires sessionId");f(g.sessionId,"session/close");let w=await e.manager.resolveCanonicalId(g.sessionId)??g.sessionId,b=e.manager.get(w);if(b)return await b.close({deleteRecord:!1,by:`session/close ${u.clientId}`+(u.processIdentity?` (${u.processIdentity.name})`:"")}),{};if(await e.manager.hasRecord(w))return{};throw ue(K.SessionNotFound,`session ${w} not found`)}),l.onRequest("hydra-acp/session/delete",async h=>{let{id:g,existed:w}=await m(h,"hydra-acp/session/delete");if(!w)throw ue(K.SessionNotFound,`session ${g} not found`);return{deleted:!0,sessionId:g}}),l.onRequest("hydra-acp/child_session/await",async h=>{let g=h??{},w=typeof g.childSessionId=="string"?g.childSessionId:void 0,b=g.until==="idle"?"idle":"turn_complete",k=typeof g.timeoutMs=="number"?Math.min(g.timeoutMs,18e5):3e5;if(!w)throw ue(-32602,"await_child requires childSessionId");let S=lr(e.manager,w,`child session ${w} not found`);return new Promise(I=>{let M=[],E=[],P=0,F=!1,z,V,U=!1,X=()=>{U||(U=!0,clearTimeout(ee),z?.(),V?.(),I(F?{entries:M,truncated:!0}:{entries:M}))};z=S.onBroadcast(ve=>{let Me=NB(ve);for(M.push(ve),E.push(Me),P+=Me;M.length>0&&(M.length>1e3||P>1048576);)M.shift(),P-=E.shift()??0,F=!0;b==="turn_complete"&&ve.params?.update?.sessionUpdate==="turn_complete"&&X()});let ee=setTimeout(X,k);typeof ee.unref=="function"&&ee.unref(),V=S.onClose(()=>X())})}),l.onRequest("hydra-acp/child_session/close",async h=>{let g=h??{},w=typeof g.childSessionId=="string"?g.childSessionId:void 0;if(!w)throw ue(-32602,"close_child_session requires childSessionId");let b=e.manager.get(w);return b&&await b.close({deleteRecord:!1,by:`child_session/close ${u.clientId}`}),{ok:!0}}),l.onRequest("hydra-acp/attention/set",async h=>jB(h,o.name,e)),l.onRequest("hydra-acp/attention/clear",async h=>qB(h,o.name,e)),l.onRequest("hydra-acp/connection/keep_alive",async h=>{let g=h??{},w=typeof g.token=="string"?g.token:void 0,b=typeof g.sessionId=="string"?g.sessionId:void 0,k=typeof g.estimatedRemainingMs=="number"?g.estimatedRemainingMs:void 0;return w&&b&&e.manager.get(b)?.keepAliveClaim(w,k),{ok:!0}})}l.onRequest("hydra-acp/session/tool_content",async m=>{let h=m??{};if(typeof h.sessionId!="string"||typeof h.hash!="string")throw ue(K.InvalidParams,"hydra-acp/session/tool_content requires sessionId and hash");let g=await e.manager.resolveCanonicalId(h.sessionId)??h.sessionId,w=await e.manager.loadToolBlob(g,h.hash);if(w===null)throw ue(K.SessionNotFound,"tool content not found");return{content:w}}),l.onRequest("authenticate",async m=>DB(m,e)),l.onRequest("logout",async m=>BB(m,e)),l.onRequest("session/new",async m=>{let h=mI.parse(m),g=On(m?._meta),w=Array.isArray(g.transformers)&&g.transformers.every(Ce=>typeof Ce=="string")?g.transformers:e.manager.defaultTransformers??[],b=e.transformers?.resolveChain(w)??[],k=await od(h.cwd),S=g.agentId??k.agentId??e.defaultAgent,I=await e.registry?.getAgent(S),x=Tr(k.configDefaults,I??{id:S})?.value,A,M,E=h.mcpServers;if(g.mcpStdin===!0&&e.mcpTokenRegistry!==void 0&&e.getDaemonOrigin!==void 0){A=FA(32).toString("hex"),M=e.mcpTokenRegistry.reserve(A);let Ke={name:"hydra-acp-stdin",type:"http",url:`${e.getDaemonOrigin()}/mcp/hydra-acp-stdin`,headers:[{name:"Authorization",value:`Bearer ${A}`}]};E=[...h.mcpServers??[],Ke]}let P,F,z=oc(e);z!==void 0&&(E=[...E??[],...z.descriptors]);let V=ib({baselineMcpServers:h.mcpServers,stdinEnabled:g.mcpStdin===!0,deps:e}),U;try{U=await e.manager.create({cwd:h.cwd,agentId:S,mcpServers:E,title:g.title,agentArgs:g.agentArgs,model:g.model??x?.model,configDefaults:x,onInstallProgress:ch(l),transformChain:b,originatingClient:u.clientInfo,...g.interactive!==void 0?{interactive:g.interactive}:{},...g.env!==void 0?{forwardedEnv:g.env}:{},...g.workspace!==void 0?{workspace:g.workspace}:{},...V?{mintMcpServersForSwap:V}:{}})}catch(Ce){throw M!==void 0&&M.abandon(Ce instanceof Error?Ce:void 0),F!==void 0&&F.abandon(Ce instanceof Error?Ce:void 0),z!==void 0&&z.abandon(Ce instanceof Error?Ce:void 0),Ce}if(A!==void 0&&M!==void 0&&e.mcpTokenRegistry!==void 0){let Ce=A,Ke=e.mcpTokenRegistry;M.complete(U),U.onClose(()=>{Ke.unbind(Ce)})}if(P!==void 0&&F!==void 0&&e.mcpTokenRegistry!==void 0){let Ce=P,Ke=e.mcpTokenRegistry;F.complete(U),U.onClose(()=>{Ke.unbind(Ce)})}z!==void 0&&z.bindToSession(U),BA(U.sessionId,e);let X,ee;try{ic(u,U,U.sessionId),X=ci(l,U,u),{entries:ee}=await U.attach(X,"full")}catch(Ce){throw await U.close({deleteRecord:!1,by:"session/new attach-failed"}).catch(()=>{}),Ce}u.attached.set(U.sessionId,{sessionId:U.sessionId,clientId:X.clientId,readonly:!1}),setImmediate(()=>{(async()=>{for(let Ce of ee){if(l.isClosed())break;await l.notify(Ce.method,Ps(Es(Ce.params,Ce.recordedAt),Ce.seq)).catch(()=>{})}})()});let ve=lh(U),Me=uh(U);return{sessionId:U.sessionId,...ve?{modes:ve}:{},...Me?{models:Me}:{},configOptions:U.buildConfigOptions(),_meta:fh(e.manager,U,{clientId:X.clientId})}}),l.onRequest("session/attach",async m=>{let h=yI.parse(m),g=h.clientInfo?.version;g&&o&&(o.kind==="extension"?e.onExtensionVersion?.(o.name,g):e.onTransformerVersion?.(o.name,g));let w=On(h._meta),b=w.resume,k=w.readonly===!0,S=w.env;n.log.info(`session/attach sessionId=${h.sessionId} hasResumeHints=${!!b} readonly=${k}`);let I=b?h.sessionId:await e.manager.resolveCanonicalId(h.sessionId)??h.sessionId,x=e.manager.get(I);if(!x&&k){let U=await e.manager.loadFromDisk(I);if(!U)throw ue(K.SessionNotFound,`session ${h.sessionId} not found`);let X=await e.manager.loadHistory(I),ee=h.clientId??`cli_${fb(8)}`;u.attached.set(U.hydraSessionId,{sessionId:U.hydraSessionId,clientId:ee,readonly:!0}),n.log.info(`session/attach OK (viewer) sessionId=${U.hydraSessionId} clientId=${ee} attachedCount=${u.attached.size} replayed=${X.length}`);for(let ve of X)await l.notify(ve.method,Ps(Es(ve.params,ve.recordedAt),ve.seq)).catch(()=>{});return{sessionId:U.hydraSessionId,clientId:ee,connectedClients:[ee],historyPolicy:"full",replayed:X.length,_meta:zB(U)}}let A=!x;if(!x){let U=await e.manager.loadFromDisk(I),X=await HB(I,b,U?.upstreamSessionId,e.manager);X.kind==="ignore"&&n.log.warn(X.logMessage);let ee=U;if(b&&X.kind==="honor"&&(ee={...U,hydraSessionId:h.sessionId,upstreamSessionId:b.upstreamSessionId,agentId:b.agentId,cwd:U?.workspace?.path??b.cwd,...b.title!==void 0?{title:b.title}:{},...b.agentArgs!==void 0?{agentArgs:b.agentArgs}:{}}),!ee)throw ue(K.SessionNotFound,`session ${h.sessionId} not found and no resume hints provided`);if(await e.manager.isTombstoned(ee.agentId,ee.upstreamSessionId))throw ue(K.SessionNotFound,`session ${h.sessionId} was deleted`);let ve=ee.originatingClient?ee:{...ee,originatingClient:u.clientInfo},Me=S!==void 0?{...ve,forwardedEnv:S}:ve;x=await ua(e,{...Me,onInstallProgress:ch(l)})}ic(u,x,x.sessionId);let M=ci(l,x,u,h.clientInfo,h.clientId),E=w.replayMode==="drip",{entries:P,appliedPolicy:F}=await x.attach(M,h.historyPolicy,{afterMessageId:h.afterMessageId,afterSeq:h.afterSeq,raw:E,...w.historyLimit!==void 0?{historyLimit:w.historyLimit}:{},...w.toolContent!==void 0?{toolContent:w.toolContent}:{}});if(u.attached.set(x.sessionId,{sessionId:x.sessionId,clientId:M.clientId,readonly:k}),S!==void 0&&await e.manager.setForwardedEnv(x.sessionId,S).catch(()=>{}),n.log.info(`session/attach OK sessionId=${x.sessionId} clientId=${M.clientId} attachedCount=${u.attached.size} requestedPolicy=${h.historyPolicy} appliedPolicy=${F} replayed=${P.length} readonly=${k}${E?" replayMode=drip":""}`),E){let U=w.dripSpeed&&w.dripSpeed>0?w.dripSpeed:1,X=750;(async()=>{let ee=null;for(let ve of P){let Me=typeof ve.recordedAt=="number"?ve.recordedAt:null;if(ee!==null&&Me!==null){let Ce=Math.min(X,Math.max(0,(Me-ee)/U));Ce>0&&await new Promise(Ke=>setTimeout(Ke,Ce))}Me!==null&&(ee=Me);try{await l.notify(ve.method,Ps(Es(ve.params,Me??void 0),ve.seq))}catch{return}}})()}else for(let U=0;U<P.length&&!l.isClosed();U++){let X=P[U],ee=l.notify(X.method,Ps(Es(X.params,X.recordedAt),X.seq)).catch(()=>{});(U+1)%200===0&&await ee}x.replayPendingPermissions(M);let z=lh(x),V=uh(x);return{sessionId:x.sessionId,clientId:M.clientId,connectedClients:x.connectedClients(M.clientId),historyPolicy:F,replayed:P.length,...z?{modes:z}:{},...V?{models:V}:{},configOptions:x.buildConfigOptions(),_meta:fh(e.manager,x,{resurrected:A})}}),l.onRequest("session/detach",async m=>{let h=wI.parse(m),g=u.attached.get(h.sessionId);if(!g)throw ue(K.SessionNotFound,"client not attached to that session");let w=e.manager.get(h.sessionId);return w?.detach(g.clientId),u.attached.delete(h.sessionId),w&&e.manager.reapIfOrphanedNonInteractive(h.sessionId),{sessionId:h.sessionId,_meta:{[ft]:{detachStatus:"detached"}}}}),l.onRequest("session/list",async m=>{let h=bI.parse(m??{});return{sessions:(await e.manager.list({cwd:h.cwd})).filter(k=>k.originatingClient?.name!==sa).map(kI)}}),l.onRequest("hydra-acp/agents/list",async()=>{if(!e.registry)throw ue(K.InternalError,"agent registry unavailable");return Fd(e.registry)}),l.onRequest("hydra-acp/agents/auth_methods",async m=>{let h=m??{};if(typeof h.agentId!="string"||h.agentId.length===0)throw ue(K.InvalidParams,"hydra-acp/agents/auth_methods requires a non-empty agentId string");return{authMethods:(await e.manager.bootstrapAgentForAuth(h.agentId)).authMethods??[]}}),l.onRequest("session/prompt",async m=>{let h=SI.parse(m);f(h.sessionId,"session/prompt");let g=await MA(h,e.manager,S=>{n.log.warn(`session/prompt: dropping unknown sentBy.sessionId=${S} sessionId=${h.sessionId}`)});if(g?.fromSession!==void 0){if((g.depth??0)>3)throw n.log.warn(`session/prompt: refusing depth ${g.depth} chain from ${g.fromSession} to ${h.sessionId}`),ue(K.InvalidRequest,`message chain too deep (${g.depth} hops, max ${3}): refusing to continue a session-to-session loop`);if(g.awaiting===!0&&$A(g.fromSession,h.sessionId))throw n.log.warn(`session/prompt: refusing deadlock ${g.fromSession} -> ${h.sessionId}`),ue(K.InvalidRequest,`would deadlock: ${h.sessionId} is already blocked waiting on ${g.fromSession}. Send with --no-wait, or let the other turn finish first.`)}let w=u.attached.get(h.sessionId);if(!w)throw n.log.warn(`session/prompt rejected: not attached sessionId=${h.sessionId} attachedKeys=[${[...u.attached.keys()].join(",")}]`),ue(K.SessionNotFound,"not attached to session");let b=e.manager.get(h.sessionId);if(!b){let S=await e.manager.loadFromDisk(h.sessionId);if(!S)throw ue(K.SessionNotFound,`session ${h.sessionId} not found`);n.log.info(`session/prompt auto-resurrecting cold sessionId=${h.sessionId}`),b=await ua(e,S);let I=ci(l,b,u,void 0,w.clientId);await b.attach(I,"none")}let k=g?.awaiting===!0&&g.fromSession!==void 0?_A(g.fromSession,h.sessionId):void 0;try{return await b.prompt(w.clientId,h,g)}finally{k?.()}});let p=m=>{let h;try{h=qf.parse(m)}catch(b){n.log.warn(`session/cancel: invalid params: ${b.message}`);return}let g=u.attached.get(h.sessionId);if(!g)return;if(g.readonly){n.log.warn(`session/cancel dropped (readonly attachment) sessionId=${h.sessionId}`);return}let w=e.manager.get(h.sessionId);w&&w.cancel(g.clientId).catch(b=>{n.log.warn(`session/cancel for ${h.sessionId}: ${b.message}`)})};l.onNotification("session/cancel",p),l.onRequest("session/cancel",async m=>{let h=qf.parse(m);return f(h.sessionId,"session/cancel"),p(m),null}),l.onRequest("hydra-acp/prompt/cancel",async m=>{let h=II.parse(m);return f(h.sessionId,"hydra-acp/prompt/cancel"),lr(e.manager,h.sessionId).cancelQueuedPrompt(h.messageId)}),l.onRequest("hydra-acp/session/force_cancel",async m=>{let h=qf.parse(m);return f(h.sessionId,"hydra-acp/session/force_cancel"),lr(e.manager,h.sessionId).forceCancel()}),l.onRequest("hydra-acp/prompt/update",async m=>{let h=CI.parse(m);return f(h.sessionId,"hydra-acp/prompt/update"),lr(e.manager,h.sessionId).updateQueuedPrompt(h.messageId,h.prompt)}),l.onRequest("hydra-acp/prompt/amend",async m=>{let h=RI.parse(m);f(h.sessionId,"hydra-acp/prompt/amend");let g=u.attached.get(h.sessionId);if(!g)throw ue(K.SessionNotFound,"not attached to session");return lr(e.manager,h.sessionId).amendPrompt(g.clientId,h)}),l.onRequest("_session/steering",async m=>{let h=AI.parse(m);f(h.sessionId,"_session/steering");let g=u.attached.get(h.sessionId);if(!g)throw ue(K.SessionNotFound,"not attached to session");let w=e.manager.get(h.sessionId);if(!w){let b=await e.manager.loadFromDisk(h.sessionId);if(!b)throw ue(K.SessionNotFound,`session ${h.sessionId} not found`);w=await ua(e,b);let k=ci(l,w,u,void 0,g.clientId);await w.attach(k,"none")}return w.steer(g.clientId,h)}),l.onRequest("session/resume",async m=>{let h=m??{},g=typeof h.sessionId=="string"?h.sessionId:void 0;if(!g)throw ue(K.InvalidParams,"session/resume requires sessionId");let w=await e.manager.resolveCanonicalId(g)??g,b=e.manager.get(w);if(!b){let x=await e.manager.loadFromDisk(w);if(!x)throw ue(K.SessionNotFound,`session ${g} not found in memory or on disk`);b=await ua(e,x)}ic(u,b,b.sessionId);let k=ci(l,b,u);await b.attach(k,"pending_only"),u.attached.set(b.sessionId,{sessionId:b.sessionId,clientId:k.clientId,readonly:!1}),b.replayPendingPermissions(k);let S=lh(b),I=uh(b);return{sessionId:b.sessionId,...S?{modes:S}:{},...I?{models:I}:{},configOptions:b.buildConfigOptions(),_meta:fh(e.manager,b,{clientId:k.clientId})}}),l.onRequest("session/load",async m=>{let h=m??{},g=typeof h.sessionId=="string"?h.sessionId:void 0;if(!g)throw ue(K.InvalidParams,"session/load requires sessionId");let w=await e.manager.resolveCanonicalId(g)??g,b=e.manager.get(w);if(!b){let A=await e.manager.loadFromDisk(w);if(!A)throw ue(K.SessionNotFound,`session ${g} not found in memory or on disk`);b=await ua(e,A)}ic(u,b,b.sessionId);let k=ci(l,b,u),{entries:S}=await b.attach(k,"full");u.attached.set(b.sessionId,{sessionId:b.sessionId,clientId:k.clientId,readonly:!1});for(let A of S){if(l.isClosed())break;await l.notify(A.method,Ps(Es(A.params,A.recordedAt),A.seq)).catch(()=>{})}b.replayPendingPermissions(k);let I=lh(b),x=uh(b);return{sessionId:b.sessionId,...I?{modes:I}:{},...x?{models:x}:{},configOptions:b.buildConfigOptions(),_meta:fh(e.manager,b,{clientId:k.clientId})}}),l.onRequest("session/set_model",async m=>{let h=m?.sessionId;typeof h=="string"&&f(h,"session/set_model");let g=UB(m,e.manager);if(g.kind==="error")throw n.log.warn(g.logMessage),ue(g.code,g.message);if(g.kind==="no_op")return n.log.warn(g.logMessage),await l.notify("session/update",{sessionId:g.sessionId,update:{sessionUpdate:"_hydra_current_model_update",currentModel:g.currentModel}}).catch(()=>{}),null;n.log.info(g.logMessage);let{modelId:w}=g,b=await g.session.forwardModelChange(w,m);return g.session.applyAgentConfigOptionResponse(b,"model"),g.session.applyModelChange(w),b}),l.onRequest("session/set_mode",async m=>{let h=m,g=h?.sessionId;if(typeof g=="string"&&f(g,"session/set_mode"),!h||typeof h.sessionId!="string")throw ue(K.InvalidParams,"session/set_mode requires string sessionId");if(typeof h.modeId!="string")throw ue(K.InvalidParams,"session/set_mode requires string modeId");let w=lr(e.manager,h.sessionId),b=await w.forwardRequest("session/set_mode",m);return w.applyModeChange(h.modeId),b}),l.onRequest("session/set_config_option",async m=>{let h=m,g=S=>ue(K.InvalidParams,S),w=h?.sessionId;if(typeof w=="string"&&f(w,"session/set_config_option"),!h||typeof h.sessionId!="string")throw g("session/set_config_option requires string sessionId");if(typeof h.configId!="string")throw g("session/set_config_option requires string configId");if(typeof h.value!="string")throw g("session/set_config_option requires string value");let b=lr(e.manager,h.sessionId),k=b.buildConfigOptions().find(S=>S.id===h.configId);if(!k)throw g(`unknown configId ${JSON.stringify(h.configId)} for this session`);if(!k.options.some(S=>S.value===h.value))throw g(`value ${JSON.stringify(h.value)} is not valid for configId ${JSON.stringify(h.configId)}`);switch(h.configId){case"model":{if(h.value!==b.currentModel){let S=await b.forwardModelChange(h.value);b.applyAgentConfigOptionResponse(S,"model")}b.applyModelChange(h.value);break}case"mode":{h.value!==b.currentMode&&await b.forwardRequest("session/set_mode",{sessionId:h.sessionId,modeId:h.value}),b.applyModeChange(h.value);break}case"agent":{h.value!==b.agentId&&await b.setAgent(h.value);break}default:{let S=await b.forwardRequest("session/set_config_option",{sessionId:h.sessionId,configId:h.configId,value:h.value});b.applyAgentConfigOptionResponse(S,h.configId)&&b.broadcastConfigOptions()}}return{configOptions:b.buildConfigOptions()}}),l.setDefaultHandler(async(m,h)=>{let g=new Set(["hydra-acp/attention/set","hydra-acp/attention/clear"]),w=h.startsWith("session/"),b=h.startsWith("hydra-acp/");if(!w&&!b||m===null||typeof m!="object"||g.has(h))throw ue(K.MethodNotFound,`Method not found: ${h}`);let k=m.sessionId;if(typeof k!="string")throw ue(K.MethodNotFound,`Method not found: ${h}`);return f(k,h),lr(e.manager,k).forwardRequest(h,m)})})}async function DB(n,e){let t=n??{};if(typeof t.methodId!="string"||t.methodId.length===0)throw ue(K.InvalidParams,"authenticate requires a non-empty methodId string");let r=t.methodId,s=t._meta?.["hydra-acp"],o=typeof s?.sessionId=="string"?s.sessionId:void 0,i=typeof s?.agentId=="string"?s.agentId:void 0,a=o!==void 0?e.manager.getAgentForSession(o):void 0;if(!a||!a.isAlive()){let p=i??e.defaultAgent;a=await e.manager.bootstrapAgentForAuth(p)}let d=a.authMethods??[],c=d.find(p=>p.id===r);if(!c){let p=d.map(m=>m.id);throw ue(K.InvalidParams,`authenticate: methodId ${JSON.stringify(r)} is not advertised by agent ${a.agentId}; valid: [${p.map(m=>JSON.stringify(m)).join(", ")}]`)}let l=c._meta?.type,u=(()=>{let p=c._meta?.["terminal-auth"];if(p&&typeof p=="object"&&!Array.isArray(p))return p})();if((c.type??(l==="agent"||l==="terminal"?l:u!==void 0?"terminal":"agent"))==="terminal"){let p=(k,S)=>{if(!Array.isArray(k))throw ue(K.InvalidParams,`authenticate: method ${JSON.stringify(r)} ${S} must be a string[]; got ${k===null?"null":typeof k}`);for(let I of k)if(typeof I!="string")throw ue(K.InvalidParams,`authenticate: method ${JSON.stringify(r)} ${S} must be string[]; got non-string entry ${JSON.stringify(I)}`);return k},m=await e.manager.planSpawnForAgent(a.agentId),h,g;if(u?.args!==void 0){let k=typeof u.command=="string"?u.command:void 0;h=k!==void 0&&NA.isAbsolute(k)?k:m.command,g=p(u.args,'_meta["terminal-auth"].args')}else{let k=c.args!==void 0?{raw:c.args,label:"args"}:c._meta?.args!==void 0?{raw:c._meta.args,label:"_meta.args"}:void 0,S=k!==void 0?p(k.raw,k.label):[];h=m.command,g=[...m.args,...S]}let w={};for(let[k,S]of Object.entries(process.env))typeof S=="string"&&(w[k]=S);Object.assign(w,m.env);let b=LA.homedir();return console.error(`[authenticate] terminal-auth requested agentId=${a.agentId} methodId=${r}`),{kind:"terminal",command:h,args:g,env:w,cwd:b}}try{return await a.connection.request("authenticate",{methodId:r})}catch(p){throw si(p,a)}}async function BB(n,e){let r=(n??{})._meta?.["hydra-acp"],s=typeof r?.sessionId=="string"?r.sessionId:void 0,o=typeof r?.agentId=="string"?r.agentId:void 0,i=s!==void 0?e.manager.getAgentForSession(s):void 0;if(!i||!i.isAlive()){let a=o??e.defaultAgent;i=await e.manager.bootstrapAgentForAuth(a)}return await i.connection.request("logout",{})}function ch(n){return e=>{let t={agentId:e.agentId,version:e.version,source:e.source,phase:e.phase};"receivedBytes"in e&&(t.receivedBytes=e.receivedBytes),"totalBytes"in e&&(t.totalBytes=e.totalBytes),"packageSpec"in e&&(t.packageSpec=e.packageSpec),n.notify(zf,t).catch(()=>{})}}function lh(n){let e=n.availableModes();if(e.length===0)return;let t=e.map(s=>{let o={id:s.id,name:s.name??s.id};return s.description!==void 0&&(o.description=s.description),o});return{currentModeId:n.currentMode??e[0].id,availableModes:t}}function uh(n){let e=n.availableModels();if(e.length===0)return;let t=e.map(s=>{let o={modelId:s.modelId};return s.name!==void 0&&(o.name=s.name),s.description!==void 0&&(o.description=s.description),o});return{currentModelId:n.currentModel??e[0].modelId,availableModels:t}}async function HB(n,e,t,r){return e?await r.isRetiredGeneration(n,e.upstreamSessionId)?{kind:"ignore",logMessage:`session/attach ignoring stale resume hint sessionId=${n} hintUpstream=${e.upstreamSessionId} recordUpstream=${t} (retired generation)`}:{kind:"honor"}:{kind:"none"}}function UB(n,e){if(!n||typeof n!="object")return{kind:"error",code:K.InvalidParams,message:"session/set_model requires params",logMessage:"session/set_model rejected: params not an object"};let t=n;if(typeof t.sessionId!="string")return{kind:"error",code:K.InvalidParams,message:"session/set_model requires string sessionId",logMessage:"session/set_model rejected: missing/non-string sessionId"};if(typeof t.modelId!="string")return{kind:"error",code:K.InvalidParams,message:"session/set_model requires string modelId",logMessage:`session/set_model rejected: missing/non-string modelId sessionId=${t.sessionId}`};let r=e.get(t.sessionId);if(!r)return{kind:"error",code:K.SessionNotFound,message:`session ${t.sessionId} not found`,logMessage:`session/set_model rejected: session not found sessionId=${t.sessionId}`};let s=r.availableModels(),o=Ud(t.modelId,s);if(o.kind==="none")return{kind:"ok",session:r,modelId:t.modelId,logMessage:`session/set_model passthrough (no availableModels) sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)}`};if(o.kind==="exact")return{kind:"ok",session:r,modelId:t.modelId,logMessage:`session/set_model accepted sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)}`};if(o.kind==="resolved")return{kind:"ok",session:r,modelId:o.modelId,logMessage:`session/set_model resolved sessionId=${t.sessionId} requested=${JSON.stringify(t.modelId)} \u2192 ${JSON.stringify(o.modelId)}`};let i=s.map(d=>d.modelId).join(", "),a=o.kind==="ambiguous"?`ambiguous (trailing-segment matches [${o.candidates.join(", ")}])`:"not in availableModels";return r.currentModel!==void 0&&r.currentModel.length>0?{kind:"no_op",session:r,sessionId:t.sessionId,currentModel:r.currentModel,logMessage:`session/set_model no_op (resyncing client) sessionId=${t.sessionId} requested=${JSON.stringify(t.modelId)} ${a} actual=${JSON.stringify(r.currentModel)} agentId=${r.agentId} known=[${i}]`}:{kind:"error",code:K.InvalidParams,message:`model "${t.modelId}" is ${a==="not in availableModels"?"not in this session's availableModels":a} (agent ${r.agentId}); known models: ${i}`,logMessage:`session/set_model rejected sessionId=${t.sessionId} modelId=${JSON.stringify(t.modelId)} ${a} agentId=${r.agentId} known=[${i}] (no current model to fall back to)`}}async function WB(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0;if(!s)throw ue(K.InvalidParams,"transformer/attach requires sessionId");if(!t.transformers)throw ue(K.InternalError,"transformer manager not configured");let o=t.transformers.resolveChain([e])[0];if(!o)throw ue(K.InternalError,`transformer ${e} is not connected (call hydra-acp/transformer/initialize first)`);return lr(t.manager,s).addTransformer(o),{ok:!0}}async function jB(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0,o=typeof r.reason=="string"?r.reason:void 0;if(!s)throw ue(K.InvalidParams,"hydra-acp/attention/set requires string sessionId");if(!o)throw ue(K.InvalidParams,"hydra-acp/attention/set requires string reason");return lr(t.manager,s).setAttentionFlag(e,o,r.payload),{ok:!0}}async function qB(n,e,t){let r=n??{},s=typeof r.sessionId=="string"?r.sessionId:void 0,o=typeof r.reason=="string"?r.reason:void 0;if(!s)throw ue(K.InvalidParams,"hydra-acp/attention/clear requires string sessionId");if(!o)throw ue(K.InvalidParams,"hydra-acp/attention/clear requires string reason");return lr(t.manager,s).clearAttentionFlag(e,o),{ok:!0}}function zB(n){let e={sessionId:n.hydraSessionId,upstreamSessionId:n.upstreamSessionId,cwd:n.cwd,workspace:n.workspace,title:n.title,agentId:n.agentId,currentModel:n.currentModel,currentUsage:aa(n.currentUsage),forkedFromSessionId:n.forkedFromSessionId,forkedFromMessageId:n.forkedFromMessageId,forkSynthesisState:n.forkSynthesisState,originatingClient:n.originatingClient,interactive:n.interactive,updatedAt:n.createdAt??new Date().toISOString(),attachedClients:0,status:"cold",busy:!1,armedTasks:0,awaitingInput:!1},t={currentMode:n.currentMode,agentArgs:n.agentArgs,availableCommands:n.agentCommands,availableModes:n.agentModes,availableModels:n.agentModels,armedTaskList:[]};return{[ft]:Wf(e,t)}}function fh(n,e,t={}){let r=n.liveListEntry(e),s={clientId:t.clientId,currentMode:e.currentMode,agentArgs:e.agentArgs,availableCommands:e.mergedAvailableCommands(),availableModes:e.availableModes(),availableModels:e.availableModels(),turnStartedAt:e.turnStartedAt,agentCapabilities:e.agentCapabilities,queue:e.queueSnapshot(),armedTaskList:e.armedBackgroundTasks,...t.resurrected===!0?{resurrected:!0}:{}};return yl(e.agentMeta,Wf(r,s))}function KB(){return{protocolVersion:1,agentInfo:{name:"hydra",version:Be},agentCapabilities:{promptCapabilities:{image:!0,audio:!0,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0},loadSession:!0,auth:{logout:{}},sessionCapabilities:{attach:{},list:{},resume:{},delete:{},close:{},fork:{}}},authMethods:[{id:"proxy",name:"Hydra proxy",type:"agent",description:"Hydra proxies authentication to the downstream agent selected per session"}],_meta:{...yl(void 0,{prompt:{queueing:!0,cancelling:!0,updating:!0,amending:!0,pipelining:!1},agents:{list:!0,installProgress:!0},session:{fork:{forkAt:!0,agentSwap:!0,synthesis:!0,model:!0}}}),steering:{supported:!0}}}}function GB(n,e){if(!(!e.transformers||!e.manager))for(let t of e.manager.defaultTransformers){let r=e.transformers.resolveChain([t])[0];r&&n.addTransformer(r)}}function BA(n,e){if(!e.transformers)return;let t=e.transformers.interestedIn("lifecycle:session.starting");for(let r of t)r.connection.notify("hydra-acp/transformer/session_event",{event:"session.starting",sessionId:n}).catch(()=>{})}function ci(n,e,t,r,s){return{clientId:s??`cli_${fb(8)}`,connection:n,clientInfo:r}}function ic(n,e,t){let r=n.attached.get(t);r&&(e.detach(r.clientId),n.attached.delete(t))}var ph=class{byToken=new Map;reserve(e){if(this.byToken.has(e))throw new Error("mcp token already bound");let t,r,s=new Promise((i,a)=>{t=i,r=a});s.catch(()=>{});let o={session:void 0,sessionReady:s,disposers:[]};return this.byToken.set(e,o),{complete:i=>{o.session=i,t(i)},abandon:i=>{this.byToken.delete(e),r(i??new Error("mcp token reservation abandoned"))}}}bind(e,t){let{complete:r}=this.reserve(e);r(t)}lookup(e){return this.byToken.get(e)}addDisposer(e,t){let r=this.byToken.get(e);r!==void 0&&r.disposers.push(t)}async unbind(e){let t=this.byToken.get(e);if(t!==void 0){this.byToken.delete(e);for(let r of t.disposers)try{await r()}catch{}}}size(){return this.byToken.size}};import{randomUUID as JB}from"crypto";import{McpServer as VB}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as YB}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as Cn}from"zod";function pb(n){if(n.method!=="session/update")return null;let t=n.params?.update;return!t||typeof t.sessionUpdate!="string"?null:{kind:t.sessionUpdate,update:t}}function Vn(n){return{content:[{type:"text",text:JSON.stringify(n)}],structuredContent:n}}var HA="Bearer ";function ac(n){let e=n.headers.authorization;if(typeof e!="string"||!e.startsWith(HA))return;let t=e.slice(HA.length).trim();return t.length>0?t:void 0}function QB(n){let e=new VB({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:Cn.number().int().min(1).describe("How many trailing bytes to return.")}},async({bytes:t})=>{let r=n.streamTail(t);return Vn(r)}),e.registerTool("head",{description:"Return the first `bytes` bytes of piped stdin (capped server-side, default 64 KiB max). `truncated:true` means the head has already been evicted from the ring and the returned bytes start at the oldest still-resident cursor.",inputSchema:{bytes:Cn.number().int().min(1).describe("How many leading bytes to return.")}},async({bytes:t})=>{let r=n.streamHead(t);return Vn(r)}),e.registerTool("read",{description:"Read up to `max_bytes` bytes starting at absolute byte `cursor`. Returns `{bytes, nextCursor, gap?, eof?}` \u2014 `gap` is the number of bytes silently skipped because the ring had evicted them; `eof:true` means the producer closed and there is nothing left to read.",inputSchema:{cursor:Cn.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:Cn.number().int().min(1).optional().describe("Optional cap on how many bytes to return. Server caps at 64 KiB regardless."),wait_ms:Cn.number().int().min(0).optional().describe("If no bytes are available, block up to this many ms for more (capped server-side at 60_000).")}},async({cursor:t,max_bytes:r,wait_ms:s})=>{let o=await n.streamRead(t,r,s);return Vn(o)}),e.registerTool("wait_for_more",{description:"Block until bytes are available past `cursor`, the stream closes, or `timeout_ms` elapses. Returns one of {data, eof, timeout} plus the current `writeCursor`. Use this when you've consumed everything up to a cursor and want to wait for more without busy-polling.",inputSchema:{cursor:Cn.number().int().min(0).describe("The cursor you've already consumed up to."),timeout_ms:Cn.number().int().min(0).describe("Maximum ms to block (server caps at 60_000).")}},async({cursor:t,timeout_ms:r})=>{let s=await n.streamWaitFor(t,r),o=n.streamInfo();return Vn({outcome:s,writeCursor:o.writeCursor,closed:o.closed})}),e.registerTool("grep",{description:"Scan piped stdin line-by-line and return lines matching `pattern`. Prefer this over `read` when the question is 'find lines that mention X' \u2014 it filters server-side so you don't pull and decode 64 KiB base64 windows. Returns `{matches: [{cursor, line, before?, after?}], truncated, nextCursor, gap?, scannedBytes, eof?}`. Lines come back as decoded UTF-8 strings (not base64). When `truncated:true`, re-call with `cursor: nextCursor` to resume.",inputSchema:{pattern:Cn.string().min(1).describe("Search pattern. Treated as a JavaScript regular expression by default (set `regex:false` for a literal substring match)."),regex:Cn.boolean().optional().describe("Default true. Pass false to treat `pattern` as a literal substring."),case_insensitive:Cn.boolean().optional().describe("Default false. Pass true for case-insensitive matching."),invert:Cn.boolean().optional().describe("Default false. Pass true to return lines that do NOT match the pattern."),max_matches:Cn.number().int().min(1).optional().describe("Default 100. Capped server-side at 1000."),max_bytes:Cn.number().int().min(1).optional().describe("Default 64 KiB output. Capped server-side at 256 KiB."),context_before:Cn.number().int().min(0).optional().describe("Default 0. Number of lines before each match to include (capped at 20)."),context_after:Cn.number().int().min(0).optional().describe("Default 0. Number of lines after each match to include (capped at 20)."),cursor:Cn.number().int().min(0).optional().describe("Optional absolute byte offset to start scanning from. Omit to scan from the oldest still-resident byte. Pass the `nextCursor` from a previous truncated call to resume.")}},async t=>{let r={pattern:t.pattern};t.regex!==void 0&&(r.regex=t.regex),t.case_insensitive!==void 0&&(r.caseInsensitive=t.case_insensitive),t.invert!==void 0&&(r.invert=t.invert),t.max_matches!==void 0&&(r.maxMatches=t.max_matches),t.max_bytes!==void 0&&(r.maxBytes=t.max_bytes),t.context_before!==void 0&&(r.contextBefore=t.context_before),t.context_after!==void 0&&(r.contextAfter=t.context_after),t.cursor!==void 0&&(r.cursor=t.cursor);let s=n.streamGrep(r);return Vn(s)}),e.registerTool("info",{description:"Report cursor / capacity / closed state of the stdin ring. Cheap; safe to call repeatedly.",inputSchema:{}},async()=>{let t=n.streamInfo();return Vn(t)}),e}var XB=1e4;function UA(n,e){let t=new Map;async function r(i,a){let d=t.get(i);if(d!==void 0)return d.transport;let c=QB(a),l=new YB({sessionIdGenerator:()=>JB()});await c.connect(l);let u={server:c,transport:l};return t.set(i,u),e.addDisposer(i,async()=>{t.delete(i);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function s(i,a){let d=ac(i);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown stdin token"});return}let l;if(c.session!==void 0)l=c.session;else{let f,p=new Promise(h=>{f=setTimeout(()=>h(void 0),XB)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(f!==void 0&&clearTimeout(f),m===void 0){a.code(503).send({error:"session not ready"});return}l=m}let u=await r(d,l);a.hijack(),await u.handleRequest(i.raw,a.raw,i.body)}let o={config:{skipAuth:!0}};n.post("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)}),n.get("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)}),n.delete("/mcp/hydra-acp-stdin",o,async(i,a)=>{await s(i,a)})}Zf();import{randomUUID as ZB}from"crypto";import{McpServer as eH}from"@modelcontextprotocol/sdk/server/mcp.js";import{StreamableHTTPServerTransport as tH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{z as Ns}from"zod";function nH(n){switch(n){case"prompt_received":return"user";case"tool_call":case"tool_call_update":return"tool";default:return"agent"}}var WA=2e3,jA=2e4;function rH(n,e,t){if(e!=="tool_call"&&e!=="tool_call_update")return Wd([n]);let r=[],s=xl(t);s!==void 0?r.push(`Tool: ${s}`):typeof t.title=="string"&&t.title.length>0&&r.push(`Tool: ${t.title}`);let o=t.rawInput;if(o&&typeof o=="object"&&!Array.isArray(o))for(let[a,d]of Object.entries(o))typeof d=="string"&&d.length>0&&r.push(`${a}=${d}`);if(Array.isArray(t.locations))for(let a of t.locations)typeof a?.path=="string"&&a.path.length>0&&r.push(a.path);let i=Xf(t);return i!==void 0&&r.push(i),r.join(`
404
404
  `)}function sH(n,e){if(n.length<=148)return n;let s=Math.floor(148/2),o=e-s;o<0&&(o=0);let i=o+148;i>n.length&&(o=n.length-148,o<0&&(o=0));let a=n.slice(o,i);return o>0&&(a="\u2026"+a),i<n.length&&(a=a+"\u2026"),a}function oH(n){let e=new eH({name:"hydra-acp-recall",version:"1.0.0"},{instructions:"Search and retrieve detail from this session's pre-compaction history. After a compaction summary replaces earlier conversation in working memory, these tools let you page back specifics on demand. Use `search` to find entries by keyword, `range` to pull a contiguous slice verbatim, and `tool_calls` to enumerate prior tool invocations. These tools only return results once the session has been compacted at least once."});return e.registerTool("search",{description:"Search this session's prior conversation history (the part that was compacted out of your working memory) by keyword. Covers assistant and user messages, the arguments of every tool call including full shell commands, and what those calls printed. Returns matching entry ids with short snippets so you can decide which to pull in full via `range`. Use this when the compaction summary mentions something but you need the verbatim detail.",inputSchema:{query:Ns.string().min(1).describe("Case-insensitive substring to search for."),limit:Ns.number().int().min(1).max(50).optional().describe("Maximum number of matches to return (default 10, max 50)."),include_tool_calls:Ns.boolean().optional().describe("Whether to include tool_call entries in the search (default true).")}},async({query:t,limit:r=10,include_tool_calls:s=!0})=>{let o=await n();if(!o.summarizedThroughEntry||o.summarizedThroughEntry===0)return Vn({matches:[],total_matched:0,truncated:!1,note:"This session has no compacted history. `search` retrieves detail from entries that were summarized out of the working conversation; nothing has been summarized yet."});let i=[],a=t.toLowerCase();for await(let{entryId:c,entry:l}of o.iterRecallNewestFirst()){let u=pb(l);if(!u)continue;let{kind:f,update:p}=u;if((f==="tool_call"||f==="tool_call_update")&&!s)continue;let m=rH(l,f,p),h=m.toLowerCase().indexOf(a);if(h<0)continue;let g=nH(f),w=sH(m,h),b=typeof l.recordedAt=="number"?String(l.recordedAt):void 0;if(i.push({entryId:c,speaker:g,snippet:w,timestamp:b}),i.length>=r)break}i.sort((c,l)=>c.entryId-l.entryId);let d=i.length>=r;return Vn({matches:i,total_matched:i.length,truncated:d})}),e.registerTool("range",{description:"Pull a contiguous range of prior conversation entries verbatim from this session's pre-compaction history, including each tool call's arguments and what it printed. Use after `search` narrows in on what you need. Capped at 50 entries per call.",inputSchema:{from_entry:Ns.number().int().min(0).describe("Zero-based index of the first entry to include (inclusive)."),to_entry:Ns.number().int().min(0).describe("Zero-based index of the last entry to include (inclusive).")}},async({from_entry:t,to_entry:r})=>{let s=await n();if(!s.summarizedThroughEntry||s.summarizedThroughEntry===0)return Vn({text:"",entry_count:0,truncated:!1,note:"This session has no compacted history. `range` retrieves verbatim entries from the pre-compaction transcript; nothing has been compacted yet."});if(r<t)throw new Error(`range: to_entry (${r}) must be >= from_entry (${t})`);let o=r-t+1;if(o>50)throw new Error(`range: range size (${o}) exceeds maximum of 50 entries`);let i=await s.getRecallTotalCount();if(i===0)return Vn({text:"",entry_count:0,truncated:!1});let a=Math.min(t,i-1),d=Math.min(r,i-1),c=a>t||d<r;if(a>d)return{content:[{type:"text",text:""}],structuredContent:{text:"",entry_count:0,truncated:c}};let l=await s.sliceRecallHistory(a,d),u=Wd(l,{toolOutput:{maxPerCall:WA,maxTotal:jA}});return{content:[{type:"text",text:u}],structuredContent:{text:u,entry_count:l.length,truncated:c}}}),e.registerTool("tool_calls",{description:"Search this session's prior tool invocations by tool name, ACP kind, and/or file path. Returns when each tool was called, its arguments (including the full shell command), the result status, and what the call printed. Use this to recall which files were read/edited, what shell commands ran, and what they output.",inputSchema:{tool_name:Ns.string().optional().describe("Case-insensitive substring of the tool name. Names vary by agent for the same tool (Bash, Terminal, bash), so prefer `kind` when you want every shell invocation."),kind:Ns.string().optional().describe("ACP tool kind: execute (shell), read, edit, think, other. Agent-independent, unlike tool_name."),file_path:Ns.string().optional(),limit:Ns.number().int().min(1).max(100).optional(),include_output:Ns.boolean().optional().describe("Include what each call printed (default true). Set false when you only need the commands and not their results.")}},async({tool_name:t,kind:r,file_path:s,limit:o=20,include_output:i=!0})=>{let a=await n();if(!a.summarizedThroughEntry||a.summarizedThroughEntry===0)return Vn({calls:[],truncated:!1,note:"This session has no compacted history. `tool_calls` retrieves tool invocations from the pre-compaction transcript; nothing has been compacted yet."});let d=typeof t=="string"&&t.length>0,c=typeof r=="string"&&r.length>0,l=typeof s=="string"&&s.length>0;if(!d&&!c&&!l)throw new Error("tool_calls: at least one of tool_name, kind, or file_path must be provided");let u=new Map,f=Math.max(o*4,200);for await(let{entryId:b,entry:k}of a.iterRecallNewestFirst()){let S=pb(k);if(!S)continue;let{kind:I,update:x}=S;if(I!=="tool_call"&&I!=="tool_call_update")continue;let A=typeof x.toolCallId=="string"&&x.toolCallId.length>0?x.toolCallId:`__noid_${b}`,M=u.get(A);if(M||(M={entryId:b,toolName:"(unnamed)",nameAuthoritative:!1,rawInput:{},locations:[],status:"in_progress"},u.set(A,M)),b<M.entryId&&(M.entryId=b),!M.nameAuthoritative){let P=xl(x);P!==void 0?(M.toolName=P,M.nameAuthoritative=!0):typeof x.name=="string"&&x.name.length>0?(M.toolName=x.name,M.nameAuthoritative=!0):I==="tool_call"&&typeof x.title=="string"&&x.title.length>0&&(M.toolName=x.title,M.nameAuthoritative=!0)}if(M.kind===void 0&&typeof x.kind=="string"&&x.kind.length>0&&(M.kind=x.kind),M.output===void 0){let P=Xf(x);P!==void 0&&(M.output=P)}let E=x.rawInput;if(E&&typeof E=="object"&&!Array.isArray(E)&&Object.keys(E).length>0)for(let[P,F]of Object.entries(E))M.rawInput[P]===void 0&&(M.rawInput[P]=F);if(Array.isArray(x.locations))for(let P of x.locations){let F=P?.path;typeof F=="string"&&F.length>0&&!M.locations.includes(F)&&M.locations.push(F)}if(typeof x.status=="string"&&M.status==="in_progress"&&(M.status=x.status),k.recordedAt!==void 0&&M.timestamp===void 0&&(M.timestamp=String(k.recordedAt)),u.size>=f)break}let p=[...u.keys()].sort((b,k)=>u.get(b).entryId-u.get(k).entryId),m=[],h=jA,g=!1;for(let b of p){let k=u.get(b);if(k.toolName=sw({name:k.toolName,rawInput:k.rawInput,...k.kind!==void 0?{kind:k.kind}:{}}),d&&!k.toolName.toLowerCase().includes(t.toLowerCase())||c&&(k.kind??"").toLowerCase()!==r.toLowerCase())continue;if(l){let x=s.toLowerCase(),A=["file_path","filePath","path"],M=!1;for(let E of A){let P=k.rawInput[E];if(typeof P=="string"&&P.toLowerCase().includes(x)){M=!0;break}}if(!M){for(let E of k.locations)if(E.toLowerCase().includes(x)){M=!0;break}}if(!M)continue}let S={};for(let[x,A]of Object.entries(k.rawInput))typeof A=="string"?S[x]=A.length>500?A.slice(0,497)+"\u2026":A:(typeof A=="number"||typeof A=="boolean")&&(S[x]=A);k.locations.length>0&&S.locations===void 0&&(S.locations=k.locations);let I={entryId:k.entryId,tool:k.toolName,args:S,status:k.status,timestamp:k.timestamp};if(k.kind!==void 0&&(I.kind=k.kind),i&&k.output!==void 0){let x=k.output,A=Math.min(WA,h);if(A<=0)g=!0;else{let M=x.length<=A?x:x.slice(0,A-1)+"\u2026";I.output=M,I.outputBytes=x.length,I.outputTruncated=M.length<x.length,h-=M.length}}if(m.push(I),m.length>=o)break}let w=m.length>=o;return Vn({calls:m,truncated:w,...g?{outputBudgetExhausted:g}:{}})}),e}var iH=1e4;function qA(n,e){let t=new Map;async function r(i,a){let d=t.get(i);if(d!==void 0)return d.transport;let c=oH(a),l=new tH({sessionIdGenerator:()=>ZB()});await c.connect(l);let u={server:c,transport:l};return t.set(i,u),e.addDisposer(i,async()=>{t.delete(i);try{await l.close()}catch{}try{await c.close()}catch{}}),l}async function s(i,a){let d=ac(i);if(d===void 0){a.code(401).send({error:"missing bearer token"});return}let c=e.lookup(d);if(c===void 0){a.code(404).send({error:"unknown recall token"});return}let u=await r(d,async()=>{if(c.session!==void 0)return c.session;let f,p=new Promise(h=>{f=setTimeout(()=>h(void 0),iH)}),m=await Promise.race([c.sessionReady.catch(()=>{}),p]);if(f!==void 0&&clearTimeout(f),m===void 0)throw new Error("recall: session not ready");return m});a.hijack(),await u.handleRequest(i.raw,a.raw,i.body)}let o={config:{skipAuth:!0}};n.post("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)}),n.get("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)}),n.delete("/mcp/hydra-acp-recall",o,async(i,a)=>{await s(i,a)})}var hh=class{byName=new Map;changeHandlers=[];register(e,t,r,s){this.byName.set(e,{connection:t,instructions:r,tools:[...s]}),this.fireChanged(e,"register")}clear(e){this.byName.delete(e)&&this.fireChanged(e,"clear")}lookup(e){return this.byName.get(e)}list(){return Array.from(this.byName.keys())}onChange(e){return this.changeHandlers.push(e),()=>{let t=this.changeHandlers.indexOf(e);t>=0&&this.changeHandlers.splice(t,1)}}fireChanged(e,t){for(let r of this.changeHandlers)try{r(e,t)}catch{}}};import{StreamableHTTPServerTransport as hH}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as mH}from"crypto";import{Server as aH}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as dH,ListToolsRequestSchema as cH}from"@modelcontextprotocol/sdk/types.js";function zA(n,e,t,r){let s=typeof t=="function"?async()=>t():async()=>t,o=new aH({name:n,version:"1.0.0"},{capabilities:{tools:{listChanged:!0}},...e.instructions!==void 0?{instructions:e.instructions}:{}}),i=a=>({name:a.name,description:a.description,inputSchema:a.inputSchema,...a.outputSchema!==void 0?{outputSchema:a.outputSchema}:{}});return o.setRequestHandler(cH,async()=>{let a=r?.peekSessionId?.();if(a!==void 0&&r?.fetchSessionTools!==void 0)try{let d=await r.fetchSessionTools(a);if(d!==void 0)return{tools:d.map(i)}}catch{}return{tools:e.tools.map(i)}}),o.setRequestHandler(dH,async(a,d)=>{let c=a.params.name,l=d._meta?.progressToken??d.requestId,u=uH(l,d.sendNotification);try{let f=await s(),p=await fH(e.connection,n,c,a.params.arguments??{},f);return pH(p,c)}catch(f){return hb(f instanceof Error?f.message:String(f))}finally{u()}}),o}var lH=15e3;function uH(n,e,t=lH){if(n===void 0)return()=>{};let r=0,s=setInterval(()=>{r+=1,e({method:"notifications/progress",params:{progressToken:n,progress:r}}).catch(()=>{})},t);return s.unref?.(),()=>clearInterval(s)}async function fH(n,e,t,r,s){return await n.request("hydra-acp/mcp_tools/invoke",{server:e,tool:t,args:r,sessionId:s})}function pH(n,e){if(n===null||typeof n!="object")return hb(`extension ${e} returned non-object`);let t=n;return Array.isArray(t.content)?t:hb(`extension ${e} omitted content array`)}function hb(n){return{content:[{type:"text",text:n}],isError:!0}}var gH=1e4;function KA(n,e,t){let r=new Map;async function s(l){try{await l.transport.close()}catch{}try{await l.server.close()}catch{}}function o(l){for(let u of r.values()){let f=u.get(l);f!==void 0&&(u.delete(l),s(f))}}async function i(l,u){for(let[f,p]of r){if(e.lookup(f)?.session?.sessionId!==l)continue;let h=p.get(u);if(h!==void 0)try{await h.server.sendToolListChanged()}catch{}}}t.onChange(l=>{o(l)});async function a(l,u){let f=r.get(l);f===void 0&&(f=new Map,r.set(l,f),e.addDisposer(l,async()=>{let S=r.get(l);if(S!==void 0){r.delete(l);for(let I of S.values())await s(I)}}));let p=f.get(u);if(p!==void 0)return p.transport;let m=t.lookup(u);if(m===void 0)return;let b=zA(u,m,async()=>{let S=e.lookup(l);if(S===void 0)throw new Error("mcp token no longer bound");if(S.session!==void 0)return S.session.sessionId;let I,x=new Promise(M=>{I=setTimeout(()=>M(void 0),gH)}),A=await Promise.race([S.sessionReady.catch(()=>{}),x]);if(I!==void 0&&clearTimeout(I),A===void 0)throw new Error("session not ready");return A.sessionId},{peekSessionId:()=>e.lookup(l)?.session?.sessionId,fetchSessionTools:async S=>{let I=await m.connection.request("hydra-acp/mcp_tools/list_tools",{sessionId:S});if(!I||typeof I!="object")return;let x=I.tools;if(!Array.isArray(x))return;let A=[];for(let M of x){if(!M||typeof M!="object")continue;let E=M;if(typeof E.name!="string"||E.name.length===0||typeof E.description!="string"||E.inputSchema===null||typeof E.inputSchema!="object")continue;let P={name:E.name,description:E.description,inputSchema:E.inputSchema};E.outputSchema!==null&&typeof E.outputSchema=="object"&&(P.outputSchema=E.outputSchema),A.push(P)}return A}}),k=new hH({sessionIdGenerator:()=>mH()});return await b.connect(k),f.set(u,{server:b,transport:k}),k}async function d(l,u){let f=ac(l);if(f===void 0){u.code(401).send({error:"missing bearer token"});return}if(e.lookup(f)===void 0){u.code(404).send({error:"unknown mcp token"});return}let m=l.params.name,h=await a(f,m);if(h===void 0){u.code(404).send({error:`unknown mcp server: ${m}`});return}u.hijack(),await h.handleRequest(l.raw,u.raw,l.body)}let c={config:{skipAuth:!0}};return n.post("/mcp/:name",c,async(l,u)=>{await d(l,u)}),n.get("/mcp/:name",c,async(l,u)=>{await d(l,u)}),n.delete("/mcp/:name",c,async(l,u)=>{await d(l,u)}),{notifyToolListChanged:i}}async function XA(n,e){xH(n),hl(n.daemon.scrubEnv);let t=n,r=n.daemon.tls?await Ds.readFile(gt(n.daemon.tls.key)):void 0,s=n.daemon.tls?await Ds.readFile(gt(n.daemon.tls.cert)):void 0;await Ds.mkdir(L.home(),{recursive:!0});let{stream:o,fileStream:i}=await vH(n.daemon.logLevel),a=yH({logger:{level:n.daemon.logLevel,stream:o},bodyLimit:256*1024*1024});await a.register(wH,{options:{handleProtocols:Wx}}),Ny(ne=>{a.log.info(ne)}),Hy(ne=>{a.log.info(ne)});let d=await Hp.load(),c=await ih.load();ol(),sy(c);let l=new dh(c);l.start();let u=new eh(c);u.start();let f=new zp,p=new qp,m=new Up(e),h=new jp([m,new Wp(d),p]),g=MR({validator:h});a.addHook("onRequest",async(ne,he)=>{ne.routeOptions.config?.skipAuth||ne.url==="/acp"||ne.url?.startsWith("/acp?")||(await g(ne,he),!he.sent&&ne.authIdentity?.startsWith("script:")&&!$R(ne.method,ne.routeOptions.url)&&he.code(403).send({error:"script tokens may only access read-only session data"}))});let w=setInterval(()=>{d.sweepExpired()},300*1e3);w.unref();let b=setInterval(()=>{f.sweepExpired()},300*1e3);b.unref();let k=new Hf(n,{onFetched:()=>{wR(k,A)},onStaleFallback:(ne,he)=>{let $t=Math.round(he/36e5),Dt=$t>=48?`${Math.round($t/24)}d`:`${$t}h`;a.log.warn(`registry fetch failed (${ne.message}); serving stale cache last synced ${Dt} ago; agent versions may be outdated ('hydra registry refresh' to retry)`)}});Qw(ne=>a.log.info(ne));let S={info:ne=>a.log.info(ne),warn:ne=>a.log.warn(ne)},I=ne=>Xo.spawn({...ne,stderrTailBytes:n.daemon.agentStderrTailBytes,logger:S});Jx(n.compressToolContent);let x=new Dp,A=new Tp(k,I,void 0,{idleTimeoutMs:n.daemon.sessionIdleTimeoutSeconds*1e3,orphanTimeoutMs:n.daemon.nonInteractiveOrphanTimeoutSeconds*1e3,sessionDefaults:n.sessionDefaults,synopsisAgent:n.synopsisAgent,synopsisModel:n.synopsisModel,compactionAgent:n.compaction?.agent,compactionModel:n.compaction?.model,defaultTransformers:n.defaultTransformers,sessionHistoryMaxEntries:n.daemon.sessionHistoryMaxEntries,sessionHistoryArchiveMaxBytes:n.daemon.sessionHistoryArchiveMaxBytes,sessionHistoryArchiveTiers:n.daemon.sessionHistoryArchiveTiers,logger:S,npmRegistry:n.npmRegistry,extensionCommands:x,defaultCwd:n.defaultCwd,disableWorkspaceSnapshots:n.disableWorkspaceSnapshots}),M=new ah(c,void 0,{resolvesLocally:async ne=>await A.resolveCanonicalId(ne)!==void 0,cache:u}),E=new Lp(qg(n),void 0,{tokenRegistry:p}),P=new Np(zg(n),void 0,{tokenRegistry:p}),F=[];lA(a,Be,oi(n),()=>F);let z=new ph,V=new hh,U,X=()=>{if(U!==void 0)return U;let ne=a.server.address();return U=`http://127.0.0.1:${ne&&typeof ne=="object"?ne.port:n.daemon.port}`,U},ee={agentId:n.defaultAgent,cwd:n.defaultCwd,publicHost:n.daemon.publicHost,host:n.daemon.host,port:n.daemon.port,compaction:n.compaction};dA(a,A,ee,{extensionMcp:V,mcpTokenRegistry:z,getDaemonOrigin:X},c,u),sA(a,{store:c,localMiss:{resolvesLocally:async ne=>await A.resolveCanonicalId(ne)!==void 0,cache:u}}),cA(a,k,A,{npmRegistry:n.npmRegistry}),uA(a,E),fA(a,P),pA(a,()=>({defaultAgent:t.defaultAgent,defaultCwd:t.defaultCwd,sessionDefaults:{...t.sessionDefaults},...t.synopsisAgent!==void 0?{synopsisAgent:t.synopsisAgent}:{},...t.synopsisModel!==void 0?{synopsisModel:t.synopsisModel}:{},defaultTransformers:[...t.defaultTransformers]})),vA(a,{store:d,rateLimiter:f,staticTokenValidator:m}),RA(a,{store:c,health:l}),PA(a,{processRegistry:p}),UA(a,z),qA(a,z);let ve=KA(a,z,V);DA(a,{validator:h,manager:A,defaultAgent:n.defaultAgent,processRegistry:p,onExtensionVersion:(ne,he)=>E.reportVersion(ne,he),onTransformerVersion:(ne,he)=>P.reportVersion(ne,he),transformers:P,extensionCommands:x,mcpTokenRegistry:z,extensionMcp:V,extensionMcpControls:ve,getDaemonOrigin:X,registry:k,foreignSessions:M});let Me=!!n.daemon.tls;await a.listen({host:Me?"127.0.0.1":n.daemon.host,port:Me?0:n.daemon.port});let Ce=a.server.address(),Ke=Ce&&typeof Ce=="object"?Ce.port:n.daemon.port,Ee,ae=n.daemon.host,_e=Ke;if(Me&&r&&s){Ee=SH({listenHost:n.daemon.host,listenPort:n.daemon.port,upstreamHost:"127.0.0.1",upstreamPort:Ke,tlsOptions:{key:r,cert:s},logger:a.log});let ne=Ee.address();ne&&typeof ne=="object"&&(_e=ne.port)}await Ds.mkdir(L.home(),{recursive:!0}),await qS({pid:process.pid,host:ae,port:_e,loopbackPort:Ke,startedAt:new Date().toISOString()});let it={daemonUrl:`http://127.0.0.1:${Ke}`,daemonHost:"127.0.0.1",daemonPort:Ke,serviceToken:e,daemonWsUrl:`ws://127.0.0.1:${Ke}/acp`,hydraHome:L.home()};E.setContext(it),P.setContext(it),await E.start(),await P.start();try{await A.reconcilePermissionFlags()}catch(ne){a.log.warn(`permission flag reconcile failed: ${ne.message}`)}try{await A.seedSessionIndex()}catch(ne){a.log.warn(`session index seed failed: ${ne.message}`)}A.resurrectPendingQueues().catch(ne=>{a.log.warn(`queue replay scan failed: ${ne.message}`)}),A.resumePendingCompactions().catch(ne=>{a.log.warn(`compaction resume scan failed: ${ne.message}`)}),A.resumePendingAgentSwaps().catch(ne=>{a.log.warn(`agent-swap resume scan failed: ${ne.message}`)});let vt=n.daemon.agentSyncIntervalMinutes*60*1e3,Oe=vt>0?bR({registry:k,manager:A,intervalMs:vt,logger:S}):void 0,Jt=n.daemon.sessionGcIntervalMinutes*60*1e3,Ve=n.daemon.sessionGcMaxAgeDays*24*60*60*1e3,An=Jt>0?kR({manager:A,intervalMs:Jt,maxAgeMs:Ve,logger:S}):void 0,_t=IR({bootConfig:n,apply:ne=>{t=ne,k.setConfig(ne),A.setLiveConfig({sessionDefaults:ne.sessionDefaults}),ee.agentId=ne.defaultAgent,ee.cwd=ne.defaultCwd,hl(ne.daemon.scrubEnv)},onDrift:ne=>{F=ne},logger:S});return{app:a,manager:A,registry:k,extensions:E,transformers:P,mcpTokenRegistry:z,extensionMcp:V,processRegistry:p,shutdown:async()=>{l.stop(),u.stop(),_t(),An&&An(),Oe&&Oe(),clearInterval(w),clearInterval(b);let ne=async(he,$t)=>{try{await $t()}catch(Dt){a.log.warn(`shutdown step ${he} failed: ${Dt instanceof Error?Dt.message:String(Dt)}`)}};await ne("sessionTokenStore.flush",()=>d.flush()),await ne("extensions.stop",()=>E.stop()),await ne("transformers.stop",()=>P.stop()),await ne("manager.closeAll",()=>A.closeAll()),await ne("manager.flushSynopsis",()=>A.flushSynopsis(3e4)),await ne("manager.shutdownSynopsis",()=>A.shutdownSynopsis()),await ne("manager.flushMetaWrites",()=>A.flushMetaWrites()),await ne("manager.flushHistoryWrites",()=>A.flushHistoryWrites()),Ny(null),Hy(null),Qw(null),Ee&&await ne("tlsTerminator.close",()=>new Promise(he=>Ee.close(()=>he()))),await ne("app.close",()=>a.close());try{VA.unlinkSync(L.pidFile())}catch{}await ne("fileStream.flushSync",()=>i.flushSync())}}}var JA=20;async function kH(n,e){let t=dc.dirname(n),r=dc.basename(n,".log"),s=new RegExp(`^${r}\\.(\\d+)\\.log$`),o;try{o=await Ds.readdir(t)}catch{return}let i=[];for(let d of o){let c=d.match(s);c&&i.push({name:d,n:Number(c[1])})}if(i.length<=e)return;i.sort((d,c)=>d.n-c.n);let a=i.slice(0,i.length-e);await Promise.allSettled(a.map(d=>Ds.unlink(dc.join(t,d.name))))}async function vH(n){await kH(L.logFile(),JA);let e=await bH({file:L.logFile(),size:"10m",mkdir:!0,symlink:_p,limit:{count:JA,removeOtherLogFiles:!0}}),t=GA.destination(2);return{stream:GA.multistream([{stream:e,level:n},{stream:t,level:n}]),fileStream:e}}function SH(n){let e=QA.createServer(n.tlsOptions,t=>{let r=YA.connect({host:n.upstreamHost,port:n.upstreamPort}),s=!1,o=i=>{if(!s){s=!0,i&&n.logger.warn(`tls terminator forwarder error: ${i.message??String(i)}`);try{t.destroy()}catch{}try{r.destroy()}catch{}}};t.on("error",o),r.on("error",o),t.on("close",()=>o()),r.on("close",()=>o()),t.pipe(r),r.pipe(t)});return e.on("tlsClientError",t=>{n.logger.warn(`tls handshake error: ${t.message}`)}),e.listen({host:n.listenHost,port:n.listenPort}),e}function xH(n){let e=n.daemon.host;if(!(e==="127.0.0.1"||e==="::1"||e==="localhost"||e==="[::1]")&&!n.daemon.tls)throw new Error(`Refusing to bind to non-loopback host ${e} without TLS configured.`)}ha();cr();tc();eu();async function sT(n={}){let e=await hd(),t=await Xc();if(await mh(e)){let s=await uc();process.stdout.write(`Daemon already running${s?` (pid ${s.pid})`:""}. Run \`hydra-acp daemon restart\` to restart it.
405
405
  `);return}if(td(n,"foreground")){process.title="hydra-acp-daemon";let s=await XA(e,t);process.stdout.write(`hydra-acp daemon listening on ${e.daemon.host}:${e.daemon.port}
406
406
  `);let o=1e4,i=!1,a=async()=>{i&&(process.stderr.write(`Second signal received; exiting immediately.