@agenthippo-ai/agenthippo 1.110.47 → 1.110.48

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/out/cli/index.js CHANGED
@@ -28,30 +28,30 @@ Provide clear, actionable responses with code examples when relevant.
28
28
  `)}).join(`
29
29
 
30
30
  `)}async function Vv(t){let e=Jr.join(t,ld,cm);if(!await Sc(e))return null;try{return await yo.promises.readFile(e,"utf-8")}catch{return null}}async function Kv(t){let e=Jr.join(t,ld);if(!await Sc(e))return[];let n=[],r;try{r=await yo.promises.readdir(e,{withFileTypes:!0})}catch{return[]}for(let s of r){if(!s.isDirectory())continue;let i=s.name,o=await lm(i,e);if(!o)continue;let a=Jr.join(e,i);n.push({name:o.name??i,label:o.label??i,description:o.description,command:o.command,args:dd(o.args,a),env:wc(o.env)})}return n}nt.AGENTHIPPO_MCP_SERVERS_ENV="AGENTHIPPO_MCP_SERVERS";function fd(t,e){let n={...t.headers??{}};if(t.bearerTokenEnv){let r=e[t.bearerTokenEnv]?.trim();r&&(n.Authorization=`Bearer ${r}`)}return Object.keys(n).length>0?n:void 0}var Wv=/^[A-Za-z_][A-Za-z0-9_]*$/;function qv(t,e){let n=t.bearerTokenEnv;if(n&&!Wv.test(n))return fd(t,e);let r={...t.headers??{}};return n&&(r.Authorization=`Bearer \${${n}}`),Object.keys(r).length>0?r:void 0}function Yv(t,e){let n={};for(let r of t){if(r.url){let s=fd(r,e??process.env);n[r.name]={type:"http",url:r.url,...s?{headers:s}:{}};continue}n[r.name]={command:r.command,args:r.args,...r.env&&Object.keys(r.env).length>0?{env:r.env}:{}}}return n}function Jv(t){if(Object.keys(t).length!==0)return JSON.stringify(t)}function Xv(t){if(t?.trim())try{let e=JSON.parse(t);return!e||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function Sc(t){try{return await yo.promises.access(t),!0}catch{return!1}}});var Tc=T(Ac=>{"use strict";Object.defineProperty(Ac,"__esModule",{value:!0});Ac.ENGINE_EFFORTS=void 0;Ac.ENGINE_EFFORTS={codex:["minimal","low","medium","high","xhigh","max","ultra","persistent"],claude:["low","medium","high","xhigh","max"]}});var fm=T(wo=>{"use strict";Object.defineProperty(wo,"__esModule",{value:!0});wo.NoOpLogger=wo.ConsoleLogger=void 0;var pd=class{prefix;constructor(e="[AgentIDE]"){this.prefix=e}debug(e){console.debug(`${this.prefix} ${e}`)}info(e){console.log(`${this.prefix} ${e}`)}warn(e){console.warn(`${this.prefix} Warning: ${e}`)}error(e,n){console.error(`${this.prefix} Error: ${e}${n?`: ${n.message}`:""}`)}};wo.ConsoleLogger=pd;var gd=class{debug(e){}info(e){}warn(e){}error(e,n){}};wo.NoOpLogger=gd});var pm=T(zs=>{"use strict";Object.defineProperty(zs,"__esModule",{value:!0});zs.CLIPermissionHandler=zs.AutoDenyPermissionHandler=zs.AutoApprovePermissionHandler=void 0;var hd=class{async requestPermission(e){return{behavior:"allow"}}};zs.AutoApprovePermissionHandler=hd;var md=class{message;constructor(e="All tool requests are denied"){this.message=e}async requestPermission(e){return{behavior:"deny",message:this.message}}};zs.AutoDenyPermissionHandler=md;var _d=class{readline;async requestPermission(e){return this.readline||(this.readline=require("readline")),new Promise(n=>{let r=this.readline.createInterface({input:process.stdin,output:process.stdout}),s=e.toolInput?`${e.toolName}: ${JSON.stringify(e.toolInput).slice(0,100)}`:e.toolName;console.log(`
31
- \u26A0\uFE0F Tool permission requested: ${s}`),r.question("Allow? (y/n): ",i=>{r.close();let o=i.toLowerCase().startsWith("y");n(o?{behavior:"allow"}:{behavior:"deny",message:"User denied permission"})})})}};zs.CLIPermissionHandler=_d});var gm=T(bc=>{"use strict";Object.defineProperty(bc,"__esModule",{value:!0});bc.NoOpEditTracker=void 0;var Ed=class{appliesEdits=!1;async startTracking(e,n){}async stopTracking(e,n){}async applyEdit(e,n,r,s){}};bc.NoOpEditTracker=Ed});var hm=T(An=>{"use strict";var zv=An&&An.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Qv=An&&An.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Zv=An&&An.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&zv(n,e,r[s]);return Qv(n,e),n}})();Object.defineProperty(An,"__esModule",{value:!0});An.DirectorySessionStore=An.FileSessionStore=An.MemorySessionStore=void 0;var un=require("fs"),vc=Zv(require("path")),eO=require("crypto"),yd=class{store=new Map;get(e){return this.store.get(e)}async set(e,n){this.store.set(e,n)}clear(){this.store.clear()}};An.MemorySessionStore=yd;var wd=class{store={};loaded=!1;filePath;constructor(e){this.filePath=e}async load(){if(!this.loaded){try{let e=await un.promises.readFile(this.filePath,"utf-8");this.store=JSON.parse(e)}catch(e){e.code!=="ENOENT"&&console.warn(`[FileSessionStore] Failed to load ${this.filePath}: ${e}`),this.store={}}this.loaded=!0}}get(e){return this.loaded||this.loadSync(),this.store[e]}async set(e,n){this.store[e]=n,await this.flush()}async clear(){this.store={},await this.flush()}async flush(){let e=vc.dirname(this.filePath);await un.promises.mkdir(e,{recursive:!0});let n=`${this.filePath}.tmp.${Date.now()}`,r=JSON.stringify(this.store,null,2);try{await un.promises.writeFile(n,r,"utf-8"),await un.promises.rename(n,this.filePath)}catch(s){try{await un.promises.unlink(n)}catch{}throw s}}loadSync(){if(!this.loaded){try{let e=(0,un.readFileSync)(this.filePath,"utf-8");this.store=JSON.parse(e)}catch(e){e.code!=="ENOENT"&&console.warn(`[FileSessionStore] Failed to load ${this.filePath}: ${e}`),this.store={}}this.loaded=!0}}};An.FileSessionStore=wd;var Sd=class{dir;entries={};serialized=new Map;files=new Map;loaded=!1;constructor(e){this.dir=e}get(e){return this.loaded||this.loadSync(),this.entries}async set(e,n){this.loaded||this.loadSync();let r=n&&typeof n=="object"?n:{};await un.promises.mkdir(this.dir,{recursive:!0});for(let[s,i]of Object.entries(r)){let o=JSON.stringify(i);if(this.serialized.get(s)===o)continue;let a=this.files.get(s)??`${this.fileNameFor(s)}.json`;await this.writeAtomic(a,JSON.stringify({key:s,value:i},null,2)),this.files.set(s,a),this.serialized.set(s,o)}for(let s of[...this.serialized.keys()]){if(Object.prototype.hasOwnProperty.call(r,s))continue;let i=this.files.get(s);if(i)try{await un.promises.unlink(vc.join(this.dir,i))}catch{}this.files.delete(s),this.serialized.delete(s)}this.entries={...r}}fileNameFor(e){return(0,eO.createHash)("sha256").update(e).digest("hex").slice(0,40)}async writeAtomic(e,n){let r=vc.join(this.dir,e),s=`${r}.tmp.${process.pid}.${Date.now()}`;try{await un.promises.writeFile(s,n,"utf-8"),await un.promises.rename(s,r)}catch(i){try{await un.promises.unlink(s)}catch{}throw i}}loadSync(){if(this.loaded)return;this.loaded=!0,this.migrateLegacySingleFileSync();let e;try{e=(0,un.readdirSync)(this.dir).filter(n=>n.endsWith(".json"))}catch(n){n.code!=="ENOENT"&&console.warn(`[DirectorySessionStore] Failed to list ${this.dir}: ${n}`);return}for(let n of e)try{let r=(0,un.readFileSync)(vc.join(this.dir,n),"utf-8"),s=JSON.parse(r);s&&typeof s.key=="string"&&(this.entries[s.key]=s.value,this.serialized.set(s.key,JSON.stringify(s.value)),this.files.set(s.key,n))}catch(r){console.warn(`[DirectorySessionStore] Skipping unreadable ${n}: ${r}`)}}migrateLegacySingleFileSync(){let e=!0;try{(0,un.readdirSync)(this.dir)}catch{e=!1}if(e)return;let n=`${this.dir}.json`,r;try{r=JSON.parse((0,un.readFileSync)(n,"utf-8"))}catch{return}for(let s of Object.values(r))if(s&&typeof s=="object")for(let[i,o]of Object.entries(s))this.entries[i]=o}};An.DirectorySessionStore=Sd});var mm=T(Oc=>{"use strict";Object.defineProperty(Oc,"__esModule",{value:!0});Oc.StaticConfigProvider=void 0;var Ad=class{config;customProviders;engineSettings;constructor(e={},n={},r={}){this.config=e,this.customProviders=n,this.engineSettings=r}get(e,n,r){let s=`${e}.${n}`,i=this.config[s];return i!==void 0?i:r}getCustomProviders(){return this.customProviders}getEngineSettings(){return this.engineSettings}};Oc.StaticConfigProvider=Ad});var Ic=T(pt=>{"use strict";Object.defineProperty(pt,"__esModule",{value:!0});pt.StaticConfigProvider=pt.DirectorySessionStore=pt.FileSessionStore=pt.MemorySessionStore=pt.NoOpEditTracker=pt.CLIPermissionHandler=pt.AutoDenyPermissionHandler=pt.AutoApprovePermissionHandler=pt.NoOpLogger=pt.ConsoleLogger=void 0;var _m=fm();Object.defineProperty(pt,"ConsoleLogger",{enumerable:!0,get:function(){return _m.ConsoleLogger}});Object.defineProperty(pt,"NoOpLogger",{enumerable:!0,get:function(){return _m.NoOpLogger}});var Td=pm();Object.defineProperty(pt,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return Td.AutoApprovePermissionHandler}});Object.defineProperty(pt,"AutoDenyPermissionHandler",{enumerable:!0,get:function(){return Td.AutoDenyPermissionHandler}});Object.defineProperty(pt,"CLIPermissionHandler",{enumerable:!0,get:function(){return Td.CLIPermissionHandler}});var tO=gm();Object.defineProperty(pt,"NoOpEditTracker",{enumerable:!0,get:function(){return tO.NoOpEditTracker}});var bd=hm();Object.defineProperty(pt,"MemorySessionStore",{enumerable:!0,get:function(){return bd.MemorySessionStore}});Object.defineProperty(pt,"FileSessionStore",{enumerable:!0,get:function(){return bd.FileSessionStore}});Object.defineProperty(pt,"DirectorySessionStore",{enumerable:!0,get:function(){return bd.DirectorySessionStore}});var nO=mm();Object.defineProperty(pt,"StaticConfigProvider",{enumerable:!0,get:function(){return nO.StaticConfigProvider}})});var So=T(It=>{"use strict";Object.defineProperty(It,"__esModule",{value:!0});It.RAW_IDS_ENV=It.ID_SALT_ENV=It.CONTENT_CAPTURE_ENV=void 0;It.isContentCaptureEnabled=wm;It.resetPrivacyAnnouncementsForTest=iO;It.hashIdentity=aO;It.digestContent=Sm;It.describeContent=cO;var Em=require("crypto");It.CONTENT_CAPTURE_ENV="AGENTHIPPO_EVIDENCE_CONTENT_CAPTURE";It.ID_SALT_ENV="AGENTHIPPO_EVIDENCE_ID_SALT";It.RAW_IDS_ENV="AGENTHIPPO_EVIDENCE_RAW_IDS";var rO="agenthippo-evidence-unsalted",sO=new Set(["1","true","yes","on"]);function ym(t){return sO.has((t??"").trim().toLowerCase())}var vd=!1,Od=!1;function wm(t=process.env){let e=ym(t[It.CONTENT_CAPTURE_ENV]);return vd||(vd=!0,console.warn(e?`[evidence] CONTENT CAPTURE IS ON \u2014 prompts, completions and tool I/O are recorded in evidence (${It.CONTENT_CAPTURE_ENV} is set). Unset it for metadata-only evidence.`:`[evidence] content capture off \u2014 tool I/O is recorded as sha256 + length only. Set ${It.CONTENT_CAPTURE_ENV}=1 to restore full previews.`)),e}function iO(){vd=!1,Od=!1}function oO(t){let e=t[It.ID_SALT_ENV]?.trim();return e||(Od||(Od=!0,console.warn(`[evidence] ${It.ID_SALT_ENV} is not set \u2014 identity hashes use a public constant salt. They pseudonymise, but a known address can still be confirmed by hashing it. Set the same secret on every instance whose evidence is joined.`)),rO)}function aO(t,e=process.env){let n=t?.trim();return n?ym(e[It.RAW_IDS_ENV])?n:`anon_${(0,Em.createHash)("sha256").update(`${oO(e)}\0${n}`).digest("hex").slice(0,32)}`:void 0}function Sm(t){return{sha256:(0,Em.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function cO(t,e,n=500,r=process.env){if(e===void 0)return{};let s=Sm(e),i={[`${t}_sha256`]:s.sha256,[`${t}_length`]:s.length};return wm(r)&&(i[`${t}Preview`]=e.slice(0,n)),i}});var Pc=T(ke=>{"use strict";Object.defineProperty(ke,"__esModule",{value:!0});ke.ANTHROPIC_SETUP_TOKEN_PREFIX=ke.PROVIDERS=void 0;ke.getProvider=lO;ke.requiresApiKey=uO;ke.isLocalProvider=dO;ke.getAllProviderIds=fO;ke.getCloudProviders=pO;ke.getLocalProviders=gO;ke.getApiKeyProviders=hO;ke.requiresBaseUrl=mO;ke.getGatewayProviders=_O;ke.isGatewayProvider=EO;ke.isAnthropicProviderFamily=yO;ke.normalizeAnthropicSetupToken=wO;ke.isAnthropicSetupToken=SO;ke.providerNotSupportAnthropicApi=AO;ke.PROVIDERS={openai:{id:"openai",displayName:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",requiresApiKey:!0,showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},"openai-codex":{id:"openai-codex",displayName:"OpenAI (ChatGPT subscription)",defaultEndpoint:"https://chatgpt.com/backend-api/codex",requiresApiKey:!0,description:"Use your ChatGPT/Codex subscription via native OAuth",showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},anthropic:{id:"anthropic",displayName:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},showInAddApiKeyUI:!0},"anthropic-setup-token":{id:"anthropic-setup-token",displayName:"Anthropic (Claude Subscription)",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},description:'Use Claude subscription setup-token from "claude setup-token"',showInAddApiKeyUI:!0},openrouter:{id:"openrouter",displayName:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",requiresApiKey:!0,description:"Fast model proxy via openrouter.ai that works with all agents",showInAddApiKeyUI:!0,isGateway:!0},litellm:{id:"litellm",displayName:"LiteLLM",endpointSettingKey:"agentide.providers.litellm.baseUrl",requiresApiKey:!0,description:"local adapter for agents to work with Spotlight and all models from OpenAI, Anthropic, Ollama etc.",showInAddApiKeyUI:!0,isGateway:!0,deferMissingApiKey:!0},ollama:{id:"ollama",displayName:"Ollama",defaultEndpoint:"http://localhost:11434/v1",requiresApiKey:!1,enabledSettingKey:"agentide.local.ollama.enabled",defaultEnabled:!0,placeholderApiKey:"ollama",description:"Local LLM server",showInAddApiKeyUI:!1,notSupportAnthropicApi:!0},agenthippo:{id:"agenthippo",displayName:"AgentHippo Gateway",defaultEndpoint:"https://gateway.agenthippo.ai/v1",endpointSettingKey:"agentide.AgentHippoModelGateway.url",requiresApiKey:!0,description:"AgentHippo managed gateway \u2014 uses account JWT, picks model automatically",showInAddApiKeyUI:!1,isGateway:!0,staticHeaders:{"x-agenthippo-source":"chat-ui"},credentialRefreshCommand:"agentide.auth.refreshToken",deferMissingApiKey:!0}};function lO(t){return ke.PROVIDERS[t]}function uO(t){return ke.PROVIDERS[t]?.requiresApiKey??!0}function dO(t){let e=ke.PROVIDERS[t];return e?!e.requiresApiKey:!1}function fO(){return Object.keys(ke.PROVIDERS)}function pO(){return Object.values(ke.PROVIDERS).filter(t=>t.requiresApiKey)}function gO(){return Object.values(ke.PROVIDERS).filter(t=>!t.requiresApiKey)}function hO(){return Object.values(ke.PROVIDERS).filter(t=>t.showInAddApiKeyUI===!0)}function mO(t){let e=ke.PROVIDERS[t];return e?!!e.endpointSettingKey&&!e.defaultEndpoint:!1}function _O(){return Object.values(ke.PROVIDERS).filter(t=>t.isGateway)}function EO(t){return ke.PROVIDERS[t]?.isGateway??!1}function yO(t){return t==="anthropic"||t==="anthropic-setup-token"}ke.ANTHROPIC_SETUP_TOKEN_PREFIX="sk-ant-oat01-";function wO(t){return t.replace(/\s+/g,"").trim()}function SO(t){return typeof t=="string"&&t.trim().startsWith(ke.ANTHROPIC_SETUP_TOKEN_PREFIX)}function AO(t,e){let n=ke.PROVIDERS[t];return n?n.notSupportAnthropicApi??!1:e?.[t]?.notSupportAnthropicApi===!0}});var Nc=T(qe=>{"use strict";Object.defineProperty(qe,"__esModule",{value:!0});qe.REGISTRY_KEY_SEPARATOR=qe.BUILTIN_MODELS=void 0;qe.getRegistryKey=Am;qe.parseRegistryKey=TO;qe.isCompositeKey=bO;qe.getModel=vO;qe.getModelByRegistryKey=OO;qe.getModelsForProvider=IO;qe.getRecommendedModels=PO;qe.getModelsWithCapability=NO;qe.getActiveModels=RO;qe.resolveModelAlias=CO;qe.BUILTIN_MODELS=[{id:"ah-auto",name:"Auto",provider:"agenthippo",contextWindow:2e5,maxOutputTokens:8192,capabilities:["chat","vision","function-calling","code"],description:"Managed gateway \u2014 routed through AgentHippo using your account, not your own API keys",recommended:!0}];qe.REGISTRY_KEY_SEPARATOR="::";function Am(t,e){return`${t}${qe.REGISTRY_KEY_SEPARATOR}${e}`}function TO(t){let e=t.indexOf(qe.REGISTRY_KEY_SEPARATOR);if(e!==-1)return{providerId:t.substring(0,e),modelId:t.substring(e+qe.REGISTRY_KEY_SEPARATOR.length)}}function bO(t){return t.includes(qe.REGISTRY_KEY_SEPARATOR)}function vO(t){return qe.BUILTIN_MODELS.find(e=>e.id===t)}function OO(t){return qe.BUILTIN_MODELS.find(e=>Am(e.provider,e.id)===t)}function IO(t){return qe.BUILTIN_MODELS.filter(e=>e.provider===t)}function PO(){return qe.BUILTIN_MODELS.filter(t=>t.recommended===!0)}function NO(t){return qe.BUILTIN_MODELS.filter(e=>e.capabilities.includes(t))}function RO(){return qe.BUILTIN_MODELS.filter(t=>!t.deprecated)}function CO(t){if(!t)return t;let e=t.toLowerCase().trim();return qe.BUILTIN_MODELS.find(r=>r.id.toLowerCase()===e)?.id??t}});var Id=T(Et=>{"use strict";Object.defineProperty(Et,"__esModule",{value:!0});Et.AGENT_ENGINES=void 0;Et.getAgentEngine=kO;Et.getAllAgentEngines=$O;Et.getAllAgentEngineIds=DO;Et.getCompatibleProviders=LO;Et.getEnginesCompatibleWithProvider=MO;Et.isEngineCompatibleWithProvider=GO;Et.getEngineRulesFile=UO;Et.getEngineWorkspaceDir=HO;var Ts=Pc();Et.AGENT_ENGINES={codex:{id:"codex",displayName:"Codex",description:"OpenAI Codex - code generation agent",icon:"sparkle",nativeProvider:"openai",workspaceDir:".codex",rulesFile:"AGENTS.md",configEnvVar:"CODEX_HOME",managedPaths:["skills","config.toml","agentide.runtime.md"]},claude:{id:"claude",displayName:"Claude",description:"Anthropic Claude - agentic coding assistant",icon:"beaker",nativeProvider:"anthropic",workspaceDir:".claude",rulesFile:"CLAUDE.md",configEnvVar:"CLAUDE_CONFIG_DIR"}};function kO(t){return Et.AGENT_ENGINES[t]}function $O(){return Object.values(Et.AGENT_ENGINES)}function DO(){return Object.keys(Et.AGENT_ENGINES)}function LO(t){let e=Et.AGENT_ENGINES[t];if(!e)return[];let n=[e.nativeProvider];for(let[r,s]of Object.entries(Ts.PROVIDERS))if(!n.includes(r)){if(s.isGateway){n.push(r);continue}e.nativeProvider==="openai"&&!(0,Ts.isAnthropicProviderFamily)(r)&&n.push(r),e.nativeProvider==="anthropic"&&(0,Ts.isAnthropicProviderFamily)(r)&&n.push(r)}return n}function MO(t){let e=Ts.PROVIDERS[t];return e?e.isGateway?Object.values(Et.AGENT_ENGINES):Object.values(Et.AGENT_ENGINES).filter(n=>!!(n.nativeProvider===t||n.nativeProvider==="openai"&&!(0,Ts.isAnthropicProviderFamily)(t)||n.nativeProvider==="anthropic"&&(0,Ts.isAnthropicProviderFamily)(t))):[]}function GO(t,e){let n=Et.AGENT_ENGINES[t];return n?!!(n.nativeProvider===e||(0,Ts.isGatewayProvider)(e)||n.nativeProvider==="openai"&&!(0,Ts.isAnthropicProviderFamily)(e)||n.nativeProvider==="anthropic"&&(0,Ts.isAnthropicProviderFamily)(e)):!1}function UO(t){return Et.AGENT_ENGINES[t]?.rulesFile}function HO(t){return Et.AGENT_ENGINES[t]?.workspaceDir}});var kc=T(V=>{"use strict";Object.defineProperty(V,"__esModule",{value:!0});V.getEngineWorkspaceDir=V.getEngineRulesFile=V.isEngineCompatibleWithProvider=V.getEnginesCompatibleWithProvider=V.getCompatibleProviders=V.getAllAgentEngineIds=V.getAllAgentEngines=V.getAgentEngine=V.AGENT_ENGINES=V.getActiveModels=V.getModelsWithCapability=V.getRecommendedModels=V.getModelsForProvider=V.getModel=V.getModelByRegistryKey=V.isCompositeKey=V.parseRegistryKey=V.getRegistryKey=V.REGISTRY_KEY_SEPARATOR=V.BUILTIN_MODELS=V.providerNotSupportAnthropicApi=V.isAnthropicSetupToken=V.normalizeAnthropicSetupToken=V.ANTHROPIC_SETUP_TOKEN_PREFIX=V.isAnthropicProviderFamily=V.requiresBaseUrl=V.getApiKeyProviders=V.getLocalProviders=V.getCloudProviders=V.getAllProviderIds=V.isLocalProvider=V.requiresApiKey=V.getProvider=V.PROVIDERS=void 0;V.getProviderForModel=xO;V.getEngineForModel=BO;V.getModelsForEngine=FO;V.isModelFromProvider=VO;var Tn=Pc();Object.defineProperty(V,"PROVIDERS",{enumerable:!0,get:function(){return Tn.PROVIDERS}});Object.defineProperty(V,"getProvider",{enumerable:!0,get:function(){return Tn.getProvider}});Object.defineProperty(V,"requiresApiKey",{enumerable:!0,get:function(){return Tn.requiresApiKey}});Object.defineProperty(V,"isLocalProvider",{enumerable:!0,get:function(){return Tn.isLocalProvider}});Object.defineProperty(V,"getAllProviderIds",{enumerable:!0,get:function(){return Tn.getAllProviderIds}});Object.defineProperty(V,"getCloudProviders",{enumerable:!0,get:function(){return Tn.getCloudProviders}});Object.defineProperty(V,"getLocalProviders",{enumerable:!0,get:function(){return Tn.getLocalProviders}});Object.defineProperty(V,"getApiKeyProviders",{enumerable:!0,get:function(){return Tn.getApiKeyProviders}});Object.defineProperty(V,"requiresBaseUrl",{enumerable:!0,get:function(){return Tn.requiresBaseUrl}});Object.defineProperty(V,"isAnthropicProviderFamily",{enumerable:!0,get:function(){return Tn.isAnthropicProviderFamily}});Object.defineProperty(V,"ANTHROPIC_SETUP_TOKEN_PREFIX",{enumerable:!0,get:function(){return Tn.ANTHROPIC_SETUP_TOKEN_PREFIX}});Object.defineProperty(V,"normalizeAnthropicSetupToken",{enumerable:!0,get:function(){return Tn.normalizeAnthropicSetupToken}});Object.defineProperty(V,"isAnthropicSetupToken",{enumerable:!0,get:function(){return Tn.isAnthropicSetupToken}});Object.defineProperty(V,"providerNotSupportAnthropicApi",{enumerable:!0,get:function(){return Tn.providerNotSupportAnthropicApi}});var vr=Nc();Object.defineProperty(V,"BUILTIN_MODELS",{enumerable:!0,get:function(){return vr.BUILTIN_MODELS}});Object.defineProperty(V,"REGISTRY_KEY_SEPARATOR",{enumerable:!0,get:function(){return vr.REGISTRY_KEY_SEPARATOR}});Object.defineProperty(V,"getRegistryKey",{enumerable:!0,get:function(){return vr.getRegistryKey}});Object.defineProperty(V,"parseRegistryKey",{enumerable:!0,get:function(){return vr.parseRegistryKey}});Object.defineProperty(V,"isCompositeKey",{enumerable:!0,get:function(){return vr.isCompositeKey}});Object.defineProperty(V,"getModelByRegistryKey",{enumerable:!0,get:function(){return vr.getModelByRegistryKey}});Object.defineProperty(V,"getModel",{enumerable:!0,get:function(){return vr.getModel}});Object.defineProperty(V,"getModelsForProvider",{enumerable:!0,get:function(){return vr.getModelsForProvider}});Object.defineProperty(V,"getRecommendedModels",{enumerable:!0,get:function(){return vr.getRecommendedModels}});Object.defineProperty(V,"getModelsWithCapability",{enumerable:!0,get:function(){return vr.getModelsWithCapability}});Object.defineProperty(V,"getActiveModels",{enumerable:!0,get:function(){return vr.getActiveModels}});var bs=Id();Object.defineProperty(V,"AGENT_ENGINES",{enumerable:!0,get:function(){return bs.AGENT_ENGINES}});Object.defineProperty(V,"getAgentEngine",{enumerable:!0,get:function(){return bs.getAgentEngine}});Object.defineProperty(V,"getAllAgentEngines",{enumerable:!0,get:function(){return bs.getAllAgentEngines}});Object.defineProperty(V,"getAllAgentEngineIds",{enumerable:!0,get:function(){return bs.getAllAgentEngineIds}});Object.defineProperty(V,"getCompatibleProviders",{enumerable:!0,get:function(){return bs.getCompatibleProviders}});Object.defineProperty(V,"getEnginesCompatibleWithProvider",{enumerable:!0,get:function(){return bs.getEnginesCompatibleWithProvider}});Object.defineProperty(V,"isEngineCompatibleWithProvider",{enumerable:!0,get:function(){return bs.isEngineCompatibleWithProvider}});Object.defineProperty(V,"getEngineRulesFile",{enumerable:!0,get:function(){return bs.getEngineRulesFile}});Object.defineProperty(V,"getEngineWorkspaceDir",{enumerable:!0,get:function(){return bs.getEngineWorkspaceDir}});var jO=Pc(),Cc=Nc(),Rc=Id();function xO(t){let e=Cc.BUILTIN_MODELS.find(n=>n.id===t);return e?jO.PROVIDERS[e.provider]:void 0}function BO(t){let e=Cc.BUILTIN_MODELS.find(n=>n.id===t);if(e)return Object.values(Rc.AGENT_ENGINES).find(n=>(0,Rc.isEngineCompatibleWithProvider)(n.id,e.provider))}function FO(t){let e=Rc.AGENT_ENGINES[t];return e?Cc.BUILTIN_MODELS.filter(n=>(0,Rc.isEngineCompatibleWithProvider)(e.id,n.provider)):[]}function VO(t,e){return Cc.BUILTIN_MODELS.find(r=>r.id===t)?.provider===e}});var Uc=T(nr=>{"use strict";var KO=nr&&nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),WO=nr&&nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tm=nr&&nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KO(n,e,r[s]);return WO(n,e),n}})();Object.defineProperty(nr,"__esModule",{value:!0});nr.getDefaultCustomEnginesInstallRoot=Gc;nr.installCustomEngineFromFiles=sI;nr.listInstalledCustomEngines=iI;nr.uninstallCustomEngine=oI;var qO=require("child_process"),yt=require("fs"),YO=Tm(require("os")),je=Tm(require("path")),JO=require("util"),XO=ot(),Mc=dn(),zO=(0,JO.promisify)(qO.execFile),Dn="engine.manifest.json";function Gc(){return je.join(process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME||je.join(YO.homedir(),XO.AGENTIDE_DIR_NAME),"engines")}function bm(t){let e=t.replace(/\\/g,"/").trim().replace(/^\.\//,"");if(!e||e.includes("\0"))throw new Error(`Invalid engine package path: ${t}`);if(e.startsWith("/")||/^[A-Za-z]:/.test(e))throw new Error(`Engine package path must be relative: ${t}`);let n=e.split("/").filter(Boolean);if(n.length===0||n.some(r=>r==="."||r===".."))throw new Error(`Engine package path must not contain "." or "..": ${t}`);return n.join("/")}function $c(t,e){try{return bm(t).replace(/\//g,je.sep)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`${e}: ${r}`)}}function vi(t,e,n){let r=je.resolve(t),s=je.resolve(e),i=je.relative(r,s);if(i&&(i.startsWith("..")||je.isAbsolute(i)))throw new Error(`${n} must stay inside ${t}: ${e}`)}async function Dc(t){try{return await yt.promises.access(t),!0}catch{return!1}}function Pd(t,e){let n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${e} must be a JSON object`);return n}function Lc(t,e,n){let r=t[e];if(typeof r!="string"||r.trim().length===0)throw new Error(`${n} missing required string field "${e}"`);return r.trim()}function vm(t){let e=t.trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(e))throw new Error(`Custom engine id must contain only lowercase letters, numbers, ".", "_", or "-": ${t}`);return e}function QO(t,e){if(!t)return;if(typeof t!="object"||Array.isArray(t))throw new Error(`${e} workspaceSync must be an object`);let n=t;if(n.enabled!==!0)return;let r=Lc(n,"dir",`${e} workspaceSync`),s=Lc(n,"rulesFile",`${e} workspaceSync`);$c(r,"workspaceSync.dir"),$c(s,"workspaceSync.rulesFile")}async function ZO(t){let e=je.join(t,Dn),n;try{n=await yt.promises.readFile(e,"utf8")}catch{throw new Error(`Custom engine package is missing ${Dn}`)}let r=Pd(n,Dn),s=Lc(r,"id",Dn),i={version:r.version,id:s,displayName:typeof r.displayName=="string"&&r.displayName.trim()?r.displayName.trim():void 0,description:typeof r.description=="string"&&r.description.trim()?r.description.trim():void 0,entry:Lc(r,"entry",Dn),workspaceSync:r.workspaceSync};if(i.version!==2)throw new Error(`${Dn} must declare version 2`);if(i.id!==i.id.toLowerCase()||!/^[a-z0-9][a-z0-9._-]*$/.test(i.id))throw new Error(`${Dn} id must contain only lowercase letters, numbers, ".", "_", or "-"`);QO(i.workspaceSync,Dn);let o=$c(i.entry,"entry"),a=je.join(t,o);if(vi(t,a,"Engine entry"),!await Dc(a))throw new Error(`${Dn} entry not found: ${i.entry}`);return i}async function eI(t,e){let n=new Set;for(let r of e){let s=bm(r.path);if(n.has(s))throw new Error(`Duplicate engine package path: ${r.path}`);n.add(s);let i=je.join(t,...s.split("/"));vi(t,i,"Engine package file"),await yt.promises.mkdir(je.dirname(i),{recursive:!0}),await yt.promises.writeFile(i,r.content)}}async function Om(t,e,n){try{await zO(t,e,{cwd:n,maxBuffer:10*1024*1024,windowsHide:!0,shell:process.platform==="win32"&&/\.(?:cmd|bat)$/i.test(t)})}catch(r){let s=typeof r.stderr=="string"?r.stderr.trim():"",i=typeof r.stdout=="string"?r.stdout.trim():"",o=s||i||(r instanceof Error?r.message:String(r));throw new Error(`${t} ${e.join(" ")} failed: ${o}`)}}async function tI(t,e,n){let r=je.join(t,"package.json");if(!await Dc(r))return!1;let s=je.join(t,"package-lock.json");if(!await Dc(s))throw new Error("Custom engine packages with package.json must include package-lock.json");if(!e)return!1;let i=process.platform==="win32"?"npm.cmd":"npm";return n&&(0,Mc.logInfo)(n,"[Store] Running npm ci --omit=dev for custom engine"),await Om(i,["ci","--omit=dev"],t),!0}async function nI(t,e,n){let r=$c(e.entry,"entry"),s=je.join(t,r);return n&&(0,Mc.logInfo)(n,`[Store] Validating custom engine entry: ${e.entry}`),await Om("node",["--check",s],t),s}async function rI(t,e,n,r){await yt.promises.mkdir(e,{recursive:!0});let s=je.join(e,n);vi(e,s,"Custom engine install target");let i=await Dc(s);if(i&&!r)throw new Error(`Custom engine "${n}" already exists at ${s}`);if(!i)return await yt.promises.rename(t,s),s;let o=je.join(e,".tmp");await yt.promises.mkdir(o,{recursive:!0});let a=je.join(o,`${n}.previous-${Date.now()}`);vi(e,a,"Custom engine backup target"),await yt.promises.rm(a,{recursive:!0,force:!0}),await yt.promises.rename(s,a);try{return await yt.promises.rename(t,s),await yt.promises.rm(a,{recursive:!0,force:!0}),s}catch(c){throw await yt.promises.rm(s,{recursive:!0,force:!0}).catch(()=>{}),await yt.promises.rename(a,s).catch(()=>{}),c}}async function sI(t,e={}){if(t.length===0)throw new Error("Custom engine package is empty");let n=je.resolve(e.installRoot??Gc()),r=e.runNpmCi!==!1,s=e.overwrite!==!1,i=je.join(n,".tmp");await yt.promises.mkdir(i,{recursive:!0});let o=await yt.promises.mkdtemp(je.join(i,`${e.slug||"engine"}-`));vi(i,o,"Custom engine staging directory");let a=!0;try{await eI(o,t);let c=await ZO(o),l=await tI(o,r,e.logger),u=await nI(o,c,e.logger),d=await rI(o,n,c.id,s);a=!1;let f=je.join(d,je.relative(o,u)),p={id:c.id,displayName:c.displayName||c.id,version:c.version,manifestPath:je.join(d,Dn),installDir:d,entryPath:f,npmInstalled:l};if(e.logger){let g=e.sourceUrl?` from ${e.sourceUrl}`:"";(0,Mc.logInfo)(e.logger,`[Store] Installed custom engine ${p.id}${g} to ${d}`)}return p}finally{a&&await yt.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}async function iI(t={}){let e=je.resolve(t.installRoot??Gc()),n;try{n=await yt.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let s of n){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=je.join(e,s.name);vi(e,i,"Custom engine install target");let o=je.join(i,Dn),a=s.name,c=s.name;try{let l=Pd(await yt.promises.readFile(o,"utf8"),o);typeof l.id=="string"&&l.id.trim()&&(a=vm(l.id)),typeof l.displayName=="string"&&l.displayName.trim()?c=l.displayName.trim():c=a}catch{}r.push({id:a,displayName:c,manifestPath:o,installDir:i})}return r.sort((s,i)=>s.id.localeCompare(i.id))}async function oI(t,e={}){let n=vm(t),r=je.resolve(e.installRoot??Gc()),s=je.join(r,n);vi(r,s,"Custom engine uninstall target");let i;try{let o=await yt.promises.lstat(s);if(!o.isDirectory()||o.isSymbolicLink())throw new Error(`Custom engine install target is not a normal directory: ${s}`);try{let a=Pd(await yt.promises.readFile(je.join(s,Dn),"utf8"),Dn);i=typeof a.displayName=="string"&&a.displayName.trim()?a.displayName.trim():void 0}catch{}}catch(o){if(o?.code==="ENOENT")return{id:n,installDir:s,removed:!1};throw o}return await yt.promises.rm(s,{recursive:!0,force:!0}),e.logger&&(0,Mc.logInfo)(e.logger,`[Store] Uninstalled custom engine ${n} from ${s}`),{id:n,displayName:i,installDir:s,removed:!0}}});var Qs=T(Mn=>{"use strict";var aI=Mn&&Mn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),cI=Mn&&Mn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Nd=Mn&&Mn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&aI(n,e,r[s]);return cI(n,e),n}})();Object.defineProperty(Mn,"__esModule",{value:!0});Mn.parseCustomEngineSearchPath=xc;Mn.getCustomEngineSearchRoots=Rm;Mn.discoverCustomEngineManifests=Cm;Mn.resolveCustomEngineManifest=km;Mn.tryResolveCustomEngineManifest=mI;var Hc=Nd(require("fs")),lI=Nd(require("os")),Or=Nd(require("path")),jc=ot(),uI=Uc(),Im="engines",Pm="engine.manifest.json";function Nm(t){return t.trim().toLowerCase()}function Ln(t){return typeof t=="string"&&t.trim().length>0}function xc(t){return Array.isArray(t)?t.flatMap(e=>xc(e)):t?.trim()?t.split(Or.delimiter).map(e=>e.trim()).filter(Boolean):[]}function dI(t){let e=new Set,n=[];for(let r of t){let s=Or.resolve(r);e.has(s)||(e.add(s),n.push(s))}return n}function fI(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid model config in ${e}: expected object`);let n=t;if(!Ln(n.defaultModel))throw new Error(`Invalid model config in ${e}: "defaultModel" is required`);return{defaultModel:n.defaultModel.trim(),apiKeyEnvVar:Ln(n.apiKeyEnvVar)?n.apiKeyEnvVar.trim():void 0,baseUrlEnvVar:Ln(n.baseUrlEnvVar)?n.baseUrlEnvVar.trim():void 0,openaiBaseUrlEnvVar:Ln(n.openaiBaseUrlEnvVar)?n.openaiBaseUrlEnvVar.trim():void 0}}function pI(t,e){if(!t)return{mode:"env-only"};if(typeof t!="object")throw new Error(`Invalid promptInjection config in ${e}: expected object`);let n=t,s=Ln(n.mode)?n.mode.trim():"env-only";if(s!=="none"&&s!=="env-only"&&s!=="message-suffix")throw new Error(`Invalid promptInjection config in ${e}: "mode" must be none, env-only, or message-suffix`);return{mode:s}}function gI(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid workspaceSync config in ${e}: expected object`);let n=t;if(!(n.enabled===!0))return{enabled:!1,dir:"",rulesFile:"",includeSkills:!1,includeRules:!1};if(!Ln(n.dir))throw new Error(`Invalid workspaceSync config in ${e}: "dir" is required when enabled`);if(!Ln(n.rulesFile))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" is required when enabled`);let s=n.dir.trim();if(Or.isAbsolute(s)||s.includes(".."))throw new Error(`Invalid workspaceSync config in ${e}: "dir" must be a relative workspace directory`);let i=n.rulesFile.trim();if(Or.isAbsolute(i)||i.includes(".."))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" must be a relative path`);return{enabled:!0,dir:s,rulesFile:i,includeSkills:n.includeSkills!==!1,includeRules:n.includeRules!==!1}}function hI(t,e){let n=Hc.readFileSync(t,"utf8"),r=JSON.parse(n);if(!Ln(r.id))throw new Error(`Invalid custom engine manifest ${t}: "id" is required`);if(r.version!==2)throw new Error(`Invalid custom engine manifest ${t}: "version" must be 2`);if(!Ln(r.entry))throw new Error(`Invalid custom engine manifest ${t}: "entry" is required`);let s=Nm(r.id),i=Or.dirname(t),o=r.entry.trim(),a=Or.isAbsolute(o)?o:Or.resolve(i,o);return{version:2,id:s,displayName:Ln(r.displayName)?r.displayName.trim():void 0,description:Ln(r.description)?r.description.trim():void 0,entry:o,entryPath:a,engineExport:Ln(r.engineExport)?r.engineExport.trim():void 0,homeEnvVar:Ln(r.homeEnvVar)?r.homeEnvVar.trim():void 0,workspaceSync:gI(r.workspaceSync,t),promptInjection:pI(r.promptInjection,t),model:fI(r.model,t),manifestPath:t,manifestDir:i,searchRoot:e}}function Rm(t,e){let n=t?Or.resolve(t):void 0,r=xc(e),s=xc(process.env.AGENTHIPPO_CUSTOM_ENGINES_DIR??process.env.AGENTIDE_CUSTOM_ENGINES_DIR);return dI([...n?[Or.join(n,jc.AGENTIDE_DIR_NAME,Im)]:[],...r,...s,(0,uI.getDefaultCustomEnginesInstallRoot)(),Or.join(lI.homedir(),jc.AGENTIDE_DIR_NAME,Im)])}function Cm(t,e,n){let r=[],s=new Set;for(let i of Rm(t,e)){if(!Hc.existsSync(i))continue;let o;try{o=Hc.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory())continue;let c=Or.join(i,a.name,Pm);if(!Hc.existsSync(c))continue;let l;try{l=hI(c,i)}catch(u){n?.(c,u);continue}s.has(l.id)||(s.add(l.id),r.push(l))}}return r}function km(t,e,n,r){let s=Cm(t,n,r),i=e?Nm(e):void 0;if(i){let o=s.find(a=>a.id===i);if(!o){let a=s.map(c=>c.id).sort();throw new Error(a.length>0?`Custom engine "${i}" not found. Available: ${a.join(", ")}`:`Custom engine "${i}" not found. No manifests discovered under ${jc.AGENTIDE_DIR_NAME}/engines.`)}return o}if(s.length===0)throw new Error(`No custom engines found. Add ${Pm} under ${jc.AGENTIDE_DIR_NAME}/engines/<engine-id>/`);if(s.length>1){let o=s.map(a=>a.id).sort();throw new Error(`Multiple custom engines found (${o.join(", ")}). Specify one with --engine <id>.`)}return s[0]}function mI(t,e,n,r){try{return km(t,e,n,r)}catch{return}}});var dn=T((exports,module)=>{"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),__importStar=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&__createBinding(n,e,r[s]);return __setModuleDefault(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.getAnalyticsScriptsDir=void 0;exports.logInfo=logInfo;exports.getErrorCode=getErrorCode;exports.pathExists=pathExists;exports.isDirOrSymlink=isDirOrSymlink;exports.ensureRealDirectory=ensureRealDirectory;exports.writeFileIfChanged=writeFileIfChanged;exports.copyDirRecursive=copyDirRecursive;exports.copyDirRecursiveWithTransform=copyDirRecursiveWithTransform;exports.symlinkOrCopyFile=symlinkOrCopyFile;exports.syncDirByFileLinks=syncDirByFileLinks;exports.ensureWorkspaceGitAndGitignore=ensureWorkspaceGitAndGitignore;exports.readFileSha256=readFileSha256;exports.getFileStats=getFileStats;exports.isCachedHashValid=isCachedHashValid;exports.shortSig=shortSig;exports.isLocalHttps=isLocalHttps;exports.applyLocalTlsBypass=applyLocalTlsBypass;exports.getOverrideOpenAIBaseUrl=getOverrideOpenAIBaseUrl;exports.inferModelProvider=inferModelProvider;exports.resolveApiRouting=resolveApiRouting;exports.getExplicitConfigValue=getExplicitConfigValue;exports.getAgentideEngineSettings=getAgentideEngineSettings;exports.emitStreamEvent=emitStreamEvent;exports.createIPCStreamEmitter=createIPCStreamEmitter;exports.computeTextDelta=computeTextDelta;exports.createDeferred=createDeferred;exports.stableAdditionalDirs=stableAdditionalDirs;exports.extractFilePaths=extractFilePaths;exports.isCreateCommand=isCreateCommand;exports.normalizeFileChangeKind=normalizeFileChangeKind;exports.isBinaryFile=isBinaryFile;var fs_1=require("fs"),child_process_1=require("child_process"),promises_1=require("stream/promises"),util_1=require("util"),path=__importStar(require("path")),crypto=__importStar(require("crypto")),shared_1=kc(),branding_1=ot(),customRegistry_1=Qs(),execFileAsync=(0,util_1.promisify)(child_process_1.execFile),_vscode;function getVscode(){if(!_vscode)try{_vscode=eval("require")("vscode")}catch{throw new Error("vscode module not available. Use ConfigProvider instead of vscode.workspace.getConfiguration")}return _vscode}function logInfo(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}function getErrorCode(t){return t&&typeof t=="object"?t.code:void 0}async function pathExists(t){try{return await fs_1.promises.lstat(t),!0}catch(e){if(getErrorCode(e)==="ENOENT")return!1;throw e}}async function isDirOrSymlink(t){try{let e=await fs_1.promises.lstat(t);return e.isDirectory()||e.isSymbolicLink()}catch(e){if(getErrorCode(e)==="ENOENT")return!1;throw e}}async function ensureRealDirectory(t){try{let e=await fs_1.promises.lstat(t);(e.isSymbolicLink()||!e.isDirectory())&&(await fs_1.promises.rm(t,{recursive:!0,force:!0}),await fs_1.promises.mkdir(t,{recursive:!0}))}catch(e){if(getErrorCode(e)==="ENOENT"){await fs_1.promises.mkdir(t,{recursive:!0});return}throw e}}async function writeFileIfChanged(t,e){try{if(await fs_1.promises.readFile(t,"utf8")===e)return!1}catch(n){if(getErrorCode(n)!=="ENOENT")throw n}return await fs_1.promises.mkdir(path.dirname(t),{recursive:!0}),await fs_1.promises.writeFile(t,e,"utf8"),!0}async function copyDirRecursive(t,e){await fs_1.promises.mkdir(e,{recursive:!0});let n=await fs_1.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=path.join(t,r.name),i=path.join(e,r.name);if(r.isDirectory())await copyDirRecursive(s,i);else if(r.isFile())await fs_1.promises.copyFile(s,i);else if(r.isSymbolicLink()){let o=await fs_1.promises.readlink(s),a=path.isAbsolute(o)?o:path.resolve(path.dirname(s),o);(await fs_1.promises.stat(a)).isDirectory()?await copyDirRecursive(a,i):await fs_1.promises.copyFile(a,i)}}}async function copyDirRecursiveWithTransform(t,e,n){await fs_1.promises.mkdir(e,{recursive:!0});let r=await fs_1.promises.readdir(t,{withFileTypes:!0});for(let s of r){let i=path.join(t,s.name),o=path.join(e,s.name);if(s.isDirectory())await copyDirRecursiveWithTransform(i,o,n);else if(s.isFile())if(s.name.toLowerCase().endsWith(".md")){let c=await fs_1.promises.readFile(i,"utf8");await fs_1.promises.writeFile(o,n(c),"utf8")}else await fs_1.promises.copyFile(i,o);else if(s.isSymbolicLink()){let a=await fs_1.promises.readlink(i),c=path.isAbsolute(a)?a:path.resolve(path.dirname(i),a);if((await fs_1.promises.stat(c)).isDirectory())await copyDirRecursiveWithTransform(c,o,n);else if(s.name.toLowerCase().endsWith(".md")){let d=await fs_1.promises.readFile(c,"utf8");await fs_1.promises.writeFile(o,n(d),"utf8")}else await fs_1.promises.copyFile(c,o)}}}async function symlinkOrCopyFile(t,e,n,r,s){let i=s?.force??!1;try{if((await fs_1.promises.lstat(e)).isSymbolicLink()){try{let a=await fs_1.promises.readlink(e),c=path.isAbsolute(a)?a:path.resolve(path.dirname(e),a);if(path.resolve(c)===path.resolve(t))return}catch{}await fs_1.promises.unlink(e)}else if(i)await fs_1.promises.rm(e,{recursive:!0,force:!0});else return}catch(o){if(getErrorCode(o)!=="ENOENT")throw o}if(await fs_1.promises.mkdir(path.dirname(e),{recursive:!0}),path.resolve(t)!==path.resolve(e))try{await fs_1.promises.symlink(t,e,"file"),logInfo(n,`[AgentIDE] Linked ${r} (symlink): ${e} -> ${t}`)}catch{await fs_1.promises.copyFile(t,e),logInfo(n,`[AgentIDE] Linked ${r} (copy fallback): ${e}`)}}async function syncDirByFileLinks(t,e,n,r){await ensureRealDirectory(e);let s=new Set,i=new Map,o=async(d,f)=>{let p;try{p=await fs_1.promises.readdir(d,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let _=path.join(d,g.name),h=f?path.join(f,g.name):g.name;if(g.isDirectory())s.add(h),await o(_,h);else if(g.isFile())i.set(h,_);else if(g.isSymbolicLink())try{let y=await fs_1.promises.readlink(_),E=path.isAbsolute(y)?y:path.resolve(path.dirname(_),y);(await fs_1.promises.stat(E)).isDirectory()?(s.add(h),await o(E,h)):i.set(h,E)}catch(y){let E=getErrorCode(y);if(E==="ENOENT"||E==="ELOOP")continue;throw y}}};await o(t,"");let a=Array.from(s).sort((d,f)=>d.split(path.sep).length-f.split(path.sep).length);for(let d of a)await ensureRealDirectory(path.join(e,d));for(let[d,f]of i.entries())await symlinkOrCopyFile(f,path.join(e,d),n,`${r}/${d}`.replace(/\\/g,"/"),{force:!0});let c=new Set(i.keys()),l=async(d,f)=>{let p;try{p=await fs_1.promises.readdir(d,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let _=path.join(d,g.name),h=f?path.join(f,g.name):g.name,y=path.join(t,h);if(g.isDirectory())await l(_,h);else if(g.isFile()&&!g.isSymbolicLink()&&!c.has(h))try{await fs_1.promises.mkdir(path.dirname(y),{recursive:!0}),await fs_1.promises.copyFile(_,y),logInfo(n,`[AgentIDE] Copied new file to source: ${r}/${h}`.replace(/\\/g,"/")),i.set(h,y)}catch(E){logInfo(n,`[AgentIDE] Warning: failed to copy back ${h}: ${E instanceof Error?E.message:String(E)}`)}}};await l(e,"");for(let[d,f]of i.entries()){let p=path.join(e,d);try{let g=await fs_1.promises.lstat(p);g.isFile()&&!g.isSymbolicLink()&&(await fs_1.promises.rm(p,{force:!0}),await symlinkOrCopyFile(f,p,n,`${r}/${d}`.replace(/\\/g,"/"),{force:!0}))}catch{}}let u=async(d,f)=>{let p;try{p=await fs_1.promises.readdir(d,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let _=path.join(d,g.name),h=f?path.join(f,g.name):g.name;g.isDirectory()?await u(_,h):g.isSymbolicLink()&&(c.has(h)||await fs_1.promises.rm(_,{force:!0}))}};await u(e,"")}function getManagedWorkspaceDirs(t,e){let n=Object.values(shared_1.AGENT_ENGINES).map(s=>s.workspaceDir),r=(0,customRegistry_1.discoverCustomEngineManifests)(t,e).filter(s=>s.workspaceSync?.enabled).map(s=>s.workspaceSync.dir);return[...new Set([...n,...r])]}async function ensureWorkspaceGitAndGitignore(t,e,n){let r=path.join(t,".git");if(!await pathExists(r))try{await execFileAsync("git",["init"],{cwd:t}),logInfo(e,`[AgentIDE] Initialized git repository in ${t}`)}catch(_){logInfo(e,`[AgentIDE] Note: Could not initialize git in ${t}: ${_ instanceof Error?_.message:String(_)}`)}let i=path.join(t,".gitignore"),o=getManagedWorkspaceDirs(t,n?.extraSearchPath),a=[`# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,`# These directories are managed by ${branding_1.AGENTIDE_BRAND_NAME} and should not be committed.`,...o],c="";try{c=await fs_1.promises.readFile(i,"utf8")}catch(_){if(getErrorCode(_)!=="ENOENT"){logInfo(e,`[AgentIDE] Warning: failed to read root .gitignore: ${_ instanceof Error?_.message:String(_)}`);return}}let l=c.split(`
32
- `).map(_=>_.trim());if(o.filter(_=>!l.includes(_)).length===0)return;let d=`# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,f="# AgentIDE (managed)",p=c.includes(d)||c.includes(f),g;if(p){let _=c.split(`
33
- `),h=[],y=!1;for(let E of _){if(E.trim()===d||E.trim()===f){y=!0,h.push(...a);continue}if(y){if(E.trim().startsWith("#")||o.includes(E.trim())||E.trim()==="")continue;y=!1}h.push(E)}g=h.join(`
31
+ \u26A0\uFE0F Tool permission requested: ${s}`),r.question("Allow? (y/n): ",i=>{r.close();let o=i.toLowerCase().startsWith("y");n(o?{behavior:"allow"}:{behavior:"deny",message:"User denied permission"})})})}};zs.CLIPermissionHandler=_d});var gm=T(bc=>{"use strict";Object.defineProperty(bc,"__esModule",{value:!0});bc.NoOpEditTracker=void 0;var Ed=class{appliesEdits=!1;async startTracking(e,n){}async stopTracking(e,n){}async applyEdit(e,n,r,s){}};bc.NoOpEditTracker=Ed});var hm=T(An=>{"use strict";var zv=An&&An.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Qv=An&&An.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Zv=An&&An.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&zv(n,e,r[s]);return Qv(n,e),n}})();Object.defineProperty(An,"__esModule",{value:!0});An.DirectorySessionStore=An.FileSessionStore=An.MemorySessionStore=void 0;var un=require("fs"),vc=Zv(require("path")),eO=require("crypto"),yd=class{store=new Map;get(e){return this.store.get(e)}async set(e,n){this.store.set(e,n)}clear(){this.store.clear()}};An.MemorySessionStore=yd;var wd=class{store={};loaded=!1;filePath;constructor(e){this.filePath=e}async load(){if(!this.loaded){try{let e=await un.promises.readFile(this.filePath,"utf-8");this.store=JSON.parse(e)}catch(e){e.code!=="ENOENT"&&console.warn(`[FileSessionStore] Failed to load ${this.filePath}: ${e}`),this.store={}}this.loaded=!0}}get(e){return this.loaded||this.loadSync(),this.store[e]}async set(e,n){this.store[e]=n,await this.flush()}async clear(){this.store={},await this.flush()}async flush(){let e=vc.dirname(this.filePath);await un.promises.mkdir(e,{recursive:!0});let n=`${this.filePath}.tmp.${Date.now()}`,r=JSON.stringify(this.store,null,2);try{await un.promises.writeFile(n,r,"utf-8"),await un.promises.rename(n,this.filePath)}catch(s){try{await un.promises.unlink(n)}catch{}throw s}}loadSync(){if(!this.loaded){try{let e=(0,un.readFileSync)(this.filePath,"utf-8");this.store=JSON.parse(e)}catch(e){e.code!=="ENOENT"&&console.warn(`[FileSessionStore] Failed to load ${this.filePath}: ${e}`),this.store={}}this.loaded=!0}}};An.FileSessionStore=wd;var Sd=class{dir;entries={};serialized=new Map;files=new Map;loaded=!1;constructor(e){this.dir=e}get(e){return this.loaded||this.loadSync(),this.entries}async set(e,n){this.loaded||this.loadSync();let r=n&&typeof n=="object"?n:{};await un.promises.mkdir(this.dir,{recursive:!0});for(let[s,i]of Object.entries(r)){let o=JSON.stringify(i);if(this.serialized.get(s)===o)continue;let a=this.files.get(s)??`${this.fileNameFor(s)}.json`;await this.writeAtomic(a,JSON.stringify({key:s,value:i},null,2)),this.files.set(s,a),this.serialized.set(s,o)}for(let s of[...this.serialized.keys()]){if(Object.prototype.hasOwnProperty.call(r,s))continue;let i=this.files.get(s);if(i)try{await un.promises.unlink(vc.join(this.dir,i))}catch{}this.files.delete(s),this.serialized.delete(s)}this.entries={...r}}fileNameFor(e){return(0,eO.createHash)("sha256").update(e).digest("hex").slice(0,40)}async writeAtomic(e,n){let r=vc.join(this.dir,e),s=`${r}.tmp.${process.pid}.${Date.now()}`;try{await un.promises.writeFile(s,n,"utf-8"),await un.promises.rename(s,r)}catch(i){try{await un.promises.unlink(s)}catch{}throw i}}loadSync(){if(this.loaded)return;this.loaded=!0,this.migrateLegacySingleFileSync();let e;try{e=(0,un.readdirSync)(this.dir).filter(n=>n.endsWith(".json"))}catch(n){n.code!=="ENOENT"&&console.warn(`[DirectorySessionStore] Failed to list ${this.dir}: ${n}`);return}for(let n of e)try{let r=(0,un.readFileSync)(vc.join(this.dir,n),"utf-8"),s=JSON.parse(r);s&&typeof s.key=="string"&&(this.entries[s.key]=s.value,this.serialized.set(s.key,JSON.stringify(s.value)),this.files.set(s.key,n))}catch(r){console.warn(`[DirectorySessionStore] Skipping unreadable ${n}: ${r}`)}}migrateLegacySingleFileSync(){let e=!0;try{(0,un.readdirSync)(this.dir)}catch{e=!1}if(e)return;let n=`${this.dir}.json`,r;try{r=JSON.parse((0,un.readFileSync)(n,"utf-8"))}catch{return}for(let s of Object.values(r))if(s&&typeof s=="object")for(let[i,o]of Object.entries(s))this.entries[i]=o}};An.DirectorySessionStore=Sd});var mm=T(Oc=>{"use strict";Object.defineProperty(Oc,"__esModule",{value:!0});Oc.StaticConfigProvider=void 0;var Ad=class{config;customProviders;engineSettings;constructor(e={},n={},r={}){this.config=e,this.customProviders=n,this.engineSettings=r}get(e,n,r){let s=`${e}.${n}`,i=this.config[s];return i!==void 0?i:r}getCustomProviders(){return this.customProviders}getEngineSettings(){return this.engineSettings}};Oc.StaticConfigProvider=Ad});var Ic=T(pt=>{"use strict";Object.defineProperty(pt,"__esModule",{value:!0});pt.StaticConfigProvider=pt.DirectorySessionStore=pt.FileSessionStore=pt.MemorySessionStore=pt.NoOpEditTracker=pt.CLIPermissionHandler=pt.AutoDenyPermissionHandler=pt.AutoApprovePermissionHandler=pt.NoOpLogger=pt.ConsoleLogger=void 0;var _m=fm();Object.defineProperty(pt,"ConsoleLogger",{enumerable:!0,get:function(){return _m.ConsoleLogger}});Object.defineProperty(pt,"NoOpLogger",{enumerable:!0,get:function(){return _m.NoOpLogger}});var Td=pm();Object.defineProperty(pt,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return Td.AutoApprovePermissionHandler}});Object.defineProperty(pt,"AutoDenyPermissionHandler",{enumerable:!0,get:function(){return Td.AutoDenyPermissionHandler}});Object.defineProperty(pt,"CLIPermissionHandler",{enumerable:!0,get:function(){return Td.CLIPermissionHandler}});var tO=gm();Object.defineProperty(pt,"NoOpEditTracker",{enumerable:!0,get:function(){return tO.NoOpEditTracker}});var bd=hm();Object.defineProperty(pt,"MemorySessionStore",{enumerable:!0,get:function(){return bd.MemorySessionStore}});Object.defineProperty(pt,"FileSessionStore",{enumerable:!0,get:function(){return bd.FileSessionStore}});Object.defineProperty(pt,"DirectorySessionStore",{enumerable:!0,get:function(){return bd.DirectorySessionStore}});var nO=mm();Object.defineProperty(pt,"StaticConfigProvider",{enumerable:!0,get:function(){return nO.StaticConfigProvider}})});var So=T(It=>{"use strict";Object.defineProperty(It,"__esModule",{value:!0});It.RAW_IDS_ENV=It.ID_SALT_ENV=It.CONTENT_CAPTURE_ENV=void 0;It.isContentCaptureEnabled=wm;It.resetPrivacyAnnouncementsForTest=iO;It.hashIdentity=aO;It.digestContent=Sm;It.describeContent=cO;var Em=require("crypto");It.CONTENT_CAPTURE_ENV="AGENTHIPPO_EVIDENCE_CONTENT_CAPTURE";It.ID_SALT_ENV="AGENTHIPPO_EVIDENCE_ID_SALT";It.RAW_IDS_ENV="AGENTHIPPO_EVIDENCE_RAW_IDS";var rO="agenthippo-evidence-unsalted",sO=new Set(["1","true","yes","on"]);function ym(t){return sO.has((t??"").trim().toLowerCase())}var vd=!1,Od=!1;function wm(t=process.env){let e=ym(t[It.CONTENT_CAPTURE_ENV]);return vd||(vd=!0,console.warn(e?`[evidence] CONTENT CAPTURE IS ON \u2014 prompts, completions and tool I/O are recorded in evidence (${It.CONTENT_CAPTURE_ENV} is set). Unset it for metadata-only evidence.`:`[evidence] content capture off \u2014 tool I/O is recorded as sha256 + length only. Set ${It.CONTENT_CAPTURE_ENV}=1 to restore full previews.`)),e}function iO(){vd=!1,Od=!1}function oO(t){let e=t[It.ID_SALT_ENV]?.trim();return e||(Od||(Od=!0,console.warn(`[evidence] ${It.ID_SALT_ENV} is not set \u2014 identity hashes use a public constant salt. They pseudonymise, but a known address can still be confirmed by hashing it. Set the same secret on every instance whose evidence is joined.`)),rO)}function aO(t,e=process.env){let n=t?.trim();return n?ym(e[It.RAW_IDS_ENV])?n:`anon_${(0,Em.createHash)("sha256").update(`${oO(e)}\0${n}`).digest("hex").slice(0,32)}`:void 0}function Sm(t){return{sha256:(0,Em.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function cO(t,e,n=500,r=process.env){if(e===void 0)return{};let s=Sm(e),i={[`${t}_sha256`]:s.sha256,[`${t}_length`]:s.length};return wm(r)&&(i[`${t}Preview`]=e.slice(0,n)),i}});var Pc=T(ke=>{"use strict";Object.defineProperty(ke,"__esModule",{value:!0});ke.ANTHROPIC_SETUP_TOKEN_PREFIX=ke.PROVIDERS=void 0;ke.getProvider=lO;ke.requiresApiKey=uO;ke.isLocalProvider=dO;ke.getAllProviderIds=fO;ke.getCloudProviders=pO;ke.getLocalProviders=gO;ke.getApiKeyProviders=hO;ke.requiresBaseUrl=mO;ke.getGatewayProviders=_O;ke.isGatewayProvider=EO;ke.isAnthropicProviderFamily=yO;ke.normalizeAnthropicSetupToken=wO;ke.isAnthropicSetupToken=SO;ke.providerNotSupportAnthropicApi=AO;ke.PROVIDERS={openai:{id:"openai",displayName:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",requiresApiKey:!0,showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},"openai-codex":{id:"openai-codex",displayName:"OpenAI (ChatGPT subscription)",defaultEndpoint:"https://chatgpt.com/backend-api/codex",requiresApiKey:!0,description:"Use your ChatGPT/Codex subscription via native OAuth",showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},anthropic:{id:"anthropic",displayName:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},showInAddApiKeyUI:!0},"anthropic-setup-token":{id:"anthropic-setup-token",displayName:"Anthropic (Claude Subscription)",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},description:'Use Claude subscription setup-token from "claude setup-token"',showInAddApiKeyUI:!0},openrouter:{id:"openrouter",displayName:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",requiresApiKey:!0,description:"Fast model proxy via openrouter.ai that works with all agents",showInAddApiKeyUI:!0,isGateway:!0},litellm:{id:"litellm",displayName:"LiteLLM",endpointSettingKey:"agentide.providers.litellm.baseUrl",requiresApiKey:!0,description:"local adapter for agents to work with Spotlight and all models from OpenAI, Anthropic, Ollama etc.",showInAddApiKeyUI:!0,isGateway:!0,deferMissingApiKey:!0},ollama:{id:"ollama",displayName:"Ollama",defaultEndpoint:"http://localhost:11434/v1",requiresApiKey:!1,enabledSettingKey:"agentide.local.ollama.enabled",defaultEnabled:!0,placeholderApiKey:"ollama",description:"Local LLM server",showInAddApiKeyUI:!1,notSupportAnthropicApi:!0},agenthippo:{id:"agenthippo",displayName:"AgentHippo Gateway",defaultEndpoint:"https://gateway.agenthippo.ai/v1",endpointSettingKey:"agentide.AgentHippoModelGateway.url",requiresApiKey:!0,description:"AgentHippo managed gateway \u2014 uses account JWT, picks model automatically",showInAddApiKeyUI:!1,isGateway:!0,staticHeaders:{"x-agenthippo-source":"chat-ui"},credentialRefreshCommand:"agentide.auth.refreshToken",deferMissingApiKey:!0}};function lO(t){return ke.PROVIDERS[t]}function uO(t){return ke.PROVIDERS[t]?.requiresApiKey??!0}function dO(t){let e=ke.PROVIDERS[t];return e?!e.requiresApiKey:!1}function fO(){return Object.keys(ke.PROVIDERS)}function pO(){return Object.values(ke.PROVIDERS).filter(t=>t.requiresApiKey)}function gO(){return Object.values(ke.PROVIDERS).filter(t=>!t.requiresApiKey)}function hO(){return Object.values(ke.PROVIDERS).filter(t=>t.showInAddApiKeyUI===!0)}function mO(t){let e=ke.PROVIDERS[t];return e?!!e.endpointSettingKey&&!e.defaultEndpoint:!1}function _O(){return Object.values(ke.PROVIDERS).filter(t=>t.isGateway)}function EO(t){return ke.PROVIDERS[t]?.isGateway??!1}function yO(t){return t==="anthropic"||t==="anthropic-setup-token"}ke.ANTHROPIC_SETUP_TOKEN_PREFIX="sk-ant-oat01-";function wO(t){return t.replace(/\s+/g,"").trim()}function SO(t){return typeof t=="string"&&t.trim().startsWith(ke.ANTHROPIC_SETUP_TOKEN_PREFIX)}function AO(t,e){let n=ke.PROVIDERS[t];return n?n.notSupportAnthropicApi??!1:e?.[t]?.notSupportAnthropicApi===!0}});var Nc=T(qe=>{"use strict";Object.defineProperty(qe,"__esModule",{value:!0});qe.REGISTRY_KEY_SEPARATOR=qe.BUILTIN_MODELS=void 0;qe.getRegistryKey=Am;qe.parseRegistryKey=TO;qe.isCompositeKey=bO;qe.getModel=vO;qe.getModelByRegistryKey=OO;qe.getModelsForProvider=IO;qe.getRecommendedModels=PO;qe.getModelsWithCapability=NO;qe.getActiveModels=RO;qe.resolveModelAlias=CO;qe.BUILTIN_MODELS=[{id:"ah-auto",name:"Auto",provider:"agenthippo",contextWindow:2e5,maxOutputTokens:8192,capabilities:["chat","vision","function-calling","code"],description:"Managed gateway \u2014 routed through AgentHippo using your account, not your own API keys",recommended:!0}];qe.REGISTRY_KEY_SEPARATOR="::";function Am(t,e){return`${t}${qe.REGISTRY_KEY_SEPARATOR}${e}`}function TO(t){let e=t.indexOf(qe.REGISTRY_KEY_SEPARATOR);if(e!==-1)return{providerId:t.substring(0,e),modelId:t.substring(e+qe.REGISTRY_KEY_SEPARATOR.length)}}function bO(t){return t.includes(qe.REGISTRY_KEY_SEPARATOR)}function vO(t){return qe.BUILTIN_MODELS.find(e=>e.id===t)}function OO(t){return qe.BUILTIN_MODELS.find(e=>Am(e.provider,e.id)===t)}function IO(t){return qe.BUILTIN_MODELS.filter(e=>e.provider===t)}function PO(){return qe.BUILTIN_MODELS.filter(t=>t.recommended===!0)}function NO(t){return qe.BUILTIN_MODELS.filter(e=>e.capabilities.includes(t))}function RO(){return qe.BUILTIN_MODELS.filter(t=>!t.deprecated)}function CO(t){if(!t)return t;let e=t.toLowerCase().trim();return qe.BUILTIN_MODELS.find(r=>r.id.toLowerCase()===e)?.id??t}});var Id=T(Et=>{"use strict";Object.defineProperty(Et,"__esModule",{value:!0});Et.AGENT_ENGINES=void 0;Et.getAgentEngine=kO;Et.getAllAgentEngines=$O;Et.getAllAgentEngineIds=DO;Et.getCompatibleProviders=LO;Et.getEnginesCompatibleWithProvider=MO;Et.isEngineCompatibleWithProvider=GO;Et.getEngineRulesFile=UO;Et.getEngineWorkspaceDir=HO;var Ts=Pc();Et.AGENT_ENGINES={codex:{id:"codex",displayName:"Codex",description:"OpenAI Codex - code generation agent",icon:"sparkle",nativeProvider:"openai",workspaceDir:".codex",rulesFile:"AGENTS.md",configEnvVar:"CODEX_HOME",managedPaths:["skills","config.toml","agentide.runtime.md"]},claude:{id:"claude",displayName:"Claude",description:"Anthropic Claude - agentic coding assistant",icon:"beaker",nativeProvider:"anthropic",workspaceDir:".claude",rulesFile:"CLAUDE.md",configEnvVar:"CLAUDE_CONFIG_DIR"}};function kO(t){return Et.AGENT_ENGINES[t]}function $O(){return Object.values(Et.AGENT_ENGINES)}function DO(){return Object.keys(Et.AGENT_ENGINES)}function LO(t){let e=Et.AGENT_ENGINES[t];if(!e)return[];let n=[e.nativeProvider];for(let[r,s]of Object.entries(Ts.PROVIDERS))if(!n.includes(r)){if(s.isGateway){n.push(r);continue}e.nativeProvider==="openai"&&!(0,Ts.isAnthropicProviderFamily)(r)&&n.push(r),e.nativeProvider==="anthropic"&&(0,Ts.isAnthropicProviderFamily)(r)&&n.push(r)}return n}function MO(t){let e=Ts.PROVIDERS[t];return e?e.isGateway?Object.values(Et.AGENT_ENGINES):Object.values(Et.AGENT_ENGINES).filter(n=>!!(n.nativeProvider===t||n.nativeProvider==="openai"&&!(0,Ts.isAnthropicProviderFamily)(t)||n.nativeProvider==="anthropic"&&(0,Ts.isAnthropicProviderFamily)(t))):[]}function GO(t,e){let n=Et.AGENT_ENGINES[t];return n?!!(n.nativeProvider===e||(0,Ts.isGatewayProvider)(e)||n.nativeProvider==="openai"&&!(0,Ts.isAnthropicProviderFamily)(e)||n.nativeProvider==="anthropic"&&(0,Ts.isAnthropicProviderFamily)(e)):!1}function UO(t){return Et.AGENT_ENGINES[t]?.rulesFile}function HO(t){return Et.AGENT_ENGINES[t]?.workspaceDir}});var kc=T(V=>{"use strict";Object.defineProperty(V,"__esModule",{value:!0});V.getEngineWorkspaceDir=V.getEngineRulesFile=V.isEngineCompatibleWithProvider=V.getEnginesCompatibleWithProvider=V.getCompatibleProviders=V.getAllAgentEngineIds=V.getAllAgentEngines=V.getAgentEngine=V.AGENT_ENGINES=V.getActiveModels=V.getModelsWithCapability=V.getRecommendedModels=V.getModelsForProvider=V.getModel=V.getModelByRegistryKey=V.isCompositeKey=V.parseRegistryKey=V.getRegistryKey=V.REGISTRY_KEY_SEPARATOR=V.BUILTIN_MODELS=V.providerNotSupportAnthropicApi=V.isAnthropicSetupToken=V.normalizeAnthropicSetupToken=V.ANTHROPIC_SETUP_TOKEN_PREFIX=V.isAnthropicProviderFamily=V.requiresBaseUrl=V.getApiKeyProviders=V.getLocalProviders=V.getCloudProviders=V.getAllProviderIds=V.isLocalProvider=V.requiresApiKey=V.getProvider=V.PROVIDERS=void 0;V.getProviderForModel=xO;V.getEngineForModel=BO;V.getModelsForEngine=FO;V.isModelFromProvider=VO;var Tn=Pc();Object.defineProperty(V,"PROVIDERS",{enumerable:!0,get:function(){return Tn.PROVIDERS}});Object.defineProperty(V,"getProvider",{enumerable:!0,get:function(){return Tn.getProvider}});Object.defineProperty(V,"requiresApiKey",{enumerable:!0,get:function(){return Tn.requiresApiKey}});Object.defineProperty(V,"isLocalProvider",{enumerable:!0,get:function(){return Tn.isLocalProvider}});Object.defineProperty(V,"getAllProviderIds",{enumerable:!0,get:function(){return Tn.getAllProviderIds}});Object.defineProperty(V,"getCloudProviders",{enumerable:!0,get:function(){return Tn.getCloudProviders}});Object.defineProperty(V,"getLocalProviders",{enumerable:!0,get:function(){return Tn.getLocalProviders}});Object.defineProperty(V,"getApiKeyProviders",{enumerable:!0,get:function(){return Tn.getApiKeyProviders}});Object.defineProperty(V,"requiresBaseUrl",{enumerable:!0,get:function(){return Tn.requiresBaseUrl}});Object.defineProperty(V,"isAnthropicProviderFamily",{enumerable:!0,get:function(){return Tn.isAnthropicProviderFamily}});Object.defineProperty(V,"ANTHROPIC_SETUP_TOKEN_PREFIX",{enumerable:!0,get:function(){return Tn.ANTHROPIC_SETUP_TOKEN_PREFIX}});Object.defineProperty(V,"normalizeAnthropicSetupToken",{enumerable:!0,get:function(){return Tn.normalizeAnthropicSetupToken}});Object.defineProperty(V,"isAnthropicSetupToken",{enumerable:!0,get:function(){return Tn.isAnthropicSetupToken}});Object.defineProperty(V,"providerNotSupportAnthropicApi",{enumerable:!0,get:function(){return Tn.providerNotSupportAnthropicApi}});var vr=Nc();Object.defineProperty(V,"BUILTIN_MODELS",{enumerable:!0,get:function(){return vr.BUILTIN_MODELS}});Object.defineProperty(V,"REGISTRY_KEY_SEPARATOR",{enumerable:!0,get:function(){return vr.REGISTRY_KEY_SEPARATOR}});Object.defineProperty(V,"getRegistryKey",{enumerable:!0,get:function(){return vr.getRegistryKey}});Object.defineProperty(V,"parseRegistryKey",{enumerable:!0,get:function(){return vr.parseRegistryKey}});Object.defineProperty(V,"isCompositeKey",{enumerable:!0,get:function(){return vr.isCompositeKey}});Object.defineProperty(V,"getModelByRegistryKey",{enumerable:!0,get:function(){return vr.getModelByRegistryKey}});Object.defineProperty(V,"getModel",{enumerable:!0,get:function(){return vr.getModel}});Object.defineProperty(V,"getModelsForProvider",{enumerable:!0,get:function(){return vr.getModelsForProvider}});Object.defineProperty(V,"getRecommendedModels",{enumerable:!0,get:function(){return vr.getRecommendedModels}});Object.defineProperty(V,"getModelsWithCapability",{enumerable:!0,get:function(){return vr.getModelsWithCapability}});Object.defineProperty(V,"getActiveModels",{enumerable:!0,get:function(){return vr.getActiveModels}});var bs=Id();Object.defineProperty(V,"AGENT_ENGINES",{enumerable:!0,get:function(){return bs.AGENT_ENGINES}});Object.defineProperty(V,"getAgentEngine",{enumerable:!0,get:function(){return bs.getAgentEngine}});Object.defineProperty(V,"getAllAgentEngines",{enumerable:!0,get:function(){return bs.getAllAgentEngines}});Object.defineProperty(V,"getAllAgentEngineIds",{enumerable:!0,get:function(){return bs.getAllAgentEngineIds}});Object.defineProperty(V,"getCompatibleProviders",{enumerable:!0,get:function(){return bs.getCompatibleProviders}});Object.defineProperty(V,"getEnginesCompatibleWithProvider",{enumerable:!0,get:function(){return bs.getEnginesCompatibleWithProvider}});Object.defineProperty(V,"isEngineCompatibleWithProvider",{enumerable:!0,get:function(){return bs.isEngineCompatibleWithProvider}});Object.defineProperty(V,"getEngineRulesFile",{enumerable:!0,get:function(){return bs.getEngineRulesFile}});Object.defineProperty(V,"getEngineWorkspaceDir",{enumerable:!0,get:function(){return bs.getEngineWorkspaceDir}});var jO=Pc(),Cc=Nc(),Rc=Id();function xO(t){let e=Cc.BUILTIN_MODELS.find(n=>n.id===t);return e?jO.PROVIDERS[e.provider]:void 0}function BO(t){let e=Cc.BUILTIN_MODELS.find(n=>n.id===t);if(e)return Object.values(Rc.AGENT_ENGINES).find(n=>(0,Rc.isEngineCompatibleWithProvider)(n.id,e.provider))}function FO(t){let e=Rc.AGENT_ENGINES[t];return e?Cc.BUILTIN_MODELS.filter(n=>(0,Rc.isEngineCompatibleWithProvider)(e.id,n.provider)):[]}function VO(t,e){return Cc.BUILTIN_MODELS.find(r=>r.id===t)?.provider===e}});var Uc=T(nr=>{"use strict";var KO=nr&&nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),WO=nr&&nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tm=nr&&nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KO(n,e,r[s]);return WO(n,e),n}})();Object.defineProperty(nr,"__esModule",{value:!0});nr.getDefaultCustomEnginesInstallRoot=Gc;nr.installCustomEngineFromFiles=sI;nr.listInstalledCustomEngines=iI;nr.uninstallCustomEngine=oI;var qO=require("child_process"),yt=require("fs"),YO=Tm(require("os")),je=Tm(require("path")),JO=require("util"),XO=ot(),Mc=dn(),zO=(0,JO.promisify)(qO.execFile),Dn="engine.manifest.json";function Gc(){return je.join(process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME||je.join(YO.homedir(),XO.AGENTIDE_DIR_NAME),"engines")}function bm(t){let e=t.replace(/\\/g,"/").trim().replace(/^\.\//,"");if(!e||e.includes("\0"))throw new Error(`Invalid engine package path: ${t}`);if(e.startsWith("/")||/^[A-Za-z]:/.test(e))throw new Error(`Engine package path must be relative: ${t}`);let n=e.split("/").filter(Boolean);if(n.length===0||n.some(r=>r==="."||r===".."))throw new Error(`Engine package path must not contain "." or "..": ${t}`);return n.join("/")}function $c(t,e){try{return bm(t).replace(/\//g,je.sep)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`${e}: ${r}`)}}function vi(t,e,n){let r=je.resolve(t),s=je.resolve(e),i=je.relative(r,s);if(i&&(i.startsWith("..")||je.isAbsolute(i)))throw new Error(`${n} must stay inside ${t}: ${e}`)}async function Dc(t){try{return await yt.promises.access(t),!0}catch{return!1}}function Pd(t,e){let n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${e} must be a JSON object`);return n}function Lc(t,e,n){let r=t[e];if(typeof r!="string"||r.trim().length===0)throw new Error(`${n} missing required string field "${e}"`);return r.trim()}function vm(t){let e=t.trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(e))throw new Error(`Custom engine id must contain only lowercase letters, numbers, ".", "_", or "-": ${t}`);return e}function QO(t,e){if(!t)return;if(typeof t!="object"||Array.isArray(t))throw new Error(`${e} workspaceSync must be an object`);let n=t;if(n.enabled!==!0)return;let r=Lc(n,"dir",`${e} workspaceSync`),s=Lc(n,"rulesFile",`${e} workspaceSync`);$c(r,"workspaceSync.dir"),$c(s,"workspaceSync.rulesFile")}async function ZO(t){let e=je.join(t,Dn),n;try{n=await yt.promises.readFile(e,"utf8")}catch{throw new Error(`Custom engine package is missing ${Dn}`)}let r=Pd(n,Dn),s=Lc(r,"id",Dn),i={version:r.version,id:s,displayName:typeof r.displayName=="string"&&r.displayName.trim()?r.displayName.trim():void 0,description:typeof r.description=="string"&&r.description.trim()?r.description.trim():void 0,entry:Lc(r,"entry",Dn),workspaceSync:r.workspaceSync};if(i.version!==2)throw new Error(`${Dn} must declare version 2`);if(i.id!==i.id.toLowerCase()||!/^[a-z0-9][a-z0-9._-]*$/.test(i.id))throw new Error(`${Dn} id must contain only lowercase letters, numbers, ".", "_", or "-"`);QO(i.workspaceSync,Dn);let o=$c(i.entry,"entry"),a=je.join(t,o);if(vi(t,a,"Engine entry"),!await Dc(a))throw new Error(`${Dn} entry not found: ${i.entry}`);return i}async function eI(t,e){let n=new Set;for(let r of e){let s=bm(r.path);if(n.has(s))throw new Error(`Duplicate engine package path: ${r.path}`);n.add(s);let i=je.join(t,...s.split("/"));vi(t,i,"Engine package file"),await yt.promises.mkdir(je.dirname(i),{recursive:!0}),await yt.promises.writeFile(i,r.content)}}async function Om(t,e,n){try{await zO(t,e,{cwd:n,maxBuffer:10*1024*1024,windowsHide:!0,shell:process.platform==="win32"&&/\.(?:cmd|bat)$/i.test(t)})}catch(r){let s=typeof r.stderr=="string"?r.stderr.trim():"",i=typeof r.stdout=="string"?r.stdout.trim():"",o=s||i||(r instanceof Error?r.message:String(r));throw new Error(`${t} ${e.join(" ")} failed: ${o}`)}}async function tI(t,e,n){let r=je.join(t,"package.json");if(!await Dc(r))return!1;let s=je.join(t,"package-lock.json");if(!await Dc(s))throw new Error("Custom engine packages with package.json must include package-lock.json");if(!e)return!1;let i=process.platform==="win32"?"npm.cmd":"npm";return n&&(0,Mc.logInfo)(n,"[Store] Running npm ci --omit=dev for custom engine"),await Om(i,["ci","--omit=dev"],t),!0}async function nI(t,e,n){let r=$c(e.entry,"entry"),s=je.join(t,r);return n&&(0,Mc.logInfo)(n,`[Store] Validating custom engine entry: ${e.entry}`),await Om("node",["--check",s],t),s}async function rI(t,e,n,r){await yt.promises.mkdir(e,{recursive:!0});let s=je.join(e,n);vi(e,s,"Custom engine install target");let i=await Dc(s);if(i&&!r)throw new Error(`Custom engine "${n}" already exists at ${s}`);if(!i)return await yt.promises.rename(t,s),s;let o=je.join(e,".tmp");await yt.promises.mkdir(o,{recursive:!0});let a=je.join(o,`${n}.previous-${Date.now()}`);vi(e,a,"Custom engine backup target"),await yt.promises.rm(a,{recursive:!0,force:!0}),await yt.promises.rename(s,a);try{return await yt.promises.rename(t,s),await yt.promises.rm(a,{recursive:!0,force:!0}),s}catch(c){throw await yt.promises.rm(s,{recursive:!0,force:!0}).catch(()=>{}),await yt.promises.rename(a,s).catch(()=>{}),c}}async function sI(t,e={}){if(t.length===0)throw new Error("Custom engine package is empty");let n=je.resolve(e.installRoot??Gc()),r=e.runNpmCi!==!1,s=e.overwrite!==!1,i=je.join(n,".tmp");await yt.promises.mkdir(i,{recursive:!0});let o=await yt.promises.mkdtemp(je.join(i,`${e.slug||"engine"}-`));vi(i,o,"Custom engine staging directory");let a=!0;try{await eI(o,t);let c=await ZO(o),l=await tI(o,r,e.logger),u=await nI(o,c,e.logger),f=await rI(o,n,c.id,s);a=!1;let d=je.join(f,je.relative(o,u)),g={id:c.id,displayName:c.displayName||c.id,version:c.version,manifestPath:je.join(f,Dn),installDir:f,entryPath:d,npmInstalled:l};if(e.logger){let p=e.sourceUrl?` from ${e.sourceUrl}`:"";(0,Mc.logInfo)(e.logger,`[Store] Installed custom engine ${g.id}${p} to ${f}`)}return g}finally{a&&await yt.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}async function iI(t={}){let e=je.resolve(t.installRoot??Gc()),n;try{n=await yt.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let s of n){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=je.join(e,s.name);vi(e,i,"Custom engine install target");let o=je.join(i,Dn),a=s.name,c=s.name;try{let l=Pd(await yt.promises.readFile(o,"utf8"),o);typeof l.id=="string"&&l.id.trim()&&(a=vm(l.id)),typeof l.displayName=="string"&&l.displayName.trim()?c=l.displayName.trim():c=a}catch{}r.push({id:a,displayName:c,manifestPath:o,installDir:i})}return r.sort((s,i)=>s.id.localeCompare(i.id))}async function oI(t,e={}){let n=vm(t),r=je.resolve(e.installRoot??Gc()),s=je.join(r,n);vi(r,s,"Custom engine uninstall target");let i;try{let o=await yt.promises.lstat(s);if(!o.isDirectory()||o.isSymbolicLink())throw new Error(`Custom engine install target is not a normal directory: ${s}`);try{let a=Pd(await yt.promises.readFile(je.join(s,Dn),"utf8"),Dn);i=typeof a.displayName=="string"&&a.displayName.trim()?a.displayName.trim():void 0}catch{}}catch(o){if(o?.code==="ENOENT")return{id:n,installDir:s,removed:!1};throw o}return await yt.promises.rm(s,{recursive:!0,force:!0}),e.logger&&(0,Mc.logInfo)(e.logger,`[Store] Uninstalled custom engine ${n} from ${s}`),{id:n,displayName:i,installDir:s,removed:!0}}});var Qs=T(Mn=>{"use strict";var aI=Mn&&Mn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),cI=Mn&&Mn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Nd=Mn&&Mn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&aI(n,e,r[s]);return cI(n,e),n}})();Object.defineProperty(Mn,"__esModule",{value:!0});Mn.parseCustomEngineSearchPath=xc;Mn.getCustomEngineSearchRoots=Rm;Mn.discoverCustomEngineManifests=Cm;Mn.resolveCustomEngineManifest=km;Mn.tryResolveCustomEngineManifest=mI;var Hc=Nd(require("fs")),lI=Nd(require("os")),Or=Nd(require("path")),jc=ot(),uI=Uc(),Im="engines",Pm="engine.manifest.json";function Nm(t){return t.trim().toLowerCase()}function Ln(t){return typeof t=="string"&&t.trim().length>0}function xc(t){return Array.isArray(t)?t.flatMap(e=>xc(e)):t?.trim()?t.split(Or.delimiter).map(e=>e.trim()).filter(Boolean):[]}function dI(t){let e=new Set,n=[];for(let r of t){let s=Or.resolve(r);e.has(s)||(e.add(s),n.push(s))}return n}function fI(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid model config in ${e}: expected object`);let n=t;if(!Ln(n.defaultModel))throw new Error(`Invalid model config in ${e}: "defaultModel" is required`);return{defaultModel:n.defaultModel.trim(),apiKeyEnvVar:Ln(n.apiKeyEnvVar)?n.apiKeyEnvVar.trim():void 0,baseUrlEnvVar:Ln(n.baseUrlEnvVar)?n.baseUrlEnvVar.trim():void 0,openaiBaseUrlEnvVar:Ln(n.openaiBaseUrlEnvVar)?n.openaiBaseUrlEnvVar.trim():void 0}}function pI(t,e){if(!t)return{mode:"env-only"};if(typeof t!="object")throw new Error(`Invalid promptInjection config in ${e}: expected object`);let n=t,s=Ln(n.mode)?n.mode.trim():"env-only";if(s!=="none"&&s!=="env-only"&&s!=="message-suffix")throw new Error(`Invalid promptInjection config in ${e}: "mode" must be none, env-only, or message-suffix`);return{mode:s}}function gI(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid workspaceSync config in ${e}: expected object`);let n=t;if(!(n.enabled===!0))return{enabled:!1,dir:"",rulesFile:"",includeSkills:!1,includeRules:!1};if(!Ln(n.dir))throw new Error(`Invalid workspaceSync config in ${e}: "dir" is required when enabled`);if(!Ln(n.rulesFile))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" is required when enabled`);let s=n.dir.trim();if(Or.isAbsolute(s)||s.includes(".."))throw new Error(`Invalid workspaceSync config in ${e}: "dir" must be a relative workspace directory`);let i=n.rulesFile.trim();if(Or.isAbsolute(i)||i.includes(".."))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" must be a relative path`);return{enabled:!0,dir:s,rulesFile:i,includeSkills:n.includeSkills!==!1,includeRules:n.includeRules!==!1}}function hI(t,e){let n=Hc.readFileSync(t,"utf8"),r=JSON.parse(n);if(!Ln(r.id))throw new Error(`Invalid custom engine manifest ${t}: "id" is required`);if(r.version!==2)throw new Error(`Invalid custom engine manifest ${t}: "version" must be 2`);if(!Ln(r.entry))throw new Error(`Invalid custom engine manifest ${t}: "entry" is required`);let s=Nm(r.id),i=Or.dirname(t),o=r.entry.trim(),a=Or.isAbsolute(o)?o:Or.resolve(i,o);return{version:2,id:s,displayName:Ln(r.displayName)?r.displayName.trim():void 0,description:Ln(r.description)?r.description.trim():void 0,entry:o,entryPath:a,engineExport:Ln(r.engineExport)?r.engineExport.trim():void 0,homeEnvVar:Ln(r.homeEnvVar)?r.homeEnvVar.trim():void 0,workspaceSync:gI(r.workspaceSync,t),promptInjection:pI(r.promptInjection,t),model:fI(r.model,t),manifestPath:t,manifestDir:i,searchRoot:e}}function Rm(t,e){let n=t?Or.resolve(t):void 0,r=xc(e),s=xc(process.env.AGENTHIPPO_CUSTOM_ENGINES_DIR??process.env.AGENTIDE_CUSTOM_ENGINES_DIR);return dI([...n?[Or.join(n,jc.AGENTIDE_DIR_NAME,Im)]:[],...r,...s,(0,uI.getDefaultCustomEnginesInstallRoot)(),Or.join(lI.homedir(),jc.AGENTIDE_DIR_NAME,Im)])}function Cm(t,e,n){let r=[],s=new Set;for(let i of Rm(t,e)){if(!Hc.existsSync(i))continue;let o;try{o=Hc.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory())continue;let c=Or.join(i,a.name,Pm);if(!Hc.existsSync(c))continue;let l;try{l=hI(c,i)}catch(u){n?.(c,u);continue}s.has(l.id)||(s.add(l.id),r.push(l))}}return r}function km(t,e,n,r){let s=Cm(t,n,r),i=e?Nm(e):void 0;if(i){let o=s.find(a=>a.id===i);if(!o){let a=s.map(c=>c.id).sort();throw new Error(a.length>0?`Custom engine "${i}" not found. Available: ${a.join(", ")}`:`Custom engine "${i}" not found. No manifests discovered under ${jc.AGENTIDE_DIR_NAME}/engines.`)}return o}if(s.length===0)throw new Error(`No custom engines found. Add ${Pm} under ${jc.AGENTIDE_DIR_NAME}/engines/<engine-id>/`);if(s.length>1){let o=s.map(a=>a.id).sort();throw new Error(`Multiple custom engines found (${o.join(", ")}). Specify one with --engine <id>.`)}return s[0]}function mI(t,e,n,r){try{return km(t,e,n,r)}catch{return}}});var dn=T((exports,module)=>{"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),__importStar=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&__createBinding(n,e,r[s]);return __setModuleDefault(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.getAnalyticsScriptsDir=void 0;exports.logInfo=logInfo;exports.getErrorCode=getErrorCode;exports.pathExists=pathExists;exports.isDirOrSymlink=isDirOrSymlink;exports.ensureRealDirectory=ensureRealDirectory;exports.writeFileIfChanged=writeFileIfChanged;exports.copyDirRecursive=copyDirRecursive;exports.copyDirRecursiveWithTransform=copyDirRecursiveWithTransform;exports.symlinkOrCopyFile=symlinkOrCopyFile;exports.syncDirByFileLinks=syncDirByFileLinks;exports.ensureWorkspaceGitAndGitignore=ensureWorkspaceGitAndGitignore;exports.readFileSha256=readFileSha256;exports.getFileStats=getFileStats;exports.isCachedHashValid=isCachedHashValid;exports.shortSig=shortSig;exports.isLocalHttps=isLocalHttps;exports.applyLocalTlsBypass=applyLocalTlsBypass;exports.getOverrideOpenAIBaseUrl=getOverrideOpenAIBaseUrl;exports.inferModelProvider=inferModelProvider;exports.resolveApiRouting=resolveApiRouting;exports.getExplicitConfigValue=getExplicitConfigValue;exports.getAgentideEngineSettings=getAgentideEngineSettings;exports.emitStreamEvent=emitStreamEvent;exports.createIPCStreamEmitter=createIPCStreamEmitter;exports.computeTextDelta=computeTextDelta;exports.createDeferred=createDeferred;exports.stableAdditionalDirs=stableAdditionalDirs;exports.extractFilePaths=extractFilePaths;exports.isCreateCommand=isCreateCommand;exports.normalizeFileChangeKind=normalizeFileChangeKind;exports.isBinaryFile=isBinaryFile;var fs_1=require("fs"),child_process_1=require("child_process"),promises_1=require("stream/promises"),util_1=require("util"),path=__importStar(require("path")),crypto=__importStar(require("crypto")),shared_1=kc(),branding_1=ot(),customRegistry_1=Qs(),execFileAsync=(0,util_1.promisify)(child_process_1.execFile),_vscode;function getVscode(){if(!_vscode)try{_vscode=eval("require")("vscode")}catch{throw new Error("vscode module not available. Use ConfigProvider instead of vscode.workspace.getConfiguration")}return _vscode}function logInfo(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}function getErrorCode(t){return t&&typeof t=="object"?t.code:void 0}async function pathExists(t){try{return await fs_1.promises.lstat(t),!0}catch(e){if(getErrorCode(e)==="ENOENT")return!1;throw e}}async function isDirOrSymlink(t){try{let e=await fs_1.promises.lstat(t);return e.isDirectory()||e.isSymbolicLink()}catch(e){if(getErrorCode(e)==="ENOENT")return!1;throw e}}async function ensureRealDirectory(t){try{let e=await fs_1.promises.lstat(t);(e.isSymbolicLink()||!e.isDirectory())&&(await fs_1.promises.rm(t,{recursive:!0,force:!0}),await fs_1.promises.mkdir(t,{recursive:!0}))}catch(e){if(getErrorCode(e)==="ENOENT"){await fs_1.promises.mkdir(t,{recursive:!0});return}throw e}}async function writeFileIfChanged(t,e){try{if(await fs_1.promises.readFile(t,"utf8")===e)return!1}catch(n){if(getErrorCode(n)!=="ENOENT")throw n}return await fs_1.promises.mkdir(path.dirname(t),{recursive:!0}),await fs_1.promises.writeFile(t,e,"utf8"),!0}async function copyDirRecursive(t,e){await fs_1.promises.mkdir(e,{recursive:!0});let n=await fs_1.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=path.join(t,r.name),i=path.join(e,r.name);if(r.isDirectory())await copyDirRecursive(s,i);else if(r.isFile())await fs_1.promises.copyFile(s,i);else if(r.isSymbolicLink()){let o=await fs_1.promises.readlink(s),a=path.isAbsolute(o)?o:path.resolve(path.dirname(s),o);(await fs_1.promises.stat(a)).isDirectory()?await copyDirRecursive(a,i):await fs_1.promises.copyFile(a,i)}}}async function copyDirRecursiveWithTransform(t,e,n){await fs_1.promises.mkdir(e,{recursive:!0});let r=await fs_1.promises.readdir(t,{withFileTypes:!0});for(let s of r){let i=path.join(t,s.name),o=path.join(e,s.name);if(s.isDirectory())await copyDirRecursiveWithTransform(i,o,n);else if(s.isFile())if(s.name.toLowerCase().endsWith(".md")){let c=await fs_1.promises.readFile(i,"utf8");await fs_1.promises.writeFile(o,n(c),"utf8")}else await fs_1.promises.copyFile(i,o);else if(s.isSymbolicLink()){let a=await fs_1.promises.readlink(i),c=path.isAbsolute(a)?a:path.resolve(path.dirname(i),a);if((await fs_1.promises.stat(c)).isDirectory())await copyDirRecursiveWithTransform(c,o,n);else if(s.name.toLowerCase().endsWith(".md")){let f=await fs_1.promises.readFile(c,"utf8");await fs_1.promises.writeFile(o,n(f),"utf8")}else await fs_1.promises.copyFile(c,o)}}}async function symlinkOrCopyFile(t,e,n,r,s){let i=s?.force??!1;try{if((await fs_1.promises.lstat(e)).isSymbolicLink()){try{let a=await fs_1.promises.readlink(e),c=path.isAbsolute(a)?a:path.resolve(path.dirname(e),a);if(path.resolve(c)===path.resolve(t))return}catch{}await fs_1.promises.unlink(e)}else if(i)await fs_1.promises.rm(e,{recursive:!0,force:!0});else return}catch(o){if(getErrorCode(o)!=="ENOENT")throw o}if(await fs_1.promises.mkdir(path.dirname(e),{recursive:!0}),path.resolve(t)!==path.resolve(e))try{await fs_1.promises.symlink(t,e,"file"),logInfo(n,`[AgentIDE] Linked ${r} (symlink): ${e} -> ${t}`)}catch{await fs_1.promises.copyFile(t,e),logInfo(n,`[AgentIDE] Linked ${r} (copy fallback): ${e}`)}}async function syncDirByFileLinks(t,e,n,r){await ensureRealDirectory(e);let s=new Set,i=new Map,o=async(f,d)=>{let g;try{g=await fs_1.promises.readdir(f,{withFileTypes:!0})}catch(p){if(getErrorCode(p)==="ENOENT")return;throw p}for(let p of g){if(p.name.startsWith("."))continue;let _=path.join(f,p.name),h=d?path.join(d,p.name):p.name;if(p.isDirectory())s.add(h),await o(_,h);else if(p.isFile())i.set(h,_);else if(p.isSymbolicLink())try{let y=await fs_1.promises.readlink(_),E=path.isAbsolute(y)?y:path.resolve(path.dirname(_),y);(await fs_1.promises.stat(E)).isDirectory()?(s.add(h),await o(E,h)):i.set(h,E)}catch(y){let E=getErrorCode(y);if(E==="ENOENT"||E==="ELOOP")continue;throw y}}};await o(t,"");let a=Array.from(s).sort((f,d)=>f.split(path.sep).length-d.split(path.sep).length);for(let f of a)await ensureRealDirectory(path.join(e,f));for(let[f,d]of i.entries())await symlinkOrCopyFile(d,path.join(e,f),n,`${r}/${f}`.replace(/\\/g,"/"),{force:!0});let c=new Set(i.keys()),l=async(f,d)=>{let g;try{g=await fs_1.promises.readdir(f,{withFileTypes:!0})}catch(p){if(getErrorCode(p)==="ENOENT")return;throw p}for(let p of g){if(p.name.startsWith("."))continue;let _=path.join(f,p.name),h=d?path.join(d,p.name):p.name,y=path.join(t,h);if(p.isDirectory())await l(_,h);else if(p.isFile()&&!p.isSymbolicLink()&&!c.has(h))try{await fs_1.promises.mkdir(path.dirname(y),{recursive:!0}),await fs_1.promises.copyFile(_,y),logInfo(n,`[AgentIDE] Copied new file to source: ${r}/${h}`.replace(/\\/g,"/")),i.set(h,y)}catch(E){logInfo(n,`[AgentIDE] Warning: failed to copy back ${h}: ${E instanceof Error?E.message:String(E)}`)}}};await l(e,"");for(let[f,d]of i.entries()){let g=path.join(e,f);try{let p=await fs_1.promises.lstat(g);p.isFile()&&!p.isSymbolicLink()&&(await fs_1.promises.rm(g,{force:!0}),await symlinkOrCopyFile(d,g,n,`${r}/${f}`.replace(/\\/g,"/"),{force:!0}))}catch{}}let u=async(f,d)=>{let g;try{g=await fs_1.promises.readdir(f,{withFileTypes:!0})}catch(p){if(getErrorCode(p)==="ENOENT")return;throw p}for(let p of g){if(p.name.startsWith("."))continue;let _=path.join(f,p.name),h=d?path.join(d,p.name):p.name;p.isDirectory()?await u(_,h):p.isSymbolicLink()&&(c.has(h)||await fs_1.promises.rm(_,{force:!0}))}};await u(e,"")}function getManagedWorkspaceDirs(t,e){let n=Object.values(shared_1.AGENT_ENGINES).map(s=>s.workspaceDir),r=(0,customRegistry_1.discoverCustomEngineManifests)(t,e).filter(s=>s.workspaceSync?.enabled).map(s=>s.workspaceSync.dir);return[...new Set([...n,...r])]}async function ensureWorkspaceGitAndGitignore(t,e,n){let r=path.join(t,".git");if(!await pathExists(r))try{await execFileAsync("git",["init"],{cwd:t}),logInfo(e,`[AgentIDE] Initialized git repository in ${t}`)}catch(_){logInfo(e,`[AgentIDE] Note: Could not initialize git in ${t}: ${_ instanceof Error?_.message:String(_)}`)}let i=path.join(t,".gitignore"),o=getManagedWorkspaceDirs(t,n?.extraSearchPath),a=[`# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,`# These directories are managed by ${branding_1.AGENTIDE_BRAND_NAME} and should not be committed.`,...o],c="";try{c=await fs_1.promises.readFile(i,"utf8")}catch(_){if(getErrorCode(_)!=="ENOENT"){logInfo(e,`[AgentIDE] Warning: failed to read root .gitignore: ${_ instanceof Error?_.message:String(_)}`);return}}let l=c.split(`
32
+ `).map(_=>_.trim());if(o.filter(_=>!l.includes(_)).length===0)return;let f=`# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,d="# AgentIDE (managed)",g=c.includes(f)||c.includes(d),p;if(g){let _=c.split(`
33
+ `),h=[],y=!1;for(let E of _){if(E.trim()===f||E.trim()===d){y=!0,h.push(...a);continue}if(y){if(E.trim().startsWith("#")||o.includes(E.trim())||E.trim()==="")continue;y=!1}h.push(E)}p=h.join(`
34
34
  `).replace(/\n{3,}/g,`
35
35
 
36
36
  `).trimEnd()+`
37
- `}else g=[c.trimEnd(),"",a.join(`
37
+ `}else p=[c.trimEnd(),"",a.join(`
38
38
  `),""].join(`
39
- `).replace(/^\n+/,"");try{await writeFileIfChanged(i,g)&&logInfo(e,`[AgentIDE] Updated ${i} to ignore ${branding_1.AGENTIDE_BRAND_NAME} directories`)}catch(_){logInfo(e,`[AgentIDE] Warning: failed to write root .gitignore: ${_ instanceof Error?_.message:String(_)}`)}}async function readFileSha256(t){let e=await fs_1.promises.stat(t),n=crypto.createHash("sha256");return await(0,promises_1.pipeline)((0,fs_1.createReadStream)(t),n),{sha256:n.digest("hex"),size:e.size,mtimeMs:e.mtimeMs}}async function getFileStats(t){try{let e=await fs_1.promises.stat(t);return{size:e.size,mtimeMs:e.mtimeMs}}catch(e){if(getErrorCode(e)==="ENOENT")return;throw e}}function isCachedHashValid(t,e){if(!(!t||!e)&&t.mtimeMs===e.mtimeMs&&t.size===e.size)return t}function shortSig(t){return crypto.createHash("sha256").update(t).digest("hex").slice(0,16)}var LOCAL_TLS_HOSTNAMES=new Set(["localhost","127.0.0.1","0.0.0.0","::1","[::1]"]);function isLocalHttps(t){if(!t)return!1;try{let e=new URL(t);return e.protocol==="https:"&&LOCAL_TLS_HOSTNAMES.has(e.hostname.toLowerCase())}catch{return!1}}function applyLocalTlsBypass(t,e){return isLocalHttps(e)?(t.NODE_TLS_REJECT_UNAUTHORIZED="0",!0):!1}function getOverrideOpenAIBaseUrl(t,e){if(!e)return;let n=e.getCustomProviders(),r=t.replace(/\/$/,"");for(let s of Object.values(n))if(s.baseUrl){let i=s.baseUrl.replace(/\/$/,"");if(r===i&&s.overrideOpenAIBaseUrl)return s.overrideOpenAIBaseUrl.trim()}}function inferModelProvider(t){return t&&/claude|anthropic/i.test(t)?"anthropic":"openai"}function resolveApiRouting(t,e,n,r){let s=t.useLiteLLM===!0,i=t.baseUrl||(s?e.litellmBaseUrl:void 0),o=n==="anthropic"?e.anthropicApiKey:e.openaiApiKey,a=s?t.apiKey||e.litellmApiKey||"sk-dummy":t.apiKey||o||"",c=i;if(i){let l=getOverrideOpenAIBaseUrl(i,r);l&&(c=l)}return{apiKey:a,baseUrl:i,openaiBaseUrl:c,useLiteLLM:s}}function getExplicitConfigValue(t,e){let n=t.inspect(e);if(n)return n.workspaceFolderValue??n.workspaceValue??n.globalValue}function getAgentideEngineSettings(t){return t?t.getEngineSettings():{claudeMaxThinkingTokens:0}}async function emitStreamEvent(t){try{await getVscode().commands.executeCommand("agentide.streamCallback",t)}catch(e){console.error("[AgentIDE Extension] Failed to emit stream event:",e)}}var STREAM_COALESCE_WINDOW_MS=40,STREAM_COALESCE_MIN_CHARS=120;function flushCoalescedBuffers(t,e){let n=[];return e.markdownBuffer&&(n.push(emitStreamEvent({streamId:t,type:"markdown",data:e.markdownBuffer})),e.markdownBuffer=""),e.thinkingBuffer&&(n.push(emitStreamEvent({streamId:t,type:"thinking",data:e.thinkingBuffer})),e.thinkingBuffer=""),e.flushTimer&&(clearTimeout(e.flushTimer),e.flushTimer=void 0),Promise.all(n).then(()=>{})}function ensureFlushTimer(t,e){e.flushTimer||(e.flushTimer=setTimeout(()=>{flushCoalescedBuffers(t,e)},STREAM_COALESCE_WINDOW_MS))}function createIPCStreamEmitter(t){let e={markdownBuffer:"",thinkingBuffer:"",flushTimer:void 0};return{async thinking(n){if(n){if(e.thinkingBuffer+=n,e.thinkingBuffer.length>=STREAM_COALESCE_MIN_CHARS){await flushCoalescedBuffers(t,e);return}ensureFlushTimer(t,e)}},async text(n){if(n){if(e.markdownBuffer+=n,e.markdownBuffer.length>=STREAM_COALESCE_MIN_CHARS){await flushCoalescedBuffers(t,e);return}ensureFlushTimer(t,e)}},async toolStart(n,r,s,i){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"tool_use",toolName:n,toolCallId:s,data:r||"",metadata:i})},async toolEnd(n,r,s,i,o){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"tool_end",toolName:n,toolCallId:r,data:s||"",metadata:{...o&&typeof o=="object"?o:{},isError:i}})},async progress(n){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"progress",data:n})},async question(n){return await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"question",metadata:n}),{selected:[],freeText:null,declined:!0}},async error(n){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"error",data:n})},async done(){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"done"})}}}function computeTextDelta(t,e,n){let r=n.get(t)??"",s=e.startsWith(r)?e.slice(r.length):e;return n.set(t,e),s}function createDeferred(){let t,e;return{promise:new Promise((r,s)=>{t=r,e=s}),resolve:t,reject:e}}function stableAdditionalDirs(t){return(t??[]).slice().filter(Boolean).sort()}var paths_1=bi();Object.defineProperty(exports,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return paths_1.getAnalyticsScriptsDir}});var CREATE_CMD_PATTERN=/(?:cat\s*>[^>]|echo\s*>[^>]|touch\s+|>\s*[^>]|<<\s*['"]?EOF)/,EXCLUDED_PREFIXES=["/tmp/","/var/","/dev/"],EXCLUDED_SUFFIXES=[".tmp",".bak"];function extractFilePaths(t,e){let n=t.matchAll(/(?:^|[\s'"`;|&()=><])([./]*(?:[\w.\-]+\/)*[\w.\-]+\.[\w]+)(?=[\s'"`;|&()=><]|$)/g),r=new Set;for(let s of n){let i=s[1].replace(/['"]/g,"").trim();!i||i.startsWith("-")||i.includes("..")||EXCLUDED_PREFIXES.some(o=>i.startsWith(o))||EXCLUDED_SUFFIXES.some(o=>i.endsWith(o))||r.add(i.startsWith("/")?i:`${e}/${i.replace(/^\.\//,"")}`)}return[...r]}function isCreateCommand(t){return CREATE_CMD_PATTERN.test(t)}function normalizeFileChangeKind(t){switch(t){case"add":case"create":return"create";case"update":case"modify":return"modify";case"delete":return"delete";default:return}}var BINARY_EXTENSIONS=new Set([".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".zip",".tar",".gz",".rar",".7z",".png",".jpg",".jpeg",".gif",".bmp",".ico",".webp",".svg",".mp3",".mp4",".wav",".avi",".mov",".mkv",".exe",".dll",".so",".dylib",".bin",".woff",".woff2",".ttf",".otf",".eot",".pyc",".class",".o",".a"]);function isBinaryFile(t){let e=t.lastIndexOf(".");return e===-1?!1:BINARY_EXTENSIONS.has(t.slice(e))}});var $m=T(Bc=>{"use strict";Object.defineProperty(Bc,"__esModule",{value:!0});Bc.VSCodeSessionStore=void 0;var Rd=class{globalState;constructor(e){this.globalState=e}get(e){return this.globalState.get(e)}async set(e,n){await this.globalState.update(e,n)}};Bc.VSCodeSessionStore=Rd});var Oi=T(Tt=>{"use strict";var _I=Tt&&Tt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),EI=Tt&&Tt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yI=Tt&&Tt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&_I(n,e,r[s]);return EI(n,e),n}})();Object.defineProperty(Tt,"__esModule",{value:!0});Tt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=void 0;Tt.initSessionStore=bI;Tt.initSessionStoreWithStore=Mm;Tt._getSessionStore=vI;Tt._resetSessionStore=OI;Tt.upsertPersistedSession=II;Tt.touchPersistedSession=PI;Tt.getPersistedSession=NI;Tt.runSessionMaintenance=RI;Tt.buildConversationKey=kI;Tt.withConversationLock=$I;var wI=yI(require("crypto")),SI=dn(),AI=$m(),Lm="agentide.providerSessions.v1",Dm=200,TI=1e3*60*60*24*14,rr={},Ea;function bI(t){Mm(new AI.VSCodeSessionStore(t.globalState))}function Mm(t){Ea=t,rr=t.get(Lm)??{},Vc(Date.now()),Kc()}function vI(){return Ea}function OI(){Ea=void 0,rr={}}function Vc(t){for(let[n,r]of Object.entries(rr))t-r.lastUsedAt>TI&&delete rr[n];let e=Object.keys(rr);if(!(e.length<=Dm)){e.sort((n,r)=>rr[n].lastUsedAt-rr[r].lastUsedAt);for(let n=0;n<e.length-Dm;n++)delete rr[e[n]]}}async function Kc(){if(Ea)try{await Ea.set(Lm,rr)}catch{}}async function II(t,e){rr[t]=e,Vc(Date.now()),await Kc()}async function PI(t){let e=rr[t];e&&(e.lastUsedAt=Date.now(),Vc(e.lastUsedAt),await Kc())}function NI(t){return rr[t]}function RI(){Vc(Date.now()),Kc()}function CI(t){return JSON.stringify({workspaceRoot:t.workspaceRoot,additionalDirectories:(0,SI.stableAdditionalDirs)(t.additionalDirectories),agentPackId:t.agentPackId??"default"})}function kI(t,e){let n=e.sessionId?.trim(),r=e.contextSessionId?.trim()||n,s=!r,i=r||`ephemeral-${Date.now()}-${Math.random().toString(36).slice(2)}`,o=n||i,a=e.agentPackId??"default",c=CI(e),l=wI.createHash("sha256").update(c).digest("hex").slice(0,16);return{key:`${t}:${i}:${a}:${l}`,chatSessionId:o,isEphemeral:s,signatureHash:l,signatureRaw:c,agentPackId:a}}Tt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=1e3*60*60*48;var Fc=new Map;function $I(t,e,n){let r=Fc.get(t)??Promise.resolve(),s,i=new Promise(y=>{s=y}),o=r.then(()=>i);Fc.set(t,o);let a=n?.label?` (${n.label})`:"",c=typeof n?.timeoutMs=="number"?n.timeoutMs:void 0,l=n?.signal,u,d,f=!1,p=l?new Promise((y,E)=>{if(l.aborted){E(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`));return}u=()=>E(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`)),l.addEventListener("abort",u,{once:!0})}):void 0,g=c&&c>0?new Promise((y,E)=>{d=setTimeout(()=>{f=!0,n?.onTimeout?.(),E(new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`))},c)}):void 0,_=[r,p,g].filter(Boolean);return Promise.race(_).then(async()=>{if(l?.aborted)throw new Error(`[AgentIDE] Cancelled before running conversation work${a}`);if(f)throw new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`);let E=[e(),g].filter(Boolean);return await Promise.race(E)}).finally(()=>{try{d&&clearTimeout(d),l&&u&&l.removeEventListener("abort",u)}finally{s(),Fc.get(t)===o&&Fc.delete(t)}})}});var Ii=T(bn=>{"use strict";var DI=bn&&bn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),LI=bn&&bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),MI=bn&&bn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&DI(n,e,r[s]);return LI(n,e),n}})();Object.defineProperty(bn,"__esModule",{value:!0});bn.buildLiteLLMMetadataHeaders=HI;bn.resolveAnalyticsProjectId=jI;bn.generateRequestId=xI;bn.persistSessionIfNeeded=BI;bn.touchSessionIfNeeded=FI;bn.getPersistedSessionId=VI;var GI=So(),Wc=Oi(),UI=MI(require("path"));function HI(t,e){if(!t)return[];let n=[],r=(0,GI.hashIdentity)(e.analyticsUserId);return r&&(n.push(`x-litellm-metadata-user-id: ${r}`),n.push(`langfuse_trace_user_id: ${r}`)),e.sessionId?.trim()&&(n.push(`x-litellm-metadata-session-id: ${e.sessionId.trim()}`),n.push(`langfuse_session_id: ${e.sessionId.trim()}`)),e.analyticsProjectId?.trim()&&n.push(`x-litellm-metadata-project-id: ${e.analyticsProjectId.trim()}`),e.agentId?.trim()&&n.push(`x-litellm-metadata-agent-id: ${e.agentId.trim()}`),e.agentVersion?.trim()&&n.push(`x-litellm-metadata-agent-version: ${e.agentVersion.trim()}`),e.source?.trim()&&n.push(`x-litellm-metadata-source: ${e.source.trim()}`),e.engine?.trim()&&n.push(`x-litellm-metadata-engine: ${e.engine.trim()}`),e.requestId?.trim()&&n.push(`x-litellm-metadata-request-id: ${e.requestId.trim()}`),e.policyVersion?.trim()&&n.push(`x-litellm-metadata-policy-version: ${e.policyVersion.trim()}`),e.packDigest?.trim()&&n.push(`x-litellm-metadata-pack-digest: ${e.packDigest.trim()}`),e.engineVersion?.trim()&&n.push(`x-litellm-metadata-engine-version: ${e.engineVersion.trim()}`),e.tier!==void 0&&n.push(`x-litellm-metadata-tier: ${e.tier}`),e.instanceId?.trim()&&n.push(`x-litellm-metadata-instance-id: ${e.instanceId.trim()}`),n}function jI(t,e){let n=t?.trim();if(n)return n;if(!e)return;let r=e.replace(/[\\/]+$/,"").trim();return r&&UI.basename(r).trim()||void 0}function xI(){return`req-${Math.random().toString(16).slice(2,10)}`}async function BI(t,e,n,r){if(e.isEphemeral)return;let s=Date.now(),i=(0,Wc.getPersistedSession)(e.key);await(0,Wc.upsertPersistedSession)(e.key,{provider:t,id:n,chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,signatureRaw:e.signatureRaw,agentPackId:r?.agentPackId??e.agentPackId,agentPackVersion:r?.agentPackVersion,createdAt:i?.createdAt??s,lastUsedAt:s})}function FI(t){t.isEphemeral||(0,Wc.touchPersistedSession)(t.key)}function VI(t,e){let n=(0,Wc.getPersistedSession)(e);return n?.provider===t?n.id:void 0}});var Cd=T(Ir=>{"use strict";Object.defineProperty(Ir,"__esModule",{value:!0});Ir.DEFAULT_PERMISSIONS=void 0;Ir.getDefaultPermissions=Gm;Ir._resetMappingConfigCache=KI;Ir.parsePermissions=Um;Ir.parseManifestPermissions=WI;Ir.enforcePermissions=qI;Ir.toClaudeOptions=YI;Ir.toCodexOptions=JI;Ir.DEFAULT_PERMISSIONS={fileAccess:"full"};var Zs={defaults:{fileAccess:"full"},claude:{readOnly:{permissionMode:"plan",allowDangerouslySkipPermissions:!1},workspaceWrite:{permissionMode:"acceptEdits",allowDangerouslySkipPermissions:!1},fullAccess:{permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0}},codex:{approvalPolicy:"never",readOnly:{sandboxMode:"read-only"},workspaceWrite:{sandboxMode:"workspace-write"},fullAccess:{sandboxMode:"danger-full-access"}}};function Gm(){return{...Zs.defaults}}function KI(){}function Um(t){let e=t?.spec?.permissions,n=Gm();return{fileAccess:e?.fileAccess??n.fileAccess}}function WI(t){return Um(t)}function qI(t,e){return{fileAccess:e.fileAccess}}function YI(t,e){return{...t.fileAccess==="read-only"?Zs.claude.readOnly:t.fileAccess==="workspace-write"?Zs.claude.workspaceWrite:Zs.claude.fullAccess,additionalDirectories:t.fileAccess==="full"?void 0:e}}function JI(t,e){let n=t.fileAccess==="read-only"?Zs.codex.readOnly:t.fileAccess==="workspace-write"?Zs.codex.workspaceWrite:Zs.codex.fullAccess;return{approvalPolicy:Zs.codex.approvalPolicy,...n,additionalDirectories:e}}});var Pi=T(Gn=>{"use strict";var XI=Gn&&Gn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),zI=Gn&&Gn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),QI=Gn&&Gn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&XI(n,e,r[s]);return zI(n,e),n}})();Object.defineProperty(Gn,"__esModule",{value:!0});Gn.parseYaml=$d;Gn.stringifyYaml=jm;Gn.updateManifestName=eP;Gn.loadAgentManifest=tP;Gn.parseAgentManifest=xm;var kd=require("fs"),Hm=QI(require("path")),ZI=ot();function $d(t){return require("js-yaml").load(t)}function jm(t){return require("js-yaml").dump(t,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}async function eP(t,e){let n=await kd.promises.readFile(t,"utf8"),r=$d(n);r&&typeof r=="object"&&r.metadata&&(r.metadata.name=e);let s=jm(r);await kd.promises.writeFile(t,s,"utf8")}async function tP(t){let e=await kd.promises.readFile(t,"utf8");return xm(e,t)}function xm(t,e){let n=$d(t),r=e?` (${e})`:"";if(!n?.metadata?.name)throw new Error(`Manifest missing metadata.name${r}`);if(!n.metadata.version)throw new Error(`Manifest missing metadata.version${r}`);if(!n.spec?.engine)throw new Error(`Manifest missing spec.engine${r}`);return nP(n,r),n}function nP(t,e){let n=t.spec?.data;if(!n)return;let r=(s,i,o)=>{let c=(s??o).trim();if(!c)throw new Error(`Manifest spec.data.${i} cannot be empty${e}`);if(Hm.isAbsolute(c))throw new Error(`Manifest spec.data.${i} must be relative (not absolute)${e}`);if(/^(https?:\/\/|git@|ssh:\/\/)/i.test(c))throw new Error(`Manifest spec.data.${i} must be a local relative path${e}`);let l=Hm.posix.normalize(c.replace(/\\/g,"/"));if(l===".."||l.startsWith("../"))throw new Error(`Manifest spec.data.${i} cannot escape parent directories${e}`)};r(n.sourcePath,"sourcePath","./data"),r(n.workspacePath,"workspacePath",`${ZI.AGENTIDE_DIR_NAME}/data/${t.metadata.name}`)}});var Md=T(kt=>{"use strict";var rP=kt&&kt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),sP=kt&&kt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),iP=kt&&kt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&rP(n,e,r[s]);return sP(n,e),n}})();Object.defineProperty(kt,"__esModule",{value:!0});kt.listUserLibraryAgents=cP;kt.isWorkspaceAgentAvailable=lP;kt.isAgentInUserLibrary=uP;kt.hydrateFromUserLibrary=Fm;kt.promoteToUserLibrary=dP;kt.readAgentSource=Vm;kt.checkForUpdate=fP;kt.updateFromUserLibrary=pP;kt.duplicateAgent=hP;kt.resetDefaultAgent=mP;var at=require("fs"),rt=iP(require("path")),ue=dn(),he=er(),Ao=Pi(),Bm=ot();function oP(t,e){let n=o=>o.split(".").map(a=>{let c=parseInt(a,10);return isNaN(c)?0:c}),r=n(t),s=n(e),i=Math.max(r.length,s.length);for(let o=0;o<i;o++){let a=r[o]??0,c=s[o]??0;if(a!==c)return a-c}return 0}function aP(t){return[...t].sort(oP)}async function Dd(t,e){await at.promises.mkdir(e,{recursive:!0});let n=await at.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=rt.join(t,r.name),i=rt.join(e,r.name);if(r.isDirectory()){if(r.name.startsWith("."))continue;await Dd(s,i)}else await at.promises.copyFile(s,i)}}async function cP(){let t=(0,he.getUserAgentsDir)();if(!await(0,ue.pathExists)(t))return[];let e=await at.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=r.name,i=(0,he.getUserAgentRoot)(s),o=await Ld(i);if(o.length===0)continue;let a=await qc(s),c=a||o[o.length-1],l=(0,he.getUserAgentVersionDir)(s,c),u=rt.join(l,he.AGENT_CONSTANTS.MANIFEST_FILE),d,f;try{let p=await(0,Ao.loadAgentManifest)(u);d=p.metadata.description,f=p.spec.engine}catch{}n.push({id:s,versions:o,currentVersion:a,description:d,preferredEngine:f})}return n}async function Ld(t){try{let e=await at.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=rt.join(t,r.name,he.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ue.pathExists)(s))try{await(0,Ao.loadAgentManifest)(s),n.push(r.name)}catch{}}return aP(n)}catch{return[]}}async function qc(t){let e=(0,he.getUserAgentCurrentPath)(t);try{let n=(await at.promises.readFile(e,"utf8")).trim();if(!n)return;let r=(0,he.getUserAgentVersionDir)(t,n),s=rt.join(r,he.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,ue.pathExists)(s))return;try{return await(0,Ao.loadAgentManifest)(s),n}catch{return}}catch{}}async function lP(t,e){let n=(0,he.getAgentManifestPath)(t,e);if(!await(0,ue.pathExists)(n))return!1;try{return(await(0,Ao.loadAgentManifest)(n)).metadata.name===e}catch{return!1}}async function uP(t){if(await qc(t))return!0;let n=(0,he.getUserAgentRoot)(t);return(await Ld(n)).length>0}async function Fm(t,e,n,r){let s=n,i=n??"current";if(!s&&(s=await qc(e),!s)){let f=(0,he.getUserAgentRoot)(e),p=await Ld(f);if(p.length===0){(0,ue.logInfo)(r,`[AgentStores] Agent not in User Library: ${e}`);return}s=p[p.length-1],i=s}let o=(0,he.getUserAgentVersionDir)(e,s);if(!await(0,ue.pathExists)(o)){(0,ue.logInfo)(r,`[AgentStores] Version not found in User Library: ${e}@${s}`);return}let a=(0,he.getAgentRoot)(t,e);(0,ue.logInfo)(r,`[AgentStores] Hydrating ${e}@${s} from User Library`),await(0,ue.pathExists)(a)&&((0,ue.logInfo)(r,`[AgentStores] Clearing existing directory: ${a}`),await at.promises.rm(a,{recursive:!0,force:!0})),await(0,ue.copyDirRecursive)(o,a);let c=rt.join(a,he.AGENT_CONSTANTS.MANIFEST_FILE),{sha256:l}=await(0,ue.readFileSha256)(c),u={source:"user-library",agentId:e,version:s,resolvedFrom:i,sha256:l,hydratedAt:new Date().toISOString()},d=rt.join(a,he.AGENT_CONSTANTS.SOURCE_FILE);return await at.promises.writeFile(d,JSON.stringify(u,null,2),"utf8"),(0,ue.logInfo)(r,`[AgentStores] Hydrated ${e}@${s} to ${a}`),s}async function dP(t,e,n){if(e===he.AGENT_CONSTANTS.DEFAULT_AGENT_ID)throw new Error("Cannot promote the default agent to User Library");let r=(0,he.getAgentRoot)(t,e),s=(0,he.getAgentManifestPath)(t,e);if(!await(0,ue.pathExists)(s))throw new Error(`Agent not found: ${e}`);let o=(await(0,Ao.loadAgentManifest)(s)).metadata.version,a=(0,he.getUserAgentVersionDir)(e,o),c=rt.join(a,he.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ue.pathExists)(c)){let u=await(0,ue.readFileSha256)(s),d=await(0,ue.readFileSha256)(c);if(u.sha256===d.sha256)return(0,ue.logInfo)(n,`[AgentStores] ${e}@${o} already in User Library (identical)`),o;throw new Error(`Version conflict: ${e}@${o} already exists in User Library with different content. Bump the version in agent.yaml and try again.`)}(0,ue.logInfo)(n,`[AgentStores] Promoting ${e}@${o} to User Library`),await at.promises.mkdir(a,{recursive:!0}),await Dd(r,a);let l=(0,he.getUserAgentCurrentPath)(e);return await at.promises.writeFile(l,o,"utf8"),(0,ue.logInfo)(n,`[AgentStores] Promoted ${e}@${o} to ${a}`),o}async function Vm(t,e){let n=rt.join((0,he.getAgentRoot)(t,e),he.AGENT_CONSTANTS.SOURCE_FILE);try{let r=await at.promises.readFile(n,"utf8");return JSON.parse(r)}catch{return}}async function fP(t,e){let n=await Vm(t,e);if(!n||n.source!=="user-library")return;let r=await qc(e);if(r&&r!==n.version)return r}async function pP(t,e,n,r){let s=(0,he.getAgentRoot)(t,e),i=new Date().toISOString().replace(/[:.]/g,"-"),o=rt.join(rt.dirname(s),`.${e}.backup-${i}`);await(0,ue.pathExists)(s)&&((0,ue.logInfo)(r,`[AgentStores] Backing up ${e} to ${o}`),await(0,ue.copyDirRecursive)(s,o),await at.promises.rm(s,{recursive:!0,force:!0}));let a=await Fm(t,e,n,r);if(!a)throw await(0,ue.pathExists)(o)&&((0,ue.logInfo)(r,"[AgentStores] Restoring backup after failed update"),await(0,ue.copyDirRecursive)(o,s)),new Error(`Failed to update ${e} from User Library`);return(0,ue.logInfo)(r,`[AgentStores] Updated ${e} to ${a}`),a}async function gP(t,e){let n=`${e}-copy`;if(!await(0,ue.pathExists)((0,he.getAgentRoot)(t,n)))return n;for(let r=2;r<100;r++){let s=`${e}-${r}`;if(!await(0,ue.pathExists)((0,he.getAgentRoot)(t,s)))return s}return`${e}-${Date.now()}`}async function hP(t,e,n){let r=(0,he.getAgentRoot)(t,e),s=(0,he.getAgentManifestPath)(t,e);if(!await(0,ue.pathExists)(s))throw new Error(`Agent not found: ${e}`);let i=await gP(t,e),o=(0,he.getAgentRoot)(t,i);(0,ue.logInfo)(n,`[AgentStores] Duplicating ${e} to ${i}`),await Dd(r,o);let a=(0,he.getAgentManifestPath)(t,i);await(0,Ao.updateManifestName)(a,i);let c=rt.join(o,he.AGENT_CONSTANTS.SOURCE_FILE);try{await at.promises.rm(c,{force:!0})}catch{}return(0,ue.logInfo)(n,`[AgentStores] Duplicated ${e} to ${i}`),i}async function mP(t,e,n){let r=(0,he.getAgentRoot)(t,he.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=new Date().toISOString().replace(/[:.]/g,"-"),i=rt.join(rt.dirname(r),`.default.backup-${s}`);if(await(0,ue.pathExists)(r)&&((0,ue.logInfo)(n,`[AgentStores] Backing up default agent to ${i}`),await(0,ue.copyDirRecursive)(r,i),await at.promises.rm(r,{recursive:!0,force:!0})),await at.promises.mkdir(r,{recursive:!0}),await at.promises.mkdir(rt.join(r,he.AGENT_CONSTANTS.RULES_DIR),{recursive:!0}),await at.promises.mkdir(rt.join(r,he.AGENT_CONSTANTS.SKILLS_DIR),{recursive:!0}),e){let c=rt.join(e,"rules","AGENTS.md"),l=rt.join(r,he.AGENT_CONSTANTS.AGENTS_MD);if(await(0,ue.pathExists)(c)){let p=await at.promises.readFile(c,"utf8");await at.promises.writeFile(l,(0,Bm.applyBrandingTokens)(p),"utf8"),(0,ue.logInfo)(n,"[AgentStores] Restored AGENTS.md from bundled templates")}let u=rt.join(e,he.AGENT_CONSTANTS.GHOST_TEXT_FILE),d=rt.join(r,he.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,ue.pathExists)(u)&&!await(0,ue.pathExists)(d)){let p=await at.promises.readFile(u,"utf8");await at.promises.writeFile(d,p,"utf8"),(0,ue.logInfo)(n,"[AgentStores] Restored GHOST_TEXT.md from bundled templates")}let f=rt.join(e,"skills");if(await(0,ue.pathExists)(f)){let p=await at.promises.readdir(f,{withFileTypes:!0});for(let g of p){if(!g.isDirectory())continue;let _=rt.join(f,g.name),h=rt.join(r,he.AGENT_CONSTANTS.SKILLS_DIR,g.name);await(0,ue.copyDirRecursiveWithTransform)(_,h,Bm.applyBrandingTokens),(0,ue.logInfo)(n,`[AgentStores] Restored skill: ${g.name}`)}}}let o=(0,he.generateDefaultAgentYaml)({model:"claude"}),a=rt.join(r,he.AGENT_CONSTANTS.MANIFEST_FILE);await at.promises.writeFile(a,o,"utf8"),(0,ue.logInfo)(n,"[AgentStores] Reset default agent complete")}});var Km=T((exports,module)=>{"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),__importStar=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&__createBinding(n,e,r[s]);return __setModuleDefault(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.AgentPackManager=void 0;var fs_1=require("fs"),path=__importStar(require("path")),_vscode;function getVscode(){return _vscode||(_vscode=eval("require")("vscode")),_vscode}var paths_1=er(),manifest_1=Pi(),utils_1=dn(),stores_1=Md(),AgentPackManager=class{syncService;getWorkspaceRoot;getStorageUri;outputChannel;constructor(e,n,r,s){this.syncService=e,this.getWorkspaceRoot=n,this.getStorageUri=r,this.outputChannel=s}async installFromLocal(e){let n=this.getWorkspaceRoot(),r=this.getStorageUri(),s=path.join(e,paths_1.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,utils_1.pathExists)(s))throw new Error(`No agent.yaml found at ${e}`);let i=await(0,manifest_1.loadAgentManifest)(s),o=i.metadata.name,a=i.metadata.version;if((0,paths_1.isDefaultAgent)(o))throw new Error('Cannot install an agent with reserved ID "default"');(0,utils_1.logInfo)(this.outputChannel,`[Agent] Installing: ${o}@${a} from ${e}`);let c=(0,paths_1.resolveAgentRuntimePaths)(n,r,o,a);await this.createAgentDirectories(c);let l=c.agentRoot;path.resolve(e)!==path.resolve(l)&&((0,utils_1.logInfo)(this.outputChannel,`[Agent] Copying ${e} to ${l}`),await(0,utils_1.copyDirRecursive)(e,l));let u=await this.registerAgent(o,{source:"local"});return await this.syncService.seedAgentDataIfNeeded(n,o,this.outputChannel),(0,utils_1.logInfo)(this.outputChannel,`[Agent] Successfully installed: ${o}@${a}`),u}async uninstall(e){let n=this.getWorkspaceRoot(),r=this.getStorageUri();if((0,paths_1.isDefaultAgent)(e))throw new Error("Cannot uninstall the default agent");(0,utils_1.logInfo)(this.outputChannel,`[Agent] Uninstalling: ${e}`);let s=(0,paths_1.resolveAgentRuntimePaths)(n,r,e);await(0,utils_1.pathExists)(s.agentRoot)&&(await fs_1.promises.rm(s.agentRoot,{recursive:!0,force:!0}),(0,utils_1.logInfo)(this.outputChannel,`[Agent] Removed directory: ${s.agentRoot}`)),await(0,utils_1.pathExists)(s.codexHome)&&await fs_1.promises.rm(s.codexHome,{recursive:!0,force:!0}),await(0,utils_1.pathExists)(s.claudeConfigDir)&&await fs_1.promises.rm(s.claudeConfigDir,{recursive:!0,force:!0}),await this.syncService.removeInstalledAgent(n,e,this.outputChannel);try{await getVscode().commands.executeCommand("agentide.packsChanged")}catch{}(0,utils_1.logInfo)(this.outputChannel,`[Agent] Successfully uninstalled: ${e}`)}async listInstalled(){let e=this.getWorkspaceRoot();return this.syncService.loadInstalledAgents(e)}async getInstalledAgent(e){return(await this.listInstalled()).find(r=>r.id===e)}async isInstalled(e){return await this.getInstalledAgent(e)!==void 0}async cleanupStaleAgents(){let e=this.getWorkspaceRoot(),n=await this.listInstalled(),r=[];for(let s of n){let i=(0,paths_1.getAgentManifestPath)(e,s.id);await(0,utils_1.pathExists)(i)||r.push(s.id)}for(let s of r)(0,utils_1.logInfo)(this.outputChannel,`[Agent] Removing stale entry: ${s} (folder missing)`),await this.syncService.removeInstalledAgent(e,s,this.outputChannel);if(r.length>0){(0,utils_1.logInfo)(this.outputChannel,`[Agent] Cleaned up ${r.length} stale agent(s)`);try{await getVscode().commands.executeCommand("agentide.packsChanged")}catch{}}return r}async listInstalledWithCleanup(e=!0){return e&&await this.cleanupStaleAgents(),this.listInstalled()}getAgentRuntimePaths(e,n){let r=this.getWorkspaceRoot(),s=this.getStorageUri();return(0,paths_1.resolveAgentRuntimePaths)(r,s,e,n)}async createAgentDirectories(e){await fs_1.promises.mkdir(e.agentRoot,{recursive:!0}),await fs_1.promises.mkdir(e.rulesDir,{recursive:!0}),await fs_1.promises.mkdir(e.skillsDir,{recursive:!0}),await fs_1.promises.mkdir(e.mcpDir,{recursive:!0}),await fs_1.promises.mkdir(e.codexHome,{recursive:!0}),await fs_1.promises.mkdir(e.claudeConfigDir,{recursive:!0})}async buildInstalledAgent(e,n,r){let s=(0,paths_1.getAgentManifestPath)(e,n),i=await(0,manifest_1.loadAgentManifest)(s),o=await(0,utils_1.readFileSha256)(s),a=r?.source??((0,paths_1.isDefaultAgent)(n)?"builtin":"local"),c=r?.agentRootOverride??`${paths_1.AGENT_CONSTANTS.AGENTS_DIR}/${n}`;return{id:n,version:i.metadata.version,source:a,installedAt:new Date().toISOString(),manifestHash:o.sha256,featureSetHash:o.sha256,skillsSignature:o.sha256,promptsSignature:o.sha256,agentRoot:c,preferredEngine:i.spec.engine,preferredModel:i.spec.model,preferredCheapModel:i.spec.cheapModel,status:"active"}}async registerAgent(e,n){let r=this.getWorkspaceRoot(),s=await this.buildInstalledAgent(r,e,n);await this.syncService.updateInstalledAgent(r,s,this.outputChannel);try{await getVscode().commands.executeCommand("agentide.packsChanged")}catch{}return s}async discoverAgents(){let e=this.getWorkspaceRoot(),n=(0,paths_1.getAgentsDir)(e);if(!await(0,utils_1.pathExists)(n))return[];let r=await fs_1.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=(0,paths_1.getAgentManifestPath)(e,i.name);await(0,utils_1.pathExists)(o)&&s.push(i.name)}return s}async repairUnregisteredAgents(){let e=this.getWorkspaceRoot(),n=(0,paths_1.getAgentsDir)(e);if(!await(0,utils_1.pathExists)(n))return{registered:[],alreadyRegistered:[]};let r=await this.listInstalled(),s=new Set(r.map(c=>c.id)),i=await this.discoverAgents(),o=[],a=[];for(let c of i){if(s.has(c)){a.push(c);continue}try{await this.registerAgent(c),o.push(c),(0,utils_1.logInfo)(this.outputChannel,`[Agent] Repaired: registered untracked agent "${c}"`)}catch(l){(0,utils_1.logInfo)(this.outputChannel,`[Agent] Failed to repair agent "${c}": ${l instanceof Error?l.message:String(l)}`)}}return o.length>0&&(0,utils_1.logInfo)(this.outputChannel,`[Agent] Repair complete: ${o.length} agent(s) registered`),{registered:o,alreadyRegistered:a}}async installAgentToWorkspace(e){let n=this.getWorkspaceRoot();if(await(0,stores_1.isWorkspaceAgentAvailable)(n,e))return(0,utils_1.logInfo)(this.outputChannel,`[Agent] Agent available in workspace: ${e}`),await this.getInstalledAgent(e)||((0,utils_1.logInfo)(this.outputChannel,`[Agent] Registering untracked agent: ${e}`),await this.registerAgent(e)),await this.syncService.seedAgentDataIfNeeded(n,e,this.outputChannel),{installed:!0,hydrated:!1};if(await(0,stores_1.isAgentInUserLibrary)(e)){(0,utils_1.logInfo)(this.outputChannel,`[Agent] Hydrating from User Library: ${e}`);let r=await(0,stores_1.hydrateFromUserLibrary)(n,e,void 0,this.outputChannel);if(r)return await this.registerAgent(e,{source:"local"}),{installed:!0,hydrated:!0,version:r}}return(0,utils_1.logInfo)(this.outputChannel,`[Agent] Agent not found: ${e}`),{installed:!1,hydrated:!1}}async shareToUserLibrary(e){let n=this.getWorkspaceRoot();return(0,stores_1.promoteToUserLibrary)(n,e,this.outputChannel)}async updateFromLibrary(e,n){let r=this.getWorkspaceRoot();return(0,stores_1.updateFromUserLibrary)(r,e,n,this.outputChannel)}async duplicate(e){let n=this.getWorkspaceRoot(),r=await(0,stores_1.duplicateAgent)(n,e,this.outputChannel);return await this.registerAgent(r,{source:"local"}),r}async resetDefault(e){let n=this.getWorkspaceRoot();await(0,stores_1.resetDefaultAgent)(n,e,this.outputChannel);let r=(0,paths_1.getAgentManifestPath)(n,paths_1.AGENT_CONSTANTS.DEFAULT_AGENT_ID);await(0,utils_1.pathExists)(r)&&await this.registerAgent(paths_1.AGENT_CONSTANTS.DEFAULT_AGENT_ID,{source:"builtin"})}async listUserLibrary(){return(0,stores_1.listUserLibraryAgents)()}async checkAgentUpdate(e){let n=this.getWorkspaceRoot();return(0,stores_1.checkForUpdate)(n,e)}async getAgentSource(e){let n=this.getWorkspaceRoot();return(0,stores_1.readAgentSource)(n,e)}};exports.AgentPackManager=AgentPackManager});var ya=T((exports,module)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.getGitHubToken=getGitHubToken;exports.isGitHubAuthenticated=isGitHubAuthenticated;exports.getGitHubUser=getGitHubUser;exports.getRepo=getRepo;exports.createRepo=createRepo;exports.getReleaseByTag=getReleaseByTag;exports.getLatestRelease=getLatestRelease;exports.createRelease=createRelease;exports.downloadTarball=downloadTarball;exports.getFileContent=getFileContent;exports.putFileContent=putFileContent;exports.getDefaultBranch=getDefaultBranch;exports.getBranchSha=getBranchSha;exports.createBranch=createBranch;exports.createPullRequest=createPullRequest;exports.commitMultipleFiles=commitMultipleFiles;exports.parseGitHubSource=parseGitHubSource;exports.formatGitHubSource=formatGitHubSource;var _vscode;function getVscode(){return _vscode||(_vscode=eval("require")("vscode")),_vscode}async function getGitHubToken(t=!0,e=["repo","user"]){let n=process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN;if(n?.trim())return n.trim();let s=await getVscode().authentication.getSession("github",e,{createIfNone:t});if(!s)throw new Error("GitHub authentication required. Please sign in.");return s.accessToken}async function isGitHubAuthenticated(){try{return await getGitHubToken(!1),!0}catch{return!1}}async function getGitHubUser(){let t=await getGitHubToken(),e=await fetch("https://api.github.com/user",{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!e.ok)throw new Error(`Failed to get GitHub user: ${e.statusText}`);return e.json()}async function getRepo(t,e){let n=await getGitHubToken(),r=await fetch(`https://api.github.com/repos/${t}/${e}`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(r.status===404)return null;if(!r.ok)throw new Error(`Failed to get repo: ${r.statusText}`);return r.json()}async function createRepo(t,e,n){let r=await getGitHubToken(),s=await fetch("https://api.github.com/user/repos",{method:"POST",headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({name:t,description:e,private:n,auto_init:!1})});if(!s.ok){let i=await s.text();throw new Error(`Failed to create repo: ${i}`)}return s.json()}async function getReleaseByTag(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/releases/tags/${n}`,{headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(s.status===404)return null;if(!s.ok)throw new Error(`Failed to get release: ${s.statusText}`);return s.json()}async function getLatestRelease(t,e){let n=await getGitHubToken(),r=await fetch(`https://api.github.com/repos/${t}/${e}/releases/latest`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(r.status===404)return null;if(!r.ok)throw new Error(`Failed to get latest release: ${r.statusText}`);return r.json()}async function createRelease(t,e,n,r,s,i){let o=await getGitHubToken(),a=await fetch(`https://api.github.com/repos/${t}/${e}/releases`,{method:"POST",headers:{Authorization:`Bearer ${o}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({tag_name:n,name:r,body:s,target_commitish:i})});if(!a.ok){let c=await a.text();throw new Error(`Failed to create release: ${c}`)}return a.json()}async function downloadTarball(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/tarball/${n}`,{headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"},redirect:"follow"});if(!s.ok)throw new Error(`Failed to download tarball: ${s.statusText}`);return s.arrayBuffer()}async function getFileContent(t,e,n,r){let s=await getGitHubToken(),i=new URL(`https://api.github.com/repos/${t}/${e}/contents/${n}`);r&&i.searchParams.set("ref",r);let o=await fetch(i.toString(),{headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(o.status===404)return null;if(!o.ok)throw new Error(`Failed to get file content: ${o.statusText}`);let a=await o.json();return{content:Buffer.from(a.content,"base64").toString("utf-8"),sha:a.sha}}async function putFileContent(t,e,n,r,s,i,o){let a=await getGitHubToken(),c=await fetch(`https://api.github.com/repos/${t}/${e}/contents/${n}`,{method:"PUT",headers:{Authorization:`Bearer ${a}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({message:s,content:Buffer.from(r).toString("base64"),sha:i,branch:o})});if(!c.ok){let l=await c.text();throw new Error(`Failed to put file content: ${l}`)}}async function getDefaultBranch(t,e){let n=await getRepo(t,e);if(!n)throw new Error(`Repository ${t}/${e} not found`);return n.default_branch}async function getBranchSha(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo"}});if(!s.ok)throw new Error(`Failed to get branch ${n}: ${s.status}`);return(await s.json()).object.sha}async function createBranch(t,e,n,r){let s=await getGitHubToken(),i=await getBranchSha(t,e,r),o=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo","Content-Type":"application/json"},body:JSON.stringify({ref:`refs/heads/${n}`,sha:i})});if(!o.ok){let a=await o.text();throw new Error(`Failed to create branch ${n}: ${o.status} ${a}`)}}async function createPullRequest(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/pulls`,{method:"POST",headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo","Content-Type":"application/json"},body:JSON.stringify({title:n.title,body:n.body,head:n.head,base:n.base})});if(!s.ok){let i=await s.text();throw new Error(`Failed to create pull request: ${s.status} ${i}`)}return await s.json()}async function commitMultipleFiles(t,e,n,r,s,i){let a={Authorization:`Bearer ${await getGitHubToken(!0,i?.scopes)}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo","Content-Type":"application/json"};await new Promise(A=>setTimeout(A,500));let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:a});if(!c.ok){let A=await c.text();throw new Error(`Failed to get branch ref for ${n}: ${c.status} - ${A}`)}let u=(await c.json()).object.sha,d=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits/${u}`,{headers:a});if(!d.ok){let A=await d.text();throw new Error(`Failed to get commit ${u}: ${d.status} - ${A}`)}let p=(await d.json()).tree.sha,g=[];for(let A of r){let S=A.encoding??"utf-8",C=await fetch(`https://api.github.com/repos/${t}/${e}/git/blobs`,{method:"POST",headers:a,body:JSON.stringify({content:A.content,encoding:S})});if(!C.ok){let I=await C.text();throw new Error(`Failed to create blob for ${A.path}: ${C.status} - ${I}`)}let v=await C.json();g.push({path:A.path,mode:"100644",type:"blob",sha:v.sha})}console.log("[AgentHippo] Repo:",`${t}/${e}`),console.log("[AgentHippo] Branch:",n),console.log("[AgentHippo] Creating tree with base:",p),console.log("[AgentHippo] Tree items:",JSON.stringify(g,null,2));let _=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({base_tree:p,tree:g})});if(_.status===404&&(console.log("[AgentHippo] Retrying tree creation without base_tree..."),_=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({tree:g})})),!_.ok)return console.log("[AgentHippo] Git Data API failed, falling back to Contents API..."),await commitMultipleFilesViaContentsApi(t,e,n,r,s,a);let h=await _.json(),y=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits`,{method:"POST",headers:a,body:JSON.stringify({message:s,tree:h.sha,parents:[u]})});if(!y.ok)throw new Error(`Failed to create commit: ${y.status}`);let E=await y.json(),w=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{method:"PATCH",headers:a,body:JSON.stringify({sha:E.sha})});if(!w.ok)throw new Error(`Failed to update ref: ${w.status}`);return{sha:E.sha}}async function commitMultipleFilesViaContentsApi(t,e,n,r,s,i){let o="";for(let a of r){let c=encodeURIComponent(n),l=await fetch(`https://api.github.com/repos/${t}/${e}/contents/${a.path}?ref=${c}`,{headers:i}),u=l.ok?(await l.json()).sha:void 0,d=await fetch(`https://api.github.com/repos/${t}/${e}/contents/${a.path}`,{method:"PUT",headers:i,body:JSON.stringify({message:`${s} - ${a.path}`,content:a.encoding==="base64"?a.content:Buffer.from(a.content,"utf-8").toString("base64"),branch:n,sha:u})});if(!d.ok){let p=await d.text();throw new Error(`Failed to create file ${a.path}: ${d.status} - ${p}`)}o=(await d.json()).commit.sha,console.log(`[AgentHippo] Created ${a.path}`)}return{sha:o}}function parseGitHubSource(t){let e=t.trim();e=e.replace(/^github:\/\//,""),e=e.replace(/^https?:\/\/github\.com\//,""),e=e.replace(/\.git$/,"");let n;if(e.includes("@")){let i=e.split("@");e=i[0],n=i[1]}let[r,s]=e.split("/");if(!r||!s)throw new Error(`Invalid GitHub source: ${t}. Expected format: owner/repo[@version]`);return{owner:r,repo:s,version:n}}function formatGitHubSource(t){let e=`github://${t.owner}/${t.repo}`;return t.version&&(e+=`@${t.version}`),e}});var zm=T(Xr=>{"use strict";var _P=Xr&&Xr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),EP=Xr&&Xr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yP=Xr&&Xr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&_P(n,e,r[s]);return EP(n,e),n}})();Object.defineProperty(Xr,"__esModule",{value:!0});Xr.validateForPublish=Jm;Xr.publishToGitHub=SP;var Gd=require("fs"),qm=yP(require("path")),vn=dn(),Ym=Pi(),Jc=er(),Ni=ya(),wP=[".","..",".git",".claude",".codex",".agentide","node_modules","*.log","current.txt"],Wm=1024*1024,Yc=10*1024*1024;async function Jm(t,e){let n=[],r=[],s=(0,Jc.getAgentRoot)(t,e);if(!await(0,vn.pathExists)(s))return n.push(`Agent directory not found: ${s}`),{valid:!1,errors:n,warnings:r};let i=["agent.yaml","AGENTS.md"];for(let l of i){let u=qm.join(s,l);await(0,vn.pathExists)(u)||n.push(`Missing required file: ${l}`)}let o=(0,Jc.getAgentManifestPath)(t,e);if(await(0,vn.pathExists)(o))try{let l=await(0,Ym.loadAgentManifest)(o);l.metadata.name||n.push("agent.yaml missing metadata.name"),l.metadata.version?/^\d+\.\d+\.\d+/.test(l.metadata.version)||n.push(`Invalid version format: ${l.metadata.version}. Use semver (e.g., 1.0.0)`):n.push("agent.yaml missing metadata.version"),l.metadata.description||r.push("Consider adding a description to agent.yaml"),l.metadata.author||r.push("Consider adding an author to agent.yaml")}catch(l){n.push(`Invalid agent.yaml: ${l instanceof Error?l.message:String(l)}`)}let a=await Xm(s),c=a.reduce((l,u)=>l+u.size,0);c>Yc?n.push(`Bundle too large: ${To(c)} (max ${To(Yc)})`):c>Yc*.8&&r.push(`Bundle is ${To(c)}, approaching limit of ${To(Yc)}`);for(let l of a)l.size>Wm&&n.push(`File too large: ${l.relativePath} (${To(l.size)}, max ${To(Wm)})`);return{valid:n.length===0,errors:n,warnings:r}}async function Xm(t){let e=[];async function n(r,s){let i;try{i=await Gd.promises.readdir(r)}catch{return}for(let o of i){if(wP.some(u=>o===u||o.startsWith(".")))continue;let a=qm.join(r,o),c=s?`${s}/${o}`:o,l=await Gd.promises.stat(a);l.isDirectory()?await n(a,c):l.isFile()&&e.push({relativePath:c,absolutePath:a,size:l.size})}}return await n(t,""),e}async function SP(t,e,n){let{agentId:r,visibility:s,changelog:i}=e;(0,vn.logInfo)(n,`[Publish] Starting publish for ${r}...`);let o=await Jm(t,r);if(!o.valid)throw new Error(`Validation failed:
39
+ `).replace(/^\n+/,"");try{await writeFileIfChanged(i,p)&&logInfo(e,`[AgentIDE] Updated ${i} to ignore ${branding_1.AGENTIDE_BRAND_NAME} directories`)}catch(_){logInfo(e,`[AgentIDE] Warning: failed to write root .gitignore: ${_ instanceof Error?_.message:String(_)}`)}}async function readFileSha256(t){let e=await fs_1.promises.stat(t),n=crypto.createHash("sha256");return await(0,promises_1.pipeline)((0,fs_1.createReadStream)(t),n),{sha256:n.digest("hex"),size:e.size,mtimeMs:e.mtimeMs}}async function getFileStats(t){try{let e=await fs_1.promises.stat(t);return{size:e.size,mtimeMs:e.mtimeMs}}catch(e){if(getErrorCode(e)==="ENOENT")return;throw e}}function isCachedHashValid(t,e){if(!(!t||!e)&&t.mtimeMs===e.mtimeMs&&t.size===e.size)return t}function shortSig(t){return crypto.createHash("sha256").update(t).digest("hex").slice(0,16)}var LOCAL_TLS_HOSTNAMES=new Set(["localhost","127.0.0.1","0.0.0.0","::1","[::1]"]);function isLocalHttps(t){if(!t)return!1;try{let e=new URL(t);return e.protocol==="https:"&&LOCAL_TLS_HOSTNAMES.has(e.hostname.toLowerCase())}catch{return!1}}function applyLocalTlsBypass(t,e){return isLocalHttps(e)?(t.NODE_TLS_REJECT_UNAUTHORIZED="0",!0):!1}function getOverrideOpenAIBaseUrl(t,e){if(!e)return;let n=e.getCustomProviders(),r=t.replace(/\/$/,"");for(let s of Object.values(n))if(s.baseUrl){let i=s.baseUrl.replace(/\/$/,"");if(r===i&&s.overrideOpenAIBaseUrl)return s.overrideOpenAIBaseUrl.trim()}}function inferModelProvider(t){return t&&/claude|anthropic/i.test(t)?"anthropic":"openai"}function resolveApiRouting(t,e,n,r){let s=t.useLiteLLM===!0,i=t.baseUrl||(s?e.litellmBaseUrl:void 0),o=n==="anthropic"?e.anthropicApiKey:e.openaiApiKey,a=s?t.apiKey||e.litellmApiKey||"sk-dummy":t.apiKey||o||"",c=i;if(i){let l=getOverrideOpenAIBaseUrl(i,r);l&&(c=l)}return{apiKey:a,baseUrl:i,openaiBaseUrl:c,useLiteLLM:s}}function getExplicitConfigValue(t,e){let n=t.inspect(e);if(n)return n.workspaceFolderValue??n.workspaceValue??n.globalValue}function getAgentideEngineSettings(t){return t?t.getEngineSettings():{claudeMaxThinkingTokens:0}}async function emitStreamEvent(t){try{await getVscode().commands.executeCommand("agentide.streamCallback",t)}catch(e){console.error("[AgentIDE Extension] Failed to emit stream event:",e)}}var STREAM_COALESCE_WINDOW_MS=40,STREAM_COALESCE_MIN_CHARS=120;function flushCoalescedBuffers(t,e){let n=[];return e.markdownBuffer&&(n.push(emitStreamEvent({streamId:t,type:"markdown",data:e.markdownBuffer})),e.markdownBuffer=""),e.thinkingBuffer&&(n.push(emitStreamEvent({streamId:t,type:"thinking",data:e.thinkingBuffer})),e.thinkingBuffer=""),e.flushTimer&&(clearTimeout(e.flushTimer),e.flushTimer=void 0),Promise.all(n).then(()=>{})}function ensureFlushTimer(t,e){e.flushTimer||(e.flushTimer=setTimeout(()=>{flushCoalescedBuffers(t,e)},STREAM_COALESCE_WINDOW_MS))}function createIPCStreamEmitter(t){let e={markdownBuffer:"",thinkingBuffer:"",flushTimer:void 0};return{async thinking(n){if(n){if(e.thinkingBuffer+=n,e.thinkingBuffer.length>=STREAM_COALESCE_MIN_CHARS){await flushCoalescedBuffers(t,e);return}ensureFlushTimer(t,e)}},async text(n){if(n){if(e.markdownBuffer+=n,e.markdownBuffer.length>=STREAM_COALESCE_MIN_CHARS){await flushCoalescedBuffers(t,e);return}ensureFlushTimer(t,e)}},async toolStart(n,r,s,i){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"tool_use",toolName:n,toolCallId:s,data:r||"",metadata:i})},async toolEnd(n,r,s,i,o){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"tool_end",toolName:n,toolCallId:r,data:s||"",metadata:{...o&&typeof o=="object"?o:{},isError:i}})},async progress(n){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"progress",data:n})},async question(n){return await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"question",metadata:n}),{selected:[],freeText:null,declined:!0}},async error(n){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"error",data:n})},async done(){await flushCoalescedBuffers(t,e),await emitStreamEvent({streamId:t,type:"done"})}}}function computeTextDelta(t,e,n){let r=n.get(t)??"",s=e.startsWith(r)?e.slice(r.length):e;return n.set(t,e),s}function createDeferred(){let t,e;return{promise:new Promise((r,s)=>{t=r,e=s}),resolve:t,reject:e}}function stableAdditionalDirs(t){return(t??[]).slice().filter(Boolean).sort()}var paths_1=bi();Object.defineProperty(exports,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return paths_1.getAnalyticsScriptsDir}});var CREATE_CMD_PATTERN=/(?:cat\s*>[^>]|echo\s*>[^>]|touch\s+|>\s*[^>]|<<\s*['"]?EOF)/,EXCLUDED_PREFIXES=["/tmp/","/var/","/dev/"],EXCLUDED_SUFFIXES=[".tmp",".bak"];function extractFilePaths(t,e){let n=t.matchAll(/(?:^|[\s'"`;|&()=><])([./]*(?:[\w.\-]+\/)*[\w.\-]+\.[\w]+)(?=[\s'"`;|&()=><]|$)/g),r=new Set;for(let s of n){let i=s[1].replace(/['"]/g,"").trim();!i||i.startsWith("-")||i.includes("..")||EXCLUDED_PREFIXES.some(o=>i.startsWith(o))||EXCLUDED_SUFFIXES.some(o=>i.endsWith(o))||r.add(i.startsWith("/")?i:`${e}/${i.replace(/^\.\//,"")}`)}return[...r]}function isCreateCommand(t){return CREATE_CMD_PATTERN.test(t)}function normalizeFileChangeKind(t){switch(t){case"add":case"create":return"create";case"update":case"modify":return"modify";case"delete":return"delete";default:return}}var BINARY_EXTENSIONS=new Set([".pdf",".doc",".docx",".xls",".xlsx",".ppt",".pptx",".zip",".tar",".gz",".rar",".7z",".png",".jpg",".jpeg",".gif",".bmp",".ico",".webp",".svg",".mp3",".mp4",".wav",".avi",".mov",".mkv",".exe",".dll",".so",".dylib",".bin",".woff",".woff2",".ttf",".otf",".eot",".pyc",".class",".o",".a"]);function isBinaryFile(t){let e=t.lastIndexOf(".");return e===-1?!1:BINARY_EXTENSIONS.has(t.slice(e))}});var $m=T(Bc=>{"use strict";Object.defineProperty(Bc,"__esModule",{value:!0});Bc.VSCodeSessionStore=void 0;var Rd=class{globalState;constructor(e){this.globalState=e}get(e){return this.globalState.get(e)}async set(e,n){await this.globalState.update(e,n)}};Bc.VSCodeSessionStore=Rd});var Oi=T(Tt=>{"use strict";var _I=Tt&&Tt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),EI=Tt&&Tt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yI=Tt&&Tt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&_I(n,e,r[s]);return EI(n,e),n}})();Object.defineProperty(Tt,"__esModule",{value:!0});Tt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=void 0;Tt.initSessionStore=bI;Tt.initSessionStoreWithStore=Mm;Tt._getSessionStore=vI;Tt._resetSessionStore=OI;Tt.upsertPersistedSession=II;Tt.touchPersistedSession=PI;Tt.getPersistedSession=NI;Tt.runSessionMaintenance=RI;Tt.buildConversationKey=kI;Tt.withConversationLock=$I;var wI=yI(require("crypto")),SI=dn(),AI=$m(),Lm="agentide.providerSessions.v1",Dm=200,TI=1e3*60*60*24*14,rr={},Ea;function bI(t){Mm(new AI.VSCodeSessionStore(t.globalState))}function Mm(t){Ea=t,rr=t.get(Lm)??{},Vc(Date.now()),Kc()}function vI(){return Ea}function OI(){Ea=void 0,rr={}}function Vc(t){for(let[n,r]of Object.entries(rr))t-r.lastUsedAt>TI&&delete rr[n];let e=Object.keys(rr);if(!(e.length<=Dm)){e.sort((n,r)=>rr[n].lastUsedAt-rr[r].lastUsedAt);for(let n=0;n<e.length-Dm;n++)delete rr[e[n]]}}async function Kc(){if(Ea)try{await Ea.set(Lm,rr)}catch{}}async function II(t,e){rr[t]=e,Vc(Date.now()),await Kc()}async function PI(t){let e=rr[t];e&&(e.lastUsedAt=Date.now(),Vc(e.lastUsedAt),await Kc())}function NI(t){return rr[t]}function RI(){Vc(Date.now()),Kc()}function CI(t){return JSON.stringify({workspaceRoot:t.workspaceRoot,additionalDirectories:(0,SI.stableAdditionalDirs)(t.additionalDirectories),agentPackId:t.agentPackId??"default"})}function kI(t,e){let n=e.sessionId?.trim(),r=e.contextSessionId?.trim()||n,s=!r,i=r||`ephemeral-${Date.now()}-${Math.random().toString(36).slice(2)}`,o=n||i,a=e.agentPackId??"default",c=CI(e),l=wI.createHash("sha256").update(c).digest("hex").slice(0,16);return{key:`${t}:${i}:${a}:${l}`,chatSessionId:o,isEphemeral:s,signatureHash:l,signatureRaw:c,agentPackId:a}}Tt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=1e3*60*60*48;var Fc=new Map;function $I(t,e,n){let r=Fc.get(t)??Promise.resolve(),s,i=new Promise(y=>{s=y}),o=r.then(()=>i);Fc.set(t,o);let a=n?.label?` (${n.label})`:"",c=typeof n?.timeoutMs=="number"?n.timeoutMs:void 0,l=n?.signal,u,f,d=!1,g=l?new Promise((y,E)=>{if(l.aborted){E(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`));return}u=()=>E(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`)),l.addEventListener("abort",u,{once:!0})}):void 0,p=c&&c>0?new Promise((y,E)=>{f=setTimeout(()=>{d=!0,n?.onTimeout?.(),E(new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`))},c)}):void 0,_=[r,g,p].filter(Boolean);return Promise.race(_).then(async()=>{if(l?.aborted)throw new Error(`[AgentIDE] Cancelled before running conversation work${a}`);if(d)throw new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`);let E=[e(),p].filter(Boolean);return await Promise.race(E)}).finally(()=>{try{f&&clearTimeout(f),l&&u&&l.removeEventListener("abort",u)}finally{s(),Fc.get(t)===o&&Fc.delete(t)}})}});var Ii=T(bn=>{"use strict";var DI=bn&&bn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),LI=bn&&bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),MI=bn&&bn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&DI(n,e,r[s]);return LI(n,e),n}})();Object.defineProperty(bn,"__esModule",{value:!0});bn.buildLiteLLMMetadataHeaders=HI;bn.resolveAnalyticsProjectId=jI;bn.generateRequestId=xI;bn.persistSessionIfNeeded=BI;bn.touchSessionIfNeeded=FI;bn.getPersistedSessionId=VI;var GI=So(),Wc=Oi(),UI=MI(require("path"));function HI(t,e){if(!t)return[];let n=[],r=(0,GI.hashIdentity)(e.analyticsUserId);return r&&(n.push(`x-litellm-metadata-user-id: ${r}`),n.push(`langfuse_trace_user_id: ${r}`)),e.sessionId?.trim()&&(n.push(`x-litellm-metadata-session-id: ${e.sessionId.trim()}`),n.push(`langfuse_session_id: ${e.sessionId.trim()}`)),e.analyticsProjectId?.trim()&&n.push(`x-litellm-metadata-project-id: ${e.analyticsProjectId.trim()}`),e.agentId?.trim()&&n.push(`x-litellm-metadata-agent-id: ${e.agentId.trim()}`),e.agentVersion?.trim()&&n.push(`x-litellm-metadata-agent-version: ${e.agentVersion.trim()}`),e.source?.trim()&&n.push(`x-litellm-metadata-source: ${e.source.trim()}`),e.engine?.trim()&&n.push(`x-litellm-metadata-engine: ${e.engine.trim()}`),e.requestId?.trim()&&n.push(`x-litellm-metadata-request-id: ${e.requestId.trim()}`),e.policyVersion?.trim()&&n.push(`x-litellm-metadata-policy-version: ${e.policyVersion.trim()}`),e.packDigest?.trim()&&n.push(`x-litellm-metadata-pack-digest: ${e.packDigest.trim()}`),e.engineVersion?.trim()&&n.push(`x-litellm-metadata-engine-version: ${e.engineVersion.trim()}`),e.tier!==void 0&&n.push(`x-litellm-metadata-tier: ${e.tier}`),e.instanceId?.trim()&&n.push(`x-litellm-metadata-instance-id: ${e.instanceId.trim()}`),n}function jI(t,e){let n=t?.trim();if(n)return n;if(!e)return;let r=e.replace(/[\\/]+$/,"").trim();return r&&UI.basename(r).trim()||void 0}function xI(){return`req-${Math.random().toString(16).slice(2,10)}`}async function BI(t,e,n,r){if(e.isEphemeral)return;let s=Date.now(),i=(0,Wc.getPersistedSession)(e.key);await(0,Wc.upsertPersistedSession)(e.key,{provider:t,id:n,chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,signatureRaw:e.signatureRaw,agentPackId:r?.agentPackId??e.agentPackId,agentPackVersion:r?.agentPackVersion,createdAt:i?.createdAt??s,lastUsedAt:s})}function FI(t){t.isEphemeral||(0,Wc.touchPersistedSession)(t.key)}function VI(t,e){let n=(0,Wc.getPersistedSession)(e);return n?.provider===t?n.id:void 0}});var Cd=T(Ir=>{"use strict";Object.defineProperty(Ir,"__esModule",{value:!0});Ir.DEFAULT_PERMISSIONS=void 0;Ir.getDefaultPermissions=Gm;Ir._resetMappingConfigCache=KI;Ir.parsePermissions=Um;Ir.parseManifestPermissions=WI;Ir.enforcePermissions=qI;Ir.toClaudeOptions=YI;Ir.toCodexOptions=JI;Ir.DEFAULT_PERMISSIONS={fileAccess:"full"};var Zs={defaults:{fileAccess:"full"},claude:{readOnly:{permissionMode:"plan",allowDangerouslySkipPermissions:!1},workspaceWrite:{permissionMode:"acceptEdits",allowDangerouslySkipPermissions:!1},fullAccess:{permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0}},codex:{approvalPolicy:"never",readOnly:{sandboxMode:"read-only"},workspaceWrite:{sandboxMode:"workspace-write"},fullAccess:{sandboxMode:"danger-full-access"}}};function Gm(){return{...Zs.defaults}}function KI(){}function Um(t){let e=t?.spec?.permissions,n=Gm();return{fileAccess:e?.fileAccess??n.fileAccess}}function WI(t){return Um(t)}function qI(t,e){return{fileAccess:e.fileAccess}}function YI(t,e){return{...t.fileAccess==="read-only"?Zs.claude.readOnly:t.fileAccess==="workspace-write"?Zs.claude.workspaceWrite:Zs.claude.fullAccess,additionalDirectories:t.fileAccess==="full"?void 0:e}}function JI(t,e){let n=t.fileAccess==="read-only"?Zs.codex.readOnly:t.fileAccess==="workspace-write"?Zs.codex.workspaceWrite:Zs.codex.fullAccess;return{approvalPolicy:Zs.codex.approvalPolicy,...n,additionalDirectories:e}}});var Pi=T(Gn=>{"use strict";var XI=Gn&&Gn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),zI=Gn&&Gn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),QI=Gn&&Gn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&XI(n,e,r[s]);return zI(n,e),n}})();Object.defineProperty(Gn,"__esModule",{value:!0});Gn.parseYaml=$d;Gn.stringifyYaml=jm;Gn.updateManifestName=eP;Gn.loadAgentManifest=tP;Gn.parseAgentManifest=xm;var kd=require("fs"),Hm=QI(require("path")),ZI=ot();function $d(t){return require("js-yaml").load(t)}function jm(t){return require("js-yaml").dump(t,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}async function eP(t,e){let n=await kd.promises.readFile(t,"utf8"),r=$d(n);r&&typeof r=="object"&&r.metadata&&(r.metadata.name=e);let s=jm(r);await kd.promises.writeFile(t,s,"utf8")}async function tP(t){let e=await kd.promises.readFile(t,"utf8");return xm(e,t)}function xm(t,e){let n=$d(t),r=e?` (${e})`:"";if(!n?.metadata?.name)throw new Error(`Manifest missing metadata.name${r}`);if(!n.metadata.version)throw new Error(`Manifest missing metadata.version${r}`);if(!n.spec?.engine)throw new Error(`Manifest missing spec.engine${r}`);return nP(n,r),n}function nP(t,e){let n=t.spec?.data;if(!n)return;let r=(s,i,o)=>{let c=(s??o).trim();if(!c)throw new Error(`Manifest spec.data.${i} cannot be empty${e}`);if(Hm.isAbsolute(c))throw new Error(`Manifest spec.data.${i} must be relative (not absolute)${e}`);if(/^(https?:\/\/|git@|ssh:\/\/)/i.test(c))throw new Error(`Manifest spec.data.${i} must be a local relative path${e}`);let l=Hm.posix.normalize(c.replace(/\\/g,"/"));if(l===".."||l.startsWith("../"))throw new Error(`Manifest spec.data.${i} cannot escape parent directories${e}`)};r(n.sourcePath,"sourcePath","./data"),r(n.workspacePath,"workspacePath",`${ZI.AGENTIDE_DIR_NAME}/data/${t.metadata.name}`)}});var Md=T(kt=>{"use strict";var rP=kt&&kt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),sP=kt&&kt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),iP=kt&&kt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&rP(n,e,r[s]);return sP(n,e),n}})();Object.defineProperty(kt,"__esModule",{value:!0});kt.listUserLibraryAgents=cP;kt.isWorkspaceAgentAvailable=lP;kt.isAgentInUserLibrary=uP;kt.hydrateFromUserLibrary=Fm;kt.promoteToUserLibrary=dP;kt.readAgentSource=Vm;kt.checkForUpdate=fP;kt.updateFromUserLibrary=pP;kt.duplicateAgent=hP;kt.resetDefaultAgent=mP;var at=require("fs"),rt=iP(require("path")),ue=dn(),he=er(),Ao=Pi(),Bm=ot();function oP(t,e){let n=o=>o.split(".").map(a=>{let c=parseInt(a,10);return isNaN(c)?0:c}),r=n(t),s=n(e),i=Math.max(r.length,s.length);for(let o=0;o<i;o++){let a=r[o]??0,c=s[o]??0;if(a!==c)return a-c}return 0}function aP(t){return[...t].sort(oP)}async function Dd(t,e){await at.promises.mkdir(e,{recursive:!0});let n=await at.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=rt.join(t,r.name),i=rt.join(e,r.name);if(r.isDirectory()){if(r.name.startsWith("."))continue;await Dd(s,i)}else await at.promises.copyFile(s,i)}}async function cP(){let t=(0,he.getUserAgentsDir)();if(!await(0,ue.pathExists)(t))return[];let e=await at.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=r.name,i=(0,he.getUserAgentRoot)(s),o=await Ld(i);if(o.length===0)continue;let a=await qc(s),c=a||o[o.length-1],l=(0,he.getUserAgentVersionDir)(s,c),u=rt.join(l,he.AGENT_CONSTANTS.MANIFEST_FILE),f,d;try{let g=await(0,Ao.loadAgentManifest)(u);f=g.metadata.description,d=g.spec.engine}catch{}n.push({id:s,versions:o,currentVersion:a,description:f,preferredEngine:d})}return n}async function Ld(t){try{let e=await at.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=rt.join(t,r.name,he.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ue.pathExists)(s))try{await(0,Ao.loadAgentManifest)(s),n.push(r.name)}catch{}}return aP(n)}catch{return[]}}async function qc(t){let e=(0,he.getUserAgentCurrentPath)(t);try{let n=(await at.promises.readFile(e,"utf8")).trim();if(!n)return;let r=(0,he.getUserAgentVersionDir)(t,n),s=rt.join(r,he.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,ue.pathExists)(s))return;try{return await(0,Ao.loadAgentManifest)(s),n}catch{return}}catch{}}async function lP(t,e){let n=(0,he.getAgentManifestPath)(t,e);if(!await(0,ue.pathExists)(n))return!1;try{return(await(0,Ao.loadAgentManifest)(n)).metadata.name===e}catch{return!1}}async function uP(t){if(await qc(t))return!0;let n=(0,he.getUserAgentRoot)(t);return(await Ld(n)).length>0}async function Fm(t,e,n,r){let s=n,i=n??"current";if(!s&&(s=await qc(e),!s)){let d=(0,he.getUserAgentRoot)(e),g=await Ld(d);if(g.length===0){(0,ue.logInfo)(r,`[AgentStores] Agent not in User Library: ${e}`);return}s=g[g.length-1],i=s}let o=(0,he.getUserAgentVersionDir)(e,s);if(!await(0,ue.pathExists)(o)){(0,ue.logInfo)(r,`[AgentStores] Version not found in User Library: ${e}@${s}`);return}let a=(0,he.getAgentRoot)(t,e);(0,ue.logInfo)(r,`[AgentStores] Hydrating ${e}@${s} from User Library`),await(0,ue.pathExists)(a)&&((0,ue.logInfo)(r,`[AgentStores] Clearing existing directory: ${a}`),await at.promises.rm(a,{recursive:!0,force:!0})),await(0,ue.copyDirRecursive)(o,a);let c=rt.join(a,he.AGENT_CONSTANTS.MANIFEST_FILE),{sha256:l}=await(0,ue.readFileSha256)(c),u={source:"user-library",agentId:e,version:s,resolvedFrom:i,sha256:l,hydratedAt:new Date().toISOString()},f=rt.join(a,he.AGENT_CONSTANTS.SOURCE_FILE);return await at.promises.writeFile(f,JSON.stringify(u,null,2),"utf8"),(0,ue.logInfo)(r,`[AgentStores] Hydrated ${e}@${s} to ${a}`),s}async function dP(t,e,n){if(e===he.AGENT_CONSTANTS.DEFAULT_AGENT_ID)throw new Error("Cannot promote the default agent to User Library");let r=(0,he.getAgentRoot)(t,e),s=(0,he.getAgentManifestPath)(t,e);if(!await(0,ue.pathExists)(s))throw new Error(`Agent not found: ${e}`);let o=(await(0,Ao.loadAgentManifest)(s)).metadata.version,a=(0,he.getUserAgentVersionDir)(e,o),c=rt.join(a,he.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ue.pathExists)(c)){let u=await(0,ue.readFileSha256)(s),f=await(0,ue.readFileSha256)(c);if(u.sha256===f.sha256)return(0,ue.logInfo)(n,`[AgentStores] ${e}@${o} already in User Library (identical)`),o;throw new Error(`Version conflict: ${e}@${o} already exists in User Library with different content. Bump the version in agent.yaml and try again.`)}(0,ue.logInfo)(n,`[AgentStores] Promoting ${e}@${o} to User Library`),await at.promises.mkdir(a,{recursive:!0}),await Dd(r,a);let l=(0,he.getUserAgentCurrentPath)(e);return await at.promises.writeFile(l,o,"utf8"),(0,ue.logInfo)(n,`[AgentStores] Promoted ${e}@${o} to ${a}`),o}async function Vm(t,e){let n=rt.join((0,he.getAgentRoot)(t,e),he.AGENT_CONSTANTS.SOURCE_FILE);try{let r=await at.promises.readFile(n,"utf8");return JSON.parse(r)}catch{return}}async function fP(t,e){let n=await Vm(t,e);if(!n||n.source!=="user-library")return;let r=await qc(e);if(r&&r!==n.version)return r}async function pP(t,e,n,r){let s=(0,he.getAgentRoot)(t,e),i=new Date().toISOString().replace(/[:.]/g,"-"),o=rt.join(rt.dirname(s),`.${e}.backup-${i}`);await(0,ue.pathExists)(s)&&((0,ue.logInfo)(r,`[AgentStores] Backing up ${e} to ${o}`),await(0,ue.copyDirRecursive)(s,o),await at.promises.rm(s,{recursive:!0,force:!0}));let a=await Fm(t,e,n,r);if(!a)throw await(0,ue.pathExists)(o)&&((0,ue.logInfo)(r,"[AgentStores] Restoring backup after failed update"),await(0,ue.copyDirRecursive)(o,s)),new Error(`Failed to update ${e} from User Library`);return(0,ue.logInfo)(r,`[AgentStores] Updated ${e} to ${a}`),a}async function gP(t,e){let n=`${e}-copy`;if(!await(0,ue.pathExists)((0,he.getAgentRoot)(t,n)))return n;for(let r=2;r<100;r++){let s=`${e}-${r}`;if(!await(0,ue.pathExists)((0,he.getAgentRoot)(t,s)))return s}return`${e}-${Date.now()}`}async function hP(t,e,n){let r=(0,he.getAgentRoot)(t,e),s=(0,he.getAgentManifestPath)(t,e);if(!await(0,ue.pathExists)(s))throw new Error(`Agent not found: ${e}`);let i=await gP(t,e),o=(0,he.getAgentRoot)(t,i);(0,ue.logInfo)(n,`[AgentStores] Duplicating ${e} to ${i}`),await Dd(r,o);let a=(0,he.getAgentManifestPath)(t,i);await(0,Ao.updateManifestName)(a,i);let c=rt.join(o,he.AGENT_CONSTANTS.SOURCE_FILE);try{await at.promises.rm(c,{force:!0})}catch{}return(0,ue.logInfo)(n,`[AgentStores] Duplicated ${e} to ${i}`),i}async function mP(t,e,n){let r=(0,he.getAgentRoot)(t,he.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=new Date().toISOString().replace(/[:.]/g,"-"),i=rt.join(rt.dirname(r),`.default.backup-${s}`);if(await(0,ue.pathExists)(r)&&((0,ue.logInfo)(n,`[AgentStores] Backing up default agent to ${i}`),await(0,ue.copyDirRecursive)(r,i),await at.promises.rm(r,{recursive:!0,force:!0})),await at.promises.mkdir(r,{recursive:!0}),await at.promises.mkdir(rt.join(r,he.AGENT_CONSTANTS.RULES_DIR),{recursive:!0}),await at.promises.mkdir(rt.join(r,he.AGENT_CONSTANTS.SKILLS_DIR),{recursive:!0}),e){let c=rt.join(e,"rules","AGENTS.md"),l=rt.join(r,he.AGENT_CONSTANTS.AGENTS_MD);if(await(0,ue.pathExists)(c)){let g=await at.promises.readFile(c,"utf8");await at.promises.writeFile(l,(0,Bm.applyBrandingTokens)(g),"utf8"),(0,ue.logInfo)(n,"[AgentStores] Restored AGENTS.md from bundled templates")}let u=rt.join(e,he.AGENT_CONSTANTS.GHOST_TEXT_FILE),f=rt.join(r,he.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,ue.pathExists)(u)&&!await(0,ue.pathExists)(f)){let g=await at.promises.readFile(u,"utf8");await at.promises.writeFile(f,g,"utf8"),(0,ue.logInfo)(n,"[AgentStores] Restored GHOST_TEXT.md from bundled templates")}let d=rt.join(e,"skills");if(await(0,ue.pathExists)(d)){let g=await at.promises.readdir(d,{withFileTypes:!0});for(let p of g){if(!p.isDirectory())continue;let _=rt.join(d,p.name),h=rt.join(r,he.AGENT_CONSTANTS.SKILLS_DIR,p.name);await(0,ue.copyDirRecursiveWithTransform)(_,h,Bm.applyBrandingTokens),(0,ue.logInfo)(n,`[AgentStores] Restored skill: ${p.name}`)}}}let o=(0,he.generateDefaultAgentYaml)({model:"claude"}),a=rt.join(r,he.AGENT_CONSTANTS.MANIFEST_FILE);await at.promises.writeFile(a,o,"utf8"),(0,ue.logInfo)(n,"[AgentStores] Reset default agent complete")}});var Km=T((exports,module)=>{"use strict";var __createBinding=exports&&exports.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),__setModuleDefault=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),__importStar=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&__createBinding(n,e,r[s]);return __setModuleDefault(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.AgentPackManager=void 0;var fs_1=require("fs"),path=__importStar(require("path")),_vscode;function getVscode(){return _vscode||(_vscode=eval("require")("vscode")),_vscode}var paths_1=er(),manifest_1=Pi(),utils_1=dn(),stores_1=Md(),AgentPackManager=class{syncService;getWorkspaceRoot;getStorageUri;outputChannel;constructor(e,n,r,s){this.syncService=e,this.getWorkspaceRoot=n,this.getStorageUri=r,this.outputChannel=s}async installFromLocal(e){let n=this.getWorkspaceRoot(),r=this.getStorageUri(),s=path.join(e,paths_1.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,utils_1.pathExists)(s))throw new Error(`No agent.yaml found at ${e}`);let i=await(0,manifest_1.loadAgentManifest)(s),o=i.metadata.name,a=i.metadata.version;if((0,paths_1.isDefaultAgent)(o))throw new Error('Cannot install an agent with reserved ID "default"');(0,utils_1.logInfo)(this.outputChannel,`[Agent] Installing: ${o}@${a} from ${e}`);let c=(0,paths_1.resolveAgentRuntimePaths)(n,r,o,a);await this.createAgentDirectories(c);let l=c.agentRoot;path.resolve(e)!==path.resolve(l)&&((0,utils_1.logInfo)(this.outputChannel,`[Agent] Copying ${e} to ${l}`),await(0,utils_1.copyDirRecursive)(e,l));let u=await this.registerAgent(o,{source:"local"});return await this.syncService.seedAgentDataIfNeeded(n,o,this.outputChannel),(0,utils_1.logInfo)(this.outputChannel,`[Agent] Successfully installed: ${o}@${a}`),u}async uninstall(e){let n=this.getWorkspaceRoot(),r=this.getStorageUri();if((0,paths_1.isDefaultAgent)(e))throw new Error("Cannot uninstall the default agent");(0,utils_1.logInfo)(this.outputChannel,`[Agent] Uninstalling: ${e}`);let s=(0,paths_1.resolveAgentRuntimePaths)(n,r,e);await(0,utils_1.pathExists)(s.agentRoot)&&(await fs_1.promises.rm(s.agentRoot,{recursive:!0,force:!0}),(0,utils_1.logInfo)(this.outputChannel,`[Agent] Removed directory: ${s.agentRoot}`)),await(0,utils_1.pathExists)(s.codexHome)&&await fs_1.promises.rm(s.codexHome,{recursive:!0,force:!0}),await(0,utils_1.pathExists)(s.claudeConfigDir)&&await fs_1.promises.rm(s.claudeConfigDir,{recursive:!0,force:!0}),await this.syncService.removeInstalledAgent(n,e,this.outputChannel);try{await getVscode().commands.executeCommand("agentide.packsChanged")}catch{}(0,utils_1.logInfo)(this.outputChannel,`[Agent] Successfully uninstalled: ${e}`)}async listInstalled(){let e=this.getWorkspaceRoot();return this.syncService.loadInstalledAgents(e)}async getInstalledAgent(e){return(await this.listInstalled()).find(r=>r.id===e)}async isInstalled(e){return await this.getInstalledAgent(e)!==void 0}async cleanupStaleAgents(){let e=this.getWorkspaceRoot(),n=await this.listInstalled(),r=[];for(let s of n){let i=(0,paths_1.getAgentManifestPath)(e,s.id);await(0,utils_1.pathExists)(i)||r.push(s.id)}for(let s of r)(0,utils_1.logInfo)(this.outputChannel,`[Agent] Removing stale entry: ${s} (folder missing)`),await this.syncService.removeInstalledAgent(e,s,this.outputChannel);if(r.length>0){(0,utils_1.logInfo)(this.outputChannel,`[Agent] Cleaned up ${r.length} stale agent(s)`);try{await getVscode().commands.executeCommand("agentide.packsChanged")}catch{}}return r}async listInstalledWithCleanup(e=!0){return e&&await this.cleanupStaleAgents(),this.listInstalled()}getAgentRuntimePaths(e,n){let r=this.getWorkspaceRoot(),s=this.getStorageUri();return(0,paths_1.resolveAgentRuntimePaths)(r,s,e,n)}async createAgentDirectories(e){await fs_1.promises.mkdir(e.agentRoot,{recursive:!0}),await fs_1.promises.mkdir(e.rulesDir,{recursive:!0}),await fs_1.promises.mkdir(e.skillsDir,{recursive:!0}),await fs_1.promises.mkdir(e.mcpDir,{recursive:!0}),await fs_1.promises.mkdir(e.codexHome,{recursive:!0}),await fs_1.promises.mkdir(e.claudeConfigDir,{recursive:!0})}async buildInstalledAgent(e,n,r){let s=(0,paths_1.getAgentManifestPath)(e,n),i=await(0,manifest_1.loadAgentManifest)(s),o=await(0,utils_1.readFileSha256)(s),a=r?.source??((0,paths_1.isDefaultAgent)(n)?"builtin":"local"),c=r?.agentRootOverride??`${paths_1.AGENT_CONSTANTS.AGENTS_DIR}/${n}`;return{id:n,version:i.metadata.version,source:a,installedAt:new Date().toISOString(),manifestHash:o.sha256,featureSetHash:o.sha256,skillsSignature:o.sha256,promptsSignature:o.sha256,agentRoot:c,preferredEngine:i.spec.engine,preferredModel:i.spec.model,preferredCheapModel:i.spec.cheapModel,status:"active"}}async registerAgent(e,n){let r=this.getWorkspaceRoot(),s=await this.buildInstalledAgent(r,e,n);await this.syncService.updateInstalledAgent(r,s,this.outputChannel);try{await getVscode().commands.executeCommand("agentide.packsChanged")}catch{}return s}async discoverAgents(){let e=this.getWorkspaceRoot(),n=(0,paths_1.getAgentsDir)(e);if(!await(0,utils_1.pathExists)(n))return[];let r=await fs_1.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(!i.isDirectory()||i.name.startsWith("."))continue;let o=(0,paths_1.getAgentManifestPath)(e,i.name);await(0,utils_1.pathExists)(o)&&s.push(i.name)}return s}async repairUnregisteredAgents(){let e=this.getWorkspaceRoot(),n=(0,paths_1.getAgentsDir)(e);if(!await(0,utils_1.pathExists)(n))return{registered:[],alreadyRegistered:[]};let r=await this.listInstalled(),s=new Set(r.map(c=>c.id)),i=await this.discoverAgents(),o=[],a=[];for(let c of i){if(s.has(c)){a.push(c);continue}try{await this.registerAgent(c),o.push(c),(0,utils_1.logInfo)(this.outputChannel,`[Agent] Repaired: registered untracked agent "${c}"`)}catch(l){(0,utils_1.logInfo)(this.outputChannel,`[Agent] Failed to repair agent "${c}": ${l instanceof Error?l.message:String(l)}`)}}return o.length>0&&(0,utils_1.logInfo)(this.outputChannel,`[Agent] Repair complete: ${o.length} agent(s) registered`),{registered:o,alreadyRegistered:a}}async installAgentToWorkspace(e){let n=this.getWorkspaceRoot();if(await(0,stores_1.isWorkspaceAgentAvailable)(n,e))return(0,utils_1.logInfo)(this.outputChannel,`[Agent] Agent available in workspace: ${e}`),await this.getInstalledAgent(e)||((0,utils_1.logInfo)(this.outputChannel,`[Agent] Registering untracked agent: ${e}`),await this.registerAgent(e)),await this.syncService.seedAgentDataIfNeeded(n,e,this.outputChannel),{installed:!0,hydrated:!1};if(await(0,stores_1.isAgentInUserLibrary)(e)){(0,utils_1.logInfo)(this.outputChannel,`[Agent] Hydrating from User Library: ${e}`);let r=await(0,stores_1.hydrateFromUserLibrary)(n,e,void 0,this.outputChannel);if(r)return await this.registerAgent(e,{source:"local"}),{installed:!0,hydrated:!0,version:r}}return(0,utils_1.logInfo)(this.outputChannel,`[Agent] Agent not found: ${e}`),{installed:!1,hydrated:!1}}async shareToUserLibrary(e){let n=this.getWorkspaceRoot();return(0,stores_1.promoteToUserLibrary)(n,e,this.outputChannel)}async updateFromLibrary(e,n){let r=this.getWorkspaceRoot();return(0,stores_1.updateFromUserLibrary)(r,e,n,this.outputChannel)}async duplicate(e){let n=this.getWorkspaceRoot(),r=await(0,stores_1.duplicateAgent)(n,e,this.outputChannel);return await this.registerAgent(r,{source:"local"}),r}async resetDefault(e){let n=this.getWorkspaceRoot();await(0,stores_1.resetDefaultAgent)(n,e,this.outputChannel);let r=(0,paths_1.getAgentManifestPath)(n,paths_1.AGENT_CONSTANTS.DEFAULT_AGENT_ID);await(0,utils_1.pathExists)(r)&&await this.registerAgent(paths_1.AGENT_CONSTANTS.DEFAULT_AGENT_ID,{source:"builtin"})}async listUserLibrary(){return(0,stores_1.listUserLibraryAgents)()}async checkAgentUpdate(e){let n=this.getWorkspaceRoot();return(0,stores_1.checkForUpdate)(n,e)}async getAgentSource(e){let n=this.getWorkspaceRoot();return(0,stores_1.readAgentSource)(n,e)}};exports.AgentPackManager=AgentPackManager});var ya=T((exports,module)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.getGitHubToken=getGitHubToken;exports.isGitHubAuthenticated=isGitHubAuthenticated;exports.getGitHubUser=getGitHubUser;exports.getRepo=getRepo;exports.createRepo=createRepo;exports.getReleaseByTag=getReleaseByTag;exports.getLatestRelease=getLatestRelease;exports.createRelease=createRelease;exports.downloadTarball=downloadTarball;exports.getFileContent=getFileContent;exports.putFileContent=putFileContent;exports.getDefaultBranch=getDefaultBranch;exports.getBranchSha=getBranchSha;exports.createBranch=createBranch;exports.createPullRequest=createPullRequest;exports.commitMultipleFiles=commitMultipleFiles;exports.parseGitHubSource=parseGitHubSource;exports.formatGitHubSource=formatGitHubSource;var _vscode;function getVscode(){return _vscode||(_vscode=eval("require")("vscode")),_vscode}async function getGitHubToken(t=!0,e=["repo","user"]){let n=process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN;if(n?.trim())return n.trim();let s=await getVscode().authentication.getSession("github",e,{createIfNone:t});if(!s)throw new Error("GitHub authentication required. Please sign in.");return s.accessToken}async function isGitHubAuthenticated(){try{return await getGitHubToken(!1),!0}catch{return!1}}async function getGitHubUser(){let t=await getGitHubToken(),e=await fetch("https://api.github.com/user",{headers:{Authorization:`Bearer ${t}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!e.ok)throw new Error(`Failed to get GitHub user: ${e.statusText}`);return e.json()}async function getRepo(t,e){let n=await getGitHubToken(),r=await fetch(`https://api.github.com/repos/${t}/${e}`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(r.status===404)return null;if(!r.ok)throw new Error(`Failed to get repo: ${r.statusText}`);return r.json()}async function createRepo(t,e,n){let r=await getGitHubToken(),s=await fetch("https://api.github.com/user/repos",{method:"POST",headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({name:t,description:e,private:n,auto_init:!1})});if(!s.ok){let i=await s.text();throw new Error(`Failed to create repo: ${i}`)}return s.json()}async function getReleaseByTag(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/releases/tags/${n}`,{headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(s.status===404)return null;if(!s.ok)throw new Error(`Failed to get release: ${s.statusText}`);return s.json()}async function getLatestRelease(t,e){let n=await getGitHubToken(),r=await fetch(`https://api.github.com/repos/${t}/${e}/releases/latest`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(r.status===404)return null;if(!r.ok)throw new Error(`Failed to get latest release: ${r.statusText}`);return r.json()}async function createRelease(t,e,n,r,s,i){let o=await getGitHubToken(),a=await fetch(`https://api.github.com/repos/${t}/${e}/releases`,{method:"POST",headers:{Authorization:`Bearer ${o}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({tag_name:n,name:r,body:s,target_commitish:i})});if(!a.ok){let c=await a.text();throw new Error(`Failed to create release: ${c}`)}return a.json()}async function downloadTarball(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/tarball/${n}`,{headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"},redirect:"follow"});if(!s.ok)throw new Error(`Failed to download tarball: ${s.statusText}`);return s.arrayBuffer()}async function getFileContent(t,e,n,r){let s=await getGitHubToken(),i=new URL(`https://api.github.com/repos/${t}/${e}/contents/${n}`);r&&i.searchParams.set("ref",r);let o=await fetch(i.toString(),{headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(o.status===404)return null;if(!o.ok)throw new Error(`Failed to get file content: ${o.statusText}`);let a=await o.json();return{content:Buffer.from(a.content,"base64").toString("utf-8"),sha:a.sha}}async function putFileContent(t,e,n,r,s,i,o){let a=await getGitHubToken(),c=await fetch(`https://api.github.com/repos/${t}/${e}/contents/${n}`,{method:"PUT",headers:{Authorization:`Bearer ${a}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({message:s,content:Buffer.from(r).toString("base64"),sha:i,branch:o})});if(!c.ok){let l=await c.text();throw new Error(`Failed to put file content: ${l}`)}}async function getDefaultBranch(t,e){let n=await getRepo(t,e);if(!n)throw new Error(`Repository ${t}/${e} not found`);return n.default_branch}async function getBranchSha(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo"}});if(!s.ok)throw new Error(`Failed to get branch ${n}: ${s.status}`);return(await s.json()).object.sha}async function createBranch(t,e,n,r){let s=await getGitHubToken(),i=await getBranchSha(t,e,r),o=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo","Content-Type":"application/json"},body:JSON.stringify({ref:`refs/heads/${n}`,sha:i})});if(!o.ok){let a=await o.text();throw new Error(`Failed to create branch ${n}: ${o.status} ${a}`)}}async function createPullRequest(t,e,n){let r=await getGitHubToken(),s=await fetch(`https://api.github.com/repos/${t}/${e}/pulls`,{method:"POST",headers:{Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo","Content-Type":"application/json"},body:JSON.stringify({title:n.title,body:n.body,head:n.head,base:n.base})});if(!s.ok){let i=await s.text();throw new Error(`Failed to create pull request: ${s.status} ${i}`)}return await s.json()}async function commitMultipleFiles(t,e,n,r,s,i){let a={Authorization:`Bearer ${await getGitHubToken(!0,i?.scopes)}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentHippo","Content-Type":"application/json"};await new Promise(A=>setTimeout(A,500));let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:a});if(!c.ok){let A=await c.text();throw new Error(`Failed to get branch ref for ${n}: ${c.status} - ${A}`)}let u=(await c.json()).object.sha,f=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits/${u}`,{headers:a});if(!f.ok){let A=await f.text();throw new Error(`Failed to get commit ${u}: ${f.status} - ${A}`)}let g=(await f.json()).tree.sha,p=[];for(let A of r){let S=A.encoding??"utf-8",C=await fetch(`https://api.github.com/repos/${t}/${e}/git/blobs`,{method:"POST",headers:a,body:JSON.stringify({content:A.content,encoding:S})});if(!C.ok){let I=await C.text();throw new Error(`Failed to create blob for ${A.path}: ${C.status} - ${I}`)}let b=await C.json();p.push({path:A.path,mode:"100644",type:"blob",sha:b.sha})}console.log("[AgentHippo] Repo:",`${t}/${e}`),console.log("[AgentHippo] Branch:",n),console.log("[AgentHippo] Creating tree with base:",g),console.log("[AgentHippo] Tree items:",JSON.stringify(p,null,2));let _=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({base_tree:g,tree:p})});if(_.status===404&&(console.log("[AgentHippo] Retrying tree creation without base_tree..."),_=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({tree:p})})),!_.ok)return console.log("[AgentHippo] Git Data API failed, falling back to Contents API..."),await commitMultipleFilesViaContentsApi(t,e,n,r,s,a);let h=await _.json(),y=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits`,{method:"POST",headers:a,body:JSON.stringify({message:s,tree:h.sha,parents:[u]})});if(!y.ok)throw new Error(`Failed to create commit: ${y.status}`);let E=await y.json(),w=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{method:"PATCH",headers:a,body:JSON.stringify({sha:E.sha})});if(!w.ok)throw new Error(`Failed to update ref: ${w.status}`);return{sha:E.sha}}async function commitMultipleFilesViaContentsApi(t,e,n,r,s,i){let o="";for(let a of r){let c=encodeURIComponent(n),l=await fetch(`https://api.github.com/repos/${t}/${e}/contents/${a.path}?ref=${c}`,{headers:i}),u=l.ok?(await l.json()).sha:void 0,f=await fetch(`https://api.github.com/repos/${t}/${e}/contents/${a.path}`,{method:"PUT",headers:i,body:JSON.stringify({message:`${s} - ${a.path}`,content:a.encoding==="base64"?a.content:Buffer.from(a.content,"utf-8").toString("base64"),branch:n,sha:u})});if(!f.ok){let g=await f.text();throw new Error(`Failed to create file ${a.path}: ${f.status} - ${g}`)}o=(await f.json()).commit.sha,console.log(`[AgentHippo] Created ${a.path}`)}return{sha:o}}function parseGitHubSource(t){let e=t.trim();e=e.replace(/^github:\/\//,""),e=e.replace(/^https?:\/\/github\.com\//,""),e=e.replace(/\.git$/,"");let n;if(e.includes("@")){let i=e.split("@");e=i[0],n=i[1]}let[r,s]=e.split("/");if(!r||!s)throw new Error(`Invalid GitHub source: ${t}. Expected format: owner/repo[@version]`);return{owner:r,repo:s,version:n}}function formatGitHubSource(t){let e=`github://${t.owner}/${t.repo}`;return t.version&&(e+=`@${t.version}`),e}});var zm=T(Xr=>{"use strict";var _P=Xr&&Xr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),EP=Xr&&Xr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yP=Xr&&Xr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&_P(n,e,r[s]);return EP(n,e),n}})();Object.defineProperty(Xr,"__esModule",{value:!0});Xr.validateForPublish=Jm;Xr.publishToGitHub=SP;var Gd=require("fs"),qm=yP(require("path")),vn=dn(),Ym=Pi(),Jc=er(),Ni=ya(),wP=[".","..",".git",".claude",".codex",".agentide","node_modules","*.log","current.txt"],Wm=1024*1024,Yc=10*1024*1024;async function Jm(t,e){let n=[],r=[],s=(0,Jc.getAgentRoot)(t,e);if(!await(0,vn.pathExists)(s))return n.push(`Agent directory not found: ${s}`),{valid:!1,errors:n,warnings:r};let i=["agent.yaml","AGENTS.md"];for(let l of i){let u=qm.join(s,l);await(0,vn.pathExists)(u)||n.push(`Missing required file: ${l}`)}let o=(0,Jc.getAgentManifestPath)(t,e);if(await(0,vn.pathExists)(o))try{let l=await(0,Ym.loadAgentManifest)(o);l.metadata.name||n.push("agent.yaml missing metadata.name"),l.metadata.version?/^\d+\.\d+\.\d+/.test(l.metadata.version)||n.push(`Invalid version format: ${l.metadata.version}. Use semver (e.g., 1.0.0)`):n.push("agent.yaml missing metadata.version"),l.metadata.description||r.push("Consider adding a description to agent.yaml"),l.metadata.author||r.push("Consider adding an author to agent.yaml")}catch(l){n.push(`Invalid agent.yaml: ${l instanceof Error?l.message:String(l)}`)}let a=await Xm(s),c=a.reduce((l,u)=>l+u.size,0);c>Yc?n.push(`Bundle too large: ${To(c)} (max ${To(Yc)})`):c>Yc*.8&&r.push(`Bundle is ${To(c)}, approaching limit of ${To(Yc)}`);for(let l of a)l.size>Wm&&n.push(`File too large: ${l.relativePath} (${To(l.size)}, max ${To(Wm)})`);return{valid:n.length===0,errors:n,warnings:r}}async function Xm(t){let e=[];async function n(r,s){let i;try{i=await Gd.promises.readdir(r)}catch{return}for(let o of i){if(wP.some(u=>o===u||o.startsWith(".")))continue;let a=qm.join(r,o),c=s?`${s}/${o}`:o,l=await Gd.promises.stat(a);l.isDirectory()?await n(a,c):l.isFile()&&e.push({relativePath:c,absolutePath:a,size:l.size})}}return await n(t,""),e}async function SP(t,e,n){let{agentId:r,visibility:s,changelog:i}=e;(0,vn.logInfo)(n,`[Publish] Starting publish for ${r}...`);let o=await Jm(t,r);if(!o.valid)throw new Error(`Validation failed:
40
40
  ${o.errors.join(`
41
41
  `)}`);o.warnings.length>0&&(0,vn.logInfo)(n,`[Publish] Warnings:
42
42
  ${o.warnings.join(`
43
- `)}`);let a=(0,Jc.getAgentManifestPath)(t,r),c=await(0,Ym.loadAgentManifest)(a),l=c.metadata.version,u=`v${l}`,d=await(0,Ni.getGitHubUser)();(0,vn.logInfo)(n,`[Publish] Authenticated as ${d.login}`);let f=e.repoName||r,p=await(0,Ni.getRepo)(d.login,f);if(p?(0,vn.logInfo)(n,`[Publish] Using existing repository: ${p.full_name}`):((0,vn.logInfo)(n,`[Publish] Creating new repository: ${d.login}/${f}`),p=await(0,Ni.createRepo)(f,c.metadata.description||`AgentIDE pack: ${r}`,s==="private")),await(0,Ni.getReleaseByTag)(d.login,f,u))throw new Error(`Version ${l} already published. Bump version in agent.yaml and try again.`);let _=(0,Jc.getAgentRoot)(t,r),h=await Xm(_);(0,vn.logInfo)(n,`[Publish] Pushing ${h.length} files to ${p.full_name}...`);for(let E of h){let w=await Gd.promises.readFile(E.absolutePath,"utf-8"),A=await(0,Ni.getFileContent)(d.login,f,E.relativePath);await(0,Ni.putFileContent)(d.login,f,E.relativePath,w,`Publish ${r} v${l}`,A?.sha,p.default_branch),(0,vn.logInfo)(n,`[Publish] \u2713 ${E.relativePath}`)}(0,vn.logInfo)(n,`[Publish] Creating release ${u}...`);let y=await(0,Ni.createRelease)(d.login,f,u,`${r} v${l}`,i||`Release ${l}`,p.default_branch);return(0,vn.logInfo)(n,`[Publish] OK Published ${r} v${l}`),(0,vn.logInfo)(n,`[Publish] Repo: ${p.html_url}`),(0,vn.logInfo)(n,`[Publish] Release: ${y.html_url}`),{owner:d.login,repo:f,version:l,repoUrl:p.html_url,releaseUrl:y.html_url}}function To(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var t_=T(Pr=>{"use strict";var AP=Pr&&Pr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),TP=Pr&&Pr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bP=Pr&&Pr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&AP(n,e,r[s]);return TP(n,e),n}})();Object.defineProperty(Pr,"__esModule",{value:!0});Pr.downloadTarball=Zm;Pr.installFromGitHub=NP;Pr.checkGitHubUpdate=RP;var Xc=require("fs"),Qm=bP(require("path")),vP=require("zlib"),zt=dn(),zc=er(),OP=Pi(),Qc=ya();async function Zm(t,e,n,r){let s=`https://github.com/${t}/${e}/archive/refs/tags/${n}.tar.gz`,i=await fetch(s,{headers:{"User-Agent":"AgentIDE"},redirect:"follow"});if(!i.ok){if(i.status===401||i.status===403||i.status===404||i.status===429){r&&(0,zt.logInfo)(r,"[Install] Requires authentication, signing in...");let c=await(0,Qc.getGitHubToken)();i=await fetch(s,{headers:{"User-Agent":"AgentIDE",Authorization:`Bearer ${c}`},redirect:"follow"})}if(!i.ok)throw new Error(`Failed to download: ${i.status} ${i.statusText}`)}let o=Buffer.from(await i.arrayBuffer()),a=(0,vP.gunzipSync)(o);return IP(a)}function IP(t){let e=new Map,n=0;for(;n<t.length-512;){let r=t.subarray(n,n+512);if(r.every(c=>c===0))break;let s=r.subarray(0,100).toString("utf-8").replace(/\0/g,"").trim(),i=r.subarray(124,136).toString("utf-8").replace(/\0/g,"").trim(),o=r[156];if(!s){n+=512;continue}let a=parseInt(i,8)||0;if(n+=512,o===0||o===48){let c=t.subarray(n,n+a);e.set(s,Buffer.from(c))}n+=Math.ceil(a/512)*512}return e}function PP(t){let e=new Map;for(let[n,r]of t){let s=n.indexOf("/");if(s!==-1){let i=n.slice(s+1);i&&e.set(i,r)}}return e}async function NP(t,e,n){let{source:r,force:s=!1}=e;(0,zt.logInfo)(n,`[Install] Installing from ${r}...`);let i=(0,Qc.parseGitHubSource)(r);(0,zt.logInfo)(n,`[Install] Repository: ${i.owner}/${i.repo}`);let o;if(i.version)o=i.version;else{(0,zt.logInfo)(n,"[Install] Resolving latest version...");let f=await e_(i.owner,i.repo,n);if(!f)throw new Error(`No releases found for ${i.owner}/${i.repo}. The repository may not have any published versions.`);o=f,(0,zt.logInfo)(n,`[Install] Latest version: ${o}`)}let a=i.repo,c=(0,zc.getAgentRoot)(t,a);if(await(0,zt.pathExists)(c)){if(!s)throw new Error(`Agent "${a}" already exists. Use force option to overwrite.`);(0,zt.logInfo)(n,"[Install] Removing existing installation..."),await Xc.promises.rm(c,{recursive:!0,force:!0})}(0,zt.logInfo)(n,`[Install] Downloading ${o}...`);let l=await Zm(i.owner,i.repo,o,n),u=PP(l);if((0,zt.logInfo)(n,`[Install] Found ${u.size} files`),!u.has(zc.AGENT_CONSTANTS.MANIFEST_FILE))throw new Error(`Invalid agent pack: missing ${zc.AGENT_CONSTANTS.MANIFEST_FILE}. Ensure the repository contains a valid agent pack.`);await Xc.promises.mkdir(c,{recursive:!0});let d=0;for(let[f,p]of u){(0,zt.logInfo)(n,`[Install] \u2193 ${f}`);let g=Qm.join(c,f);await Xc.promises.mkdir(Qm.dirname(g),{recursive:!0}),await Xc.promises.writeFile(g,p),d+=p.length}return(0,zt.logInfo)(n,`[Install] OK Installed ${a} ${o}`),(0,zt.logInfo)(n,`[Install] Location: ${c}`),(0,zt.logInfo)(n,`[Install] Downloaded: ${CP(d)}`),{agentId:a,version:o,source:`github://${i.owner}/${i.repo}@${o}`,installed:!0}}async function e_(t,e,n){let r=`https://api.github.com/repos/${t}/${e}/releases/latest`,s=await fetch(r,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"}});if(!s.ok&&(s.status===401||s.status===403||s.status===429)){n&&(0,zt.logInfo)(n,"[Install] Requires authentication...");let o=await(0,Qc.getGitHubToken)();s=await fetch(r,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`}})}return s.ok?(await s.json()).tag_name:null}async function RP(t,e,n,r){try{let s=(0,zc.getAgentManifestPath)(t,e);if(!await(0,zt.pathExists)(s))return{hasUpdate:!1};let o=(await(0,OP.loadAgentManifest)(s)).metadata.version,a=(0,Qc.parseGitHubSource)(n),c=await e_(a.owner,a.repo,r);if(!c)return{hasUpdate:!1,currentVersion:o};let l=c.replace(/^v/,"");return{hasUpdate:l!==o,currentVersion:o,latestVersion:l}}catch(s){return(0,zt.logInfo)(r,`[Install] Update check failed: ${s}`),{hasUpdate:!1}}}function CP(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var Ud=T(k=>{"use strict";Object.defineProperty(k,"__esModule",{value:!0});k.checkGitHubUpdate=k.installFromGitHub=k.validateForPublish=k.publishToGitHub=k.getGitHubUser=k.isGitHubAuthenticated=k.getGitHubToken=k.formatGitHubSource=k.parseGitHubSource=k.resetDefaultAgent=k.duplicateAgent=k.updateFromUserLibrary=k.checkForUpdate=k.readAgentSource=k.promoteToUserLibrary=k.hydrateFromUserLibrary=k.isAgentInUserLibrary=k.isWorkspaceAgentAvailable=k.listUserLibraryAgents=k.updateManifestName=k.parseAgentManifest=k.loadAgentManifest=k.stringifyYaml=k.parseYaml=k.AgentPackManager=k.getUserAgentCurrentPath=k.getUserAgentVersionDir=k.getUserAgentRoot=k.getUserAgentsDir=k.getAgentideHome=k.parseAgentIdFromPath=k.getSessionsDir=k.getAgentMcpDir=k.getAgentRulesDir=k.getAgentSkillsDir=k.getAgentContextPath=k.getAgentAgentsMdPath=k.getAgentManifestPath=k.isDefaultAgent=k.engineHomeUserKey=k.userScopedEngineHomeFromKey=k.userScopedEngineHome=k.resolveRuntimePaths=k.resolveAgentRuntimePaths=k.getAgentRoot=k.getAgentsDir=k.getAgentideDir=k.AGENT_CONSTANTS=void 0;var ct=er();Object.defineProperty(k,"AGENT_CONSTANTS",{enumerable:!0,get:function(){return ct.AGENT_CONSTANTS}});Object.defineProperty(k,"getAgentideDir",{enumerable:!0,get:function(){return ct.getAgentideDir}});Object.defineProperty(k,"getAgentsDir",{enumerable:!0,get:function(){return ct.getAgentsDir}});Object.defineProperty(k,"getAgentRoot",{enumerable:!0,get:function(){return ct.getAgentRoot}});Object.defineProperty(k,"resolveAgentRuntimePaths",{enumerable:!0,get:function(){return ct.resolveAgentRuntimePaths}});Object.defineProperty(k,"resolveRuntimePaths",{enumerable:!0,get:function(){return ct.resolveRuntimePaths}});Object.defineProperty(k,"userScopedEngineHome",{enumerable:!0,get:function(){return ct.userScopedEngineHome}});Object.defineProperty(k,"userScopedEngineHomeFromKey",{enumerable:!0,get:function(){return ct.userScopedEngineHomeFromKey}});Object.defineProperty(k,"engineHomeUserKey",{enumerable:!0,get:function(){return ct.engineHomeUserKey}});Object.defineProperty(k,"isDefaultAgent",{enumerable:!0,get:function(){return ct.isDefaultAgent}});Object.defineProperty(k,"getAgentManifestPath",{enumerable:!0,get:function(){return ct.getAgentManifestPath}});Object.defineProperty(k,"getAgentAgentsMdPath",{enumerable:!0,get:function(){return ct.getAgentAgentsMdPath}});Object.defineProperty(k,"getAgentContextPath",{enumerable:!0,get:function(){return ct.getAgentContextPath}});Object.defineProperty(k,"getAgentSkillsDir",{enumerable:!0,get:function(){return ct.getAgentSkillsDir}});Object.defineProperty(k,"getAgentRulesDir",{enumerable:!0,get:function(){return ct.getAgentRulesDir}});Object.defineProperty(k,"getAgentMcpDir",{enumerable:!0,get:function(){return ct.getAgentMcpDir}});Object.defineProperty(k,"getSessionsDir",{enumerable:!0,get:function(){return ct.getSessionsDir}});Object.defineProperty(k,"parseAgentIdFromPath",{enumerable:!0,get:function(){return ct.parseAgentIdFromPath}});Object.defineProperty(k,"getAgentideHome",{enumerable:!0,get:function(){return ct.getAgentideHome}});Object.defineProperty(k,"getUserAgentsDir",{enumerable:!0,get:function(){return ct.getUserAgentsDir}});Object.defineProperty(k,"getUserAgentRoot",{enumerable:!0,get:function(){return ct.getUserAgentRoot}});Object.defineProperty(k,"getUserAgentVersionDir",{enumerable:!0,get:function(){return ct.getUserAgentVersionDir}});Object.defineProperty(k,"getUserAgentCurrentPath",{enumerable:!0,get:function(){return ct.getUserAgentCurrentPath}});var kP=Km();Object.defineProperty(k,"AgentPackManager",{enumerable:!0,get:function(){return kP.AgentPackManager}});var wa=Pi();Object.defineProperty(k,"parseYaml",{enumerable:!0,get:function(){return wa.parseYaml}});Object.defineProperty(k,"stringifyYaml",{enumerable:!0,get:function(){return wa.stringifyYaml}});Object.defineProperty(k,"loadAgentManifest",{enumerable:!0,get:function(){return wa.loadAgentManifest}});Object.defineProperty(k,"parseAgentManifest",{enumerable:!0,get:function(){return wa.parseAgentManifest}});Object.defineProperty(k,"updateManifestName",{enumerable:!0,get:function(){return wa.updateManifestName}});var zr=Md();Object.defineProperty(k,"listUserLibraryAgents",{enumerable:!0,get:function(){return zr.listUserLibraryAgents}});Object.defineProperty(k,"isWorkspaceAgentAvailable",{enumerable:!0,get:function(){return zr.isWorkspaceAgentAvailable}});Object.defineProperty(k,"isAgentInUserLibrary",{enumerable:!0,get:function(){return zr.isAgentInUserLibrary}});Object.defineProperty(k,"hydrateFromUserLibrary",{enumerable:!0,get:function(){return zr.hydrateFromUserLibrary}});Object.defineProperty(k,"promoteToUserLibrary",{enumerable:!0,get:function(){return zr.promoteToUserLibrary}});Object.defineProperty(k,"readAgentSource",{enumerable:!0,get:function(){return zr.readAgentSource}});Object.defineProperty(k,"checkForUpdate",{enumerable:!0,get:function(){return zr.checkForUpdate}});Object.defineProperty(k,"updateFromUserLibrary",{enumerable:!0,get:function(){return zr.updateFromUserLibrary}});Object.defineProperty(k,"duplicateAgent",{enumerable:!0,get:function(){return zr.duplicateAgent}});Object.defineProperty(k,"resetDefaultAgent",{enumerable:!0,get:function(){return zr.resetDefaultAgent}});var Sa=ya();Object.defineProperty(k,"parseGitHubSource",{enumerable:!0,get:function(){return Sa.parseGitHubSource}});Object.defineProperty(k,"formatGitHubSource",{enumerable:!0,get:function(){return Sa.formatGitHubSource}});Object.defineProperty(k,"getGitHubToken",{enumerable:!0,get:function(){return Sa.getGitHubToken}});Object.defineProperty(k,"isGitHubAuthenticated",{enumerable:!0,get:function(){return Sa.isGitHubAuthenticated}});Object.defineProperty(k,"getGitHubUser",{enumerable:!0,get:function(){return Sa.getGitHubUser}});var n_=zm();Object.defineProperty(k,"publishToGitHub",{enumerable:!0,get:function(){return n_.publishToGitHub}});Object.defineProperty(k,"validateForPublish",{enumerable:!0,get:function(){return n_.validateForPublish}});var r_=t_();Object.defineProperty(k,"installFromGitHub",{enumerable:!0,get:function(){return r_.installFromGitHub}});Object.defineProperty(k,"checkGitHubUpdate",{enumerable:!0,get:function(){return r_.checkGitHubUpdate}})});var Zc=T(Bt=>{"use strict";var $P=Bt&&Bt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),DP=Bt&&Bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),LP=Bt&&Bt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&$P(n,e,r[s]);return DP(n,e),n}})();Object.defineProperty(Bt,"__esModule",{value:!0});Bt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV=Bt.GATEWAY_OUTBOUND_FILENAME=void 0;Bt.safeGatewaySessionDirId=Hd;Bt.getGatewayOutboundFilePath=s_;Bt.resolveGatewaySessionDirId=i_;Bt.resolveGatewayOutboundFilePath=UP;var MP=LP(require("path")),GP=ot();Bt.GATEWAY_OUTBOUND_FILENAME="gateway-outbound.json";Bt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV="AGENTHIPPO_GATEWAY_OUTBOUND_FILE";function Hd(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160).replace(/^\.+$/,n=>"_".repeat(n.length))||"session"}function s_(t,e){return MP.join(t,GP.AGENTIDE_DIR_NAME,"sessions",e,Bt.GATEWAY_OUTBOUND_FILENAME)}function i_(t){let e=t.chatSessionId?.trim();if(e)return Hd(e);let n=t.gatewaySessionKey?.trim();if(n)return Hd(n)}function UP(t){let e=i_(t);if(e)return s_(t.workspaceRoot,e)}});var c_=T(fn=>{"use strict";var HP=fn&&fn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),jP=fn&&fn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),xP=fn&&fn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&HP(n,e,r[s]);return jP(n,e),n}})();Object.defineProperty(fn,"__esModule",{value:!0});fn.isProcessRunning=el;fn.isProcessRunningAsync=FP;fn.isPidFileProcessRunning=VP;fn.readPidFile=o_;fn.writePidFile=KP;fn.removePidFile=a_;fn.checkPidFileWithCleanup=WP;var Aa=require("fs"),BP=xP(require("path"));function el(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function FP(t){return el(t)}async function VP(t){try{let e=await Aa.promises.readFile(t,"utf8").catch(()=>null);if(!e)return!1;let n=parseInt(e.trim().split(`
43
+ `)}`);let a=(0,Jc.getAgentManifestPath)(t,r),c=await(0,Ym.loadAgentManifest)(a),l=c.metadata.version,u=`v${l}`,f=await(0,Ni.getGitHubUser)();(0,vn.logInfo)(n,`[Publish] Authenticated as ${f.login}`);let d=e.repoName||r,g=await(0,Ni.getRepo)(f.login,d);if(g?(0,vn.logInfo)(n,`[Publish] Using existing repository: ${g.full_name}`):((0,vn.logInfo)(n,`[Publish] Creating new repository: ${f.login}/${d}`),g=await(0,Ni.createRepo)(d,c.metadata.description||`AgentIDE pack: ${r}`,s==="private")),await(0,Ni.getReleaseByTag)(f.login,d,u))throw new Error(`Version ${l} already published. Bump version in agent.yaml and try again.`);let _=(0,Jc.getAgentRoot)(t,r),h=await Xm(_);(0,vn.logInfo)(n,`[Publish] Pushing ${h.length} files to ${g.full_name}...`);for(let E of h){let w=await Gd.promises.readFile(E.absolutePath,"utf-8"),A=await(0,Ni.getFileContent)(f.login,d,E.relativePath);await(0,Ni.putFileContent)(f.login,d,E.relativePath,w,`Publish ${r} v${l}`,A?.sha,g.default_branch),(0,vn.logInfo)(n,`[Publish] \u2713 ${E.relativePath}`)}(0,vn.logInfo)(n,`[Publish] Creating release ${u}...`);let y=await(0,Ni.createRelease)(f.login,d,u,`${r} v${l}`,i||`Release ${l}`,g.default_branch);return(0,vn.logInfo)(n,`[Publish] OK Published ${r} v${l}`),(0,vn.logInfo)(n,`[Publish] Repo: ${g.html_url}`),(0,vn.logInfo)(n,`[Publish] Release: ${y.html_url}`),{owner:f.login,repo:d,version:l,repoUrl:g.html_url,releaseUrl:y.html_url}}function To(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var t_=T(Pr=>{"use strict";var AP=Pr&&Pr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),TP=Pr&&Pr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bP=Pr&&Pr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&AP(n,e,r[s]);return TP(n,e),n}})();Object.defineProperty(Pr,"__esModule",{value:!0});Pr.downloadTarball=Zm;Pr.installFromGitHub=NP;Pr.checkGitHubUpdate=RP;var Xc=require("fs"),Qm=bP(require("path")),vP=require("zlib"),zt=dn(),zc=er(),OP=Pi(),Qc=ya();async function Zm(t,e,n,r){let s=`https://github.com/${t}/${e}/archive/refs/tags/${n}.tar.gz`,i=await fetch(s,{headers:{"User-Agent":"AgentIDE"},redirect:"follow"});if(!i.ok){if(i.status===401||i.status===403||i.status===404||i.status===429){r&&(0,zt.logInfo)(r,"[Install] Requires authentication, signing in...");let c=await(0,Qc.getGitHubToken)();i=await fetch(s,{headers:{"User-Agent":"AgentIDE",Authorization:`Bearer ${c}`},redirect:"follow"})}if(!i.ok)throw new Error(`Failed to download: ${i.status} ${i.statusText}`)}let o=Buffer.from(await i.arrayBuffer()),a=(0,vP.gunzipSync)(o);return IP(a)}function IP(t){let e=new Map,n=0;for(;n<t.length-512;){let r=t.subarray(n,n+512);if(r.every(c=>c===0))break;let s=r.subarray(0,100).toString("utf-8").replace(/\0/g,"").trim(),i=r.subarray(124,136).toString("utf-8").replace(/\0/g,"").trim(),o=r[156];if(!s){n+=512;continue}let a=parseInt(i,8)||0;if(n+=512,o===0||o===48){let c=t.subarray(n,n+a);e.set(s,Buffer.from(c))}n+=Math.ceil(a/512)*512}return e}function PP(t){let e=new Map;for(let[n,r]of t){let s=n.indexOf("/");if(s!==-1){let i=n.slice(s+1);i&&e.set(i,r)}}return e}async function NP(t,e,n){let{source:r,force:s=!1}=e;(0,zt.logInfo)(n,`[Install] Installing from ${r}...`);let i=(0,Qc.parseGitHubSource)(r);(0,zt.logInfo)(n,`[Install] Repository: ${i.owner}/${i.repo}`);let o;if(i.version)o=i.version;else{(0,zt.logInfo)(n,"[Install] Resolving latest version...");let d=await e_(i.owner,i.repo,n);if(!d)throw new Error(`No releases found for ${i.owner}/${i.repo}. The repository may not have any published versions.`);o=d,(0,zt.logInfo)(n,`[Install] Latest version: ${o}`)}let a=i.repo,c=(0,zc.getAgentRoot)(t,a);if(await(0,zt.pathExists)(c)){if(!s)throw new Error(`Agent "${a}" already exists. Use force option to overwrite.`);(0,zt.logInfo)(n,"[Install] Removing existing installation..."),await Xc.promises.rm(c,{recursive:!0,force:!0})}(0,zt.logInfo)(n,`[Install] Downloading ${o}...`);let l=await Zm(i.owner,i.repo,o,n),u=PP(l);if((0,zt.logInfo)(n,`[Install] Found ${u.size} files`),!u.has(zc.AGENT_CONSTANTS.MANIFEST_FILE))throw new Error(`Invalid agent pack: missing ${zc.AGENT_CONSTANTS.MANIFEST_FILE}. Ensure the repository contains a valid agent pack.`);await Xc.promises.mkdir(c,{recursive:!0});let f=0;for(let[d,g]of u){(0,zt.logInfo)(n,`[Install] \u2193 ${d}`);let p=Qm.join(c,d);await Xc.promises.mkdir(Qm.dirname(p),{recursive:!0}),await Xc.promises.writeFile(p,g),f+=g.length}return(0,zt.logInfo)(n,`[Install] OK Installed ${a} ${o}`),(0,zt.logInfo)(n,`[Install] Location: ${c}`),(0,zt.logInfo)(n,`[Install] Downloaded: ${CP(f)}`),{agentId:a,version:o,source:`github://${i.owner}/${i.repo}@${o}`,installed:!0}}async function e_(t,e,n){let r=`https://api.github.com/repos/${t}/${e}/releases/latest`,s=await fetch(r,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"}});if(!s.ok&&(s.status===401||s.status===403||s.status===429)){n&&(0,zt.logInfo)(n,"[Install] Requires authentication...");let o=await(0,Qc.getGitHubToken)();s=await fetch(r,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${o}`}})}return s.ok?(await s.json()).tag_name:null}async function RP(t,e,n,r){try{let s=(0,zc.getAgentManifestPath)(t,e);if(!await(0,zt.pathExists)(s))return{hasUpdate:!1};let o=(await(0,OP.loadAgentManifest)(s)).metadata.version,a=(0,Qc.parseGitHubSource)(n),c=await e_(a.owner,a.repo,r);if(!c)return{hasUpdate:!1,currentVersion:o};let l=c.replace(/^v/,"");return{hasUpdate:l!==o,currentVersion:o,latestVersion:l}}catch(s){return(0,zt.logInfo)(r,`[Install] Update check failed: ${s}`),{hasUpdate:!1}}}function CP(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var Ud=T(k=>{"use strict";Object.defineProperty(k,"__esModule",{value:!0});k.checkGitHubUpdate=k.installFromGitHub=k.validateForPublish=k.publishToGitHub=k.getGitHubUser=k.isGitHubAuthenticated=k.getGitHubToken=k.formatGitHubSource=k.parseGitHubSource=k.resetDefaultAgent=k.duplicateAgent=k.updateFromUserLibrary=k.checkForUpdate=k.readAgentSource=k.promoteToUserLibrary=k.hydrateFromUserLibrary=k.isAgentInUserLibrary=k.isWorkspaceAgentAvailable=k.listUserLibraryAgents=k.updateManifestName=k.parseAgentManifest=k.loadAgentManifest=k.stringifyYaml=k.parseYaml=k.AgentPackManager=k.getUserAgentCurrentPath=k.getUserAgentVersionDir=k.getUserAgentRoot=k.getUserAgentsDir=k.getAgentideHome=k.parseAgentIdFromPath=k.getSessionsDir=k.getAgentMcpDir=k.getAgentRulesDir=k.getAgentSkillsDir=k.getAgentContextPath=k.getAgentAgentsMdPath=k.getAgentManifestPath=k.isDefaultAgent=k.engineHomeUserKey=k.userScopedEngineHomeFromKey=k.userScopedEngineHome=k.resolveRuntimePaths=k.resolveAgentRuntimePaths=k.getAgentRoot=k.getAgentsDir=k.getAgentideDir=k.AGENT_CONSTANTS=void 0;var ct=er();Object.defineProperty(k,"AGENT_CONSTANTS",{enumerable:!0,get:function(){return ct.AGENT_CONSTANTS}});Object.defineProperty(k,"getAgentideDir",{enumerable:!0,get:function(){return ct.getAgentideDir}});Object.defineProperty(k,"getAgentsDir",{enumerable:!0,get:function(){return ct.getAgentsDir}});Object.defineProperty(k,"getAgentRoot",{enumerable:!0,get:function(){return ct.getAgentRoot}});Object.defineProperty(k,"resolveAgentRuntimePaths",{enumerable:!0,get:function(){return ct.resolveAgentRuntimePaths}});Object.defineProperty(k,"resolveRuntimePaths",{enumerable:!0,get:function(){return ct.resolveRuntimePaths}});Object.defineProperty(k,"userScopedEngineHome",{enumerable:!0,get:function(){return ct.userScopedEngineHome}});Object.defineProperty(k,"userScopedEngineHomeFromKey",{enumerable:!0,get:function(){return ct.userScopedEngineHomeFromKey}});Object.defineProperty(k,"engineHomeUserKey",{enumerable:!0,get:function(){return ct.engineHomeUserKey}});Object.defineProperty(k,"isDefaultAgent",{enumerable:!0,get:function(){return ct.isDefaultAgent}});Object.defineProperty(k,"getAgentManifestPath",{enumerable:!0,get:function(){return ct.getAgentManifestPath}});Object.defineProperty(k,"getAgentAgentsMdPath",{enumerable:!0,get:function(){return ct.getAgentAgentsMdPath}});Object.defineProperty(k,"getAgentContextPath",{enumerable:!0,get:function(){return ct.getAgentContextPath}});Object.defineProperty(k,"getAgentSkillsDir",{enumerable:!0,get:function(){return ct.getAgentSkillsDir}});Object.defineProperty(k,"getAgentRulesDir",{enumerable:!0,get:function(){return ct.getAgentRulesDir}});Object.defineProperty(k,"getAgentMcpDir",{enumerable:!0,get:function(){return ct.getAgentMcpDir}});Object.defineProperty(k,"getSessionsDir",{enumerable:!0,get:function(){return ct.getSessionsDir}});Object.defineProperty(k,"parseAgentIdFromPath",{enumerable:!0,get:function(){return ct.parseAgentIdFromPath}});Object.defineProperty(k,"getAgentideHome",{enumerable:!0,get:function(){return ct.getAgentideHome}});Object.defineProperty(k,"getUserAgentsDir",{enumerable:!0,get:function(){return ct.getUserAgentsDir}});Object.defineProperty(k,"getUserAgentRoot",{enumerable:!0,get:function(){return ct.getUserAgentRoot}});Object.defineProperty(k,"getUserAgentVersionDir",{enumerable:!0,get:function(){return ct.getUserAgentVersionDir}});Object.defineProperty(k,"getUserAgentCurrentPath",{enumerable:!0,get:function(){return ct.getUserAgentCurrentPath}});var kP=Km();Object.defineProperty(k,"AgentPackManager",{enumerable:!0,get:function(){return kP.AgentPackManager}});var wa=Pi();Object.defineProperty(k,"parseYaml",{enumerable:!0,get:function(){return wa.parseYaml}});Object.defineProperty(k,"stringifyYaml",{enumerable:!0,get:function(){return wa.stringifyYaml}});Object.defineProperty(k,"loadAgentManifest",{enumerable:!0,get:function(){return wa.loadAgentManifest}});Object.defineProperty(k,"parseAgentManifest",{enumerable:!0,get:function(){return wa.parseAgentManifest}});Object.defineProperty(k,"updateManifestName",{enumerable:!0,get:function(){return wa.updateManifestName}});var zr=Md();Object.defineProperty(k,"listUserLibraryAgents",{enumerable:!0,get:function(){return zr.listUserLibraryAgents}});Object.defineProperty(k,"isWorkspaceAgentAvailable",{enumerable:!0,get:function(){return zr.isWorkspaceAgentAvailable}});Object.defineProperty(k,"isAgentInUserLibrary",{enumerable:!0,get:function(){return zr.isAgentInUserLibrary}});Object.defineProperty(k,"hydrateFromUserLibrary",{enumerable:!0,get:function(){return zr.hydrateFromUserLibrary}});Object.defineProperty(k,"promoteToUserLibrary",{enumerable:!0,get:function(){return zr.promoteToUserLibrary}});Object.defineProperty(k,"readAgentSource",{enumerable:!0,get:function(){return zr.readAgentSource}});Object.defineProperty(k,"checkForUpdate",{enumerable:!0,get:function(){return zr.checkForUpdate}});Object.defineProperty(k,"updateFromUserLibrary",{enumerable:!0,get:function(){return zr.updateFromUserLibrary}});Object.defineProperty(k,"duplicateAgent",{enumerable:!0,get:function(){return zr.duplicateAgent}});Object.defineProperty(k,"resetDefaultAgent",{enumerable:!0,get:function(){return zr.resetDefaultAgent}});var Sa=ya();Object.defineProperty(k,"parseGitHubSource",{enumerable:!0,get:function(){return Sa.parseGitHubSource}});Object.defineProperty(k,"formatGitHubSource",{enumerable:!0,get:function(){return Sa.formatGitHubSource}});Object.defineProperty(k,"getGitHubToken",{enumerable:!0,get:function(){return Sa.getGitHubToken}});Object.defineProperty(k,"isGitHubAuthenticated",{enumerable:!0,get:function(){return Sa.isGitHubAuthenticated}});Object.defineProperty(k,"getGitHubUser",{enumerable:!0,get:function(){return Sa.getGitHubUser}});var n_=zm();Object.defineProperty(k,"publishToGitHub",{enumerable:!0,get:function(){return n_.publishToGitHub}});Object.defineProperty(k,"validateForPublish",{enumerable:!0,get:function(){return n_.validateForPublish}});var r_=t_();Object.defineProperty(k,"installFromGitHub",{enumerable:!0,get:function(){return r_.installFromGitHub}});Object.defineProperty(k,"checkGitHubUpdate",{enumerable:!0,get:function(){return r_.checkGitHubUpdate}})});var Zc=T(Bt=>{"use strict";var $P=Bt&&Bt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),DP=Bt&&Bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),LP=Bt&&Bt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&$P(n,e,r[s]);return DP(n,e),n}})();Object.defineProperty(Bt,"__esModule",{value:!0});Bt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV=Bt.GATEWAY_OUTBOUND_FILENAME=void 0;Bt.safeGatewaySessionDirId=Hd;Bt.getGatewayOutboundFilePath=s_;Bt.resolveGatewaySessionDirId=i_;Bt.resolveGatewayOutboundFilePath=UP;var MP=LP(require("path")),GP=ot();Bt.GATEWAY_OUTBOUND_FILENAME="gateway-outbound.json";Bt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV="AGENTHIPPO_GATEWAY_OUTBOUND_FILE";function Hd(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160).replace(/^\.+$/,n=>"_".repeat(n.length))||"session"}function s_(t,e){return MP.join(t,GP.AGENTIDE_DIR_NAME,"sessions",e,Bt.GATEWAY_OUTBOUND_FILENAME)}function i_(t){let e=t.chatSessionId?.trim();if(e)return Hd(e);let n=t.gatewaySessionKey?.trim();if(n)return Hd(n)}function UP(t){let e=i_(t);if(e)return s_(t.workspaceRoot,e)}});var c_=T(fn=>{"use strict";var HP=fn&&fn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),jP=fn&&fn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),xP=fn&&fn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&HP(n,e,r[s]);return jP(n,e),n}})();Object.defineProperty(fn,"__esModule",{value:!0});fn.isProcessRunning=el;fn.isProcessRunningAsync=FP;fn.isPidFileProcessRunning=VP;fn.readPidFile=o_;fn.writePidFile=KP;fn.removePidFile=a_;fn.checkPidFileWithCleanup=WP;var Aa=require("fs"),BP=xP(require("path"));function el(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function FP(t){return el(t)}async function VP(t){try{let e=await Aa.promises.readFile(t,"utf8").catch(()=>null);if(!e)return!1;let n=parseInt(e.trim().split(`
44
44
  `)[0],10);return isNaN(n)?!1:el(n)}catch{return!1}}async function o_(t){try{let n=(await Aa.promises.readFile(t,"utf8")).trim().split(`
45
45
  `),r=parseInt(n[0],10);return isNaN(r)?null:{pid:r,metadata:n.slice(1)}}catch{return null}}async function KP(t,e,...n){try{let r=BP.dirname(t);await Aa.promises.mkdir(r,{recursive:!0});let s=[e,...n].join(`
46
46
  `)+`
47
47
  `;await Aa.promises.writeFile(t,s,"utf8")}catch{}}async function a_(t){try{await Aa.promises.unlink(t)}catch{}}async function WP(t){let e=await o_(t);return e?el(e.pid)?e:(await a_(t),null):null}});var l_=T(vs=>{"use strict";var qP=vs&&vs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),YP=vs&&vs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),JP=vs&&vs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&qP(n,e,r[s]);return YP(n,e),n}})();Object.defineProperty(vs,"__esModule",{value:!0});vs.probePort=zP;var XP=JP(require("net"));function zP(t,e="127.0.0.1",n=2e3){return new Promise(r=>{let s=new XP.Socket;s.setTimeout(n),s.once("connect",()=>{s.destroy(),r(!0)}),s.once("timeout",()=>{s.destroy(),r(!1)}),s.once("error",()=>{s.destroy(),r(!1)}),s.connect(t,e)})}});var xd=T(sr=>{"use strict";var QP=sr&&sr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),ZP=sr&&sr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),jd=sr&&sr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&QP(n,e,r[s]);return ZP(n,e),n}})();Object.defineProperty(sr,"__esModule",{value:!0});sr.findBinary=u_;sr.findBinaryCached=oN;sr.getCommonBinaryPaths=aN;sr.clearBinaryCache=cN;var eN=require("child_process"),tN=require("util"),nN=require("fs"),tl=jd(require("fs")),Un=jd(require("path")),rN=jd(require("os")),sN=(0,tN.promisify)(eN.exec),nl=process.platform==="win32",iN=6e4,rl=new Map;async function u_(t,e=5e3){try{let n=nl?`where ${t}`:`which ${t}`,{stdout:r}=await sN(n,{timeout:e});return r.trim().split(`
48
- `)[0]||void 0}catch{return}}async function oN(t,e=[],n=iN){let r=Date.now(),s=rl.get(t);if(s&&r-s.timestamp<n)return s.path;let i=await u_(t);if(!i)for(let o of e)try{await nN.promises.access(o,nl?tl.constants.F_OK:tl.constants.X_OK),i=o;break}catch{}return rl.set(t,{path:i,timestamp:r}),i}function aN(t){let e=rN.homedir(),n=nl?`${t}.cmd`:t;if(nl){let o=process.env.LOCALAPPDATA||Un.join(e,"AppData","Local");return[Un.join(o,"AgentHippo","bin",n),Un.join(e,"AppData","Local","Programs",t,`${t}.exe`),Un.join(e,"AppData","Roaming","npm",n),Un.join(e,"AppData","Local","pnpm",n),Un.join(e,".npm-global",n)]}let r=[Un.join(e,".local","bin",t),Un.join(e,"Library","pnpm",t),Un.join(e,".local","share","pnpm",t),Un.join(e,".npm-global","bin",t),"/opt/homebrew/bin/"+t,"/usr/local/bin/"+t,"/usr/bin/"+t],s=process.env.NVM_DIR||Un.join(e,".nvm"),i=Un.join(s,"versions","node");if(tl.existsSync(i))try{let o=tl.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort().reverse();for(let a of o)r.push(Un.join(i,a,"bin",t))}catch{}return r}function cN(t){t?rl.delete(t):rl.clear()}});var sl=T(Nr=>{"use strict";var lN=Nr&&Nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),uN=Nr&&Nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Bd=Nr&&Nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&lN(n,e,r[s]);return uN(n,e),n}})();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.getNodeBinaryCandidates=__;Nr.resolveNodeBinary=hN;Nr.prependPathDir=mN;var Ri=Bd(require("fs")),g_=Bd(require("os")),bo=Bd(require("path")),d_=xd(),h_=process.platform==="win32",dN=h_?"node.exe":"node",f_=bo.join(g_.homedir(),".agenthippo","gateway","install.json"),p_=bo.join(g_.homedir(),".agenthippo","tools","node");function m_(t){try{let e=h_?Ri.constants.F_OK:Ri.constants.X_OK;return Ri.accessSync(t,e),!0}catch{return!1}}function fN(){try{if(!Ri.existsSync(f_))return;let t=Ri.readFileSync(f_,"utf8").replace(/^\uFEFF/,""),n=JSON.parse(t).nodePath?.trim();return n&&m_(n)?n:void 0}catch{return}}function pN(){if(!Ri.existsSync(p_))return[];let t=[],e=(n,r)=>{if(r>4)return;let s;try{s=Ri.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){let o=bo.join(n,i.name);i.isDirectory()?e(o,r+1):i.isFile()&&i.name===dN&&n.endsWith(`${bo.sep}bin`)&&t.push(o)}};return e(p_,0),t.sort().reverse()}function gN(t){let e=new Set,n=[];for(let r of t){let s=bo.resolve(r);e.has(s)||!m_(s)||(e.add(s),n.push(s))}return n}function __(){let t=[];process.env.NODE_BIN?.trim()&&t.push(process.env.NODE_BIN.trim());let e=fN();return e&&t.push(e),t.push(...pN()),process.env.npm_node_execpath?.trim()&&t.push(process.env.npm_node_execpath.trim()),gN(t)}async function hN(){let t=__();if(t.length>0)return t[0];let e=await(0,d_.findBinaryCached)("node",(0,d_.getCommonBinaryPaths)("node"));return e||"node"}function mN(t,e){if(!e?.trim())return;let n=e.trim(),r=t.PATH?.trim();t.PATH=r?`${n}${bo.delimiter}${r}`:n}});var ba=T(ge=>{"use strict";Object.defineProperty(ge,"__esModule",{value:!0});ge.prependPathDir=ge.getNodeBinaryCandidates=ge.resolveNodeBinary=ge.clearBinaryCache=ge.getCommonBinaryPaths=ge.findBinaryCached=ge.findBinary=ge.probePort=ge.DIRS=ge.PID_FILES=ge.getAnalyticsScriptsDir=ge.getAgentidePath=ge.getAgentideHome=ge.checkPidFileWithCleanup=ge.removePidFile=ge.writePidFile=ge.readPidFile=ge.isPidFileProcessRunning=ge.isProcessRunningAsync=ge.isProcessRunning=void 0;var Ci=c_();Object.defineProperty(ge,"isProcessRunning",{enumerable:!0,get:function(){return Ci.isProcessRunning}});Object.defineProperty(ge,"isProcessRunningAsync",{enumerable:!0,get:function(){return Ci.isProcessRunningAsync}});Object.defineProperty(ge,"isPidFileProcessRunning",{enumerable:!0,get:function(){return Ci.isPidFileProcessRunning}});Object.defineProperty(ge,"readPidFile",{enumerable:!0,get:function(){return Ci.readPidFile}});Object.defineProperty(ge,"writePidFile",{enumerable:!0,get:function(){return Ci.writePidFile}});Object.defineProperty(ge,"removePidFile",{enumerable:!0,get:function(){return Ci.removePidFile}});Object.defineProperty(ge,"checkPidFileWithCleanup",{enumerable:!0,get:function(){return Ci.checkPidFileWithCleanup}});var Ta=bi();Object.defineProperty(ge,"getAgentideHome",{enumerable:!0,get:function(){return Ta.getAgentideHome}});Object.defineProperty(ge,"getAgentidePath",{enumerable:!0,get:function(){return Ta.getAgentidePath}});Object.defineProperty(ge,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return Ta.getAnalyticsScriptsDir}});Object.defineProperty(ge,"PID_FILES",{enumerable:!0,get:function(){return Ta.PID_FILES}});Object.defineProperty(ge,"DIRS",{enumerable:!0,get:function(){return Ta.DIRS}});var _N=l_();Object.defineProperty(ge,"probePort",{enumerable:!0,get:function(){return _N.probePort}});var il=xd();Object.defineProperty(ge,"findBinary",{enumerable:!0,get:function(){return il.findBinary}});Object.defineProperty(ge,"findBinaryCached",{enumerable:!0,get:function(){return il.findBinaryCached}});Object.defineProperty(ge,"getCommonBinaryPaths",{enumerable:!0,get:function(){return il.getCommonBinaryPaths}});Object.defineProperty(ge,"clearBinaryCache",{enumerable:!0,get:function(){return il.clearBinaryCache}});var Fd=sl();Object.defineProperty(ge,"resolveNodeBinary",{enumerable:!0,get:function(){return Fd.resolveNodeBinary}});Object.defineProperty(ge,"getNodeBinaryCandidates",{enumerable:!0,get:function(){return Fd.getNodeBinaryCandidates}});Object.defineProperty(ge,"prependPathDir",{enumerable:!0,get:function(){return Fd.prependPathDir}})});var Cr=T(Xe=>{"use strict";var EN=Xe&&Xe.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),yN=Xe&&Xe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Kd=Xe&&Xe.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&EN(n,e,r[s]);return yN(n,e),n}})();Object.defineProperty(Xe,"__esModule",{value:!0});Xe.OPENCLAW_GATEWAY_TOKEN_ENV=Xe.AGENTHIPPO_CHAT_SESSION_ID_ENV=Xe.AGENTIDE_CHAT_SESSION_ID_ENV=void 0;Xe.readOpenClawGatewayToken=w_;Xe.getBundledToolsHealth=TN;Xe.getCliHealth=NN;Xe.buildSessionEnvPatch=I_;Xe.buildCliEnvPatch=RN;Xe.readProvenanceEnvFromProcess=CN;Xe.buildProvenanceEnv=kN;Xe.runCli=P_;var Qr=Kd(require("fs")),wN=Kd(require("os")),Rr=Kd(require("path")),SN=require("child_process"),ol=ot(),E_=Zc(),Vd=ba();Xe.AGENTIDE_CHAT_SESSION_ID_ENV="AGENTIDE_CHAT_SESSION_ID";Xe.AGENTHIPPO_CHAT_SESSION_ID_ENV="AGENTHIPPO_CHAT_SESSION_ID";Xe.OPENCLAW_GATEWAY_TOKEN_ENV="OPENCLAW_GATEWAY_TOKEN";function w_(t){let e=t?.OPENCLAW_GATEWAY_TOKEN?.trim()||process.env.OPENCLAW_GATEWAY_TOKEN?.trim();if(e)return e;try{let n=Rr.join(wN.homedir(),".openclaw","openclaw.json"),r=Qr.readFileSync(n,"utf-8"),i=JSON.parse(r).gateway?.auth?.token;return typeof i=="string"?i.trim():void 0}catch{return}}var S_=["rg","sg","tree-sitter"];function A_(t=process.platform,e=process.arch){if(t==="darwin"&&e==="arm64")return"darwin-arm64";if(t==="darwin"&&e==="x64")return"darwin-x64";if(t==="linux"&&e==="x64")return"linux-x64";if(t==="linux"&&e==="arm64")return"linux-arm64";if(t==="win32"&&e==="x64")return"win32-x64";if(t==="win32"&&e==="arm64")return"win32-arm64"}function T_(t){return process.platform!=="win32"?t:`${t}.exe`}function b_(t){for(let e of S_){let n=Rr.join(t,T_(e));try{let r=process.platform==="win32"?Qr.constants.F_OK:Qr.constants.X_OK;return Qr.accessSync(n,r),!0}catch{}}return!1}function v_(t,e){let n=A_();if(!n)return[];let r=[],s=process.env.AGENTHIPPO_TOOLS_DIR||process.env.AGENTIDE_TOOLS_DIR;return s?.trim()&&r.push(O_(s)),t?.trim()&&r.push(Rr.join(t,"tools",n)),e?.trim()&&r.push(Rr.join(e,"tools",n)),r}function AN(t,e){let n=v_(t,e);for(let r of n)if(b_(r))return r}function TN(t={}){let e=A_(),n=v_(t.extensionPath,t.binaryDirHint),r=n.find(o=>b_(o)),s=r??n[0],i=S_.map(o=>{let a=s??"",c=Rr.join(a,T_(o)),l=!1;if(s)try{let u=process.platform==="win32"?Qr.constants.F_OK:Qr.constants.X_OK;Qr.accessSync(c,u),l=!0}catch{l=!1}return{name:o,path:c,available:l}});return{platformKey:e,toolsDir:r,tools:i}}function bN(t,e){let n=e.map(o=>o.trim()).filter(Boolean),r=t.split(Rr.delimiter).map(o=>o.trim()).filter(Boolean),s=new Set,i=[];for(let o of[...n,...r]){let a=process.platform==="win32"?o.toLowerCase():o;s.has(a)||(s.add(a),i.push(o))}return i.join(Rr.delimiter)}function vN(t){return process.platform!=="win32"?"PATH":t&&Object.prototype.hasOwnProperty.call(t,"Path")?"Path":"PATH"}var ON=3e4,ki;async function y_(t){try{let e=process.platform==="win32"?Qr.constants.F_OK:Qr.constants.X_OK;return await Qr.promises.access(t,e),!0}catch{return!1}}function O_(t){return t.trim().replace(/^"|"$/g,"")}async function IN(t){let e=t.configuredPath?.trim();if(e){let r=O_(e);if(await y_(r))return{path:r,source:"setting"}}if(t.extensionPath){let r=[ol.AGENTIDE_CLI_NAME,"agentide"],s=process.platform==="win32"?[".cmd",".exe",".bat",""]:[""],i=[];for(let o of r)for(let a of s)i.push(Rr.join(t.extensionPath,"dist",`${o}${a}`));for(let o of i)if(await y_(o))return{path:o,source:"bundled"}}t.forceRefresh&&(0,Vd.clearBinaryCache)(ol.AGENTIDE_CLI_NAME);let n=await(0,Vd.findBinaryCached)(ol.AGENTIDE_CLI_NAME,(0,Vd.getCommonBinaryPaths)(ol.AGENTIDE_CLI_NAME));return n?{path:n,source:"path"}:{source:"not_found"}}async function PN(t){try{let e=await P_(t,["--version"],{timeoutMs:5e3});return e.code!==0?void 0:e.stdout.trim().split(/\r?\n/)[0]||void 0}catch{return}}async function NN(t={}){let e=Date.now();if(!t.forceRefresh&&ki&&e-ki.lastCheckedAt<ON)return ki;let n=await IN(t);if(!n.path)return ki={installed:!1,source:"not_found",lastCheckedAt:e,error:t.configuredPath?`Configured path not found: ${t.configuredPath}`:void 0},ki;let r=await PN(n.path);return ki={installed:!0,path:n.path,version:r,source:n.source,lastCheckedAt:e},ki}function I_(t){let e=t.chatSessionId?.trim(),n=t.gatewaySessionKey?.trim();if(!e&&!n)return{};let r={};e&&(r[Xe.AGENTIDE_CHAT_SESSION_ID_ENV]=e,r[Xe.AGENTHIPPO_CHAT_SESSION_ID_ENV]=e);let s=(0,E_.resolveGatewayOutboundFilePath)({workspaceRoot:t.workspaceRoot,gatewaySessionKey:n,chatSessionId:n?void 0:e});return s&&(r[E_.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV]=s),r}function RN(t){let e={AGENTHIPPO_WORKSPACE_ROOT:t.workspaceRoot,AGENTHIPPO_ACTIVE_AGENT:t.agentId,...I_({workspaceRoot:t.workspaceRoot,chatSessionId:t.chatSessionId})};if(!t.omitGatewayToken&&!process.env.AGENTHIPPO_EGRESS_URL?.trim()){let i=w_(t.baseEnv);i&&(e[Xe.OPENCLAW_GATEWAY_TOKEN_ENV]=i)}e.CLAUDECODE="";let n=[];t.userInstalledToolsDir?.trim()&&(n.push(t.userInstalledToolsDir.trim()),e.AGENTHIPPO_TOOLS_DIR=t.userInstalledToolsDir.trim(),e.AGENTIDE_TOOLS_DIR=t.userInstalledToolsDir.trim());try{let i=require("@vscode/ripgrep");i?.rgPath&&typeof i.rgPath=="string"&&n.push(Rr.dirname(i.rgPath))}catch{}if(t.cliPath?.trim()){let i=t.cliPath.trim();e.AGENTHIPPO_CLI_PATH=i,n.push(Rr.dirname(i))}let r=t.cliPath?.trim()?Rr.dirname(t.cliPath.trim()):void 0,s=AN(t.extensionPath,r);if(s&&!t.userInstalledToolsDir?.trim()?(e.AGENTHIPPO_TOOLS_DIR=s,e.AGENTIDE_TOOLS_DIR=s,n.push(s)):s&&n.push(s),n.length>0){let i=vN(t.baseEnv),o=t.baseEnv?.[i]??t.baseEnv?.PATH??t.baseEnv?.Path??"";e[i]=bN(o,n)}return e}function CN(){let t=r=>process.env[r]?.trim()||void 0,e=t("AGENTIDE_ANALYTICS_TIER"),n=e!==void 0?Number(e):void 0;return{policyVersion:t("AGENTIDE_ANALYTICS_POLICY_VERSION"),packDigest:t("AGENTIDE_ANALYTICS_PACK_DIGEST"),engineVersion:t("AGENTIDE_ANALYTICS_ENGINE_VERSION"),tier:n!==void 0&&Number.isFinite(n)?n:void 0,instanceId:t("AGENTIDE_ANALYTICS_INSTANCE_ID")}}function kN(t){let e={};return t.policyVersion?.trim()&&(e.AGENTIDE_ANALYTICS_POLICY_VERSION=t.policyVersion.trim()),t.packDigest?.trim()&&(e.AGENTIDE_ANALYTICS_PACK_DIGEST=t.packDigest.trim()),t.engineVersion?.trim()&&(e.AGENTIDE_ANALYTICS_ENGINE_VERSION=t.engineVersion.trim()),t.tier!==void 0&&(e.AGENTIDE_ANALYTICS_TIER=String(t.tier)),t.instanceId?.trim()&&(e.AGENTIDE_ANALYTICS_INSTANCE_ID=t.instanceId.trim()),e}async function P_(t,e,n){return await new Promise((r,s)=>{let i=(0,SN.spawn)(t,e,{cwd:n?.cwd,env:{...process.env,...n?.env??{}},shell:!1}),o="",a="",c=!1,l=n?.timeoutMs??6e4,u=setTimeout(()=>{c||(i.kill(),s(new Error(`CLI command timed out after ${l}ms`)))},l);i.stdout.on("data",d=>{o+=d.toString()}),i.stderr.on("data",d=>{a+=d.toString()}),i.on("error",d=>{c||(c=!0,clearTimeout(u),s(d))}),i.on("close",d=>{c||(c=!0,clearTimeout(u),r({code:d??1,stdout:o,stderr:a}))})})}});var al=T(ir=>{"use strict";Object.defineProperty(ir,"__esModule",{value:!0});ir.RevocationUnsupportedError=ir.SANDBOX_PROVIDER_KEY_ENV=ir.SANDBOX_TIER_ENV=void 0;ir.sandboxHoldsProviderKey=$N;ir.isContainerSandbox=DN;ir.SANDBOX_TIER_ENV="AGENTHIPPO_SANDBOX_TIER";ir.SANDBOX_PROVIDER_KEY_ENV="AGENTHIPPO_SANDBOX_PROVIDER_KEY";function $N(t=process.env){return t[ir.SANDBOX_PROVIDER_KEY_ENV]==="1"}function DN(t=process.env){return Number(t[ir.SANDBOX_TIER_ENV])>=2}var Wd=class extends Error{constructor(e,n){super(`${e} driver cannot revoke '${n}' \u2014 no enforcement boundary at this tier (use 'all', which kills the sandbox)`),this.name="RevocationUnsupportedError"}};ir.RevocationUnsupportedError=Wd});var W_=T(ar=>{"use strict";var LN=ar&&ar.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MN=ar&&ar.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),GN=ar&&ar.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LN(n,e,r[s]);return MN(n,e),n}})();Object.defineProperty(ar,"__esModule",{value:!0});ar.CodexEngine=void 0;ar.resolveCodexReasoningEffort=V_;ar.registerNewFilesWithTracker=K_;var or=require("fs"),On=GN(require("path")),N_=_a(),UN=Tc(),HN=Ic(),cl=Ii(),lt=dn(),R_=Cd(),qd=Oi(),$i=Ud(),jN=As(),xN=Cr(),C_=al(),BN="agentide-litellm",FN="agentide-custom",Yd="AGENTIDE_ANALYTICS_SESSION_ID",Jd="AGENTIDE_ANALYTICS_USER_ID",k_="AGENTIDE_ANALYTICS_PROJECT_ID",$_="AGENTIDE_ANALYTICS_AGENT_ID",D_="AGENTIDE_ANALYTICS_AGENT_VERSION",L_="AGENTIDE_ANALYTICS_SOURCE",M_="AGENTIDE_ANALYTICS_ENGINE",G_="AGENTIDE_ANALYTICS_REQUEST_ID",U_="AGENTIDE_ANALYTICS_POLICY_VERSION",H_="AGENTIDE_ANALYTICS_PACK_DIGEST",j_="AGENTIDE_ANALYTICS_ENGINE_VERSION",x_="AGENTIDE_ANALYTICS_TIER",B_="AGENTIDE_ANALYTICS_INSTANCE_ID";function V_(t){let e=t?.trim();return e&&UN.ENGINE_EFFORTS.codex.includes(e)?e:"medium"}var VN=22,KN="AGENTIDE_CONTEXT_EXPORT_PATH",WN="AGENTIDE_TERMINAL_LOG_PATH";async function K_(t,e,n){if(e.appliesEdits!==!1)for(let r of t)try{if((0,lt.isBinaryFile)(r)||!await(0,lt.pathExists)(r))continue;let s=await or.promises.readFile(r,"utf-8");try{await or.promises.unlink(r),await e.applyEdit(n,r,s,!0)}finally{await(0,lt.pathExists)(r)||await or.promises.writeFile(r,s,"utf-8")}}catch{}}function F_(t){return t.type==="item.started"||t.type==="item.updated"||t.type==="item.completed"}var Xd=class{config;getSkillsSignature;getBundledBasePromptsDir;id="codex";displayName="Codex";lastWrittenConfigSignature;lastCodexSkillsSignatureByWorkspaceRoot=new Map;constructor(e,n,r){this.config=e,this.getSkillsSignature=n,this.getBundledBasePromptsDir=r}async stream(e,n,r,s,i){let o=s.logger,a=s.editTracker,{Codex:c}=await import("@openai/codex-sdk");if(!n.modelId)throw new Error("Codex modelId not provided for streaming request");let l=n.modelId,u=(0,lt.resolveApiRouting)(n,this.config,"openai"),d=u.apiKey,f=u.openaiBaseUrl,p=u.useLiteLLM,g=n.sessionId,_=n.analyticsUserId,h=(0,cl.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),E=f&&f!=="https://api.openai.com/v1",w=p?"LiteLLM proxy":E?"custom provider":"direct OpenAI";o.info(`[AgentIDE] Codex routing: ${w}, baseUrl=${f||"default"}, workspaceRoot=${n.workspaceRoot}`);let A=l.toLowerCase().includes("claude");o.info(`[AgentIDE] Codex wire_api=responses (model=${l})`),A&&(p||E)&&o.info("[AgentIDE] Codex note: selected model appears to be Claude via proxy; reasoning summaries depend on provider support over the Responses API.");let C={...process.env,...s.cliEnvPatch??{},OPENAI_LOG:"debug"};delete C[xN.OPENCLAW_GATEWAY_TOKEN_ENV],delete C.AGENTHIPPO_DATA_PLANE_TOKEN;let v=g?.trim(),I=n.contextSessionId?.trim()||v;I&&(C[KN]=On.join(n.workspaceRoot,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",I,"context.md"),C[WN]=On.join(n.workspaceRoot,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",I,"terminal.md"));let P=n.agentPackId??"default",L=(0,$i.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,P,n.agentPackVersion),N=(0,$i.userScopedEngineHomeFromKey)(L.codexHome,(0,jN.resolveEngineHomeUserKey)(n.engineHomeUserKey));C.CODEX_HOME=N,await or.promises.mkdir(N,{recursive:!0}),C.AGENT_ID=P,n.agentPackVersion&&(C.AGENTIDE_AGENT_VERSION=n.agentPackVersion),P!=="default"?o.info(`[AgentIDE] Codex using agent: ${P}, CODEX_HOME=${N} (agent-isolated)`):o.info(`[AgentIDE] Codex using default agent, CODEX_HOME=${N}`);let O=E?f:void 0;await this.ensureCodexConfig(p,O,l,n.workspaceRoot,n.additionalDirectories??[],o,N,P,s.permissionHandler instanceof HN.AutoApprovePermissionHandler),p&&N&&(_?.trim()&&(C[Jd]=_.trim()),g?.trim()&&(C[Yd]=g.trim()),h?.trim()&&(C[k_]=h.trim()),C[$_]=P,C[D_]=n.agentPackVersion??"workspace",C[L_]="agenthippo",C[M_]="codex",n.requestId&&(C[G_]=n.requestId),n.policyVersion?.trim()&&(C[U_]=n.policyVersion.trim()),n.packDigest?.trim()&&(C[H_]=n.packDigest.trim()),n.engineVersion?.trim()&&(C[j_]=n.engineVersion.trim()),n.tier!==void 0&&(C[x_]=String(n.tier)),n.instanceId?.trim()&&(C[B_]=n.instanceId.trim())),E&&d&&(C.CODEX_API_KEY=d),E&&(C.OPENAI_BASE_URL=f,o.info(`[AgentIDE] Using custom OpenAI base URL: ${f}`),(0,lt.applyLocalTlsBypass)(C,f)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS (Codex)"));let G=(0,qd.buildConversationKey)("codex",n);o.info(`[AgentIDE] Codex conversationKey=${G.key} (chatSessionId=${G.chatSessionId}, signature=${G.signatureHash}${G.isEphemeral?", ephemeral":""})`),await(0,qd.withConversationLock)(G.key,async()=>{await r.progress("Thinking...");let H=n.permissions??R_.DEFAULT_PERMISSIONS;o.info(`[AgentIDE] Codex permissions: fileAccess=${H.fileAccess}`);let X=[n.workspaceRoot,...n.additionalDirectories??[]],J=(0,R_.toCodexOptions)(H,X);(0,C_.isContainerSandbox)()&&(J.sandboxMode="danger-full-access"),o.info(`[AgentIDE] Codex mapped: sandboxMode=${J.sandboxMode}, approvalPolicy=${J.approvalPolicy}`);let W=n.workspaceRoot,ee={model:l,sandboxMode:J.sandboxMode,approvalPolicy:J.approvalPolicy,additionalDirectories:J.additionalDirectories,workingDirectory:W,skipGitRepoCheck:!0,modelReasoningEffort:V_((0,lt.getAgentideEngineSettings)(s?.configProvider).effort)};o.info(`[AgentIDE] Codex modelReasoningEffort=${ee.modelReasoningEffort??"default"}`);let le=E?void 0:d,pe=new c({apiKey:le,env:C,...this.config.codexExecutablePath?{codexPathOverride:this.config.codexExecutablePath}:{}}),We=(0,cl.getPersistedSessionId)("codex",G.key),Ue;if(We)try{Ue=pe.resumeThread(We,ee),o.info(`[AgentIDE] Codex resuming thread: ${We} (model: ${l})`)}catch(se){o.warn(`[AgentIDE] Failed to resume Codex thread (${We}): ${se instanceof Error?se.message:String(se)}. Starting new thread.`),Ue=pe.startThread(ee)}else Ue=pe.startThread(ee),o.info(`[AgentIDE] Codex starting new thread (model: ${l})`);if(i?.aborted){o.info("[AgentIDE] Codex stream cancelled before starting turn");return}let vt;try{({events:vt}=await Ue.runStreamed(e,{signal:i}))}catch(se){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted while starting turn");return}throw se}let xe=new Map,dt=new Map,yn=new Map,zn=0,it=0,sn=0,_i=!1,Vr=se=>se.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160);try{for await(let se of vt){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted; stopping event loop");return}let Ei=F_(se)?se.item.type:void 0;if(o.debug(`[AgentIDE] Codex event: ${se.type}${Ei?` (item: ${Ei})`:""}`),se.type==="thread.started"){let ae=se.thread_id;o.info(`[AgentIDE] Codex thread started: ${ae}`),await(0,cl.persistSessionIfNeeded)("codex",G,ae,n);continue}if(se.type==="turn.failed")throw await r.error(se.error?.message||"Codex turn failed"),new Error(se.error?.message||"Codex turn failed");if(se.type==="error"){let D=/^Reconnecting\.\.\. \d+\/\d+/.exec(se.message??"");if(D){o.warn(`[AgentIDE] Codex ${se.message}`),await r.progress(D[0]);continue}throw await r.error(se.message||"Codex stream error"),new Error(se.message||"Codex stream error")}if(se.type==="turn.completed"){o.info(`[AgentIDE] Codex usage: input=${se.usage.input_tokens}, cached=${se.usage.cached_input_tokens}, output=${se.usage.output_tokens}`);continue}if(F_(se)){let{item:D}=se;if(D.type==="reasoning"){sn++;let ae=D.text??"",oe=(0,lt.computeTextDelta)(D.id,D.text??"",xe);oe?(zn++,it+=oe.length,zn<=3&&o.debug(`[AgentIDE] Codex reasoning delta #${zn} (${oe.length} chars): ${Vr(oe)}`),await r.thinking(oe)):!_i&&ae.length===0&&(_i=!0,o.debug("[AgentIDE] Codex reasoning item observed but text is empty so far."))}else if(D.type==="agent_message"){let ae=(0,lt.computeTextDelta)(D.id,D.text??"",xe);ae&&await r.text(ae)}else if(D.type==="command_execution"){if(se.type==="item.started"&&(await r.thinking(`**Running command**
48
+ `)[0]||void 0}catch{return}}async function oN(t,e=[],n=iN){let r=Date.now(),s=rl.get(t);if(s&&r-s.timestamp<n)return s.path;let i=await u_(t);if(!i)for(let o of e)try{await nN.promises.access(o,nl?tl.constants.F_OK:tl.constants.X_OK),i=o;break}catch{}return rl.set(t,{path:i,timestamp:r}),i}function aN(t){let e=rN.homedir(),n=nl?`${t}.cmd`:t;if(nl){let o=process.env.LOCALAPPDATA||Un.join(e,"AppData","Local");return[Un.join(o,"AgentHippo","bin",n),Un.join(e,"AppData","Local","Programs",t,`${t}.exe`),Un.join(e,"AppData","Roaming","npm",n),Un.join(e,"AppData","Local","pnpm",n),Un.join(e,".npm-global",n)]}let r=[Un.join(e,".local","bin",t),Un.join(e,"Library","pnpm",t),Un.join(e,".local","share","pnpm",t),Un.join(e,".npm-global","bin",t),"/opt/homebrew/bin/"+t,"/usr/local/bin/"+t,"/usr/bin/"+t],s=process.env.NVM_DIR||Un.join(e,".nvm"),i=Un.join(s,"versions","node");if(tl.existsSync(i))try{let o=tl.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort().reverse();for(let a of o)r.push(Un.join(i,a,"bin",t))}catch{}return r}function cN(t){t?rl.delete(t):rl.clear()}});var sl=T(Nr=>{"use strict";var lN=Nr&&Nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),uN=Nr&&Nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Bd=Nr&&Nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&lN(n,e,r[s]);return uN(n,e),n}})();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.getNodeBinaryCandidates=__;Nr.resolveNodeBinary=hN;Nr.prependPathDir=mN;var Ri=Bd(require("fs")),g_=Bd(require("os")),bo=Bd(require("path")),d_=xd(),h_=process.platform==="win32",dN=h_?"node.exe":"node",f_=bo.join(g_.homedir(),".agenthippo","gateway","install.json"),p_=bo.join(g_.homedir(),".agenthippo","tools","node");function m_(t){try{let e=h_?Ri.constants.F_OK:Ri.constants.X_OK;return Ri.accessSync(t,e),!0}catch{return!1}}function fN(){try{if(!Ri.existsSync(f_))return;let t=Ri.readFileSync(f_,"utf8").replace(/^\uFEFF/,""),n=JSON.parse(t).nodePath?.trim();return n&&m_(n)?n:void 0}catch{return}}function pN(){if(!Ri.existsSync(p_))return[];let t=[],e=(n,r)=>{if(r>4)return;let s;try{s=Ri.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){let o=bo.join(n,i.name);i.isDirectory()?e(o,r+1):i.isFile()&&i.name===dN&&n.endsWith(`${bo.sep}bin`)&&t.push(o)}};return e(p_,0),t.sort().reverse()}function gN(t){let e=new Set,n=[];for(let r of t){let s=bo.resolve(r);e.has(s)||!m_(s)||(e.add(s),n.push(s))}return n}function __(){let t=[];process.env.NODE_BIN?.trim()&&t.push(process.env.NODE_BIN.trim());let e=fN();return e&&t.push(e),t.push(...pN()),process.env.npm_node_execpath?.trim()&&t.push(process.env.npm_node_execpath.trim()),gN(t)}async function hN(){let t=__();if(t.length>0)return t[0];let e=await(0,d_.findBinaryCached)("node",(0,d_.getCommonBinaryPaths)("node"));return e||"node"}function mN(t,e){if(!e?.trim())return;let n=e.trim(),r=t.PATH?.trim();t.PATH=r?`${n}${bo.delimiter}${r}`:n}});var ba=T(ge=>{"use strict";Object.defineProperty(ge,"__esModule",{value:!0});ge.prependPathDir=ge.getNodeBinaryCandidates=ge.resolveNodeBinary=ge.clearBinaryCache=ge.getCommonBinaryPaths=ge.findBinaryCached=ge.findBinary=ge.probePort=ge.DIRS=ge.PID_FILES=ge.getAnalyticsScriptsDir=ge.getAgentidePath=ge.getAgentideHome=ge.checkPidFileWithCleanup=ge.removePidFile=ge.writePidFile=ge.readPidFile=ge.isPidFileProcessRunning=ge.isProcessRunningAsync=ge.isProcessRunning=void 0;var Ci=c_();Object.defineProperty(ge,"isProcessRunning",{enumerable:!0,get:function(){return Ci.isProcessRunning}});Object.defineProperty(ge,"isProcessRunningAsync",{enumerable:!0,get:function(){return Ci.isProcessRunningAsync}});Object.defineProperty(ge,"isPidFileProcessRunning",{enumerable:!0,get:function(){return Ci.isPidFileProcessRunning}});Object.defineProperty(ge,"readPidFile",{enumerable:!0,get:function(){return Ci.readPidFile}});Object.defineProperty(ge,"writePidFile",{enumerable:!0,get:function(){return Ci.writePidFile}});Object.defineProperty(ge,"removePidFile",{enumerable:!0,get:function(){return Ci.removePidFile}});Object.defineProperty(ge,"checkPidFileWithCleanup",{enumerable:!0,get:function(){return Ci.checkPidFileWithCleanup}});var Ta=bi();Object.defineProperty(ge,"getAgentideHome",{enumerable:!0,get:function(){return Ta.getAgentideHome}});Object.defineProperty(ge,"getAgentidePath",{enumerable:!0,get:function(){return Ta.getAgentidePath}});Object.defineProperty(ge,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return Ta.getAnalyticsScriptsDir}});Object.defineProperty(ge,"PID_FILES",{enumerable:!0,get:function(){return Ta.PID_FILES}});Object.defineProperty(ge,"DIRS",{enumerable:!0,get:function(){return Ta.DIRS}});var _N=l_();Object.defineProperty(ge,"probePort",{enumerable:!0,get:function(){return _N.probePort}});var il=xd();Object.defineProperty(ge,"findBinary",{enumerable:!0,get:function(){return il.findBinary}});Object.defineProperty(ge,"findBinaryCached",{enumerable:!0,get:function(){return il.findBinaryCached}});Object.defineProperty(ge,"getCommonBinaryPaths",{enumerable:!0,get:function(){return il.getCommonBinaryPaths}});Object.defineProperty(ge,"clearBinaryCache",{enumerable:!0,get:function(){return il.clearBinaryCache}});var Fd=sl();Object.defineProperty(ge,"resolveNodeBinary",{enumerable:!0,get:function(){return Fd.resolveNodeBinary}});Object.defineProperty(ge,"getNodeBinaryCandidates",{enumerable:!0,get:function(){return Fd.getNodeBinaryCandidates}});Object.defineProperty(ge,"prependPathDir",{enumerable:!0,get:function(){return Fd.prependPathDir}})});var Cr=T(Xe=>{"use strict";var EN=Xe&&Xe.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),yN=Xe&&Xe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Kd=Xe&&Xe.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&EN(n,e,r[s]);return yN(n,e),n}})();Object.defineProperty(Xe,"__esModule",{value:!0});Xe.OPENCLAW_GATEWAY_TOKEN_ENV=Xe.AGENTHIPPO_CHAT_SESSION_ID_ENV=Xe.AGENTIDE_CHAT_SESSION_ID_ENV=void 0;Xe.readOpenClawGatewayToken=w_;Xe.getBundledToolsHealth=TN;Xe.getCliHealth=NN;Xe.buildSessionEnvPatch=I_;Xe.buildCliEnvPatch=RN;Xe.readProvenanceEnvFromProcess=CN;Xe.buildProvenanceEnv=kN;Xe.runCli=P_;var Qr=Kd(require("fs")),wN=Kd(require("os")),Rr=Kd(require("path")),SN=require("child_process"),ol=ot(),E_=Zc(),Vd=ba();Xe.AGENTIDE_CHAT_SESSION_ID_ENV="AGENTIDE_CHAT_SESSION_ID";Xe.AGENTHIPPO_CHAT_SESSION_ID_ENV="AGENTHIPPO_CHAT_SESSION_ID";Xe.OPENCLAW_GATEWAY_TOKEN_ENV="OPENCLAW_GATEWAY_TOKEN";function w_(t){let e=t?.OPENCLAW_GATEWAY_TOKEN?.trim()||process.env.OPENCLAW_GATEWAY_TOKEN?.trim();if(e)return e;try{let n=Rr.join(wN.homedir(),".openclaw","openclaw.json"),r=Qr.readFileSync(n,"utf-8"),i=JSON.parse(r).gateway?.auth?.token;return typeof i=="string"?i.trim():void 0}catch{return}}var S_=["rg","sg","tree-sitter"];function A_(t=process.platform,e=process.arch){if(t==="darwin"&&e==="arm64")return"darwin-arm64";if(t==="darwin"&&e==="x64")return"darwin-x64";if(t==="linux"&&e==="x64")return"linux-x64";if(t==="linux"&&e==="arm64")return"linux-arm64";if(t==="win32"&&e==="x64")return"win32-x64";if(t==="win32"&&e==="arm64")return"win32-arm64"}function T_(t){return process.platform!=="win32"?t:`${t}.exe`}function b_(t){for(let e of S_){let n=Rr.join(t,T_(e));try{let r=process.platform==="win32"?Qr.constants.F_OK:Qr.constants.X_OK;return Qr.accessSync(n,r),!0}catch{}}return!1}function v_(t,e){let n=A_();if(!n)return[];let r=[],s=process.env.AGENTHIPPO_TOOLS_DIR||process.env.AGENTIDE_TOOLS_DIR;return s?.trim()&&r.push(O_(s)),t?.trim()&&r.push(Rr.join(t,"tools",n)),e?.trim()&&r.push(Rr.join(e,"tools",n)),r}function AN(t,e){let n=v_(t,e);for(let r of n)if(b_(r))return r}function TN(t={}){let e=A_(),n=v_(t.extensionPath,t.binaryDirHint),r=n.find(o=>b_(o)),s=r??n[0],i=S_.map(o=>{let a=s??"",c=Rr.join(a,T_(o)),l=!1;if(s)try{let u=process.platform==="win32"?Qr.constants.F_OK:Qr.constants.X_OK;Qr.accessSync(c,u),l=!0}catch{l=!1}return{name:o,path:c,available:l}});return{platformKey:e,toolsDir:r,tools:i}}function bN(t,e){let n=e.map(o=>o.trim()).filter(Boolean),r=t.split(Rr.delimiter).map(o=>o.trim()).filter(Boolean),s=new Set,i=[];for(let o of[...n,...r]){let a=process.platform==="win32"?o.toLowerCase():o;s.has(a)||(s.add(a),i.push(o))}return i.join(Rr.delimiter)}function vN(t){return process.platform!=="win32"?"PATH":t&&Object.prototype.hasOwnProperty.call(t,"Path")?"Path":"PATH"}var ON=3e4,ki;async function y_(t){try{let e=process.platform==="win32"?Qr.constants.F_OK:Qr.constants.X_OK;return await Qr.promises.access(t,e),!0}catch{return!1}}function O_(t){return t.trim().replace(/^"|"$/g,"")}async function IN(t){let e=t.configuredPath?.trim();if(e){let r=O_(e);if(await y_(r))return{path:r,source:"setting"}}if(t.extensionPath){let r=[ol.AGENTIDE_CLI_NAME,"agentide"],s=process.platform==="win32"?[".cmd",".exe",".bat",""]:[""],i=[];for(let o of r)for(let a of s)i.push(Rr.join(t.extensionPath,"dist",`${o}${a}`));for(let o of i)if(await y_(o))return{path:o,source:"bundled"}}t.forceRefresh&&(0,Vd.clearBinaryCache)(ol.AGENTIDE_CLI_NAME);let n=await(0,Vd.findBinaryCached)(ol.AGENTIDE_CLI_NAME,(0,Vd.getCommonBinaryPaths)(ol.AGENTIDE_CLI_NAME));return n?{path:n,source:"path"}:{source:"not_found"}}async function PN(t){try{let e=await P_(t,["--version"],{timeoutMs:5e3});return e.code!==0?void 0:e.stdout.trim().split(/\r?\n/)[0]||void 0}catch{return}}async function NN(t={}){let e=Date.now();if(!t.forceRefresh&&ki&&e-ki.lastCheckedAt<ON)return ki;let n=await IN(t);if(!n.path)return ki={installed:!1,source:"not_found",lastCheckedAt:e,error:t.configuredPath?`Configured path not found: ${t.configuredPath}`:void 0},ki;let r=await PN(n.path);return ki={installed:!0,path:n.path,version:r,source:n.source,lastCheckedAt:e},ki}function I_(t){let e=t.chatSessionId?.trim(),n=t.gatewaySessionKey?.trim();if(!e&&!n)return{};let r={};e&&(r[Xe.AGENTIDE_CHAT_SESSION_ID_ENV]=e,r[Xe.AGENTHIPPO_CHAT_SESSION_ID_ENV]=e);let s=(0,E_.resolveGatewayOutboundFilePath)({workspaceRoot:t.workspaceRoot,gatewaySessionKey:n,chatSessionId:n?void 0:e});return s&&(r[E_.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV]=s),r}function RN(t){let e={AGENTHIPPO_WORKSPACE_ROOT:t.workspaceRoot,AGENTHIPPO_ACTIVE_AGENT:t.agentId,...I_({workspaceRoot:t.workspaceRoot,chatSessionId:t.chatSessionId})};if(!t.omitGatewayToken&&!process.env.AGENTHIPPO_EGRESS_URL?.trim()){let i=w_(t.baseEnv);i&&(e[Xe.OPENCLAW_GATEWAY_TOKEN_ENV]=i)}e.CLAUDECODE="";let n=[];t.userInstalledToolsDir?.trim()&&(n.push(t.userInstalledToolsDir.trim()),e.AGENTHIPPO_TOOLS_DIR=t.userInstalledToolsDir.trim(),e.AGENTIDE_TOOLS_DIR=t.userInstalledToolsDir.trim());try{let i=require("@vscode/ripgrep");i?.rgPath&&typeof i.rgPath=="string"&&n.push(Rr.dirname(i.rgPath))}catch{}if(t.cliPath?.trim()){let i=t.cliPath.trim();e.AGENTHIPPO_CLI_PATH=i,n.push(Rr.dirname(i))}let r=t.cliPath?.trim()?Rr.dirname(t.cliPath.trim()):void 0,s=AN(t.extensionPath,r);if(s&&!t.userInstalledToolsDir?.trim()?(e.AGENTHIPPO_TOOLS_DIR=s,e.AGENTIDE_TOOLS_DIR=s,n.push(s)):s&&n.push(s),n.length>0){let i=vN(t.baseEnv),o=t.baseEnv?.[i]??t.baseEnv?.PATH??t.baseEnv?.Path??"";e[i]=bN(o,n)}return e}function CN(){let t=r=>process.env[r]?.trim()||void 0,e=t("AGENTIDE_ANALYTICS_TIER"),n=e!==void 0?Number(e):void 0;return{policyVersion:t("AGENTIDE_ANALYTICS_POLICY_VERSION"),packDigest:t("AGENTIDE_ANALYTICS_PACK_DIGEST"),engineVersion:t("AGENTIDE_ANALYTICS_ENGINE_VERSION"),tier:n!==void 0&&Number.isFinite(n)?n:void 0,instanceId:t("AGENTIDE_ANALYTICS_INSTANCE_ID")}}function kN(t){let e={};return t.policyVersion?.trim()&&(e.AGENTIDE_ANALYTICS_POLICY_VERSION=t.policyVersion.trim()),t.packDigest?.trim()&&(e.AGENTIDE_ANALYTICS_PACK_DIGEST=t.packDigest.trim()),t.engineVersion?.trim()&&(e.AGENTIDE_ANALYTICS_ENGINE_VERSION=t.engineVersion.trim()),t.tier!==void 0&&(e.AGENTIDE_ANALYTICS_TIER=String(t.tier)),t.instanceId?.trim()&&(e.AGENTIDE_ANALYTICS_INSTANCE_ID=t.instanceId.trim()),e}async function P_(t,e,n){return await new Promise((r,s)=>{let i=(0,SN.spawn)(t,e,{cwd:n?.cwd,env:{...process.env,...n?.env??{}},shell:!1}),o="",a="",c=!1,l=n?.timeoutMs??6e4,u=setTimeout(()=>{c||(i.kill(),s(new Error(`CLI command timed out after ${l}ms`)))},l);i.stdout.on("data",f=>{o+=f.toString()}),i.stderr.on("data",f=>{a+=f.toString()}),i.on("error",f=>{c||(c=!0,clearTimeout(u),s(f))}),i.on("close",f=>{c||(c=!0,clearTimeout(u),r({code:f??1,stdout:o,stderr:a}))})})}});var al=T(ir=>{"use strict";Object.defineProperty(ir,"__esModule",{value:!0});ir.RevocationUnsupportedError=ir.SANDBOX_PROVIDER_KEY_ENV=ir.SANDBOX_TIER_ENV=void 0;ir.sandboxHoldsProviderKey=$N;ir.isContainerSandbox=DN;ir.SANDBOX_TIER_ENV="AGENTHIPPO_SANDBOX_TIER";ir.SANDBOX_PROVIDER_KEY_ENV="AGENTHIPPO_SANDBOX_PROVIDER_KEY";function $N(t=process.env){return t[ir.SANDBOX_PROVIDER_KEY_ENV]==="1"}function DN(t=process.env){return Number(t[ir.SANDBOX_TIER_ENV])>=2}var Wd=class extends Error{constructor(e,n){super(`${e} driver cannot revoke '${n}' \u2014 no enforcement boundary at this tier (use 'all', which kills the sandbox)`),this.name="RevocationUnsupportedError"}};ir.RevocationUnsupportedError=Wd});var W_=T(ar=>{"use strict";var LN=ar&&ar.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MN=ar&&ar.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),GN=ar&&ar.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LN(n,e,r[s]);return MN(n,e),n}})();Object.defineProperty(ar,"__esModule",{value:!0});ar.CodexEngine=void 0;ar.resolveCodexReasoningEffort=V_;ar.registerNewFilesWithTracker=K_;var or=require("fs"),On=GN(require("path")),N_=_a(),UN=Tc(),HN=Ic(),cl=Ii(),lt=dn(),R_=Cd(),qd=Oi(),$i=Ud(),jN=As(),xN=Cr(),C_=al(),BN="agentide-litellm",FN="agentide-custom",Yd="AGENTIDE_ANALYTICS_SESSION_ID",Jd="AGENTIDE_ANALYTICS_USER_ID",k_="AGENTIDE_ANALYTICS_PROJECT_ID",$_="AGENTIDE_ANALYTICS_AGENT_ID",D_="AGENTIDE_ANALYTICS_AGENT_VERSION",L_="AGENTIDE_ANALYTICS_SOURCE",M_="AGENTIDE_ANALYTICS_ENGINE",G_="AGENTIDE_ANALYTICS_REQUEST_ID",U_="AGENTIDE_ANALYTICS_POLICY_VERSION",H_="AGENTIDE_ANALYTICS_PACK_DIGEST",j_="AGENTIDE_ANALYTICS_ENGINE_VERSION",x_="AGENTIDE_ANALYTICS_TIER",B_="AGENTIDE_ANALYTICS_INSTANCE_ID";function V_(t){let e=t?.trim();return e&&UN.ENGINE_EFFORTS.codex.includes(e)?e:"medium"}var VN=22,KN="AGENTIDE_CONTEXT_EXPORT_PATH",WN="AGENTIDE_TERMINAL_LOG_PATH";async function K_(t,e,n){if(e.appliesEdits!==!1)for(let r of t)try{if((0,lt.isBinaryFile)(r)||!await(0,lt.pathExists)(r))continue;let s=await or.promises.readFile(r,"utf-8");try{await or.promises.unlink(r),await e.applyEdit(n,r,s,!0)}finally{await(0,lt.pathExists)(r)||await or.promises.writeFile(r,s,"utf-8")}}catch{}}function F_(t){return t.type==="item.started"||t.type==="item.updated"||t.type==="item.completed"}var Xd=class{config;getSkillsSignature;getBundledBasePromptsDir;id="codex";displayName="Codex";lastWrittenConfigSignature;lastCodexSkillsSignatureByWorkspaceRoot=new Map;constructor(e,n,r){this.config=e,this.getSkillsSignature=n,this.getBundledBasePromptsDir=r}async stream(e,n,r,s,i){let o=s.logger,a=s.editTracker,{Codex:c}=await import("@openai/codex-sdk");if(!n.modelId)throw new Error("Codex modelId not provided for streaming request");let l=n.modelId,u=(0,lt.resolveApiRouting)(n,this.config,"openai"),f=u.apiKey,d=u.openaiBaseUrl,g=u.useLiteLLM,p=n.sessionId,_=n.analyticsUserId,h=(0,cl.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),E=d&&d!=="https://api.openai.com/v1",w=g?"LiteLLM proxy":E?"custom provider":"direct OpenAI";o.info(`[AgentIDE] Codex routing: ${w}, baseUrl=${d||"default"}, workspaceRoot=${n.workspaceRoot}`);let A=l.toLowerCase().includes("claude");o.info(`[AgentIDE] Codex wire_api=responses (model=${l})`),A&&(g||E)&&o.info("[AgentIDE] Codex note: selected model appears to be Claude via proxy; reasoning summaries depend on provider support over the Responses API.");let C={...process.env,...s.cliEnvPatch??{},OPENAI_LOG:"debug"};delete C[xN.OPENCLAW_GATEWAY_TOKEN_ENV],delete C.AGENTHIPPO_DATA_PLANE_TOKEN;let b=p?.trim(),I=n.contextSessionId?.trim()||b;I&&(C[KN]=On.join(n.workspaceRoot,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",I,"context.md"),C[WN]=On.join(n.workspaceRoot,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",I,"terminal.md"));let P=n.agentPackId??"default",L=(0,$i.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,P,n.agentPackVersion),N=(0,$i.userScopedEngineHomeFromKey)(L.codexHome,(0,jN.resolveEngineHomeUserKey)(n.engineHomeUserKey));C.CODEX_HOME=N,await or.promises.mkdir(N,{recursive:!0}),C.AGENT_ID=P,n.agentPackVersion&&(C.AGENTIDE_AGENT_VERSION=n.agentPackVersion),P!=="default"?o.info(`[AgentIDE] Codex using agent: ${P}, CODEX_HOME=${N} (agent-isolated)`):o.info(`[AgentIDE] Codex using default agent, CODEX_HOME=${N}`);let O=E?d:void 0;await this.ensureCodexConfig(g,O,l,n.workspaceRoot,n.additionalDirectories??[],o,N,P,s.permissionHandler instanceof HN.AutoApprovePermissionHandler),g&&N&&(_?.trim()&&(C[Jd]=_.trim()),p?.trim()&&(C[Yd]=p.trim()),h?.trim()&&(C[k_]=h.trim()),C[$_]=P,C[D_]=n.agentPackVersion??"workspace",C[L_]="agenthippo",C[M_]="codex",n.requestId&&(C[G_]=n.requestId),n.policyVersion?.trim()&&(C[U_]=n.policyVersion.trim()),n.packDigest?.trim()&&(C[H_]=n.packDigest.trim()),n.engineVersion?.trim()&&(C[j_]=n.engineVersion.trim()),n.tier!==void 0&&(C[x_]=String(n.tier)),n.instanceId?.trim()&&(C[B_]=n.instanceId.trim())),E&&f&&(C.CODEX_API_KEY=f),E&&(C.OPENAI_BASE_URL=d,o.info(`[AgentIDE] Using custom OpenAI base URL: ${d}`),(0,lt.applyLocalTlsBypass)(C,d)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS (Codex)"));let G=(0,qd.buildConversationKey)("codex",n);o.info(`[AgentIDE] Codex conversationKey=${G.key} (chatSessionId=${G.chatSessionId}, signature=${G.signatureHash}${G.isEphemeral?", ephemeral":""})`),await(0,qd.withConversationLock)(G.key,async()=>{await r.progress("Thinking...");let H=n.permissions??R_.DEFAULT_PERMISSIONS;o.info(`[AgentIDE] Codex permissions: fileAccess=${H.fileAccess}`);let X=[n.workspaceRoot,...n.additionalDirectories??[]],J=(0,R_.toCodexOptions)(H,X);(0,C_.isContainerSandbox)()&&(J.sandboxMode="danger-full-access"),o.info(`[AgentIDE] Codex mapped: sandboxMode=${J.sandboxMode}, approvalPolicy=${J.approvalPolicy}`);let W=n.workspaceRoot,ee={model:l,sandboxMode:J.sandboxMode,approvalPolicy:J.approvalPolicy,additionalDirectories:J.additionalDirectories,workingDirectory:W,skipGitRepoCheck:!0,modelReasoningEffort:V_((0,lt.getAgentideEngineSettings)(s?.configProvider).effort)};o.info(`[AgentIDE] Codex modelReasoningEffort=${ee.modelReasoningEffort??"default"}`);let le=E?void 0:f,pe=new c({apiKey:le,env:C,...this.config.codexExecutablePath?{codexPathOverride:this.config.codexExecutablePath}:{}}),We=(0,cl.getPersistedSessionId)("codex",G.key),Ue;if(We)try{Ue=pe.resumeThread(We,ee),o.info(`[AgentIDE] Codex resuming thread: ${We} (model: ${l})`)}catch(se){o.warn(`[AgentIDE] Failed to resume Codex thread (${We}): ${se instanceof Error?se.message:String(se)}. Starting new thread.`),Ue=pe.startThread(ee)}else Ue=pe.startThread(ee),o.info(`[AgentIDE] Codex starting new thread (model: ${l})`);if(i?.aborted){o.info("[AgentIDE] Codex stream cancelled before starting turn");return}let vt;try{({events:vt}=await Ue.runStreamed(e,{signal:i}))}catch(se){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted while starting turn");return}throw se}let xe=new Map,dt=new Map,yn=new Map,zn=0,it=0,sn=0,_i=!1,Vr=se=>se.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160);try{for await(let se of vt){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted; stopping event loop");return}let Ei=F_(se)?se.item.type:void 0;if(o.debug(`[AgentIDE] Codex event: ${se.type}${Ei?` (item: ${Ei})`:""}`),se.type==="thread.started"){let ae=se.thread_id;o.info(`[AgentIDE] Codex thread started: ${ae}`),await(0,cl.persistSessionIfNeeded)("codex",G,ae,n);continue}if(se.type==="turn.failed")throw await r.error(se.error?.message||"Codex turn failed"),new Error(se.error?.message||"Codex turn failed");if(se.type==="error"){let D=/^Reconnecting\.\.\. \d+\/\d+/.exec(se.message??"");if(D){o.warn(`[AgentIDE] Codex ${se.message}`),await r.progress(D[0]);continue}throw await r.error(se.message||"Codex stream error"),new Error(se.message||"Codex stream error")}if(se.type==="turn.completed"){o.info(`[AgentIDE] Codex usage: input=${se.usage.input_tokens}, cached=${se.usage.cached_input_tokens}, output=${se.usage.output_tokens}`);continue}if(F_(se)){let{item:D}=se;if(D.type==="reasoning"){sn++;let ae=D.text??"",oe=(0,lt.computeTextDelta)(D.id,D.text??"",xe);oe?(zn++,it+=oe.length,zn<=3&&o.debug(`[AgentIDE] Codex reasoning delta #${zn} (${oe.length} chars): ${Vr(oe)}`),await r.thinking(oe)):!_i&&ae.length===0&&(_i=!0,o.debug("[AgentIDE] Codex reasoning item observed but text is empty so far."))}else if(D.type==="agent_message"){let ae=(0,lt.computeTextDelta)(D.id,D.text??"",xe);ae&&await r.text(ae)}else if(D.type==="command_execution"){if(se.type==="item.started"&&(await r.thinking(`**Running command**
49
49
  \`\`\`bash
50
50
  ${D.command}
51
51
  \`\`\`
52
- `),await r.toolStart("terminal",D.command,D.id,{kind:"terminal",language:"bash"}),v&&D.command&&a)){let ae=(0,lt.extractFilePaths)(D.command,n.workspaceRoot).filter(oe=>!(0,lt.isBinaryFile)(oe));if(ae.length>0)if((0,lt.isCreateCommand)(D.command))yn.set(D.id,ae);else{let oe=await Promise.all(ae.map(async Q=>[Q,await(0,lt.pathExists)(Q)])),Ne=oe.filter(([,Q])=>Q).map(([Q])=>Q),jt=oe.filter(([,Q])=>!Q).map(([Q])=>Q);if(jt.length>0&&yn.set(D.id,jt),Ne.length>0)try{let Q=await a.startTracking(v,Ne);Q?.operationId!==void 0&&dt.set(D.id,Q.operationId)}catch{}}}if(se.type==="item.updated"||se.type==="item.completed"){let ae=(0,lt.computeTextDelta)(`${D.id}-output`,D.aggregated_output??"",xe);ae&&await r.thinking(ae)}if(se.type==="item.completed"){let ae=D.exit_code!==void 0?D.exit_code===0?"\u2713 Command completed":`\u2717 Exited with code ${D.exit_code}`:"\u2713 Command completed";if(await r.thinking(`
52
+ `),await r.toolStart("terminal",D.command,D.id,{kind:"terminal",language:"bash"}),b&&D.command&&a)){let ae=(0,lt.extractFilePaths)(D.command,n.workspaceRoot).filter(oe=>!(0,lt.isBinaryFile)(oe));if(ae.length>0)if((0,lt.isCreateCommand)(D.command))yn.set(D.id,ae);else{let oe=await Promise.all(ae.map(async Q=>[Q,await(0,lt.pathExists)(Q)])),Ne=oe.filter(([,Q])=>Q).map(([Q])=>Q),jt=oe.filter(([,Q])=>!Q).map(([Q])=>Q);if(jt.length>0&&yn.set(D.id,jt),Ne.length>0)try{let Q=await a.startTracking(b,Ne);Q?.operationId!==void 0&&dt.set(D.id,Q.operationId)}catch{}}}if(se.type==="item.updated"||se.type==="item.completed"){let ae=(0,lt.computeTextDelta)(`${D.id}-output`,D.aggregated_output??"",xe);ae&&await r.thinking(ae)}if(se.type==="item.completed"){let ae=D.exit_code!==void 0?D.exit_code===0?"\u2713 Command completed":`\u2717 Exited with code ${D.exit_code}`:"\u2713 Command completed";if(await r.thinking(`
53
53
  ${ae}
54
- `),await r.toolEnd("terminal",D.id,D.exit_code!==void 0?`Exited with code ${D.exit_code}`:"Completed",D.exit_code!==void 0?D.exit_code!==0:!1,{exitCode:D.exit_code}),v&&a){let oe=dt.get(D.id);if(oe!==void 0){try{await a.stopTracking(v,oe)}catch{}dt.delete(D.id)}await K_(yn.get(D.id)??[],a,v),yn.delete(D.id)}}}else if(D.type==="mcp_tool_call"){if(se.type==="item.started"){let ae=D.arguments?`
54
+ `),await r.toolEnd("terminal",D.id,D.exit_code!==void 0?`Exited with code ${D.exit_code}`:"Completed",D.exit_code!==void 0?D.exit_code!==0:!1,{exitCode:D.exit_code}),b&&a){let oe=dt.get(D.id);if(oe!==void 0){try{await a.stopTracking(b,oe)}catch{}dt.delete(D.id)}await K_(yn.get(D.id)??[],a,b),yn.delete(D.id)}}}else if(D.type==="mcp_tool_call"){if(se.type==="item.started"){let ae=D.arguments?`
55
55
  \`\`\`json
56
56
  ${JSON.stringify(D.arguments,null,2)}
57
57
  \`\`\``:"";await r.thinking(`**Calling MCP tool** \`${D.server}.${D.tool}\`${ae}
@@ -63,8 +63,8 @@ ${JSON.stringify(D.arguments,null,2)}
63
63
  ${oe}
64
64
  \`\`\`
65
65
  `),await r.toolEnd(`${D.server}.${D.tool}`,D.id,"MCP call completed",!1,{result:D.result})}else await r.toolEnd(`${D.server}.${D.tool}`,D.id,"MCP call completed",!1)}else if(D.type==="file_change"){if(se.type==="item.started"){let ae=D.changes.map(oe=>`${oe.kind} ${oe.path}`).join(", ");if(await r.thinking(`**File changes:** ${ae}
66
- `),await r.progress(`[Files] ${ae}`),v?a||o.warn("[AgentIDE] Codex file_change: skipping edit tracking (no editTracker)"):o.debug("[AgentIDE] Codex file_change: skipping edit tracking (no session ID)"),v&&a){let oe=D.changes.filter(Ne=>{let jt=(0,lt.normalizeFileChangeKind)(String(Ne.kind));return(jt==="create"||jt==="modify")&&!(0,lt.isBinaryFile)(Ne.path)}).map(Ne=>On.isAbsolute(Ne.path)?Ne.path:On.join(n.workspaceRoot,Ne.path));if(oe.length>0){o.info(`[AgentIDE] Codex file_change: starting edit tracking for ${oe.length} files: ${oe.join(", ")}`);try{let Ne=await a.startTracking(v,oe);Ne?.operationId!==void 0?(dt.set(D.id,Ne.operationId),o.info(`[AgentIDE] Codex file_change: edit tracking started (op=${Ne.operationId})`)):o.warn("[AgentIDE] Codex file_change: startTracking returned no operationId")}catch(Ne){o.warn(`[AgentIDE] Codex file_change: failed to start edit tracking: ${Ne}`)}}else o.debug("[AgentIDE] Codex file_change: no trackable files (all filtered out)")}}if(se.type==="item.completed"){let ae=D.status==="completed"?"\u2713":"\u2717";await r.thinking(`${ae} File changes ${D.status}
67
- `);let oe=dt.get(D.id);if(v&&oe!==void 0&&a)try{await a.stopTracking(v,oe),o.debug(`[AgentIDE] Stopped edit tracking (op=${oe})`)}catch(Ne){o.warn(`[AgentIDE] Failed to stop edit tracking: ${Ne}`)}finally{dt.delete(D.id)}}}else if(D.type==="web_search")se.type==="item.started"&&(await r.thinking(`**Web search:** ${D.query}
66
+ `),await r.progress(`[Files] ${ae}`),b?a||o.warn("[AgentIDE] Codex file_change: skipping edit tracking (no editTracker)"):o.debug("[AgentIDE] Codex file_change: skipping edit tracking (no session ID)"),b&&a){let oe=D.changes.filter(Ne=>{let jt=(0,lt.normalizeFileChangeKind)(String(Ne.kind));return(jt==="create"||jt==="modify")&&!(0,lt.isBinaryFile)(Ne.path)}).map(Ne=>On.isAbsolute(Ne.path)?Ne.path:On.join(n.workspaceRoot,Ne.path));if(oe.length>0){o.info(`[AgentIDE] Codex file_change: starting edit tracking for ${oe.length} files: ${oe.join(", ")}`);try{let Ne=await a.startTracking(b,oe);Ne?.operationId!==void 0?(dt.set(D.id,Ne.operationId),o.info(`[AgentIDE] Codex file_change: edit tracking started (op=${Ne.operationId})`)):o.warn("[AgentIDE] Codex file_change: startTracking returned no operationId")}catch(Ne){o.warn(`[AgentIDE] Codex file_change: failed to start edit tracking: ${Ne}`)}}else o.debug("[AgentIDE] Codex file_change: no trackable files (all filtered out)")}}if(se.type==="item.completed"){let ae=D.status==="completed"?"\u2713":"\u2717";await r.thinking(`${ae} File changes ${D.status}
67
+ `);let oe=dt.get(D.id);if(b&&oe!==void 0&&a)try{await a.stopTracking(b,oe),o.debug(`[AgentIDE] Stopped edit tracking (op=${oe})`)}catch(Ne){o.warn(`[AgentIDE] Failed to stop edit tracking: ${Ne}`)}finally{dt.delete(D.id)}}}else if(D.type==="web_search")se.type==="item.started"&&(await r.thinking(`**Web search:** ${D.query}
68
68
  `),await r.toolStart("web_search",D.query,D.id,{query:D.query})),se.type==="item.completed"&&await r.toolEnd("web_search",D.id,"Search completed",!1,{query:D.query});else if(D.type==="todo_list"){if(se.type==="item.started"){let ae=D.items.map(oe=>`- [${oe.completed?"x":" "}] ${oe.text}`);await r.thinking(`**Plan**
69
69
  ${ae.join(`
70
70
  `)}
@@ -72,24 +72,24 @@ ${ae.join(`
72
72
  ${ae.join(`
73
73
  `)}
74
74
  `)}if(se.type==="item.started"||se.type==="item.completed"){let ae=D.items.filter(oe=>oe.completed).length;await r.progress(`[Plan] ${ae}/${D.items.length} steps complete`)}}else if(D.type==="error"){let ae=D.message||"Codex warning";o.warn(`[AgentIDE] Codex warning: ${ae}`),await r.thinking(`**Warning:** ${ae}
75
- `)}}}}catch(se){if(i?.aborted){o.info(`[AgentIDE] Codex stream aborted: ${se instanceof Error?se.message:String(se)}`);return}throw se}o.info(`[AgentIDE] Codex reasoning summary: items=${sn}, deltas=${zn}, chars=${it}`),sn===0&&o.debug("[AgentIDE] Codex emitted no reasoning items. This SDK only exposes a reasoning *summary* when available; many runs may have none."),(0,cl.touchSessionIfNeeded)(G)},{signal:i,timeoutMs:qd.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:"codex.stream"}),await r.done(),o.info("[AgentIDE] Codex streaming complete")}dispose(){this.lastWrittenConfigSignature=void 0,this.lastCodexSkillsSignatureByWorkspaceRoot.clear()}onMaintenance(e){}async ensureCodexConfig(e,n,r,s,i,o,a,c="default",l=!1){let u=a??this.config.codexHome;if(!u)return;try{let A=this.getSkillsSignature(s);await this.syncCodexSkillsToCodexHome(u,s,c,o,A)}catch(A){o.warn(`[AgentIDE] Warning: failed to sync skills into $CODEX_HOME: ${A instanceof Error?A.message:String(A)}`)}let d=await this.updateCodexRuntimeInstructionsFile(u,s,i,c,o),f="responses",p=e?"litellm":n?"custom":"openai",g=`${VN}:${p}:${n??""}:${f}:${c}:${d??""}`;if(this.lastWrittenConfigSignature===g)return;await or.promises.mkdir(u,{recursive:!0});let _=[`# AgentIDE Codex config (generated) - ${p} mode`,'model_reasoning_summary = "detailed"',"hide_agent_reasoning = false",d?`model_instructions_file = ${JSON.stringify(d)}`:void 0,...(0,C_.isContainerSandbox)()?['sandbox_mode = "danger-full-access"']:[]];if(n){let A=e?BN:FN,S=e?"AgentIDE LiteLLM":"AgentIDE Custom Provider";_.push("",`model_provider = "${A}"`,"",`[model_providers.${A}]`,`name = "${S}"`,`base_url = ${JSON.stringify(n)}`,'env_key = "CODEX_API_KEY"',`wire_api = "${f}"`,"query_params = {}"),e&&_.push(`env_http_headers = { "x-litellm-metadata-session-id" = "${Yd}", "x-litellm-metadata-user-id" = "${Jd}", "x-litellm-metadata-project-id" = "${k_}", "langfuse_session_id" = "${Yd}", "langfuse_trace_user_id" = "${Jd}", "x-litellm-metadata-agent-id" = "${$_}", "x-litellm-metadata-agent-version" = "${D_}", "x-litellm-metadata-source" = "${L_}", "x-litellm-metadata-engine" = "${M_}", "x-litellm-metadata-request-id" = "${G_}", "x-litellm-metadata-policy-version" = "${U_}", "x-litellm-metadata-pack-digest" = "${H_}", "x-litellm-metadata-engine-version" = "${j_}", "x-litellm-metadata-tier" = "${x_}", "x-litellm-metadata-instance-id" = "${B_}" }`)}_.push("","[features]","plugins = false");let h=this.getBundledBasePromptsDir(),y=await(0,N_.loadMcpServers)(c,s,h),E=(0,N_.generateCodexMcpConfig)(y,{autoApprove:l});if(y.length>0){let A=c==="default"?"bundled":`pack:${c}`;o.debug(`[AgentIDE] Codex MCP config (${A}): ${y.length} server(s)`)}let w=_.filter(Boolean).join(`
76
- `)+E;await or.promises.writeFile(On.join(u,"config.toml"),w,"utf8"),this.lastWrittenConfigSignature=g,o.info(`[AgentIDE] Codex configured (${p}) at ${u}${n?`, baseUrl=${n}, wire_api=${f}`:""}, model=${r??"unknown"}`)}async updateCodexRuntimeInstructionsFile(e,n,r,s,i){let o=On.join(n,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"AGENTS.md"),a="";if(await(0,lt.pathExists)(o))a=await or.promises.readFile(o,"utf8"),i.debug(`[AgentIDE] Codex instructions from pack: ${s}/AGENTS.md`);else{let h=this.getBundledBasePromptsDir();if(h){let y=On.join(h,"rules","AGENTS.md");await(0,lt.pathExists)(y)&&(a=await or.promises.readFile(y,"utf8"),i.debug(`[AgentIDE] Codex instructions from bundled templates (pack ${s} has no AGENTS.md)`))}a||i.warn(`[AgentIDE] Warning: no AGENTS.md found for agent ${s} and no bundled fallback`)}let c=On.join(n,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"context.md"),l="";await(0,lt.pathExists)(c)&&(l=await or.promises.readFile(c,"utf8"));let u=r.slice().filter(Boolean).sort(),f=["## AgentIDE Runtime Context (managed)","","### Workspace Information","","```json",JSON.stringify({workspaceRoot:n,additionalDirectories:u},null,2),"```"].join(`
77
- `),p=[a.trimEnd()];l.trim()&&p.push(l.trimEnd()),p.push(f.trimEnd());let g=p.filter(Boolean).join(`
75
+ `)}}}}catch(se){if(i?.aborted){o.info(`[AgentIDE] Codex stream aborted: ${se instanceof Error?se.message:String(se)}`);return}throw se}o.info(`[AgentIDE] Codex reasoning summary: items=${sn}, deltas=${zn}, chars=${it}`),sn===0&&o.debug("[AgentIDE] Codex emitted no reasoning items. This SDK only exposes a reasoning *summary* when available; many runs may have none."),(0,cl.touchSessionIfNeeded)(G)},{signal:i,timeoutMs:qd.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:"codex.stream"}),await r.done(),o.info("[AgentIDE] Codex streaming complete")}dispose(){this.lastWrittenConfigSignature=void 0,this.lastCodexSkillsSignatureByWorkspaceRoot.clear()}onMaintenance(e){}async ensureCodexConfig(e,n,r,s,i,o,a,c="default",l=!1){let u=a??this.config.codexHome;if(!u)return;try{let A=this.getSkillsSignature(s);await this.syncCodexSkillsToCodexHome(u,s,c,o,A)}catch(A){o.warn(`[AgentIDE] Warning: failed to sync skills into $CODEX_HOME: ${A instanceof Error?A.message:String(A)}`)}let f=await this.updateCodexRuntimeInstructionsFile(u,s,i,c,o),d="responses",g=e?"litellm":n?"custom":"openai",p=`${VN}:${g}:${n??""}:${d}:${c}:${f??""}`;if(this.lastWrittenConfigSignature===p)return;await or.promises.mkdir(u,{recursive:!0});let _=[`# AgentIDE Codex config (generated) - ${g} mode`,'model_reasoning_summary = "detailed"',"hide_agent_reasoning = false",f?`model_instructions_file = ${JSON.stringify(f)}`:void 0,...(0,C_.isContainerSandbox)()?['sandbox_mode = "danger-full-access"']:[]];if(n){let A=e?BN:FN,S=e?"AgentIDE LiteLLM":"AgentIDE Custom Provider";_.push("",`model_provider = "${A}"`,"",`[model_providers.${A}]`,`name = "${S}"`,`base_url = ${JSON.stringify(n)}`,'env_key = "CODEX_API_KEY"',`wire_api = "${d}"`,"query_params = {}"),e&&_.push(`env_http_headers = { "x-litellm-metadata-session-id" = "${Yd}", "x-litellm-metadata-user-id" = "${Jd}", "x-litellm-metadata-project-id" = "${k_}", "langfuse_session_id" = "${Yd}", "langfuse_trace_user_id" = "${Jd}", "x-litellm-metadata-agent-id" = "${$_}", "x-litellm-metadata-agent-version" = "${D_}", "x-litellm-metadata-source" = "${L_}", "x-litellm-metadata-engine" = "${M_}", "x-litellm-metadata-request-id" = "${G_}", "x-litellm-metadata-policy-version" = "${U_}", "x-litellm-metadata-pack-digest" = "${H_}", "x-litellm-metadata-engine-version" = "${j_}", "x-litellm-metadata-tier" = "${x_}", "x-litellm-metadata-instance-id" = "${B_}" }`)}_.push("","[features]","plugins = false");let h=this.getBundledBasePromptsDir(),y=await(0,N_.loadMcpServers)(c,s,h),E=(0,N_.generateCodexMcpConfig)(y,{autoApprove:l});if(y.length>0){let A=c==="default"?"bundled":`pack:${c}`;o.debug(`[AgentIDE] Codex MCP config (${A}): ${y.length} server(s)`)}let w=_.filter(Boolean).join(`
76
+ `)+E;await or.promises.writeFile(On.join(u,"config.toml"),w,"utf8"),this.lastWrittenConfigSignature=p,o.info(`[AgentIDE] Codex configured (${g}) at ${u}${n?`, baseUrl=${n}, wire_api=${d}`:""}, model=${r??"unknown"}`)}async updateCodexRuntimeInstructionsFile(e,n,r,s,i){let o=On.join(n,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"AGENTS.md"),a="";if(await(0,lt.pathExists)(o))a=await or.promises.readFile(o,"utf8"),i.debug(`[AgentIDE] Codex instructions from pack: ${s}/AGENTS.md`);else{let h=this.getBundledBasePromptsDir();if(h){let y=On.join(h,"rules","AGENTS.md");await(0,lt.pathExists)(y)&&(a=await or.promises.readFile(y,"utf8"),i.debug(`[AgentIDE] Codex instructions from bundled templates (pack ${s} has no AGENTS.md)`))}a||i.warn(`[AgentIDE] Warning: no AGENTS.md found for agent ${s} and no bundled fallback`)}let c=On.join(n,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"context.md"),l="";await(0,lt.pathExists)(c)&&(l=await or.promises.readFile(c,"utf8"));let u=r.slice().filter(Boolean).sort(),d=["## AgentIDE Runtime Context (managed)","","### Workspace Information","","```json",JSON.stringify({workspaceRoot:n,additionalDirectories:u},null,2),"```"].join(`
77
+ `),g=[a.trimEnd()];l.trim()&&g.push(l.trimEnd()),g.push(d.trimEnd());let p=g.filter(Boolean).join(`
78
78
 
79
79
  ---
80
80
 
81
81
  `).trimEnd().concat(`
82
- `),_=On.join(e,"agentide.runtime.md");return await(0,lt.writeFileIfChanged)(_,g),_}async syncCodexSkillsToCodexHome(e,n,r,s,i){let o=On.join(n,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",r,"skills"),a=On.join(e,"skills");if(i){let u=this.lastCodexSkillsSignatureByWorkspaceRoot.get(n),d=await(0,lt.pathExists)(a);if(u===i&&d){s.debug(`[AgentIDE] Codex skills unchanged (sig=${i}), skipping $CODEX_HOME sync`);return}}try{await or.promises.rm(a,{recursive:!0,force:!0})}catch{}if(!await(0,lt.pathExists)(o))return;await or.promises.mkdir(a,{recursive:!0});let c=0,l=await or.promises.readdir(o,{withFileTypes:!0});for(let u of l){if(!u.isDirectory()||u.name.startsWith("."))continue;let d=On.join(o,u.name),f=On.join(d,"SKILL.md");await(0,lt.pathExists)(f)&&(await(0,lt.copyDirRecursive)(d,On.join(a,u.name)),c++)}i&&this.lastCodexSkillsSignatureByWorkspaceRoot.set(n,i),s.info(`[AgentIDE] Codex skills synced to $CODEX_HOME: ${c} skill(s)`)}};ar.CodexEngine=Xd});var Li=T(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.ENGINE_IDLE_TTL_ENV=void 0;Di.engineIdleTtlMs=q_;Di.engineMaintenanceIntervalMs=XN;Di.ENGINE_IDLE_TTL_ENV="AGENTHIPPO_ENGINE_IDLE_TTL";var qN=1e3*60*30,YN=1e3*60*5,JN=1e3*5;function q_(t=process.env){let e=Number(t[Di.ENGINE_IDLE_TTL_ENV]?.trim()||NaN);return Number.isFinite(e)&&e>0?e*1e3:qN}function XN(t=q_()){return Math.min(YN,Math.max(JN,Math.round(t/6)))}});var Q_=T(kr=>{"use strict";var zN=kr&&kr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),QN=kr&&kr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),X_=kr&&kr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&zN(n,e,r[s]);return QN(n,e),n}})();Object.defineProperty(kr,"__esModule",{value:!0});kr.ClaudeEngine=void 0;kr.resolveClaudeEffort=z_;var ZN=X_(require("crypto")),eR=require("fs"),ll=X_(require("path")),tR=Tc(),nR=ot(),va=Ii(),Mi=dn(),Y_=Cd(),zd=_a(),rR=Cr(),ul=Oi(),dl=Ud(),sR=As(),J_=kc(),iR=Li(),oR=new Set(["Write","Edit","FileEdit","FileWrite","MultiEdit","str_replace_editor","Str_replace_editor","TextEditor","text_editor","Bash","bash","shell","Shell"]);function aR(t,e){return async(n,r)=>{if(n==="AskUserQuestion"){let s=r,i=s?.questions??[];if(i.length===0)return e.warn("[AgentIDE] AskUserQuestion with no questions"),{behavior:"allow",updatedInput:{...s,answers:{}}};let o={};for(let a of i){let c={questionId:`ask-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,prompt:a.question,options:a.options?.map(d=>({label:d.label,description:d.description})),multiSelect:a.multiSelect},l=await t.question(c);if(l.declined||l.cancelled)return{behavior:"deny",message:"User declined or cancelled the question."};let u=l.freeText??l.selected.join(", ");o[a.question]=u}return{behavior:"allow",updatedInput:{questions:s.questions,answers:o}}}return{behavior:"allow",updatedInput:r}}}var cR="AGENTIDE_CONTEXT_EXPORT_PATH",lR="AGENTIDE_TERMINAL_LOG_PATH";function uR(){let t=!1,e=[],n=[];return{enqueue(r){if(t)throw new Error("Cannot enqueue into a closed queue");let s=n.shift();if(s){s({value:r,done:!1});return}e.push(r)},close(){for(t=!0;n.length;)n.shift()?.({value:void 0,done:!0})},[Symbol.asyncIterator](){return{next(){if(e.length){let r=e.shift();return Promise.resolve({value:r,done:!1})}return t?Promise.resolve({value:void 0,done:!0}):new Promise(r=>n.push(r))}}}}}function dR(t){let e=uR(),n=new AbortController,r=t.queryFn({prompt:e,options:{...t.options,abortController:n,resume:t.resumeSessionId}}),s=r[Symbol.asyncIterator](),i=!1,o=t.resumeSessionId??null;return{get sessionId(){return o},async setMaxThinkingTokens(a){if(i)throw new Error("Cannot setMaxThinkingTokens on closed Claude session");await r.setMaxThinkingTokens(a)},async setMcpServers(a){if(i)throw new Error("Cannot setMcpServers on closed Claude session");return r.setMcpServers(a)},async interrupt(){if(!i)try{await r.interrupt()}catch{}},async send(a){if(i)throw new Error("Cannot send to closed Claude session");let c;typeof a=="string"?c={type:"user",session_id:"",message:{role:"user",content:[{type:"text",text:a}]},parent_tool_use_id:null}:c=a,e.enqueue(c)},async*receive(){for(;;){let{value:a,done:c}=await s.next();if(c)return;let l=a;if(l.type==="system"&&l.subtype==="init"&&(o=l.session_id),yield l,l.type==="result")return}},close(){i||(i=!0,e.close(),n.abort())}}}function z_(t){let e=t?.trim();return e&&tR.ENGINE_EFFORTS.claude.includes(e)?e:void 0}var Qd=class{config;computeAgentideSignature;getBundledBasePromptsDir;id="claude";displayName="Claude";activeSessions=new Map;constructor(e,n,r){this.config=e,this.computeAgentideSignature=n,this.getBundledBasePromptsDir=r}async stream(e,n,r,s,i){let o=s.logger,a=s.editTracker,{apiKey:c,baseUrl:l,useLiteLLM:u}=(0,Mi.resolveApiRouting)(n,this.config,"anthropic");if(!c)throw new Error("Claude API key not provided");let d=ZN.createHash("sha256").update(`${c}
83
- ${l??""}`).digest("hex").slice(0,16);o.info(`[AgentIDE] Claude using ${u?"LiteLLM proxy":"direct Anthropic"}, baseUrl: ${l||"default"}, workspaceRoot=${n.workspaceRoot}, additionalDirs=${n.additionalDirectories?.length??0}`),await r.progress("Thinking...");let f=(0,va.buildLiteLLMMetadataHeaders)(u,{sessionId:n.sessionId,analyticsUserId:n.analyticsUserId,analyticsProjectId:(0,va.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),agentId:n.agentPackId??"default",agentVersion:n.agentPackVersion??"workspace",source:"agenthippo",engine:"claude",requestId:n.requestId,policyVersion:n.policyVersion,packDigest:n.packDigest,instanceId:n.instanceId,engineVersion:n.engineVersion,tier:n.tier}),p={...process.env,...s.cliEnvPatch??{},DEBUG_CLAUDE_AGENT_SDK:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1"};if(delete p[rR.OPENCLAW_GATEWAY_TOKEN_ENV],delete p.AGENTHIPPO_DATA_PLANE_TOKEN,(0,J_.isAnthropicSetupToken)(c)){let L=(0,J_.normalizeAnthropicSetupToken)(c);p.CLAUDE_CODE_OAUTH_TOKEN=L,delete p.ANTHROPIC_AUTH_TOKEN,delete p.ANTHROPIC_API_KEY,o.info("[AgentIDE] Claude using setup-token auth (CLAUDE_CODE_OAUTH_TOKEN)")}else p.ANTHROPIC_API_KEY=c,p.ANTHROPIC_AUTH_TOKEN=c,delete p.CLAUDE_CODE_OAUTH_TOKEN;let _=n.sessionId?.trim(),h=n.contextSessionId?.trim()||_;h&&(p[cR]=ll.join(n.workspaceRoot,dl.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"context.md"),p[lR]=ll.join(n.workspaceRoot,dl.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"terminal.md"));let y=n.agentPackId??"default",E=(0,dl.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,y,n.agentPackVersion),w=(0,dl.userScopedEngineHomeFromKey)(E.claudeConfigDir,(0,sR.resolveEngineHomeUserKey)(n.engineHomeUserKey));if(p.CLAUDE_CONFIG_DIR=w,await eR.promises.mkdir(w,{recursive:!0}),p.AGENT_ID=y,n.agentPackVersion&&(p.AGENTIDE_AGENT_VERSION=n.agentPackVersion),y!=="default"?o.info(`[AgentIDE] Claude using agent: ${y}, CLAUDE_CONFIG_DIR=${w} (agent-isolated)`):o.info(`[AgentIDE] Claude using default agent, CLAUDE_CONFIG_DIR=${w}`),f.length>0&&(p.ANTHROPIC_CUSTOM_HEADERS=f.join(`
84
- `)),l&&l!=="https://api.anthropic.com/v1"){let L=l.endsWith("/v1")?l.slice(0,-3):l;p.ANTHROPIC_BASE_URL=L,o.info(`[AgentIDE] Using custom Anthropic base URL: ${L}`),(0,Mi.applyLocalTlsBypass)(p,L)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS")}let C=n.modelId;if(!C)throw new Error("Claude modelId not provided for streaming request");o.info(`[AgentIDE] Using Claude model: ${C}`);let v="",I=async L=>{if(!L)return;let N=v.length,O=L.length;if(N===0){v=L,await r.text(L);return}if(O===N){if(L===v){o.debug("[AgentIDE] Claude: exact duplicate, skipping");return}}else if(O>N){if(L.startsWith(v)){let G=L.slice(N);v=L,o.debug(`[AgentIDE] Claude: emitting remainder (${G.length} chars)`),await r.text(G);return}}else if(v.endsWith(L)){o.debug("[AgentIDE] Claude: suffix already streamed, skipping");return}v=L,await r.text(L)},P=(0,ul.buildConversationKey)("claude",n);o.info(`[AgentIDE] Claude conversationKey=${P.key} (chatSessionId=${P.chatSessionId}, signature=${P.signatureHash}${P.isEphemeral?", ephemeral":""})`),await(0,ul.withConversationLock)(P.key,async()=>{let L=(0,Mi.getAgentideEngineSettings)(s?.configProvider),N=typeof L.claudeMaxThinkingTokens=="number"&&L.claudeMaxThinkingTokens>0?Math.floor(L.claudeMaxThinkingTokens):null;o.debug(`[AgentIDE] Claude maxThinkingTokens=${N??"default/disabled"}`);let O=z_(L.effort);o.debug(`[AgentIDE] Claude effort=${O??"default"}`);let G=(L.claudeCheapModel||"").trim();G&&(p.ANTHROPIC_DEFAULT_HAIKU_MODEL=G,p.CLAUDE_CODE_SUBAGENT_MODEL=G,o.debug(`[AgentIDE] Claude cheapModel=${G}`));let H=n.permissions??Y_.DEFAULT_PERMISSIONS;o.debug(`[AgentIDE] Claude permissions: fileAccess=${H.fileAccess}`);let X=(0,Mi.stableAdditionalDirs)([n.workspaceRoot,...n.additionalDirectories??[]]),J=(0,Y_.toClaudeOptions)(H,X);o.debug(`[AgentIDE] Claude mapped: permissionMode=${J.permissionMode}, allowDangerouslySkipPermissions=${J.allowDangerouslySkipPermissions}, dirs=${J.additionalDirectories?.length??"undefined"}`);let W=(0,Mi.stableAdditionalDirs)([...J.additionalDirectories??[],w]),ee=await this.computeAgentideSignature(n.workspaceRoot,n.additionalDirectories),le=n.sessionId,pe=n.workspaceRoot,We={current:null},Ue=Q=>{let _t=Q.trim();return/(?:^|&&|\||;)\s*git\s+/.test(_t)},vt=(Q,_t)=>{let on=_t;if(!on)return[];if(Q==="Bash"){let Ot=on.command;return Ot?Ue(Ot)?[]:(0,Mi.extractFilePaths)(Ot,pe):[]}let ve=on.file_path??on.path;return ve?[ll.isAbsolute(ve)?ve:ll.join(pe,ve)]:[]},xe={continue:!0},dt=async(Q,_t,on)=>{try{o.debug(`[AgentIDE] PreToolUse hook called: toolUseID=${_t}, event=${Q.hook_event_name}`);let ve=We.current;if(!ve)return o.debug("[AgentIDE] PreToolUse: no edit state"),xe;if(ve.aborted)return o.debug("[AgentIDE] PreToolUse: aborted"),xe;if(Q.hook_event_name!=="PreToolUse")return o.debug(`[AgentIDE] PreToolUse: wrong event ${Q.hook_event_name}`),xe;if(!le)return o.debug("[AgentIDE] PreToolUse: no rawChatSessionId"),xe;if(!a)return o.debug("[AgentIDE] PreToolUse: no edit tracker available"),xe;let xt=Q.tool_name;if(!oR.has(xt))return o.debug(`[AgentIDE] PreToolUse: tool ${xt} not tracked (not in FILE_TOOLS)`),xe;let Ot=Q.tool_use_id,kn=vt(xt,Q.tool_input).filter(an=>!(0,Mi.isBinaryFile)(an));if(o.debug(`[AgentIDE] PreToolUse: ${xt} files=${kn.length}: ${kn.join(", ")}`),kn.length===0)return xe;o.debug(`[AgentIDE] PreToolUse: calling startTracking for ${kn.length} files`);try{let an=await a.startTracking(le,kn);an?.operationId!==void 0&&ve&&!ve.aborted&&(o.debug(`[AgentIDE] PreToolUse: startTracking returned opId=${an.operationId}`),ve.pendingOperations.set(Ot,an.operationId))}catch(an){o.warn(`[AgentIDE] PreToolUse: startTracking failed: ${an}`)}return xe}catch(ve){return o.error("[AgentIDE] PreToolUse hook EXCEPTION",ve instanceof Error?ve:void 0),xe}},yn=async(Q,_t,on)=>{try{o.debug(`[AgentIDE] PostToolUse hook called: toolUseID=${_t}, event=${Q.hook_event_name}`);let ve=We.current;if(!ve||ve.aborted||Q.hook_event_name!=="PostToolUse"||!le||!a)return xe;let xt=Q.tool_use_id;if(!xt)return xe;let Ot=ve.pendingOperations.get(xt);if(o.debug(`[AgentIDE] PostToolUse: toolUseId=${xt} opId=${Ot}`),Ot!==void 0){ve.pendingOperations.delete(xt);try{await a.stopTracking(le,Ot),o.debug("[AgentIDE] PostToolUse: stopTracking done")}catch(kn){o.warn(`[AgentIDE] PostToolUse: stopTracking failed: ${kn}`)}}return xe}catch(ve){return o.error("[AgentIDE] PostToolUse hook EXCEPTION",ve instanceof Error?ve:void 0),xe}};o.debug(`[AgentIDE] Setting up Claude hooks for session ${le}`);let zn=async(Q,_t,on)=>(o.debug(`[AgentIDE] SessionStart hook called! event=${Q.hook_event_name}`),xe),{spawn:it,perTurn:sn}=await this.loadMcpServersForClaude(o,n.workspaceRoot,y,p),_i=n.workspaceRoot,Vr=y!=="default"?["project"]:["user","project"],se=J.allowDangerouslySkipPermissions===!0?!0:void 0,Ei={model:C,cwd:_i,additionalDirectories:W,settingSources:Vr,env:p,permissionMode:J.permissionMode,allowDangerouslySkipPermissions:se,includePartialMessages:!0,persistSession:!0,...N?{maxThinkingTokens:N}:{},...O?{effort:O}:{},...Object.keys(it).length>0?{mcpServers:it}:{},...this.config.claudeCodeExecutablePath?{pathToClaudeCodeExecutable:this.config.claudeCodeExecutablePath}:{},canUseTool:aR(r,o),hooks:{SessionStart:[{hooks:[zn]}],PreToolUse:[{hooks:[dt]}],PostToolUse:[{hooks:[yn]}]},stderr:Q=>{o.debug(`[AgentIDE] Claude CLI stderr: ${Q}`)}},D=await this.getOrCreateSession({conversationKey:P.key,chatSessionId:P.chatSessionId,signatureHash:P.signatureHash,signatureRaw:P.signatureRaw,agentideSignature:ee,isEphemeral:P.isEphemeral,modelId:C,cheapModel:G||void 0,effort:O,credentialFingerprint:d,queryOptions:Ei,logger:o}),ae=D.session,oe=D.editTrackingState;We.current=oe;let Ne=!1,jt=()=>{Ne=!0,oe.aborted=!0;let Q=Array.from(oe.pendingOperations.values());if(oe.pendingOperations.clear(),le&&Q.length>0&&a)for(let _t of Q)a.stopTracking(le,_t).catch(()=>{});o.info("[AgentIDE] Claude cancel requested; interrupting session..."),ae.interrupt().catch(()=>{try{ae.close()}catch{}})};if(i?.aborted){jt();return}i?.addEventListener("abort",jt,{once:!0}),D.turnsInFlight++;try{try{await ae.setMaxThinkingTokens(N),o.debug(`[AgentIDE] Claude setMaxThinkingTokens(${N??"null"}) ok`)}catch(Z){o.warn(`[AgentIDE] Claude setMaxThinkingTokens(${N??"null"}) failed: ${Z instanceof Error?Z.message:String(Z)}`)}if(Object.keys(sn).length>0)try{let Z=await ae.setMcpServers(sn),j=Object.entries(Z.errors);j.length>0?o.warn(`[AgentIDE] Claude setMcpServers connect errors: ${j.map(([Re,Oe])=>`${Re}: ${Oe}`).join("; ")} \u2014 data tools will fail closed this turn`):o.debug(`[AgentIDE] Claude setMcpServers ok (${Object.keys(sn).join(", ")})`)}catch(Z){o.warn(`[AgentIDE] Claude setMcpServers failed: ${Z instanceof Error?Z.message:String(Z)} \u2014 data tools will fail closed this turn`)}await ae.send(e);let Q=0,_t=0,on=0,ve=0,xt=0,Ot=0,kn=0,an=0,ws=new Set,ao=new Set,co=new Set,Ws=new Map,ca=new Map,yi=new Map,wi=new Map,la=Z=>Z.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160),lo=(Z,j)=>{if(typeof j=="string")return j.trim()?j:void 0;if(!j||typeof j!="object")return;let Re=j,Oe=Re.command;if(typeof Oe=="string"&&Oe.trim())return Oe.trim();let Le=Re.args;if(Array.isArray(Le)&&Le.every(we=>typeof we=="string"))return Le.join(" ");let Te=Re.location,ft=Te&&typeof Te=="object"?Te.path:void 0,Xt=Re.path??Re.file_path??Re.file??Re.filename??ft,Ct=[];typeof Xt=="string"&&Xt.trim()&&Ct.push(Xt.trim());let tt=Re.content;typeof tt=="string"&&Ct.push(`contentBytes=${Buffer.byteLength(tt,"utf8")}`);let Ce=Re.patch??Re.diff;if(typeof Ce=="string"&&Ct.push(`patchBytes=${Buffer.byteLength(Ce,"utf8")}`),Ct.length>0)return Ct.join(" ");let ye=300,Qn=30,go=4,br=(we,wn)=>{if(typeof we=="string")return we.length>ye?`${we.slice(0,ye)}\u2026 (${we.length} chars)`:we;if(typeof we=="number"||typeof we=="boolean"||we===null)return we;if(Array.isArray(we)){if(wn>=go)return`[Array(${we.length})]`;let Zn=we.slice(0,Qn).map(Kr=>br(Kr,wn+1));return we.length>Qn?[...Zn,`\u2026 (${we.length-Qn} more)`]:Zn}if(typeof we=="object"&&we){if(wn>=go)return"[Object]";let Zn={};for(let[Kr,Ys]of Object.entries(we)){if(typeof Ys=="string"&&/content|text|data|body|patch|diff/i.test(Kr)&&Ys.length>ye){Zn[Kr]=`<${Buffer.byteLength(Ys,"utf8")} bytes>`;continue}Zn[Kr]=br(Ys,wn+1)}return Zn}};try{let we=JSON.stringify(br(j,0),null,2),wn=we.trim();return wn==="{}"||wn==="[]"?void 0:we}catch{return}},uo=Z=>{if(!Z||typeof Z!="object")return;let j=Z,Re=j.type;if(Re==="tool_use"||Re==="server_tool_use"){let Oe=j.id,Le=j.name,Te=j.input;return typeof Oe=="string"&&typeof Le=="string"?{id:Oe,name:Le,input:Te}:void 0}if(Re==="mcp_tool_use"){let Oe=j.id,Le=j.name,Te=j.server_name,ft=j.input;if(typeof Oe=="string"&&typeof Le=="string"&&typeof Te=="string")return{id:Oe,name:`${Te}.${Le}`,input:ft}}},Tr=Z=>{if(typeof Z=="string")return Z;if(Z!=null)try{return JSON.stringify(Z,null,2)}catch{return String(Z)}},Qu=Z=>{if(typeof Z=="string")return Z;if(Array.isArray(Z)){let j=[];for(let Oe of Z){if(typeof Oe=="string"){j.push(Oe);continue}if(!Oe||typeof Oe!="object")continue;let Le=Oe;if(typeof Le.text=="string"){j.push(Le.text);continue}let Te=Tr(Oe);Te&&j.push(Te)}return j.join(`
85
- `).trim()||void 0}if(Z&&typeof Z=="object"){let j=Z;if(typeof j.text=="string")return j.text}return Tr(Z)},fo=Z=>{if(!Z||typeof Z!="object")return;let j=Z,Re=j.type;if(Re!=="tool_result"&&Re!=="server_tool_result"&&Re!=="mcp_tool_result")return;let Oe=j.tool_use_id;if(typeof Oe!="string"||!Oe)return;let Le=Qu(j.content??j.result??j.output??j.data??j.text),Te=typeof j.is_error=="boolean"?j.is_error:typeof j.isError=="boolean"?j.isError:void 0;return{toolUseId:Oe,resultText:Le,isError:Te}},qs=async(Z,j,Re)=>{if(!(!ws.has(j)||!!Re&&!ao.has(j))){Ws.set(j,Z);return}Ot++,ws.add(j),Re&&ao.add(j),Ws.set(j,Z),Ne||await r.toolStart(Z,Re,j)},po=async(Z,j,Re,Oe)=>{if(co.has(Z))return;let Le=Ws.get(Z)??Oe??"tool";ws.has(Z)||await qs(Le,Z),co.add(Z),Ws.delete(Z),Ne||await r.toolEnd(Le,Z,j,Re)},ua=!1,da=0;for await(let Z of ae.receive()){da++;let j=Z,Re=j.session_id;!ua&&Re&&(ua=!0,await(0,va.persistSessionIfNeeded)("claude",P,Re,n));let Oe=j.type==="result"||j.type==="system"?j.subtype:void 0;if(o.debug(`[AgentIDE] Claude msg #${da}: type=${j.type}, subtype=${Oe||"none"}`),Ne&&j.type!=="result")continue;if(j.type==="stream_event"){let Te=j.event,ft=Te.type;if(ft==="content_block_start"){let Xt=Te.content_block,Ct=Xt?.type,tt=Te.index;if(Ct==="thinking"){let Ce=Xt?.thinking;on++,typeof Ce=="string"&&Ce?(_t+=Ce.length,o.debug(`[AgentIDE] Claude thinking block start (${Ce.length} chars): ${la(Ce)}`),Ne||await r.thinking(Ce)):o.debug("[AgentIDE] Claude thinking block start (no initial thinking text)")}else if(Ct==="redacted_thinking"){ve++;let Ce=Xt?.data;o.debug(`[AgentIDE] Claude redacted_thinking block start (dataType=${typeof Ce})`)}else{let Ce=fo(Te.content_block);if(Ce){await po(Ce.toolUseId,Ce.resultText,Ce.isError);continue}let ye=uo(Te.content_block);if(ye&&(xt++,typeof tt=="number"&&(ca.set(tt,ye.id),yi.set(tt,ye.name)),!ws.has(ye.id))){let Qn=lo(ye.name,ye.input);o.debug(`[AgentIDE] Claude tool_use start: ${ye.name} (id=${ye.id}, input=${Qn?"yes":"no"})`),await qs(ye.name,ye.id,Qn)}}}else if(ft==="content_block_delta"){let Xt=Te.delta,Ct=Xt.type,tt=Xt.thinking,Ce=Xt.text;if(Ct==="thinking_delta"&&typeof tt=="string"&&tt)Q++,_t+=tt.length,Q<=3&&o.debug(`[AgentIDE] Claude thinking delta #${Q} (${tt.length} chars): ${la(tt)}`),Ne||await r.thinking(tt);else if(Ct==="input_json_delta"){let ye=Te.index,Qn=Xt.partial_json;if(typeof ye=="number"&&typeof Qn=="string"&&Qn){an++;let br=(wi.get(ye)??"")+Qn;wi.set(ye,br);let we=ca.get(ye);if(we&&!ao.has(we))try{let wn=JSON.parse(br),Zn=yi.get(ye)??"tool",Kr=lo(Zn,wn);Kr&&(o.debug(`[AgentIDE] Claude tool_use input_json parsed: ${Zn} (id=${we})`),await qs(Zn,we,Kr))}catch{}}}else Ct==="text_delta"&&typeof Ce=="string"&&Ce&&(v+=Ce,Ne||await r.text(Ce))}}else if(j.type==="assistant"){let Te=j.message.content;if(Array.isArray(Te))for(let ft of Te){let Xt=ft.type,Ct=ft.text,tt=fo(ft);if(tt){await po(tt.toolUseId,tt.resultText,tt.isError);continue}let Ce=uo(ft);if(Ce&&!ws.has(Ce.id)){xt++;let ye=lo(Ce.name,Ce.input);o.debug(`[AgentIDE] Claude tool_use (assistant msg): ${Ce.name} (id=${Ce.id}, input=${ye?"yes":"no"})`),await qs(Ce.name,Ce.id,ye);continue}Xt==="text"&&typeof Ct=="string"&&Ct&&(Ne||await I(Ct))}}else if(j.type==="tool_progress"){kn++;let Te=j.tool_use_id,ft=j.tool_name||"tool";Te&&!ws.has(Te)&&(o.debug(`[AgentIDE] Claude tool_progress: ${ft} (tool_use_id=${Te})`),await qs(ft,Te))}else if(j.type==="system")j.subtype==="status"&&j.status==="compacting"&&(Ne||await r.progress("Compacting context\u2026"));else if(j.type==="result"){if(j.subtype==="success")Ne||await I(j.result);else if(!Ne)throw new Error(j.errors?.join(`
86
- `)||j.subtype)}let Le=j.message?.content;if(j.type!=="assistant"&&Array.isArray(Le))for(let Te of Le){let ft=fo(Te);ft&&await po(ft.toolUseId,ft.resultText,ft.isError)}}for(let[Z,j]of Array.from(Ws.entries()))await po(Z,"Completed",!1,j);o.info(`[AgentIDE] Claude thinking summary: startBlocks=${on}, redactedBlocks=${ve}, deltas=${Q}, chars=${_t}`),o.info(`[AgentIDE] Claude tool summary: toolBlocks=${xt}, toolEmits=${Ot}, toolProgressMsgs=${kn}, inputJsonDeltas=${an}`),on===0&&Q===0&&ve===0&&o.debug(`[AgentIDE] Claude emitted no thinking blocks/deltas. Ensure model supports extended thinking and set ${(0,nR.toSettingsDisplayKey)("agentide.claude.maxThinkingTokens")} >= 1024.`),xt===0&&kn===0&&o.debug("[AgentIDE] Claude emitted no tool usage events. If tools were used, ensure includePartialMessages=true and parse tool_use blocks."),(0,va.touchSessionIfNeeded)(P)}catch(Q){if(!Ne)throw Q;o.info(`[AgentIDE] Claude stream aborted: ${Q instanceof Error?Q.message:String(Q)}`)}finally{i?.removeEventListener("abort",jt),D.turnsInFlight--,D.lastUsedAt=Date.now()}},{signal:i,timeoutMs:ul.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:"claude.stream"}),await r.done(),o.info("[AgentIDE] Claude streaming complete")}dispose(){for(let e of this.activeSessions.values())try{e.session.close()}catch{}this.activeSessions.clear()}onMaintenance(e){this.sweepIdleSessions(e)}loadClaudeSdk(){return import("@anthropic-ai/claude-agent-sdk")}sweepIdleSessions(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())if(s.turnsInFlight===0&&n-s.lastUsedAt>(0,iR.engineIdleTtlMs)()){try{s.session.close(),e?.info(`[AgentIDE] Closed idle Claude session (key=${r}, idleMs=${n-s.lastUsedAt})`)}catch{}this.activeSessions.delete(r)}}async getOrCreateSession(e){let n=this.activeSessions.get(e.conversationKey);if(n&&n.signatureHash===e.signatureHash&&n.modelId===e.modelId&&n.cheapModel===e.cheapModel&&n.effort===e.effort&&n.credentialFingerprint===e.credentialFingerprint&&n.agentideSignature===e.agentideSignature)return n.lastUsedAt=Date.now(),n.editTrackingState.aborted=!1,n.editTrackingState.pendingOperations.clear(),(0,ul.touchPersistedSession)(e.conversationKey),e.logger.debug(`[AgentIDE] REUSING existing Claude session (key=${e.conversationKey}) - NOTE: hooks from original session creation are used, not new ones`),n;let r;if(n){n.signatureHash===e.signatureHash&&n.agentideSignature!==e.agentideSignature&&(e.logger.info(`[AgentIDE] AgentIDE manifest changed (${n.agentideSignature} \u2192 ${e.agentideSignature}), restarting Claude session with resume`),r=n.session.sessionId??void 0),n.modelId!==e.modelId&&(e.logger.info(`[AgentIDE] Model changed (${n.modelId} \u2192 ${e.modelId}), will resume session with new model`),r=n.session.sessionId??void 0),n.cheapModel!==e.cheapModel&&(e.logger.info(`[AgentIDE] Cheap model changed (${n.cheapModel??"unset"} \u2192 ${e.cheapModel??"unset"}), will resume session with updated env`),r=n.session.sessionId??void 0),n.effort!==e.effort&&(e.logger.info(`[AgentIDE] Effort changed (${n.effort??"default"} \u2192 ${e.effort??"default"}), will resume session with new effort`),r=n.session.sessionId??void 0),n.credentialFingerprint!==e.credentialFingerprint&&(e.logger.info("[AgentIDE] Credential rotated, will resume session with fresh credentials"),r=n.session.sessionId??void 0);try{n.session.close()}catch{}this.activeSessions.delete(e.conversationKey)}!r&&!e.isEphemeral&&(r=(0,va.getPersistedSessionId)("claude",e.conversationKey)),r?e.logger.info(`[AgentIDE] Claude session will resume: ${r} (model: ${e.modelId})`):e.logger.info(`[AgentIDE] Claude session starting new (model: ${e.modelId})`);let s=await this.loadClaudeSdk(),o={session:dR({resumeSessionId:r,queryFn:s.query,options:e.queryOptions}),chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,agentideSignature:e.agentideSignature,modelId:e.modelId,cheapModel:e.cheapModel,effort:e.effort,credentialFingerprint:e.credentialFingerprint,lastUsedAt:Date.now(),turnsInFlight:0,editTrackingState:{aborted:!1,pendingOperations:new Map}};return this.activeSessions.set(e.conversationKey,o),o}async loadMcpServersForClaude(e,n,r="default",s){let i=this.getBundledBasePromptsDir(),o=await(0,zd.loadMcpServers)(r,n,i);if(o.length===0)return{spawn:{},perTurn:{}};let a={},c={};for(let u of o){if(u.url&&u.bearerTokenEnv){let d=(0,zd.resolveHttpMcpHeaders)(u,s??process.env);c[u.name]={type:"http",url:u.url,...d?{headers:d}:{}};continue}if(u.url){let d=(0,zd.referenceHttpMcpHeaders)(u,s??process.env);a[u.name]={type:"http",url:u.url,...d?{headers:d}:{}};continue}a[u.name]={command:u.command,args:u.args,...u.env&&Object.keys(u.env).length>0?{env:u.env}:{}}}let l=r==="default"?"bundled":`pack:${r}`;return e.debug(`[AgentIDE] Claude MCP servers loaded (${l}): ${o.map(u=>u.name).join(", ")} (per-turn: ${Object.keys(c).join(", ")||"none"})`),{spawn:a,perTurn:c}}};kr.ClaudeEngine=Qd});var ef=T(In=>{"use strict";var fR=In&&In.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),pR=In&&In.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),gR=In&&In.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&fR(n,e,r[s]);return pR(n,e),n}})();Object.defineProperty(In,"__esModule",{value:!0});In.syncPackMcpToWorkspace=nE;In.syncPackToWorkspace=AR;In.computeSkillsSignature=rE;In.createSkillsSignatureGetter=TR;In.createSessionDir=bR;In.getSessionDir=vR;var st=require("fs"),ne=gR(require("path")),eE=require("crypto"),Ie=dn(),hR=kc(),Ve=er(),tE=Pi(),mR=_a(),_R=Qs();async function nE(t,e,n,r){let s=ne.join(t,Ve.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,Ie.pathExists)(s))return;let i;try{i=await(0,tE.loadAgentManifest)(s)}catch(d){Ft(r,`[AgentIDE] Skipping pack MCP sync for ${n}: ${d instanceof Error?d.message:String(d)}`);return}let o=i.spec?.mcp;if(!o?.length)return;let a=ne.join(e,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.AGENTS_DIR,n,Ve.AGENT_CONSTANTS.MCP_DIR);await st.promises.mkdir(a,{recursive:!0});let c={mcpServers:{}},l=ne.join(a,".mcp.json");for(let d of o){let f=d.config?.trim();if(!f)continue;let p=ne.resolve(t,f);if(!Zd(t,p)){Ft(r,`[AgentIDE] Skipping MCP config ${f}: path escapes pack root`);continue}if(!await(0,Ie.pathExists)(p)){Ft(r,`[AgentIDE] Skipping MCP config ${f}: file not found`);continue}try{let _=JSON.parse(await st.promises.readFile(p,"utf8")).mcpServers;_&&typeof _=="object"&&Object.assign(c.mcpServers,_)}catch(g){Ft(r,`[AgentIDE] Skipping MCP config ${f}: ${g instanceof Error?g.message:String(g)}`)}}let u=ne.join(t,Ve.AGENT_CONSTANTS.MCP_DIR);if(await(0,Ie.pathExists)(u)){let d=await st.promises.readdir(u,{withFileTypes:!0});for(let f of d){if(!f.isDirectory()||f.name.startsWith("."))continue;let p=ne.join(u,f.name),g=ne.join(a,f.name);await(0,Ie.pathExists)(g)||await(0,Ie.copyDirRecursive)(p,g)}}!c.mcpServers||Object.keys(c.mcpServers).length===0||(await(0,Ie.writeFileIfChanged)(l,`${JSON.stringify(c,null,2)}
87
- `),Ft(r,`[AgentIDE] Synced pack MCP config: ${l}`))}function Z_(t){return!(!t||!t.trim()||ne.isAbsolute(t)||/^(https?:\/\/|git@|ssh:\/\/)/i.test(t))}function Zd(t,e){let n=ne.relative(t,e);return n!==".."&&!n.startsWith(`..${ne.sep}`)&&!ne.isAbsolute(n)}async function ER(t){return(await st.promises.readdir(t)).length===0}async function yR(t,e,n,r){let s=ne.join(e,Ve.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,Ie.pathExists)(s))try{let o=(await(0,tE.loadAgentManifest)(s)).spec?.data;if(!o)return;let a=o.sourcePath?.trim()||"./data",c=(o.workspacePath?.trim()||`.${ne.sep}${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}${ne.sep}data${ne.sep}${n}`).replace(/^(?:\.\/|\.\\)/,"");if(!Z_(a)||!Z_(c)){Ft(r,`[AgentIDE] Skipping data sync for ${n}: invalid spec.data paths`);return}let l=ne.resolve(e,a),u=ne.resolve(t,c);if(!Zd(e,l)||!Zd(t,u)){Ft(r,`[AgentIDE] Skipping data sync for ${n}: path escapes allowed root`);return}if(!await(0,Ie.pathExists)(l))return;if(!await(0,Ie.pathExists)(u)){await(0,Ie.copyDirRecursive)(l,u),Ft(r,`[AgentIDE] Seeded pack data for ${n}: ${u}`);return}(await st.promises.stat(u)).isDirectory()&&await ER(u)&&(await(0,Ie.copyDirRecursive)(l,u),Ft(r,`[AgentIDE] Seeded pack data for ${n}: ${u}`))}catch(i){Ft(r,`[AgentIDE] Skipping data sync for ${n}: ${i instanceof Error?i.message:String(i)}`)}}async function wR(t){let e=ne.join(t,"SKILL.md");try{if((await st.promises.lstat(e)).isSymbolicLink()){let r=await st.promises.readlink(e),s=ne.isAbsolute(r)?r:ne.resolve(ne.dirname(e),r);if(ne.resolve(s)===ne.resolve(e))return!1}return await st.promises.access(e),!0}catch{return!1}}async function SR(t,e,n){let r=ne.join(t,"skills");if(!await(0,Ie.pathExists)(r))return;await st.promises.mkdir(e,{recursive:!0});let s=await st.promises.readdir(r,{withFileTypes:!0});for(let i of s){if(!i.isDirectory())continue;let o=ne.join(e,i.name);await(0,Ie.pathExists)(o)&&await wR(o)||(await(0,Ie.pathExists)(o)&&await st.promises.rm(o,{recursive:!0,force:!0}),await(0,Ie.copyDirRecursive)(ne.join(r,i.name),o),Ft(n,`[AgentIDE] Bootstrapped bundled skill: ${i.name}`))}}async function AR(t,e,n,r,s,i){let o=hR.AGENT_ENGINES[r],a=o?{workspaceDir:o.workspaceDir,rulesFile:o.rulesFile,includeSkills:!0,includeRules:!0}:(()=>{let v=(0,_R.tryResolveCustomEngineManifest)(t,r);if(!v)throw new Error(`Unknown engine: ${r}`);if(v.workspaceSync?.enabled)return{workspaceDir:v.workspaceSync.dir,rulesFile:v.workspaceSync.rulesFile,includeSkills:v.workspaceSync.includeSkills,includeRules:v.workspaceSync.includeRules}})(),c=ne.join(e,"AGENTS.md"),l=ne.join(e,"context.md"),u=ne.join(e,"skills"),d=ne.join(e,"rules");await(0,Ie.ensureWorkspaceGitAndGitignore)(t,s);let f=ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.AGENTS_DIR,n);if(await st.promises.mkdir(f,{recursive:!0}),await(0,Ie.pathExists)(c)){let v=await st.promises.readFile(c,"utf8");await(0,Ie.writeFileIfChanged)(ne.join(f,Ve.AGENT_CONSTANTS.AGENTS_MD),v)}if(await(0,Ie.pathExists)(l)){let v=await st.promises.readFile(l,"utf8");await(0,Ie.writeFileIfChanged)(ne.join(f,Ve.AGENT_CONSTANTS.CONTEXT_MD),v)}let p=ne.join(e,Ve.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,Ie.pathExists)(p)){let v=await st.promises.readFile(p,"utf8");await(0,Ie.writeFileIfChanged)(ne.join(f,Ve.AGENT_CONSTANTS.GHOST_TEXT_FILE),v),Ft(s,`[AgentIDE] Synced GHOST_TEXT.md to ${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}`)}let g=ne.join(f,Ve.AGENT_CONSTANTS.SKILLS_DIR),_=ne.resolve(u),h=ne.resolve(g);await(0,Ie.pathExists)(u)&&(_===h?Ft(s,`[AgentIDE] Skipping skills self-sync (pack already under ${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n})`):(await(0,Ie.syncDirByFileLinks)(u,g,s,`${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n}/skills`),Ft(s,`[AgentIDE] Synced skills to ${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}: ${g}`))),i&&await SR(i,g,s);let y=ne.join(f,Ve.AGENT_CONSTANTS.RULES_DIR);if(await(0,Ie.pathExists)(d)){await st.promises.mkdir(y,{recursive:!0});let v=await st.promises.readdir(d,{withFileTypes:!0});for(let I of v){if(!I.isFile()||!I.name.toLowerCase().endsWith(".md"))continue;let P=ne.join(d,I.name),L=ne.join(y,I.name);await(0,Ie.symlinkOrCopyFile)(P,L,s,`rules/${I.name}`,{force:!0})}}if(n===Ve.AGENT_CONSTANTS.DEFAULT_AGENT_ID&&i){let v=await(0,mR.getDefaultMcpConfig)(i);if(v){let I=ne.join(f,Ve.AGENT_CONSTANTS.MCP_DIR);await st.promises.mkdir(I,{recursive:!0});let P=ne.join(I,".mcp.json");await(0,Ie.writeFileIfChanged)(P,v),Ft(s,`[AgentIDE] Synced MCP config: ${P}`)}}if(await nE(e,t,n,s),await yR(t,e,n,s),!a)return;let E=ne.join(t,a.workspaceDir);await st.promises.mkdir(E,{recursive:!0});let w="";if(await(0,Ie.pathExists)(c)&&(w=await st.promises.readFile(c,"utf8")),await(0,Ie.pathExists)(l)){let v=await st.promises.readFile(l,"utf8");w=w.trimEnd()+`
82
+ `),_=On.join(e,"agentide.runtime.md");return await(0,lt.writeFileIfChanged)(_,p),_}async syncCodexSkillsToCodexHome(e,n,r,s,i){let o=On.join(n,$i.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",r,"skills"),a=On.join(e,"skills");if(i){let u=this.lastCodexSkillsSignatureByWorkspaceRoot.get(n),f=await(0,lt.pathExists)(a);if(u===i&&f){s.debug(`[AgentIDE] Codex skills unchanged (sig=${i}), skipping $CODEX_HOME sync`);return}}try{await or.promises.rm(a,{recursive:!0,force:!0})}catch{}if(!await(0,lt.pathExists)(o))return;await or.promises.mkdir(a,{recursive:!0});let c=0,l=await or.promises.readdir(o,{withFileTypes:!0});for(let u of l){if(!u.isDirectory()||u.name.startsWith("."))continue;let f=On.join(o,u.name),d=On.join(f,"SKILL.md");await(0,lt.pathExists)(d)&&(await(0,lt.copyDirRecursive)(f,On.join(a,u.name)),c++)}i&&this.lastCodexSkillsSignatureByWorkspaceRoot.set(n,i),s.info(`[AgentIDE] Codex skills synced to $CODEX_HOME: ${c} skill(s)`)}};ar.CodexEngine=Xd});var Li=T(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.ENGINE_IDLE_TTL_ENV=void 0;Di.engineIdleTtlMs=q_;Di.engineMaintenanceIntervalMs=XN;Di.ENGINE_IDLE_TTL_ENV="AGENTHIPPO_ENGINE_IDLE_TTL";var qN=1e3*60*30,YN=1e3*60*5,JN=1e3*5;function q_(t=process.env){let e=Number(t[Di.ENGINE_IDLE_TTL_ENV]?.trim()||NaN);return Number.isFinite(e)&&e>0?e*1e3:qN}function XN(t=q_()){return Math.min(YN,Math.max(JN,Math.round(t/6)))}});var Q_=T(kr=>{"use strict";var zN=kr&&kr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),QN=kr&&kr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),X_=kr&&kr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&zN(n,e,r[s]);return QN(n,e),n}})();Object.defineProperty(kr,"__esModule",{value:!0});kr.ClaudeEngine=void 0;kr.resolveClaudeEffort=z_;var ZN=X_(require("crypto")),eR=require("fs"),ll=X_(require("path")),tR=Tc(),nR=ot(),va=Ii(),Mi=dn(),Y_=Cd(),zd=_a(),rR=Cr(),ul=Oi(),dl=Ud(),sR=As(),J_=kc(),iR=Li(),oR=new Set(["Write","Edit","FileEdit","FileWrite","MultiEdit","str_replace_editor","Str_replace_editor","TextEditor","text_editor","Bash","bash","shell","Shell"]);function aR(t,e){return async(n,r)=>{if(n==="AskUserQuestion"){let s=r,i=s?.questions??[];if(i.length===0)return e.warn("[AgentIDE] AskUserQuestion with no questions"),{behavior:"allow",updatedInput:{...s,answers:{}}};let o={};for(let a of i){let c={questionId:`ask-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,prompt:a.question,options:a.options?.map(f=>({label:f.label,description:f.description})),multiSelect:a.multiSelect},l=await t.question(c);if(l.declined||l.cancelled)return{behavior:"deny",message:"User declined or cancelled the question."};let u=l.freeText??l.selected.join(", ");o[a.question]=u}return{behavior:"allow",updatedInput:{questions:s.questions,answers:o}}}return{behavior:"allow",updatedInput:r}}}var cR="AGENTIDE_CONTEXT_EXPORT_PATH",lR="AGENTIDE_TERMINAL_LOG_PATH";function uR(){let t=!1,e=[],n=[];return{enqueue(r){if(t)throw new Error("Cannot enqueue into a closed queue");let s=n.shift();if(s){s({value:r,done:!1});return}e.push(r)},close(){for(t=!0;n.length;)n.shift()?.({value:void 0,done:!0})},[Symbol.asyncIterator](){return{next(){if(e.length){let r=e.shift();return Promise.resolve({value:r,done:!1})}return t?Promise.resolve({value:void 0,done:!0}):new Promise(r=>n.push(r))}}}}}function dR(t){let e=uR(),n=new AbortController,r=t.queryFn({prompt:e,options:{...t.options,abortController:n,resume:t.resumeSessionId}}),s=r[Symbol.asyncIterator](),i=!1,o=t.resumeSessionId??null;return{get sessionId(){return o},async setMaxThinkingTokens(a){if(i)throw new Error("Cannot setMaxThinkingTokens on closed Claude session");await r.setMaxThinkingTokens(a)},async setMcpServers(a){if(i)throw new Error("Cannot setMcpServers on closed Claude session");return r.setMcpServers(a)},async interrupt(){if(!i)try{await r.interrupt()}catch{}},async send(a){if(i)throw new Error("Cannot send to closed Claude session");let c;typeof a=="string"?c={type:"user",session_id:"",message:{role:"user",content:[{type:"text",text:a}]},parent_tool_use_id:null}:c=a,e.enqueue(c)},async*receive(){for(;;){let{value:a,done:c}=await s.next();if(c)return;let l=a;if(l.type==="system"&&l.subtype==="init"&&(o=l.session_id),yield l,l.type==="result")return}},close(){i||(i=!0,e.close(),n.abort())}}}function z_(t){let e=t?.trim();return e&&tR.ENGINE_EFFORTS.claude.includes(e)?e:void 0}var Qd=class{config;computeAgentideSignature;getBundledBasePromptsDir;id="claude";displayName="Claude";activeSessions=new Map;constructor(e,n,r){this.config=e,this.computeAgentideSignature=n,this.getBundledBasePromptsDir=r}async stream(e,n,r,s,i){let o=s.logger,a=s.editTracker,{apiKey:c,baseUrl:l,useLiteLLM:u}=(0,Mi.resolveApiRouting)(n,this.config,"anthropic");if(!c)throw new Error("Claude API key not provided");let f=ZN.createHash("sha256").update(`${c}
83
+ ${l??""}`).digest("hex").slice(0,16);o.info(`[AgentIDE] Claude using ${u?"LiteLLM proxy":"direct Anthropic"}, baseUrl: ${l||"default"}, workspaceRoot=${n.workspaceRoot}, additionalDirs=${n.additionalDirectories?.length??0}`),await r.progress("Thinking...");let d=(0,va.buildLiteLLMMetadataHeaders)(u,{sessionId:n.sessionId,analyticsUserId:n.analyticsUserId,analyticsProjectId:(0,va.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),agentId:n.agentPackId??"default",agentVersion:n.agentPackVersion??"workspace",source:"agenthippo",engine:"claude",requestId:n.requestId,policyVersion:n.policyVersion,packDigest:n.packDigest,instanceId:n.instanceId,engineVersion:n.engineVersion,tier:n.tier}),g={...process.env,...s.cliEnvPatch??{},DEBUG_CLAUDE_AGENT_SDK:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1"};if(delete g[rR.OPENCLAW_GATEWAY_TOKEN_ENV],delete g.AGENTHIPPO_DATA_PLANE_TOKEN,(0,J_.isAnthropicSetupToken)(c)){let L=(0,J_.normalizeAnthropicSetupToken)(c);g.CLAUDE_CODE_OAUTH_TOKEN=L,delete g.ANTHROPIC_AUTH_TOKEN,delete g.ANTHROPIC_API_KEY,o.info("[AgentIDE] Claude using setup-token auth (CLAUDE_CODE_OAUTH_TOKEN)")}else g.ANTHROPIC_API_KEY=c,g.ANTHROPIC_AUTH_TOKEN=c,delete g.CLAUDE_CODE_OAUTH_TOKEN;let _=n.sessionId?.trim(),h=n.contextSessionId?.trim()||_;h&&(g[cR]=ll.join(n.workspaceRoot,dl.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"context.md"),g[lR]=ll.join(n.workspaceRoot,dl.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"terminal.md"));let y=n.agentPackId??"default",E=(0,dl.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,y,n.agentPackVersion),w=(0,dl.userScopedEngineHomeFromKey)(E.claudeConfigDir,(0,sR.resolveEngineHomeUserKey)(n.engineHomeUserKey));if(g.CLAUDE_CONFIG_DIR=w,await eR.promises.mkdir(w,{recursive:!0}),g.AGENT_ID=y,n.agentPackVersion&&(g.AGENTIDE_AGENT_VERSION=n.agentPackVersion),y!=="default"?o.info(`[AgentIDE] Claude using agent: ${y}, CLAUDE_CONFIG_DIR=${w} (agent-isolated)`):o.info(`[AgentIDE] Claude using default agent, CLAUDE_CONFIG_DIR=${w}`),d.length>0&&(g.ANTHROPIC_CUSTOM_HEADERS=d.join(`
84
+ `)),l&&l!=="https://api.anthropic.com/v1"){let L=l.endsWith("/v1")?l.slice(0,-3):l;g.ANTHROPIC_BASE_URL=L,o.info(`[AgentIDE] Using custom Anthropic base URL: ${L}`),(0,Mi.applyLocalTlsBypass)(g,L)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS")}let C=n.modelId;if(!C)throw new Error("Claude modelId not provided for streaming request");o.info(`[AgentIDE] Using Claude model: ${C}`);let b="",I=async L=>{if(!L)return;let N=b.length,O=L.length;if(N===0){b=L,await r.text(L);return}if(O===N){if(L===b){o.debug("[AgentIDE] Claude: exact duplicate, skipping");return}}else if(O>N){if(L.startsWith(b)){let G=L.slice(N);b=L,o.debug(`[AgentIDE] Claude: emitting remainder (${G.length} chars)`),await r.text(G);return}}else if(b.endsWith(L)){o.debug("[AgentIDE] Claude: suffix already streamed, skipping");return}b=L,await r.text(L)},P=(0,ul.buildConversationKey)("claude",n);o.info(`[AgentIDE] Claude conversationKey=${P.key} (chatSessionId=${P.chatSessionId}, signature=${P.signatureHash}${P.isEphemeral?", ephemeral":""})`),await(0,ul.withConversationLock)(P.key,async()=>{let L=(0,Mi.getAgentideEngineSettings)(s?.configProvider),N=typeof L.claudeMaxThinkingTokens=="number"&&L.claudeMaxThinkingTokens>0?Math.floor(L.claudeMaxThinkingTokens):null;o.debug(`[AgentIDE] Claude maxThinkingTokens=${N??"default/disabled"}`);let O=z_(L.effort);o.debug(`[AgentIDE] Claude effort=${O??"default"}`);let G=(L.claudeCheapModel||"").trim();G&&(g.ANTHROPIC_DEFAULT_HAIKU_MODEL=G,g.CLAUDE_CODE_SUBAGENT_MODEL=G,o.debug(`[AgentIDE] Claude cheapModel=${G}`));let H=n.permissions??Y_.DEFAULT_PERMISSIONS;o.debug(`[AgentIDE] Claude permissions: fileAccess=${H.fileAccess}`);let X=(0,Mi.stableAdditionalDirs)([n.workspaceRoot,...n.additionalDirectories??[]]),J=(0,Y_.toClaudeOptions)(H,X);o.debug(`[AgentIDE] Claude mapped: permissionMode=${J.permissionMode}, allowDangerouslySkipPermissions=${J.allowDangerouslySkipPermissions}, dirs=${J.additionalDirectories?.length??"undefined"}`);let W=(0,Mi.stableAdditionalDirs)([...J.additionalDirectories??[],w]),ee=await this.computeAgentideSignature(n.workspaceRoot,n.additionalDirectories),le=n.sessionId,pe=n.workspaceRoot,We={current:null},Ue=Q=>{let _t=Q.trim();return/(?:^|&&|\||;)\s*git\s+/.test(_t)},vt=(Q,_t)=>{let on=_t;if(!on)return[];if(Q==="Bash"){let Ot=on.command;return Ot?Ue(Ot)?[]:(0,Mi.extractFilePaths)(Ot,pe):[]}let ve=on.file_path??on.path;return ve?[ll.isAbsolute(ve)?ve:ll.join(pe,ve)]:[]},xe={continue:!0},dt=async(Q,_t,on)=>{try{o.debug(`[AgentIDE] PreToolUse hook called: toolUseID=${_t}, event=${Q.hook_event_name}`);let ve=We.current;if(!ve)return o.debug("[AgentIDE] PreToolUse: no edit state"),xe;if(ve.aborted)return o.debug("[AgentIDE] PreToolUse: aborted"),xe;if(Q.hook_event_name!=="PreToolUse")return o.debug(`[AgentIDE] PreToolUse: wrong event ${Q.hook_event_name}`),xe;if(!le)return o.debug("[AgentIDE] PreToolUse: no rawChatSessionId"),xe;if(!a)return o.debug("[AgentIDE] PreToolUse: no edit tracker available"),xe;let xt=Q.tool_name;if(!oR.has(xt))return o.debug(`[AgentIDE] PreToolUse: tool ${xt} not tracked (not in FILE_TOOLS)`),xe;let Ot=Q.tool_use_id,kn=vt(xt,Q.tool_input).filter(an=>!(0,Mi.isBinaryFile)(an));if(o.debug(`[AgentIDE] PreToolUse: ${xt} files=${kn.length}: ${kn.join(", ")}`),kn.length===0)return xe;o.debug(`[AgentIDE] PreToolUse: calling startTracking for ${kn.length} files`);try{let an=await a.startTracking(le,kn);an?.operationId!==void 0&&ve&&!ve.aborted&&(o.debug(`[AgentIDE] PreToolUse: startTracking returned opId=${an.operationId}`),ve.pendingOperations.set(Ot,an.operationId))}catch(an){o.warn(`[AgentIDE] PreToolUse: startTracking failed: ${an}`)}return xe}catch(ve){return o.error("[AgentIDE] PreToolUse hook EXCEPTION",ve instanceof Error?ve:void 0),xe}},yn=async(Q,_t,on)=>{try{o.debug(`[AgentIDE] PostToolUse hook called: toolUseID=${_t}, event=${Q.hook_event_name}`);let ve=We.current;if(!ve||ve.aborted||Q.hook_event_name!=="PostToolUse"||!le||!a)return xe;let xt=Q.tool_use_id;if(!xt)return xe;let Ot=ve.pendingOperations.get(xt);if(o.debug(`[AgentIDE] PostToolUse: toolUseId=${xt} opId=${Ot}`),Ot!==void 0){ve.pendingOperations.delete(xt);try{await a.stopTracking(le,Ot),o.debug("[AgentIDE] PostToolUse: stopTracking done")}catch(kn){o.warn(`[AgentIDE] PostToolUse: stopTracking failed: ${kn}`)}}return xe}catch(ve){return o.error("[AgentIDE] PostToolUse hook EXCEPTION",ve instanceof Error?ve:void 0),xe}};o.debug(`[AgentIDE] Setting up Claude hooks for session ${le}`);let zn=async(Q,_t,on)=>(o.debug(`[AgentIDE] SessionStart hook called! event=${Q.hook_event_name}`),xe),{spawn:it,perTurn:sn}=await this.loadMcpServersForClaude(o,n.workspaceRoot,y,g),_i=n.workspaceRoot,Vr=y!=="default"?["project"]:["user","project"],se=J.allowDangerouslySkipPermissions===!0?!0:void 0,Ei={model:C,cwd:_i,additionalDirectories:W,settingSources:Vr,env:g,permissionMode:J.permissionMode,allowDangerouslySkipPermissions:se,includePartialMessages:!0,persistSession:!0,...N?{maxThinkingTokens:N}:{},...O?{effort:O}:{},...Object.keys(it).length>0?{mcpServers:it}:{},...this.config.claudeCodeExecutablePath?{pathToClaudeCodeExecutable:this.config.claudeCodeExecutablePath}:{},canUseTool:aR(r,o),hooks:{SessionStart:[{hooks:[zn]}],PreToolUse:[{hooks:[dt]}],PostToolUse:[{hooks:[yn]}]},stderr:Q=>{o.debug(`[AgentIDE] Claude CLI stderr: ${Q}`)}},D=await this.getOrCreateSession({conversationKey:P.key,chatSessionId:P.chatSessionId,signatureHash:P.signatureHash,signatureRaw:P.signatureRaw,agentideSignature:ee,isEphemeral:P.isEphemeral,modelId:C,cheapModel:G||void 0,effort:O,credentialFingerprint:f,queryOptions:Ei,logger:o}),ae=D.session,oe=D.editTrackingState;We.current=oe;let Ne=!1,jt=()=>{Ne=!0,oe.aborted=!0;let Q=Array.from(oe.pendingOperations.values());if(oe.pendingOperations.clear(),le&&Q.length>0&&a)for(let _t of Q)a.stopTracking(le,_t).catch(()=>{});o.info("[AgentIDE] Claude cancel requested; interrupting session..."),ae.interrupt().catch(()=>{try{ae.close()}catch{}})};if(i?.aborted){jt();return}i?.addEventListener("abort",jt,{once:!0}),D.turnsInFlight++;try{try{await ae.setMaxThinkingTokens(N),o.debug(`[AgentIDE] Claude setMaxThinkingTokens(${N??"null"}) ok`)}catch(Z){o.warn(`[AgentIDE] Claude setMaxThinkingTokens(${N??"null"}) failed: ${Z instanceof Error?Z.message:String(Z)}`)}if(Object.keys(sn).length>0)try{let Z=await ae.setMcpServers(sn),j=Object.entries(Z.errors);j.length>0?o.warn(`[AgentIDE] Claude setMcpServers connect errors: ${j.map(([Re,Oe])=>`${Re}: ${Oe}`).join("; ")} \u2014 data tools will fail closed this turn`):o.debug(`[AgentIDE] Claude setMcpServers ok (${Object.keys(sn).join(", ")})`)}catch(Z){o.warn(`[AgentIDE] Claude setMcpServers failed: ${Z instanceof Error?Z.message:String(Z)} \u2014 data tools will fail closed this turn`)}await ae.send(e);let Q=0,_t=0,on=0,ve=0,xt=0,Ot=0,kn=0,an=0,ws=new Set,ao=new Set,co=new Set,Ws=new Map,ca=new Map,yi=new Map,wi=new Map,la=Z=>Z.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160),lo=(Z,j)=>{if(typeof j=="string")return j.trim()?j:void 0;if(!j||typeof j!="object")return;let Re=j,Oe=Re.command;if(typeof Oe=="string"&&Oe.trim())return Oe.trim();let Le=Re.args;if(Array.isArray(Le)&&Le.every(we=>typeof we=="string"))return Le.join(" ");let Te=Re.location,ft=Te&&typeof Te=="object"?Te.path:void 0,Xt=Re.path??Re.file_path??Re.file??Re.filename??ft,Ct=[];typeof Xt=="string"&&Xt.trim()&&Ct.push(Xt.trim());let tt=Re.content;typeof tt=="string"&&Ct.push(`contentBytes=${Buffer.byteLength(tt,"utf8")}`);let Ce=Re.patch??Re.diff;if(typeof Ce=="string"&&Ct.push(`patchBytes=${Buffer.byteLength(Ce,"utf8")}`),Ct.length>0)return Ct.join(" ");let ye=300,Qn=30,go=4,br=(we,wn)=>{if(typeof we=="string")return we.length>ye?`${we.slice(0,ye)}\u2026 (${we.length} chars)`:we;if(typeof we=="number"||typeof we=="boolean"||we===null)return we;if(Array.isArray(we)){if(wn>=go)return`[Array(${we.length})]`;let Zn=we.slice(0,Qn).map(Kr=>br(Kr,wn+1));return we.length>Qn?[...Zn,`\u2026 (${we.length-Qn} more)`]:Zn}if(typeof we=="object"&&we){if(wn>=go)return"[Object]";let Zn={};for(let[Kr,Ys]of Object.entries(we)){if(typeof Ys=="string"&&/content|text|data|body|patch|diff/i.test(Kr)&&Ys.length>ye){Zn[Kr]=`<${Buffer.byteLength(Ys,"utf8")} bytes>`;continue}Zn[Kr]=br(Ys,wn+1)}return Zn}};try{let we=JSON.stringify(br(j,0),null,2),wn=we.trim();return wn==="{}"||wn==="[]"?void 0:we}catch{return}},uo=Z=>{if(!Z||typeof Z!="object")return;let j=Z,Re=j.type;if(Re==="tool_use"||Re==="server_tool_use"){let Oe=j.id,Le=j.name,Te=j.input;return typeof Oe=="string"&&typeof Le=="string"?{id:Oe,name:Le,input:Te}:void 0}if(Re==="mcp_tool_use"){let Oe=j.id,Le=j.name,Te=j.server_name,ft=j.input;if(typeof Oe=="string"&&typeof Le=="string"&&typeof Te=="string")return{id:Oe,name:`${Te}.${Le}`,input:ft}}},Tr=Z=>{if(typeof Z=="string")return Z;if(Z!=null)try{return JSON.stringify(Z,null,2)}catch{return String(Z)}},Qu=Z=>{if(typeof Z=="string")return Z;if(Array.isArray(Z)){let j=[];for(let Oe of Z){if(typeof Oe=="string"){j.push(Oe);continue}if(!Oe||typeof Oe!="object")continue;let Le=Oe;if(typeof Le.text=="string"){j.push(Le.text);continue}let Te=Tr(Oe);Te&&j.push(Te)}return j.join(`
85
+ `).trim()||void 0}if(Z&&typeof Z=="object"){let j=Z;if(typeof j.text=="string")return j.text}return Tr(Z)},fo=Z=>{if(!Z||typeof Z!="object")return;let j=Z,Re=j.type;if(Re!=="tool_result"&&Re!=="server_tool_result"&&Re!=="mcp_tool_result")return;let Oe=j.tool_use_id;if(typeof Oe!="string"||!Oe)return;let Le=Qu(j.content??j.result??j.output??j.data??j.text),Te=typeof j.is_error=="boolean"?j.is_error:typeof j.isError=="boolean"?j.isError:void 0;return{toolUseId:Oe,resultText:Le,isError:Te}},qs=async(Z,j,Re)=>{if(!(!ws.has(j)||!!Re&&!ao.has(j))){Ws.set(j,Z);return}Ot++,ws.add(j),Re&&ao.add(j),Ws.set(j,Z),Ne||await r.toolStart(Z,Re,j)},po=async(Z,j,Re,Oe)=>{if(co.has(Z))return;let Le=Ws.get(Z)??Oe??"tool";ws.has(Z)||await qs(Le,Z),co.add(Z),Ws.delete(Z),Ne||await r.toolEnd(Le,Z,j,Re)},ua=!1,da=0;for await(let Z of ae.receive()){da++;let j=Z,Re=j.session_id;!ua&&Re&&(ua=!0,await(0,va.persistSessionIfNeeded)("claude",P,Re,n));let Oe=j.type==="result"||j.type==="system"?j.subtype:void 0;if(o.debug(`[AgentIDE] Claude msg #${da}: type=${j.type}, subtype=${Oe||"none"}`),Ne&&j.type!=="result")continue;if(j.type==="stream_event"){let Te=j.event,ft=Te.type;if(ft==="content_block_start"){let Xt=Te.content_block,Ct=Xt?.type,tt=Te.index;if(Ct==="thinking"){let Ce=Xt?.thinking;on++,typeof Ce=="string"&&Ce?(_t+=Ce.length,o.debug(`[AgentIDE] Claude thinking block start (${Ce.length} chars): ${la(Ce)}`),Ne||await r.thinking(Ce)):o.debug("[AgentIDE] Claude thinking block start (no initial thinking text)")}else if(Ct==="redacted_thinking"){ve++;let Ce=Xt?.data;o.debug(`[AgentIDE] Claude redacted_thinking block start (dataType=${typeof Ce})`)}else{let Ce=fo(Te.content_block);if(Ce){await po(Ce.toolUseId,Ce.resultText,Ce.isError);continue}let ye=uo(Te.content_block);if(ye&&(xt++,typeof tt=="number"&&(ca.set(tt,ye.id),yi.set(tt,ye.name)),!ws.has(ye.id))){let Qn=lo(ye.name,ye.input);o.debug(`[AgentIDE] Claude tool_use start: ${ye.name} (id=${ye.id}, input=${Qn?"yes":"no"})`),await qs(ye.name,ye.id,Qn)}}}else if(ft==="content_block_delta"){let Xt=Te.delta,Ct=Xt.type,tt=Xt.thinking,Ce=Xt.text;if(Ct==="thinking_delta"&&typeof tt=="string"&&tt)Q++,_t+=tt.length,Q<=3&&o.debug(`[AgentIDE] Claude thinking delta #${Q} (${tt.length} chars): ${la(tt)}`),Ne||await r.thinking(tt);else if(Ct==="input_json_delta"){let ye=Te.index,Qn=Xt.partial_json;if(typeof ye=="number"&&typeof Qn=="string"&&Qn){an++;let br=(wi.get(ye)??"")+Qn;wi.set(ye,br);let we=ca.get(ye);if(we&&!ao.has(we))try{let wn=JSON.parse(br),Zn=yi.get(ye)??"tool",Kr=lo(Zn,wn);Kr&&(o.debug(`[AgentIDE] Claude tool_use input_json parsed: ${Zn} (id=${we})`),await qs(Zn,we,Kr))}catch{}}}else Ct==="text_delta"&&typeof Ce=="string"&&Ce&&(b+=Ce,Ne||await r.text(Ce))}}else if(j.type==="assistant"){let Te=j.message.content;if(Array.isArray(Te))for(let ft of Te){let Xt=ft.type,Ct=ft.text,tt=fo(ft);if(tt){await po(tt.toolUseId,tt.resultText,tt.isError);continue}let Ce=uo(ft);if(Ce&&!ws.has(Ce.id)){xt++;let ye=lo(Ce.name,Ce.input);o.debug(`[AgentIDE] Claude tool_use (assistant msg): ${Ce.name} (id=${Ce.id}, input=${ye?"yes":"no"})`),await qs(Ce.name,Ce.id,ye);continue}Xt==="text"&&typeof Ct=="string"&&Ct&&(Ne||await I(Ct))}}else if(j.type==="tool_progress"){kn++;let Te=j.tool_use_id,ft=j.tool_name||"tool";Te&&!ws.has(Te)&&(o.debug(`[AgentIDE] Claude tool_progress: ${ft} (tool_use_id=${Te})`),await qs(ft,Te))}else if(j.type==="system")j.subtype==="status"&&j.status==="compacting"&&(Ne||await r.progress("Compacting context\u2026"));else if(j.type==="result"){if(j.subtype==="success")Ne||await I(j.result);else if(!Ne)throw new Error(j.errors?.join(`
86
+ `)||j.subtype)}let Le=j.message?.content;if(j.type!=="assistant"&&Array.isArray(Le))for(let Te of Le){let ft=fo(Te);ft&&await po(ft.toolUseId,ft.resultText,ft.isError)}}for(let[Z,j]of Array.from(Ws.entries()))await po(Z,"Completed",!1,j);o.info(`[AgentIDE] Claude thinking summary: startBlocks=${on}, redactedBlocks=${ve}, deltas=${Q}, chars=${_t}`),o.info(`[AgentIDE] Claude tool summary: toolBlocks=${xt}, toolEmits=${Ot}, toolProgressMsgs=${kn}, inputJsonDeltas=${an}`),on===0&&Q===0&&ve===0&&o.debug(`[AgentIDE] Claude emitted no thinking blocks/deltas. Ensure model supports extended thinking and set ${(0,nR.toSettingsDisplayKey)("agentide.claude.maxThinkingTokens")} >= 1024.`),xt===0&&kn===0&&o.debug("[AgentIDE] Claude emitted no tool usage events. If tools were used, ensure includePartialMessages=true and parse tool_use blocks."),(0,va.touchSessionIfNeeded)(P)}catch(Q){if(!Ne)throw Q;o.info(`[AgentIDE] Claude stream aborted: ${Q instanceof Error?Q.message:String(Q)}`)}finally{i?.removeEventListener("abort",jt),D.turnsInFlight--,D.lastUsedAt=Date.now()}},{signal:i,timeoutMs:ul.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:"claude.stream"}),await r.done(),o.info("[AgentIDE] Claude streaming complete")}dispose(){for(let e of this.activeSessions.values())try{e.session.close()}catch{}this.activeSessions.clear()}onMaintenance(e){this.sweepIdleSessions(e)}loadClaudeSdk(){return import("@anthropic-ai/claude-agent-sdk")}sweepIdleSessions(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())if(s.turnsInFlight===0&&n-s.lastUsedAt>(0,iR.engineIdleTtlMs)()){try{s.session.close(),e?.info(`[AgentIDE] Closed idle Claude session (key=${r}, idleMs=${n-s.lastUsedAt})`)}catch{}this.activeSessions.delete(r)}}async getOrCreateSession(e){let n=this.activeSessions.get(e.conversationKey);if(n&&n.signatureHash===e.signatureHash&&n.modelId===e.modelId&&n.cheapModel===e.cheapModel&&n.effort===e.effort&&n.credentialFingerprint===e.credentialFingerprint&&n.agentideSignature===e.agentideSignature)return n.lastUsedAt=Date.now(),n.editTrackingState.aborted=!1,n.editTrackingState.pendingOperations.clear(),(0,ul.touchPersistedSession)(e.conversationKey),e.logger.debug(`[AgentIDE] REUSING existing Claude session (key=${e.conversationKey}) - NOTE: hooks from original session creation are used, not new ones`),n;let r;if(n){n.signatureHash===e.signatureHash&&n.agentideSignature!==e.agentideSignature&&(e.logger.info(`[AgentIDE] AgentIDE manifest changed (${n.agentideSignature} \u2192 ${e.agentideSignature}), restarting Claude session with resume`),r=n.session.sessionId??void 0),n.modelId!==e.modelId&&(e.logger.info(`[AgentIDE] Model changed (${n.modelId} \u2192 ${e.modelId}), will resume session with new model`),r=n.session.sessionId??void 0),n.cheapModel!==e.cheapModel&&(e.logger.info(`[AgentIDE] Cheap model changed (${n.cheapModel??"unset"} \u2192 ${e.cheapModel??"unset"}), will resume session with updated env`),r=n.session.sessionId??void 0),n.effort!==e.effort&&(e.logger.info(`[AgentIDE] Effort changed (${n.effort??"default"} \u2192 ${e.effort??"default"}), will resume session with new effort`),r=n.session.sessionId??void 0),n.credentialFingerprint!==e.credentialFingerprint&&(e.logger.info("[AgentIDE] Credential rotated, will resume session with fresh credentials"),r=n.session.sessionId??void 0);try{n.session.close()}catch{}this.activeSessions.delete(e.conversationKey)}!r&&!e.isEphemeral&&(r=(0,va.getPersistedSessionId)("claude",e.conversationKey)),r?e.logger.info(`[AgentIDE] Claude session will resume: ${r} (model: ${e.modelId})`):e.logger.info(`[AgentIDE] Claude session starting new (model: ${e.modelId})`);let s=await this.loadClaudeSdk(),o={session:dR({resumeSessionId:r,queryFn:s.query,options:e.queryOptions}),chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,agentideSignature:e.agentideSignature,modelId:e.modelId,cheapModel:e.cheapModel,effort:e.effort,credentialFingerprint:e.credentialFingerprint,lastUsedAt:Date.now(),turnsInFlight:0,editTrackingState:{aborted:!1,pendingOperations:new Map}};return this.activeSessions.set(e.conversationKey,o),o}async loadMcpServersForClaude(e,n,r="default",s){let i=this.getBundledBasePromptsDir(),o=await(0,zd.loadMcpServers)(r,n,i);if(o.length===0)return{spawn:{},perTurn:{}};let a={},c={};for(let u of o){if(u.url&&u.bearerTokenEnv){let f=(0,zd.resolveHttpMcpHeaders)(u,s??process.env);c[u.name]={type:"http",url:u.url,...f?{headers:f}:{}};continue}if(u.url){let f=(0,zd.referenceHttpMcpHeaders)(u,s??process.env);a[u.name]={type:"http",url:u.url,...f?{headers:f}:{}};continue}a[u.name]={command:u.command,args:u.args,...u.env&&Object.keys(u.env).length>0?{env:u.env}:{}}}let l=r==="default"?"bundled":`pack:${r}`;return e.debug(`[AgentIDE] Claude MCP servers loaded (${l}): ${o.map(u=>u.name).join(", ")} (per-turn: ${Object.keys(c).join(", ")||"none"})`),{spawn:a,perTurn:c}}};kr.ClaudeEngine=Qd});var ef=T(In=>{"use strict";var fR=In&&In.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),pR=In&&In.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),gR=In&&In.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&fR(n,e,r[s]);return pR(n,e),n}})();Object.defineProperty(In,"__esModule",{value:!0});In.syncPackMcpToWorkspace=nE;In.syncPackToWorkspace=AR;In.computeSkillsSignature=rE;In.createSkillsSignatureGetter=TR;In.createSessionDir=bR;In.getSessionDir=vR;var st=require("fs"),ne=gR(require("path")),eE=require("crypto"),Ie=dn(),hR=kc(),Ve=er(),tE=Pi(),mR=_a(),_R=Qs();async function nE(t,e,n,r){let s=ne.join(t,Ve.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,Ie.pathExists)(s))return;let i;try{i=await(0,tE.loadAgentManifest)(s)}catch(f){Ft(r,`[AgentIDE] Skipping pack MCP sync for ${n}: ${f instanceof Error?f.message:String(f)}`);return}let o=i.spec?.mcp;if(!o?.length)return;let a=ne.join(e,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.AGENTS_DIR,n,Ve.AGENT_CONSTANTS.MCP_DIR);await st.promises.mkdir(a,{recursive:!0});let c={mcpServers:{}},l=ne.join(a,".mcp.json");for(let f of o){let d=f.config?.trim();if(!d)continue;let g=ne.resolve(t,d);if(!Zd(t,g)){Ft(r,`[AgentIDE] Skipping MCP config ${d}: path escapes pack root`);continue}if(!await(0,Ie.pathExists)(g)){Ft(r,`[AgentIDE] Skipping MCP config ${d}: file not found`);continue}try{let _=JSON.parse(await st.promises.readFile(g,"utf8")).mcpServers;_&&typeof _=="object"&&Object.assign(c.mcpServers,_)}catch(p){Ft(r,`[AgentIDE] Skipping MCP config ${d}: ${p instanceof Error?p.message:String(p)}`)}}let u=ne.join(t,Ve.AGENT_CONSTANTS.MCP_DIR);if(await(0,Ie.pathExists)(u)){let f=await st.promises.readdir(u,{withFileTypes:!0});for(let d of f){if(!d.isDirectory()||d.name.startsWith("."))continue;let g=ne.join(u,d.name),p=ne.join(a,d.name);await(0,Ie.pathExists)(p)||await(0,Ie.copyDirRecursive)(g,p)}}!c.mcpServers||Object.keys(c.mcpServers).length===0||(await(0,Ie.writeFileIfChanged)(l,`${JSON.stringify(c,null,2)}
87
+ `),Ft(r,`[AgentIDE] Synced pack MCP config: ${l}`))}function Z_(t){return!(!t||!t.trim()||ne.isAbsolute(t)||/^(https?:\/\/|git@|ssh:\/\/)/i.test(t))}function Zd(t,e){let n=ne.relative(t,e);return n!==".."&&!n.startsWith(`..${ne.sep}`)&&!ne.isAbsolute(n)}async function ER(t){return(await st.promises.readdir(t)).length===0}async function yR(t,e,n,r){let s=ne.join(e,Ve.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,Ie.pathExists)(s))try{let o=(await(0,tE.loadAgentManifest)(s)).spec?.data;if(!o)return;let a=o.sourcePath?.trim()||"./data",c=(o.workspacePath?.trim()||`.${ne.sep}${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}${ne.sep}data${ne.sep}${n}`).replace(/^(?:\.\/|\.\\)/,"");if(!Z_(a)||!Z_(c)){Ft(r,`[AgentIDE] Skipping data sync for ${n}: invalid spec.data paths`);return}let l=ne.resolve(e,a),u=ne.resolve(t,c);if(!Zd(e,l)||!Zd(t,u)){Ft(r,`[AgentIDE] Skipping data sync for ${n}: path escapes allowed root`);return}if(!await(0,Ie.pathExists)(l))return;if(!await(0,Ie.pathExists)(u)){await(0,Ie.copyDirRecursive)(l,u),Ft(r,`[AgentIDE] Seeded pack data for ${n}: ${u}`);return}(await st.promises.stat(u)).isDirectory()&&await ER(u)&&(await(0,Ie.copyDirRecursive)(l,u),Ft(r,`[AgentIDE] Seeded pack data for ${n}: ${u}`))}catch(i){Ft(r,`[AgentIDE] Skipping data sync for ${n}: ${i instanceof Error?i.message:String(i)}`)}}async function wR(t){let e=ne.join(t,"SKILL.md");try{if((await st.promises.lstat(e)).isSymbolicLink()){let r=await st.promises.readlink(e),s=ne.isAbsolute(r)?r:ne.resolve(ne.dirname(e),r);if(ne.resolve(s)===ne.resolve(e))return!1}return await st.promises.access(e),!0}catch{return!1}}async function SR(t,e,n){let r=ne.join(t,"skills");if(!await(0,Ie.pathExists)(r))return;await st.promises.mkdir(e,{recursive:!0});let s=await st.promises.readdir(r,{withFileTypes:!0});for(let i of s){if(!i.isDirectory())continue;let o=ne.join(e,i.name);await(0,Ie.pathExists)(o)&&await wR(o)||(await(0,Ie.pathExists)(o)&&await st.promises.rm(o,{recursive:!0,force:!0}),await(0,Ie.copyDirRecursive)(ne.join(r,i.name),o),Ft(n,`[AgentIDE] Bootstrapped bundled skill: ${i.name}`))}}async function AR(t,e,n,r,s,i){let o=hR.AGENT_ENGINES[r],a=o?{workspaceDir:o.workspaceDir,rulesFile:o.rulesFile,includeSkills:!0,includeRules:!0}:(()=>{let b=(0,_R.tryResolveCustomEngineManifest)(t,r);if(!b)throw new Error(`Unknown engine: ${r}`);if(b.workspaceSync?.enabled)return{workspaceDir:b.workspaceSync.dir,rulesFile:b.workspaceSync.rulesFile,includeSkills:b.workspaceSync.includeSkills,includeRules:b.workspaceSync.includeRules}})(),c=ne.join(e,"AGENTS.md"),l=ne.join(e,"context.md"),u=ne.join(e,"skills"),f=ne.join(e,"rules");await(0,Ie.ensureWorkspaceGitAndGitignore)(t,s);let d=ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.AGENTS_DIR,n);if(await st.promises.mkdir(d,{recursive:!0}),await(0,Ie.pathExists)(c)){let b=await st.promises.readFile(c,"utf8");await(0,Ie.writeFileIfChanged)(ne.join(d,Ve.AGENT_CONSTANTS.AGENTS_MD),b)}if(await(0,Ie.pathExists)(l)){let b=await st.promises.readFile(l,"utf8");await(0,Ie.writeFileIfChanged)(ne.join(d,Ve.AGENT_CONSTANTS.CONTEXT_MD),b)}let g=ne.join(e,Ve.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,Ie.pathExists)(g)){let b=await st.promises.readFile(g,"utf8");await(0,Ie.writeFileIfChanged)(ne.join(d,Ve.AGENT_CONSTANTS.GHOST_TEXT_FILE),b),Ft(s,`[AgentIDE] Synced GHOST_TEXT.md to ${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}`)}let p=ne.join(d,Ve.AGENT_CONSTANTS.SKILLS_DIR),_=ne.resolve(u),h=ne.resolve(p);await(0,Ie.pathExists)(u)&&(_===h?Ft(s,`[AgentIDE] Skipping skills self-sync (pack already under ${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n})`):(await(0,Ie.syncDirByFileLinks)(u,p,s,`${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n}/skills`),Ft(s,`[AgentIDE] Synced skills to ${Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}: ${p}`))),i&&await SR(i,p,s);let y=ne.join(d,Ve.AGENT_CONSTANTS.RULES_DIR);if(await(0,Ie.pathExists)(f)){await st.promises.mkdir(y,{recursive:!0});let b=await st.promises.readdir(f,{withFileTypes:!0});for(let I of b){if(!I.isFile()||!I.name.toLowerCase().endsWith(".md"))continue;let P=ne.join(f,I.name),L=ne.join(y,I.name);await(0,Ie.symlinkOrCopyFile)(P,L,s,`rules/${I.name}`,{force:!0})}}if(n===Ve.AGENT_CONSTANTS.DEFAULT_AGENT_ID&&i){let b=await(0,mR.getDefaultMcpConfig)(i);if(b){let I=ne.join(d,Ve.AGENT_CONSTANTS.MCP_DIR);await st.promises.mkdir(I,{recursive:!0});let P=ne.join(I,".mcp.json");await(0,Ie.writeFileIfChanged)(P,b),Ft(s,`[AgentIDE] Synced MCP config: ${P}`)}}if(await nE(e,t,n,s),await yR(t,e,n,s),!a)return;let E=ne.join(t,a.workspaceDir);await st.promises.mkdir(E,{recursive:!0});let w="";if(await(0,Ie.pathExists)(c)&&(w=await st.promises.readFile(c,"utf8")),await(0,Ie.pathExists)(l)){let b=await st.promises.readFile(l,"utf8");w=w.trimEnd()+`
88
88
 
89
89
  ---
90
90
 
91
- `+v.trimEnd()+`
92
- `}let A=ne.join(E,a.rulesFile);w&&(await(0,Ie.writeFileIfChanged)(A,w),Ft(s,`[AgentIDE] Synced rules: ${A}`));let S=ne.join(E,"skills");a.includeSkills&&await(0,Ie.pathExists)(g)&&await(0,Ie.syncDirByFileLinks)(g,S,s,`${a.workspaceDir}/skills`);let C=ne.join(E,"rules");if(a.includeRules&&await(0,Ie.pathExists)(d)){await st.promises.mkdir(C,{recursive:!0});let v=await st.promises.readdir(d,{withFileTypes:!0});for(let I of v){if(!I.isFile()||!I.name.toLowerCase().endsWith(".md"))continue;let P=ne.join(d,I.name),L=ne.join(C,I.name);await(0,Ie.symlinkOrCopyFile)(P,L,s,`rules/${I.name}`,{force:!0})}}Ft(s,`[AgentIDE] Pack '${n}' synced to workspace: ${t}`)}function rE(t,e){let n=ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.AGENTS_DIR,e,Ve.AGENT_CONSTANTS.SKILLS_DIR);try{let r=require("fs");if(!r.existsSync(n))return;let s=(0,eE.createHash)("sha256"),i=r.readdirSync(n,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||o.name.startsWith("."))continue;let a=ne.join(n,o.name,"SKILL.md");if(r.existsSync(a)){let c=r.statSync(a);s.update(`${o.name}:${c.mtimeMs}`)}}return s.digest("hex").slice(0,16)}catch{return}}function TR(t){return e=>rE(e,t)}async function bR(t){let e=(0,eE.randomUUID)(),n=ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.SESSIONS_DIR,e);return await st.promises.mkdir(n,{recursive:!0}),e}function vR(t,e){return ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.SESSIONS_DIR,e)}function Ft(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}});var vo=T(Pt=>{"use strict";var OR=Pt&&Pt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),IR=Pt&&Pt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),oE=Pt&&Pt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&OR(n,e,r[s]);return IR(n,e),n}})();Object.defineProperty(Pt,"__esModule",{value:!0});Pt.ObservableStreamEmitter=Pt.SessionEventWriter=Pt.EVIDENCE_REQUIRED_ENV=void 0;Pt.getSessionEventWriterStats=RR;Pt.resetSessionEventWriterStatsForTest=CR;Pt.evidenceRequired=aE;Pt.wrapEmitterWithObservability=kR;var sE=oE(require("path")),iE=require("fs"),PR=ot(),NR=oE(require("os")),tf=So(),Zr={written:0,failed:0};function RR(){return{written:Zr.written,failed:Zr.failed,lastError:Zr.lastError}}function CR(){Zr.written=0,Zr.failed=0,Zr.lastError=void 0}Pt.EVIDENCE_REQUIRED_ENV="AGENTHIPPO_EVIDENCE_REQUIRED";function aE(t=process.env){let e=(t[Pt.EVIDENCE_REQUIRED_ENV]??"").trim().toLowerCase();return e==="1"||e==="true"||e==="yes"||e==="on"}var nf=class{baseDir;ensuredDirs=new Set;written=0;failed=0;lastError;sanitizeSessionId(e){let n=e.trim();return n?n.replace(/[\\/]/g,"_").replace(/\.\./g,"_"):`session-${Date.now()}`}constructor(e){this.baseDir=e??sE.join(NR.homedir(),PR.AGENTIDE_DIR_NAME,"analytics","sessions")}async append(e,n,r,s){try{let i=this.sanitizeSessionId(e);this.ensuredDirs.has(i)||(await iE.promises.mkdir(this.baseDir,{recursive:!0}),this.ensuredDirs.add(i));let o={session_id:e,request_id:n,timestamp:Date.now(),event_type:r,payload:s},a=sE.join(this.baseDir,`${i}.jsonl`),c=JSON.stringify(o)+`
91
+ `+b.trimEnd()+`
92
+ `}let A=ne.join(E,a.rulesFile);w&&(await(0,Ie.writeFileIfChanged)(A,w),Ft(s,`[AgentIDE] Synced rules: ${A}`));let S=ne.join(E,"skills");a.includeSkills&&await(0,Ie.pathExists)(p)&&await(0,Ie.syncDirByFileLinks)(p,S,s,`${a.workspaceDir}/skills`);let C=ne.join(E,"rules");if(a.includeRules&&await(0,Ie.pathExists)(f)){await st.promises.mkdir(C,{recursive:!0});let b=await st.promises.readdir(f,{withFileTypes:!0});for(let I of b){if(!I.isFile()||!I.name.toLowerCase().endsWith(".md"))continue;let P=ne.join(f,I.name),L=ne.join(C,I.name);await(0,Ie.symlinkOrCopyFile)(P,L,s,`rules/${I.name}`,{force:!0})}}Ft(s,`[AgentIDE] Pack '${n}' synced to workspace: ${t}`)}function rE(t,e){let n=ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.AGENTS_DIR,e,Ve.AGENT_CONSTANTS.SKILLS_DIR);try{let r=require("fs");if(!r.existsSync(n))return;let s=(0,eE.createHash)("sha256"),i=r.readdirSync(n,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||o.name.startsWith("."))continue;let a=ne.join(n,o.name,"SKILL.md");if(r.existsSync(a)){let c=r.statSync(a);s.update(`${o.name}:${c.mtimeMs}`)}}return s.digest("hex").slice(0,16)}catch{return}}function TR(t){return e=>rE(e,t)}async function bR(t){let e=(0,eE.randomUUID)(),n=ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.SESSIONS_DIR,e);return await st.promises.mkdir(n,{recursive:!0}),e}function vR(t,e){return ne.join(t,Ve.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Ve.AGENT_CONSTANTS.SESSIONS_DIR,e)}function Ft(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}});var vo=T(Pt=>{"use strict";var OR=Pt&&Pt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),IR=Pt&&Pt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),oE=Pt&&Pt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&OR(n,e,r[s]);return IR(n,e),n}})();Object.defineProperty(Pt,"__esModule",{value:!0});Pt.ObservableStreamEmitter=Pt.SessionEventWriter=Pt.EVIDENCE_REQUIRED_ENV=void 0;Pt.getSessionEventWriterStats=RR;Pt.resetSessionEventWriterStatsForTest=CR;Pt.evidenceRequired=aE;Pt.wrapEmitterWithObservability=kR;var sE=oE(require("path")),iE=require("fs"),PR=ot(),NR=oE(require("os")),tf=So(),Zr={written:0,failed:0};function RR(){return{written:Zr.written,failed:Zr.failed,lastError:Zr.lastError}}function CR(){Zr.written=0,Zr.failed=0,Zr.lastError=void 0}Pt.EVIDENCE_REQUIRED_ENV="AGENTHIPPO_EVIDENCE_REQUIRED";function aE(t=process.env){let e=(t[Pt.EVIDENCE_REQUIRED_ENV]??"").trim().toLowerCase();return e==="1"||e==="true"||e==="yes"||e==="on"}var nf=class{baseDir;ensuredDirs=new Set;written=0;failed=0;lastError;sanitizeSessionId(e){let n=e.trim();return n?n.replace(/[\\/]/g,"_").replace(/\.\./g,"_"):`session-${Date.now()}`}constructor(e){this.baseDir=e??sE.join(NR.homedir(),PR.AGENTIDE_DIR_NAME,"analytics","sessions")}async append(e,n,r,s){try{let i=this.sanitizeSessionId(e);this.ensuredDirs.has(i)||(await iE.promises.mkdir(this.baseDir,{recursive:!0}),this.ensuredDirs.add(i));let o={session_id:e,request_id:n,timestamp:Date.now(),event_type:r,payload:s},a=sE.join(this.baseDir,`${i}.jsonl`),c=JSON.stringify(o)+`
93
93
  `;await iE.promises.appendFile(a,c),this.written++,Zr.written++}catch(i){let o=i instanceof Error?i.message:String(i);this.failed++,Zr.failed++;let a={at:Date.now(),message:o,eventType:r};if(this.lastError=a,Zr.lastError=a,console.error(`[evidence] LOST session event ${r} (session=${e} request=${n}): ${o} \u2014 ${Zr.failed} evidence write(s) lost since start`),aE())throw new Error(`evidence write failed for ${r}: ${o}`)}}getStats(){return{written:this.written,failed:this.failed,lastError:this.lastError}}getSessionsDir(){return this.baseDir}};Pt.SessionEventWriter=nf;var fl=class{inner;writer;sessionId;requestId;stamp;missingCallIdCounter=0;pendingSyntheticCallIds=new Map;actorId;constructor(e,n,r,s,i,o){this.inner=e,this.writer=n,this.sessionId=r,this.requestId=s,this.stamp=o,this.actorId=(0,tf.hashIdentity)(i)}makeCallIdKey(e){return`${this.sessionId}:${this.requestId}:${e}`}enqueueSyntheticCallId(e){let n=this.makeCallIdKey(e),r=`synthetic-${e}-${++this.missingCallIdCounter}`,s=this.pendingSyntheticCallIds.get(n)??[];return s.push(r),this.pendingSyntheticCallIds.set(n,s),r}dequeueSyntheticCallId(e){let n=this.makeCallIdKey(e),r=this.pendingSyntheticCallIds.get(n);if(!r||r.length===0)return;let s=r.shift();return r.length===0?this.pendingSyntheticCallIds.delete(n):this.pendingSyntheticCallIds.set(n,r),s}async thinking(e){return this.inner.thinking(e)}async text(e){return this.inner.text(e)}async toolStart(e,n,r,s){let i=r?.trim()?r:this.enqueueSyntheticCallId(e);return await this.writer.append(this.sessionId,this.requestId,"tool_start",{toolName:e,callId:i,...(0,tf.describeContent)("input",n),userId:this.actorId}),this.inner.toolStart(e,n,r,s)}async toolEnd(e,n,r,s,i){let o=n?.trim()?n:this.dequeueSyntheticCallId(e)??"";return await this.writer.append(this.sessionId,this.requestId,"tool_end",{toolName:e,callId:o,isError:s??!1,...(0,tf.describeContent)("result",r),userId:this.actorId}),this.inner.toolEnd(e,n,r,s,i)}async progress(e){return this.inner.progress(e)}async question(e){return this.inner.question(e)}async error(e){return await this.writer.append(this.sessionId,this.requestId,"error",{message:e,userId:this.actorId}),this.inner.error(e)}async done(){return this.inner.done()}async emitTurnStart(){await this.writer.append(this.sessionId,this.requestId,"turn_start",{userId:this.actorId,...this.stamp})}async emitTurnEnd(e){await this.writer.append(this.sessionId,this.requestId,"turn_end",{success:e,userId:this.actorId})}};Pt.ObservableStreamEmitter=fl;function kR(t,e,n,r,s,i){return new fl(t,e,n,r,s,i)}});var pl=T(Gi=>{"use strict";Object.defineProperty(Gi,"__esModule",{value:!0});Gi.encodeRunnerEvent=$R;Gi.encodeWorkerRequest=DR;Gi.parseWorkerOutbound=LR;Gi.applyRunnerEvent=MR;Gi.applyParsedRunnerEvent=cE;function $R(t){return`${JSON.stringify(t)}
94
94
  `}function DR(t){return`${JSON.stringify(t)}
95
95
  `}function LR(t){let e;try{e=JSON.parse(t)}catch{return}if(!e||typeof e!="object")return;let n=e;if(n.type==="ready")return{type:"ready"};if(n.type==="result"&&typeof n.id=="string")return{type:"result",id:n.id,nativeSessionId:typeof n.nativeSessionId=="string"?n.nativeSessionId:void 0};if(n.type==="failed"&&typeof n.id=="string")return{type:"failed",id:n.id,message:typeof n.message=="string"?n.message:"Custom engine turn failed"};if(typeof n.id=="string"&&n.event&&typeof n.event=="object")return{id:n.id,event:n.event}}async function MR(t,e){let n;try{n=JSON.parse(e)}catch{return}return cE(t,n)}async function cE(t,e){switch(e.type){case"text":await t.text(e.delta);break;case"thinking":await t.thinking(e.delta);break;case"toolStart":await t.toolStart(e.toolName,e.input,e.toolCallId);break;case"toolEnd":await t.toolEnd(e.toolName,e.toolCallId,e.result,e.isError);break;case"progress":await t.progress(e.message);break;case"error":await t.error(e.message);break;case"done":await t.done();break;case"nativeSessionId":return e.nativeSessionId;case"probe":if(!e.ok)throw new Error(e.message??"Custom engine import probe failed");break;default:break}}});var lE=T(gl=>{"use strict";Object.defineProperty(gl,"__esModule",{value:!0});gl.PersistentEngineWorkerPool=void 0;var GR=require("node:child_process"),UR=require("node:readline"),rf=pl(),HR=Li(),jR=1e3*60,xR=1e3*30,BR=1e3*10,sf=class{opts;child;readyPromise;readyResolve;readyReject;pending=new Map;lineChains=new Map;seq=0;stderr="";retired=!1;retireTimer;readyTimer;lastUsedAt=Date.now();constructor(e){this.opts=e}isUsable(){return!this.retired&&this.child!==void 0&&this.child.exitCode===null&&!this.child.killed}ensureStarted(){if(this.readyPromise)return this.readyPromise;this.readyPromise=new Promise((s,i)=>{this.readyResolve=s,this.readyReject=i});let e=(0,GR.spawn)(this.opts.nodeBin,[this.opts.runnerPath],{cwd:this.opts.cwd,env:this.opts.spawnEnv,stdio:["pipe","pipe","pipe"]});this.child=e,this.opts.logger.info(`[AgentIDE] Persistent engine worker started (${this.opts.label}, pid=${e.pid})`);let n=this.opts.startupTimeoutMs??xR;this.readyTimer=setTimeout(()=>{this.opts.logger.warn(`[AgentIDE] Persistent engine worker (${this.opts.label}) did not signal ready within ${n}ms; terminating`),this.handleExit(`worker did not become ready within ${n}ms`)},n),this.readyTimer.unref?.();let r=(0,UR.createInterface)({input:e.stdout});return r.on("line",s=>this.routeLine(s)),e.stderr?.on("data",s=>{this.stderr+=String(s),this.stderr.length>16384&&(this.stderr=this.stderr.slice(-16384))}),e.on("error",s=>this.handleExit(s.message)),e.on("close",s=>{r.close(),this.handleExit(this.stderr.trim()||`worker exited with code ${s}`)}),this.readyPromise}routeLine(e){let n=(0,rf.parseWorkerOutbound)(e);if(!n)return;if("type"in n&&n.type==="ready"){this.markReady();return}let r="id"in n?n.id:void 0;if(r===void 0)return;let i=(this.lineChains.get(r)??Promise.resolve()).then(()=>this.handleMessage(n)).catch(()=>{});this.lineChains.set(r,i),i.then(()=>{this.lineChains.get(r)===i&&this.lineChains.delete(r)})}async handleMessage(e){if("type"in e){if(e.type==="ready")return;let r=this.pending.get(e.id);if(!r)return;e.type==="result"?(this.finishRun(e.id,r),r.resolve({nativeSessionId:e.nativeSessionId})):(this.finishRun(e.id,r),r.reject(new Error(e.message)),r.aborted||this.retire("turn error"));return}let n=this.pending.get(e.id);n&&await(0,rf.applyParsedRunnerEvent)(n.emitter,e.event)}markReady(){this.readyTimer&&(clearTimeout(this.readyTimer),this.readyTimer=void 0),this.readyResolve?.()}cleanupRun(e){e.abortTimer&&(clearTimeout(e.abortTimer),e.abortTimer=void 0),e.signal&&e.onAbort&&(e.signal.removeEventListener("abort",e.onAbort),e.onAbort=void 0)}finishRun(e,n){this.cleanupRun(n),this.pending.delete(e),this.retired&&this.pending.size===0&&this.kill()}handleExit(e){this.retireTimer&&(clearTimeout(this.retireTimer),this.retireTimer=void 0),this.readyTimer&&(clearTimeout(this.readyTimer),this.readyTimer=void 0);let n=this.child;if(this.child=void 0,this.retired=!0,n&&n.exitCode===null&&!n.killed)try{n.kill("SIGKILL")}catch{}this.readyReject?.(new Error(`Persistent engine worker failed to start (${this.opts.label}): ${e}`));let r=[...this.pending.entries()];this.pending.clear();for(let[,s]of r)this.cleanupRun(s),s.reject(new Error(`Custom engine worker exited (${this.opts.label}): ${e}`))}retire(e){this.retired||(this.retired=!0,this.opts.logger.info(`[AgentIDE] Retiring persistent engine worker (${this.opts.label}): ${e}`),this.pending.size===0?this.kill():(this.retireTimer=setTimeout(()=>this.kill(),jR),this.retireTimer.unref?.()))}kill(){this.retireTimer&&(clearTimeout(this.retireTimer),this.retireTimer=void 0),this.readyTimer&&(clearTimeout(this.readyTimer),this.readyTimer=void 0);let e=this.child;this.child=void 0,this.retired=!0,!(!e||e.exitCode!==null||e.killed)&&e.kill("SIGTERM")}send(e){this.child?.stdin?.write((0,rf.encodeWorkerRequest)(e))}async run(e,n,r){await this.ensureStarted(),this.lastUsedAt=Date.now();let s=String(++this.seq);return new Promise((i,o)=>{let a={emitter:n,resolve:i,reject:o,aborted:!1,signal:r},c=()=>{a.aborted=!0,this.send({type:"abort",id:s}),a.abortTimer=setTimeout(()=>{let l=this.pending.get(s);l&&(this.finishRun(s,l),l.reject(new Error("Custom engine turn aborted")))},this.opts.abortSettleTimeoutMs??BR),a.abortTimer.unref?.()};r&&(a.onAbort=c,r.aborted?c():r.addEventListener("abort",c,{once:!0})),this.pending.set(s,a),this.send({type:"run",id:s,env:e})})}isIdle(e){return this.pending.size===0&&e-this.lastUsedAt>(this.opts.idleTtlMs??(0,HR.engineIdleTtlMs)())}},of=class{workers=new Map;async run(e,n,r,s){let i=this.workers.get(e.cacheKey);(!i||!i.isUsable())&&(i?.retire("stale or dead"),i=new sf(e),this.workers.set(e.cacheKey,i));try{return await i.run(n,r,s)}catch(o){throw this.workers.get(e.cacheKey)===i&&!i.isUsable()&&this.workers.delete(e.cacheKey),o}}onMaintenance(){let e=Date.now();for(let[n,r]of this.workers.entries())r.isIdle(e)&&(r.kill(),this.workers.delete(n))}disposeAll(){for(let e of this.workers.values())e.kill();this.workers.clear()}_workerCountForTest(){return this.workers.size}};gl.PersistentEngineWorkerPool=of});var uE=T(Oo=>{"use strict";Object.defineProperty(Oo,"__esModule",{value:!0});Oo.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=Oo.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH=void 0;Oo.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH="f3ac3ed081de8e36";Oo.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=`"use strict";
@@ -429,14 +429,14 @@ else {
429
429
  process.exit(1);
430
430
  });
431
431
  }
432
- `});var af=T(Qt=>{"use strict";var FR=Qt&&Qt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),VR=Qt&&Qt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),KR=Qt&&Qt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&FR(n,e,r[s]);return VR(n,e),n}})();Object.defineProperty(Qt,"__esModule",{value:!0});Qt.NODE_RUNNER_FILENAME=void 0;Qt.ensureNodeRunnerScriptPath=YR;Qt.embeddedRunnerContentHash=JR;var WR=require("node:crypto"),Io=require("node:fs"),ei=KR(require("node:path")),qR=bi();Qt.NODE_RUNNER_FILENAME="run-custom-engine-runner.js";async function dE(){return Promise.resolve().then(()=>$n(uE()))}async function YR(){let t=[],e=process.argv[1];e&&t.push(ei.join(ei.dirname(e),Qt.NODE_RUNNER_FILENAME)),t.push(ei.join(ei.dirname(process.execPath),Qt.NODE_RUNNER_FILENAME));for(let o of t)try{return await Io.promises.access(o),o}catch{}let{EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH:n,EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:r}=await dE(),s=ei.join((0,qR.getAgentideHome)(),"cache","cli"),i=ei.join(s,`${Qt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-${n}.js`);try{if(await Io.promises.readFile(i,"utf8")===r)return i}catch{}await Io.promises.mkdir(s,{recursive:!0}),await Io.promises.writeFile(i,r,"utf8");try{let o=`${Qt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-`;for(let a of await Io.promises.readdir(s))a.startsWith(o)&&a.endsWith(".js")&&ei.join(s,a)!==i&&await Io.promises.unlink(ei.join(s,a)).catch(()=>{})}catch{}return i}async function JR(){let{EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:t}=await dE();return(0,WR.createHash)("sha256").update(t).digest("hex")}});var df=T(Pn=>{"use strict";var XR=Pn&&Pn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),zR=Pn&&Pn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),QR=Pn&&Pn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&XR(n,e,r[s]);return zR(n,e),n}})();Object.defineProperty(Pn,"__esModule",{value:!0});Pn.CustomEngine=void 0;Pn.resolveCustomEngineLoadStrategy=fE;Pn.deliverModelRoutingEnv=pE;Pn.buildRunnerChildEnv=uf;Pn.probeCustomEngineImport=uC;var ZR=require("node:child_process"),eC=require("node:readline"),Ia=require("fs"),$t=QR(require("path")),tC=require("url"),Oa=Ii(),nC=Cr(),rC=Qs(),Os=er(),sC=As(),hl=dn(),ml=sl(),iC=pl(),oC=lE(),aC=Li(),cf=Oi(),_l=_a();function fE(){let t=process.env.AGENTHIPPO_CUSTOM_ENGINE_LOAD?.trim().toLowerCase();return t==="a"||t==="in-process"||t==="inprocess"?"in-process":t==="c"||t==="node-subprocess"||t==="node"||t==="b"||t==="bun-subprocess"||t==="bun"?"node-subprocess":"persistent-worker"}function cC(t){let e=t.engineId?.trim();if(e&&e!=="claude"&&e!=="codex")return e}function lC(t){return t.configProvider?.get("agentide","additionalEngineDir")}function El(t,e){let n=$t.join(e,"node_modules"),r=t.NODE_PATH?.trim();t.NODE_PATH=r?`${n}${$t.delimiter}${r}`:n}function pE(t,e,n,r,s){let i=(o,a,c)=>{if(!(!o||!a)){if(r[o]?.trim()){s?.info(`[AgentIDE] Custom engine "${e.id}": ${o} already set in ambient env \u2014 keeping the operator's value, skipping per-turn ${c} delivery`);return}t[o]=a}};i(e.model?.apiKeyEnvVar,n.apiKey,"API key"),i(e.model?.baseUrlEnvVar,n.baseUrl,"base URL"),i(e.model?.openaiBaseUrlEnvVar,n.openaiBaseUrl,"OpenAI base URL")}function uf(t,e,n){let r={...process.env,...e.env,AGENTHIPPO_ENGINE_ENTRY:t.entryPath,AGENTHIPPO_MESSAGE:e.message,AGENTHIPPO_WORKSPACE_ROOT:e.workspaceRoot,AGENTHIPPO_MODEL_ID:e.modelId,AGENTHIPPO_CONVERSATION_KEY:e.session.key,AGENTHIPPO_IS_EPHEMERAL:e.session.isEphemeral?"true":"false"};e.permissions&&(r.AGENTHIPPO_PERMISSIONS=JSON.stringify(e.permissions)),e.agent?.rulesFilePath&&(r.AGENTHIPPO_RULES_FILE_PATH=e.agent.rulesFilePath),e.agent?.skillsDir&&(r.AGENTHIPPO_SKILLS_DIR=e.agent.skillsDir),e.agent?.rulesDir&&(r.AGENTHIPPO_RULES_DIR=e.agent.rulesDir),n&&(r.AGENTHIPPO_CUSTOM_ENGINE_PROBE="import"),e.session.nativeSessionId?.trim()&&(r.AGENTHIPPO_NATIVE_SESSION_ID=e.session.nativeSessionId.trim()),t.engineExport&&(r.AGENTHIPPO_ENGINE_EXPORT=t.engineExport);let s=e.mcpServers?(0,_l.serializeInlineMcpServers)(e.mcpServers):void 0;return s&&(r[_l.AGENTHIPPO_MCP_SERVERS_ENV]=s),El(r,t.manifestDir),r}async function gE(t,e,n,r,s){let i;try{let{ensureNodeRunnerScriptPath:c}=await Promise.resolve().then(()=>$n(af()));i=await c()}catch(c){throw new Error(`Custom engine Node runner not available: ${c instanceof Error?c.message:String(c)}. Rebuild the agenthippo CLI.`)}let o=await(0,ml.resolveNodeBinary)();e.runtime.logger.info(`[AgentIDE] Custom engine Node runner: ${o}`);let a=uf(t,e,r);return process.platform==="win32"&&o===process.execPath&&!o.toLowerCase().endsWith("\\node.exe")&&(a.ELECTRON_RUN_AS_NODE="1"),(0,ml.prependPathDir)(a,$t.dirname(o)),new Promise((c,l)=>{let u=(0,ZR.spawn)(o,[i],{cwd:t.manifestDir,env:a,stdio:["ignore","pipe","pipe"]}),d="",f,p=Promise.resolve(),g=(0,eC.createInterface)({input:u.stdout});g.on("line",h=>{p=p.then(async()=>{let y=await(0,iC.applyRunnerEvent)(n,h);y&&(f=y)}).catch(y=>{g.close(),u.kill(),l(y)})}),u.stderr?.on("data",h=>{d+=String(h)});let _=()=>{u.kill("SIGTERM")};s?.addEventListener("abort",_,{once:!0}),u.on("error",l),u.on("close",h=>{s?.removeEventListener("abort",_),g.close(),p.finally(()=>{if(h===0)c(f?{nativeSessionId:f}:void 0);else{let y=d.trim()||`Custom engine Node runner exited with code ${h}`;l(new Error(y))}})})})}async function uC(t,e){try{if(e==="in-process")return await hE(t),{strategy:e,ok:!0};let n={text:async()=>{},thinking:async()=>{},toolStart:async()=>{},toolEnd:async()=>{},progress:async()=>{},question:async()=>({selected:[],freeText:null}),error:async()=>{},done:async()=>{}},r={message:"",modelId:t.model?.defaultModel??"auto",workspaceRoot:t.searchRoot,additionalDirectories:[],permissions:{fileAccess:"full"},env:{...process.env},routing:{useLiteLLM:!1},session:{key:"probe",chatSessionId:"probe",contextSessionId:"probe",isEphemeral:!0,engineHomeDir:t.manifestDir,engineSessionDir:t.manifestDir},agent:{id:"probe"},emitter:n,runtime:{logger:{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}};return await gE(t,r,n,!0),{strategy:e,ok:!0}}catch(n){return{strategy:e,ok:!1,error:n instanceof Error?n.message:String(n)}}}async function hE(t){let{entryPath:e,id:n,engineExport:r}=t;try{await Ia.promises.access(e)}catch{throw new Error(`Custom engine "${n}" entry not found: ${e}`)}let s=process.cwd(),i=process.env.NODE_PATH;try{process.chdir(t.manifestDir),El(process.env,t.manifestDir);let o=await Ia.promises.stat(e).catch(()=>{}),a=`${(0,tC.pathToFileURL)(e).href}?mtime=${o?.mtimeMs??Date.now()}`,c=await new Function("u","return import(u)")(a),l=(r?c[r]??c.default?.[r]:void 0)??c.default;if(!l){let d=r?`"${r}"`:"default export";throw new Error(`Custom engine "${n}": ${d} not found in ${e}. Export a class or object with a run(turn) method.`)}let u=typeof l=="function"?new l:l;return dC(n,u),u}finally{process.chdir(s),i===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=i}}function dC(t,e){if(typeof e!="object"||e===null||typeof e.run!="function")throw new Error(`Custom engine "${t}" export must be a class or object with a run(turn) method.`)}function fC(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160)||"session"}function pC(t){let e=[];t.session.contextFilePath&&e.push(`context_file: ${$t.relative(t.workspaceRoot,t.session.contextFilePath)}`),t.session.terminalLogPath&&e.push(`terminal_log: ${$t.relative(t.workspaceRoot,t.session.terminalLogPath)}`),t.session.attachmentsDir&&e.push(`attachments_dir: ${$t.relative(t.workspaceRoot,t.session.attachmentsDir)}`);let n=t.env.AGENTHIPPO_GATEWAY_OUTBOUND_FILE?.trim();n&&e.push(`gateway_outbound_file: ${n}`);let r=t.env.AGENTHIPPO_ACTIVE_AGENT?.trim();return r&&e.push(`active_agent: ${r}`),e.length===0?"":["<agenthippo_runtime_context>",...e,"</agenthippo_runtime_context>"].join(`
433
- `)}var gC=5e3,lf=class{config;getBundledBasePromptsDir;id="custom";displayName="Custom Engine";instances=new Map;activeSessions=new Map;mtimeCache=new Map;workerPool=new oC.PersistentEngineWorkerPool;constructor(e,n=()=>{}){this.config=e,this.getBundledBasePromptsDir=n}async getCachedMtime(e){let n=Date.now(),r=this.mtimeCache.get(e);if(r&&n-r.fetchedAt<gC)return r.mtime;let s=(await Ia.promises.stat(e).catch(()=>{}))?.mtimeMs??0;return this.mtimeCache.set(e,{mtime:s,fetchedAt:n}),s}async buildCacheKey(e){let[n,r]=await Promise.all([this.getCachedMtime(e.manifestPath),this.getCachedMtime(e.entryPath)]);return[e.id,e.manifestPath,n,e.entryPath,r].join("\0")}async stream(e,n,r,s,i){let o=cC(n),a=(0,rC.resolveCustomEngineManifest)(n.workspaceRoot,o,lC(s),(u,d)=>s.logger.warn(`[AgentIDE] Skipping malformed custom engine manifest ${u}: ${d instanceof Error?d.message:String(d)}`)),c=`custom:${a.id}`,l=(0,cf.buildConversationKey)(c,n);await(0,cf.withConversationLock)(l.key,async()=>{let u=fE(),d=await this.buildTurn(a,e,n,r,s,l.key,l.chatSessionId,l.isEphemeral,i);s.logger.info(`[AgentIDE] Custom engine "${a.id}" strategy=${u} entry=${a.entryPath}`);let f;if(u==="in-process"){let{engine:_}=await this.getOrLoadInstance(a,s),h=process.cwd(),y=process.env.NODE_PATH;try{process.chdir(a.manifestDir),El(process.env,a.manifestDir),f=await _.run(d)}finally{process.chdir(h),y===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=y}}else u==="persistent-worker"?f=await this.runViaPersistentWorker(a,d,r,i):f=await gE(a,d,r,!1,i);let p=f?.nativeSessionId?.trim(),g=p||d.session.nativeSessionId;this.activeSessions.set(l.key,{nativeSessionId:g,lastUsedAt:Date.now()}),p?await(0,Oa.persistSessionIfNeeded)(c,l,p,n):(0,Oa.touchSessionIfNeeded)(l)},{signal:i,timeoutMs:cf.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:`custom.${a.id}.run`})}async getOrLoadInstance(e,n){let r=await this.buildCacheKey(e),s=this.instances.get(r);if(s)return s;for(let[a,c]of this.instances.entries())if(c.manifest.id===e.id){try{c.engine.dispose?.()}catch{}this.instances.delete(a)}n.logger.info(`[AgentIDE] Loading custom engine "${e.id}" from ${e.entryPath}`);let o={engine:await hE(e),manifest:e,cacheKey:r};return this.instances.set(r,o),o}async runViaPersistentWorker(e,n,r,s){let{ensureNodeRunnerScriptPath:i}=await Promise.resolve().then(()=>$n(af())),o=await i(),a=await(0,ml.resolveNodeBinary)();n.runtime.logger.info(`[AgentIDE] Custom engine persistent worker: ${a}`);let c=uf(e,n,!1),l={...c,AGENTHIPPO_RUNNER_MODE:"persistent"};process.platform==="win32"&&a===process.execPath&&!a.toLowerCase().endsWith("\\node.exe")&&(l.ELECTRON_RUN_AS_NODE="1"),(0,ml.prependPathDir)(l,$t.dirname(a));let u=await this.buildCacheKey(e);return this.workerPool.run({cacheKey:u,runnerPath:o,nodeBin:a,cwd:e.manifestDir,spawnEnv:l,logger:n.runtime.logger,label:`custom.${e.id}`},c,r,s)}clearInstances(e){for(let[n,{engine:r,manifest:s}]of this.instances.entries())if(!(e&&s.id!==e)){try{r.dispose?.()}catch{}this.instances.delete(n)}}async buildTurn(e,n,r,s,i,o,a,c,l){let u=r.modelId?.trim()||e.model?.defaultModel?.trim();if(!u)throw new Error(`Custom engine "${e.id}" requires a model selection. Add a "model.defaultModel" to the engine manifest or select a model explicitly.`);let d=r.agentPackId??Os.AGENT_CONSTANTS.DEFAULT_AGENT_ID,f=r.contextSessionId?.trim()||r.sessionId?.trim()||a,p=fC(f),g=this.config.customEnginesStoragePath??$t.join(this.config.storagePath,Os.AGENT_CONSTANTS.AGENTS_DIR,d,"custom"),_=$t.join(g,e.id),h=(0,Os.userScopedEngineHomeFromKey)($t.join(_,"home"),(0,sC.resolveEngineHomeUserKey)(r.engineHomeUserKey)),y=$t.join(_,Os.AGENT_CONSTANTS.SESSIONS_DIR,p);await Ia.promises.mkdir(h,{recursive:!0}),await Ia.promises.mkdir(y,{recursive:!0});let E=$t.join(r.workspaceRoot,Os.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Os.AGENT_CONSTANTS.SESSIONS_DIR,f),w=$t.join(E,Os.AGENT_CONSTANTS.CONTEXT_MD),A=$t.join(E,"terminal.md"),S=$t.join(E,"attachments"),C=this.activeSessions.get(o)?.nativeSessionId??(0,Oa.getPersistedSessionId)(`custom:${e.id}`,o),v=(0,hl.resolveApiRouting)(r,this.config,(0,hl.inferModelProvider)(r.modelId),i.configProvider),I=v.apiKey?.trim()||void 0,P=v.baseUrl?.trim()||void 0,L=v.openaiBaseUrl?.trim()||void 0,N=e.workspaceSync?.enabled?$t.join(r.workspaceRoot,e.workspaceSync.dir,e.workspaceSync.rulesFile):void 0,O=e.workspaceSync?.enabled&&e.workspaceSync.includeSkills?$t.join(r.workspaceRoot,e.workspaceSync.dir,Os.AGENT_CONSTANTS.SKILLS_DIR):void 0,G=e.workspaceSync?.enabled&&e.workspaceSync.includeRules?$t.join(r.workspaceRoot,e.workspaceSync.dir,Os.AGENT_CONSTANTS.RULES_DIR):void 0,H={...process.env,...i.cliEnvPatch??{},AGENTHIPPO_ENGINE_ID:e.id,AGENTHIPPO_ENGINE_HOME:h,AGENTHIPPO_ENGINE_SESSION_DIR:y,AGENTHIPPO_CONTEXT_SESSION_ID:f,AGENTHIPPO_CONTEXT_EXPORT_PATH:w,AGENTHIPPO_TERMINAL_LOG_PATH:A,AGENTHIPPO_ATTACHMENTS_DIR:S,AGENTHIPPO_ACTIVE_AGENT:d,AGENT_ID:d,AGENTHIPPO_MODEL_ID:u,AGENTHIPPO_USE_LITELLM:v.useLiteLLM?"true":"false"};if(delete H[nC.OPENCLAW_GATEWAY_TOKEN_ENV],delete H.AGENTHIPPO_DATA_PLANE_TOKEN,El(H,e.manifestDir),I&&(H.AGENTHIPPO_API_KEY=I),P&&(H.AGENTHIPPO_BASE_URL=P),L&&(H.AGENTHIPPO_OPENAI_BASE_URL=L),v.useLiteLLM){H.AGENTHIPPO_LITELLM_API_KEY=I??"sk-dummy",H.AGENTIDE_LITELLM_API_KEY=I??"sk-dummy",P&&(H.AGENTHIPPO_LITELLM_BASE_URL=P,H.AGENTIDE_LITELLM_BASE_URL=P);let pe=(0,Oa.buildLiteLLMMetadataHeaders)(!0,{sessionId:r.sessionId,analyticsUserId:r.analyticsUserId,analyticsProjectId:(0,Oa.resolveAnalyticsProjectId)(r.analyticsProjectId,r.workspaceRoot),agentId:d,agentVersion:r.agentPackVersion??"workspace",source:"agenthippo",engine:`custom:${e.id}`,requestId:r.requestId,policyVersion:r.policyVersion,packDigest:r.packDigest,instanceId:r.instanceId,engineVersion:r.engineVersion,tier:r.tier});pe.length>0&&(H.AGENTHIPPO_LITELLM_METADATA_HEADERS=pe.join(`
434
- `))}r.agentPackVersion&&(H.AGENTHIPPO_AGENT_VERSION=r.agentPackVersion,H.AGENTIDE_AGENT_VERSION=r.agentPackVersion),e.homeEnvVar&&(H[e.homeEnvVar]=h),pE(H,e,{apiKey:I,baseUrl:P,openaiBaseUrl:L},process.env,i.logger),(P&&(0,hl.applyLocalTlsBypass)(H,P)||L&&L!==P&&(0,hl.applyLocalTlsBypass)(H,L))&&i.logger.info(`[AgentIDE] Disabling TLS verification for local HTTPS (${e.id})`);let X=v.useLiteLLM?"LiteLLM proxy":P?"custom provider":"native provider";i.logger.info(`[AgentIDE] Custom engine "${e.id}" routing: ${X}, baseUrl=${P||"default"}, model=${u}`);let J=await(0,_l.loadMcpServers)(d,r.workspaceRoot,this.getBundledBasePromptsDir()),W=(0,_l.formatInlineMcpServers)(J,H);J.length>0&&i.logger.debug(`[AgentIDE] Custom engine "${e.id}" MCP (${d}): ${J.map(pe=>pe.name).join(", ")}`);let ee=n,le={message:ee,modelId:u,workspaceRoot:r.workspaceRoot,additionalDirectories:r.additionalDirectories??[],permissions:r.permissions??{fileAccess:"workspace-write"},env:H,routing:{useLiteLLM:v.useLiteLLM,...I?{apiKey:I}:{},...P?{baseUrl:P}:{},...L?{openaiBaseUrl:L}:{}},session:{key:o,chatSessionId:a,contextSessionId:f,isEphemeral:c,engineHomeDir:h,engineSessionDir:y,nativeSessionId:C,contextFilePath:w,terminalLogPath:A,attachmentsDir:S},agent:{id:d,version:r.agentPackVersion,rulesFilePath:N,skillsDir:O,rulesDir:G},...Object.keys(W).length>0?{mcpServers:W}:{},emitter:s,runtime:{...i,invalidateEngineInstance:()=>this.clearInstances(e.id)},signal:l};if(e.promptInjection.mode==="message-suffix"){let pe=pC(le);pe&&(ee=`${n}
432
+ `});var af=T(Qt=>{"use strict";var FR=Qt&&Qt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),VR=Qt&&Qt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),KR=Qt&&Qt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&FR(n,e,r[s]);return VR(n,e),n}})();Object.defineProperty(Qt,"__esModule",{value:!0});Qt.NODE_RUNNER_FILENAME=void 0;Qt.ensureNodeRunnerScriptPath=YR;Qt.embeddedRunnerContentHash=JR;var WR=require("node:crypto"),Io=require("node:fs"),ei=KR(require("node:path")),qR=bi();Qt.NODE_RUNNER_FILENAME="run-custom-engine-runner.js";async function dE(){return Promise.resolve().then(()=>$n(uE()))}async function YR(){let t=[],e=process.argv[1];e&&t.push(ei.join(ei.dirname(e),Qt.NODE_RUNNER_FILENAME)),t.push(ei.join(ei.dirname(process.execPath),Qt.NODE_RUNNER_FILENAME));for(let o of t)try{return await Io.promises.access(o),o}catch{}let{EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH:n,EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:r}=await dE(),s=ei.join((0,qR.getAgentideHome)(),"cache","cli"),i=ei.join(s,`${Qt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-${n}.js`);try{if(await Io.promises.readFile(i,"utf8")===r)return i}catch{}await Io.promises.mkdir(s,{recursive:!0}),await Io.promises.writeFile(i,r,"utf8");try{let o=`${Qt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-`;for(let a of await Io.promises.readdir(s))a.startsWith(o)&&a.endsWith(".js")&&ei.join(s,a)!==i&&await Io.promises.unlink(ei.join(s,a)).catch(()=>{})}catch{}return i}async function JR(){let{EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:t}=await dE();return(0,WR.createHash)("sha256").update(t).digest("hex")}});var df=T(Pn=>{"use strict";var XR=Pn&&Pn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),zR=Pn&&Pn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),QR=Pn&&Pn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&XR(n,e,r[s]);return zR(n,e),n}})();Object.defineProperty(Pn,"__esModule",{value:!0});Pn.CustomEngine=void 0;Pn.resolveCustomEngineLoadStrategy=fE;Pn.deliverModelRoutingEnv=pE;Pn.buildRunnerChildEnv=uf;Pn.probeCustomEngineImport=uC;var ZR=require("node:child_process"),eC=require("node:readline"),Ia=require("fs"),$t=QR(require("path")),tC=require("url"),Oa=Ii(),nC=Cr(),rC=Qs(),Os=er(),sC=As(),hl=dn(),ml=sl(),iC=pl(),oC=lE(),aC=Li(),cf=Oi(),_l=_a();function fE(){let t=process.env.AGENTHIPPO_CUSTOM_ENGINE_LOAD?.trim().toLowerCase();return t==="a"||t==="in-process"||t==="inprocess"?"in-process":t==="c"||t==="node-subprocess"||t==="node"||t==="b"||t==="bun-subprocess"||t==="bun"?"node-subprocess":"persistent-worker"}function cC(t){let e=t.engineId?.trim();if(e&&e!=="claude"&&e!=="codex")return e}function lC(t){return t.configProvider?.get("agentide","additionalEngineDir")}function El(t,e){let n=$t.join(e,"node_modules"),r=t.NODE_PATH?.trim();t.NODE_PATH=r?`${n}${$t.delimiter}${r}`:n}function pE(t,e,n,r,s){let i=(o,a,c)=>{if(!(!o||!a)){if(r[o]?.trim()){s?.info(`[AgentIDE] Custom engine "${e.id}": ${o} already set in ambient env \u2014 keeping the operator's value, skipping per-turn ${c} delivery`);return}t[o]=a}};i(e.model?.apiKeyEnvVar,n.apiKey,"API key"),i(e.model?.baseUrlEnvVar,n.baseUrl,"base URL"),i(e.model?.openaiBaseUrlEnvVar,n.openaiBaseUrl,"OpenAI base URL")}function uf(t,e,n){let r={...process.env,...e.env,AGENTHIPPO_ENGINE_ENTRY:t.entryPath,AGENTHIPPO_MESSAGE:e.message,AGENTHIPPO_WORKSPACE_ROOT:e.workspaceRoot,AGENTHIPPO_MODEL_ID:e.modelId,AGENTHIPPO_CONVERSATION_KEY:e.session.key,AGENTHIPPO_IS_EPHEMERAL:e.session.isEphemeral?"true":"false"};e.permissions&&(r.AGENTHIPPO_PERMISSIONS=JSON.stringify(e.permissions)),e.agent?.rulesFilePath&&(r.AGENTHIPPO_RULES_FILE_PATH=e.agent.rulesFilePath),e.agent?.skillsDir&&(r.AGENTHIPPO_SKILLS_DIR=e.agent.skillsDir),e.agent?.rulesDir&&(r.AGENTHIPPO_RULES_DIR=e.agent.rulesDir),n&&(r.AGENTHIPPO_CUSTOM_ENGINE_PROBE="import"),e.session.nativeSessionId?.trim()&&(r.AGENTHIPPO_NATIVE_SESSION_ID=e.session.nativeSessionId.trim()),t.engineExport&&(r.AGENTHIPPO_ENGINE_EXPORT=t.engineExport);let s=e.mcpServers?(0,_l.serializeInlineMcpServers)(e.mcpServers):void 0;return s&&(r[_l.AGENTHIPPO_MCP_SERVERS_ENV]=s),El(r,t.manifestDir),r}async function gE(t,e,n,r,s){let i;try{let{ensureNodeRunnerScriptPath:c}=await Promise.resolve().then(()=>$n(af()));i=await c()}catch(c){throw new Error(`Custom engine Node runner not available: ${c instanceof Error?c.message:String(c)}. Rebuild the agenthippo CLI.`)}let o=await(0,ml.resolveNodeBinary)();e.runtime.logger.info(`[AgentIDE] Custom engine Node runner: ${o}`);let a=uf(t,e,r);return process.platform==="win32"&&o===process.execPath&&!o.toLowerCase().endsWith("\\node.exe")&&(a.ELECTRON_RUN_AS_NODE="1"),(0,ml.prependPathDir)(a,$t.dirname(o)),new Promise((c,l)=>{let u=(0,ZR.spawn)(o,[i],{cwd:t.manifestDir,env:a,stdio:["ignore","pipe","pipe"]}),f="",d,g=Promise.resolve(),p=(0,eC.createInterface)({input:u.stdout});p.on("line",h=>{g=g.then(async()=>{let y=await(0,iC.applyRunnerEvent)(n,h);y&&(d=y)}).catch(y=>{p.close(),u.kill(),l(y)})}),u.stderr?.on("data",h=>{f+=String(h)});let _=()=>{u.kill("SIGTERM")};s?.addEventListener("abort",_,{once:!0}),u.on("error",l),u.on("close",h=>{s?.removeEventListener("abort",_),p.close(),g.finally(()=>{if(h===0)c(d?{nativeSessionId:d}:void 0);else{let y=f.trim()||`Custom engine Node runner exited with code ${h}`;l(new Error(y))}})})})}async function uC(t,e){try{if(e==="in-process")return await hE(t),{strategy:e,ok:!0};let n={text:async()=>{},thinking:async()=>{},toolStart:async()=>{},toolEnd:async()=>{},progress:async()=>{},question:async()=>({selected:[],freeText:null}),error:async()=>{},done:async()=>{}},r={message:"",modelId:t.model?.defaultModel??"auto",workspaceRoot:t.searchRoot,additionalDirectories:[],permissions:{fileAccess:"full"},env:{...process.env},routing:{useLiteLLM:!1},session:{key:"probe",chatSessionId:"probe",contextSessionId:"probe",isEphemeral:!0,engineHomeDir:t.manifestDir,engineSessionDir:t.manifestDir},agent:{id:"probe"},emitter:n,runtime:{logger:{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}};return await gE(t,r,n,!0),{strategy:e,ok:!0}}catch(n){return{strategy:e,ok:!1,error:n instanceof Error?n.message:String(n)}}}async function hE(t){let{entryPath:e,id:n,engineExport:r}=t;try{await Ia.promises.access(e)}catch{throw new Error(`Custom engine "${n}" entry not found: ${e}`)}let s=process.cwd(),i=process.env.NODE_PATH;try{process.chdir(t.manifestDir),El(process.env,t.manifestDir);let o=await Ia.promises.stat(e).catch(()=>{}),a=`${(0,tC.pathToFileURL)(e).href}?mtime=${o?.mtimeMs??Date.now()}`,c=await new Function("u","return import(u)")(a),l=(r?c[r]??c.default?.[r]:void 0)??c.default;if(!l){let f=r?`"${r}"`:"default export";throw new Error(`Custom engine "${n}": ${f} not found in ${e}. Export a class or object with a run(turn) method.`)}let u=typeof l=="function"?new l:l;return dC(n,u),u}finally{process.chdir(s),i===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=i}}function dC(t,e){if(typeof e!="object"||e===null||typeof e.run!="function")throw new Error(`Custom engine "${t}" export must be a class or object with a run(turn) method.`)}function fC(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160)||"session"}function pC(t){let e=[];t.session.contextFilePath&&e.push(`context_file: ${$t.relative(t.workspaceRoot,t.session.contextFilePath)}`),t.session.terminalLogPath&&e.push(`terminal_log: ${$t.relative(t.workspaceRoot,t.session.terminalLogPath)}`),t.session.attachmentsDir&&e.push(`attachments_dir: ${$t.relative(t.workspaceRoot,t.session.attachmentsDir)}`);let n=t.env.AGENTHIPPO_GATEWAY_OUTBOUND_FILE?.trim();n&&e.push(`gateway_outbound_file: ${n}`);let r=t.env.AGENTHIPPO_ACTIVE_AGENT?.trim();return r&&e.push(`active_agent: ${r}`),e.length===0?"":["<agenthippo_runtime_context>",...e,"</agenthippo_runtime_context>"].join(`
433
+ `)}var gC=5e3,lf=class{config;getBundledBasePromptsDir;id="custom";displayName="Custom Engine";instances=new Map;activeSessions=new Map;mtimeCache=new Map;workerPool=new oC.PersistentEngineWorkerPool;constructor(e,n=()=>{}){this.config=e,this.getBundledBasePromptsDir=n}async getCachedMtime(e){let n=Date.now(),r=this.mtimeCache.get(e);if(r&&n-r.fetchedAt<gC)return r.mtime;let s=(await Ia.promises.stat(e).catch(()=>{}))?.mtimeMs??0;return this.mtimeCache.set(e,{mtime:s,fetchedAt:n}),s}async buildCacheKey(e){let[n,r]=await Promise.all([this.getCachedMtime(e.manifestPath),this.getCachedMtime(e.entryPath)]);return[e.id,e.manifestPath,n,e.entryPath,r].join("\0")}async stream(e,n,r,s,i){let o=cC(n),a=(0,rC.resolveCustomEngineManifest)(n.workspaceRoot,o,lC(s),(u,f)=>s.logger.warn(`[AgentIDE] Skipping malformed custom engine manifest ${u}: ${f instanceof Error?f.message:String(f)}`)),c=`custom:${a.id}`,l=(0,cf.buildConversationKey)(c,n);await(0,cf.withConversationLock)(l.key,async()=>{let u=fE(),f=await this.buildTurn(a,e,n,r,s,l.key,l.chatSessionId,l.isEphemeral,i);s.logger.info(`[AgentIDE] Custom engine "${a.id}" strategy=${u} entry=${a.entryPath}`);let d;if(u==="in-process"){let{engine:_}=await this.getOrLoadInstance(a,s),h=process.cwd(),y=process.env.NODE_PATH;try{process.chdir(a.manifestDir),El(process.env,a.manifestDir),d=await _.run(f)}finally{process.chdir(h),y===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=y}}else u==="persistent-worker"?d=await this.runViaPersistentWorker(a,f,r,i):d=await gE(a,f,r,!1,i);let g=d?.nativeSessionId?.trim(),p=g||f.session.nativeSessionId;this.activeSessions.set(l.key,{nativeSessionId:p,lastUsedAt:Date.now()}),g?await(0,Oa.persistSessionIfNeeded)(c,l,g,n):(0,Oa.touchSessionIfNeeded)(l)},{signal:i,timeoutMs:cf.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:`custom.${a.id}.run`})}async getOrLoadInstance(e,n){let r=await this.buildCacheKey(e),s=this.instances.get(r);if(s)return s;for(let[a,c]of this.instances.entries())if(c.manifest.id===e.id){try{c.engine.dispose?.()}catch{}this.instances.delete(a)}n.logger.info(`[AgentIDE] Loading custom engine "${e.id}" from ${e.entryPath}`);let o={engine:await hE(e),manifest:e,cacheKey:r};return this.instances.set(r,o),o}async runViaPersistentWorker(e,n,r,s){let{ensureNodeRunnerScriptPath:i}=await Promise.resolve().then(()=>$n(af())),o=await i(),a=await(0,ml.resolveNodeBinary)();n.runtime.logger.info(`[AgentIDE] Custom engine persistent worker: ${a}`);let c=uf(e,n,!1),l={...c,AGENTHIPPO_RUNNER_MODE:"persistent"};process.platform==="win32"&&a===process.execPath&&!a.toLowerCase().endsWith("\\node.exe")&&(l.ELECTRON_RUN_AS_NODE="1"),(0,ml.prependPathDir)(l,$t.dirname(a));let u=await this.buildCacheKey(e);return this.workerPool.run({cacheKey:u,runnerPath:o,nodeBin:a,cwd:e.manifestDir,spawnEnv:l,logger:n.runtime.logger,label:`custom.${e.id}`},c,r,s)}clearInstances(e){for(let[n,{engine:r,manifest:s}]of this.instances.entries())if(!(e&&s.id!==e)){try{r.dispose?.()}catch{}this.instances.delete(n)}}async buildTurn(e,n,r,s,i,o,a,c,l){let u=r.modelId?.trim()||e.model?.defaultModel?.trim();if(!u)throw new Error(`Custom engine "${e.id}" requires a model selection. Add a "model.defaultModel" to the engine manifest or select a model explicitly.`);let f=r.agentPackId??Os.AGENT_CONSTANTS.DEFAULT_AGENT_ID,d=r.contextSessionId?.trim()||r.sessionId?.trim()||a,g=fC(d),p=this.config.customEnginesStoragePath??$t.join(this.config.storagePath,Os.AGENT_CONSTANTS.AGENTS_DIR,f,"custom"),_=$t.join(p,e.id),h=(0,Os.userScopedEngineHomeFromKey)($t.join(_,"home"),(0,sC.resolveEngineHomeUserKey)(r.engineHomeUserKey)),y=$t.join(_,Os.AGENT_CONSTANTS.SESSIONS_DIR,g);await Ia.promises.mkdir(h,{recursive:!0}),await Ia.promises.mkdir(y,{recursive:!0});let E=$t.join(r.workspaceRoot,Os.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Os.AGENT_CONSTANTS.SESSIONS_DIR,d),w=$t.join(E,Os.AGENT_CONSTANTS.CONTEXT_MD),A=$t.join(E,"terminal.md"),S=$t.join(E,"attachments"),C=this.activeSessions.get(o)?.nativeSessionId??(0,Oa.getPersistedSessionId)(`custom:${e.id}`,o),b=(0,hl.resolveApiRouting)(r,this.config,(0,hl.inferModelProvider)(r.modelId),i.configProvider),I=b.apiKey?.trim()||void 0,P=b.baseUrl?.trim()||void 0,L=b.openaiBaseUrl?.trim()||void 0,N=e.workspaceSync?.enabled?$t.join(r.workspaceRoot,e.workspaceSync.dir,e.workspaceSync.rulesFile):void 0,O=e.workspaceSync?.enabled&&e.workspaceSync.includeSkills?$t.join(r.workspaceRoot,e.workspaceSync.dir,Os.AGENT_CONSTANTS.SKILLS_DIR):void 0,G=e.workspaceSync?.enabled&&e.workspaceSync.includeRules?$t.join(r.workspaceRoot,e.workspaceSync.dir,Os.AGENT_CONSTANTS.RULES_DIR):void 0,H={...process.env,...i.cliEnvPatch??{},AGENTHIPPO_ENGINE_ID:e.id,AGENTHIPPO_ENGINE_HOME:h,AGENTHIPPO_ENGINE_SESSION_DIR:y,AGENTHIPPO_CONTEXT_SESSION_ID:d,AGENTHIPPO_CONTEXT_EXPORT_PATH:w,AGENTHIPPO_TERMINAL_LOG_PATH:A,AGENTHIPPO_ATTACHMENTS_DIR:S,AGENTHIPPO_ACTIVE_AGENT:f,AGENT_ID:f,AGENTHIPPO_MODEL_ID:u,AGENTHIPPO_USE_LITELLM:b.useLiteLLM?"true":"false"};if(delete H[nC.OPENCLAW_GATEWAY_TOKEN_ENV],delete H.AGENTHIPPO_DATA_PLANE_TOKEN,El(H,e.manifestDir),I&&(H.AGENTHIPPO_API_KEY=I),P&&(H.AGENTHIPPO_BASE_URL=P),L&&(H.AGENTHIPPO_OPENAI_BASE_URL=L),b.useLiteLLM){H.AGENTHIPPO_LITELLM_API_KEY=I??"sk-dummy",H.AGENTIDE_LITELLM_API_KEY=I??"sk-dummy",P&&(H.AGENTHIPPO_LITELLM_BASE_URL=P,H.AGENTIDE_LITELLM_BASE_URL=P);let pe=(0,Oa.buildLiteLLMMetadataHeaders)(!0,{sessionId:r.sessionId,analyticsUserId:r.analyticsUserId,analyticsProjectId:(0,Oa.resolveAnalyticsProjectId)(r.analyticsProjectId,r.workspaceRoot),agentId:f,agentVersion:r.agentPackVersion??"workspace",source:"agenthippo",engine:`custom:${e.id}`,requestId:r.requestId,policyVersion:r.policyVersion,packDigest:r.packDigest,instanceId:r.instanceId,engineVersion:r.engineVersion,tier:r.tier});pe.length>0&&(H.AGENTHIPPO_LITELLM_METADATA_HEADERS=pe.join(`
434
+ `))}r.agentPackVersion&&(H.AGENTHIPPO_AGENT_VERSION=r.agentPackVersion,H.AGENTIDE_AGENT_VERSION=r.agentPackVersion),e.homeEnvVar&&(H[e.homeEnvVar]=h),pE(H,e,{apiKey:I,baseUrl:P,openaiBaseUrl:L},process.env,i.logger),(P&&(0,hl.applyLocalTlsBypass)(H,P)||L&&L!==P&&(0,hl.applyLocalTlsBypass)(H,L))&&i.logger.info(`[AgentIDE] Disabling TLS verification for local HTTPS (${e.id})`);let X=b.useLiteLLM?"LiteLLM proxy":P?"custom provider":"native provider";i.logger.info(`[AgentIDE] Custom engine "${e.id}" routing: ${X}, baseUrl=${P||"default"}, model=${u}`);let J=await(0,_l.loadMcpServers)(f,r.workspaceRoot,this.getBundledBasePromptsDir()),W=(0,_l.formatInlineMcpServers)(J,H);J.length>0&&i.logger.debug(`[AgentIDE] Custom engine "${e.id}" MCP (${f}): ${J.map(pe=>pe.name).join(", ")}`);let ee=n,le={message:ee,modelId:u,workspaceRoot:r.workspaceRoot,additionalDirectories:r.additionalDirectories??[],permissions:r.permissions??{fileAccess:"workspace-write"},env:H,routing:{useLiteLLM:b.useLiteLLM,...I?{apiKey:I}:{},...P?{baseUrl:P}:{},...L?{openaiBaseUrl:L}:{}},session:{key:o,chatSessionId:a,contextSessionId:d,isEphemeral:c,engineHomeDir:h,engineSessionDir:y,nativeSessionId:C,contextFilePath:w,terminalLogPath:A,attachmentsDir:S},agent:{id:f,version:r.agentPackVersion,rulesFilePath:N,skillsDir:O,rulesDir:G},...Object.keys(W).length>0?{mcpServers:W}:{},emitter:s,runtime:{...i,invalidateEngineInstance:()=>this.clearInstances(e.id)},signal:l};if(e.promptInjection.mode==="message-suffix"){let pe=pC(le);pe&&(ee=`${n}
435
435
 
436
- ${pe}`,le.message=ee)}return le}onMaintenance(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())n-s.lastUsedAt>(0,aC.engineIdleTtlMs)()&&(this.activeSessions.delete(r),e.info(`[AgentIDE] Closed idle custom engine session (key=${r}, idleMs=${n-s.lastUsedAt})`));for(let{engine:r,manifest:s}of this.instances.values())try{r.onMaintenance?.(e)}catch(i){e.warn(`[AgentIDE] Custom engine "${s.id}" onMaintenance error: ${i}`)}this.workerPool.onMaintenance()}dispose(){this.clearInstances(),this.workerPool.disposeAll(),this.activeSessions.clear(),this.mtimeCache.clear()}};Pn.CustomEngine=lf});var Ui=T(me=>{"use strict";var hC=me&&me.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),mC=me&&me.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_C=me&&me.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&hC(n,e,r[s]);return mC(n,e),n}})();Object.defineProperty(me,"__esModule",{value:!0});me.resolveModelAlias=me.getSessionDir=me.createSessionDir=me.computeSkillsSignature=me.syncPackToWorkspace=me.initSessionStoreWithStore=me.CLIPermissionHandler=me.AutoApprovePermissionHandler=me.DirectorySessionStore=me.FileSessionStore=me.MemorySessionStore=me.StaticConfigProvider=me.NoOpEditTracker=me.NoOpLogger=me.ConsoleLogger=void 0;me.createHeadlessRunner=ff;me.createEvalRunner=NC;me.createCLIRunner=RC;var mE=_C(require("path")),EC=W_(),yC=Q_(),wC=Ii(),Vt=Ic();Object.defineProperty(me,"ConsoleLogger",{enumerable:!0,get:function(){return Vt.ConsoleLogger}});Object.defineProperty(me,"NoOpLogger",{enumerable:!0,get:function(){return Vt.NoOpLogger}});Object.defineProperty(me,"NoOpEditTracker",{enumerable:!0,get:function(){return Vt.NoOpEditTracker}});Object.defineProperty(me,"StaticConfigProvider",{enumerable:!0,get:function(){return Vt.StaticConfigProvider}});Object.defineProperty(me,"MemorySessionStore",{enumerable:!0,get:function(){return Vt.MemorySessionStore}});Object.defineProperty(me,"FileSessionStore",{enumerable:!0,get:function(){return Vt.FileSessionStore}});Object.defineProperty(me,"DirectorySessionStore",{enumerable:!0,get:function(){return Vt.DirectorySessionStore}});Object.defineProperty(me,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return Vt.AutoApprovePermissionHandler}});Object.defineProperty(me,"CLIPermissionHandler",{enumerable:!0,get:function(){return Vt.CLIPermissionHandler}});var _E=Oi(),SC=ef(),EE=vo(),AC=Cr(),TC=As(),bC=bi(),vC="AGENTHIPPO_TURN_NONCE";function OC(t,e){let n=t?.trim();if(n)return n;let r=e?.trim();if(r)return r;let s=process.env.AGENTHIPPO_ANALYTICS_USER_ID?.trim()||process.env.AGENTIDE_ANALYTICS_USER_ID?.trim();if(s)return s;let i=process.env.LOGNAME?.trim()||process.env.USER?.trim()||process.env.LNAME?.trim()||process.env.USERNAME?.trim();return i||"anonymous"}function ff(t){if(t.freshState){let E=new Vt.MemorySessionStore;(0,_E.initSessionStoreWithStore)(E)}else(0,_E.initSessionStoreWithStore)(new Vt.DirectorySessionStore(mE.join(t.storagePath,"provider-sessions")));let e=!!(t.litellmApiKey||t.openaiApiKey||t.anthropicApiKey),n={storagePath:t.storagePath,codexHome:void 0,claudeConfigDir:void 0,litellmApiKey:t.litellmApiKey??(e?void 0:t.apiKey),litellmBaseUrl:t.baseUrl,openaiApiKey:t.openaiApiKey,anthropicApiKey:t.anthropicApiKey,claudeCodeExecutablePath:t.claudeCodeExecutablePath,codexExecutablePath:t.codexExecutablePath},r=t.logger??new Vt.ConsoleLogger("[AgentIDE]"),s=t.editTracker??new Vt.NoOpEditTracker,i=new Vt.StaticConfigProvider({},t.customProviders??{},t.engineSettings??{}),o=t.permissionHandler??new Vt.AutoApprovePermissionHandler,a={logger:r,editTracker:s,configProvider:i,permissionHandler:o,cliEnvPatch:t.cliEnvPatch},c=t.packId??"default",l=E=>(0,SC.computeSkillsSignature)(E,c),u=()=>t.bundledPromptsDir,d,f,p,g=()=>(d||(d=new yC.ClaudeEngine(n,async(E,w)=>l(E)??`headless-${c}`,u)),d),_=()=>(f||(f=new EC.CodexEngine(n,l,u)),f),h=async()=>{if(!p){let{CustomEngine:E}=await Promise.resolve().then(()=>$n(df()));p=new E(n,u)}return p},y=new EE.SessionEventWriter(t.analyticsSessionsDir??mE.join((0,bC.getAgentideHome)(),"analytics","sessions"));return{async run(E){let w={success:!1,text:"",thinking:"",toolCalls:[]},A={async thinking(O){if(E.emitter)return E.emitter.thinking(O);w.thinking+=O},async text(O){if(E.emitter)return E.emitter.text(O);w.text+=O},async toolStart(O,G,H,X){if(E.emitter)return E.emitter.toolStart(O,G,H,X);w.toolCalls.push({name:O,input:G})},async toolEnd(O,G,H,X,J){if(E.emitter)return E.emitter.toolEnd(O,G,H,X,J);let W=w.toolCalls.find(ee=>ee.name===O&&!ee.result);W&&(W.result=H,W.isError=X)},async progress(O){if(E.emitter)return E.emitter.progress(O);r.debug(`[Progress] ${O}`)},async question(O){return E.emitter?E.emitter.question(O):(r.debug(`[Question] ${O.prompt}`),{selected:[],freeText:null,declined:!0})},async error(O){w.error=O,w.success=!1,await E.emitter?.error(O)},async done(){w.error||(w.success=!0),await E.emitter?.done()}},S=(0,wC.generateRequestId)(),C=E.sessionId??`headless-${Date.now()}`,v=t.provenance?.(),I=(0,EE.wrapEmitterWithObservability)(A,y,C,S,(0,TC.currentCredential)()?.userId,v&&{policy_version:v.policyVersion,pack_digest:v.packDigest,engine_version:v.engineVersion,tier:v.tier,instance_id:v.instanceId}),P={modelId:E.modelId,engineId:E.engineId,workspaceRoot:E.workspaceRoot,additionalDirectories:E.additionalDirectories,sessionId:C,analyticsUserId:OC(E.analyticsUserId,t.analyticsUserId),apiKey:E.modelToken??(e?void 0:t.apiKey),baseUrl:t.baseUrl,useLiteLLM:t.useLiteLLM,agentPackId:c,agentPackVersion:t.packVersion,policyVersion:v?.policyVersion,packDigest:v?.packDigest,engineVersion:v?.engineVersion,tier:v?.tier,instanceId:v?.instanceId,permissions:E.permissions,engineHomeUserKey:E.engineHomeUserKey,requestId:S};await I.emitTurnStart();let L=null;if(t.dataPlane&&!E.turnEnv?.[vC])try{L=await t.dataPlane.beginTurn({sessionKey:C})}catch(O){return w.error=`data-plane turn registration failed: ${O instanceof Error?O.message:String(O)}`,await I.error(w.error),await I.emitTurnEnd(!1),w}let N={...a,cliEnvPatch:{...a.cliEnvPatch??{},...(0,AC.buildSessionEnvPatch)({workspaceRoot:E.workspaceRoot,chatSessionId:C,gatewaySessionKey:E.gatewaySessionKey}),...E.turnEnv??{},...L?.env??{}}};try{let O=E.engineId.trim().toLowerCase();O==="claude"?await g().stream(E.message,P,I,N,E.signal):O==="codex"?await _().stream(E.message,P,I,N,E.signal):await(await h()).stream(E.message,P,I,N,E.signal)}catch(O){w.error=O instanceof Error?O.message:String(O),w.success=!1,await I.error(w.error)}finally{try{await L?.release()}catch{}}return await I.emitTurnEnd(w.success),w},runMaintenance(){for(let E of[d,f,p])try{E?.onMaintenance(r)}catch(w){r.warn(`[Headless] engine maintenance failed: ${w instanceof Error?w.message:String(w)}`)}},dispose(){d?.dispose(),f?.dispose(),p?.dispose()}}}var IC=Oi();Object.defineProperty(me,"initSessionStoreWithStore",{enumerable:!0,get:function(){return IC.initSessionStoreWithStore}});var yl=ef();Object.defineProperty(me,"syncPackToWorkspace",{enumerable:!0,get:function(){return yl.syncPackToWorkspace}});Object.defineProperty(me,"computeSkillsSignature",{enumerable:!0,get:function(){return yl.computeSkillsSignature}});Object.defineProperty(me,"createSessionDir",{enumerable:!0,get:function(){return yl.createSessionDir}});Object.defineProperty(me,"getSessionDir",{enumerable:!0,get:function(){return yl.getSessionDir}});var PC=Nc();Object.defineProperty(me,"resolveModelAlias",{enumerable:!0,get:function(){return PC.resolveModelAlias}});function NC(t,e,n){return ff({storagePath:t,apiKey:e,baseUrl:n,freshState:!0,logger:new Vt.NoOpLogger})}function RC(t,e,n){return ff({storagePath:t,apiKey:e,baseUrl:n,logger:new Vt.ConsoleLogger("[Agent]")})}});var gf=T(ze=>{"use strict";var CC=ze&&ze.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),kC=ze&&ze.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pf=ze&&ze.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&CC(n,e,r[s]);return kC(n,e),n}})();Object.defineProperty(ze,"__esModule",{value:!0});ze.DEFAULT_AFTER_CALL_PROMPT=ze.DEFAULT_TRANSCRIPTION_MODEL=ze.DEFAULT_GEMINI_HOLD_MS=ze.DEFAULT_HOLD_MS=ze.DEFAULT_MAX_CALL_SECONDS=void 0;ze.validateVoiceSpec=SE;ze.loadVoiceSpec=DC;var wl=pf(require("fs")),Hi=pf(require("path")),$C=pf(require("js-yaml"));ze.DEFAULT_MAX_CALL_SECONDS=600;ze.DEFAULT_HOLD_MS=6e3;ze.DEFAULT_GEMINI_HOLD_MS=0;ze.DEFAULT_TRANSCRIPTION_MODEL="gpt-4o-mini-transcribe";ze.DEFAULT_AFTER_CALL_PROMPT="Do the follow-up this call needs according to your instructions (notes, to-dos, messages to the owner). Then reply with a short summary of the call: who called, what they wanted, and what happens next.";function yE(t){let e=Hi.posix.normalize(t.trim().replace(/\\/g,"/"));return!!e&&!Hi.isAbsolute(t)&&e!==".."&&!e.startsWith("../")}function SE(t){if(t===void 0)return[];if(!t||typeof t!="object")return["Invalid spec.voice: must be a mapping"];let e=t,n=[];(typeof e.model!="string"||!e.model.trim())&&n.push("Invalid spec.voice.model: a realtime model group is required"),e.provider!==void 0&&e.provider!=="gateway"&&e.provider!=="gemini"&&n.push("Invalid spec.voice.provider: must be gateway or gemini");for(let r of["voice","greeting","transcription"])e[r]!==void 0&&typeof e[r]!="string"&&n.push(`Invalid spec.voice.${r}: must be a string when provided`);return e.instructions!==void 0&&(typeof e.instructions!="string"||!yE(e.instructions))&&n.push("Invalid spec.voice.instructions: must be a path inside the pack"),e.maxCallSeconds!==void 0&&!(typeof e.maxCallSeconds=="number"&&Number.isFinite(e.maxCallSeconds)&&e.maxCallSeconds>0)&&n.push("Invalid spec.voice.maxCallSeconds: must be a positive number"),e.holdMs!==void 0&&!(typeof e.holdMs=="number"&&Number.isFinite(e.holdMs)&&e.holdMs>=0)&&n.push("Invalid spec.voice.holdMs: must be 0 or a positive number"),e.afterCall!==void 0&&typeof e.afterCall!="boolean"&&!(typeof e.afterCall=="string"&&yE(e.afterCall))&&n.push("Invalid spec.voice.afterCall: must be true, false or a path inside the pack"),n}function wE(t,e){let n=Hi.resolve(t,e);if(!n.startsWith(Hi.resolve(t)+Hi.sep))throw new Error(`spec.voice path escapes the pack: ${e}`);return wl.readFileSync(n,"utf-8")}function DC(t){let n=$C.load(wl.readFileSync(Hi.join(t,"agent.yaml"),"utf-8"))?.spec?.voice;if(!n)return null;let r=SE(n);if(r.length)throw new Error(r.join("; "));let s=Hi.join(t,"AGENTS.md"),i=n.instructions?wE(t,n.instructions):wl.existsSync(s)?wl.readFileSync(s,"utf-8"):"",o=n.afterCall===!1?null:typeof n.afterCall=="string"?wE(t,n.afterCall):ze.DEFAULT_AFTER_CALL_PROMPT;return{provider:n.provider??"gateway",model:n.model.trim(),voice:n.voice?.trim()||void 0,instructions:i,greeting:n.greeting?.trim()||void 0,transcription:n.transcription?.trim()||ze.DEFAULT_TRANSCRIPTION_MODEL,maxCallSeconds:n.maxCallSeconds??ze.DEFAULT_MAX_CALL_SECONDS,holdMs:n.holdMs??(n.provider==="gemini"?ze.DEFAULT_GEMINI_HOLD_MS:ze.DEFAULT_HOLD_MS),afterCall:o}}});var ji=T(Zt=>{"use strict";var LC=Zt&&Zt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MC=Zt&&Zt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sl=Zt&&Zt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LC(n,e,r[s]);return MC(n,e),n}})();Object.defineProperty(Zt,"__esModule",{value:!0});Zt.resolvePackPath=TE;Zt.listAvailablePacks=BC;Zt.loadAgentPack=FC;Zt.getDefaultConfig=WC;Zt.getEnvDefaultModel=qC;Zt.getApiConfig=bE;Zt.hasCredentialForEngine=YC;Zt.getFileAccess=JC;var pn=Sl(require("fs")),wt=Sl(require("path")),GC=Sl(require("os")),UC=Sl(require("js-yaml")),Al=ot(),HC=Tc(),jC=gf();function Pa(t,e){return process.env[t]??(e?process.env[e]:void 0)}var xC=process.env.AGENTHIPPO_HOME||wt.join(GC.homedir(),Al.AGENTIDE_DIR_NAME),mf=wt.join(xC,"agents"),hf="agents";function Po(t){if(!pn.existsSync(t))return;let e=wt.join(t,"current.txt");if(pn.existsSync(e)){let r=pn.readFileSync(e,"utf-8").trim(),s=wt.join(t,r);if(pn.existsSync(s))return s}let n=wt.join(t,"agent.yaml");if(pn.existsSync(n))return t;try{let s=pn.readdirSync(t,{withFileTypes:!0}).filter(i=>i.isDirectory()&&/^\d+\.\d+\.\d+/.test(i.name)).map(i=>i.name).sort((i,o)=>{let[a,c,l]=i.split(".").map(p=>parseInt(p,10)||0),[u,d,f]=o.split(".").map(p=>parseInt(p,10)||0);return u!==a?u-a:d!==c?d-c:f-l});for(let i of s){let o=wt.join(t,i),a=wt.join(o,"agent.yaml");if(pn.existsSync(a))return o}}catch{}}function TE(t,e){if(wt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")){let c=wt.isAbsolute(t)?t:wt.resolve(process.cwd(),t);if(pn.existsSync(c)){try{if(pn.statSync(c).isDirectory())return Po(c)??c}catch{}return c}return}let n=wt.join(process.cwd(),t),r=Po(n);if(r)return r;let s=wt.join(process.cwd(),hf,t),i=Po(s);if(i)return i;if(e){let c=wt.join(e,Al.AGENTIDE_DIR_NAME,hf,t),l=Po(c);if(l)return l}let o=wt.join(mf,t),a=Po(o);if(a)return a}function AE(t,e){let n=[];if(!pn.existsSync(t))return n;let r=pn.readdirSync(t,{withFileTypes:!0});for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=wt.join(t,s.name),o=Po(i);if(!o)continue;let a;o!==i&&(a=wt.basename(o)),n.push({name:s.name,path:o,version:a,source:e})}return n}function BC(t){let e=[],n=new Set;if(t){let s=wt.join(t,Al.AGENTIDE_DIR_NAME,hf),i=AE(s,"workspace");for(let o of i)e.push(o),n.add(o.name)}let r=AE(mf,"user-library");for(let s of r)n.has(s.name)||e.push(s);return e}async function FC(t,e){let n=TE(t,e);if(!n){let d=wt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")?[wt.resolve(process.cwd(),t)]:[`${process.cwd()}/${t}`,`${process.cwd()}/agents/${t}`,e?`${e}/${Al.AGENTIDE_DIR_NAME}/agents/${t}`:null,`${mf}/${t}`].filter(Boolean);throw new Error(`Agent pack not found: ${t}
437
- Searched: ${d.join(", ")}`)}let r=wt.join(n,"agent.yaml");if(!pn.existsSync(r))throw new Error(`Missing agent.yaml in pack: ${n}`);let s=pn.readFileSync(r,"utf-8"),i=UC.load(s);KC(i,r);let o=VC(i),a="",c=wt.join(n,"AGENTS.md");return pn.existsSync(c)&&(a=pn.readFileSync(c,"utf-8")),{manifest:o,packPath:n,systemPrompt:a,rules:[]}}function VC(t){let e=t.spec.engine?.trim()??"",n=e.toLowerCase();return e!==n?{...t,spec:{...t.spec,engine:n}}:t}function KC(t,e){let n=[];t.metadata?.name||n.push("Missing metadata.name"),t.metadata?.version||n.push("Missing metadata.version"),t.spec?.engine?.trim()||n.push("Missing spec.engine");let r=t.spec?.engine?.trim().toLowerCase();r==="custom"&&n.push('Invalid spec.engine: use the concrete custom engine id (for example, openclaw), not "custom"'),t.spec?.cheapModel!==void 0&&typeof t.spec.cheapModel!="string"&&n.push("Invalid spec.cheapModel: must be a string when provided");let s=r==="codex"||r==="claude"?HC.ENGINE_EFFORTS[r]:void 0;if(t.spec?.effort!==void 0&&s&&!s.includes(t.spec.effort)&&n.push(`Invalid spec.effort for engine ${r}: must be one of ${s.join(", ")}`),t.spec?.dataPlane!==void 0&&((typeof t.spec.dataPlane!="object"||!t.spec.dataPlane.connector?.trim())&&n.push("Invalid spec.dataPlane: requires a `connector` path (stdio MCP module run broker-side)"),t.spec.dataPlane?.provider!==void 0&&typeof t.spec.dataPlane.provider!="string"&&n.push("Invalid spec.dataPlane.provider: must be a string when provided")),n.push(...(0,jC.validateVoiceSpec)(t.spec?.voice)),n.length>0)throw new Error(`Invalid agent manifest at ${e}:
436
+ ${pe}`,le.message=ee)}return le}onMaintenance(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())n-s.lastUsedAt>(0,aC.engineIdleTtlMs)()&&(this.activeSessions.delete(r),e.info(`[AgentIDE] Closed idle custom engine session (key=${r}, idleMs=${n-s.lastUsedAt})`));for(let{engine:r,manifest:s}of this.instances.values())try{r.onMaintenance?.(e)}catch(i){e.warn(`[AgentIDE] Custom engine "${s.id}" onMaintenance error: ${i}`)}this.workerPool.onMaintenance()}dispose(){this.clearInstances(),this.workerPool.disposeAll(),this.activeSessions.clear(),this.mtimeCache.clear()}};Pn.CustomEngine=lf});var Ui=T(me=>{"use strict";var hC=me&&me.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),mC=me&&me.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_C=me&&me.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&hC(n,e,r[s]);return mC(n,e),n}})();Object.defineProperty(me,"__esModule",{value:!0});me.resolveModelAlias=me.getSessionDir=me.createSessionDir=me.computeSkillsSignature=me.syncPackToWorkspace=me.initSessionStoreWithStore=me.CLIPermissionHandler=me.AutoApprovePermissionHandler=me.DirectorySessionStore=me.FileSessionStore=me.MemorySessionStore=me.StaticConfigProvider=me.NoOpEditTracker=me.NoOpLogger=me.ConsoleLogger=void 0;me.createHeadlessRunner=ff;me.createEvalRunner=NC;me.createCLIRunner=RC;var mE=_C(require("path")),EC=W_(),yC=Q_(),wC=Ii(),Vt=Ic();Object.defineProperty(me,"ConsoleLogger",{enumerable:!0,get:function(){return Vt.ConsoleLogger}});Object.defineProperty(me,"NoOpLogger",{enumerable:!0,get:function(){return Vt.NoOpLogger}});Object.defineProperty(me,"NoOpEditTracker",{enumerable:!0,get:function(){return Vt.NoOpEditTracker}});Object.defineProperty(me,"StaticConfigProvider",{enumerable:!0,get:function(){return Vt.StaticConfigProvider}});Object.defineProperty(me,"MemorySessionStore",{enumerable:!0,get:function(){return Vt.MemorySessionStore}});Object.defineProperty(me,"FileSessionStore",{enumerable:!0,get:function(){return Vt.FileSessionStore}});Object.defineProperty(me,"DirectorySessionStore",{enumerable:!0,get:function(){return Vt.DirectorySessionStore}});Object.defineProperty(me,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return Vt.AutoApprovePermissionHandler}});Object.defineProperty(me,"CLIPermissionHandler",{enumerable:!0,get:function(){return Vt.CLIPermissionHandler}});var _E=Oi(),SC=ef(),EE=vo(),AC=Cr(),TC=As(),bC=bi(),vC="AGENTHIPPO_TURN_NONCE";function OC(t,e){let n=t?.trim();if(n)return n;let r=e?.trim();if(r)return r;let s=process.env.AGENTHIPPO_ANALYTICS_USER_ID?.trim()||process.env.AGENTIDE_ANALYTICS_USER_ID?.trim();if(s)return s;let i=process.env.LOGNAME?.trim()||process.env.USER?.trim()||process.env.LNAME?.trim()||process.env.USERNAME?.trim();return i||"anonymous"}function ff(t){if(t.freshState){let E=new Vt.MemorySessionStore;(0,_E.initSessionStoreWithStore)(E)}else(0,_E.initSessionStoreWithStore)(new Vt.DirectorySessionStore(mE.join(t.storagePath,"provider-sessions")));let e=!!(t.litellmApiKey||t.openaiApiKey||t.anthropicApiKey),n={storagePath:t.storagePath,codexHome:void 0,claudeConfigDir:void 0,litellmApiKey:t.litellmApiKey??(e?void 0:t.apiKey),litellmBaseUrl:t.baseUrl,openaiApiKey:t.openaiApiKey,anthropicApiKey:t.anthropicApiKey,claudeCodeExecutablePath:t.claudeCodeExecutablePath,codexExecutablePath:t.codexExecutablePath},r=t.logger??new Vt.ConsoleLogger("[AgentIDE]"),s=t.editTracker??new Vt.NoOpEditTracker,i=new Vt.StaticConfigProvider({},t.customProviders??{},t.engineSettings??{}),o=t.permissionHandler??new Vt.AutoApprovePermissionHandler,a={logger:r,editTracker:s,configProvider:i,permissionHandler:o,cliEnvPatch:t.cliEnvPatch},c=t.packId??"default",l=E=>(0,SC.computeSkillsSignature)(E,c),u=()=>t.bundledPromptsDir,f,d,g,p=()=>(f||(f=new yC.ClaudeEngine(n,async(E,w)=>l(E)??`headless-${c}`,u)),f),_=()=>(d||(d=new EC.CodexEngine(n,l,u)),d),h=async()=>{if(!g){let{CustomEngine:E}=await Promise.resolve().then(()=>$n(df()));g=new E(n,u)}return g},y=new EE.SessionEventWriter(t.analyticsSessionsDir??mE.join((0,bC.getAgentideHome)(),"analytics","sessions"));return{async run(E){let w={success:!1,text:"",thinking:"",toolCalls:[]},A={async thinking(O){if(E.emitter)return E.emitter.thinking(O);w.thinking+=O},async text(O){if(E.emitter)return E.emitter.text(O);w.text+=O},async toolStart(O,G,H,X){if(E.emitter)return E.emitter.toolStart(O,G,H,X);w.toolCalls.push({name:O,input:G})},async toolEnd(O,G,H,X,J){if(E.emitter)return E.emitter.toolEnd(O,G,H,X,J);let W=w.toolCalls.find(ee=>ee.name===O&&!ee.result);W&&(W.result=H,W.isError=X)},async progress(O){if(E.emitter)return E.emitter.progress(O);r.debug(`[Progress] ${O}`)},async question(O){return E.emitter?E.emitter.question(O):(r.debug(`[Question] ${O.prompt}`),{selected:[],freeText:null,declined:!0})},async error(O){w.error=O,w.success=!1,await E.emitter?.error(O)},async done(){w.error||(w.success=!0),await E.emitter?.done()}},S=(0,wC.generateRequestId)(),C=E.sessionId??`headless-${Date.now()}`,b=t.provenance?.(),I=(0,EE.wrapEmitterWithObservability)(A,y,C,S,(0,TC.currentCredential)()?.userId,b&&{policy_version:b.policyVersion,pack_digest:b.packDigest,engine_version:b.engineVersion,tier:b.tier,instance_id:b.instanceId}),P={modelId:E.modelId,engineId:E.engineId,workspaceRoot:E.workspaceRoot,additionalDirectories:E.additionalDirectories,sessionId:C,analyticsUserId:OC(E.analyticsUserId,t.analyticsUserId),apiKey:E.modelToken??(e?void 0:t.apiKey),baseUrl:t.baseUrl,useLiteLLM:t.useLiteLLM,agentPackId:c,agentPackVersion:t.packVersion,policyVersion:b?.policyVersion,packDigest:b?.packDigest,engineVersion:b?.engineVersion,tier:b?.tier,instanceId:b?.instanceId,permissions:E.permissions,engineHomeUserKey:E.engineHomeUserKey,requestId:S};await I.emitTurnStart();let L=null;if(t.dataPlane&&!E.turnEnv?.[vC])try{L=await t.dataPlane.beginTurn({sessionKey:C})}catch(O){return w.error=`data-plane turn registration failed: ${O instanceof Error?O.message:String(O)}`,await I.error(w.error),await I.emitTurnEnd(!1),w}let N={...a,cliEnvPatch:{...a.cliEnvPatch??{},...(0,AC.buildSessionEnvPatch)({workspaceRoot:E.workspaceRoot,chatSessionId:C,gatewaySessionKey:E.gatewaySessionKey}),...E.turnEnv??{},...L?.env??{}}};try{let O=E.engineId.trim().toLowerCase();O==="claude"?await p().stream(E.message,P,I,N,E.signal):O==="codex"?await _().stream(E.message,P,I,N,E.signal):await(await h()).stream(E.message,P,I,N,E.signal)}catch(O){w.error=O instanceof Error?O.message:String(O),w.success=!1,await I.error(w.error)}finally{try{await L?.release()}catch{}}return await I.emitTurnEnd(w.success),w},runMaintenance(){for(let E of[f,d,g])try{E?.onMaintenance(r)}catch(w){r.warn(`[Headless] engine maintenance failed: ${w instanceof Error?w.message:String(w)}`)}},dispose(){f?.dispose(),d?.dispose(),g?.dispose()}}}var IC=Oi();Object.defineProperty(me,"initSessionStoreWithStore",{enumerable:!0,get:function(){return IC.initSessionStoreWithStore}});var yl=ef();Object.defineProperty(me,"syncPackToWorkspace",{enumerable:!0,get:function(){return yl.syncPackToWorkspace}});Object.defineProperty(me,"computeSkillsSignature",{enumerable:!0,get:function(){return yl.computeSkillsSignature}});Object.defineProperty(me,"createSessionDir",{enumerable:!0,get:function(){return yl.createSessionDir}});Object.defineProperty(me,"getSessionDir",{enumerable:!0,get:function(){return yl.getSessionDir}});var PC=Nc();Object.defineProperty(me,"resolveModelAlias",{enumerable:!0,get:function(){return PC.resolveModelAlias}});function NC(t,e,n){return ff({storagePath:t,apiKey:e,baseUrl:n,freshState:!0,logger:new Vt.NoOpLogger})}function RC(t,e,n){return ff({storagePath:t,apiKey:e,baseUrl:n,logger:new Vt.ConsoleLogger("[Agent]")})}});var gf=T(ze=>{"use strict";var CC=ze&&ze.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),kC=ze&&ze.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pf=ze&&ze.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&CC(n,e,r[s]);return kC(n,e),n}})();Object.defineProperty(ze,"__esModule",{value:!0});ze.DEFAULT_AFTER_CALL_PROMPT=ze.DEFAULT_TRANSCRIPTION_MODEL=ze.DEFAULT_GEMINI_HOLD_MS=ze.DEFAULT_HOLD_MS=ze.DEFAULT_MAX_CALL_SECONDS=void 0;ze.validateVoiceSpec=SE;ze.loadVoiceSpec=DC;var wl=pf(require("fs")),Hi=pf(require("path")),$C=pf(require("js-yaml"));ze.DEFAULT_MAX_CALL_SECONDS=600;ze.DEFAULT_HOLD_MS=6e3;ze.DEFAULT_GEMINI_HOLD_MS=0;ze.DEFAULT_TRANSCRIPTION_MODEL="gpt-4o-mini-transcribe";ze.DEFAULT_AFTER_CALL_PROMPT="Do the follow-up this call needs according to your instructions (notes, to-dos, messages to the owner). Then reply with a short summary of the call: who called, what they wanted, and what happens next.";function yE(t){let e=Hi.posix.normalize(t.trim().replace(/\\/g,"/"));return!!e&&!Hi.isAbsolute(t)&&e!==".."&&!e.startsWith("../")}function SE(t){if(t===void 0)return[];if(!t||typeof t!="object")return["Invalid spec.voice: must be a mapping"];let e=t,n=[];(typeof e.model!="string"||!e.model.trim())&&n.push("Invalid spec.voice.model: a realtime model group is required"),e.provider!==void 0&&e.provider!=="gateway"&&e.provider!=="gemini"&&n.push("Invalid spec.voice.provider: must be gateway or gemini");for(let r of["voice","greeting","transcription"])e[r]!==void 0&&typeof e[r]!="string"&&n.push(`Invalid spec.voice.${r}: must be a string when provided`);return e.instructions!==void 0&&(typeof e.instructions!="string"||!yE(e.instructions))&&n.push("Invalid spec.voice.instructions: must be a path inside the pack"),e.maxCallSeconds!==void 0&&!(typeof e.maxCallSeconds=="number"&&Number.isFinite(e.maxCallSeconds)&&e.maxCallSeconds>0)&&n.push("Invalid spec.voice.maxCallSeconds: must be a positive number"),e.holdMs!==void 0&&!(typeof e.holdMs=="number"&&Number.isFinite(e.holdMs)&&e.holdMs>=0)&&n.push("Invalid spec.voice.holdMs: must be 0 or a positive number"),e.afterCall!==void 0&&typeof e.afterCall!="boolean"&&!(typeof e.afterCall=="string"&&yE(e.afterCall))&&n.push("Invalid spec.voice.afterCall: must be true, false or a path inside the pack"),n}function wE(t,e){let n=Hi.resolve(t,e);if(!n.startsWith(Hi.resolve(t)+Hi.sep))throw new Error(`spec.voice path escapes the pack: ${e}`);return wl.readFileSync(n,"utf-8")}function DC(t){let n=$C.load(wl.readFileSync(Hi.join(t,"agent.yaml"),"utf-8"))?.spec?.voice;if(!n)return null;let r=SE(n);if(r.length)throw new Error(r.join("; "));let s=Hi.join(t,"AGENTS.md"),i=n.instructions?wE(t,n.instructions):wl.existsSync(s)?wl.readFileSync(s,"utf-8"):"",o=n.afterCall===!1?null:typeof n.afterCall=="string"?wE(t,n.afterCall):ze.DEFAULT_AFTER_CALL_PROMPT;return{provider:n.provider??"gateway",model:n.model.trim(),voice:n.voice?.trim()||void 0,instructions:i,greeting:n.greeting?.trim()||void 0,transcription:n.transcription?.trim()||ze.DEFAULT_TRANSCRIPTION_MODEL,maxCallSeconds:n.maxCallSeconds??ze.DEFAULT_MAX_CALL_SECONDS,holdMs:n.holdMs??(n.provider==="gemini"?ze.DEFAULT_GEMINI_HOLD_MS:ze.DEFAULT_HOLD_MS),afterCall:o}}});var ji=T(Zt=>{"use strict";var LC=Zt&&Zt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MC=Zt&&Zt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sl=Zt&&Zt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LC(n,e,r[s]);return MC(n,e),n}})();Object.defineProperty(Zt,"__esModule",{value:!0});Zt.resolvePackPath=TE;Zt.listAvailablePacks=BC;Zt.loadAgentPack=FC;Zt.getDefaultConfig=WC;Zt.getEnvDefaultModel=qC;Zt.getApiConfig=bE;Zt.hasCredentialForEngine=YC;Zt.getFileAccess=JC;var pn=Sl(require("fs")),wt=Sl(require("path")),GC=Sl(require("os")),UC=Sl(require("js-yaml")),Al=ot(),HC=Tc(),jC=gf();function Pa(t,e){return process.env[t]??(e?process.env[e]:void 0)}var xC=process.env.AGENTHIPPO_HOME||wt.join(GC.homedir(),Al.AGENTIDE_DIR_NAME),mf=wt.join(xC,"agents"),hf="agents";function Po(t){if(!pn.existsSync(t))return;let e=wt.join(t,"current.txt");if(pn.existsSync(e)){let r=pn.readFileSync(e,"utf-8").trim(),s=wt.join(t,r);if(pn.existsSync(s))return s}let n=wt.join(t,"agent.yaml");if(pn.existsSync(n))return t;try{let s=pn.readdirSync(t,{withFileTypes:!0}).filter(i=>i.isDirectory()&&/^\d+\.\d+\.\d+/.test(i.name)).map(i=>i.name).sort((i,o)=>{let[a,c,l]=i.split(".").map(g=>parseInt(g,10)||0),[u,f,d]=o.split(".").map(g=>parseInt(g,10)||0);return u!==a?u-a:f!==c?f-c:d-l});for(let i of s){let o=wt.join(t,i),a=wt.join(o,"agent.yaml");if(pn.existsSync(a))return o}}catch{}}function TE(t,e){if(wt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")){let c=wt.isAbsolute(t)?t:wt.resolve(process.cwd(),t);if(pn.existsSync(c)){try{if(pn.statSync(c).isDirectory())return Po(c)??c}catch{}return c}return}let n=wt.join(process.cwd(),t),r=Po(n);if(r)return r;let s=wt.join(process.cwd(),hf,t),i=Po(s);if(i)return i;if(e){let c=wt.join(e,Al.AGENTIDE_DIR_NAME,hf,t),l=Po(c);if(l)return l}let o=wt.join(mf,t),a=Po(o);if(a)return a}function AE(t,e){let n=[];if(!pn.existsSync(t))return n;let r=pn.readdirSync(t,{withFileTypes:!0});for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=wt.join(t,s.name),o=Po(i);if(!o)continue;let a;o!==i&&(a=wt.basename(o)),n.push({name:s.name,path:o,version:a,source:e})}return n}function BC(t){let e=[],n=new Set;if(t){let s=wt.join(t,Al.AGENTIDE_DIR_NAME,hf),i=AE(s,"workspace");for(let o of i)e.push(o),n.add(o.name)}let r=AE(mf,"user-library");for(let s of r)n.has(s.name)||e.push(s);return e}async function FC(t,e){let n=TE(t,e);if(!n){let f=wt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")?[wt.resolve(process.cwd(),t)]:[`${process.cwd()}/${t}`,`${process.cwd()}/agents/${t}`,e?`${e}/${Al.AGENTIDE_DIR_NAME}/agents/${t}`:null,`${mf}/${t}`].filter(Boolean);throw new Error(`Agent pack not found: ${t}
437
+ Searched: ${f.join(", ")}`)}let r=wt.join(n,"agent.yaml");if(!pn.existsSync(r))throw new Error(`Missing agent.yaml in pack: ${n}`);let s=pn.readFileSync(r,"utf-8"),i=UC.load(s);KC(i,r);let o=VC(i),a="",c=wt.join(n,"AGENTS.md");return pn.existsSync(c)&&(a=pn.readFileSync(c,"utf-8")),{manifest:o,packPath:n,systemPrompt:a,rules:[]}}function VC(t){let e=t.spec.engine?.trim()??"",n=e.toLowerCase();return e!==n?{...t,spec:{...t.spec,engine:n}}:t}function KC(t,e){let n=[];t.metadata?.name||n.push("Missing metadata.name"),t.metadata?.version||n.push("Missing metadata.version"),t.spec?.engine?.trim()||n.push("Missing spec.engine");let r=t.spec?.engine?.trim().toLowerCase();r==="custom"&&n.push('Invalid spec.engine: use the concrete custom engine id (for example, openclaw), not "custom"'),t.spec?.cheapModel!==void 0&&typeof t.spec.cheapModel!="string"&&n.push("Invalid spec.cheapModel: must be a string when provided");let s=r==="codex"||r==="claude"?HC.ENGINE_EFFORTS[r]:void 0;if(t.spec?.effort!==void 0&&s&&!s.includes(t.spec.effort)&&n.push(`Invalid spec.effort for engine ${r}: must be one of ${s.join(", ")}`),t.spec?.dataPlane!==void 0&&((typeof t.spec.dataPlane!="object"||!t.spec.dataPlane.connector?.trim())&&n.push("Invalid spec.dataPlane: requires a `connector` path (stdio MCP module run broker-side)"),t.spec.dataPlane?.provider!==void 0&&typeof t.spec.dataPlane.provider!="string"&&n.push("Invalid spec.dataPlane.provider: must be a string when provided")),n.push(...(0,jC.validateVoiceSpec)(t.spec?.voice)),n.length>0)throw new Error(`Invalid agent manifest at ${e}:
438
438
  - ${n.join(`
439
- - `)}`)}function WC(){return{engine:(Pa("AGENTHIPPO_DEFAULT_ENGINE","AGENTIDE_DEFAULT_ENGINE")||"claude").trim().toLowerCase(),model:Pa("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")||"claude-sonnet-4-5-20250929"}}function qC(){return Pa("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")?.trim()||void 0}function bE(){let t=Pa("AGENTHIPPO_LITELLM_API_KEY","AGENTIDE_LITELLM_API_KEY"),e=Pa("AGENTHIPPO_LITELLM_BASE_URL","AGENTIDE_LITELLM_BASE_URL"),n=process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_API_KEY,r=process.env.OPENAI_API_KEY;return{apiKey:t||n||r,baseUrl:e,useLiteLLM:!!e,litellmApiKey:t,openaiApiKey:r,anthropicApiKey:n}}function YC(t,e=bE()){if(e.useLiteLLM)return!0;let n=t.trim().toLowerCase();return n==="claude"?!!e.anthropicApiKey:n==="codex"?!!e.openaiApiKey:!0}function JC(t){return t?.manifest.spec.permissions?.fileAccess??"workspace-write"}});var Tl=T((rV,XC)=>{XC.exports={name:"agenthippo",displayName:"Agent Hippo",description:"Agent Hippo - The easiest way to build and test your AI agents",version:"1.110.47",agenthippo:{litellmImageTag:"0.2.24",hippoclawNpm:"@agenthippo-ai/hippoclaw@2026.7.28"},publisher:"agenthippo",private:!0,engines:{vscode:"^1.93.0"},enabledApiProposals:["chatParticipantAdditions","chatParticipantPrivate","languageModelThinkingPart"],activationEvents:["onStartupFinished","onCommand:agentide.customEngine.list","onCommand:agentide.engine.install","onCommand:agentide.engine.uninstall","onChatParticipant:agentide.claude","onChatParticipant:agentide.codex"],main:"./out/extension.js",contributes:{authentication:[{id:"agenthippo",label:"AgentHippo"}],chatParticipants:[{id:"agentide.claude",name:"claude",fullName:"Claude Agent",description:"AI coding agent powered by Anthropic's Claude Agent SDK",isSticky:!1},{id:"agentide.codex",name:"codex",fullName:"Codex Agent",description:"AI coding agent powered by OpenAI's Codex SDK",isSticky:!1}],mcpServerDefinitionProviders:[{id:"bundled-mcp-servers",label:"Agent Hippo Bundled MCP Servers"}],commands:[{command:"agentide.skills.syncRemote",title:"Sync Remote Skills",category:"Agent Hippo"},{command:"agentide.clearManagedResources",title:"Clear Managed Resources",category:"Agent Hippo"},{command:"agentide.showManagedResources",title:"Show Managed Resources",category:"Agent Hippo"},{command:"agentide.cleanupSessionLogs",title:"Cleanup Old Session Logs",category:"Agent Hippo"},{command:"agentide.pack.install",title:"Install Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.list",title:"List Installed Packs",category:"Agent Hippo"},{command:"agentide.customEngine.list",title:"List Custom Engines",category:"Agent Hippo"},{command:"agentide.pack.uninstall",title:"Uninstall Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.getActive",title:"Get Active Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.create",title:"Create Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.share",title:"Share Agent to User Library",category:"Agent Hippo"},{command:"agentide.pack.publish",title:"Publish Agent to Store",category:"Agent Hippo"},{command:"agentide.skill.share",title:"Save Skill to User Library",category:"Agent Hippo"},{command:"agentide.skill.publish",title:"Publish Skill to Store",category:"Agent Hippo"},{command:"agentide.mcp.share",title:"Save MCP Server to User Library",category:"Agent Hippo"},{command:"agentide.mcp.publish",title:"Publish MCP Server to Store",category:"Agent Hippo"},{command:"agenthippo.signIn",title:"Sign In to AgentHippo",category:"Agent Hippo"},{command:"agenthippo.signOut",title:"Sign Out of AgentHippo",category:"Agent Hippo"},{command:"agentide.store.find",title:"Install Packs, Skills, MCP Tools, Engines, Spotlight Views",category:"Agent Hippo"},{command:"agentide.engine.install",title:"Install Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.uninstall",title:"Uninstall Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.publish",title:"Publish Engine to Store",category:"Agent Hippo"},{command:"agentide.spotlight.publish",title:"Publish Spotlight View to Store (Full Bundle)",category:"Agent Hippo"},{command:"agentide.view.install",title:"Install Spotlight View",category:"Agent Hippo"},{command:"agentide.store.sync",title:"Sync Store Index",category:"Agent Hippo"},{command:"agentide.store.setup",title:"Setup Store Index Automation",category:"Agent Hippo"},{command:"agentide.pack.browseLibrary",title:"Browse User Library",category:"Agent Hippo"},{command:"agentide.pack.update",title:"Update Agent from User Library",category:"Agent Hippo"},{command:"agentide.pack.duplicate",title:"Duplicate Agent",category:"Agent Hippo"},{command:"agentide.pack.refresh",title:"Refresh Agent Packs",category:"Agent Hippo"},{command:"agentide.pack.resetDefault",title:"Reset Default Agent",category:"Agent Hippo"},{command:"agentide.gateway.connect",title:"Connect to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.disconnect",title:"Disconnect from Gateway",category:"Agent Hippo"},{command:"agentide.gateway.toggle",title:"Toggle Gateway Connection",category:"Agent Hippo"},{command:"agentide.gateway.status",title:"Show Gateway Status",category:"Agent Hippo"},{command:"agentide.gateway.connectSession",title:"Connect Chat to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.listSessions",title:"Show Connected Gateway Sessions",category:"Agent Hippo"},{command:"agentide.gateway.resetMappings",title:"Reset Agent Mappings (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.toggle",title:"Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.install",title:"Install Agent Anywhere (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.uninstall",title:"Uninstall Agent Anywhere (OpenClaw CLI)",category:"Agent Hippo"},{command:"agentide.anywhere.start",title:"Start Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.stop",title:"Stop Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.status",title:"Agent Anywhere Status",category:"Agent Hippo"},{command:"agentide.anywhere.connect",title:"Connect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.disconnect",title:"Disconnect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.openConfig",title:"Open Agent Anywhere Config",category:"Agent Hippo"},{command:"agentide.anywhere.openWebUI",title:"Open Agent Anywhere Web UI",category:"Agent Hippo"},{command:"agentide.anywhere.detect",title:"Detect Agent Anywhere Gateway",category:"Agent Hippo"},{command:"agentide.anywhere.meetAgent",title:"Meet Agent Anywhere...",category:"Agent Hippo"},{command:"agentide.setupCli",title:"Setup AgentHippo CLI",category:"Agent Hippo"},{command:"agentide.cli.status",title:"AgentHippo CLI Status",category:"Agent Hippo"},{command:"agentide.installBundledTools",title:"Install Bundled Tools (rg, sg, tree-sitter)",category:"Agent Hippo"},{command:"agentide.setupAnalytics",title:"Install Spotlight (OTEL + DuckDB)",category:"Agent Hippo"},{command:"agentide.analytics.toggle",title:"Manage Spotlight",category:"Agent Hippo"},{command:"agentide.analytics.start",title:"Start Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.stop",title:"Stop Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.status",title:"Show Spotlight Status",category:"Agent Hippo"},{command:"agentide.analytics.query",title:"Query Spotlight (Cost, Sessions)",category:"Agent Hippo"},{command:"agentide.analytics.openDashboard",title:"Open Spotlight Dashboard",category:"Agent Hippo"},{command:"agentide.fleet.open",title:"Open Agent Team",category:"Agent Hippo"},{command:"agentide.analytics.clearArtifacts",title:"Clear Spotlight Artifacts",category:"Agent Hippo"},{command:"agentide.analytics.regenerateDefaults",title:"Regenerate Default Charts",category:"Agent Hippo"}],menus:{ChatModePicker:[{command:"agentide.anywhere.meetAgent",group:"navigation@30",when:"agentide.anywhere.enabled && !agentide.anywhere.hidden",icon:"$(broadcast)"}]},viewsContainers:{activitybar:[{id:"agentide-analytics",title:"Agent Hippo",icon:"$(graph)"},{id:"agentide-team",title:"Agent Team",icon:"$(organization)"}]},views:{"agentide-analytics":[{type:"webview",id:"agentide.analyticsView",name:"Spotlight"}],"agentide-team":[{type:"webview",id:"agentide.teamView",name:"Agent Team"}]},configuration:{title:"Agent Hippo",properties:{"agentide.permissions.fileAccess":{type:"string",scope:"application",enum:["read-only","workspace-write","full"],default:"full",markdownDescription:"Filesystem access scope (applies to all engines).\n- `read-only`: Read/search only (no file writes)\n- `workspace-write`: Read/write within workspace folders only\n- `full`: Full filesystem access (yolo, default)\n\n**Security**: Agent manifest permissions take precedence - user cannot override stricter pack permissions."},"agentide.claude.maxThinkingTokens":{type:"number",default:1024,description:"Claude extended thinking budget (tokens). Set to 0 to disable. Requires a compatible model; Anthropic requires >=1024 for extended thinking."},"agentide.claude.cheapModel":{type:"string",default:"",description:"Optional cheap Claude model for subagents/background routing (for example, claude-haiku-4-5-20251001). Main model selection still comes from the model picker."},"agentide.sessions.retentionDays":{type:"number",default:7,minimum:1,maximum:365,description:"Number of days to retain session logs before cleanup. Cleanup runs on startup (best-effort) and via the 'Agent Hippo: Cleanup Old Session Logs' command."},"agentide.fallbackDirectory":{type:"string",scope:"machine",default:".agent-hippo",description:"Directory name (relative to home) used as workspace when no folder is open. Default: ~/.agent-hippo"},"agentide.additionalEngineDir":{type:"string",scope:"machine",default:"",description:"Additional directories to scan for custom engines. Machine-scoped: engines discovered here are executed, so a workspace must not be able to point this at attacker-controlled code."},"agentide.auth.baseUrl":{type:"string",scope:"application",default:"https://auth.agenthippo.ai",markdownDescription:"AgentHippo auth broker base URL for team sign-in and bootstrap (`agenthippo.signIn`).\n\n**Application-scoped on purpose**: this endpoint receives your PKCE authorization code and your AgentHippo access token, and its `/api/ide/bootstrap` response is written into your model-routing settings. A workspace must never be able to redirect it. Must be `https://` (plain `http://` is accepted only for loopback dev hosts)."},"agentide.cli.path":{type:"string",scope:"machine",default:"",description:"Optional absolute path to the AgentHippo CLI binary. If unset, Agent Hippo auto-detects a bundled binary or falls back to PATH. Machine-scoped: this path is executed."},"agentide.cli.installSource":{type:"string",scope:"machine",default:"",description:"Optional setup source for AgentHippo CLI. Supports HTTPS URL to a prebuilt binary, or local file path. If empty, setup builds from the local repository. Machine-scoped: this source is downloaded and executed."},"agentide.storeRepo":{type:"string",scope:"application",default:"agenthippoai/agenthippo-store",markdownDescription:"GitHub repository for pack store (owner/repo format).\n\nDefault: `agenthippoai/agenthippo-store` ([github.com/agenthippoai/agenthippo-store](https://github.com/agenthippoai/agenthippo-store))\n\nSet to your own repo (e.g., `mycompany/our-packs`) to use a private or custom store."},"agentide.store.indexUrl":{type:"string",scope:"application",default:"https://agenthippoai.github.io/agenthippo-store",markdownDescription:`Base URL for the store index (Orama + metadata are loaded from paths under this URL).
439
+ - `)}`)}function WC(){return{engine:(Pa("AGENTHIPPO_DEFAULT_ENGINE","AGENTIDE_DEFAULT_ENGINE")||"claude").trim().toLowerCase(),model:Pa("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")||"claude-sonnet-4-5-20250929"}}function qC(){return Pa("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")?.trim()||void 0}function bE(){let t=Pa("AGENTHIPPO_LITELLM_API_KEY","AGENTIDE_LITELLM_API_KEY"),e=Pa("AGENTHIPPO_LITELLM_BASE_URL","AGENTIDE_LITELLM_BASE_URL"),n=process.env.ANTHROPIC_API_KEY||process.env.CLAUDE_API_KEY,r=process.env.OPENAI_API_KEY;return{apiKey:t||n||r,baseUrl:e,useLiteLLM:!!e,litellmApiKey:t,openaiApiKey:r,anthropicApiKey:n}}function YC(t,e=bE()){if(e.useLiteLLM)return!0;let n=t.trim().toLowerCase();return n==="claude"?!!e.anthropicApiKey:n==="codex"?!!e.openaiApiKey:!0}function JC(t){return t?.manifest.spec.permissions?.fileAccess??"workspace-write"}});var Tl=T((rV,XC)=>{XC.exports={name:"agenthippo",displayName:"Agent Hippo",description:"Agent Hippo - The easiest way to build and test your AI agents",version:"1.110.48",agenthippo:{litellmImageTag:"0.2.24",hippoclawNpm:"@agenthippo-ai/hippoclaw@2026.7.28"},publisher:"agenthippo",private:!0,engines:{vscode:"^1.93.0"},enabledApiProposals:["chatParticipantAdditions","chatParticipantPrivate","languageModelThinkingPart"],activationEvents:["onStartupFinished","onCommand:agentide.customEngine.list","onCommand:agentide.engine.install","onCommand:agentide.engine.uninstall","onChatParticipant:agentide.claude","onChatParticipant:agentide.codex"],main:"./out/extension.js",contributes:{authentication:[{id:"agenthippo",label:"AgentHippo"}],chatParticipants:[{id:"agentide.claude",name:"claude",fullName:"Claude Agent",description:"AI coding agent powered by Anthropic's Claude Agent SDK",isSticky:!1},{id:"agentide.codex",name:"codex",fullName:"Codex Agent",description:"AI coding agent powered by OpenAI's Codex SDK",isSticky:!1}],mcpServerDefinitionProviders:[{id:"bundled-mcp-servers",label:"Agent Hippo Bundled MCP Servers"}],commands:[{command:"agentide.skills.syncRemote",title:"Sync Remote Skills",category:"Agent Hippo"},{command:"agentide.clearManagedResources",title:"Clear Managed Resources",category:"Agent Hippo"},{command:"agentide.showManagedResources",title:"Show Managed Resources",category:"Agent Hippo"},{command:"agentide.cleanupSessionLogs",title:"Cleanup Old Session Logs",category:"Agent Hippo"},{command:"agentide.pack.install",title:"Install Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.list",title:"List Installed Packs",category:"Agent Hippo"},{command:"agentide.customEngine.list",title:"List Custom Engines",category:"Agent Hippo"},{command:"agentide.pack.uninstall",title:"Uninstall Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.getActive",title:"Get Active Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.create",title:"Create Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.share",title:"Share Agent to User Library",category:"Agent Hippo"},{command:"agentide.pack.publish",title:"Publish Agent to Store",category:"Agent Hippo"},{command:"agentide.skill.share",title:"Save Skill to User Library",category:"Agent Hippo"},{command:"agentide.skill.publish",title:"Publish Skill to Store",category:"Agent Hippo"},{command:"agentide.mcp.share",title:"Save MCP Server to User Library",category:"Agent Hippo"},{command:"agentide.mcp.publish",title:"Publish MCP Server to Store",category:"Agent Hippo"},{command:"agenthippo.signIn",title:"Sign In to AgentHippo",category:"Agent Hippo"},{command:"agenthippo.signOut",title:"Sign Out of AgentHippo",category:"Agent Hippo"},{command:"agentide.store.find",title:"Install Packs, Skills, MCP Tools, Engines, Spotlight Views",category:"Agent Hippo"},{command:"agentide.engine.install",title:"Install Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.uninstall",title:"Uninstall Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.publish",title:"Publish Engine to Store",category:"Agent Hippo"},{command:"agentide.spotlight.publish",title:"Publish Spotlight View to Store (Full Bundle)",category:"Agent Hippo"},{command:"agentide.view.install",title:"Install Spotlight View",category:"Agent Hippo"},{command:"agentide.store.sync",title:"Sync Store Index",category:"Agent Hippo"},{command:"agentide.store.setup",title:"Setup Store Index Automation",category:"Agent Hippo"},{command:"agentide.pack.browseLibrary",title:"Browse User Library",category:"Agent Hippo"},{command:"agentide.pack.update",title:"Update Agent from User Library",category:"Agent Hippo"},{command:"agentide.pack.duplicate",title:"Duplicate Agent",category:"Agent Hippo"},{command:"agentide.pack.refresh",title:"Refresh Agent Packs",category:"Agent Hippo"},{command:"agentide.pack.resetDefault",title:"Reset Default Agent",category:"Agent Hippo"},{command:"agentide.gateway.connect",title:"Connect to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.disconnect",title:"Disconnect from Gateway",category:"Agent Hippo"},{command:"agentide.gateway.toggle",title:"Toggle Gateway Connection",category:"Agent Hippo"},{command:"agentide.gateway.status",title:"Show Gateway Status",category:"Agent Hippo"},{command:"agentide.gateway.connectSession",title:"Connect Chat to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.listSessions",title:"Show Connected Gateway Sessions",category:"Agent Hippo"},{command:"agentide.gateway.resetMappings",title:"Reset Agent Mappings (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.toggle",title:"Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.install",title:"Install Agent Anywhere (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.uninstall",title:"Uninstall Agent Anywhere (OpenClaw CLI)",category:"Agent Hippo"},{command:"agentide.anywhere.start",title:"Start Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.stop",title:"Stop Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.status",title:"Agent Anywhere Status",category:"Agent Hippo"},{command:"agentide.anywhere.connect",title:"Connect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.disconnect",title:"Disconnect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.openConfig",title:"Open Agent Anywhere Config",category:"Agent Hippo"},{command:"agentide.anywhere.openWebUI",title:"Open Agent Anywhere Web UI",category:"Agent Hippo"},{command:"agentide.anywhere.detect",title:"Detect Agent Anywhere Gateway",category:"Agent Hippo"},{command:"agentide.anywhere.meetAgent",title:"Meet Agent Anywhere...",category:"Agent Hippo"},{command:"agentide.setupCli",title:"Setup AgentHippo CLI",category:"Agent Hippo"},{command:"agentide.cli.status",title:"AgentHippo CLI Status",category:"Agent Hippo"},{command:"agentide.installBundledTools",title:"Install Bundled Tools (rg, sg, tree-sitter)",category:"Agent Hippo"},{command:"agentide.setupAnalytics",title:"Install Spotlight (OTEL + DuckDB)",category:"Agent Hippo"},{command:"agentide.analytics.toggle",title:"Manage Spotlight",category:"Agent Hippo"},{command:"agentide.analytics.start",title:"Start Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.stop",title:"Stop Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.status",title:"Show Spotlight Status",category:"Agent Hippo"},{command:"agentide.analytics.query",title:"Query Spotlight (Cost, Sessions)",category:"Agent Hippo"},{command:"agentide.analytics.openDashboard",title:"Open Spotlight Dashboard",category:"Agent Hippo"},{command:"agentide.fleet.open",title:"Open Agent Team",category:"Agent Hippo"},{command:"agentide.analytics.clearArtifacts",title:"Clear Spotlight Artifacts",category:"Agent Hippo"},{command:"agentide.analytics.regenerateDefaults",title:"Regenerate Default Charts",category:"Agent Hippo"}],menus:{ChatModePicker:[{command:"agentide.anywhere.meetAgent",group:"navigation@30",when:"agentide.anywhere.enabled && !agentide.anywhere.hidden",icon:"$(broadcast)"}]},viewsContainers:{activitybar:[{id:"agentide-analytics",title:"Agent Hippo",icon:"$(graph)"},{id:"agentide-team",title:"Agent Team",icon:"$(organization)"}]},views:{"agentide-analytics":[{type:"webview",id:"agentide.analyticsView",name:"Spotlight"}],"agentide-team":[{type:"webview",id:"agentide.teamView",name:"Agent Team"}]},configuration:{title:"Agent Hippo",properties:{"agentide.permissions.fileAccess":{type:"string",scope:"application",enum:["read-only","workspace-write","full"],default:"full",markdownDescription:"Filesystem access scope (applies to all engines).\n- `read-only`: Read/search only (no file writes)\n- `workspace-write`: Read/write within workspace folders only\n- `full`: Full filesystem access (yolo, default)\n\n**Security**: Agent manifest permissions take precedence - user cannot override stricter pack permissions."},"agentide.claude.maxThinkingTokens":{type:"number",default:1024,description:"Claude extended thinking budget (tokens). Set to 0 to disable. Requires a compatible model; Anthropic requires >=1024 for extended thinking."},"agentide.claude.cheapModel":{type:"string",default:"",description:"Optional cheap Claude model for subagents/background routing (for example, claude-haiku-4-5-20251001). Main model selection still comes from the model picker."},"agentide.sessions.retentionDays":{type:"number",default:7,minimum:1,maximum:365,description:"Number of days to retain session logs before cleanup. Cleanup runs on startup (best-effort) and via the 'Agent Hippo: Cleanup Old Session Logs' command."},"agentide.fallbackDirectory":{type:"string",scope:"machine",default:".agent-hippo",description:"Directory name (relative to home) used as workspace when no folder is open. Default: ~/.agent-hippo"},"agentide.additionalEngineDir":{type:"string",scope:"machine",default:"",description:"Additional directories to scan for custom engines. Machine-scoped: engines discovered here are executed, so a workspace must not be able to point this at attacker-controlled code."},"agentide.auth.baseUrl":{type:"string",scope:"application",default:"https://auth.agenthippo.ai",markdownDescription:"AgentHippo auth broker base URL for team sign-in and bootstrap (`agenthippo.signIn`).\n\n**Application-scoped on purpose**: this endpoint receives your PKCE authorization code and your AgentHippo access token, and its `/api/ide/bootstrap` response is written into your model-routing settings. A workspace must never be able to redirect it. Must be `https://` (plain `http://` is accepted only for loopback dev hosts)."},"agentide.cli.path":{type:"string",scope:"machine",default:"",description:"Optional absolute path to the AgentHippo CLI binary. If unset, Agent Hippo auto-detects a bundled binary or falls back to PATH. Machine-scoped: this path is executed."},"agentide.cli.installSource":{type:"string",scope:"machine",default:"",description:"Optional setup source for AgentHippo CLI. Supports HTTPS URL to a prebuilt binary, or local file path. If empty, setup builds from the local repository. Machine-scoped: this source is downloaded and executed."},"agentide.storeRepo":{type:"string",scope:"application",default:"agenthippoai/agenthippo-store",markdownDescription:"GitHub repository for pack store (owner/repo format).\n\nDefault: `agenthippoai/agenthippo-store` ([github.com/agenthippoai/agenthippo-store](https://github.com/agenthippoai/agenthippo-store))\n\nSet to your own repo (e.g., `mycompany/our-packs`) to use a private or custom store."},"agentide.store.indexUrl":{type:"string",scope:"application",default:"https://agenthippoai.github.io/agenthippo-store",markdownDescription:`Base URL for the store index (Orama + metadata are loaded from paths under this URL).
440
440
 
441
441
  Default: \`https://agenthippoai.github.io/agenthippo-store\`
442
442
 
@@ -473,13 +473,13 @@ When enabled, JSONL trace files are incrementally converted to an indexed DuckDB
473
473
  **Application-scoped on purpose**: skills fetched from here become agent instructions and tool definitions on this machine, so this is an install source.`},"agentide.skills.remote.syncOnStartup":{type:"boolean",scope:"application",default:!0,description:"Sync remote skills on extension startup (requires agentide.skills.remote.enabled)."},"agentide.skills.remote.allowOverwriteLocal":{type:"boolean",scope:"application",default:!1,description:"Allow remote skills to overwrite locally-authored skill files of the same name."},"agentide.skills.remote.timeoutMs":{type:"number",scope:"application",default:8e3,minimum:500,maximum:12e4,description:"Timeout (milliseconds) for remote skill registry requests."}}}},capabilities:{untrustedWorkspaces:{supported:"limited",description:"Agent Hippo runs AI agents that read your code, spawn processes, and send prompts to remote model endpoints. In an untrusted workspace the security-relevant settings below are ignored in favour of your user/application values, and remote agent packs (`spec.remote.url`) will not receive your AgentHippo access token without an explicit per-host approval.",restrictedConfigurations:["agentide.auth.baseUrl","agentide.storeRepo","agentide.store.indexUrl","agentide.anywhere.installSource","agentide.anywhere.enabled","agentide.anywhere.autoStart","agentide.anywhere.autoConnect","agentide.anywhere.port","agentide.anywhere.hidden","agentide.cli.path","agentide.cli.installSource","agentide.additionalEngineDir","agentide.fallbackDirectory","agentide.permissions.fileAccess","agentide.gateway.url","agentide.gateway.token","agentide.gateway.autoConnect","agentide.gateway.autoRegister","agentide.gateway.agents","agentide.providers.litellm.baseUrl","agentide.providers.anthropic.baseUrl","agentide.AgentHippoModelGateway.url","agentide.skills.remote.enabled","agentide.skills.remote.registryUrl","agentide.skills.remote.syncOnStartup","agentide.skills.remote.allowOverwriteLocal","agentide.analytics.fleetSources","agentide.analytics.fleetScriptSources","agentide.analytics.defaultDashboardPrompt","agentide.analytics.duckdb.tempDirectory"]}},dependencies:{"@agenthippo-ai/evidence-ship":"0.2.4","@anthropic-ai/claude-agent-sdk":"0.3.317","@anthropic-ai/sdk":"1.4.0","@cfworker/json-schema":"^4.1.1","@mariozechner/pi-ai":"0.54.0","@modelcontextprotocol/sdk":"^1.30.0","@openai/codex":"0.166.0","@openai/codex-sdk":"0.166.0","@orama/orama":"^3.1.6",commander:"^14.0.2",hono:"^4.11.5","js-yaml":"^4.1.1",ws:"^8.22.0",zod:"^4.3.6"},devDependencies:{"@types/js-yaml":"^4.0.9","@types/mocha":"^10.0.10","@types/node":"^25.x","@types/ws":"^8.18.2"},scripts:{postinstall:"node ./scripts/vendor-tools.mjs --skip-if-present || true",compile:"node ../../node_modules/typescript/bin/tsc -p ./ && node ./scripts/generate-embedded-custom-engine-runner.mjs && node ./scripts/copy-compile-assets.mjs",watch:"node ../../node_modules/typescript/bin/tsc -watch -p ./",test:"node ../../node_modules/mocha/bin/mocha","test:serve-load":"bash ../../scripts/load/run-serve-load.sh","test:serve-load:full":"bash ../../scripts/load/run-serve-load.sh --full",cli:"node out/cli/index.js","build:tools":"node ./scripts/vendor-tools.mjs --clean","build:cli":"./scripts/build-cli.sh","build:cli:macos-arm64":"./scripts/build-cli.sh --target bun-darwin-arm64 --outfile dist/agenthippo-macos-arm64","build:cli:macos-x64":"./scripts/build-cli.sh --target bun-darwin-x64 --outfile dist/agenthippo-macos-x64","build:cli:linux-x64":"./scripts/build-cli.sh --target bun-linux-x64 --outfile dist/agenthippo-linux-x64","build:cli:linux-arm64":"./scripts/build-cli.sh --target bun-linux-arm64 --outfile dist/agenthippo-linux-arm64"}}});var xi=T(St=>{"use strict";var zC=St&&St.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),QC=St&&St.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ef=St&&St.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&zC(n,e,r[s]);return QC(n,e),n}})();Object.defineProperty(St,"__esModule",{value:!0});St.getDepsDir=Ro;St.resolveFromOwnDeps=IE;St.getClaudeAgentSdkPlatformPackageName=rk;St.resolveClaudeCodeExecutablePath=Ol;St.resolveClaudeCodeFromOwnDeps=NE;St.getUnsupportedClaudePlatformHint=ik;St.areDepsInstalled=RE;St.installDeps=CE;St.isAutoInstallDisabled=kE;St.ensureDeps=ok;St.getClaudeSdkCliPath=ak;St.getCodexSdkBinaryPath=ck;St.installedEngineVersion=uk;var gn=Ef(require("fs")),ZC=Ef(require("os")),ut=Ef(require("path")),vE=require("child_process"),es=en(),vl=ot();function ek(){let e=(()=>{try{return Tl()}catch{return}})()?.dependencies??{};return{"@anthropic-ai/claude-agent-sdk":e["@anthropic-ai/claude-agent-sdk"]??"0.3.317","@openai/codex":e["@openai/codex"]??"0.166.0","@openai/codex-sdk":e["@openai/codex-sdk"]??"0.166.0"}}var OE=ek();function Ro(){let t=ut.dirname(process.execPath),e=ut.join(t,vl.AGENTIDE_DEPS_DIR_NAME);if(gn.existsSync(e))return e;try{return gn.accessSync(t,gn.constants.W_OK),e}catch{return ut.join(ZC.homedir(),vl.AGENTIDE_DIR_NAME,vl.AGENTIDE_DEPS_DIR_NAME)}}function IE(t,e){let n=__dirname;for(let r=0;r<8;r++){let s=ut.join(n,"node_modules",...t.split("/"),...e.split("/"));try{if(gn.existsSync(s))return s}catch{}let i=ut.dirname(n);if(i===n)break;n=i}}function No(t){try{return gn.existsSync(t)}catch{return!1}}function _f(t,e){if(e==="x64")return t==="musl"?"/lib/ld-musl-x86_64.so.1":"/lib64/ld-linux-x86-64.so.2";if(e==="arm64")return t==="musl"?"/lib/ld-musl-aarch64.so.1":"/lib/ld-linux-aarch64.so.1"}function PE(t,e){return t===process.platform&&e===process.arch}var bl;function tk(){return bl||(bl=(()=>{try{let s=process.report?.getReport?.();if((typeof s=="object"&&s?s.header:void 0)?.glibcVersionRuntime)return"glibc"}catch{}let t=_f("glibc",process.arch),e=_f("musl",process.arch),n=t?No(t):!1,r=e?No(e):!1;if(r&&!n)return"musl";if(n&&!r)return"glibc";if(No("/etc/alpine-release"))return"musl";try{if(/musl/i.test((0,vE.execSync)("ldd --version 2>&1 || true",{encoding:"utf8"})))return"musl"}catch{}return"glibc"})(),bl)}function nk(t,e){return PE(t,e)?n=>{let r=_f(n,e);return r?No(r):!1}:()=>!0}function yf(t={}){let e=t.platform??process.platform,n=t.arch??process.arch,r=n==="arm64"?"arm64":n==="x64"?"x64":void 0;if(!r)return[];if(e==="darwin")return[{name:`@anthropic-ai/claude-agent-sdk-darwin-${r}`}];if(e==="win32")return[{name:`@anthropic-ai/claude-agent-sdk-win32-${r}`}];if(e==="linux"){let s=t.libc??(PE(e,n)?tk():"glibc"),i=s==="musl"?"glibc":"musl",o=a=>({name:`@anthropic-ai/claude-agent-sdk-linux-${r}${a==="musl"?"-musl":""}`,libc:a});return[o(s),o(i)]}return[]}function rk(t={}){return yf(t)[0]?.name}function sk(t=process.platform){return t==="win32"?"claude.exe":"claude"}function Ol(t,e={}){let n=e.platform??process.platform,r=e.arch??process.arch,s=e.hasLoader??nk(n,r),i=sk(n),o;for(let{name:c,libc:l}of yf(e)){let u=ut.join(t,...c.split("/"),i);if(No(u)){if(l&&!s(l)){o??=u;continue}return u}}let a=ut.join(t,"@anthropic-ai","claude-agent-sdk","cli.js");return No(a)?a:o}function NE(){let t=__dirname;for(let e=0;e<8;e++){let n=ut.join(t,"node_modules"),r=Ol(n);if(r)return r;let s=ut.dirname(t);if(s===t)break;t=s}}function ik(t={}){if(yf(t).length>0)return;let e=t.platform??process.platform,n=t.arch??process.arch;return`@anthropic-ai/claude-agent-sdk ships no prebuilt Claude Code binary for ${e}-${n}.`}function RE(){let t=Ro(),e=ut.join(t,"node_modules"),n=ut.join(t,"package.json");try{if(!gn.existsSync(n))return!1;let o=gn.readFileSync(n,"utf8"),c=JSON.parse(o).dependencies??{};for(let[l,u]of Object.entries(OE))if(c[l]!==u)return!1}catch{return!1}let r=Ol(e),s=ut.join(e,"@openai","codex","bin","codex.js"),i=ut.join(e,"@openai","codex-sdk","package.json");return!!r&&gn.existsSync(s)&&gn.existsSync(i)}async function CE(t=!1){let e=Ro();console.log(`${es.COLORS.cyan}Installing engine dependencies...${es.COLORS.reset}`),t&&console.log(` Directory: ${e}`),gn.mkdirSync(e,{recursive:!0});let n={name:vl.AGENTIDE_DEPS_PACKAGE_NAME,version:"1.0.0",private:!0,dependencies:OE};gn.writeFileSync(ut.join(e,"package.json"),JSON.stringify(n,null,2)+`
474
474
  `);try{let r=process.platform==="win32"?"npm.cmd":"npm";(0,vE.execSync)(`${r} install --production --no-audit --no-fund`,{cwd:e,stdio:t?"inherit":"pipe"}),console.log(`${es.COLORS.green}Dependencies installed${es.COLORS.reset}`)}catch(r){throw console.error(`${es.COLORS.red}Error: Failed to install dependencies${es.COLORS.reset}`),r instanceof Error&&console.error(` ${r.message}`),r}}function kE(){let t=(process.env.AGENTHIPPO_NO_AUTO_INSTALL??process.env.AGENTIDE_NO_AUTO_INSTALL??"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}async function ok(t=!1){if(!RE()){if(NE()&&IE("@openai/codex","bin/codex.js")){t&&console.error(`${es.COLORS.dim}Engine SDKs resolved from the CLI's own node_modules \u2014 skipping install.${es.COLORS.reset}`);return}if(kE()){t&&console.error(`${es.COLORS.dim}AGENTHIPPO_NO_AUTO_INSTALL set \u2014 skipping engine dependency install (expecting a self-contained image).${es.COLORS.reset}`);return}await CE(t)}}function ak(){return Ol(ut.join(Ro(),"node_modules"))}function ck(){let t=Ro(),e=ut.join(t,"node_modules","@openai","codex","bin","codex.js");if(gn.existsSync(e))return e;let n=ut.join(t,"node_modules","@openai","codex-sdk"),r=lk();if(!r)return;let s=process.platform==="win32"?"codex.exe":"codex",i=ut.join(n,"vendor",r,"codex",s);return gn.existsSync(i)?i:void 0}function lk(){let t=process.arch,e=process.platform;if(e==="darwin")return t==="arm64"?"aarch64-apple-darwin":"x86_64-apple-darwin";if(e==="linux")return t==="arm64"?"aarch64-unknown-linux-musl":"x86_64-unknown-linux-musl";if(e==="win32")return t==="arm64"?"aarch64-pc-windows-msvc":"x86_64-pc-windows-msvc"}function uk(t){let e=t==="codex"?ut.join("@openai","codex"):t==="claude"?ut.join("@anthropic-ai","claude-agent-sdk"):void 0;if(!e)return;let n=[ut.join(Ro(),"node_modules",e,"package.json"),ut.join("/usr/local/lib/node_modules",e,"package.json"),ut.join("/usr/lib/node_modules",e,"package.json")];for(let r of n)try{if(!gn.existsSync(r))continue;let s=JSON.parse(gn.readFileSync(r,"utf8"));if(s.version)return s.version}catch{}}});var en=T(Dt=>{"use strict";var dk=Dt&&Dt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fk=Dt&&Dt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wf=Dt&&Dt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dk(n,e,r[s]);return fk(n,e),n}})();Object.defineProperty(Dt,"__esModule",{value:!0});Dt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND=Dt.COLORS=void 0;Dt.getBinaryDir=Pl;Dt.findClaudeCodePath=gk;Dt.findCodexPath=hk;Dt.findBundledBasePromptsDir=mk;Dt.getLiteLLMQuickstartHintLines=_k;var pk=wf(require("os")),Bi=wf(require("path")),cr=wf(require("fs")),$E=require("child_process"),Il=xi();function Pl(){return Bi.dirname(process.execPath)}function gk(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;let t=(0,Il.getClaudeSdkCliPath)();if(t)return t;let e=(0,Il.resolveClaudeCodeFromOwnDeps)();if(e)return e;let n=Pl(),r=Bi.join(n,"claude-sdk","cli.js");try{return cr.accessSync(r,cr.constants.R_OK),r}catch{}try{let o=process.platform==="win32"?"where claude":"which claude",a=(0,$E.execSync)(o,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(a)return a.split(`
475
475
  `)[0]}catch{}let s=pk.homedir(),i=[Bi.join(s,".npm-global","bin","claude"),Bi.join(s,".local","bin","claude"),"/usr/local/bin/claude","/opt/homebrew/bin/claude"];for(let o of i)try{return cr.accessSync(o,cr.constants.X_OK),o}catch{}}function hk(){if(process.env.CODEX_PATH)return process.env.CODEX_PATH;let t=(0,Il.resolveFromOwnDeps)("@openai/codex","bin/codex.js");if(t)return t;let e=(0,Il.getCodexSdkBinaryPath)();if(e)return e;let n=Pl(),r=process.platform==="win32"?"codex.exe":"codex",s=Bi.join(n,"codex-sdk",r);try{return cr.accessSync(s,cr.constants.X_OK),s}catch{}try{let i=process.platform==="win32"?"where codex":"which codex",o=(0,$E.execSync)(i,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(o)return o.split(`
476
- `)[0]}catch{}}function mk(){let t=process.env.AGENTHIPPO_BASE_PROMPTS_DIR||process.env.AGENTIDE_BASE_PROMPTS_DIR;if(t)try{return cr.accessSync(t,cr.constants.R_OK),t}catch{}let e=Pl(),n=Bi.join(e,"base-prompts");try{return cr.accessSync(n,cr.constants.R_OK),n}catch{}let r=Bi.resolve(__dirname,"..","base-prompts");try{return cr.accessSync(r,cr.constants.R_OK),r}catch{}}Dt.COLORS={reset:"\x1B[0m",cyan:"\x1B[36m",gray:"\x1B[90m",dim:"\x1B[2m",blue:"\x1B[34m",green:"\x1B[32m",red:"\x1B[31m",yellow:"\x1B[33m"};Dt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND='AGENTHIPPO_LITELLM_BASE_URL="http://localhost:4000" AGENTHIPPO_LITELLM_API_KEY="dummy" AGENTHIPPO_DEFAULT_MODEL="litellm/gpt-5.5" AGENTHIPPO_DEFAULT_ENGINE="codex" agenthippo ask "Reply with exactly: CLI_TEST_OK"';function _k(){return["Try local LiteLLM quickstart:",` ${Dt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND}`]}});var Co=T(Is=>{"use strict";Object.defineProperty(Is,"__esModule",{value:!0});Is.TurnRegistry=Is.DEFAULT_TURN_DEADLINE_MS=void 0;Is.hashNonce=Nl;Is.isNonceShaped=LE;var DE=require("crypto");Is.DEFAULT_TURN_DEADLINE_MS=30*6e4;function Nl(t){return(0,DE.createHash)("sha256").update(t).digest("hex")}var Ek=/^[0-9a-f]{32}$/;function LE(t){return Ek.test(t)}var Sf=class{entries=new Map;generations=new Map;generationCounter=0;register(e,n){this.prune();let r=n?.renewNonce?.trim()||void 0;if(r!==void 0&&!LE(r))throw new Error("renewNonce must be a previously minted turn nonce (32 lowercase hex chars)");let s=r??(0,DE.randomBytes)(16).toString("hex"),i=Nl(s);this.entries.set(i,{userId:e.userId,sessionKey:e.sessionKey,inboundToken:e.inboundToken,egressStoreKey:e.egressStoreKey,deadline:e.deadline??Date.now()+Is.DEFAULT_TURN_DEADLINE_MS});let o=++this.generationCounter;this.generations.set(i,o);let a=!1;return{nonce:s,release:()=>{a||(a=!0,this.generations.get(i)===o&&(this.entries.delete(i),this.generations.delete(i)))}}}releaseByNonce(e){let n=Nl(e);return this.generations.delete(n),this.entries.delete(n)}resolve(e,n=Date.now()){let r=Nl(e),s=this.entries.get(r);if(s){if(n>s.deadline){this.entries.delete(r),this.generations.delete(r);return}return s}}prune(e=Date.now()){for(let[n,r]of this.entries)e>r.deadline&&(this.entries.delete(n),this.generations.delete(n))}get size(){return this.entries.size}};Is.TurnRegistry=Sf});var bf=T(lr=>{"use strict";var yk=lr&&lr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),wk=lr&&lr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sk=lr&&lr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&yk(n,e,r[s]);return wk(n,e),n}})();Object.defineProperty(lr,"__esModule",{value:!0});lr.GrantStore=void 0;lr.userKeyHash=Af;lr.parseGrantKey=Ak;var Na=require("crypto"),Fi=require("fs"),ME=Sk(require("path")),GE=1,UE="agenthippo-grant:v1:";function Af(t){return(0,Na.createHash)("sha256").update(t).digest("hex")}function Ak(t){let e=t.trim(),n=/^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):Buffer.from(e,"base64");if(n.length!==32)throw new Error("the grant store key must be 32 bytes, base64 or hex (e.g. `openssl rand -base64 32`)");return n}var Tf=class{dir;key;chains=new Map;constructor(e,n){if(this.dir=e,this.key=n,n.length!==32)throw new Error("GrantStore key must be 32 bytes")}file(e){return ME.join(this.dir,`${e}.grant`)}encrypt(e,n,r){let s=(0,Na.randomBytes)(12),i=(0,Na.createCipheriv)("aes-256-gcm",this.key,s);i.setAAD(Buffer.from(UE+e));let o=Buffer.concat([i.update(JSON.stringify({userId:n,grants:r}),"utf8"),i.final()]);return JSON.stringify({v:GE,iv:s.toString("base64"),tag:i.getAuthTag().toString("base64"),data:o.toString("base64")})}decrypt(e,n){let r=JSON.parse(n);if(r.v!==GE)throw new Error(`unsupported grant file format ${r.v}`);let s=(0,Na.createDecipheriv)("aes-256-gcm",this.key,Buffer.from(r.iv,"base64"));s.setAAD(Buffer.from(UE+e)),s.setAuthTag(Buffer.from(r.tag,"base64"));let i=Buffer.concat([s.update(Buffer.from(r.data,"base64")),s.final()]).toString("utf8");return JSON.parse(i)}async get(e){let n=Af(e),r;try{r=await Fi.promises.readFile(this.file(n),"utf8")}catch(i){if(i.code==="ENOENT")return{};throw i}let s=this.decrypt(n,r);if(s.userId!==e)throw new Error("grant record does not belong to this user");return s.grants??{}}async update(e,n){let r=Af(e),i=(this.chains.get(r)??Promise.resolve()).catch(()=>{}).then(async()=>{let o=await n(await this.get(e));return await this.write(r,e,o),o});this.chains.set(r,i);try{return await i}finally{this.chains.get(r)===i&&this.chains.delete(r)}}async write(e,n,r){let s=this.file(e);if(!r.google&&!r.plaid?.items.length){await Fi.promises.rm(s,{force:!0});return}await Fi.promises.mkdir(this.dir,{recursive:!0,mode:448});let o=`${s}.${(0,Na.randomBytes)(6).toString("hex")}.tmp`;await Fi.promises.writeFile(o,this.encrypt(e,n,r),{mode:384}),await Fi.promises.rename(o,s)}async list(){let e;try{e=await Fi.promises.readdir(this.dir)}catch(r){if(r.code==="ENOENT")return[];throw r}let n=[];for(let r of e.filter(s=>/^[0-9a-f]{64}\.grant$/.test(s)).sort())try{n.push(this.decrypt(r.slice(0,64),await Fi.promises.readFile(ME.join(this.dir,r),"utf8")))}catch(s){n.push({file:r,error:s instanceof Error?s.message:String(s)})}return n}};lr.GrantStore=Tf});var Ra=T(Hn=>{"use strict";var Tk=Hn&&Hn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),bk=Hn&&Hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),vk=Hn&&Hn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Tk(n,e,r[s]);return bk(n,e),n}})();Object.defineProperty(Hn,"__esModule",{value:!0});Hn.StoredGrantProvider=Hn.ConnectError=void 0;Hn.readStoredGrantConfig=Pk;var $o=require("crypto"),Ok=vk(require("fs")),Cl=bf(),Ik=["AGENTHIPPO_GRANT_STORE_DIR","AGENTHIPPO_GRANT_STORE_KEY","AGENTHIPPO_GRANT_STORE_KEY_FILE","AGENTHIPPO_CONNECT_BASE_URL","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET_FILE","AGENTHIPPO_PLAID_CLIENT_ID","AGENTHIPPO_PLAID_SECRET","AGENTHIPPO_PLAID_SECRET_FILE","AGENTHIPPO_PLAID_ENV","AGENTHIPPO_PLAID_PRODUCTS","AGENTHIPPO_PLAID_COUNTRY_CODES","AGENTHIPPO_CONNECT_TICKET_ONLY"];function vf(t,e){let n=t[`${e}_FILE`]?.trim();return n?Ok.readFileSync(n,"utf8").trim()||void 0:t[e]?.trim()||void 0}function HE(t,e){return(t?.trim()||e).split(",").map(n=>n.trim()).filter(Boolean)}var jE=new WeakMap;function Pk(t=process.env){let e=jE.get(t);if(e)return e;try{let n=t.AGENTHIPPO_GRANT_STORE_DIR?.trim(),r=vf(t,"AGENTHIPPO_GRANT_STORE_KEY");if(!n||!r)throw new Error("provider=stored-grant needs AGENTHIPPO_GRANT_STORE_DIR and AGENTHIPPO_GRANT_STORE_KEY (32 bytes, base64 or hex, e.g. `openssl rand -base64 32`; or AGENTHIPPO_GRANT_STORE_KEY_FILE)");let s=t.AGENTHIPPO_PLAID_ENV?.trim()||"sandbox";if(s!=="sandbox"&&s!=="production")throw new Error(`AGENTHIPPO_PLAID_ENV must be sandbox or production (got ${s})`);let i=t.AGENTHIPPO_CONNECT_BASE_URL?.trim().replace(/\/+$/,"");if(i&&!/^https?:\/\/[^/]+/.test(i))throw new Error(`AGENTHIPPO_CONNECT_BASE_URL must be an http(s) URL (got ${i})`);let o=t.AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID?.trim(),a=vf(t,"AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET"),c=t.AGENTHIPPO_PLAID_CLIENT_ID?.trim(),l=vf(t,"AGENTHIPPO_PLAID_SECRET"),u={store:new Cl.GrantStore(n,(0,Cl.parseGrantKey)(r)),connectBaseUrl:i||void 0,google:o&&a?{clientId:o,clientSecret:a}:void 0,plaid:c&&l?{env:s,clientId:c,secret:l,products:HE(t.AGENTHIPPO_PLAID_PRODUCTS,"transactions"),countryCodes:HE(t.AGENTHIPPO_PLAID_COUNTRY_CODES,"US")}:void 0,ticketOnly:t.AGENTHIPPO_CONNECT_TICKET_ONLY?.trim()==="1"};return jE.set(t,u),u}finally{for(let n of Ik)delete t[n]}}var Lt=class extends Error{status;constructor(e,n){super(n),this.status=e}};Hn.ConnectError=Lt;var xE={gmail:["https://www.googleapis.com/auth/gmail.modify"],calendar:["https://www.googleapis.com/auth/calendar"],drive:["https://www.googleapis.com/auth/drive.readonly","https://www.googleapis.com/auth/drive.file"]},Rl=15*6e4,Nk=5*6e4,BE=new Set(["ITEM_NOT_FOUND","INVALID_ACCESS_TOKEN"]),ko=t=>(0,$o.createHash)("sha256").update(t).digest("hex");function Rk(t){try{let e=JSON.parse(Buffer.from(String(t).split(".")[1],"base64url").toString("utf8"));return typeof e.email=="string"?e.email:void 0}catch{return}}var Ck=3e4,Of=class{cfg;name="stored-grant";tools;tickets=new Map;googleFlows=new Map;bankFlows=new Map;googleTokens=new Map;changeListeners=[];constructor(e){this.cfg=e,this.tools=[this.statusTool(),this.connectTool(),this.disconnectTool()]}onGrantsChanged(e){this.changeListeners.push(e)}changed(e){for(let n of this.changeListeners)n(e)}get connectBaseUrl(){return this.cfg.connectBaseUrl}get http(){let e=this.cfg.fetchImpl??fetch;return((n,r)=>e(n,{signal:AbortSignal.timeout(Ck),...r}))}now(){return this.cfg.now?.()??Date.now()}async acquire({userId:e}){if(!e?.trim())throw new Error("No verified user (fail-closed)");let n=await this.cfg.store.get(e),r=this.now()+Nk,s;if(!this.cfg.google)s={status:"not_configured"};else if(!n.google)s={status:"not_connected"};else try{let c=await this.googleAccessToken(e,n.google);s={status:"connected",accessToken:c.accessToken,email:n.google.email,scopes:n.google.scopes},r=Math.min(r,c.expiresAt-6e4)}catch(c){let l=c instanceof Error?c.message:String(c),u=c.reconnect;s={status:u?"reconnect_required":"unavailable",error:l},u||(r=this.now())}let i,o=n.plaid?.items??[];if(!this.cfg.plaid)i={status:"not_configured"};else if(!o.length)i={status:"not_connected"};else{let c=this.cfg.plaid;i={status:"connected",env:c.env,clientId:c.clientId,secret:c.secret,items:o.map(l=>({item_id:l.itemId,access_token:l.accessToken,env:l.env,institution:l.institution,...l.replacedBy?{replaced_by:l.replacedBy}:{}}))}}return{expiresAt:r,secretRef:{google:s,plaid:i}}}async googleAccessToken(e,n){let r=ko(n.refreshToken),s=this.googleTokens.get(e);if(s&&s.refreshHash===r&&s.expiresAt>this.now()+6e4)return s;let i=this.cfg.google,o=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i.clientId,client_secret:i.clientSecret,refresh_token:n.refreshToken,grant_type:"refresh_token"})}),a=await o.json().catch(()=>({}));if(!o.ok||!a.access_token)throw Object.assign(new Error(`google token: ${a.error??o.status} ${a.error_description??""}`.trim()),{reconnect:a.error==="invalid_grant"});let c={accessToken:a.access_token,expiresAt:this.now()+(a.expires_in??3600)*1e3,refreshHash:r};return this.googleTokens.set(e,c),c}async plaid(e,n){let r=this.cfg.plaid;if(!r)throw new Error("bank connections are not set up on this deployment");let s=await this.http(`https://${r.env}.plaid.com${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:r.clientId,secret:r.secret,...n})}),i=await s.json().catch(()=>({}));if(!s.ok)throw Object.assign(new Error(`plaid ${e}: ${i.error_code} ${i.error_message}`),{code:i.error_code});return i}prune(){let e=this.now();for(let n of[this.tickets,this.googleFlows,this.bankFlows])for(let[r,s]of n)s.expiresAt<=e&&n.delete(r)}take(e,n){if(!n)return;let r=ko(n),s=e.get(r);return e.delete(r),s&&s.expiresAt>this.now()?s:void 0}createTicket(e,n,r=[]){this.prune();let s=(0,$o.randomBytes)(24).toString("base64url");return this.tickets.set(ko(s),{userId:e,service:n,scopes:r,expiresAt:this.now()+Rl}),s}checkBrowserUser(e,n){if(n===void 0){if(this.cfg.ticketOnly)return;throw new Lt(401,"This page only works when opened through this deployment's sign-in. (Operator: route /connect/ through the identity edge, like the chat endpoint.)")}if(n.trim().toLowerCase()!==e.trim().toLowerCase())throw new Lt(403,"This link was made for a different account. Sign in as the person who asked for it, or ask your agent for a new link.")}requireBase(){if(!this.cfg.connectBaseUrl)throw new Lt(500,"This deployment has no AGENTHIPPO_CONNECT_BASE_URL.");return this.cfg.connectBaseUrl}async startConnect(e,n){let r=this.take(this.tickets,e);if(!r)throw new Lt(410,"This link has expired or was already used. Ask your agent for a new one.");this.checkBrowserUser(r.userId,n);let s=this.requireBase();if(r.service==="google"){let c=this.cfg.google;if(!c)throw new Lt(500,"Google is not set up on this deployment.");let l=(0,$o.randomBytes)(24).toString("base64url"),u=(0,$o.randomBytes)(32).toString("base64url");return this.googleFlows.set(ko(l),{userId:r.userId,verifier:u,scopes:r.scopes,expiresAt:this.now()+Rl}),{kind:"redirect",location:`https://accounts.google.com/o/oauth2/v2/auth?${new URLSearchParams({client_id:c.clientId,redirect_uri:`${s}/connect/google/callback`,response_type:"code",scope:["openid","email",...r.scopes.flatMap(f=>xE[f]??[])].join(" "),access_type:"offline",prompt:"consent",state:l,code_challenge:(0,$o.createHash)("sha256").update(u).digest("base64url"),code_challenge_method:"S256"})}`}}let i=this.cfg.plaid;if(!i)throw new Lt(500,"Bank connections are not set up on this deployment.");let o=await this.plaid("/link/token/create",{client_name:"AgentHippo",user:{client_user_id:(0,Cl.userKeyHash)(r.userId).slice(0,32)},products:i.products,country_codes:i.countryCodes,language:"en"}).catch(c=>{throw new Lt(502,`Plaid could not start the bank link (${c instanceof Error?c.message:c}).`)}),a=(0,$o.randomBytes)(24).toString("base64url");return this.bankFlows.set(ko(a),{userId:r.userId,expiresAt:this.now()+Rl}),{kind:"bank",flow:a,linkToken:String(o.link_token)}}async finishGoogle(e,n){let r=this.take(this.googleFlows,e.state);if(!r)throw new Lt(410,"This sign-in has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),e.error)throw new Lt(400,`Google did not grant access (${e.error}).`);if(!e.code)throw new Lt(400,"Google sent no authorization code.");let s=this.cfg.google,i=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({code:e.code,client_id:s.clientId,client_secret:s.clientSecret,redirect_uri:`${this.requireBase()}/connect/google/callback`,grant_type:"authorization_code",code_verifier:r.verifier})}),o=await i.json().catch(()=>({}));if(!i.ok||!o.access_token)throw new Lt(502,`Google refused the sign-in (${o.error??i.status}).`);if(!o.refresh_token)throw new Lt(502,"Google returned no refresh token: remove this app at myaccount.google.com/permissions, then ask your agent for a new link.");let a=Rk(o.id_token),c={refreshToken:o.refresh_token,email:a,scopes:String(o.scope??"").split(" ").filter(Boolean),connectedAt:new Date(this.now()).toISOString()};return await this.cfg.store.update(r.userId,l=>({...l,google:c})),this.googleTokens.set(r.userId,{accessToken:o.access_token,expiresAt:this.now()+(o.expires_in??3600)*1e3,refreshHash:ko(o.refresh_token)}),this.changed(r.userId),{userId:r.userId,email:a}}async finishBank(e,n){let r=this.take(this.bankFlows,typeof e.flow=="string"?e.flow:void 0);if(!r)throw new Lt(410,"This bank link has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),typeof e.public_token!="string"||!e.public_token)throw new Lt(400,"Plaid sent no public token.");let s=e.institution&&typeof e.institution=="object"?e.institution:{},i=typeof s.name=="string"?s.name.slice(0,200):void 0,o=typeof s.institution_id=="string"?s.institution_id.slice(0,100):void 0,a=Array.isArray(e.masks)?e.masks.filter(u=>typeof u=="string"&&/^[0-9A-Za-z]{1,8}$/.test(u)):[],c=await this.plaid("/item/public_token/exchange",{public_token:e.public_token}).catch(u=>{throw new Lt(502,`Plaid could not finish the bank link (${u instanceof Error?u.message:u}).`)}),l=this.cfg.plaid.env;return await this.cfg.store.update(r.userId,async u=>{let d=[];for(let f of u.plaid?.items??[]){if(!(f.env===l&&!!o&&f.institutionId===o&&f.masks.some(_=>a.includes(_)))){d.push(f);continue}await this.plaid("/item/remove",{access_token:f.accessToken}).then(()=>!0,_=>BE.has(_.code))||d.push({...f,replacedBy:String(c.item_id)})}return d.push({itemId:String(c.item_id),accessToken:String(c.access_token),env:l,institution:i,institutionId:o,masks:a,connectedAt:new Date(this.now()).toISOString()}),{...u,plaid:{items:d}}}),this.changed(r.userId),{userId:r.userId,institution:i}}async revoke(e,n,r,s){let i=f=>s===void 0||!(Date.parse(f)/1e3>s);if(n==="google"){let f=(await this.cfg.store.get(e)).google;if(!f||!i(f.connectedAt))return{ok:!0,disconnected:[],failed:[]};let p;try{p=await this.http(`https://oauth2.googleapis.com/revoke?token=${encodeURIComponent(f.refreshToken)}`,{method:"POST"})}catch(h){return{ok:!1,disconnected:[],failed:[{error:`could not reach Google to revoke access (${h instanceof Error?h.message:h}); nothing was removed, try again`}]}}if(!p.ok){let h=await p.text();if(!/invalid_token/.test(h))return{ok:!1,disconnected:[],failed:[{error:`Google did not revoke access (${p.status}); nothing was removed, try again`}]}}let g={};await this.cfg.store.update(e,h=>h.google?.refreshToken===f.refreshToken?{...h,google:void 0}:(g.grant=h.google,h)),this.googleTokens.delete(e);let _=g.grant;return _&&await this.googleAccessToken(e,_).then(()=>!1,y=>!!y?.reconnect)&&await this.cfg.store.update(e,y=>y.google?.refreshToken===_.refreshToken?{...y,google:void 0}:y),this.changed(e),{ok:!0,disconnected:["google"],failed:[]}}let o=(await this.cfg.store.get(e)).plaid?.items??[],a=kk(o,r).filter(f=>i(f.connectedAt));if(!a.length)return{ok:!0,disconnected:[],failed:[]};let c=this.cfg.plaid?.env,l=[],u=[];for(let f of a){if(f.env!==c){f.env==="sandbox"?l.push(f):u.push({bank:f.institution,item_id:f.itemId,error:`linked in ${f.env}, which this deployment is not configured for`});continue}try{await this.plaid("/item/remove",{access_token:f.accessToken}),l.push(f)}catch(p){BE.has(p.code??"")?l.push(f):u.push({bank:f.institution,item_id:f.itemId,error:p instanceof Error?p.message:String(p)})}}let d=new Set(l.map(f=>f.itemId));return await this.cfg.store.update(e,f=>({...f,plaid:{items:(f.plaid?.items??[]).filter(p=>!d.has(p.itemId))}})),l.length&&this.changed(e),{ok:!u.length,disconnected:l.map(f=>f.institution??f.itemId),failed:u}}listGrants(){return this.cfg.store.list()}async summary(e){let n={users:0,google:0,banks:0,unreadable:0};for(let r of e??await this.cfg.store.list()){if("error"in r){n.unreadable++;continue}let s=(r.grants.plaid?.items??[]).filter(i=>!i.replacedBy).length;(r.grants.google||s)&&n.users++,n.google+=r.grants.google?1:0,n.banks+=s}return n}async applyRevocations(e,n,r){if(!e.length)return[];let s=new Map;for(let o of n??await this.cfg.store.list())"error"in o||s.set((0,Cl.userKeyHash)(o.userId),o);let i=[];for(let o of e){let a=s.get(o.user);if(!a)continue;let c=d=>!(Date.parse(d)/1e3>o.requestedAt),l=d=>this.revoke(a.userId,d,void 0,o.requestedAt).catch(f=>({ok:!1,disconnected:[],failed:[{error:f instanceof Error?f.message:String(f)}]})),u=[];(!o.service||o.service==="google")&&a.grants.google&&c(a.grants.google.connectedAt)&&u.push("google"),(!o.service||o.service==="bank")&&(a.grants.plaid?.items??[]).some(d=>c(d.connectedAt))&&u.push("bank");for(let d of u){let f=await l(d);(!f.ok||f.disconnected.length)&&(i.push({user:o.user,service:d,result:f}),r?.({user:o.user,service:d,result:f}))}}return i}statusTool(){return{definition:{name:"connections_status",description:"Which of the user's own accounts are connected on this deployment (Google, banks) and which it can connect. Start here before using Gmail, Calendar, Drive or bank tools.",inputSchema:{type:"object",properties:{}}},call:async({userId:e})=>{let n=await this.cfg.store.get(e),r=this.cfg.plaid?.env;return{google:{available:!!this.cfg.google,connected:!!n.google,...n.google?{email:n.google.email,scopes:n.google.scopes,connected_at:n.google.connectedAt}:{}},banks:{available:!!this.cfg.plaid,...r?{environment:r}:{},linked:(n.plaid?.items??[]).map(s=>({institution:s.institution,item_id:s.itemId,connected_at:s.connectedAt,...s.replacedBy?{note:`replaced by ${s.replacedBy}, but Plaid did not remove it: disconnect it with bank "${s.itemId}"`}:s.env!==r?{note:`linked in ${s.env}; unused on this deployment`}:{}}))},connect_links:!!this.cfg.connectBaseUrl}}}}connectTool(){return{definition:{name:"connections_connect",description:"A one-time link for the user to connect their Google account or a bank. Give them the link: it works only when they open it signed in, and expires in 15 minutes. When they are done, call connections_status.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},google_scopes:{type:"array",items:{type:"string",enum:["gmail","calendar","drive"]},description:"Limit Google access (default: all three)"}},required:["service"]}},call:async({userId:e},n)=>{let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');if(!this.cfg.connectBaseUrl)throw new Error("this deployment cannot issue connect links (the operator has not set AGENTHIPPO_CONNECT_BASE_URL)");if(r==="google"&&!this.cfg.google)throw new Error("Google is not set up on this deployment");if(r==="bank"&&!this.cfg.plaid)throw new Error("bank connections are not set up on this deployment");let s=[];if(r==="google"){let o=Array.isArray(n.google_scopes)?n.google_scopes.map(String):["gmail","calendar","drive"];if(o.filter(c=>!xE[c]).length||!o.length)throw new Error(`google_scopes must be some of gmail, calendar, drive (got ${o.join(", ")||"none"})`);s=[...new Set(o)]}let i=this.createTicket(e,r,s);return{url:`${this.cfg.connectBaseUrl}/connect/start?ticket=${i}`,expires_in_minutes:Rl/6e4,next:"Give the user this link to open in their browser. It works only for them. When they are done, call connections_status."}}}}disconnectTool(){return{definition:{name:"connections_disconnect",description:"Disconnect the user's Google account or a bank: revokes access at Google or removes the bank link at Plaid, then forgets it. Needs confirmed: true, only after the user asked for it.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},bank:{type:"string",description:"Bank name or item_id to disconnect (default: every bank). A name matching several links fails and lists them."},confirmed:{type:"boolean",description:"true only after the user asked to disconnect"}},required:["service","confirmed"]}},call:async(e,n)=>{if(n.confirmed!==!0)throw new Error("refusing to disconnect without confirmed: true (only after the user asked for it)");let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');let s=await this.revoke(e.userId,r,typeof n.bank=="string"?n.bank:void 0);return e.invalidate(),s}}}};Hn.StoredGrantProvider=Of;function kk(t,e){if(!e)return t;let n=e.toLowerCase(),r=t.filter(i=>i.itemId===e||i.institution?.toLowerCase()===n),s=r.length?r:t.filter(i=>i.institution?.toLowerCase().includes(n));if(!s.length)throw new Error(`no connected bank matches "${e}"`);if(s.length>1)throw new Error(`"${e}" matches ${s.length} bank links; pass one item_id: ${s.map(i=>`${i.itemId} (${i.institution})`).join(", ")}`);return s}});var Pf=T($r=>{"use strict";Object.defineProperty($r,"__esModule",{value:!0});$r.CredentialBroker=$r.identityProvider=$r.passthroughProvider=void 0;$r.resolveProvider=$k;var FE=Ra();$r.passthroughProvider={name:"passthrough",refreshOnInbound:!0,async acquire({userId:t,inboundToken:e}){let n=e?.trim();if(!n)throw new Error(`No inbound data credential for user (fail-closed) \u2014 the platform did not forward a per-user token on this request (userId=${t})`);return{expiresAt:Date.now()+10*6e4,secretRef:n}}};$r.identityProvider={name:"identity",async acquire({userId:t}){if(!t.trim())throw new Error("No verified user (fail-closed)");return{expiresAt:Number.MAX_SAFE_INTEGER,secretRef:null}}};function $k(t,e=process.env){let n=(t??"passthrough").trim().toLowerCase();if(n==="passthrough")return $r.passthroughProvider;if(n==="identity")return $r.identityProvider;if(n==="stored-grant")return new FE.StoredGrantProvider((0,FE.readStoredGrantConfig)(e));throw new Error(`Unknown data credential provider "${t}" (supported: passthrough, identity, stored-grant)`)}var If=class{provider;cache=new Map;constructor(e){this.provider=e,e.onGrantsChanged?.(n=>this.invalidate(n))}async acquire(e,n){if(this.provider.refreshOnInbound)return this.provider.acquire({userId:e,inboundToken:n});let r=this.cache.get(e);if(r&&r.expiresAt>Date.now())return r;this.cache.delete(e);let s=await this.provider.acquire({userId:e,inboundToken:n});return this.cache.set(e,s),s}invalidate(e){this.cache.delete(e)}};$r.CredentialBroker=If});var Rf=T(jn=>{"use strict";var Dk=jn&&jn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Lk=jn&&jn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Mk=jn&&jn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Dk(n,e,r[s]);return Lk(n,e),n}})();Object.defineProperty(jn,"__esModule",{value:!0});jn.ConnectorHost=jn.TURN_META_KEY=void 0;var VE=Mk(require("path")),Gk=require("fs"),Uk=require("@modelcontextprotocol/sdk/client/index.js"),Hk=require("@modelcontextprotocol/sdk/client/stdio.js"),jk=require("@modelcontextprotocol/sdk/types.js"),xk=sl();jn.TURN_META_KEY="ai.agenthippo/turn";var Nf=class t{client;logger;connectorPath;constructor(e,n,r){this.client=e,this.logger=n,this.connectorPath=r}static async spawn(e){let n=VE.resolve(e.connectorPath);await Gk.promises.access(n);let r=await(0,xk.resolveNodeBinary)(),s=new Hk.StdioClientTransport({command:r,args:[n],cwd:VE.dirname(n),env:{...process.env,AGENTHIPPO_DATA_CONNECTOR:"1"},stderr:"pipe"}),i=new Uk.Client({name:"agenthippo-data-gateway",version:"1.0.0"});return await i.connect(s),s.stderr?.on("data",o=>{e.logger?.warn(`[DataPlane] connector stderr: ${String(o).trimEnd()}`)}),e.logger?.info(`[DataPlane] connector started: ${n}`),new t(i,e.logger,n)}async listTools(){return(await this.client.listTools()).tools.map(n=>({name:n.name,description:n.description,inputSchema:n.inputSchema??{type:"object"}}))}async callTool(e,n,r){return await this.client.request({method:"tools/call",params:{name:e,arguments:n,_meta:{[jn.TURN_META_KEY]:{userId:r.userId,credential:r.credential}}}},jk.CallToolResultSchema)}async close(){try{await this.client.close()}catch(e){this.logger?.warn(`[DataPlane] connector close: ${e instanceof Error?e.message:String(e)}`)}}};jn.ConnectorHost=Nf});var kf=T(Ae=>{"use strict";var Bk=Ae&&Ae.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Fk=Ae&&Ae.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Vk=Ae&&Ae.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Bk(n,e,r[s]);return Fk(n,e),n}})();Object.defineProperty(Ae,"__esModule",{value:!0});Ae.JtiReplayCache=Ae.DEFAULT_ISSUER_RATE_PER_MIN=Ae.DEFAULT_FEDERATED_TOKEN_TTL_SEC=Ae.MAX_ASSERTION_LIFETIME_SEC=Ae.FEDERATED_SUB=Ae.FEDERATED_SCOPE=Ae.JWT_BEARER_GRANT=void 0;Ae.hostOf=Lo;Ae.parseAudiences=Wk;Ae.parseIssuers=qk;Ae.verifyAssertion=Jk;Ae.forwardedHost=Xk;Ae.audienceMatches=XE;Ae.federatedTokenAccepted=zk;var JE=Vk(require("crypto"));Ae.JWT_BEARER_GRANT="urn:ietf:params:oauth:grant-type:jwt-bearer";Ae.FEDERATED_SCOPE="agenthippo:chat";Ae.FEDERATED_SUB=/^[A-Za-z0-9_-]{1,64}$/;Ae.MAX_ASSERTION_LIFETIME_SEC=300;Ae.DEFAULT_FEDERATED_TOKEN_TTL_SEC=900;Ae.DEFAULT_ISSUER_RATE_PER_MIN=600;var KE=6e3,WE=3600,Do=30,qE=/^[a-z0-9][a-z0-9-]{0,31}$/,YE=new Set(["svc","anon","spiffe","channel","user","session","usr","voice","slack","telegram","custom","sms","whatsapp","imessage","email","phone","discord","teams","signal","web","line","messenger","matrix"]),Kk=new Set(["localhost","127.0.0.1","[::1]","::1","0.0.0.0"]);function Lo(t){let e=t.trim().toLowerCase();if(e)try{return new URL(e.includes("://")?e:`https://${e}`).hostname||void 0}catch{return}}function Wk(t){let e=(t??"").split(",").map(n=>n.trim()).filter(Boolean).map(n=>Lo(n));if(e.some(n=>!n))throw new Error("AGENTHIPPO_AUTH_AUDIENCES must be a comma-separated list of hosts.");return[...new Set(e)]}function qk(t,e){if(!t?.trim())return[];let n;try{n=JSON.parse(t)}catch{throw new Error("AGENTHIPPO_AUTH_ISSUERS is not valid JSON.")}if(!Array.isArray(n))throw new Error("AGENTHIPPO_AUTH_ISSUERS must be a JSON array of issuers.");let r=new Set,s=new Set;return n.map((i,o)=>{let a=i&&typeof i=="object"?i:{},c=`AGENTHIPPO_AUTH_ISSUERS[${o}]`,l=typeof a.name=="string"?a.name:"";if(!qE.test(l))throw new Error(`${c}.name must be a lower-case slug, got ${JSON.stringify(a.name)}.`);let u=a.prefix===void 0?l:String(a.prefix);if(!qE.test(u)||YE.has(u))throw new Error(`${c}.prefix ${JSON.stringify(u)} must be a lower-case slug and not one of: ${[...YE].join(", ")}.`);if(r.has(l)||s.has(u))throw new Error(`${c}: issuer names and prefixes must each be unique.`);r.add(l),s.add(u);let d=new Map;for(let[h,y]of Object.entries(a.keys&&typeof a.keys=="object"?a.keys:{})){let E;try{E=JE.createPublicKey(String(y))}catch{throw new Error(`${c}.keys.${h} is not a public key PEM.`)}if(E.asymmetricKeyType!=="ed25519")throw new Error(`${c}.keys.${h} must be an Ed25519 key: EdDSA is the only algorithm accepted.`);d.set(h,E)}if(d.size===0)throw new Error(`${c}.keys must hold at least one Ed25519 public key, by kid.`);let f=(Array.isArray(a.audiences)?a.audiences:[]).map(h=>Lo(String(h)));if(f.length===0||f.some(h=>!h))throw new Error(`${c}.audiences must list the hosts its tokens may be used at (the deployments it calls).`);let p=f.find(h=>Kk.has(h)||e!==void 0&&h===e);if(p)throw new Error(`${c}.audiences may not name ${p}: tokens are for the deployments an issuer calls, never this broker or this machine.`);let g=a.tokenTtlSec===void 0?Ae.DEFAULT_FEDERATED_TOKEN_TTL_SEC:Number(a.tokenTtlSec);if(!Number.isInteger(g)||g<60||g>WE)throw new Error(`${c}.tokenTtlSec must be a whole number of seconds from 60 to ${WE}.`);let _=a.ratePerMin===void 0?Ae.DEFAULT_ISSUER_RATE_PER_MIN:Number(a.ratePerMin);if(!Number.isInteger(_)||_<1||_>KE)throw new Error(`${c}.ratePerMin must be a whole number from 1 to ${KE}.`);return{name:l,prefix:u,keys:d,audiences:f,tokenTtlSec:g,ratePerMin:_}})}var Yk="invalid assertion";function Jk(t,e,n,r=Math.floor(Date.now()/1e3)){let s=t.split("."),i=A=>({ok:!1,reason:Yk,detail:A}),o=A=>({ok:!1,reason:A,detail:A});if(s.length!==3)return i("malformed");let a,c;try{a=JSON.parse(Buffer.from(s[0],"base64url").toString("utf8")),c=JSON.parse(Buffer.from(s[1],"base64url").toString("utf8"))}catch{return i("unparseable")}if(!a||typeof a!="object"||!c||typeof c!="object")return i("unparseable");if(a.alg!=="EdDSA")return i("alg is not EdDSA");let l=e.find(A=>A.name===c.iss);if(!l)return i("unknown issuer");let u=typeof a.kid=="string"?l.keys.get(a.kid):void 0;if(!u)return i("unknown kid");let d=!1;try{d=JE.verify(null,Buffer.from(`${s[0]}.${s[1]}`),u,Buffer.from(s[2],"base64url"))}catch{d=!1}if(!d)return i("bad signature");let{sub:f,aud:p,iat:g,exp:_,nbf:h,jti:y,resource:E}=c;return typeof f!="string"||!Ae.FEDERATED_SUB.test(f)?o("sub must be 1 to 64 of A-Z, a-z, 0-9, _ and -"):(Array.isArray(p)?p:[p]).some(A=>typeof A=="string"&&n.includes(A.replace(/\/+$/,"")))?typeof g!="number"||typeof _!="number"?o("iat and exp are required"):_<=r-Do?o("expired"):g>r+Do?o("issued in the future"):h!==void 0&&(typeof h!="number"||h>r+Do)?o("not yet valid"):_<=g||_-g>Ae.MAX_ASSERTION_LIFETIME_SEC||_-r>Ae.MAX_ASSERTION_LIFETIME_SEC+Do?o(`an assertion lives at most ${Ae.MAX_ASSERTION_LIFETIME_SEC}s`):typeof y!="string"||!y||y.length>128?o("jti is required"):typeof E!="string"||!Lo(E)?o("resource (the deployment the token is for) is required"):{ok:!0,issuer:l,sub:f,jti:y,exp:_,resource:E}:o("aud must name this token endpoint")}var Cf=class t{max;seen=new Map;constructor(e=5e4){this.max=e}static forIssuer(e){return new t(Math.max(1e3,e.ratePerMin*Math.ceil((Ae.MAX_ASSERTION_LIFETIME_SEC+2*Do)/60+1)))}has(e,n=Math.floor(Date.now()/1e3)){let r=this.seen.get(e);return r!==void 0&&r>n}claim(e,n,r=Math.floor(Date.now()/1e3)){if(this.seen.size>=this.max)for(let[s,i]of this.seen)i<=r&&this.seen.delete(s);return this.has(e,r)||this.seen.size>=this.max?!1:(this.seen.set(e,n+Do),!0)}};Ae.JtiReplayCache=Cf;function Xk(t){let e=t["x-forwarded-host"],n=(Array.isArray(e)?e[0]:e)?.split(",")[0]?.trim();return n?Lo(n):void 0}function XE(t,e){return e?(Array.isArray(t)?t:[t]).some(n=>typeof n=="string"&&Lo(n)===e):!1}function zk(t,e,n){return e!==void 0&&n.includes(e)&&XE(t,e)}});var Ca=T(xn=>{"use strict";Object.defineProperty(xn,"__esModule",{value:!0});xn.DEFAULT_AUTH_BIND=xn.AUTH_PROXY_SECRET_HEADER=xn.DEFAULT_JWT_SECRET=void 0;xn.resolveAuthBrokerBind=e$;xn.loadAuthBrokerConfig=t$;xn.emailDomainAllowed=n$;var $f=kf();function Qk(t){return t?.trim()?t.split(",").map(e=>e.trim().toLowerCase()).filter(Boolean):[]}xn.DEFAULT_JWT_SECRET="dev-agenthippo-auth-secret-change-me";xn.AUTH_PROXY_SECRET_HEADER="x-agenthippo-proxy-secret";xn.DEFAULT_AUTH_BIND="127.0.0.1";var Zk=new Set(["127.0.0.1","localhost","::1","[::1]"]);function e$(t=process.env){let e=t.AGENTHIPPO_AUTH_BIND?.trim()||xn.DEFAULT_AUTH_BIND;if(!!Zk.has(e.toLowerCase()))return{address:e,isPublic:!1};if(t.AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND!=="1")throw new Error(`Refusing to bind the auth broker to "${e}". This port issues authorization codes and access tokens, and a directly reachable broker can be asked to mint a token for an arbitrary email by forging X-Auth-Request-Email.
476
+ `)[0]}catch{}}function mk(){let t=process.env.AGENTHIPPO_BASE_PROMPTS_DIR||process.env.AGENTIDE_BASE_PROMPTS_DIR;if(t)try{return cr.accessSync(t,cr.constants.R_OK),t}catch{}let e=Pl(),n=Bi.join(e,"base-prompts");try{return cr.accessSync(n,cr.constants.R_OK),n}catch{}let r=Bi.resolve(__dirname,"..","base-prompts");try{return cr.accessSync(r,cr.constants.R_OK),r}catch{}}Dt.COLORS={reset:"\x1B[0m",cyan:"\x1B[36m",gray:"\x1B[90m",dim:"\x1B[2m",blue:"\x1B[34m",green:"\x1B[32m",red:"\x1B[31m",yellow:"\x1B[33m"};Dt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND='AGENTHIPPO_LITELLM_BASE_URL="http://localhost:4000" AGENTHIPPO_LITELLM_API_KEY="dummy" AGENTHIPPO_DEFAULT_MODEL="litellm/gpt-5.5" AGENTHIPPO_DEFAULT_ENGINE="codex" agenthippo ask "Reply with exactly: CLI_TEST_OK"';function _k(){return["Try local LiteLLM quickstart:",` ${Dt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND}`]}});var Co=T(Is=>{"use strict";Object.defineProperty(Is,"__esModule",{value:!0});Is.TurnRegistry=Is.DEFAULT_TURN_DEADLINE_MS=void 0;Is.hashNonce=Nl;Is.isNonceShaped=LE;var DE=require("crypto");Is.DEFAULT_TURN_DEADLINE_MS=30*6e4;function Nl(t){return(0,DE.createHash)("sha256").update(t).digest("hex")}var Ek=/^[0-9a-f]{32}$/;function LE(t){return Ek.test(t)}var Sf=class{entries=new Map;generations=new Map;generationCounter=0;register(e,n){this.prune();let r=n?.renewNonce?.trim()||void 0;if(r!==void 0&&!LE(r))throw new Error("renewNonce must be a previously minted turn nonce (32 lowercase hex chars)");let s=r??(0,DE.randomBytes)(16).toString("hex"),i=Nl(s);this.entries.set(i,{userId:e.userId,sessionKey:e.sessionKey,inboundToken:e.inboundToken,egressStoreKey:e.egressStoreKey,deadline:e.deadline??Date.now()+Is.DEFAULT_TURN_DEADLINE_MS});let o=++this.generationCounter;this.generations.set(i,o);let a=!1;return{nonce:s,release:()=>{a||(a=!0,this.generations.get(i)===o&&(this.entries.delete(i),this.generations.delete(i)))}}}releaseByNonce(e){let n=Nl(e);return this.generations.delete(n),this.entries.delete(n)}resolve(e,n=Date.now()){let r=Nl(e),s=this.entries.get(r);if(s){if(n>s.deadline){this.entries.delete(r),this.generations.delete(r);return}return s}}prune(e=Date.now()){for(let[n,r]of this.entries)e>r.deadline&&(this.entries.delete(n),this.generations.delete(n))}get size(){return this.entries.size}};Is.TurnRegistry=Sf});var bf=T(lr=>{"use strict";var yk=lr&&lr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),wk=lr&&lr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sk=lr&&lr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&yk(n,e,r[s]);return wk(n,e),n}})();Object.defineProperty(lr,"__esModule",{value:!0});lr.GrantStore=void 0;lr.userKeyHash=Af;lr.parseGrantKey=Ak;var Na=require("crypto"),Fi=require("fs"),ME=Sk(require("path")),GE=1,UE="agenthippo-grant:v1:";function Af(t){return(0,Na.createHash)("sha256").update(t).digest("hex")}function Ak(t){let e=t.trim(),n=/^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):Buffer.from(e,"base64");if(n.length!==32)throw new Error("the grant store key must be 32 bytes, base64 or hex (e.g. `openssl rand -base64 32`)");return n}var Tf=class{dir;key;chains=new Map;constructor(e,n){if(this.dir=e,this.key=n,n.length!==32)throw new Error("GrantStore key must be 32 bytes")}file(e){return ME.join(this.dir,`${e}.grant`)}encrypt(e,n,r){let s=(0,Na.randomBytes)(12),i=(0,Na.createCipheriv)("aes-256-gcm",this.key,s);i.setAAD(Buffer.from(UE+e));let o=Buffer.concat([i.update(JSON.stringify({userId:n,grants:r}),"utf8"),i.final()]);return JSON.stringify({v:GE,iv:s.toString("base64"),tag:i.getAuthTag().toString("base64"),data:o.toString("base64")})}decrypt(e,n){let r=JSON.parse(n);if(r.v!==GE)throw new Error(`unsupported grant file format ${r.v}`);let s=(0,Na.createDecipheriv)("aes-256-gcm",this.key,Buffer.from(r.iv,"base64"));s.setAAD(Buffer.from(UE+e)),s.setAuthTag(Buffer.from(r.tag,"base64"));let i=Buffer.concat([s.update(Buffer.from(r.data,"base64")),s.final()]).toString("utf8");return JSON.parse(i)}async get(e){let n=Af(e),r;try{r=await Fi.promises.readFile(this.file(n),"utf8")}catch(i){if(i.code==="ENOENT")return{};throw i}let s=this.decrypt(n,r);if(s.userId!==e)throw new Error("grant record does not belong to this user");return s.grants??{}}async update(e,n){let r=Af(e),i=(this.chains.get(r)??Promise.resolve()).catch(()=>{}).then(async()=>{let o=await n(await this.get(e));return await this.write(r,e,o),o});this.chains.set(r,i);try{return await i}finally{this.chains.get(r)===i&&this.chains.delete(r)}}async write(e,n,r){let s=this.file(e);if(!r.google&&!r.plaid?.items.length){await Fi.promises.rm(s,{force:!0});return}await Fi.promises.mkdir(this.dir,{recursive:!0,mode:448});let o=`${s}.${(0,Na.randomBytes)(6).toString("hex")}.tmp`;await Fi.promises.writeFile(o,this.encrypt(e,n,r),{mode:384}),await Fi.promises.rename(o,s)}async list(){let e;try{e=await Fi.promises.readdir(this.dir)}catch(r){if(r.code==="ENOENT")return[];throw r}let n=[];for(let r of e.filter(s=>/^[0-9a-f]{64}\.grant$/.test(s)).sort())try{n.push(this.decrypt(r.slice(0,64),await Fi.promises.readFile(ME.join(this.dir,r),"utf8")))}catch(s){n.push({file:r,error:s instanceof Error?s.message:String(s)})}return n}};lr.GrantStore=Tf});var Ra=T(Hn=>{"use strict";var Tk=Hn&&Hn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),bk=Hn&&Hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),vk=Hn&&Hn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Tk(n,e,r[s]);return bk(n,e),n}})();Object.defineProperty(Hn,"__esModule",{value:!0});Hn.StoredGrantProvider=Hn.ConnectError=void 0;Hn.readStoredGrantConfig=Pk;var $o=require("crypto"),Ok=vk(require("fs")),Cl=bf(),Ik=["AGENTHIPPO_GRANT_STORE_DIR","AGENTHIPPO_GRANT_STORE_KEY","AGENTHIPPO_GRANT_STORE_KEY_FILE","AGENTHIPPO_CONNECT_BASE_URL","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET_FILE","AGENTHIPPO_PLAID_CLIENT_ID","AGENTHIPPO_PLAID_SECRET","AGENTHIPPO_PLAID_SECRET_FILE","AGENTHIPPO_PLAID_ENV","AGENTHIPPO_PLAID_PRODUCTS","AGENTHIPPO_PLAID_COUNTRY_CODES","AGENTHIPPO_CONNECT_TICKET_ONLY"];function vf(t,e){let n=t[`${e}_FILE`]?.trim();return n?Ok.readFileSync(n,"utf8").trim()||void 0:t[e]?.trim()||void 0}function HE(t,e){return(t?.trim()||e).split(",").map(n=>n.trim()).filter(Boolean)}var jE=new WeakMap;function Pk(t=process.env){let e=jE.get(t);if(e)return e;try{let n=t.AGENTHIPPO_GRANT_STORE_DIR?.trim(),r=vf(t,"AGENTHIPPO_GRANT_STORE_KEY");if(!n||!r)throw new Error("provider=stored-grant needs AGENTHIPPO_GRANT_STORE_DIR and AGENTHIPPO_GRANT_STORE_KEY (32 bytes, base64 or hex, e.g. `openssl rand -base64 32`; or AGENTHIPPO_GRANT_STORE_KEY_FILE)");let s=t.AGENTHIPPO_PLAID_ENV?.trim()||"sandbox";if(s!=="sandbox"&&s!=="production")throw new Error(`AGENTHIPPO_PLAID_ENV must be sandbox or production (got ${s})`);let i=t.AGENTHIPPO_CONNECT_BASE_URL?.trim().replace(/\/+$/,"");if(i&&!/^https?:\/\/[^/]+/.test(i))throw new Error(`AGENTHIPPO_CONNECT_BASE_URL must be an http(s) URL (got ${i})`);let o=t.AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID?.trim(),a=vf(t,"AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET"),c=t.AGENTHIPPO_PLAID_CLIENT_ID?.trim(),l=vf(t,"AGENTHIPPO_PLAID_SECRET"),u={store:new Cl.GrantStore(n,(0,Cl.parseGrantKey)(r)),connectBaseUrl:i||void 0,google:o&&a?{clientId:o,clientSecret:a}:void 0,plaid:c&&l?{env:s,clientId:c,secret:l,products:HE(t.AGENTHIPPO_PLAID_PRODUCTS,"transactions"),countryCodes:HE(t.AGENTHIPPO_PLAID_COUNTRY_CODES,"US")}:void 0,ticketOnly:t.AGENTHIPPO_CONNECT_TICKET_ONLY?.trim()==="1"};return jE.set(t,u),u}finally{for(let n of Ik)delete t[n]}}var Lt=class extends Error{status;constructor(e,n){super(n),this.status=e}};Hn.ConnectError=Lt;var xE={gmail:["https://www.googleapis.com/auth/gmail.modify"],calendar:["https://www.googleapis.com/auth/calendar"],drive:["https://www.googleapis.com/auth/drive.readonly","https://www.googleapis.com/auth/drive.file"]},Rl=15*6e4,Nk=5*6e4,BE=new Set(["ITEM_NOT_FOUND","INVALID_ACCESS_TOKEN"]),ko=t=>(0,$o.createHash)("sha256").update(t).digest("hex");function Rk(t){try{let e=JSON.parse(Buffer.from(String(t).split(".")[1],"base64url").toString("utf8"));return typeof e.email=="string"?e.email:void 0}catch{return}}var Ck=3e4,Of=class{cfg;name="stored-grant";tools;tickets=new Map;googleFlows=new Map;bankFlows=new Map;googleTokens=new Map;changeListeners=[];constructor(e){this.cfg=e,this.tools=[this.statusTool(),this.connectTool(),this.disconnectTool()]}onGrantsChanged(e){this.changeListeners.push(e)}changed(e){for(let n of this.changeListeners)n(e)}get connectBaseUrl(){return this.cfg.connectBaseUrl}get http(){let e=this.cfg.fetchImpl??fetch;return((n,r)=>e(n,{signal:AbortSignal.timeout(Ck),...r}))}now(){return this.cfg.now?.()??Date.now()}async acquire({userId:e}){if(!e?.trim())throw new Error("No verified user (fail-closed)");let n=await this.cfg.store.get(e),r=this.now()+Nk,s;if(!this.cfg.google)s={status:"not_configured"};else if(!n.google)s={status:"not_connected"};else try{let c=await this.googleAccessToken(e,n.google);s={status:"connected",accessToken:c.accessToken,email:n.google.email,scopes:n.google.scopes},r=Math.min(r,c.expiresAt-6e4)}catch(c){let l=c instanceof Error?c.message:String(c),u=c.reconnect;s={status:u?"reconnect_required":"unavailable",error:l},u||(r=this.now())}let i,o=n.plaid?.items??[];if(!this.cfg.plaid)i={status:"not_configured"};else if(!o.length)i={status:"not_connected"};else{let c=this.cfg.plaid;i={status:"connected",env:c.env,clientId:c.clientId,secret:c.secret,items:o.map(l=>({item_id:l.itemId,access_token:l.accessToken,env:l.env,institution:l.institution,...l.replacedBy?{replaced_by:l.replacedBy}:{}}))}}return{expiresAt:r,secretRef:{google:s,plaid:i}}}async googleAccessToken(e,n){let r=ko(n.refreshToken),s=this.googleTokens.get(e);if(s&&s.refreshHash===r&&s.expiresAt>this.now()+6e4)return s;let i=this.cfg.google,o=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i.clientId,client_secret:i.clientSecret,refresh_token:n.refreshToken,grant_type:"refresh_token"})}),a=await o.json().catch(()=>({}));if(!o.ok||!a.access_token)throw Object.assign(new Error(`google token: ${a.error??o.status} ${a.error_description??""}`.trim()),{reconnect:a.error==="invalid_grant"});let c={accessToken:a.access_token,expiresAt:this.now()+(a.expires_in??3600)*1e3,refreshHash:r};return this.googleTokens.set(e,c),c}async plaid(e,n){let r=this.cfg.plaid;if(!r)throw new Error("bank connections are not set up on this deployment");let s=await this.http(`https://${r.env}.plaid.com${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:r.clientId,secret:r.secret,...n})}),i=await s.json().catch(()=>({}));if(!s.ok)throw Object.assign(new Error(`plaid ${e}: ${i.error_code} ${i.error_message}`),{code:i.error_code});return i}prune(){let e=this.now();for(let n of[this.tickets,this.googleFlows,this.bankFlows])for(let[r,s]of n)s.expiresAt<=e&&n.delete(r)}take(e,n){if(!n)return;let r=ko(n),s=e.get(r);return e.delete(r),s&&s.expiresAt>this.now()?s:void 0}createTicket(e,n,r=[]){this.prune();let s=(0,$o.randomBytes)(24).toString("base64url");return this.tickets.set(ko(s),{userId:e,service:n,scopes:r,expiresAt:this.now()+Rl}),s}checkBrowserUser(e,n){if(n===void 0){if(this.cfg.ticketOnly)return;throw new Lt(401,"This page only works when opened through this deployment's sign-in. (Operator: route /connect/ through the identity edge, like the chat endpoint.)")}if(n.trim().toLowerCase()!==e.trim().toLowerCase())throw new Lt(403,"This link was made for a different account. Sign in as the person who asked for it, or ask your agent for a new link.")}requireBase(){if(!this.cfg.connectBaseUrl)throw new Lt(500,"This deployment has no AGENTHIPPO_CONNECT_BASE_URL.");return this.cfg.connectBaseUrl}async startConnect(e,n){let r=this.take(this.tickets,e);if(!r)throw new Lt(410,"This link has expired or was already used. Ask your agent for a new one.");this.checkBrowserUser(r.userId,n);let s=this.requireBase();if(r.service==="google"){let c=this.cfg.google;if(!c)throw new Lt(500,"Google is not set up on this deployment.");let l=(0,$o.randomBytes)(24).toString("base64url"),u=(0,$o.randomBytes)(32).toString("base64url");return this.googleFlows.set(ko(l),{userId:r.userId,verifier:u,scopes:r.scopes,expiresAt:this.now()+Rl}),{kind:"redirect",location:`https://accounts.google.com/o/oauth2/v2/auth?${new URLSearchParams({client_id:c.clientId,redirect_uri:`${s}/connect/google/callback`,response_type:"code",scope:["openid","email",...r.scopes.flatMap(d=>xE[d]??[])].join(" "),access_type:"offline",prompt:"consent",state:l,code_challenge:(0,$o.createHash)("sha256").update(u).digest("base64url"),code_challenge_method:"S256"})}`}}let i=this.cfg.plaid;if(!i)throw new Lt(500,"Bank connections are not set up on this deployment.");let o=await this.plaid("/link/token/create",{client_name:"AgentHippo",user:{client_user_id:(0,Cl.userKeyHash)(r.userId).slice(0,32)},products:i.products,country_codes:i.countryCodes,language:"en"}).catch(c=>{throw new Lt(502,`Plaid could not start the bank link (${c instanceof Error?c.message:c}).`)}),a=(0,$o.randomBytes)(24).toString("base64url");return this.bankFlows.set(ko(a),{userId:r.userId,expiresAt:this.now()+Rl}),{kind:"bank",flow:a,linkToken:String(o.link_token)}}async finishGoogle(e,n){let r=this.take(this.googleFlows,e.state);if(!r)throw new Lt(410,"This sign-in has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),e.error)throw new Lt(400,`Google did not grant access (${e.error}).`);if(!e.code)throw new Lt(400,"Google sent no authorization code.");let s=this.cfg.google,i=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({code:e.code,client_id:s.clientId,client_secret:s.clientSecret,redirect_uri:`${this.requireBase()}/connect/google/callback`,grant_type:"authorization_code",code_verifier:r.verifier})}),o=await i.json().catch(()=>({}));if(!i.ok||!o.access_token)throw new Lt(502,`Google refused the sign-in (${o.error??i.status}).`);if(!o.refresh_token)throw new Lt(502,"Google returned no refresh token: remove this app at myaccount.google.com/permissions, then ask your agent for a new link.");let a=Rk(o.id_token),c={refreshToken:o.refresh_token,email:a,scopes:String(o.scope??"").split(" ").filter(Boolean),connectedAt:new Date(this.now()).toISOString()};return await this.cfg.store.update(r.userId,l=>({...l,google:c})),this.googleTokens.set(r.userId,{accessToken:o.access_token,expiresAt:this.now()+(o.expires_in??3600)*1e3,refreshHash:ko(o.refresh_token)}),this.changed(r.userId),{userId:r.userId,email:a}}async finishBank(e,n){let r=this.take(this.bankFlows,typeof e.flow=="string"?e.flow:void 0);if(!r)throw new Lt(410,"This bank link has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),typeof e.public_token!="string"||!e.public_token)throw new Lt(400,"Plaid sent no public token.");let s=e.institution&&typeof e.institution=="object"?e.institution:{},i=typeof s.name=="string"?s.name.slice(0,200):void 0,o=typeof s.institution_id=="string"?s.institution_id.slice(0,100):void 0,a=Array.isArray(e.masks)?e.masks.filter(u=>typeof u=="string"&&/^[0-9A-Za-z]{1,8}$/.test(u)):[],c=await this.plaid("/item/public_token/exchange",{public_token:e.public_token}).catch(u=>{throw new Lt(502,`Plaid could not finish the bank link (${u instanceof Error?u.message:u}).`)}),l=this.cfg.plaid.env;return await this.cfg.store.update(r.userId,async u=>{let f=[];for(let d of u.plaid?.items??[]){if(!(d.env===l&&!!o&&d.institutionId===o&&d.masks.some(_=>a.includes(_)))){f.push(d);continue}await this.plaid("/item/remove",{access_token:d.accessToken}).then(()=>!0,_=>BE.has(_.code))||f.push({...d,replacedBy:String(c.item_id)})}return f.push({itemId:String(c.item_id),accessToken:String(c.access_token),env:l,institution:i,institutionId:o,masks:a,connectedAt:new Date(this.now()).toISOString()}),{...u,plaid:{items:f}}}),this.changed(r.userId),{userId:r.userId,institution:i}}async revoke(e,n,r,s){let i=d=>s===void 0||!(Date.parse(d)/1e3>s);if(n==="google"){let d=(await this.cfg.store.get(e)).google;if(!d||!i(d.connectedAt))return{ok:!0,disconnected:[],failed:[]};let g;try{g=await this.http(`https://oauth2.googleapis.com/revoke?token=${encodeURIComponent(d.refreshToken)}`,{method:"POST"})}catch(h){return{ok:!1,disconnected:[],failed:[{error:`could not reach Google to revoke access (${h instanceof Error?h.message:h}); nothing was removed, try again`}]}}if(!g.ok){let h=await g.text();if(!/invalid_token/.test(h))return{ok:!1,disconnected:[],failed:[{error:`Google did not revoke access (${g.status}); nothing was removed, try again`}]}}let p={};await this.cfg.store.update(e,h=>h.google?.refreshToken===d.refreshToken?{...h,google:void 0}:(p.grant=h.google,h)),this.googleTokens.delete(e);let _=p.grant;return _&&await this.googleAccessToken(e,_).then(()=>!1,y=>!!y?.reconnect)&&await this.cfg.store.update(e,y=>y.google?.refreshToken===_.refreshToken?{...y,google:void 0}:y),this.changed(e),{ok:!0,disconnected:["google"],failed:[]}}let o=(await this.cfg.store.get(e)).plaid?.items??[],a=kk(o,r).filter(d=>i(d.connectedAt));if(!a.length)return{ok:!0,disconnected:[],failed:[]};let c=this.cfg.plaid?.env,l=[],u=[];for(let d of a){if(d.env!==c){d.env==="sandbox"?l.push(d):u.push({bank:d.institution,item_id:d.itemId,error:`linked in ${d.env}, which this deployment is not configured for`});continue}try{await this.plaid("/item/remove",{access_token:d.accessToken}),l.push(d)}catch(g){BE.has(g.code??"")?l.push(d):u.push({bank:d.institution,item_id:d.itemId,error:g instanceof Error?g.message:String(g)})}}let f=new Set(l.map(d=>d.itemId));return await this.cfg.store.update(e,d=>({...d,plaid:{items:(d.plaid?.items??[]).filter(g=>!f.has(g.itemId))}})),l.length&&this.changed(e),{ok:!u.length,disconnected:l.map(d=>d.institution??d.itemId),failed:u}}listGrants(){return this.cfg.store.list()}async summary(e){let n={users:0,google:0,banks:0,unreadable:0};for(let r of e??await this.cfg.store.list()){if("error"in r){n.unreadable++;continue}let s=(r.grants.plaid?.items??[]).filter(i=>!i.replacedBy).length;(r.grants.google||s)&&n.users++,n.google+=r.grants.google?1:0,n.banks+=s}return n}async applyRevocations(e,n,r){if(!e.length)return[];let s=new Map;for(let o of n??await this.cfg.store.list())"error"in o||s.set((0,Cl.userKeyHash)(o.userId),o);let i=[];for(let o of e){let a=s.get(o.user);if(!a)continue;let c=f=>!(Date.parse(f)/1e3>o.requestedAt),l=f=>this.revoke(a.userId,f,void 0,o.requestedAt).catch(d=>({ok:!1,disconnected:[],failed:[{error:d instanceof Error?d.message:String(d)}]})),u=[];(!o.service||o.service==="google")&&a.grants.google&&c(a.grants.google.connectedAt)&&u.push("google"),(!o.service||o.service==="bank")&&(a.grants.plaid?.items??[]).some(f=>c(f.connectedAt))&&u.push("bank");for(let f of u){let d=await l(f);(!d.ok||d.disconnected.length)&&(i.push({user:o.user,service:f,result:d}),r?.({user:o.user,service:f,result:d}))}}return i}statusTool(){return{definition:{name:"connections_status",description:"Which of the user's own accounts are connected on this deployment (Google, banks) and which it can connect. Start here before using Gmail, Calendar, Drive or bank tools.",inputSchema:{type:"object",properties:{}}},call:async({userId:e})=>{let n=await this.cfg.store.get(e),r=this.cfg.plaid?.env;return{google:{available:!!this.cfg.google,connected:!!n.google,...n.google?{email:n.google.email,scopes:n.google.scopes,connected_at:n.google.connectedAt}:{}},banks:{available:!!this.cfg.plaid,...r?{environment:r}:{},linked:(n.plaid?.items??[]).map(s=>({institution:s.institution,item_id:s.itemId,connected_at:s.connectedAt,...s.replacedBy?{note:`replaced by ${s.replacedBy}, but Plaid did not remove it: disconnect it with bank "${s.itemId}"`}:s.env!==r?{note:`linked in ${s.env}; unused on this deployment`}:{}}))},connect_links:!!this.cfg.connectBaseUrl}}}}connectTool(){return{definition:{name:"connections_connect",description:"A one-time link for the user to connect their Google account or a bank. Give them the link: it works only when they open it signed in, and expires in 15 minutes. When they are done, call connections_status.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},google_scopes:{type:"array",items:{type:"string",enum:["gmail","calendar","drive"]},description:"Limit Google access (default: all three)"}},required:["service"]}},call:async({userId:e},n)=>{let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');if(!this.cfg.connectBaseUrl)throw new Error("this deployment cannot issue connect links (the operator has not set AGENTHIPPO_CONNECT_BASE_URL)");if(r==="google"&&!this.cfg.google)throw new Error("Google is not set up on this deployment");if(r==="bank"&&!this.cfg.plaid)throw new Error("bank connections are not set up on this deployment");let s=[];if(r==="google"){let o=Array.isArray(n.google_scopes)?n.google_scopes.map(String):["gmail","calendar","drive"];if(o.filter(c=>!xE[c]).length||!o.length)throw new Error(`google_scopes must be some of gmail, calendar, drive (got ${o.join(", ")||"none"})`);s=[...new Set(o)]}let i=this.createTicket(e,r,s);return{url:`${this.cfg.connectBaseUrl}/connect/start?ticket=${i}`,expires_in_minutes:Rl/6e4,next:"Give the user this link to open in their browser. It works only for them. When they are done, call connections_status."}}}}disconnectTool(){return{definition:{name:"connections_disconnect",description:"Disconnect the user's Google account or a bank: revokes access at Google or removes the bank link at Plaid, then forgets it. Needs confirmed: true, only after the user asked for it.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},bank:{type:"string",description:"Bank name or item_id to disconnect (default: every bank). A name matching several links fails and lists them."},confirmed:{type:"boolean",description:"true only after the user asked to disconnect"}},required:["service","confirmed"]}},call:async(e,n)=>{if(n.confirmed!==!0)throw new Error("refusing to disconnect without confirmed: true (only after the user asked for it)");let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');let s=await this.revoke(e.userId,r,typeof n.bank=="string"?n.bank:void 0);return e.invalidate(),s}}}};Hn.StoredGrantProvider=Of;function kk(t,e){if(!e)return t;let n=e.toLowerCase(),r=t.filter(i=>i.itemId===e||i.institution?.toLowerCase()===n),s=r.length?r:t.filter(i=>i.institution?.toLowerCase().includes(n));if(!s.length)throw new Error(`no connected bank matches "${e}"`);if(s.length>1)throw new Error(`"${e}" matches ${s.length} bank links; pass one item_id: ${s.map(i=>`${i.itemId} (${i.institution})`).join(", ")}`);return s}});var Pf=T($r=>{"use strict";Object.defineProperty($r,"__esModule",{value:!0});$r.CredentialBroker=$r.identityProvider=$r.passthroughProvider=void 0;$r.resolveProvider=$k;var FE=Ra();$r.passthroughProvider={name:"passthrough",refreshOnInbound:!0,async acquire({userId:t,inboundToken:e}){let n=e?.trim();if(!n)throw new Error(`No inbound data credential for user (fail-closed) \u2014 the platform did not forward a per-user token on this request (userId=${t})`);return{expiresAt:Date.now()+10*6e4,secretRef:n}}};$r.identityProvider={name:"identity",async acquire({userId:t}){if(!t.trim())throw new Error("No verified user (fail-closed)");return{expiresAt:Number.MAX_SAFE_INTEGER,secretRef:null}}};function $k(t,e=process.env){let n=(t??"passthrough").trim().toLowerCase();if(n==="passthrough")return $r.passthroughProvider;if(n==="identity")return $r.identityProvider;if(n==="stored-grant")return new FE.StoredGrantProvider((0,FE.readStoredGrantConfig)(e));throw new Error(`Unknown data credential provider "${t}" (supported: passthrough, identity, stored-grant)`)}var If=class{provider;cache=new Map;constructor(e){this.provider=e,e.onGrantsChanged?.(n=>this.invalidate(n))}async acquire(e,n){if(this.provider.refreshOnInbound)return this.provider.acquire({userId:e,inboundToken:n});let r=this.cache.get(e);if(r&&r.expiresAt>Date.now())return r;this.cache.delete(e);let s=await this.provider.acquire({userId:e,inboundToken:n});return this.cache.set(e,s),s}invalidate(e){this.cache.delete(e)}};$r.CredentialBroker=If});var Rf=T(jn=>{"use strict";var Dk=jn&&jn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Lk=jn&&jn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Mk=jn&&jn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Dk(n,e,r[s]);return Lk(n,e),n}})();Object.defineProperty(jn,"__esModule",{value:!0});jn.ConnectorHost=jn.TURN_META_KEY=void 0;var VE=Mk(require("path")),Gk=require("fs"),Uk=require("@modelcontextprotocol/sdk/client/index.js"),Hk=require("@modelcontextprotocol/sdk/client/stdio.js"),jk=require("@modelcontextprotocol/sdk/types.js"),xk=sl();jn.TURN_META_KEY="ai.agenthippo/turn";var Nf=class t{client;logger;connectorPath;constructor(e,n,r){this.client=e,this.logger=n,this.connectorPath=r}static async spawn(e){let n=VE.resolve(e.connectorPath);await Gk.promises.access(n);let r=await(0,xk.resolveNodeBinary)(),s=new Hk.StdioClientTransport({command:r,args:[n],cwd:VE.dirname(n),env:{...process.env,AGENTHIPPO_DATA_CONNECTOR:"1"},stderr:"pipe"}),i=new Uk.Client({name:"agenthippo-data-gateway",version:"1.0.0"});return await i.connect(s),s.stderr?.on("data",o=>{e.logger?.warn(`[DataPlane] connector stderr: ${String(o).trimEnd()}`)}),e.logger?.info(`[DataPlane] connector started: ${n}`),new t(i,e.logger,n)}async listTools(){return(await this.client.listTools()).tools.map(n=>({name:n.name,description:n.description,inputSchema:n.inputSchema??{type:"object"}}))}async callTool(e,n,r){return await this.client.request({method:"tools/call",params:{name:e,arguments:n,_meta:{[jn.TURN_META_KEY]:{userId:r.userId,credential:r.credential}}}},jk.CallToolResultSchema)}async close(){try{await this.client.close()}catch(e){this.logger?.warn(`[DataPlane] connector close: ${e instanceof Error?e.message:String(e)}`)}}};jn.ConnectorHost=Nf});var kf=T(Ae=>{"use strict";var Bk=Ae&&Ae.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Fk=Ae&&Ae.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Vk=Ae&&Ae.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Bk(n,e,r[s]);return Fk(n,e),n}})();Object.defineProperty(Ae,"__esModule",{value:!0});Ae.JtiReplayCache=Ae.DEFAULT_ISSUER_RATE_PER_MIN=Ae.DEFAULT_FEDERATED_TOKEN_TTL_SEC=Ae.MAX_ASSERTION_LIFETIME_SEC=Ae.FEDERATED_SUB=Ae.FEDERATED_SCOPE=Ae.JWT_BEARER_GRANT=void 0;Ae.hostOf=Lo;Ae.parseAudiences=Wk;Ae.parseIssuers=qk;Ae.verifyAssertion=Jk;Ae.forwardedHost=Xk;Ae.audienceMatches=XE;Ae.federatedTokenAccepted=zk;var JE=Vk(require("crypto"));Ae.JWT_BEARER_GRANT="urn:ietf:params:oauth:grant-type:jwt-bearer";Ae.FEDERATED_SCOPE="agenthippo:chat";Ae.FEDERATED_SUB=/^[A-Za-z0-9_-]{1,64}$/;Ae.MAX_ASSERTION_LIFETIME_SEC=300;Ae.DEFAULT_FEDERATED_TOKEN_TTL_SEC=900;Ae.DEFAULT_ISSUER_RATE_PER_MIN=600;var KE=6e3,WE=3600,Do=30,qE=/^[a-z0-9][a-z0-9-]{0,31}$/,YE=new Set(["svc","anon","spiffe","channel","user","session","usr","voice","slack","telegram","custom","sms","whatsapp","imessage","email","phone","discord","teams","signal","web","line","messenger","matrix"]),Kk=new Set(["localhost","127.0.0.1","[::1]","::1","0.0.0.0"]);function Lo(t){let e=t.trim().toLowerCase();if(e)try{return new URL(e.includes("://")?e:`https://${e}`).hostname||void 0}catch{return}}function Wk(t){let e=(t??"").split(",").map(n=>n.trim()).filter(Boolean).map(n=>Lo(n));if(e.some(n=>!n))throw new Error("AGENTHIPPO_AUTH_AUDIENCES must be a comma-separated list of hosts.");return[...new Set(e)]}function qk(t,e){if(!t?.trim())return[];let n;try{n=JSON.parse(t)}catch{throw new Error("AGENTHIPPO_AUTH_ISSUERS is not valid JSON.")}if(!Array.isArray(n))throw new Error("AGENTHIPPO_AUTH_ISSUERS must be a JSON array of issuers.");let r=new Set,s=new Set;return n.map((i,o)=>{let a=i&&typeof i=="object"?i:{},c=`AGENTHIPPO_AUTH_ISSUERS[${o}]`,l=typeof a.name=="string"?a.name:"";if(!qE.test(l))throw new Error(`${c}.name must be a lower-case slug, got ${JSON.stringify(a.name)}.`);let u=a.prefix===void 0?l:String(a.prefix);if(!qE.test(u)||YE.has(u))throw new Error(`${c}.prefix ${JSON.stringify(u)} must be a lower-case slug and not one of: ${[...YE].join(", ")}.`);if(r.has(l)||s.has(u))throw new Error(`${c}: issuer names and prefixes must each be unique.`);r.add(l),s.add(u);let f=new Map;for(let[h,y]of Object.entries(a.keys&&typeof a.keys=="object"?a.keys:{})){let E;try{E=JE.createPublicKey(String(y))}catch{throw new Error(`${c}.keys.${h} is not a public key PEM.`)}if(E.asymmetricKeyType!=="ed25519")throw new Error(`${c}.keys.${h} must be an Ed25519 key: EdDSA is the only algorithm accepted.`);f.set(h,E)}if(f.size===0)throw new Error(`${c}.keys must hold at least one Ed25519 public key, by kid.`);let d=(Array.isArray(a.audiences)?a.audiences:[]).map(h=>Lo(String(h)));if(d.length===0||d.some(h=>!h))throw new Error(`${c}.audiences must list the hosts its tokens may be used at (the deployments it calls).`);let g=d.find(h=>Kk.has(h)||e!==void 0&&h===e);if(g)throw new Error(`${c}.audiences may not name ${g}: tokens are for the deployments an issuer calls, never this broker or this machine.`);let p=a.tokenTtlSec===void 0?Ae.DEFAULT_FEDERATED_TOKEN_TTL_SEC:Number(a.tokenTtlSec);if(!Number.isInteger(p)||p<60||p>WE)throw new Error(`${c}.tokenTtlSec must be a whole number of seconds from 60 to ${WE}.`);let _=a.ratePerMin===void 0?Ae.DEFAULT_ISSUER_RATE_PER_MIN:Number(a.ratePerMin);if(!Number.isInteger(_)||_<1||_>KE)throw new Error(`${c}.ratePerMin must be a whole number from 1 to ${KE}.`);return{name:l,prefix:u,keys:f,audiences:d,tokenTtlSec:p,ratePerMin:_}})}var Yk="invalid assertion";function Jk(t,e,n,r=Math.floor(Date.now()/1e3)){let s=t.split("."),i=A=>({ok:!1,reason:Yk,detail:A}),o=A=>({ok:!1,reason:A,detail:A});if(s.length!==3)return i("malformed");let a,c;try{a=JSON.parse(Buffer.from(s[0],"base64url").toString("utf8")),c=JSON.parse(Buffer.from(s[1],"base64url").toString("utf8"))}catch{return i("unparseable")}if(!a||typeof a!="object"||!c||typeof c!="object")return i("unparseable");if(a.alg!=="EdDSA")return i("alg is not EdDSA");let l=e.find(A=>A.name===c.iss);if(!l)return i("unknown issuer");let u=typeof a.kid=="string"?l.keys.get(a.kid):void 0;if(!u)return i("unknown kid");let f=!1;try{f=JE.verify(null,Buffer.from(`${s[0]}.${s[1]}`),u,Buffer.from(s[2],"base64url"))}catch{f=!1}if(!f)return i("bad signature");let{sub:d,aud:g,iat:p,exp:_,nbf:h,jti:y,resource:E}=c;return typeof d!="string"||!Ae.FEDERATED_SUB.test(d)?o("sub must be 1 to 64 of A-Z, a-z, 0-9, _ and -"):(Array.isArray(g)?g:[g]).some(A=>typeof A=="string"&&n.includes(A.replace(/\/+$/,"")))?typeof p!="number"||typeof _!="number"?o("iat and exp are required"):_<=r-Do?o("expired"):p>r+Do?o("issued in the future"):h!==void 0&&(typeof h!="number"||h>r+Do)?o("not yet valid"):_<=p||_-p>Ae.MAX_ASSERTION_LIFETIME_SEC||_-r>Ae.MAX_ASSERTION_LIFETIME_SEC+Do?o(`an assertion lives at most ${Ae.MAX_ASSERTION_LIFETIME_SEC}s`):typeof y!="string"||!y||y.length>128?o("jti is required"):typeof E!="string"||!Lo(E)?o("resource (the deployment the token is for) is required"):{ok:!0,issuer:l,sub:d,jti:y,exp:_,resource:E}:o("aud must name this token endpoint")}var Cf=class t{max;seen=new Map;constructor(e=5e4){this.max=e}static forIssuer(e){return new t(Math.max(1e3,e.ratePerMin*Math.ceil((Ae.MAX_ASSERTION_LIFETIME_SEC+2*Do)/60+1)))}has(e,n=Math.floor(Date.now()/1e3)){let r=this.seen.get(e);return r!==void 0&&r>n}claim(e,n,r=Math.floor(Date.now()/1e3)){if(this.seen.size>=this.max)for(let[s,i]of this.seen)i<=r&&this.seen.delete(s);return this.has(e,r)||this.seen.size>=this.max?!1:(this.seen.set(e,n+Do),!0)}};Ae.JtiReplayCache=Cf;function Xk(t){let e=t["x-forwarded-host"],n=(Array.isArray(e)?e[0]:e)?.split(",")[0]?.trim();return n?Lo(n):void 0}function XE(t,e){return e?(Array.isArray(t)?t:[t]).some(n=>typeof n=="string"&&Lo(n)===e):!1}function zk(t,e,n){return e!==void 0&&n.includes(e)&&XE(t,e)}});var Ca=T(xn=>{"use strict";Object.defineProperty(xn,"__esModule",{value:!0});xn.DEFAULT_AUTH_BIND=xn.AUTH_PROXY_SECRET_HEADER=xn.DEFAULT_JWT_SECRET=void 0;xn.resolveAuthBrokerBind=e$;xn.loadAuthBrokerConfig=t$;xn.emailDomainAllowed=n$;var $f=kf();function Qk(t){return t?.trim()?t.split(",").map(e=>e.trim().toLowerCase()).filter(Boolean):[]}xn.DEFAULT_JWT_SECRET="dev-agenthippo-auth-secret-change-me";xn.AUTH_PROXY_SECRET_HEADER="x-agenthippo-proxy-secret";xn.DEFAULT_AUTH_BIND="127.0.0.1";var Zk=new Set(["127.0.0.1","localhost","::1","[::1]"]);function e$(t=process.env){let e=t.AGENTHIPPO_AUTH_BIND?.trim()||xn.DEFAULT_AUTH_BIND;if(!!Zk.has(e.toLowerCase()))return{address:e,isPublic:!1};if(t.AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND!=="1")throw new Error(`Refusing to bind the auth broker to "${e}". This port issues authorization codes and access tokens, and a directly reachable broker can be asked to mint a token for an arbitrary email by forging X-Auth-Request-Email.
477
477
  - Same-host proxy (recommended): bind 127.0.0.1 and run Caddy/oauth2-proxy alongside it.
478
478
  - SEPARATE CONTAINER for the proxy (the compose/Cloud Run layout, where Caddy dials
479
479
  "auth-broker:9780"): the broker must listen on the container's network interface, so set
480
480
  BOTH AGENTHIPPO_AUTH_BIND=${e} AND AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND=1,
481
481
  and make sure the port is not published outside the private network.
482
- In either case set AGENTHIPPO_AUTH_PROXY_SECRET (and have the proxy send it) so a forged X-Auth-Request-Email is rejected \u2014 that is what actually stops the token-minting attack.`);return{address:e,isPublic:!0}}function t$(t=process.env){let e=t.AGENTHIPPO_AUTH_JWT_SECRET?.trim()||xn.DEFAULT_JWT_SECRET,n=(t.AGENTHIPPO_AUTH_PUBLIC_URL?.trim()||`http://127.0.0.1:${t.AGENTHIPPO_AUTH_PORT?.trim()||"9780"}`).replace(/\/+$/,""),r=t.AGENTHIPPO_TEAM_STORE_REPO?.trim()||"agenthippoai/agenthippo-store",s=r.split("/")[0]||"agenthippoai",i=r.split("/")[1]||"agenthippo-store";return{port:Number(t.AGENTHIPPO_AUTH_PORT||9780),publicBaseUrl:n,jwtSecret:e,accessTokenTtlSec:Number(t.AGENTHIPPO_AUTH_ACCESS_TTL_SEC||3600),refreshTokenTtlSec:Number(t.AGENTHIPPO_AUTH_REFRESH_TTL_SEC||720*3600),allowedEmailDomains:Qk(t.AGENTHIPPO_AUTH_ALLOWED_DOMAINS),devMode:t.AGENTHIPPO_AUTH_DEV==="1",rateLimitPerMin:t.AGENTHIPPO_AUTH_RATE_LIMIT!==void 0?Number(t.AGENTHIPPO_AUTH_RATE_LIMIT):60,logPii:t.AGENTHIPPO_AUTH_LOG_PII==="1",cookieName:t.AGENTHIPPO_AUTH_COOKIE_NAME?.trim()||"ah_token",cookieDomain:t.AGENTHIPPO_AUTH_COOKIE_DOMAIN?.trim()||"",idpBaseUrl:(t.AGENTHIPPO_AUTH_IDP_URL?.trim()||"").replace(/\/+$/,""),proxySecret:t.AGENTHIPPO_AUTH_PROXY_SECRET?.trim()||"",trustProxyHeadersUnverified:t.AGENTHIPPO_AUTH_TRUST_PROXY_UNVERIFIED==="1",issuers:(0,$f.parseIssuers)(t.AGENTHIPPO_AUTH_ISSUERS,(0,$f.hostOf)(n)),federatedAudiences:(0,$f.parseAudiences)(t.AGENTHIPPO_AUTH_AUDIENCES),dataDir:t.AGENTHIPPO_AUTH_DATA_DIR?.trim()||void 0,teamConfigured:!!t.AGENTHIPPO_TEAM_ID?.trim(),team:{id:t.AGENTHIPPO_TEAM_ID?.trim()||"team_default",name:t.AGENTHIPPO_TEAM_NAME?.trim()||"Default Team",storeRepo:r,storeIndexUrl:t.AGENTHIPPO_TEAM_STORE_INDEX_URL?.trim()||`https://${s}.github.io/${i}`,githubOrg:t.AGENTHIPPO_TEAM_GITHUB_ORG?.trim()||s,gatewayUrl:t.AGENTHIPPO_TEAM_GATEWAY_URL?.trim()||"https://gateway.agenthippo.ai/v1"}}}function n$(t,e){if(e.length===0)return!0;let n=t.split("@")[1]?.toLowerCase();return!!n&&e.includes(n)}});var ur=T(M=>{"use strict";var r$=M&&M.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),s$=M&&M.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Gf=M&&M.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&r$(n,e,r[s]);return s$(n,e),n}})();Object.defineProperty(M,"__esModule",{value:!0});M.TurnGate=M.TURN_LIMIT_BUSY_MESSAGE=M.RATE_LIMIT_BUSY_MESSAGE=M.TURN_GATE_BUSY_MESSAGE=M.TURN_GATE_RETRY_AFTER_SECONDS=M.TURN_QUEUE_ENV=M.MAX_CONCURRENT_TURNS_ENV=M.TurnLimiter=M.SESSION_WITHOUT_USER_REASON=M.REQUIRE_TENANT_ISOLATION_ENV=M.IDENTITY_PROXY_SECRET_ENV=M.IDENTITY_HEADER_ENV=M.PIN_ONLY_IDENTITY_HEADERS=M.RateLimiter=M.XFF_TRUSTED_HOPS_ENV=M.CONTAINER_SERVE_HOST=M.SERVE_HOST_ENV=M.DEFAULT_BIND_HOST=M.SERVICE_USER_ENV=M.DEFAULT_MAX_BODY_BYTES=void 0;M.resolveStateDir=c$;M.resolveAnalyticsSessionsDir=l$;M.resolveServiceIdentity=u$;M.isLoopbackHost=ZE;M.resolveBindHost=d$;M.clientIp=f$;M.hasTrustedProxyProof=ty;M.identityHeaderAdvice=g$;M.tenantIsolationAdvice=h$;M.resolveUserId=m$;M.resolveDataToken=E$;M.peerToUserId=y$;M.userNamespaceHash=Lf;M.resolveServeSessionKey=w$;M.corsHeaders=S$;M.writeAtCapacity=A$;M.createTurnGateFromEnv=T$;M.createRejectionWarner=b$;M.readBodyWithCap=v$;var i$=Gf(require("os")),Ps=Gf(require("path")),kl=Gf(require("crypto")),o$=bi(),a$=Ca();M.DEFAULT_MAX_BODY_BYTES=1024*1024;function c$(t,e=process.env){let n=t?.trim();if(n)return{dir:Ps.resolve(n),ephemeral:!1};let r=e.AGENTHIPPO_HOME?.trim()||e.AGENTIDE_HOME?.trim();return r?{dir:Ps.join(Ps.resolve(r),"serve-state"),ephemeral:!1}:{dir:Ps.join(i$.tmpdir(),"agenthippo-server"),ephemeral:!0}}function l$(t,e,n=process.env){return!(n.AGENT_HOME_DIR?.trim()||n.AGENTHIPPO_HOME?.trim())&&!e?Ps.join(t,"analytics","sessions"):Ps.join((0,o$.getAgentideHome)(),"analytics","sessions")}M.SERVICE_USER_ENV="AGENTHIPPO_SERVICE_USER";var zE=256;function u$(t=process.env){let e=t[M.SERVICE_USER_ENV];if(e===void 0)return{};let n=e.trim();return n?/\s/.test(n)?{error:`${M.SERVICE_USER_ENV} must not contain whitespace, got ${JSON.stringify(e)}.`}:n.length>zE?{error:`${M.SERVICE_USER_ENV} is ${n.length} chars; the maximum is ${zE}.`}:/^svc:/.test(n)||/^spiffe:\/\//.test(n)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n)?{identity:n}:{identity:n,warning:`${M.SERVICE_USER_ENV}="${n}" carries no namespace marker (svc: / spiffe:// / GUID). It will be used verbatim and must be mapped in the connector role map, exactly like a human identity. If it can collide with a real user id, prefix it with \`svc:\`.`}:{error:`${M.SERVICE_USER_ENV} is set but empty. Unset it, or give it the identity unattended runs should act as.`}}M.DEFAULT_BIND_HOST="127.0.0.1";function ZE(t){let e=t.trim().toLowerCase().replace(/^\[|\]$/g,"");return e==="localhost"||e==="::1"||/^127\./.test(e)}M.SERVE_HOST_ENV="AGENTHIPPO_SERVE_HOST";M.CONTAINER_SERVE_HOST="0.0.0.0";function d$(t,e=process.env){return t?.trim()||e.AGENTHIPPO_SERVE_HOST?.trim()||M.DEFAULT_BIND_HOST}M.XFF_TRUSTED_HOPS_ENV="AGENTHIPPO_XFF_TRUSTED_HOPS";function f$(t,e=process.env){let n=t.headers["x-forwarded-for"],r=Array.isArray(n)?n[0]:n;if(r){let s=r.split(",").map(i=>i.trim()).filter(Boolean);if(s.length>0){let i=Number(e[M.XFF_TRUSTED_HOPS_ENV]),o=Number.isInteger(i)&&i>=1?i:1;return s[Math.max(0,s.length-o)]}}return t.socket?.remoteAddress||"unknown"}var Df=class t{maxPerWindow;windowMs;hits=new Map;static MAX_KEYS=1e5;constructor(e,n=6e4){this.maxPerWindow=e,this.windowMs=n}tryConsume(e,n=Date.now()){if(!Number.isFinite(this.maxPerWindow)||this.maxPerWindow<=0)return!0;let r=this.hits.get(e);return!r||r.resetAt<=n?(this.hits.size>=t.MAX_KEYS&&this.prune(n),this.hits.set(e,{count:1,resetAt:n+this.windowMs}),!0):r.count>=this.maxPerWindow?!1:(r.count+=1,!0)}retryAfterSeconds(e,n=Date.now()){let r=this.hits.get(e);return r?Math.max(1,Math.ceil((r.resetAt-n)/1e3)):Math.ceil(this.windowMs/1e3)}prune(e){for(let[n,r]of this.hits)r.resetAt<=e&&this.hits.delete(n);this.hits.size>=t.MAX_KEYS&&this.hits.clear()}};M.RateLimiter=Df;var ey=["x-forwarded-email","x-forwarded-preferred-username","x-goog-authenticated-user-email","cf-access-authenticated-user-email"],p$="x-goog-authenticated-user-email";M.PIN_ONLY_IDENTITY_HEADERS=["x-agent-user"];M.IDENTITY_HEADER_ENV="AGENTHIPPO_IDENTITY_HEADER";M.IDENTITY_PROXY_SECRET_ENV="AGENTHIPPO_IDENTITY_PROXY_SECRET";function ty(t,e){if(!e)return!1;let n=t[a$.AUTH_PROXY_SECRET_HEADER],r=typeof n=="string"?n:Array.isArray(n)?String(n[0]??""):"";if(!r)return!1;let s=kl.createHash("sha256").update(r).digest(),i=kl.createHash("sha256").update(e).digest();return kl.timingSafeEqual(s,i)}function g$(t=process.env,e){if(t[M.IDENTITY_HEADER_ENV]?.trim())return[];let r=e?.trim();return r&&ZE(r)?[`${M.IDENTITY_HEADER_ENV} is not set. Fine for this loopback bind; pin it before exposing serve on a network interface.`]:[...r?[`serve is bound to ${r} \u2014 reachable beyond this machine \u2014 with no ${M.IDENTITY_HEADER_ENV} pinned. Anyone who can reach this port is trusted to state who they are.`]:[],`${M.IDENTITY_HEADER_ENV} is not set, so identity falls back to the platform header aliases (${ey.join(", ")}). That is only safe when your proxy sets AND STRIPS every one of them. Pin the single header your deploy layer really controls, e.g. ${M.IDENTITY_HEADER_ENV}=x-goog-authenticated-user-email.`,`NOTE: ${M.PIN_ONLY_IDENTITY_HEADERS.join(", ")} is NO LONGER trusted by default \u2014 it is not stripped by any platform, so an arbitrary client could send it and be namespaced as another user. If your proxy does set it (the Caddy forward_auth / auth-broker flow does), pin it: ${M.IDENTITY_HEADER_ENV}=x-agent-user.`]}M.REQUIRE_TENANT_ISOLATION_ENV="AGENTHIPPO_REQUIRE_TENANT_ISOLATION";function QE(t,e){let n=Ps.resolve(t),r=Ps.resolve(e);return n===r||n.startsWith(r+Ps.sep)}function h$(t,e=process.env){if(!e[M.IDENTITY_HEADER_ENV]?.trim())return{level:"ok",lines:[]};if(t.sandbox==="container"&&!t.sharedWorkspace)return{level:"ok",lines:[]};let r=t.sandbox==="process"?"a tier-0 (--sandbox=process) sandbox":"no sandbox",s=[`${M.IDENTITY_HEADER_ENV} is pinned \u2014 so this serve has more than one user \u2014 but it runs with ${r}, which shares one uid, one workspace (${t.workspace??"unset"}) and one state dir (${t.stateDir}) across all of them. Any user can read every other user's engine session files, which hold their conversations verbatim. Per-user paths are namespacing, not isolation.`,"The boundary is --sandbox=container (per-session workspace and state, without --shared-workspace) or one serve per tenant. Until then, restrict the pack's tool surface so the agent has no way to read arbitrary files."];return t.workspace&&QE(t.workspace,t.stateDir)?s.push(`--workspace ${t.workspace} sits INSIDE --state-dir ${t.stateDir}: every other user's sessions, analytics and evidence spool are one '..' above the agent's own cwd. Put them in unrelated subtrees (e.g. --workspace=/work --state-dir=/state).`):t.workspace&&QE(t.stateDir,t.workspace)&&s.push(`--state-dir ${t.stateDir} sits INSIDE --workspace ${t.workspace}: every other user's sessions, analytics and evidence spool are inside the directory the agent is pointed at. Put them in unrelated subtrees (e.g. --workspace=/work --state-dir=/state).`),{level:/^(1|true|yes|on)$/i.test(e[M.REQUIRE_TENANT_ISOLATION_ENV]?.trim()??"")?"refuse":"warn",lines:s}}function m$(t,e,n=process.env){let r=n[M.IDENTITY_PROXY_SECRET_ENV]?.trim();if(r&&!ty(t,r))return;let s=n[M.IDENTITY_HEADER_ENV]?.trim().toLowerCase(),i=s?[s]:ey;for(let a of i){let c=t[a],l=(Array.isArray(c)?c[0]:c)?.trim();if(l){let u=a===p$?l.lastIndexOf(":"):-1;return u>=0&&l.slice(u+1).includes("@")?l.slice(u+1):l}}return s||n.AGENTHIPPO_ALLOW_BODY_IDENTITY?.trim()!=="1"?void 0:e?.user_id?.trim()||void 0}var _$=["x-forwarded-access-token","x-agent-data-token"];function E$(t){for(let e of _$){let n=t[e],r=(Array.isArray(n)?n[0]:n)?.trim();if(r)return r}}function y$(t){if(!t)return;let e=t.senderId?.trim()||t.senderUsername?.trim()||t.senderName?.trim();if(!e)return;let n=t.channel?.trim();return n?`${n}:${e}`:e}M.SESSION_WITHOUT_USER_REASON="session_without_verified_user";function Lf(t){return kl.createHash("sha256").update(t).digest("hex").slice(0,16)}function w$(t,e,n="session",r=process.env){let s=t?.trim(),i=e?.trim();if(i){let a=`u${Lf(i)}--${s||"default"}`;return{sessionKey:a,sandboxKey:n==="user"?`u${Lf(i)}`:a}}if(r[M.IDENTITY_HEADER_ENV]?.trim())return{sessionKey:"",sandboxKey:"",rejected:M.SESSION_WITHOUT_USER_REASON};let o=s||"anon-unknown";return{sessionKey:o,sandboxKey:o}}function S$(){return{"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Agent-User","Access-Control-Allow-Origin":"*"}}var Mf=class{maxPerSession;counts=new Map;constructor(e){this.maxPerSession=e}tryConsume(e){if(!Number.isFinite(this.maxPerSession)||this.maxPerSession<=0)return!0;let n=this.counts.get(e)??0;return n>=this.maxPerSession?!1:(this.counts.set(e,n+1),!0)}reset(e){this.counts.delete(e)}};M.TurnLimiter=Mf;M.MAX_CONCURRENT_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_TURNS";M.TURN_QUEUE_ENV="AGENTHIPPO_TURN_QUEUE";M.TURN_GATE_RETRY_AFTER_SECONDS=15;function A$(t,e){t.writeHead(429,{"Content-Type":"application/json","Retry-After":String(M.TURN_GATE_RETRY_AFTER_SECONDS)}),t.end(JSON.stringify(e?{error:"At capacity",reason:e}:{error:"At capacity"}))}M.TURN_GATE_BUSY_MESSAGE="At capacity \u2014 please retry in a moment";M.RATE_LIMIT_BUSY_MESSAGE="Rate limit exceeded \u2014 please retry in a moment";M.TURN_LIMIT_BUSY_MESSAGE="Per-session turn limit reached";var $l=class{maxInflight;maxQueue;queueTimeoutMs;inflightCount=0;waiters=[];constructor(e,n,r=M.TURN_GATE_RETRY_AFTER_SECONDS*1e3){this.maxInflight=e,this.maxQueue=n,this.queueTimeoutMs=r}async acquire(){return!Number.isFinite(this.maxInflight)||this.maxInflight<=0?()=>{}:this.inflightCount<this.maxInflight?(this.inflightCount+=1,()=>this.releaseSlot()):this.waiters.length>=this.maxQueue?null:new Promise(e=>{let n=!1,r=o=>{if(n){o&&o();return}n=!0,clearTimeout(i),e(o)},s={resolve:r,timer:null},i=setTimeout(()=>{let o=this.waiters.indexOf(s);o>=0&&this.waiters.splice(o,1),r(null)},this.queueTimeoutMs);s.timer=i,this.waiters.push(s)})}releaseSlot(){let e=this.waiters.shift();if(e){e.resolve(()=>this.releaseSlot());return}this.inflightCount=Math.max(0,this.inflightCount-1)}get inflight(){return this.inflightCount}get queued(){return this.waiters.length}get max(){return this.maxInflight>0?this.maxInflight:0}};M.TurnGate=$l;function T$(t=process.env){let e=Number(t[M.MAX_CONCURRENT_TURNS_ENV]??10),n=Number(t[M.TURN_QUEUE_ENV]??20),r=Number.isFinite(e)?e:10,s=Number.isFinite(n)&&n>=0?n:20;return new $l(r,s)}function b$(t=5e3){let e=0;return n=>{let r=Date.now();r-e<t||(e=r,console.warn(n))}}function v$(t,e=M.DEFAULT_MAX_BODY_BYTES){return new Promise((n,r)=>{let s=0,i=[],o=u=>{if(s+=u.length,s>e){l();let d=new Error(`Request body exceeds ${e} bytes`);d.tooLarge=!0,r(d);return}i.push(u)},a=()=>{l(),n(Buffer.concat(i).toString("utf8"))},c=u=>{l(),r(u)},l=()=>{t.off("data",o),t.off("end",a),t.off("error",c)};t.on("data",o),t.on("end",a),t.on("error",c)})}});var Mo=T(hn=>{"use strict";var O$=hn&&hn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),I$=hn&&hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),P$=hn&&hn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&O$(n,e,r[s]);return I$(n,e),n}})();Object.defineProperty(hn,"__esModule",{value:!0});hn.TURN_NONCE_HEADER=hn.TURN_NONCE_ENV=hn.DATA_MCP_URL_ENV=void 0;hn.startDataGateway=D$;var N$=P$(require("http")),R$=require("@modelcontextprotocol/sdk/server/index.js"),C$=require("@modelcontextprotocol/sdk/server/streamableHttp.js"),ny=require("@modelcontextprotocol/sdk/types.js"),k$=ur(),$$=Co();hn.DATA_MCP_URL_ENV="AGENTHIPPO_DATA_MCP_URL";hn.TURN_NONCE_ENV="AGENTHIPPO_TURN_NONCE";hn.TURN_NONCE_HEADER="x-agent-turn-nonce";function ry(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function sy(t){return t?(0,$$.hashNonce)(t).slice(0,12):"none"}async function D$(t){let e=N$.createServer(async(i,o)=>{try{let a=i.url?.split("?")[0]??"";if(a==="/turn"&&i.method==="DELETE"){let p=ry(i.headers.authorization);if(p){let g=t.registry.releaseByNonce(p);t.audit?.("edge","turn_release",{released:g,nonce_sha256_prefix:sy(p)})}o.writeHead(204),o.end();return}if(a!=="/mcp"){o.writeHead(404,{"Content-Type":"application/json"}),o.end(JSON.stringify({error:"not found"}));return}if(i.method!=="POST"){o.writeHead(405,{"Content-Type":"application/json",Allow:"POST"}),o.end(JSON.stringify({error:"method not allowed"}));return}let c=ry(i.headers.authorization),l=c?t.registry.resolve(c):void 0;if(!l){t.audit?.("unauthorized","nonce_reject",{reason:c?"unknown_or_expired":"missing",nonce_sha256_prefix:sy(c)}),o.writeHead(401,{"Content-Type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32001,message:"Unauthorized: missing, unknown, or expired turn nonce"},id:null}));return}t.logger?.info(`[DataPlane] authorized request user=${l.userId} session=${l.sessionKey}`);let u;try{u=JSON.parse(await(0,k$.readBodyWithCap)(i))}catch{o.writeHead(400,{"Content-Type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32700,message:"Parse error"},id:null}));return}let d=L$(t,l),f=new C$.StreamableHTTPServerTransport({sessionIdGenerator:void 0,enableJsonResponse:!0});o.on("close",()=>{f.close(),d.close()}),await d.connect(f),await f.handleRequest(i,o,u)}catch(a){t.logger?.warn(`[DataPlane] gateway error: ${a instanceof Error?a.message:String(a)}`),o.headersSent||o.writeHead(500,{"Content-Type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:null}))}}),n=t.host??"127.0.0.1";await new Promise((i,o)=>{e.once("error",o),e.listen(t.port??0,n,()=>i())});let r=e.address();if(!r||typeof r=="string")throw new Error("Data gateway failed to bind a port");let s=`http://${t.advertiseHost??"127.0.0.1"}:${r.port}/mcp`;return t.logger?.info(`[DataPlane] gateway listening at ${s}`),{url:s,close:()=>new Promise(i=>e.close(()=>i()))}}function L$(t,e){let n=new R$.Server({name:"agenthippo-data-gateway",version:"1.0.0"},{capabilities:{tools:{}}}),r=t.broker.provider.tools??[],s=new Set(r.map(i=>i.definition.name));return n.setRequestHandler(ny.ListToolsRequestSchema,async()=>({tools:[...r.map(i=>i.definition),...(await t.connector.listTools()).filter(i=>!s.has(i.name))]})),n.setRequestHandler(ny.CallToolRequestSchema,async i=>{let o=i.params.name,a=r.find(l=>l.definition.name===o);if(a){t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name,brokerSide:!0});try{let l=await a.call({userId:e.userId,sessionKey:e.sessionKey,invalidate:()=>t.broker.invalidate(e.userId)},i.params.arguments??{});return{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}catch(l){let u=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"provider_tool_failed",error:u}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:u})}],isError:!0}}}let c;try{c=(await t.broker.acquire(e.userId,e.inboundToken)).secretRef,t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name})}catch(l){let u=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"acquire_failed",error:u}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:`credential acquire failed (fail-closed): ${u}`})}],isError:!0}}try{return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:c})}catch(l){let u=l instanceof Error?l.message:String(l);if(/401|unauthoriz|expired/i.test(u)){t.broker.invalidate(e.userId);try{let d=await t.broker.acquire(e.userId,e.inboundToken);return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:d.secretRef})}catch{}}return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"call_failed",error:u}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:u})}],isError:!0}}}),n}});var xf=T(jf=>{"use strict";Object.defineProperty(jf,"__esModule",{value:!0});jf.createConnectHandler=j$;var M$=require("crypto"),G$=ur(),Dl=Ra(),Ml=t=>t.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]),iy=t=>JSON.stringify(t).replace(/</g,"\\u003c"),oy="default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'",U$=t=>`default-src 'none'; script-src 'nonce-${t}' https://cdn.plaid.com; frame-src https://cdn.plaid.com https://*.plaid.com; connect-src 'self' https://*.plaid.com; img-src https: data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'`,Ll={"Cache-Control":"no-store","Referrer-Policy":"no-referrer","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY"};function Uf(t,e,n,r){t.writeHead(e,{...Ll,"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":r}),t.end(n)}function Hf(t,e){return`<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
482
+ In either case set AGENTHIPPO_AUTH_PROXY_SECRET (and have the proxy send it) so a forged X-Auth-Request-Email is rejected \u2014 that is what actually stops the token-minting attack.`);return{address:e,isPublic:!0}}function t$(t=process.env){let e=t.AGENTHIPPO_AUTH_JWT_SECRET?.trim()||xn.DEFAULT_JWT_SECRET,n=(t.AGENTHIPPO_AUTH_PUBLIC_URL?.trim()||`http://127.0.0.1:${t.AGENTHIPPO_AUTH_PORT?.trim()||"9780"}`).replace(/\/+$/,""),r=t.AGENTHIPPO_TEAM_STORE_REPO?.trim()||"agenthippoai/agenthippo-store",s=r.split("/")[0]||"agenthippoai",i=r.split("/")[1]||"agenthippo-store";return{port:Number(t.AGENTHIPPO_AUTH_PORT||9780),publicBaseUrl:n,jwtSecret:e,accessTokenTtlSec:Number(t.AGENTHIPPO_AUTH_ACCESS_TTL_SEC||3600),refreshTokenTtlSec:Number(t.AGENTHIPPO_AUTH_REFRESH_TTL_SEC||720*3600),allowedEmailDomains:Qk(t.AGENTHIPPO_AUTH_ALLOWED_DOMAINS),devMode:t.AGENTHIPPO_AUTH_DEV==="1",rateLimitPerMin:t.AGENTHIPPO_AUTH_RATE_LIMIT!==void 0?Number(t.AGENTHIPPO_AUTH_RATE_LIMIT):60,logPii:t.AGENTHIPPO_AUTH_LOG_PII==="1",cookieName:t.AGENTHIPPO_AUTH_COOKIE_NAME?.trim()||"ah_token",cookieDomain:t.AGENTHIPPO_AUTH_COOKIE_DOMAIN?.trim()||"",idpBaseUrl:(t.AGENTHIPPO_AUTH_IDP_URL?.trim()||"").replace(/\/+$/,""),proxySecret:t.AGENTHIPPO_AUTH_PROXY_SECRET?.trim()||"",trustProxyHeadersUnverified:t.AGENTHIPPO_AUTH_TRUST_PROXY_UNVERIFIED==="1",issuers:(0,$f.parseIssuers)(t.AGENTHIPPO_AUTH_ISSUERS,(0,$f.hostOf)(n)),federatedAudiences:(0,$f.parseAudiences)(t.AGENTHIPPO_AUTH_AUDIENCES),dataDir:t.AGENTHIPPO_AUTH_DATA_DIR?.trim()||void 0,teamConfigured:!!t.AGENTHIPPO_TEAM_ID?.trim(),team:{id:t.AGENTHIPPO_TEAM_ID?.trim()||"team_default",name:t.AGENTHIPPO_TEAM_NAME?.trim()||"Default Team",storeRepo:r,storeIndexUrl:t.AGENTHIPPO_TEAM_STORE_INDEX_URL?.trim()||`https://${s}.github.io/${i}`,githubOrg:t.AGENTHIPPO_TEAM_GITHUB_ORG?.trim()||s,gatewayUrl:t.AGENTHIPPO_TEAM_GATEWAY_URL?.trim()||"https://gateway.agenthippo.ai/v1"}}}function n$(t,e){if(e.length===0)return!0;let n=t.split("@")[1]?.toLowerCase();return!!n&&e.includes(n)}});var ur=T(M=>{"use strict";var r$=M&&M.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),s$=M&&M.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Gf=M&&M.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&r$(n,e,r[s]);return s$(n,e),n}})();Object.defineProperty(M,"__esModule",{value:!0});M.TurnGate=M.TURN_LIMIT_BUSY_MESSAGE=M.RATE_LIMIT_BUSY_MESSAGE=M.TURN_GATE_BUSY_MESSAGE=M.TURN_GATE_RETRY_AFTER_SECONDS=M.TURN_QUEUE_ENV=M.MAX_CONCURRENT_TURNS_ENV=M.TurnLimiter=M.SESSION_WITHOUT_USER_REASON=M.REQUIRE_TENANT_ISOLATION_ENV=M.IDENTITY_PROXY_SECRET_ENV=M.IDENTITY_HEADER_ENV=M.PIN_ONLY_IDENTITY_HEADERS=M.RateLimiter=M.XFF_TRUSTED_HOPS_ENV=M.CONTAINER_SERVE_HOST=M.SERVE_HOST_ENV=M.DEFAULT_BIND_HOST=M.SERVICE_USER_ENV=M.DEFAULT_MAX_BODY_BYTES=void 0;M.resolveStateDir=c$;M.resolveAnalyticsSessionsDir=l$;M.resolveServiceIdentity=u$;M.isLoopbackHost=ZE;M.resolveBindHost=d$;M.clientIp=f$;M.hasTrustedProxyProof=ty;M.identityHeaderAdvice=g$;M.tenantIsolationAdvice=h$;M.resolveUserId=m$;M.resolveDataToken=E$;M.peerToUserId=y$;M.userNamespaceHash=Lf;M.resolveServeSessionKey=w$;M.corsHeaders=S$;M.writeAtCapacity=A$;M.createTurnGateFromEnv=T$;M.createRejectionWarner=b$;M.readBodyWithCap=v$;var i$=Gf(require("os")),Ps=Gf(require("path")),kl=Gf(require("crypto")),o$=bi(),a$=Ca();M.DEFAULT_MAX_BODY_BYTES=1024*1024;function c$(t,e=process.env){let n=t?.trim();if(n)return{dir:Ps.resolve(n),ephemeral:!1};let r=e.AGENTHIPPO_HOME?.trim()||e.AGENTIDE_HOME?.trim();return r?{dir:Ps.join(Ps.resolve(r),"serve-state"),ephemeral:!1}:{dir:Ps.join(i$.tmpdir(),"agenthippo-server"),ephemeral:!0}}function l$(t,e,n=process.env){return!(n.AGENT_HOME_DIR?.trim()||n.AGENTHIPPO_HOME?.trim())&&!e?Ps.join(t,"analytics","sessions"):Ps.join((0,o$.getAgentideHome)(),"analytics","sessions")}M.SERVICE_USER_ENV="AGENTHIPPO_SERVICE_USER";var zE=256;function u$(t=process.env){let e=t[M.SERVICE_USER_ENV];if(e===void 0)return{};let n=e.trim();return n?/\s/.test(n)?{error:`${M.SERVICE_USER_ENV} must not contain whitespace, got ${JSON.stringify(e)}.`}:n.length>zE?{error:`${M.SERVICE_USER_ENV} is ${n.length} chars; the maximum is ${zE}.`}:/^svc:/.test(n)||/^spiffe:\/\//.test(n)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n)?{identity:n}:{identity:n,warning:`${M.SERVICE_USER_ENV}="${n}" carries no namespace marker (svc: / spiffe:// / GUID). It will be used verbatim and must be mapped in the connector role map, exactly like a human identity. If it can collide with a real user id, prefix it with \`svc:\`.`}:{error:`${M.SERVICE_USER_ENV} is set but empty. Unset it, or give it the identity unattended runs should act as.`}}M.DEFAULT_BIND_HOST="127.0.0.1";function ZE(t){let e=t.trim().toLowerCase().replace(/^\[|\]$/g,"");return e==="localhost"||e==="::1"||/^127\./.test(e)}M.SERVE_HOST_ENV="AGENTHIPPO_SERVE_HOST";M.CONTAINER_SERVE_HOST="0.0.0.0";function d$(t,e=process.env){return t?.trim()||e.AGENTHIPPO_SERVE_HOST?.trim()||M.DEFAULT_BIND_HOST}M.XFF_TRUSTED_HOPS_ENV="AGENTHIPPO_XFF_TRUSTED_HOPS";function f$(t,e=process.env){let n=t.headers["x-forwarded-for"],r=Array.isArray(n)?n[0]:n;if(r){let s=r.split(",").map(i=>i.trim()).filter(Boolean);if(s.length>0){let i=Number(e[M.XFF_TRUSTED_HOPS_ENV]),o=Number.isInteger(i)&&i>=1?i:1;return s[Math.max(0,s.length-o)]}}return t.socket?.remoteAddress||"unknown"}var Df=class t{maxPerWindow;windowMs;hits=new Map;static MAX_KEYS=1e5;constructor(e,n=6e4){this.maxPerWindow=e,this.windowMs=n}tryConsume(e,n=Date.now()){if(!Number.isFinite(this.maxPerWindow)||this.maxPerWindow<=0)return!0;let r=this.hits.get(e);return!r||r.resetAt<=n?(this.hits.size>=t.MAX_KEYS&&this.prune(n),this.hits.set(e,{count:1,resetAt:n+this.windowMs}),!0):r.count>=this.maxPerWindow?!1:(r.count+=1,!0)}retryAfterSeconds(e,n=Date.now()){let r=this.hits.get(e);return r?Math.max(1,Math.ceil((r.resetAt-n)/1e3)):Math.ceil(this.windowMs/1e3)}prune(e){for(let[n,r]of this.hits)r.resetAt<=e&&this.hits.delete(n);this.hits.size>=t.MAX_KEYS&&this.hits.clear()}};M.RateLimiter=Df;var ey=["x-forwarded-email","x-forwarded-preferred-username","x-goog-authenticated-user-email","cf-access-authenticated-user-email"],p$="x-goog-authenticated-user-email";M.PIN_ONLY_IDENTITY_HEADERS=["x-agent-user"];M.IDENTITY_HEADER_ENV="AGENTHIPPO_IDENTITY_HEADER";M.IDENTITY_PROXY_SECRET_ENV="AGENTHIPPO_IDENTITY_PROXY_SECRET";function ty(t,e){if(!e)return!1;let n=t[a$.AUTH_PROXY_SECRET_HEADER],r=typeof n=="string"?n:Array.isArray(n)?String(n[0]??""):"";if(!r)return!1;let s=kl.createHash("sha256").update(r).digest(),i=kl.createHash("sha256").update(e).digest();return kl.timingSafeEqual(s,i)}function g$(t=process.env,e){if(t[M.IDENTITY_HEADER_ENV]?.trim())return[];let r=e?.trim();return r&&ZE(r)?[`${M.IDENTITY_HEADER_ENV} is not set. Fine for this loopback bind; pin it before exposing serve on a network interface.`]:[...r?[`serve is bound to ${r} \u2014 reachable beyond this machine \u2014 with no ${M.IDENTITY_HEADER_ENV} pinned. Anyone who can reach this port is trusted to state who they are.`]:[],`${M.IDENTITY_HEADER_ENV} is not set, so identity falls back to the platform header aliases (${ey.join(", ")}). That is only safe when your proxy sets AND STRIPS every one of them. Pin the single header your deploy layer really controls, e.g. ${M.IDENTITY_HEADER_ENV}=x-goog-authenticated-user-email.`,`NOTE: ${M.PIN_ONLY_IDENTITY_HEADERS.join(", ")} is NO LONGER trusted by default \u2014 it is not stripped by any platform, so an arbitrary client could send it and be namespaced as another user. If your proxy does set it (the Caddy forward_auth / auth-broker flow does), pin it: ${M.IDENTITY_HEADER_ENV}=x-agent-user.`]}M.REQUIRE_TENANT_ISOLATION_ENV="AGENTHIPPO_REQUIRE_TENANT_ISOLATION";function QE(t,e){let n=Ps.resolve(t),r=Ps.resolve(e);return n===r||n.startsWith(r+Ps.sep)}function h$(t,e=process.env){if(!e[M.IDENTITY_HEADER_ENV]?.trim())return{level:"ok",lines:[]};if(t.sandbox==="container"&&!t.sharedWorkspace)return{level:"ok",lines:[]};let r=t.sandbox==="process"?"a tier-0 (--sandbox=process) sandbox":"no sandbox",s=[`${M.IDENTITY_HEADER_ENV} is pinned \u2014 so this serve has more than one user \u2014 but it runs with ${r}, which shares one uid, one workspace (${t.workspace??"unset"}) and one state dir (${t.stateDir}) across all of them. Any user can read every other user's engine session files, which hold their conversations verbatim. Per-user paths are namespacing, not isolation.`,"The boundary is --sandbox=container (per-session workspace and state, without --shared-workspace) or one serve per tenant. Until then, restrict the pack's tool surface so the agent has no way to read arbitrary files."];return t.workspace&&QE(t.workspace,t.stateDir)?s.push(`--workspace ${t.workspace} sits INSIDE --state-dir ${t.stateDir}: every other user's sessions, analytics and evidence spool are one '..' above the agent's own cwd. Put them in unrelated subtrees (e.g. --workspace=/work --state-dir=/state).`):t.workspace&&QE(t.stateDir,t.workspace)&&s.push(`--state-dir ${t.stateDir} sits INSIDE --workspace ${t.workspace}: every other user's sessions, analytics and evidence spool are inside the directory the agent is pointed at. Put them in unrelated subtrees (e.g. --workspace=/work --state-dir=/state).`),{level:/^(1|true|yes|on)$/i.test(e[M.REQUIRE_TENANT_ISOLATION_ENV]?.trim()??"")?"refuse":"warn",lines:s}}function m$(t,e,n=process.env){let r=n[M.IDENTITY_PROXY_SECRET_ENV]?.trim();if(r&&!ty(t,r))return;let s=n[M.IDENTITY_HEADER_ENV]?.trim().toLowerCase(),i=s?[s]:ey;for(let a of i){let c=t[a],l=(Array.isArray(c)?c[0]:c)?.trim();if(l){let u=a===p$?l.lastIndexOf(":"):-1;return u>=0&&l.slice(u+1).includes("@")?l.slice(u+1):l}}return s||n.AGENTHIPPO_ALLOW_BODY_IDENTITY?.trim()!=="1"?void 0:e?.user_id?.trim()||void 0}var _$=["x-forwarded-access-token","x-agent-data-token"];function E$(t){for(let e of _$){let n=t[e],r=(Array.isArray(n)?n[0]:n)?.trim();if(r)return r}}function y$(t){if(!t)return;let e=t.senderId?.trim()||t.senderUsername?.trim()||t.senderName?.trim();if(!e)return;let n=t.channel?.trim();return n?`${n}:${e}`:e}M.SESSION_WITHOUT_USER_REASON="session_without_verified_user";function Lf(t){return kl.createHash("sha256").update(t).digest("hex").slice(0,16)}function w$(t,e,n="session",r=process.env){let s=t?.trim(),i=e?.trim();if(i){let a=`u${Lf(i)}--${s||"default"}`;return{sessionKey:a,sandboxKey:n==="user"?`u${Lf(i)}`:a}}if(r[M.IDENTITY_HEADER_ENV]?.trim())return{sessionKey:"",sandboxKey:"",rejected:M.SESSION_WITHOUT_USER_REASON};let o=s||"anon-unknown";return{sessionKey:o,sandboxKey:o}}function S$(){return{"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Agent-User","Access-Control-Allow-Origin":"*"}}var Mf=class{maxPerSession;counts=new Map;constructor(e){this.maxPerSession=e}tryConsume(e){if(!Number.isFinite(this.maxPerSession)||this.maxPerSession<=0)return!0;let n=this.counts.get(e)??0;return n>=this.maxPerSession?!1:(this.counts.set(e,n+1),!0)}reset(e){this.counts.delete(e)}};M.TurnLimiter=Mf;M.MAX_CONCURRENT_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_TURNS";M.TURN_QUEUE_ENV="AGENTHIPPO_TURN_QUEUE";M.TURN_GATE_RETRY_AFTER_SECONDS=15;function A$(t,e){t.writeHead(429,{"Content-Type":"application/json","Retry-After":String(M.TURN_GATE_RETRY_AFTER_SECONDS)}),t.end(JSON.stringify(e?{error:"At capacity",reason:e}:{error:"At capacity"}))}M.TURN_GATE_BUSY_MESSAGE="At capacity \u2014 please retry in a moment";M.RATE_LIMIT_BUSY_MESSAGE="Rate limit exceeded \u2014 please retry in a moment";M.TURN_LIMIT_BUSY_MESSAGE="Per-session turn limit reached";var $l=class{maxInflight;maxQueue;queueTimeoutMs;inflightCount=0;waiters=[];constructor(e,n,r=M.TURN_GATE_RETRY_AFTER_SECONDS*1e3){this.maxInflight=e,this.maxQueue=n,this.queueTimeoutMs=r}async acquire(){return!Number.isFinite(this.maxInflight)||this.maxInflight<=0?()=>{}:this.inflightCount<this.maxInflight?(this.inflightCount+=1,()=>this.releaseSlot()):this.waiters.length>=this.maxQueue?null:new Promise(e=>{let n=!1,r=o=>{if(n){o&&o();return}n=!0,clearTimeout(i),e(o)},s={resolve:r,timer:null},i=setTimeout(()=>{let o=this.waiters.indexOf(s);o>=0&&this.waiters.splice(o,1),r(null)},this.queueTimeoutMs);s.timer=i,this.waiters.push(s)})}releaseSlot(){let e=this.waiters.shift();if(e){e.resolve(()=>this.releaseSlot());return}this.inflightCount=Math.max(0,this.inflightCount-1)}get inflight(){return this.inflightCount}get queued(){return this.waiters.length}get max(){return this.maxInflight>0?this.maxInflight:0}};M.TurnGate=$l;function T$(t=process.env){let e=Number(t[M.MAX_CONCURRENT_TURNS_ENV]??10),n=Number(t[M.TURN_QUEUE_ENV]??20),r=Number.isFinite(e)?e:10,s=Number.isFinite(n)&&n>=0?n:20;return new $l(r,s)}function b$(t=5e3){let e=0;return n=>{let r=Date.now();r-e<t||(e=r,console.warn(n))}}function v$(t,e=M.DEFAULT_MAX_BODY_BYTES){return new Promise((n,r)=>{let s=0,i=[],o=u=>{if(s+=u.length,s>e){l();let f=new Error(`Request body exceeds ${e} bytes`);f.tooLarge=!0,r(f);return}i.push(u)},a=()=>{l(),n(Buffer.concat(i).toString("utf8"))},c=u=>{l(),r(u)},l=()=>{t.off("data",o),t.off("end",a),t.off("error",c)};t.on("data",o),t.on("end",a),t.on("error",c)})}});var Mo=T(hn=>{"use strict";var O$=hn&&hn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),I$=hn&&hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),P$=hn&&hn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&O$(n,e,r[s]);return I$(n,e),n}})();Object.defineProperty(hn,"__esModule",{value:!0});hn.TURN_NONCE_HEADER=hn.TURN_NONCE_ENV=hn.DATA_MCP_URL_ENV=void 0;hn.startDataGateway=D$;var N$=P$(require("http")),R$=require("@modelcontextprotocol/sdk/server/index.js"),C$=require("@modelcontextprotocol/sdk/server/streamableHttp.js"),ny=require("@modelcontextprotocol/sdk/types.js"),k$=ur(),$$=Co();hn.DATA_MCP_URL_ENV="AGENTHIPPO_DATA_MCP_URL";hn.TURN_NONCE_ENV="AGENTHIPPO_TURN_NONCE";hn.TURN_NONCE_HEADER="x-agent-turn-nonce";function ry(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function sy(t){return t?(0,$$.hashNonce)(t).slice(0,12):"none"}async function D$(t){let e=N$.createServer(async(i,o)=>{try{let a=i.url?.split("?")[0]??"";if(a==="/turn"&&i.method==="DELETE"){let g=ry(i.headers.authorization);if(g){let p=t.registry.releaseByNonce(g);t.audit?.("edge","turn_release",{released:p,nonce_sha256_prefix:sy(g)})}o.writeHead(204),o.end();return}if(a!=="/mcp"){o.writeHead(404,{"Content-Type":"application/json"}),o.end(JSON.stringify({error:"not found"}));return}if(i.method!=="POST"){o.writeHead(405,{"Content-Type":"application/json",Allow:"POST"}),o.end(JSON.stringify({error:"method not allowed"}));return}let c=ry(i.headers.authorization),l=c?t.registry.resolve(c):void 0;if(!l){t.audit?.("unauthorized","nonce_reject",{reason:c?"unknown_or_expired":"missing",nonce_sha256_prefix:sy(c)}),o.writeHead(401,{"Content-Type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32001,message:"Unauthorized: missing, unknown, or expired turn nonce"},id:null}));return}t.logger?.info(`[DataPlane] authorized request user=${l.userId} session=${l.sessionKey}`);let u;try{u=JSON.parse(await(0,k$.readBodyWithCap)(i))}catch{o.writeHead(400,{"Content-Type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32700,message:"Parse error"},id:null}));return}let f=L$(t,l),d=new C$.StreamableHTTPServerTransport({sessionIdGenerator:void 0,enableJsonResponse:!0});o.on("close",()=>{d.close(),f.close()}),await f.connect(d),await d.handleRequest(i,o,u)}catch(a){t.logger?.warn(`[DataPlane] gateway error: ${a instanceof Error?a.message:String(a)}`),o.headersSent||o.writeHead(500,{"Content-Type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:null}))}}),n=t.host??"127.0.0.1";await new Promise((i,o)=>{e.once("error",o),e.listen(t.port??0,n,()=>i())});let r=e.address();if(!r||typeof r=="string")throw new Error("Data gateway failed to bind a port");let s=`http://${t.advertiseHost??"127.0.0.1"}:${r.port}/mcp`;return t.logger?.info(`[DataPlane] gateway listening at ${s}`),{url:s,close:()=>new Promise(i=>e.close(()=>i()))}}function L$(t,e){let n=new R$.Server({name:"agenthippo-data-gateway",version:"1.0.0"},{capabilities:{tools:{}}}),r=t.broker.provider.tools??[],s=new Set(r.map(i=>i.definition.name));return n.setRequestHandler(ny.ListToolsRequestSchema,async()=>({tools:[...r.map(i=>i.definition),...(await t.connector.listTools()).filter(i=>!s.has(i.name))]})),n.setRequestHandler(ny.CallToolRequestSchema,async i=>{let o=i.params.name,a=r.find(l=>l.definition.name===o);if(a){t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name,brokerSide:!0});try{let l=await a.call({userId:e.userId,sessionKey:e.sessionKey,invalidate:()=>t.broker.invalidate(e.userId)},i.params.arguments??{});return{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}catch(l){let u=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"provider_tool_failed",error:u}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:u})}],isError:!0}}}let c;try{c=(await t.broker.acquire(e.userId,e.inboundToken)).secretRef,t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name})}catch(l){let u=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"acquire_failed",error:u}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:`credential acquire failed (fail-closed): ${u}`})}],isError:!0}}try{return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:c})}catch(l){let u=l instanceof Error?l.message:String(l);if(/401|unauthoriz|expired/i.test(u)){t.broker.invalidate(e.userId);try{let f=await t.broker.acquire(e.userId,e.inboundToken);return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:f.secretRef})}catch{}}return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"call_failed",error:u}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:u})}],isError:!0}}}),n}});var xf=T(jf=>{"use strict";Object.defineProperty(jf,"__esModule",{value:!0});jf.createConnectHandler=j$;var M$=require("crypto"),G$=ur(),Dl=Ra(),Ml=t=>t.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]),iy=t=>JSON.stringify(t).replace(/</g,"\\u003c"),oy="default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'",U$=t=>`default-src 'none'; script-src 'nonce-${t}' https://cdn.plaid.com; frame-src https://cdn.plaid.com https://*.plaid.com; connect-src 'self' https://*.plaid.com; img-src https: data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'`,Ll={"Cache-Control":"no-store","Referrer-Policy":"no-referrer","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY"};function Uf(t,e,n,r){t.writeHead(e,{...Ll,"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":r}),t.end(n)}function Hf(t,e){return`<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
483
483
  <title>${Ml(t)}</title>
484
484
  <body style="font-family:system-ui,sans-serif;max-width:34rem;margin:4rem auto;padding:0 1rem;line-height:1.5">
485
485
  <h2>${Ml(t)}</h2>${e}</body></html>`}function H$(t,e,n){return Hf("Connect your bank",`<p id="s">Opening Plaid\u2026</p>
@@ -498,13 +498,13 @@ Plaid.create({
498
498
  },
499
499
  onExit: (err) => { s.textContent = err ? 'Plaid stopped: ' + (err.display_message || err.error_message) : 'Cancelled. Ask your agent for a new link to try again.'; },
500
500
  }).open();
501
- </script>`)}function j$(t){return async(e,n)=>{let r=new URL(e.url??"/","http://connect.invalid");if(!r.pathname.startsWith("/connect/"))return!1;let s=`${e.method} ${r.pathname}`;try{if(s==="GET /connect/start"){let i=await t.provider.startConnect(r.searchParams.get("ticket")??void 0,t.browserUser(e));if(i.kind==="redirect")n.writeHead(302,{...Ll,Location:i.location}),n.end();else{let o=(0,M$.randomBytes)(16).toString("base64");Uf(n,200,H$(i.flow,i.linkToken,o),U$(o))}return!0}if(s==="GET /connect/google/callback"){let i=await t.provider.finishGoogle({state:r.searchParams.get("state")??void 0,code:r.searchParams.get("code")??void 0,error:r.searchParams.get("error")??void 0},t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"google",userId:i.userId}),Uf(n,200,Hf("Google connected",`<p>Connected <b>${Ml(i.email??"your Google account")}</b>. You can close this tab and go back to your agent.</p>`),oy),!0}if(s==="POST /connect/bank/exchange"){let i;try{i=JSON.parse(await(0,G$.readBodyWithCap)(e))??{}}catch{throw new Dl.ConnectError(400,"Bad request.")}let o=await t.provider.finishBank(i,t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"bank",userId:o.userId,institution:o.institution??null}),n.writeHead(200,{...Ll,"Content-Type":"text/plain; charset=utf-8"}),n.end("ok"),!0}throw new Dl.ConnectError(404,"Not found.")}catch(i){let o=i instanceof Dl.ConnectError?i.status:500,a=i instanceof Dl.ConnectError?i.message:"Something went wrong. Ask your agent for a new link and try again.";return t.audit?.("connect","grant_connect_failed",{route:s,status:o,error:i instanceof Error?i.message:String(i)}),s==="POST /connect/bank/exchange"?(n.writeHead(o,{...Ll,"Content-Type":"text/plain; charset=utf-8"}),n.end(a)):Uf(n,o,Hf("Could not connect",`<p>${Ml(a)}</p>`),oy),!0}}}});var cy=T(Dr=>{"use strict";var x$=Dr&&Dr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),B$=Dr&&Dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),F$=Dr&&Dr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&x$(n,e,r[s]);return B$(n,e),n}})();Object.defineProperty(Dr,"__esModule",{value:!0});Dr.backupTimestamp=K$;Dr.backupPathFor=ay;Dr.renameToBackup=W$;var V$=require("fs"),Bf=F$(require("path"));function K$(t=new Date){return t.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function ay(t,e){let n=Bf.dirname(t),r=Bf.basename(t).replace(/\.json$/i,"");return Bf.join(n,`${r}.${e}.bk`)}async function W$(t,e){let n=ay(t,e);try{return await V$.promises.rename(t,n),n}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code):"")==="ENOENT")return;throw r}}});var jl=T(Mt=>{"use strict";var q$=Mt&&Mt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Y$=Mt&&Mt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),J$=Mt&&Mt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&q$(n,e,r[s]);return Y$(n,e),n}})();Object.defineProperty(Mt,"__esModule",{value:!0});Mt._resetOutboundHandleStoreLockForTest=z$;Mt._setOutboundHandleStorePathForTest=Q$;Mt.buildGatewayOutboundHandleKey=fy;Mt.upsertGatewayOutboundHandle=sD;Mt.getLastGatewayOutboundHandle=iD;Mt.listGatewayOutboundTargets=oD;Mt.mergeGatewayOutboundHandles=aD;Mt.resolveGatewayOutboundHandle=cD;Mt.backupAndClearOutboundHandlesForAgent=lD;Mt.getGatewayOutboundStoreSnapshot=uD;var Gl=require("fs"),X$=J$(require("path")),ly=cy(),Vf=1,dy={value:void 0},Go=new Map,Ff=new Map;function Kf(t,e){let r=(Ff.get(t)??Promise.resolve()).then(()=>e());return Ff.set(t,r.catch(()=>{})),r}function z$(){Ff.clear(),Go.clear()}function Q$(t){dy.value=t,Go.clear()}function ka(t){return dy.value??t}function fy(t,e){let n=e?.trim();return n?`${t}::thread:${n}`:`${t}::`}function Z$(){return{version:Vf,lastByAgent:{},targetsByAgent:{}}}async function ni(t){let e=ka(t),n=Go.get(e);if(n)return n;try{let s=await Gl.promises.readFile(e,"utf-8"),i=JSON.parse(s);if(i.targetsByAgent&&typeof i.targetsByAgent=="object"){let o={version:i.version??Vf,lastByAgent:i.lastByAgent??{},targetsByAgent:i.targetsByAgent};return Go.set(e,o),o}}catch{}let r=Z$();return Go.set(e,r),r}async function Wf(t,e){let n=ka(t);await Gl.promises.mkdir(X$.dirname(n),{recursive:!0});let r={version:Vf,lastByAgent:e.lastByAgent,targetsByAgent:e.targetsByAgent},s=`${n}.tmp`;await Gl.promises.writeFile(s,JSON.stringify(r,null,2),"utf-8"),await Gl.promises.rename(s,n),Go.set(n,e)}function ti(t,e){if(e?.toLowerCase()!=="slack")return t;let n=t.match(/^(user|channel|group):(.+)$/i);return n?`${n[1].toLowerCase()}:${n[2].toUpperCase()}`:t}function uy(t,e,n){let r=ti(t,n),s=ti(e,n);return r.toLowerCase()===s.toLowerCase()}function eD(t,e,n){if(n)return t.find(i=>uy(i.target,e,i.channel)&&i.threadId?.trim()===n);let r=t.filter(i=>uy(i.target,e,i.channel));return r.length===0?void 0:r.find(i=>!i.threadId?.trim())??Ul(r)[0]}function tD(t,e){let n=t.match(/:thread:([^:]+)$/),r=n?t.slice(0,-n[0].length):t,s=r.match(/:direct:([^:]+)$/);if(s)return ti(`user:${s[1]}`,e);let i=r.match(/:dm:([^:]+)$/);if(i)return ti(`user:${i[1]}`,e);let o=r.match(/:channel:([^:]+)$/);if(o)return ti(`channel:${o[1]}`,e);let a=r.match(/:group:([^:]+)$/);if(a)return ti(`channel:${a[1]}`,e)}function nD(t){let e=t.target?.trim();if(e)return ti(e,t.channel);let n=t.sessionKey?.trim().toLowerCase();if(n){let s=tD(n,t.channel);if(s)return s}let r=t.senderId?.trim();if(r&&t.channel)return ti(`user:${r}`,t.channel)}function rD(t){return t.senderName?.trim()?t.senderName.trim():t.senderUsername?.trim()?t.senderUsername.trim():t.target?.trim()||t.senderId?.trim()}function Ul(t){return[...t].sort((e,n)=>n.lastSeenAt-e.lastSeenAt)}function Hl(t,e){let n=e.trim();if(!n||t.lastByAgent[n]||t.targetsByAgent[n])return n;if(n.toLowerCase()==="default"){for(let r of["default","Default"])if(t.lastByAgent[r]||t.targetsByAgent[r])return r}return n}async function sD(t,e,n,r,s){let i=e.trim();if(!i)return;let o=s?.gatewayAgentId?.trim()||void 0,a=n.channel?.trim(),c=n.sessionKey?.trim().toLowerCase();if(!a&&c){let u=c.match(/^agent:[^:]+:([a-z0-9_-]+):/);u&&(a=u[1])}let l=nD(n);if(!(!a||!l))return Kf(ka(t),async()=>{let u=Date.now(),d=await ni(t);d.targetsByAgent[i]||(d.targetsByAgent[i]={});let f=fy(l,n.threadId?.trim()),p=d.targetsByAgent[i][f],g={agentId:i,...o?{gatewayAgentId:o}:{},channel:a,accountId:n.accountId?.trim()||void 0,target:l,threadId:n.threadId?.trim()||void 0,sessionKey:n.sessionKey?.trim()||void 0,sessionId:n.sessionId?.trim()||void 0,senderId:n.senderId?.trim()||void 0,senderName:n.senderName?.trim()||void 0,senderUsername:n.senderUsername?.trim()||void 0,label:rD(n),firstSeenAt:p?.firstSeenAt??u,lastSeenAt:u,lastInboundRunId:r,inboundCount:(p?.inboundCount??0)+1};return d.targetsByAgent[i][f]=g,d.lastByAgent[i]=g,await Wf(t,d),g})}async function iD(t,e){let n=await ni(t),r=Hl(n,e);return n.lastByAgent[r]}async function oD(t,e){let n=await ni(t);if(e?.trim()){let s=Hl(n,e.trim());return Ul(Object.values(n.targetsByAgent[s]??{}))}let r=[];for(let s of Object.values(n.targetsByAgent))r.push(...Object.values(s));return Ul(r)}async function aD(t,e,n){let r=await ni(t),s=n?.trim()?[n.trim()]:[...new Set([...Object.keys(r.targetsByAgent),...Object.keys(r.lastByAgent)])];return s.length===0?0:Kf(ka(e),async()=>{let i=await ni(e),o=0,a=!1;for(let c of s){let l=r.targetsByAgent[c]??{},u=Object.entries(l);u.length>0&&!i.targetsByAgent[c]&&(i.targetsByAgent[c]={});for(let[f,p]of u){let g=i.targetsByAgent[c]?.[f];(!g||p.lastSeenAt>=g.lastSeenAt)&&(i.targetsByAgent[c][f]=p,o++,a=!0)}let d=r.lastByAgent[c];if(d){let f=i.lastByAgent[c];(!f||d.lastSeenAt>=f.lastSeenAt)&&(i.lastByAgent[c]=d,a=!0)}}return a&&await Wf(e,i),o})}async function cD(t,e,n){let r=await ni(t),s=Hl(r,e),i=n?.target?.trim();if(i){let o=Object.values(r.targetsByAgent[s]??{});return eD(o,i,n?.threadId?.trim())}return r.lastByAgent[s]}async function lD(t,e,n=(0,ly.backupTimestamp)()){let r=ka(t);return Kf(r,async()=>{let s=await ni(t),i=Hl(s,e),o=s.targetsByAgent[i],a=Object.prototype.hasOwnProperty.call(s.lastByAgent,i),c=o?Object.keys(o).length:0;if(c===0&&!a)return{removed:0};let l=await(0,ly.renameToBackup)(r,n);return delete s.targetsByAgent[i],delete s.lastByAgent[i],await Wf(t,s),{removed:c,backupPath:l}})}async function uD(t){let e=await ni(t),n={};for(let[r,s]of Object.entries(e.targetsByAgent))n[r]=Ul(Object.values(s));return{lastByAgent:e.lastByAgent,targetsByAgent:n}}});var gy=T(Lr=>{"use strict";var dD=Lr&&Lr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fD=Lr&&Lr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pD=Lr&&Lr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dD(n,e,r[s]);return fD(n,e),n}})();Object.defineProperty(Lr,"__esModule",{value:!0});Lr.EGRESS_URL_ENV=void 0;Lr.startEgressBroker=SD;var gD=pD(require("http")),hD=ur(),mD=Co(),_D=jl(),py=Zc();Lr.EGRESS_URL_ENV="AGENTHIPPO_EGRESS_URL";function ED(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function yD(t){return t?(0,mD.hashNonce)(t).slice(0,12):"none"}function wD(t,e){return(0,py.getGatewayOutboundFilePath)(t,(0,py.safeGatewaySessionDirId)(e))}async function SD(t){let e=gD.createServer(async(s,i)=>{let o=(a,c,l,u)=>{l&&t.audit?.("unauthorized",l,u??{}),i.writeHead(a,{"Content-Type":"application/json"}),i.end(JSON.stringify({ok:!1,error:c}))};try{if((s.url?.split("?")[0]??"")!=="/egress/send"){o(404,"not found");return}if(s.method!=="POST"){i.writeHead(405,{"Content-Type":"application/json",Allow:"POST"}),i.end(JSON.stringify({ok:!1,error:"method not allowed"}));return}let c=ED(s.headers.authorization),l=c?t.registry.resolve(c):void 0;if(!l){o(401,"Unauthorized: missing, unknown, or expired turn nonce","egress_nonce_reject",{reason:c?"unknown_or_expired":"missing",nonce_sha256_prefix:yD(c)});return}let u=l.egressStoreKey?.trim();if(!u){o(403,"no outbound route for this turn (not a channel-originated session)","egress_deny",{userId:l.userId,reason:"no_store_key"});return}let d;try{d=JSON.parse(await(0,hD.readBodyWithCap)(s))}catch{o(400,"invalid JSON body");return}let f=typeof d.message=="string"?d.message:"";if(!f.trim()){o(400,"message is required");return}let p=typeof d.to=="string"?d.to.trim():void 0,g=typeof d.media=="string"&&d.media.trim()||void 0,_=wD(t.workspaceRoot,u),h;try{h=await(0,_D.resolveGatewayOutboundHandle)(_,t.agentId,p?{target:p}:void 0)}catch(E){t.logger?.warn(`[Egress] store read failed: ${E instanceof Error?E.message:String(E)}`)}if(!h){o(404,p?`no bound handle matches "${p}" for this session (cannot address a new destination)`:"no reply destination bound for this session yet","egress_deny",{userId:l.userId,reason:"no_matching_handle",to:p??"(reply-to-sender)"});return}t.audit?.(l.sessionKey,"egress_authorize",{userId:l.userId,channel:h.channel,target:h.target});let y=await t.send(h,f,g);i.writeHead(y.ok?200:502,{"Content-Type":"application/json"}),i.end(JSON.stringify(y))}catch(a){t.logger?.warn(`[Egress] broker error: ${a instanceof Error?a.message:String(a)}`),i.headersSent||i.writeHead(500,{"Content-Type":"application/json"}),i.end(JSON.stringify({ok:!1,error:"Internal error"}))}});await new Promise((s,i)=>{e.once("error",i),e.listen(0,"127.0.0.1",()=>s())});let n=e.address();if(!n||typeof n=="string")throw new Error("Egress broker failed to bind a loopback port");let r=`http://127.0.0.1:${n.port}/egress/send`;return t.logger?.info(`[Egress] broker listening at ${r}`),{url:r,close:()=>new Promise(s=>e.close(()=>s()))}}});var yy=T(Bn=>{"use strict";var AD=Bn&&Bn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),TD=Bn&&Bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bD=Bn&&Bn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&AD(n,e,r[s]);return TD(n,e),n}})();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.ASSERTION_HEADER=void 0;Bn.startDataPlaneSidecar=kD;var hy=bD(require("http")),Ey=require("crypto"),vD=Vi(),OD=Co(),my=ur(),_y=Ra(),ID=xf(),PD=Mo();Bn.ASSERTION_HEADER="x-agent-user-assertion";function ND(t,e){let n=t.headers[e];return(Array.isArray(n)?n[0]:n)?.trim()||void 0}function xl(t){return(0,Ey.createHash)("sha256").update(t).digest("hex").slice(0,12)}function RD(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function CD(t,e){let n=Buffer.from(t),r=Buffer.from(e);return n.length===r.length&&(0,Ey.timingSafeEqual)(n,r)}async function kD(t){let e=t.bindHost??"0.0.0.0",n=await vD.DataPlane.start(t.config,{logger:t.logger,audit:t.audit,gateway:{host:e,port:t.gatewayPort,advertiseHost:e==="0.0.0.0"?void 0:e}}),r=new Map,s=hy.createServer(async(u,d)=>{let f=(p,g)=>{d.writeHead(p,{"Content-Type":"application/json"}),d.end(JSON.stringify({error:g}))};try{let p=u.url?.split("?")[0]??"";if(u.method==="GET"&&p==="/health")return d.writeHead(200,{"Content-Type":"application/json"}),d.end(JSON.stringify({ok:!0}));let g=RD(u.headers.authorization);if(!g||!CD(g,t.registerToken))return t.audit?.("unauthorized","sidecar_register_reject",{reason:g?"bad_token":"missing_token"}),f(401,"unauthorized");if((u.method==="GET"||u.method==="POST")&&p==="/edge/turn"){let _=(Array.isArray(u.headers["x-agent-user"])?u.headers["x-agent-user"][0]:u.headers["x-agent-user"])?.trim();if(!_)return t.audit?.("unauthorized","sidecar_edge_reject",{reason:"missing_user"}),f(400,"X-Agent-User required");let h=ND(u,Bn.ASSERTION_HEADER)?.replace(/^Bearer\s+/i,"").trim()||void 0,{nonce:y}=n.registerTurnRaw({userId:_,sessionKey:_,inboundToken:h});return t.audit?.(_,"sidecar_edge_register",{userId:_,assertion:h?`sha256:${xl(h)}`:"none",nonce_sha256_prefix:xl(y)}),d.writeHead(200,{"Content-Type":"application/json",[PD.TURN_NONCE_HEADER]:y}),d.end(JSON.stringify({ok:!0}))}if(u.method==="POST"&&p==="/turns"){let _;try{_=JSON.parse(await(0,my.readBodyWithCap)(u))}catch{return f(400,"bad json")}let h=(_.userId??"").trim();if(!h)return f(400,"userId required");let y=_.renewNonce?.trim()||void 0;if(y!==void 0&&!(0,OD.isNonceShaped)(y))return f(400,"renewNonce must be a previously minted turn nonce");let E=_.agent?.pack?.trim(),w=!!(E&&t.agent?.pack&&E!==t.agent.pack);w&&console.warn(`Warning: turn registration claims agent "${E}" but this connector loaded "${t.agent?.pack}". One connector is meant to serve one agent \u2014 both now share this connector's base credential, so neither is bounded by the job it was deployed for.`);let{nonce:A,release:S}=n.registerTurnRaw({userId:h,sessionKey:(_.sessionKey??"").trim()||h,inboundToken:_.inboundToken,egressStoreKey:_.egressStoreKey},{renewNonce:y});return r.set(A,S),t.audit?.((_.sessionKey??"").trim()||h,"sidecar_register",{userId:h,claimedAgent:E??"none",binding:"asserted",nonce_sha256_prefix:xl(A),...y?{renewed:!0}:{},...w?{agentMismatch:!0,loadedAgent:t.agent?.pack}:{}}),d.writeHead(200,{"Content-Type":"application/json"}),d.end(JSON.stringify({nonce:A}))}if(u.method==="DELETE"&&p.startsWith("/turns/")){let _=decodeURIComponent(p.slice(7)),h=r.has(_);return r.get(_)?.(),r.delete(_),t.audit?.("control","sidecar_release",{released:h,nonce_sha256_prefix:xl(_)}),d.writeHead(204),d.end()}f(404,"not found")}catch(p){t.logger?.warn(`[Sidecar] control error: ${p instanceof Error?p.message:String(p)}`),d.headersSent||d.writeHead(500,{"Content-Type":"application/json"}),d.end(JSON.stringify({error:"internal"}))}});await new Promise((u,d)=>{s.once("error",d),s.listen(t.controlPort,e,()=>u())});let i=s.address(),o=i&&typeof i!="string"?i.port:t.controlPort;t.logger?.info(`[Sidecar] gateway ${n.url} | control :${o} (bound ${e})`),(t.config.provider??"passthrough").trim().toLowerCase()==="passthrough"&&console.warn(`Warning: provider=passthrough needs a per-user token on every turn. Edge-registered turns supply it via the ${Bn.ASSERTION_HEADER} header \u2014 if your edge does not forward it, every tool call will fail closed.`);let a,c,l=n.broker.provider;if(t.connectPort!==void 0&&l instanceof _y.StoredGrantProvider){let u=(0,ID.createConnectHandler)({provider:l,browserUser:p=>(0,my.resolveUserId)(p.headers,void 0),audit:t.audit}),d=hy.createServer(async(p,g)=>{try{await u(p,g)||(g.writeHead(404,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:"not found"})))}catch(_){t.logger?.warn(`[Sidecar] connect error: ${_ instanceof Error?_.message:String(_)}`),g.headersSent||g.writeHead(500),g.end()}});await new Promise((p,g)=>{d.once("error",g),d.listen(t.connectPort,e,()=>p())});let f=d.address();c=f&&typeof f!="string"?f.port:t.connectPort,a=d,t.logger?.info(`[Sidecar] connect pages :${c} (bound ${e})`)}return{gatewayUrl:n.url,controlPort:o,connectPort:c,...l instanceof _y.StoredGrantProvider?{grants:l}:{},close:async()=>{await new Promise(u=>s.close(()=>u())),a&&await new Promise(u=>a.close(()=>u())),await n.close()}}}});var Jf=T(ri=>{"use strict";Object.defineProperty(ri,"__esModule",{value:!0});ri.RemoteDataPlane=ri.EdgeDataPlane=void 0;ri.resolveEdgeDataPlane=$D;ri.resolveRemoteDataPlane=DD;var Bl=Mo(),wy=5e3;function $D(t=process.env){let e=t.AGENTHIPPO_DATA_PLANE_EDGE?.trim(),n=t.AGENTHIPPO_DATA_MCP_URL?.trim();return!e||e==="0"||e.toLowerCase()==="false"||!n?null:{gatewayUrl:n}}var qf=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}adoptTurn(e){return{nonce:e,env:{[Bl.TURN_NONCE_ENV]:e,[Bl.DATA_MCP_URL_ENV]:this.cfg.gatewayUrl},release:async()=>{try{await fetch(new URL("/turn",this.cfg.gatewayUrl),{method:"DELETE",headers:{Authorization:`Bearer ${e}`},signal:AbortSignal.timeout(this.cfg.releaseTimeoutMs??wy)})}catch{}}}}};ri.EdgeDataPlane=qf;function DD(t=process.env){let e=t.AGENTHIPPO_DATA_PLANE_CONTROL_URL?.trim(),n=t.AGENTHIPPO_DATA_PLANE_TOKEN?.trim(),r=t.AGENTHIPPO_DATA_MCP_URL?.trim();return!e||!n||!r?null:{controlUrl:e,registerToken:n,gatewayUrl:r}}var Yf=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}async registerTurn(e){let n=await fetch(`${this.cfg.controlUrl.replace(/\/$/,"")}/turns`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.cfg.registerToken}`},body:JSON.stringify(e)});if(!n.ok)throw new Error(`data-plane sidecar register failed: HTTP ${n.status}`);let{nonce:r}=await n.json();return{nonce:r,env:{[Bl.TURN_NONCE_ENV]:r,[Bl.DATA_MCP_URL_ENV]:this.cfg.gatewayUrl},release:async()=>{try{await fetch(`${this.cfg.controlUrl.replace(/\/$/,"")}/turns/${encodeURIComponent(r)}`,{method:"DELETE",headers:{Authorization:`Bearer ${this.cfg.registerToken}`},signal:AbortSignal.timeout(this.cfg.releaseTimeoutMs??wy)})}catch{}}}}};ri.RemoteDataPlane=Yf});var Vi=T(Y=>{"use strict";var LD=Y&&Y.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MD=Y&&Y.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),GD=Y&&Y.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LD(n,e,r[s]);return MD(n,e),n}})();Object.defineProperty(Y,"__esModule",{value:!0});Y.DataPlane=Y.resolveEdgeDataPlane=Y.EdgeDataPlane=Y.resolveRemoteDataPlane=Y.RemoteDataPlane=Y.ASSERTION_HEADER=Y.startDataPlaneSidecar=Y.EGRESS_URL_ENV=Y.startEgressBroker=Y.TURN_NONCE_HEADER=Y.TURN_NONCE_ENV=Y.DATA_MCP_URL_ENV=Y.startDataGateway=Y.TURN_META_KEY=Y.ConnectorHost=Y.createConnectHandler=Y.parseGrantKey=Y.GrantStore=Y.ConnectError=Y.readStoredGrantConfig=Y.StoredGrantProvider=Y.identityProvider=Y.passthroughProvider=Y.resolveProvider=Y.CredentialBroker=Y.DEFAULT_TURN_DEADLINE_MS=Y.isNonceShaped=Y.hashNonce=Y.TurnRegistry=void 0;Y.resolveDataPlaneConfig=BD;var $a=GD(require("path")),UD=Co(),Sy=Pf(),HD=Rf(),Xf=Mo(),jD=en(),Fl=Co();Object.defineProperty(Y,"TurnRegistry",{enumerable:!0,get:function(){return Fl.TurnRegistry}});Object.defineProperty(Y,"hashNonce",{enumerable:!0,get:function(){return Fl.hashNonce}});Object.defineProperty(Y,"isNonceShaped",{enumerable:!0,get:function(){return Fl.isNonceShaped}});Object.defineProperty(Y,"DEFAULT_TURN_DEADLINE_MS",{enumerable:!0,get:function(){return Fl.DEFAULT_TURN_DEADLINE_MS}});var Vl=Pf();Object.defineProperty(Y,"CredentialBroker",{enumerable:!0,get:function(){return Vl.CredentialBroker}});Object.defineProperty(Y,"resolveProvider",{enumerable:!0,get:function(){return Vl.resolveProvider}});Object.defineProperty(Y,"passthroughProvider",{enumerable:!0,get:function(){return Vl.passthroughProvider}});Object.defineProperty(Y,"identityProvider",{enumerable:!0,get:function(){return Vl.identityProvider}});var Qf=Ra();Object.defineProperty(Y,"StoredGrantProvider",{enumerable:!0,get:function(){return Qf.StoredGrantProvider}});Object.defineProperty(Y,"readStoredGrantConfig",{enumerable:!0,get:function(){return Qf.readStoredGrantConfig}});Object.defineProperty(Y,"ConnectError",{enumerable:!0,get:function(){return Qf.ConnectError}});var Ty=bf();Object.defineProperty(Y,"GrantStore",{enumerable:!0,get:function(){return Ty.GrantStore}});Object.defineProperty(Y,"parseGrantKey",{enumerable:!0,get:function(){return Ty.parseGrantKey}});var xD=xf();Object.defineProperty(Y,"createConnectHandler",{enumerable:!0,get:function(){return xD.createConnectHandler}});var by=Rf();Object.defineProperty(Y,"ConnectorHost",{enumerable:!0,get:function(){return by.ConnectorHost}});Object.defineProperty(Y,"TURN_META_KEY",{enumerable:!0,get:function(){return by.TURN_META_KEY}});var Kl=Mo();Object.defineProperty(Y,"startDataGateway",{enumerable:!0,get:function(){return Kl.startDataGateway}});Object.defineProperty(Y,"DATA_MCP_URL_ENV",{enumerable:!0,get:function(){return Kl.DATA_MCP_URL_ENV}});Object.defineProperty(Y,"TURN_NONCE_ENV",{enumerable:!0,get:function(){return Kl.TURN_NONCE_ENV}});Object.defineProperty(Y,"TURN_NONCE_HEADER",{enumerable:!0,get:function(){return Kl.TURN_NONCE_HEADER}});var vy=gy();Object.defineProperty(Y,"startEgressBroker",{enumerable:!0,get:function(){return vy.startEgressBroker}});Object.defineProperty(Y,"EGRESS_URL_ENV",{enumerable:!0,get:function(){return vy.EGRESS_URL_ENV}});var Oy=yy();Object.defineProperty(Y,"startDataPlaneSidecar",{enumerable:!0,get:function(){return Oy.startDataPlaneSidecar}});Object.defineProperty(Y,"ASSERTION_HEADER",{enumerable:!0,get:function(){return Oy.ASSERTION_HEADER}});var Wl=Jf();Object.defineProperty(Y,"RemoteDataPlane",{enumerable:!0,get:function(){return Wl.RemoteDataPlane}});Object.defineProperty(Y,"resolveRemoteDataPlane",{enumerable:!0,get:function(){return Wl.resolveRemoteDataPlane}});Object.defineProperty(Y,"EdgeDataPlane",{enumerable:!0,get:function(){return Wl.EdgeDataPlane}});Object.defineProperty(Y,"resolveEdgeDataPlane",{enumerable:!0,get:function(){return Wl.resolveEdgeDataPlane}});var Ay={"personal-connectors":$a.join("skills","personal-connectors","scripts","server.mjs")};function BD(t,e,n=(0,jD.findBundledBasePromptsDir)()){let r=t?.dataPlane,s=r?.connector?.trim();if(!s)return;let i=r?.provider?.trim()||void 0;if(s.startsWith("builtin:")){let o=s.slice(8),a=Ay[o];if(!a)throw new Error(`Unknown builtin connector "${o}" (known: ${Object.keys(Ay).join(", ")})`);if(!n)throw new Error(`connector ${s}: this AgentHippo build ships no base-prompts. Copy the connector into the pack (${$a.dirname(a)}/server.mjs and lib.mjs) and point spec.dataPlane.connector at the copy.`);return{connectorPath:$a.join(n,a),provider:i}}return{connectorPath:$a.isAbsolute(s)?s:$a.join(e,s),provider:i}}var zf=class t{url;registry;broker;connector;gateway;constructor(e,n,r,s,i){this.url=e,this.registry=n,this.broker=r,this.connector=s,this.gateway=i}static async start(e,n){let r=n?.registry??new UD.TurnRegistry,s=new Sy.CredentialBroker(n?.provider??(0,Sy.resolveProvider)(e.provider)),i=await HD.ConnectorHost.spawn({connectorPath:e.connectorPath,logger:n?.logger});try{let o=await(0,Xf.startDataGateway)({registry:r,broker:s,connector:i,logger:n?.logger,audit:n?.audit,host:n?.gateway?.host,port:n?.gateway?.port,advertiseHost:n?.gateway?.advertiseHost});return new t(o.url,r,s,i,o)}catch(o){throw await i.close(),o}}registerTurnRaw(e,n){return this.registry.register(e,n)}registerTurn(e,n){let{nonce:r,release:s}=this.registry.register(e,n);return{nonce:r,env:{[Xf.TURN_NONCE_ENV]:r,[Xf.DATA_MCP_URL_ENV]:this.url},release:s}}async close(){await this.gateway.close(),await this.connector.close()}};Y.DataPlane=zf});var Ry=T(Jl=>{"use strict";Object.defineProperty(Jl,"__esModule",{value:!0});Jl.resolveLocalTurnUserId=Ny;Jl.resolveLocalTurnScope=VD;var Iy=Vi(),Py=Jf(),ql=Mo(),FD=As();function Ny(t=process.env){return t.AGENTHIPPO_DATA_USER?.trim()||(0,FD.currentCredential)()?.userId?.trim()||t.LOGNAME?.trim()||t.USER?.trim()||t.LNAME?.trim()||t.USERNAME?.trim()||void 0}var Zf=new WeakMap,Yl=class{mode;userId;gatewayUrl;registrar;closePlane;sessionNonce;activeTurns=0;latestRelease;constructor(e,n,r,s,i){this.mode=e,this.userId=n,this.gatewayUrl=r,this.registrar=s,this.closePlane=i}async beginTurn(e){let n=await this.registrar.registerTurn({userId:this.userId,sessionKey:e.sessionKey,renewNonce:this.sessionNonce});this.sessionNonce=n.nonce,this.latestRelease=n.release,this.activeTurns++;let r=!1;return{env:n.env,release:async()=>{if(!r&&(r=!0,this.activeTurns--,this.activeTurns<=0)){let s=this.latestRelease;this.latestRelease=void 0,await s?.()}}}}async close(){await this.closePlane()}};async function VD(t){let e=t.env??process.env,n=i=>{let o=Ny(e);if(!o)throw new Error(`${i} is configured but no acting user resolves \u2014 set AGENTHIPPO_DATA_USER (fail-closed: turns register a real identity; there is no anonymous data access)`);return o},r=Zf.has(e)?Zf.get(e):(0,Py.resolveRemoteDataPlane)(e);if(r){Zf.set(e,r);let i=n("The data-plane sidecar"),o=new Py.RemoteDataPlane(r);return delete e.AGENTHIPPO_DATA_PLANE_TOKEN,e[ql.DATA_MCP_URL_ENV]=o.url,new Yl("sidecar",i,o.url,{registerTurn:a=>o.registerTurn({...a,agent:t.agent})},async()=>{})}if(e[ql.TURN_NONCE_ENV]?.trim()&&e[ql.DATA_MCP_URL_ENV]?.trim())return console.warn("Warning: using a pre-minted session nonce from the environment (not rotated per turn, expires on the registry deadline). Set AGENTHIPPO_DATA_PLANE_CONTROL_URL + AGENTHIPPO_DATA_PLANE_TOKEN to register real per-turn identities instead."),null;let s=t.packPath?(0,Iy.resolveDataPlaneConfig)(t.spec,t.packPath):void 0;if(s){let i=n("The pack's data plane (spec.dataPlane)"),o=await Iy.DataPlane.start(s,{logger:t.logger,audit:t.audit});return e[ql.DATA_MCP_URL_ENV]=o.url,new Yl("in-process",i,o.url,{registerTurn:async a=>o.registerTurn(a,{renewNonce:a.renewNonce})},()=>o.close())}return null}});var si=T($e=>{"use strict";var KD=$e&&$e.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),WD=$e&&$e.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qD=$e&&$e.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KD(n,e,r[s]);return WD(n,e),n}})();Object.defineProperty($e,"__esModule",{value:!0});$e.USAGE_QUERY_TTL_SECONDS=$e.WARRANT_TTL_ENV=$e.DEFAULT_WARRANT_TTL_SECONDS=$e.MAX_TTL_SECONDS=void 0;$e.b64urlEncode=ep;$e.signCompactJws=tp;$e.verifyCompactJws=Cy;$e.timingSafeEqualString=YD;$e.generateWarrantKeypair=JD;$e.warrantTtlFromEnv=XD;$e.mintWarrant=zD;$e.mintWarrantUsageQuery=QD;$e.verifyWarrant=ZD;$e.jwks=e0;var Ns=qD(require("node:crypto"));function ep(t){return Buffer.from(t,"utf8").toString("base64url")}function tp(t,e,n){let r={alg:"ES256",typ:t.typ??"JWT",kid:t.kid},s=`${ep(JSON.stringify(r))}.${ep(JSON.stringify(e))}`,i=Ns.sign("sha256",Buffer.from(s),{key:Ns.createPrivateKey(n),dsaEncoding:"ieee-p1363"});return`${s}.${i.toString("base64url")}`}function Cy(t,e,n={}){let r=t.split(".");if(r.length!==3)return{ok:!1,reason:"malformed"};let[s,i,o]=r,a,c;try{a=JSON.parse(Buffer.from(s,"base64url").toString("utf8")),c=JSON.parse(Buffer.from(i,"base64url").toString("utf8"))}catch{return{ok:!1,reason:"unparseable"}}if(a.alg!=="ES256")return{ok:!1,reason:`unsupported alg ${a.alg}`};if(n.typ!==void 0&&a.typ!==void 0&&a.typ!==n.typ)return{ok:!1,reason:`unexpected token type ${a.typ}`};let l=a.kid?e[a.kid]:void 0;if(!l)return{ok:!1,reason:"unknown kid"};let u=!1;try{u=Ns.verify("sha256",Buffer.from(`${s}.${i}`),{key:Ns.createPublicKey(l),dsaEncoding:"ieee-p1363"},Buffer.from(o,"base64url"))}catch{return{ok:!1,reason:"bad signature"}}return u?{ok:!0,header:a,payload:c,signingInput:`${s}.${i}`}:{ok:!1,reason:"bad signature"}}function YD(t,e){let n=Buffer.from(t,"utf8"),r=Buffer.from(e,"utf8");return n.length!==r.length?!1:Ns.timingSafeEqual(n,r)}function JD(t){let{privateKey:e,publicKey:n}=Ns.generateKeyPairSync("ec",{namedCurve:"P-256"}),r=n.export({type:"spki",format:"pem"}).toString();return{privateKeyPem:e.export({type:"pkcs8",format:"pem"}).toString(),publicKeyPem:r,kid:t??Ns.createHash("sha256").update(r).digest("hex").slice(0,16)}}$e.MAX_TTL_SECONDS=86400;$e.DEFAULT_WARRANT_TTL_SECONDS=3600;$e.WARRANT_TTL_ENV="AGENTHIPPO_WARRANT_TTL_SECONDS";function XD(t=process.env){let e=t[$e.WARRANT_TTL_ENV]?.trim();if(e===void 0||e==="")return $e.DEFAULT_WARRANT_TTL_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<=0?$e.DEFAULT_WARRANT_TTL_SECONDS:Math.min(Math.floor(n),$e.MAX_TTL_SECONDS)}function zD(t,e){let n=t.nowSeconds??Math.floor(Date.now()/1e3),r=Math.min(t.ttlSeconds??120,$e.MAX_TTL_SECONDS),s={user:t.user,pack:t.pack,packVersion:t.packVersion,sandboxId:t.sandboxId,tier:t.tier,aud:t.aud,iat:n,exp:n+r,jti:t.jti??Ns.randomUUID(),...t.billing==="user"?{billing:"user"}:{},...t.budgetKey?{budgetKey:t.budgetKey}:{},...t.budgetWindowSeconds!==void 0&&t.budgetWindowSeconds>0?{budgetWindowSeconds:t.budgetWindowSeconds}:{}};return tp({typ:"JWT",kid:e.kid},s,e.privateKeyPem)}$e.USAGE_QUERY_TTL_SECONDS=60;function QD(t,e,n=Math.floor(Date.now()/1e3)){return tp({typ:"JWT",kid:t.kid},{aud:"usage",jtis:e,iat:n,exp:n+$e.USAGE_QUERY_TTL_SECONDS},t.privateKeyPem)}function ZD(t,e,n){let r=Cy(t,e);if(!r.ok)return{ok:!1,reason:r.reason};let s=r.payload,i=n.nowSeconds??Math.floor(Date.now()/1e3);return typeof s.exp!="number"||s.exp<=i?{ok:!1,reason:"expired"}:s.aud!==n.audience?{ok:!1,reason:`wrong audience ${s.aud}`}:n.channelSandboxId!==void 0&&s.sandboxId!==n.channelSandboxId?{ok:!1,reason:"warrant not bound to this channel"}:s.user?{ok:!0,claims:s}:{ok:!1,reason:"no principal"}}function e0(t){return{keys:t.map(e=>({...Ns.createPublicKey(e.publicKeyPem).export({format:"jwk"}),kid:e.kid,alg:"ES256",use:"sig"}))}}});var La=T(de=>{"use strict";Object.defineProperty(de,"__esModule",{value:!0});de.DENY_SCOPE_ALIASES=de.DENY_MODE_ALIASES=de.STRICTEST_DENY_MODE=de.DENY_MODES=de.DENY_SCOPES=de.STRICTEST_ON_BREACH=de.ON_BREACH_ALIASES=de.ON_BREACH_ACTIONS=de.DEPRECATED_CAP_SPELLINGS=de.LEASE_CAP_ALIASES=de.LEASE_CAP_FIELDS=void 0;de.parseCapPolicy=ky;de.parseLease=r0;de.LEASE_CAP_FIELDS={maxTurnsPerSession:{kind:"positive-int"},maxSessionSeconds:{kind:"positive-int"},maxConcurrentSandboxes:{kind:"positive-int"}};de.LEASE_CAP_ALIASES={maxConcurrentCells:"maxConcurrentSandboxes"};de.DEPRECATED_CAP_SPELLINGS={maxConcurrentCells:"maxConcurrentSandboxes",AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES","destroy-cell":"destroy-sandbox","--max-concurrent-cells":"--max-concurrent-sandboxes"};de.ON_BREACH_ACTIONS={"revoke-inference":{strictness:1},"destroy-sandbox":{strictness:2}};de.ON_BREACH_ALIASES={"destroy-cell":"destroy-sandbox"};de.STRICTEST_ON_BREACH=Object.keys(de.ON_BREACH_ACTIONS).reduce((t,e)=>de.ON_BREACH_ACTIONS[t].strictness>=de.ON_BREACH_ACTIONS[e].strictness?t:e);de.DENY_SCOPES=["session","user","pack"];de.DENY_MODES={drain:{strictness:1},kill:{strictness:2}};de.STRICTEST_DENY_MODE="kill";de.DENY_MODE_ALIASES={};de.DENY_SCOPE_ALIASES={};var Da=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function t0(t,e){return typeof e!="number"?{ok:!1,reason:`${t} must be a number, got ${typeof e} (${JSON.stringify(e)})`}:Number.isFinite(e)?e<=0?{ok:!1,reason:`${t} must be greater than 0, got ${e} (omit the field for "unbounded")`}:Number.isInteger(e)?{ok:!0,value:e}:{ok:!1,reason:`${t} must be a whole number, got ${e}`}:{ok:!1,reason:`${t} must be finite, got ${e}`}}function ky(t,e="caps"){if(t==null)return{ok:!0,caps:{},warnings:[]};if(!Da(t))return{ok:!1,reason:`${e} must be an object`};let n=[],r={};for(let[i,o]of Object.entries(t)){if(o==null||i==="onBreach")continue;let a=i in de.LEASE_CAP_FIELDS?i:de.LEASE_CAP_ALIASES[i];if(!a){n.push(`${e}.${i} is not a cap this build understands and is NOT being enforced`);continue}let c=t0(`${e}.${i}`,o);if(!c.ok)return{ok:!1,reason:c.reason};r[a]=c.value}let s=t.onBreach;if(s!=null){if(typeof s!="string")return{ok:!1,reason:`${e}.onBreach must be a string, got ${typeof s}`};let i=s in de.ON_BREACH_ACTIONS?s:de.ON_BREACH_ALIASES[s];i?r.onBreach=i:(r.onBreach=de.STRICTEST_ON_BREACH,n.push(`${e}.onBreach="${s}" is not an action this build understands. Failing CLOSED to "${de.STRICTEST_ON_BREACH}" (the strictest known action). Known actions: ${Object.keys(de.ON_BREACH_ACTIONS).join(", ")}.`))}return{ok:!0,caps:r,warnings:n}}function n0(t,e){if(!Da(t))return{ok:!1,reason:`deny[${e}] must be an object`};let n=[],r=t.scope;if(typeof r!="string")return{ok:!1,reason:`deny[${e}].scope must be a string`};let s=de.DENY_SCOPES.includes(r)?r:de.DENY_SCOPE_ALIASES[r];if(!s)return{ok:!1,reason:`deny[${e}].scope "${r}" is not a scope this build understands (known: ${de.DENY_SCOPES.join(", ")})`};if(typeof t.match!="string"||t.match.length===0)return{ok:!1,reason:`deny[${e}].match must be a non-empty string`};let i=t.mode;if(typeof i!="string")return{ok:!1,reason:`deny[${e}].mode must be a string`};let o=i in de.DENY_MODES?i:de.DENY_MODE_ALIASES[i];o||(o=de.STRICTEST_DENY_MODE,n.push(`deny[${e}].mode="${i}" is not a mode this build understands. Failing CLOSED to "${de.STRICTEST_DENY_MODE}". Known modes: ${Object.keys(de.DENY_MODES).join(", ")}.`));let a={scope:s,match:t.match,mode:o};if(t.reason!==void 0){if(typeof t.reason!="string")return{ok:!1,reason:`deny[${e}].reason must be a string`};a.reason=t.reason}if(t.until!==void 0&&t.until!==null){if(typeof t.until!="number"||!Number.isFinite(t.until))return{ok:!1,reason:`deny[${e}].until must be a finite epoch-seconds number`};a.until=t.until}if(t.user!==void 0&&t.user!==null){if(typeof t.user!="string")return{ok:!1,reason:`deny[${e}].user must be a string`};a.user=t.user}if(t.followUser!==void 0&&t.followUser!==null){if(typeof t.followUser!="boolean")return{ok:!1,reason:`deny[${e}].followUser must be a boolean`};a.followUser=t.followUser}return{ok:!0,rule:a,warnings:n}}function r0(t){if(!Da(t))return{ok:!1,reason:"lease must be a JSON object"};let e=[];if(typeof t.pack!="string"||t.pack.length===0)return{ok:!1,reason:"lease.pack must be a non-empty string"};if(typeof t.enabled!="boolean")return{ok:!1,reason:`lease.enabled must be a boolean, got ${typeof t.enabled}`};if(typeof t.expiresAt!="number"||!Number.isFinite(t.expiresAt))return{ok:!1,reason:`lease.expiresAt must be a finite epoch-seconds number, got ${JSON.stringify(t.expiresAt)}`};let n={pack:t.pack,enabled:t.enabled,expiresAt:t.expiresAt};for(let r of["version","imageDigest","reason"]){let s=t[r];if(s!=null){if(typeof s!="string")return{ok:!1,reason:`lease.${r} must be a string, got ${typeof s}`};n[r]=s}}for(let r of["requireSignedPack","requireSignedLease","allowServiceTurns","billUsers"]){let s=t[r];if(s!=null){if(typeof s!="boolean")return{ok:!1,reason:`lease.${r} must be a boolean, got ${typeof s}`};n[r]=s}}if(t.budget!==void 0&&t.budget!==null){let r=t.budget;if(typeof r!="object"||Array.isArray(r))return{ok:!1,reason:"lease.budget must be an object"};let s=r.scope;if(s!=="session"&&s!=="user")return{ok:!1,reason:`lease.budget.scope must be 'session' or 'user', got ${JSON.stringify(s)}`};let i=r.windowSeconds;if(i!=null&&(typeof i!="number"||!Number.isFinite(i)||i<0))return{ok:!1,reason:"lease.budget.windowSeconds must be a non-negative number"};n.budget={scope:s,...typeof i=="number"&&i>0?{windowSeconds:i}:{}}}if(t.caps!==void 0&&t.caps!==null){let r=ky(t.caps,"lease.caps");if(!r.ok)return{ok:!1,reason:r.reason};n.caps=r.caps,e.push(...r.warnings)}if(t.deny!==void 0&&t.deny!==null){if(!Array.isArray(t.deny))return{ok:!1,reason:"lease.deny must be an array"};let r=[];for(let s=0;s<t.deny.length;s++){let i=n0(t.deny[s],s);if(!i.ok)return{ok:!1,reason:i.reason};r.push(i.rule),e.push(...i.warnings)}n.deny=r}if(t.grants!==void 0&&t.grants!==null){let r=Da(t.grants)?t.grants.revoke:void 0;if(!Array.isArray(r))e.push("lease.grants.revoke is not an array \u2014 ignored");else{let s=[];for(let[i,o]of r.entries()){if(!Da(o)||typeof o.user!="string"||!/^[0-9a-f]{64}$/.test(o.user)||typeof o.requestedAt!="number"||!Number.isFinite(o.requestedAt)||o.service!==void 0&&o.service!=="google"&&o.service!=="bank"){e.push(`lease.grants.revoke[${i}] is malformed \u2014 ignored`);continue}s.push({user:o.user,requestedAt:o.requestedAt,...o.service?{service:o.service}:{}})}n.grants={revoke:s}}}return t.issuedAt!==void 0&&t.issuedAt!==null&&(typeof t.issuedAt=="number"&&Number.isFinite(t.issuedAt)?n.issuedAt=t.issuedAt:e.push("lease.issuedAt is not a finite number \u2014 ignored")),t.deployment!==void 0&&t.deployment!==null&&(typeof t.deployment=="string"&&t.deployment.length>0?n.deployment=t.deployment:e.push("lease.deployment is not a non-empty string \u2014 ignored")),{ok:!0,lease:n,warnings:e}}});var Ho=T(F=>{"use strict";var s0=F&&F.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),i0=F&&F.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),rp=F&&F.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&s0(n,e,r[s]);return i0(n,e),n}})();Object.defineProperty(F,"__esModule",{value:!0});F.PACK_FULL_REVERIFY_INTERVAL_MS=F.PACK_PROBE_INTERVAL_MS=F.LEASE_JWKS_PINS_ENV=F.LEASE_JWKS_URL_ENV=F.LEASE_SIGNING_KEYS_ENV=F.ALLOW_INSECURE_TRUST_ROOT_ENV=F.PACK_JWKS_PINS_ENV=F.PACK_JWKS_URL_ENV_LEGACY=F.PACK_JWKS_URL_ENV=F.ALLOW_UNSIGNED_PACK_ENV=F.DIGEST_EXCLUDED_SEGMENTS=F.PACK_SIGNATURE_FILE=void 0;F.isDigestExcluded=zl;F.computePackDigestFromFiles=Dy;F.computePackDigest=sp;F.packTreeProbe=np;F.signPack=o0;F.readPackSignature=Ly;F.verifyPack=My;F.verifyPackFromFiles=a0;F.requireSignedPack=Uy;F.resolveRequireSignedPack=l0;F.allowUnsignedPackFromEnv=u0;F.describePackRefusal=d0;F.publicKeyThumbprints=Hy;F.parseJwksPins=jy;F.assertSecureTrustUrl=xy;F.loadPackTrustRoot=Fy;F.loadLeaseTrustRoot=h0;F.selectLeaseSigningKeys=m0;F.checkTrustRootSeparation=_0;F.loadPackSigningKeys=y0;F.createPackVerifier=w0;var Uo=rp(require("node:crypto")),ii=rp(require("node:fs")),Xl=rp(require("node:path")),Ma=si();F.PACK_SIGNATURE_FILE="pack.sig";F.DIGEST_EXCLUDED_SEGMENTS=new Set([".git","node_modules"]);function zl(t){return t===F.PACK_SIGNATURE_FILE?!0:t.split("/").some(e=>F.DIGEST_EXCLUDED_SEGMENTS.has(e))}function $y(t){let e=Uo.createHash("sha256"),n=[...t].sort((r,s)=>r.rel<s.rel?-1:r.rel>s.rel?1:0);for(let r of n){r.link&&e.update("L:");let s=Buffer.from(r.rel);e.update(`${s.length}:`),e.update(s),e.update(`${r.body.length}:`),e.update(r.body)}return e.digest("hex")}function Dy(t){let e=[];for(let n of t){let r=n.path.replace(/\\/g,"/");zl(r)||e.push({rel:r,body:n.content,link:n.link})}return $y(e)}function sp(t){let e=[],n=(r,s)=>{for(let i of ii.readdirSync(r)){let o=s?`${s}/${i}`:i;if(zl(o))continue;let a=Xl.join(r,i),c=ii.lstatSync(a);c.isSymbolicLink()?e.push({rel:o,body:Buffer.from(ii.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({rel:o,body:ii.readFileSync(a)})}};return n(t,""),$y(e)}function np(t){let e=[],n=(r,s)=>{let i;try{i=ii.readdirSync(r).sort()}catch{e.push(`${s}/?unreadable`);return}for(let o of i){let a=s?`${s}/${o}`:o;if(zl(a))continue;let c=Xl.join(r,o),l;try{l=ii.lstatSync(c)}catch{e.push(`${a}|gone`);continue}if(l.isDirectory()){n(c,a);continue}e.push(`${a}|${l.size}|${l.mtimeMs}|${l.ino}|${l.mode}`)}};try{n(t,"")}catch{return"unwalkable"}return Uo.createHash("sha256").update(e.join(`
501
+ </script>`)}function j$(t){return async(e,n)=>{let r=new URL(e.url??"/","http://connect.invalid");if(!r.pathname.startsWith("/connect/"))return!1;let s=`${e.method} ${r.pathname}`;try{if(s==="GET /connect/start"){let i=await t.provider.startConnect(r.searchParams.get("ticket")??void 0,t.browserUser(e));if(i.kind==="redirect")n.writeHead(302,{...Ll,Location:i.location}),n.end();else{let o=(0,M$.randomBytes)(16).toString("base64");Uf(n,200,H$(i.flow,i.linkToken,o),U$(o))}return!0}if(s==="GET /connect/google/callback"){let i=await t.provider.finishGoogle({state:r.searchParams.get("state")??void 0,code:r.searchParams.get("code")??void 0,error:r.searchParams.get("error")??void 0},t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"google",userId:i.userId}),Uf(n,200,Hf("Google connected",`<p>Connected <b>${Ml(i.email??"your Google account")}</b>. You can close this tab and go back to your agent.</p>`),oy),!0}if(s==="POST /connect/bank/exchange"){let i;try{i=JSON.parse(await(0,G$.readBodyWithCap)(e))??{}}catch{throw new Dl.ConnectError(400,"Bad request.")}let o=await t.provider.finishBank(i,t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"bank",userId:o.userId,institution:o.institution??null}),n.writeHead(200,{...Ll,"Content-Type":"text/plain; charset=utf-8"}),n.end("ok"),!0}throw new Dl.ConnectError(404,"Not found.")}catch(i){let o=i instanceof Dl.ConnectError?i.status:500,a=i instanceof Dl.ConnectError?i.message:"Something went wrong. Ask your agent for a new link and try again.";return t.audit?.("connect","grant_connect_failed",{route:s,status:o,error:i instanceof Error?i.message:String(i)}),s==="POST /connect/bank/exchange"?(n.writeHead(o,{...Ll,"Content-Type":"text/plain; charset=utf-8"}),n.end(a)):Uf(n,o,Hf("Could not connect",`<p>${Ml(a)}</p>`),oy),!0}}}});var cy=T(Dr=>{"use strict";var x$=Dr&&Dr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),B$=Dr&&Dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),F$=Dr&&Dr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&x$(n,e,r[s]);return B$(n,e),n}})();Object.defineProperty(Dr,"__esModule",{value:!0});Dr.backupTimestamp=K$;Dr.backupPathFor=ay;Dr.renameToBackup=W$;var V$=require("fs"),Bf=F$(require("path"));function K$(t=new Date){return t.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function ay(t,e){let n=Bf.dirname(t),r=Bf.basename(t).replace(/\.json$/i,"");return Bf.join(n,`${r}.${e}.bk`)}async function W$(t,e){let n=ay(t,e);try{return await V$.promises.rename(t,n),n}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code):"")==="ENOENT")return;throw r}}});var jl=T(Mt=>{"use strict";var q$=Mt&&Mt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Y$=Mt&&Mt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),J$=Mt&&Mt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&q$(n,e,r[s]);return Y$(n,e),n}})();Object.defineProperty(Mt,"__esModule",{value:!0});Mt._resetOutboundHandleStoreLockForTest=z$;Mt._setOutboundHandleStorePathForTest=Q$;Mt.buildGatewayOutboundHandleKey=fy;Mt.upsertGatewayOutboundHandle=sD;Mt.getLastGatewayOutboundHandle=iD;Mt.listGatewayOutboundTargets=oD;Mt.mergeGatewayOutboundHandles=aD;Mt.resolveGatewayOutboundHandle=cD;Mt.backupAndClearOutboundHandlesForAgent=lD;Mt.getGatewayOutboundStoreSnapshot=uD;var Gl=require("fs"),X$=J$(require("path")),ly=cy(),Vf=1,dy={value:void 0},Go=new Map,Ff=new Map;function Kf(t,e){let r=(Ff.get(t)??Promise.resolve()).then(()=>e());return Ff.set(t,r.catch(()=>{})),r}function z$(){Ff.clear(),Go.clear()}function Q$(t){dy.value=t,Go.clear()}function ka(t){return dy.value??t}function fy(t,e){let n=e?.trim();return n?`${t}::thread:${n}`:`${t}::`}function Z$(){return{version:Vf,lastByAgent:{},targetsByAgent:{}}}async function ni(t){let e=ka(t),n=Go.get(e);if(n)return n;try{let s=await Gl.promises.readFile(e,"utf-8"),i=JSON.parse(s);if(i.targetsByAgent&&typeof i.targetsByAgent=="object"){let o={version:i.version??Vf,lastByAgent:i.lastByAgent??{},targetsByAgent:i.targetsByAgent};return Go.set(e,o),o}}catch{}let r=Z$();return Go.set(e,r),r}async function Wf(t,e){let n=ka(t);await Gl.promises.mkdir(X$.dirname(n),{recursive:!0});let r={version:Vf,lastByAgent:e.lastByAgent,targetsByAgent:e.targetsByAgent},s=`${n}.tmp`;await Gl.promises.writeFile(s,JSON.stringify(r,null,2),"utf-8"),await Gl.promises.rename(s,n),Go.set(n,e)}function ti(t,e){if(e?.toLowerCase()!=="slack")return t;let n=t.match(/^(user|channel|group):(.+)$/i);return n?`${n[1].toLowerCase()}:${n[2].toUpperCase()}`:t}function uy(t,e,n){let r=ti(t,n),s=ti(e,n);return r.toLowerCase()===s.toLowerCase()}function eD(t,e,n){if(n)return t.find(i=>uy(i.target,e,i.channel)&&i.threadId?.trim()===n);let r=t.filter(i=>uy(i.target,e,i.channel));return r.length===0?void 0:r.find(i=>!i.threadId?.trim())??Ul(r)[0]}function tD(t,e){let n=t.match(/:thread:([^:]+)$/),r=n?t.slice(0,-n[0].length):t,s=r.match(/:direct:([^:]+)$/);if(s)return ti(`user:${s[1]}`,e);let i=r.match(/:dm:([^:]+)$/);if(i)return ti(`user:${i[1]}`,e);let o=r.match(/:channel:([^:]+)$/);if(o)return ti(`channel:${o[1]}`,e);let a=r.match(/:group:([^:]+)$/);if(a)return ti(`channel:${a[1]}`,e)}function nD(t){let e=t.target?.trim();if(e)return ti(e,t.channel);let n=t.sessionKey?.trim().toLowerCase();if(n){let s=tD(n,t.channel);if(s)return s}let r=t.senderId?.trim();if(r&&t.channel)return ti(`user:${r}`,t.channel)}function rD(t){return t.senderName?.trim()?t.senderName.trim():t.senderUsername?.trim()?t.senderUsername.trim():t.target?.trim()||t.senderId?.trim()}function Ul(t){return[...t].sort((e,n)=>n.lastSeenAt-e.lastSeenAt)}function Hl(t,e){let n=e.trim();if(!n||t.lastByAgent[n]||t.targetsByAgent[n])return n;if(n.toLowerCase()==="default"){for(let r of["default","Default"])if(t.lastByAgent[r]||t.targetsByAgent[r])return r}return n}async function sD(t,e,n,r,s){let i=e.trim();if(!i)return;let o=s?.gatewayAgentId?.trim()||void 0,a=n.channel?.trim(),c=n.sessionKey?.trim().toLowerCase();if(!a&&c){let u=c.match(/^agent:[^:]+:([a-z0-9_-]+):/);u&&(a=u[1])}let l=nD(n);if(!(!a||!l))return Kf(ka(t),async()=>{let u=Date.now(),f=await ni(t);f.targetsByAgent[i]||(f.targetsByAgent[i]={});let d=fy(l,n.threadId?.trim()),g=f.targetsByAgent[i][d],p={agentId:i,...o?{gatewayAgentId:o}:{},channel:a,accountId:n.accountId?.trim()||void 0,target:l,threadId:n.threadId?.trim()||void 0,sessionKey:n.sessionKey?.trim()||void 0,sessionId:n.sessionId?.trim()||void 0,senderId:n.senderId?.trim()||void 0,senderName:n.senderName?.trim()||void 0,senderUsername:n.senderUsername?.trim()||void 0,label:rD(n),firstSeenAt:g?.firstSeenAt??u,lastSeenAt:u,lastInboundRunId:r,inboundCount:(g?.inboundCount??0)+1};return f.targetsByAgent[i][d]=p,f.lastByAgent[i]=p,await Wf(t,f),p})}async function iD(t,e){let n=await ni(t),r=Hl(n,e);return n.lastByAgent[r]}async function oD(t,e){let n=await ni(t);if(e?.trim()){let s=Hl(n,e.trim());return Ul(Object.values(n.targetsByAgent[s]??{}))}let r=[];for(let s of Object.values(n.targetsByAgent))r.push(...Object.values(s));return Ul(r)}async function aD(t,e,n){let r=await ni(t),s=n?.trim()?[n.trim()]:[...new Set([...Object.keys(r.targetsByAgent),...Object.keys(r.lastByAgent)])];return s.length===0?0:Kf(ka(e),async()=>{let i=await ni(e),o=0,a=!1;for(let c of s){let l=r.targetsByAgent[c]??{},u=Object.entries(l);u.length>0&&!i.targetsByAgent[c]&&(i.targetsByAgent[c]={});for(let[d,g]of u){let p=i.targetsByAgent[c]?.[d];(!p||g.lastSeenAt>=p.lastSeenAt)&&(i.targetsByAgent[c][d]=g,o++,a=!0)}let f=r.lastByAgent[c];if(f){let d=i.lastByAgent[c];(!d||f.lastSeenAt>=d.lastSeenAt)&&(i.lastByAgent[c]=f,a=!0)}}return a&&await Wf(e,i),o})}async function cD(t,e,n){let r=await ni(t),s=Hl(r,e),i=n?.target?.trim();if(i){let o=Object.values(r.targetsByAgent[s]??{});return eD(o,i,n?.threadId?.trim())}return r.lastByAgent[s]}async function lD(t,e,n=(0,ly.backupTimestamp)()){let r=ka(t);return Kf(r,async()=>{let s=await ni(t),i=Hl(s,e),o=s.targetsByAgent[i],a=Object.prototype.hasOwnProperty.call(s.lastByAgent,i),c=o?Object.keys(o).length:0;if(c===0&&!a)return{removed:0};let l=await(0,ly.renameToBackup)(r,n);return delete s.targetsByAgent[i],delete s.lastByAgent[i],await Wf(t,s),{removed:c,backupPath:l}})}async function uD(t){let e=await ni(t),n={};for(let[r,s]of Object.entries(e.targetsByAgent))n[r]=Ul(Object.values(s));return{lastByAgent:e.lastByAgent,targetsByAgent:n}}});var gy=T(Lr=>{"use strict";var dD=Lr&&Lr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fD=Lr&&Lr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pD=Lr&&Lr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dD(n,e,r[s]);return fD(n,e),n}})();Object.defineProperty(Lr,"__esModule",{value:!0});Lr.EGRESS_URL_ENV=void 0;Lr.startEgressBroker=SD;var gD=pD(require("http")),hD=ur(),mD=Co(),_D=jl(),py=Zc();Lr.EGRESS_URL_ENV="AGENTHIPPO_EGRESS_URL";function ED(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function yD(t){return t?(0,mD.hashNonce)(t).slice(0,12):"none"}function wD(t,e){return(0,py.getGatewayOutboundFilePath)(t,(0,py.safeGatewaySessionDirId)(e))}async function SD(t){let e=gD.createServer(async(s,i)=>{let o=(a,c,l,u)=>{l&&t.audit?.("unauthorized",l,u??{}),i.writeHead(a,{"Content-Type":"application/json"}),i.end(JSON.stringify({ok:!1,error:c}))};try{if((s.url?.split("?")[0]??"")!=="/egress/send"){o(404,"not found");return}if(s.method!=="POST"){i.writeHead(405,{"Content-Type":"application/json",Allow:"POST"}),i.end(JSON.stringify({ok:!1,error:"method not allowed"}));return}let c=ED(s.headers.authorization),l=c?t.registry.resolve(c):void 0;if(!l){o(401,"Unauthorized: missing, unknown, or expired turn nonce","egress_nonce_reject",{reason:c?"unknown_or_expired":"missing",nonce_sha256_prefix:yD(c)});return}let u=l.egressStoreKey?.trim();if(!u){o(403,"no outbound route for this turn (not a channel-originated session)","egress_deny",{userId:l.userId,reason:"no_store_key"});return}let f;try{f=JSON.parse(await(0,hD.readBodyWithCap)(s))}catch{o(400,"invalid JSON body");return}let d=typeof f.message=="string"?f.message:"";if(!d.trim()){o(400,"message is required");return}let g=typeof f.to=="string"?f.to.trim():void 0,p=typeof f.media=="string"&&f.media.trim()||void 0,_=wD(t.workspaceRoot,u),h;try{h=await(0,_D.resolveGatewayOutboundHandle)(_,t.agentId,g?{target:g}:void 0)}catch(E){t.logger?.warn(`[Egress] store read failed: ${E instanceof Error?E.message:String(E)}`)}if(!h){o(404,g?`no bound handle matches "${g}" for this session (cannot address a new destination)`:"no reply destination bound for this session yet","egress_deny",{userId:l.userId,reason:"no_matching_handle",to:g??"(reply-to-sender)"});return}t.audit?.(l.sessionKey,"egress_authorize",{userId:l.userId,channel:h.channel,target:h.target});let y=await t.send(h,d,p);i.writeHead(y.ok?200:502,{"Content-Type":"application/json"}),i.end(JSON.stringify(y))}catch(a){t.logger?.warn(`[Egress] broker error: ${a instanceof Error?a.message:String(a)}`),i.headersSent||i.writeHead(500,{"Content-Type":"application/json"}),i.end(JSON.stringify({ok:!1,error:"Internal error"}))}});await new Promise((s,i)=>{e.once("error",i),e.listen(0,"127.0.0.1",()=>s())});let n=e.address();if(!n||typeof n=="string")throw new Error("Egress broker failed to bind a loopback port");let r=`http://127.0.0.1:${n.port}/egress/send`;return t.logger?.info(`[Egress] broker listening at ${r}`),{url:r,close:()=>new Promise(s=>e.close(()=>s()))}}});var yy=T(Bn=>{"use strict";var AD=Bn&&Bn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),TD=Bn&&Bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bD=Bn&&Bn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&AD(n,e,r[s]);return TD(n,e),n}})();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.ASSERTION_HEADER=void 0;Bn.startDataPlaneSidecar=kD;var hy=bD(require("http")),Ey=require("crypto"),vD=Vi(),OD=Co(),my=ur(),_y=Ra(),ID=xf(),PD=Mo();Bn.ASSERTION_HEADER="x-agent-user-assertion";function ND(t,e){let n=t.headers[e];return(Array.isArray(n)?n[0]:n)?.trim()||void 0}function xl(t){return(0,Ey.createHash)("sha256").update(t).digest("hex").slice(0,12)}function RD(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function CD(t,e){let n=Buffer.from(t),r=Buffer.from(e);return n.length===r.length&&(0,Ey.timingSafeEqual)(n,r)}async function kD(t){let e=t.bindHost??"0.0.0.0",n=await vD.DataPlane.start(t.config,{logger:t.logger,audit:t.audit,gateway:{host:e,port:t.gatewayPort,advertiseHost:e==="0.0.0.0"?void 0:e}}),r=new Map,s=hy.createServer(async(u,f)=>{let d=(g,p)=>{f.writeHead(g,{"Content-Type":"application/json"}),f.end(JSON.stringify({error:p}))};try{let g=u.url?.split("?")[0]??"";if(u.method==="GET"&&g==="/health")return f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0}));let p=RD(u.headers.authorization);if(!p||!CD(p,t.registerToken))return t.audit?.("unauthorized","sidecar_register_reject",{reason:p?"bad_token":"missing_token"}),d(401,"unauthorized");if((u.method==="GET"||u.method==="POST")&&g==="/edge/turn"){let _=(Array.isArray(u.headers["x-agent-user"])?u.headers["x-agent-user"][0]:u.headers["x-agent-user"])?.trim();if(!_)return t.audit?.("unauthorized","sidecar_edge_reject",{reason:"missing_user"}),d(400,"X-Agent-User required");let h=ND(u,Bn.ASSERTION_HEADER)?.replace(/^Bearer\s+/i,"").trim()||void 0,{nonce:y}=n.registerTurnRaw({userId:_,sessionKey:_,inboundToken:h});return t.audit?.(_,"sidecar_edge_register",{userId:_,assertion:h?`sha256:${xl(h)}`:"none",nonce_sha256_prefix:xl(y)}),f.writeHead(200,{"Content-Type":"application/json",[PD.TURN_NONCE_HEADER]:y}),f.end(JSON.stringify({ok:!0}))}if(u.method==="POST"&&g==="/turns"){let _;try{_=JSON.parse(await(0,my.readBodyWithCap)(u))}catch{return d(400,"bad json")}let h=(_.userId??"").trim();if(!h)return d(400,"userId required");let y=_.renewNonce?.trim()||void 0;if(y!==void 0&&!(0,OD.isNonceShaped)(y))return d(400,"renewNonce must be a previously minted turn nonce");let E=_.agent?.pack?.trim(),w=!!(E&&t.agent?.pack&&E!==t.agent.pack);w&&console.warn(`Warning: turn registration claims agent "${E}" but this connector loaded "${t.agent?.pack}". One connector is meant to serve one agent \u2014 both now share this connector's base credential, so neither is bounded by the job it was deployed for.`);let{nonce:A,release:S}=n.registerTurnRaw({userId:h,sessionKey:(_.sessionKey??"").trim()||h,inboundToken:_.inboundToken,egressStoreKey:_.egressStoreKey},{renewNonce:y});return r.set(A,S),t.audit?.((_.sessionKey??"").trim()||h,"sidecar_register",{userId:h,claimedAgent:E??"none",binding:"asserted",nonce_sha256_prefix:xl(A),...y?{renewed:!0}:{},...w?{agentMismatch:!0,loadedAgent:t.agent?.pack}:{}}),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({nonce:A}))}if(u.method==="DELETE"&&g.startsWith("/turns/")){let _=decodeURIComponent(g.slice(7)),h=r.has(_);return r.get(_)?.(),r.delete(_),t.audit?.("control","sidecar_release",{released:h,nonce_sha256_prefix:xl(_)}),f.writeHead(204),f.end()}d(404,"not found")}catch(g){t.logger?.warn(`[Sidecar] control error: ${g instanceof Error?g.message:String(g)}`),f.headersSent||f.writeHead(500,{"Content-Type":"application/json"}),f.end(JSON.stringify({error:"internal"}))}});await new Promise((u,f)=>{s.once("error",f),s.listen(t.controlPort,e,()=>u())});let i=s.address(),o=i&&typeof i!="string"?i.port:t.controlPort;t.logger?.info(`[Sidecar] gateway ${n.url} | control :${o} (bound ${e})`),(t.config.provider??"passthrough").trim().toLowerCase()==="passthrough"&&console.warn(`Warning: provider=passthrough needs a per-user token on every turn. Edge-registered turns supply it via the ${Bn.ASSERTION_HEADER} header \u2014 if your edge does not forward it, every tool call will fail closed.`);let a,c,l=n.broker.provider;if(t.connectPort!==void 0&&l instanceof _y.StoredGrantProvider){let u=(0,ID.createConnectHandler)({provider:l,browserUser:g=>(0,my.resolveUserId)(g.headers,void 0),audit:t.audit}),f=hy.createServer(async(g,p)=>{try{await u(g,p)||(p.writeHead(404,{"Content-Type":"application/json"}),p.end(JSON.stringify({error:"not found"})))}catch(_){t.logger?.warn(`[Sidecar] connect error: ${_ instanceof Error?_.message:String(_)}`),p.headersSent||p.writeHead(500),p.end()}});await new Promise((g,p)=>{f.once("error",p),f.listen(t.connectPort,e,()=>g())});let d=f.address();c=d&&typeof d!="string"?d.port:t.connectPort,a=f,t.logger?.info(`[Sidecar] connect pages :${c} (bound ${e})`)}return{gatewayUrl:n.url,controlPort:o,connectPort:c,...l instanceof _y.StoredGrantProvider?{grants:l}:{},close:async()=>{await new Promise(u=>s.close(()=>u())),a&&await new Promise(u=>a.close(()=>u())),await n.close()}}}});var Jf=T(ri=>{"use strict";Object.defineProperty(ri,"__esModule",{value:!0});ri.RemoteDataPlane=ri.EdgeDataPlane=void 0;ri.resolveEdgeDataPlane=$D;ri.resolveRemoteDataPlane=DD;var Bl=Mo(),wy=5e3;function $D(t=process.env){let e=t.AGENTHIPPO_DATA_PLANE_EDGE?.trim(),n=t.AGENTHIPPO_DATA_MCP_URL?.trim();return!e||e==="0"||e.toLowerCase()==="false"||!n?null:{gatewayUrl:n}}var qf=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}adoptTurn(e){return{nonce:e,env:{[Bl.TURN_NONCE_ENV]:e,[Bl.DATA_MCP_URL_ENV]:this.cfg.gatewayUrl},release:async()=>{try{await fetch(new URL("/turn",this.cfg.gatewayUrl),{method:"DELETE",headers:{Authorization:`Bearer ${e}`},signal:AbortSignal.timeout(this.cfg.releaseTimeoutMs??wy)})}catch{}}}}};ri.EdgeDataPlane=qf;function DD(t=process.env){let e=t.AGENTHIPPO_DATA_PLANE_CONTROL_URL?.trim(),n=t.AGENTHIPPO_DATA_PLANE_TOKEN?.trim(),r=t.AGENTHIPPO_DATA_MCP_URL?.trim();return!e||!n||!r?null:{controlUrl:e,registerToken:n,gatewayUrl:r}}var Yf=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}async registerTurn(e){let n=await fetch(`${this.cfg.controlUrl.replace(/\/$/,"")}/turns`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.cfg.registerToken}`},body:JSON.stringify(e)});if(!n.ok)throw new Error(`data-plane sidecar register failed: HTTP ${n.status}`);let{nonce:r}=await n.json();return{nonce:r,env:{[Bl.TURN_NONCE_ENV]:r,[Bl.DATA_MCP_URL_ENV]:this.cfg.gatewayUrl},release:async()=>{try{await fetch(`${this.cfg.controlUrl.replace(/\/$/,"")}/turns/${encodeURIComponent(r)}`,{method:"DELETE",headers:{Authorization:`Bearer ${this.cfg.registerToken}`},signal:AbortSignal.timeout(this.cfg.releaseTimeoutMs??wy)})}catch{}}}}};ri.RemoteDataPlane=Yf});var Vi=T(Y=>{"use strict";var LD=Y&&Y.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MD=Y&&Y.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),GD=Y&&Y.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LD(n,e,r[s]);return MD(n,e),n}})();Object.defineProperty(Y,"__esModule",{value:!0});Y.DataPlane=Y.resolveEdgeDataPlane=Y.EdgeDataPlane=Y.resolveRemoteDataPlane=Y.RemoteDataPlane=Y.ASSERTION_HEADER=Y.startDataPlaneSidecar=Y.EGRESS_URL_ENV=Y.startEgressBroker=Y.TURN_NONCE_HEADER=Y.TURN_NONCE_ENV=Y.DATA_MCP_URL_ENV=Y.startDataGateway=Y.TURN_META_KEY=Y.ConnectorHost=Y.createConnectHandler=Y.parseGrantKey=Y.GrantStore=Y.ConnectError=Y.readStoredGrantConfig=Y.StoredGrantProvider=Y.identityProvider=Y.passthroughProvider=Y.resolveProvider=Y.CredentialBroker=Y.DEFAULT_TURN_DEADLINE_MS=Y.isNonceShaped=Y.hashNonce=Y.TurnRegistry=void 0;Y.resolveDataPlaneConfig=BD;var $a=GD(require("path")),UD=Co(),Sy=Pf(),HD=Rf(),Xf=Mo(),jD=en(),Fl=Co();Object.defineProperty(Y,"TurnRegistry",{enumerable:!0,get:function(){return Fl.TurnRegistry}});Object.defineProperty(Y,"hashNonce",{enumerable:!0,get:function(){return Fl.hashNonce}});Object.defineProperty(Y,"isNonceShaped",{enumerable:!0,get:function(){return Fl.isNonceShaped}});Object.defineProperty(Y,"DEFAULT_TURN_DEADLINE_MS",{enumerable:!0,get:function(){return Fl.DEFAULT_TURN_DEADLINE_MS}});var Vl=Pf();Object.defineProperty(Y,"CredentialBroker",{enumerable:!0,get:function(){return Vl.CredentialBroker}});Object.defineProperty(Y,"resolveProvider",{enumerable:!0,get:function(){return Vl.resolveProvider}});Object.defineProperty(Y,"passthroughProvider",{enumerable:!0,get:function(){return Vl.passthroughProvider}});Object.defineProperty(Y,"identityProvider",{enumerable:!0,get:function(){return Vl.identityProvider}});var Qf=Ra();Object.defineProperty(Y,"StoredGrantProvider",{enumerable:!0,get:function(){return Qf.StoredGrantProvider}});Object.defineProperty(Y,"readStoredGrantConfig",{enumerable:!0,get:function(){return Qf.readStoredGrantConfig}});Object.defineProperty(Y,"ConnectError",{enumerable:!0,get:function(){return Qf.ConnectError}});var Ty=bf();Object.defineProperty(Y,"GrantStore",{enumerable:!0,get:function(){return Ty.GrantStore}});Object.defineProperty(Y,"parseGrantKey",{enumerable:!0,get:function(){return Ty.parseGrantKey}});var xD=xf();Object.defineProperty(Y,"createConnectHandler",{enumerable:!0,get:function(){return xD.createConnectHandler}});var by=Rf();Object.defineProperty(Y,"ConnectorHost",{enumerable:!0,get:function(){return by.ConnectorHost}});Object.defineProperty(Y,"TURN_META_KEY",{enumerable:!0,get:function(){return by.TURN_META_KEY}});var Kl=Mo();Object.defineProperty(Y,"startDataGateway",{enumerable:!0,get:function(){return Kl.startDataGateway}});Object.defineProperty(Y,"DATA_MCP_URL_ENV",{enumerable:!0,get:function(){return Kl.DATA_MCP_URL_ENV}});Object.defineProperty(Y,"TURN_NONCE_ENV",{enumerable:!0,get:function(){return Kl.TURN_NONCE_ENV}});Object.defineProperty(Y,"TURN_NONCE_HEADER",{enumerable:!0,get:function(){return Kl.TURN_NONCE_HEADER}});var vy=gy();Object.defineProperty(Y,"startEgressBroker",{enumerable:!0,get:function(){return vy.startEgressBroker}});Object.defineProperty(Y,"EGRESS_URL_ENV",{enumerable:!0,get:function(){return vy.EGRESS_URL_ENV}});var Oy=yy();Object.defineProperty(Y,"startDataPlaneSidecar",{enumerable:!0,get:function(){return Oy.startDataPlaneSidecar}});Object.defineProperty(Y,"ASSERTION_HEADER",{enumerable:!0,get:function(){return Oy.ASSERTION_HEADER}});var Wl=Jf();Object.defineProperty(Y,"RemoteDataPlane",{enumerable:!0,get:function(){return Wl.RemoteDataPlane}});Object.defineProperty(Y,"resolveRemoteDataPlane",{enumerable:!0,get:function(){return Wl.resolveRemoteDataPlane}});Object.defineProperty(Y,"EdgeDataPlane",{enumerable:!0,get:function(){return Wl.EdgeDataPlane}});Object.defineProperty(Y,"resolveEdgeDataPlane",{enumerable:!0,get:function(){return Wl.resolveEdgeDataPlane}});var Ay={"personal-connectors":$a.join("skills","personal-connectors","scripts","server.mjs")};function BD(t,e,n=(0,jD.findBundledBasePromptsDir)()){let r=t?.dataPlane,s=r?.connector?.trim();if(!s)return;let i=r?.provider?.trim()||void 0;if(s.startsWith("builtin:")){let o=s.slice(8),a=Ay[o];if(!a)throw new Error(`Unknown builtin connector "${o}" (known: ${Object.keys(Ay).join(", ")})`);if(!n)throw new Error(`connector ${s}: this AgentHippo build ships no base-prompts. Copy the connector into the pack (${$a.dirname(a)}/server.mjs and lib.mjs) and point spec.dataPlane.connector at the copy.`);return{connectorPath:$a.join(n,a),provider:i}}return{connectorPath:$a.isAbsolute(s)?s:$a.join(e,s),provider:i}}var zf=class t{url;registry;broker;connector;gateway;constructor(e,n,r,s,i){this.url=e,this.registry=n,this.broker=r,this.connector=s,this.gateway=i}static async start(e,n){let r=n?.registry??new UD.TurnRegistry,s=new Sy.CredentialBroker(n?.provider??(0,Sy.resolveProvider)(e.provider)),i=await HD.ConnectorHost.spawn({connectorPath:e.connectorPath,logger:n?.logger});try{let o=await(0,Xf.startDataGateway)({registry:r,broker:s,connector:i,logger:n?.logger,audit:n?.audit,host:n?.gateway?.host,port:n?.gateway?.port,advertiseHost:n?.gateway?.advertiseHost});return new t(o.url,r,s,i,o)}catch(o){throw await i.close(),o}}registerTurnRaw(e,n){return this.registry.register(e,n)}registerTurn(e,n){let{nonce:r,release:s}=this.registry.register(e,n);return{nonce:r,env:{[Xf.TURN_NONCE_ENV]:r,[Xf.DATA_MCP_URL_ENV]:this.url},release:s}}async close(){await this.gateway.close(),await this.connector.close()}};Y.DataPlane=zf});var Ry=T(Jl=>{"use strict";Object.defineProperty(Jl,"__esModule",{value:!0});Jl.resolveLocalTurnUserId=Ny;Jl.resolveLocalTurnScope=VD;var Iy=Vi(),Py=Jf(),ql=Mo(),FD=As();function Ny(t=process.env){return t.AGENTHIPPO_DATA_USER?.trim()||(0,FD.currentCredential)()?.userId?.trim()||t.LOGNAME?.trim()||t.USER?.trim()||t.LNAME?.trim()||t.USERNAME?.trim()||void 0}var Zf=new WeakMap,Yl=class{mode;userId;gatewayUrl;registrar;closePlane;sessionNonce;activeTurns=0;latestRelease;constructor(e,n,r,s,i){this.mode=e,this.userId=n,this.gatewayUrl=r,this.registrar=s,this.closePlane=i}async beginTurn(e){let n=await this.registrar.registerTurn({userId:this.userId,sessionKey:e.sessionKey,renewNonce:this.sessionNonce});this.sessionNonce=n.nonce,this.latestRelease=n.release,this.activeTurns++;let r=!1;return{env:n.env,release:async()=>{if(!r&&(r=!0,this.activeTurns--,this.activeTurns<=0)){let s=this.latestRelease;this.latestRelease=void 0,await s?.()}}}}async close(){await this.closePlane()}};async function VD(t){let e=t.env??process.env,n=i=>{let o=Ny(e);if(!o)throw new Error(`${i} is configured but no acting user resolves \u2014 set AGENTHIPPO_DATA_USER (fail-closed: turns register a real identity; there is no anonymous data access)`);return o},r=Zf.has(e)?Zf.get(e):(0,Py.resolveRemoteDataPlane)(e);if(r){Zf.set(e,r);let i=n("The data-plane sidecar"),o=new Py.RemoteDataPlane(r);return delete e.AGENTHIPPO_DATA_PLANE_TOKEN,e[ql.DATA_MCP_URL_ENV]=o.url,new Yl("sidecar",i,o.url,{registerTurn:a=>o.registerTurn({...a,agent:t.agent})},async()=>{})}if(e[ql.TURN_NONCE_ENV]?.trim()&&e[ql.DATA_MCP_URL_ENV]?.trim())return console.warn("Warning: using a pre-minted session nonce from the environment (not rotated per turn, expires on the registry deadline). Set AGENTHIPPO_DATA_PLANE_CONTROL_URL + AGENTHIPPO_DATA_PLANE_TOKEN to register real per-turn identities instead."),null;let s=t.packPath?(0,Iy.resolveDataPlaneConfig)(t.spec,t.packPath):void 0;if(s){let i=n("The pack's data plane (spec.dataPlane)"),o=await Iy.DataPlane.start(s,{logger:t.logger,audit:t.audit});return e[ql.DATA_MCP_URL_ENV]=o.url,new Yl("in-process",i,o.url,{registerTurn:async a=>o.registerTurn(a,{renewNonce:a.renewNonce})},()=>o.close())}return null}});var si=T($e=>{"use strict";var KD=$e&&$e.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),WD=$e&&$e.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qD=$e&&$e.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KD(n,e,r[s]);return WD(n,e),n}})();Object.defineProperty($e,"__esModule",{value:!0});$e.USAGE_QUERY_TTL_SECONDS=$e.WARRANT_TTL_ENV=$e.DEFAULT_WARRANT_TTL_SECONDS=$e.MAX_TTL_SECONDS=void 0;$e.b64urlEncode=ep;$e.signCompactJws=tp;$e.verifyCompactJws=Cy;$e.timingSafeEqualString=YD;$e.generateWarrantKeypair=JD;$e.warrantTtlFromEnv=XD;$e.mintWarrant=zD;$e.mintWarrantUsageQuery=QD;$e.verifyWarrant=ZD;$e.jwks=e0;var Ns=qD(require("node:crypto"));function ep(t){return Buffer.from(t,"utf8").toString("base64url")}function tp(t,e,n){let r={alg:"ES256",typ:t.typ??"JWT",kid:t.kid},s=`${ep(JSON.stringify(r))}.${ep(JSON.stringify(e))}`,i=Ns.sign("sha256",Buffer.from(s),{key:Ns.createPrivateKey(n),dsaEncoding:"ieee-p1363"});return`${s}.${i.toString("base64url")}`}function Cy(t,e,n={}){let r=t.split(".");if(r.length!==3)return{ok:!1,reason:"malformed"};let[s,i,o]=r,a,c;try{a=JSON.parse(Buffer.from(s,"base64url").toString("utf8")),c=JSON.parse(Buffer.from(i,"base64url").toString("utf8"))}catch{return{ok:!1,reason:"unparseable"}}if(a.alg!=="ES256")return{ok:!1,reason:`unsupported alg ${a.alg}`};if(n.typ!==void 0&&a.typ!==void 0&&a.typ!==n.typ)return{ok:!1,reason:`unexpected token type ${a.typ}`};let l=a.kid?e[a.kid]:void 0;if(!l)return{ok:!1,reason:"unknown kid"};let u=!1;try{u=Ns.verify("sha256",Buffer.from(`${s}.${i}`),{key:Ns.createPublicKey(l),dsaEncoding:"ieee-p1363"},Buffer.from(o,"base64url"))}catch{return{ok:!1,reason:"bad signature"}}return u?{ok:!0,header:a,payload:c,signingInput:`${s}.${i}`}:{ok:!1,reason:"bad signature"}}function YD(t,e){let n=Buffer.from(t,"utf8"),r=Buffer.from(e,"utf8");return n.length!==r.length?!1:Ns.timingSafeEqual(n,r)}function JD(t){let{privateKey:e,publicKey:n}=Ns.generateKeyPairSync("ec",{namedCurve:"P-256"}),r=n.export({type:"spki",format:"pem"}).toString();return{privateKeyPem:e.export({type:"pkcs8",format:"pem"}).toString(),publicKeyPem:r,kid:t??Ns.createHash("sha256").update(r).digest("hex").slice(0,16)}}$e.MAX_TTL_SECONDS=86400;$e.DEFAULT_WARRANT_TTL_SECONDS=3600;$e.WARRANT_TTL_ENV="AGENTHIPPO_WARRANT_TTL_SECONDS";function XD(t=process.env){let e=t[$e.WARRANT_TTL_ENV]?.trim();if(e===void 0||e==="")return $e.DEFAULT_WARRANT_TTL_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<=0?$e.DEFAULT_WARRANT_TTL_SECONDS:Math.min(Math.floor(n),$e.MAX_TTL_SECONDS)}function zD(t,e){let n=t.nowSeconds??Math.floor(Date.now()/1e3),r=Math.min(t.ttlSeconds??120,$e.MAX_TTL_SECONDS),s={user:t.user,pack:t.pack,packVersion:t.packVersion,sandboxId:t.sandboxId,tier:t.tier,aud:t.aud,iat:n,exp:n+r,jti:t.jti??Ns.randomUUID(),...t.billing==="user"?{billing:"user"}:{},...t.budgetKey?{budgetKey:t.budgetKey}:{},...t.budgetWindowSeconds!==void 0&&t.budgetWindowSeconds>0?{budgetWindowSeconds:t.budgetWindowSeconds}:{}};return tp({typ:"JWT",kid:e.kid},s,e.privateKeyPem)}$e.USAGE_QUERY_TTL_SECONDS=60;function QD(t,e,n=Math.floor(Date.now()/1e3)){return tp({typ:"JWT",kid:t.kid},{aud:"usage",jtis:e,iat:n,exp:n+$e.USAGE_QUERY_TTL_SECONDS},t.privateKeyPem)}function ZD(t,e,n){let r=Cy(t,e);if(!r.ok)return{ok:!1,reason:r.reason};let s=r.payload,i=n.nowSeconds??Math.floor(Date.now()/1e3);return typeof s.exp!="number"||s.exp<=i?{ok:!1,reason:"expired"}:s.aud!==n.audience?{ok:!1,reason:`wrong audience ${s.aud}`}:n.channelSandboxId!==void 0&&s.sandboxId!==n.channelSandboxId?{ok:!1,reason:"warrant not bound to this channel"}:s.user?{ok:!0,claims:s}:{ok:!1,reason:"no principal"}}function e0(t){return{keys:t.map(e=>({...Ns.createPublicKey(e.publicKeyPem).export({format:"jwk"}),kid:e.kid,alg:"ES256",use:"sig"}))}}});var La=T(de=>{"use strict";Object.defineProperty(de,"__esModule",{value:!0});de.DENY_SCOPE_ALIASES=de.DENY_MODE_ALIASES=de.STRICTEST_DENY_MODE=de.DENY_MODES=de.DENY_SCOPES=de.STRICTEST_ON_BREACH=de.ON_BREACH_ALIASES=de.ON_BREACH_ACTIONS=de.DEPRECATED_CAP_SPELLINGS=de.LEASE_CAP_ALIASES=de.LEASE_CAP_FIELDS=void 0;de.parseCapPolicy=ky;de.parseLease=r0;de.LEASE_CAP_FIELDS={maxTurnsPerSession:{kind:"positive-int"},maxSessionSeconds:{kind:"positive-int"},maxConcurrentSandboxes:{kind:"positive-int"}};de.LEASE_CAP_ALIASES={maxConcurrentCells:"maxConcurrentSandboxes"};de.DEPRECATED_CAP_SPELLINGS={maxConcurrentCells:"maxConcurrentSandboxes",AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES","destroy-cell":"destroy-sandbox","--max-concurrent-cells":"--max-concurrent-sandboxes"};de.ON_BREACH_ACTIONS={"revoke-inference":{strictness:1},"destroy-sandbox":{strictness:2}};de.ON_BREACH_ALIASES={"destroy-cell":"destroy-sandbox"};de.STRICTEST_ON_BREACH=Object.keys(de.ON_BREACH_ACTIONS).reduce((t,e)=>de.ON_BREACH_ACTIONS[t].strictness>=de.ON_BREACH_ACTIONS[e].strictness?t:e);de.DENY_SCOPES=["session","user","pack"];de.DENY_MODES={drain:{strictness:1},kill:{strictness:2}};de.STRICTEST_DENY_MODE="kill";de.DENY_MODE_ALIASES={};de.DENY_SCOPE_ALIASES={};var Da=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function t0(t,e){return typeof e!="number"?{ok:!1,reason:`${t} must be a number, got ${typeof e} (${JSON.stringify(e)})`}:Number.isFinite(e)?e<=0?{ok:!1,reason:`${t} must be greater than 0, got ${e} (omit the field for "unbounded")`}:Number.isInteger(e)?{ok:!0,value:e}:{ok:!1,reason:`${t} must be a whole number, got ${e}`}:{ok:!1,reason:`${t} must be finite, got ${e}`}}function ky(t,e="caps"){if(t==null)return{ok:!0,caps:{},warnings:[]};if(!Da(t))return{ok:!1,reason:`${e} must be an object`};let n=[],r={};for(let[i,o]of Object.entries(t)){if(o==null||i==="onBreach")continue;let a=i in de.LEASE_CAP_FIELDS?i:de.LEASE_CAP_ALIASES[i];if(!a){n.push(`${e}.${i} is not a cap this build understands and is NOT being enforced`);continue}let c=t0(`${e}.${i}`,o);if(!c.ok)return{ok:!1,reason:c.reason};r[a]=c.value}let s=t.onBreach;if(s!=null){if(typeof s!="string")return{ok:!1,reason:`${e}.onBreach must be a string, got ${typeof s}`};let i=s in de.ON_BREACH_ACTIONS?s:de.ON_BREACH_ALIASES[s];i?r.onBreach=i:(r.onBreach=de.STRICTEST_ON_BREACH,n.push(`${e}.onBreach="${s}" is not an action this build understands. Failing CLOSED to "${de.STRICTEST_ON_BREACH}" (the strictest known action). Known actions: ${Object.keys(de.ON_BREACH_ACTIONS).join(", ")}.`))}return{ok:!0,caps:r,warnings:n}}function n0(t,e){if(!Da(t))return{ok:!1,reason:`deny[${e}] must be an object`};let n=[],r=t.scope;if(typeof r!="string")return{ok:!1,reason:`deny[${e}].scope must be a string`};let s=de.DENY_SCOPES.includes(r)?r:de.DENY_SCOPE_ALIASES[r];if(!s)return{ok:!1,reason:`deny[${e}].scope "${r}" is not a scope this build understands (known: ${de.DENY_SCOPES.join(", ")})`};if(typeof t.match!="string"||t.match.length===0)return{ok:!1,reason:`deny[${e}].match must be a non-empty string`};let i=t.mode;if(typeof i!="string")return{ok:!1,reason:`deny[${e}].mode must be a string`};let o=i in de.DENY_MODES?i:de.DENY_MODE_ALIASES[i];o||(o=de.STRICTEST_DENY_MODE,n.push(`deny[${e}].mode="${i}" is not a mode this build understands. Failing CLOSED to "${de.STRICTEST_DENY_MODE}". Known modes: ${Object.keys(de.DENY_MODES).join(", ")}.`));let a={scope:s,match:t.match,mode:o};if(t.reason!==void 0){if(typeof t.reason!="string")return{ok:!1,reason:`deny[${e}].reason must be a string`};a.reason=t.reason}if(t.until!==void 0&&t.until!==null){if(typeof t.until!="number"||!Number.isFinite(t.until))return{ok:!1,reason:`deny[${e}].until must be a finite epoch-seconds number`};a.until=t.until}if(t.user!==void 0&&t.user!==null){if(typeof t.user!="string")return{ok:!1,reason:`deny[${e}].user must be a string`};a.user=t.user}if(t.followUser!==void 0&&t.followUser!==null){if(typeof t.followUser!="boolean")return{ok:!1,reason:`deny[${e}].followUser must be a boolean`};a.followUser=t.followUser}return{ok:!0,rule:a,warnings:n}}function r0(t){if(!Da(t))return{ok:!1,reason:"lease must be a JSON object"};let e=[];if(typeof t.pack!="string"||t.pack.length===0)return{ok:!1,reason:"lease.pack must be a non-empty string"};if(typeof t.enabled!="boolean")return{ok:!1,reason:`lease.enabled must be a boolean, got ${typeof t.enabled}`};if(typeof t.expiresAt!="number"||!Number.isFinite(t.expiresAt))return{ok:!1,reason:`lease.expiresAt must be a finite epoch-seconds number, got ${JSON.stringify(t.expiresAt)}`};let n={pack:t.pack,enabled:t.enabled,expiresAt:t.expiresAt};for(let r of["version","imageDigest","reason"]){let s=t[r];if(s!=null){if(typeof s!="string")return{ok:!1,reason:`lease.${r} must be a string, got ${typeof s}`};n[r]=s}}for(let r of["requireSignedPack","requireSignedLease","allowServiceTurns","billUsers"]){let s=t[r];if(s!=null){if(typeof s!="boolean")return{ok:!1,reason:`lease.${r} must be a boolean, got ${typeof s}`};n[r]=s}}if(t.budget!==void 0&&t.budget!==null){let r=t.budget;if(typeof r!="object"||Array.isArray(r))return{ok:!1,reason:"lease.budget must be an object"};let s=r.scope;if(s!=="session"&&s!=="user")return{ok:!1,reason:`lease.budget.scope must be 'session' or 'user', got ${JSON.stringify(s)}`};let i=r.windowSeconds;if(i!=null&&(typeof i!="number"||!Number.isFinite(i)||i<0))return{ok:!1,reason:"lease.budget.windowSeconds must be a non-negative number"};n.budget={scope:s,...typeof i=="number"&&i>0?{windowSeconds:i}:{}}}if(t.caps!==void 0&&t.caps!==null){let r=ky(t.caps,"lease.caps");if(!r.ok)return{ok:!1,reason:r.reason};n.caps=r.caps,e.push(...r.warnings)}if(t.deny!==void 0&&t.deny!==null){if(!Array.isArray(t.deny))return{ok:!1,reason:"lease.deny must be an array"};let r=[];for(let s=0;s<t.deny.length;s++){let i=n0(t.deny[s],s);if(!i.ok)return{ok:!1,reason:i.reason};r.push(i.rule),e.push(...i.warnings)}n.deny=r}if(t.grants!==void 0&&t.grants!==null){let r=Da(t.grants)?t.grants.revoke:void 0;if(!Array.isArray(r))e.push("lease.grants.revoke is not an array \u2014 ignored");else{let s=[];for(let[i,o]of r.entries()){if(!Da(o)||typeof o.user!="string"||!/^[0-9a-f]{64}$/.test(o.user)||typeof o.requestedAt!="number"||!Number.isFinite(o.requestedAt)||o.service!==void 0&&o.service!=="google"&&o.service!=="bank"){e.push(`lease.grants.revoke[${i}] is malformed \u2014 ignored`);continue}s.push({user:o.user,requestedAt:o.requestedAt,...o.service?{service:o.service}:{}})}n.grants={revoke:s}}}return t.issuedAt!==void 0&&t.issuedAt!==null&&(typeof t.issuedAt=="number"&&Number.isFinite(t.issuedAt)?n.issuedAt=t.issuedAt:e.push("lease.issuedAt is not a finite number \u2014 ignored")),t.deployment!==void 0&&t.deployment!==null&&(typeof t.deployment=="string"&&t.deployment.length>0?n.deployment=t.deployment:e.push("lease.deployment is not a non-empty string \u2014 ignored")),{ok:!0,lease:n,warnings:e}}});var Ho=T(F=>{"use strict";var s0=F&&F.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),i0=F&&F.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),rp=F&&F.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&s0(n,e,r[s]);return i0(n,e),n}})();Object.defineProperty(F,"__esModule",{value:!0});F.PACK_FULL_REVERIFY_INTERVAL_MS=F.PACK_PROBE_INTERVAL_MS=F.LEASE_JWKS_PINS_ENV=F.LEASE_JWKS_URL_ENV=F.LEASE_SIGNING_KEYS_ENV=F.ALLOW_INSECURE_TRUST_ROOT_ENV=F.PACK_JWKS_PINS_ENV=F.PACK_JWKS_URL_ENV_LEGACY=F.PACK_JWKS_URL_ENV=F.ALLOW_UNSIGNED_PACK_ENV=F.DIGEST_EXCLUDED_SEGMENTS=F.PACK_SIGNATURE_FILE=void 0;F.isDigestExcluded=zl;F.computePackDigestFromFiles=Dy;F.computePackDigest=sp;F.packTreeProbe=np;F.signPack=o0;F.readPackSignature=Ly;F.verifyPack=My;F.verifyPackFromFiles=a0;F.requireSignedPack=Uy;F.resolveRequireSignedPack=l0;F.allowUnsignedPackFromEnv=u0;F.describePackRefusal=d0;F.publicKeyThumbprints=Hy;F.parseJwksPins=jy;F.assertSecureTrustUrl=xy;F.loadPackTrustRoot=Fy;F.loadLeaseTrustRoot=h0;F.selectLeaseSigningKeys=m0;F.checkTrustRootSeparation=_0;F.loadPackSigningKeys=y0;F.createPackVerifier=w0;var Uo=rp(require("node:crypto")),ii=rp(require("node:fs")),Xl=rp(require("node:path")),Ma=si();F.PACK_SIGNATURE_FILE="pack.sig";F.DIGEST_EXCLUDED_SEGMENTS=new Set([".git","node_modules"]);function zl(t){return t===F.PACK_SIGNATURE_FILE?!0:t.split("/").some(e=>F.DIGEST_EXCLUDED_SEGMENTS.has(e))}function $y(t){let e=Uo.createHash("sha256"),n=[...t].sort((r,s)=>r.rel<s.rel?-1:r.rel>s.rel?1:0);for(let r of n){r.link&&e.update("L:");let s=Buffer.from(r.rel);e.update(`${s.length}:`),e.update(s),e.update(`${r.body.length}:`),e.update(r.body)}return e.digest("hex")}function Dy(t){let e=[];for(let n of t){let r=n.path.replace(/\\/g,"/");zl(r)||e.push({rel:r,body:n.content,link:n.link})}return $y(e)}function sp(t){let e=[],n=(r,s)=>{for(let i of ii.readdirSync(r)){let o=s?`${s}/${i}`:i;if(zl(o))continue;let a=Xl.join(r,i),c=ii.lstatSync(a);c.isSymbolicLink()?e.push({rel:o,body:Buffer.from(ii.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({rel:o,body:ii.readFileSync(a)})}};return n(t,""),$y(e)}function np(t){let e=[],n=(r,s)=>{let i;try{i=ii.readdirSync(r).sort()}catch{e.push(`${s}/?unreadable`);return}for(let o of i){let a=s?`${s}/${o}`:o;if(zl(a))continue;let c=Xl.join(r,o),l;try{l=ii.lstatSync(c)}catch{e.push(`${a}|gone`);continue}if(l.isDirectory()){n(c,a);continue}e.push(`${a}|${l.size}|${l.mtimeMs}|${l.ino}|${l.mode}`)}};try{n(t,"")}catch{return"unwalkable"}return Uo.createHash("sha256").update(e.join(`
502
502
  `)).digest("hex")}function o0(t){let e=sp(t.packDir),n={pack:t.pack,packVersion:t.packVersion,digest:e,iat:t.nowSeconds??Math.floor(Date.now()/1e3)},r=(0,Ma.signCompactJws)({typ:"JWT",kid:t.kid},n,t.privateKeyPem);return ii.writeFileSync(Xl.join(t.packDir,F.PACK_SIGNATURE_FILE),`${r}
503
503
  `),{signature:r,digest:e}}function Ly(t){try{return ii.readFileSync(Xl.join(t,F.PACK_SIGNATURE_FILE),"utf8").trim()||void 0}catch{return}}function My(t,e,n){return Gy(t,e,n.pack,n.packVersion,()=>sp(n.packDir))}function a0(t,e,n,r,s){return Gy(t,e,n,r,()=>Dy(s))}function Gy(t,e,n,r,s){if(Object.keys(e).length===0)return{ok:!1,kind:"no-trust-root",reason:"no trusted pack-signing keys are configured on this instance"};let i=(0,Ma.verifyCompactJws)(t,e);if(!i.ok)return i.reason==="unknown kid"?{ok:!1,kind:"unknown-key",reason:`unknown signing key ${c0(t)??"(none named)"}`}:i.reason==="bad signature"?{ok:!1,kind:"bad-signature",reason:"signature does not verify"}:i.reason==="malformed"?{ok:!1,kind:"malformed",reason:"malformed signature"}:i.reason==="unparseable"?{ok:!1,kind:"malformed",reason:"unreadable signature"}:{ok:!1,kind:"malformed",reason:i.reason};let o=i.payload;return o.pack!==n?{ok:!1,kind:"identity-mismatch",reason:`signature is for pack ${o.pack}, not ${n}`}:o.packVersion!==r?{ok:!1,kind:"identity-mismatch",reason:`signature is for ${o.pack}@${o.packVersion}, not @${r}`}:typeof o.digest!="string"||!o.digest?{ok:!1,kind:"malformed",reason:"signature carries no digest"}:(0,Ma.timingSafeEqualString)(s(),o.digest)?{ok:!0,claims:o}:{ok:!1,kind:"digest-mismatch",reason:"pack contents changed after signing"}}function c0(t){try{return JSON.parse(Buffer.from(t.split(".")[0],"base64url").toString("utf8")).kid}catch{return}}function Uy(t,e){return!!t||!!e}F.ALLOW_UNSIGNED_PACK_ENV="AGENTHIPPO_ALLOW_UNSIGNED_PACK";function l0(t){return Uy(t.lease,t.localRequire)?!0:!t.localAllowUnsigned}function u0(t=process.env){let e=t[F.ALLOW_UNSIGNED_PACK_ENV]?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function d0(t){let n=[`refusing to run ${t.packVersion?`${t.pack}@${t.packVersion}`:t.pack}: ${t.detail}`];switch(t.kind){case"unsigned":n.push(` The pack directory has no ${F.PACK_SIGNATURE_FILE}${t.packDir?` at ${t.packDir}`:""}.`,` Sign it: agenthippo pack sign ${t.pack} --key <private-key.pem> --kid <key-id>`," (generate a key with: agenthippo pack keygen -o key.pem, then publish its public half to JWKS)");break;case"no-trust-root":n.push(" This is NOT a problem with the pack \u2014 this instance has no keys to check it against."," Configure ONE of:",' AGENTHIPPO_PACK_SIGNING_KEYS inline JSON {"<kid>":"<public PEM>"} (air-gapped installs)',` ${F.PACK_JWKS_URL_ENV} https URL of the JWKS document publishing your signing keys`,` ${F.PACK_JWKS_PINS_ENV} optional, comma-separated sha256 thumbprints to pin those keys to`);break;case"trust-root-unavailable":n.push(" A trust root IS configured but could not be loaded, so no signature can be checked.",` ${t.trustRootHint??""}`.trimEnd(),' This is deliberately an error and not an empty keyring: "cannot reach the trust root" and',' "no trust root configured" have different causes and different fixes.');break;case"unknown-key":n.push(" The pack IS signed, but by a key this fleet does not trust."," Either publish that key to your JWKS / AGENTHIPPO_PACK_SIGNING_KEYS, or re-sign the pack"," with a key that is already trusted. A key is never trusted just because it arrived with the pack.");break;case"digest-mismatch":n.push(" The signature is valid but the pack tree no longer matches it \u2014 something changed after signing."," Note that .claude/, .codex/ and .agent-hippo/ are now INSIDE the digest (they carry hooks and"," other executable content), so edits there invalidate a signature that used to survive them.",` Re-sign after reviewing the diff: agenthippo pack sign ${t.pack} --key <private-key.pem> --kid <key-id>`);break;case"identity-mismatch":n.push(" The signature is valid but names a different pack or version \u2014 a replayed signature, not this artifact.");break;case"malformed":case"bad-signature":n.push(` ${F.PACK_SIGNATURE_FILE} is present but unusable. Re-sign the pack; do not hand-edit it.`);break;case"no-pack":break}return n.push(` To run unsigned packs anyway (LOCAL DEVELOPMENT ONLY), set ${F.ALLOW_UNSIGNED_PACK_ENV}=1.`," A lease that sets requireSignedPack overrides that escape hatch \u2014 the control plane's demand cannot be waived locally."),n.join(`
504
- `)}F.PACK_JWKS_URL_ENV="AGENTHIPPO_PACK_JWKS_URL";F.PACK_JWKS_URL_ENV_LEGACY="AGENTHIPPO_PACK_SIGNING_JWKS_URL";F.PACK_JWKS_PINS_ENV="AGENTHIPPO_PACK_JWKS_PINS";F.ALLOW_INSECURE_TRUST_ROOT_ENV="AGENTHIPPO_ALLOW_INSECURE_TRUST_ROOT";F.LEASE_SIGNING_KEYS_ENV="AGENTHIPPO_LEASE_SIGNING_KEYS";F.LEASE_JWKS_URL_ENV="AGENTHIPPO_LEASE_JWKS_URL";F.LEASE_JWKS_PINS_ENV="AGENTHIPPO_LEASE_JWKS_PINS";function Hy(t){let e=Uo.createPublicKey(t),n=e.export({format:"jwk"}),r=n.kty==="EC"?{crv:n.crv,kty:n.kty,x:n.x,y:n.y}:n.kty==="RSA"?{e:n.e,kty:n.kty,n:n.n}:{kty:n.kty};return{jwk:Uo.createHash("sha256").update(JSON.stringify(r)).digest("base64url"),spki:Uo.createHash("sha256").update(e.export({type:"spki",format:"der"})).digest("hex")}}var f0=t=>t.trim().replace(/^sha256:/i,"").toLowerCase();function jy(t){return(t??"").split(",").map(f0).filter(e=>e.length>0)}function xy(t,e,n=process.env){let r;try{r=new URL(t)}catch{return{ok:!1,reason:`${e} is not a valid URL: ${t}`}}if(r.protocol==="https:")return{ok:!0,warnings:[]};let s=(n[F.ALLOW_INSECURE_TRUST_ROOT_ENV]??"").trim().toLowerCase();return s==="1"||s==="true"||s==="yes"?{ok:!0,warnings:[`INSECURE: ${e} is ${r.protocol}//${r.host} (not https) and ${F.ALLOW_INSECURE_TRUST_ROOT_ENV} is set. Anyone on the path between this instance and that host can choose which packs it will run and whether the kill switch is honoured. This must never be set outside local development.`]}:{ok:!1,reason:`${e} must be https (got ${r.protocol}//${r.host}). Set ${F.ALLOW_INSECURE_TRUST_ROOT_ENV}=1 to allow plaintext for LOCAL DEVELOPMENT ONLY.`}}var p0={label:"pack",purpose:"pack-signing",inlineEnv:"AGENTHIPPO_PACK_SIGNING_KEYS",urlEnvs:[F.PACK_JWKS_URL_ENV,F.PACK_JWKS_URL_ENV_LEGACY],pinsEnv:F.PACK_JWKS_PINS_ENV,derivedRisk:"chooses which packs this instance will run"},g0={label:"lease",purpose:"lease-signing",inlineEnv:F.LEASE_SIGNING_KEYS_ENV,urlEnvs:[F.LEASE_JWKS_URL_ENV],pinsEnv:F.LEASE_JWKS_PINS_ENV,derivedRisk:"chooses whether this instance's kill switch is ever honoured"};async function By(t,e){let n=e.env??process.env,r=[],s=jy(n[t.pinsEnv]),i=n[t.inlineEnv]?.trim(),o=t.urlEnvs.map(f=>n[f]).find(f=>f!==void 0&&f.trim()!=="")?.trim(),a=!!i||!!o,c=(f,p,g)=>{if(s.length===0)return Object.keys(f).length===0?{status:"unavailable",keys:{},source:p,url:g,warnings:r,explicitlyConfigured:a,reason:"the trust root published no usable ES256 keys"}:{status:"configured",keys:f,source:p,url:g,warnings:r,explicitlyConfigured:a};let _={};for(let[h,y]of Object.entries(f)){let E;try{E=Hy(y)}catch{r.push(`${t.label} trust root: key ${h} is unreadable and was dropped`);continue}s.some(A=>(0,Ma.timingSafeEqualString)(A,E.jwk.toLowerCase())||(0,Ma.timingSafeEqualString)(A,E.spki))?_[h]=y:r.push(`${t.label} trust root: key ${h} does not match any pin in ${t.pinsEnv} and was REFUSED (its thumbprints are jwk=${E.jwk} spki=${E.spki})`)}return Object.keys(_).length===0?{status:"unavailable",keys:{},source:p,url:g,warnings:r,explicitlyConfigured:a,reason:`every key offered by the trust root failed the ${t.pinsEnv} pin check`}:{status:"configured",keys:_,source:p,url:g,warnings:r,explicitlyConfigured:a}};if(i){let f;try{f=JSON.parse(i)}catch(p){return{status:"unavailable",keys:{},source:"inline",warnings:r,explicitlyConfigured:a,reason:`${t.inlineEnv} is set but is not valid JSON: ${p instanceof Error?p.message:String(p)}`}}return c(f,"inline")}let l=o,u=!1;if(!l&&e.leaseUrl){try{l=new URL(`/.well-known/jwks.json?purpose=${t.purpose}`,e.leaseUrl).toString()}catch{return{status:"unavailable",keys:{},warnings:r,explicitlyConfigured:a,reason:`AGENTHIPPO_LEASE_URL is not a valid URL: ${e.leaseUrl}`}}u=!0}if(!l)return{status:"unconfigured",keys:{},warnings:r,explicitlyConfigured:a};let d=xy(l,`the ${t.purpose} JWKS URL`,n);if(!d.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:d.reason,derivedFromLease:u,explicitlyConfigured:a};r.push(...d.warnings),u&&s.length===0&&r.push(`${t.label} trust root is derived from AGENTHIPPO_LEASE_URL (${l}) and is not pinned. Whoever can answer that origin ${t.derivedRisk}. Pin it with ${t.urlEnvs[0]} and ${t.pinsEnv}.`);try{let f=await(e.fetchImpl??fetch)(l);if(!f.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:`JWKS fetch returned HTTP ${f.status}`,derivedFromLease:u,explicitlyConfigured:a};let p=await f.json(),g=E0(p);return g.ok?{...c(g.pems,"jwks",l),derivedFromLease:u}:{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:g.reason,derivedFromLease:u,explicitlyConfigured:a}}catch(f){return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,derivedFromLease:u,explicitlyConfigured:a,reason:`JWKS fetch failed: ${f instanceof Error?f.message:String(f)}`}}}async function Fy(t){return By(p0,t)}async function h0(t){return By(g0,t)}function m0(t,e){return t.explicitlyConfigured?{keys:t.keys,packFallback:!1}:{keys:{...e.keys,...t.keys},packFallback:!0}}function _0(t,e){let n=[];if(!t.explicitlyConfigured)return{warnings:n};if(t.url){let s=null;try{s=new URL(t.url).searchParams.get("purpose")}catch{}if(s!==null&&s!=="lease-signing")return{warnings:n,fatal:`${F.LEASE_JWKS_URL_ENV} points at a '${s}' document (${t.url}). A plane that separates keys by purpose never serves a lease-signing key there, so signed-lease verification breaks at the next lease-key rotation \u2014 and requireSignedLease is sticky with no plane-side undo. Point it at ?purpose=lease-signing (with its own ${F.LEASE_JWKS_PINS_ENV}) instead.`};s===null&&e.url===t.url&&n.push(`the lease trust root and the pack trust root are the SAME document (${t.url}). An older plane that returns every key it holds supports this; a plane that separates keys by purpose does not, and the break lands at the next lease-key rotation, after requireSignedLease has latched. Give the lease root its own URL: ?purpose=lease-signing.`)}let r=Object.keys(t.keys).filter(s=>e.keys[s]!==void 0&&e.keys[s].trim()===t.keys[s].trim());return r.length>0&&n.push(`kid(s) ${r.map(s=>`'${s}'`).join(", ")} carry the same public key in BOTH the lease and the pack trust root \u2014 one key under two purposes. The control plane refuses to register such a key, so whichever purpose rotates first strands the other; give each purpose its own keypair.`),{warnings:n}}function E0(t){if(t.pemsByKid&&typeof t.pemsByKid=="object")return{ok:!0,pems:t.pemsByKid};if(!Array.isArray(t.keys))return{ok:!1,reason:"JWKS document has neither `pemsByKid` nor a `keys` array"};let e={};for(let n of t.keys)if(!(!n||typeof n!="object")&&!(n.kty!=="EC"||n.crv!=="P-256")&&!(n.alg!==void 0&&n.alg!=="ES256")&&!(typeof n.kid!="string"||!n.kid))try{e[n.kid]=Uo.createPublicKey({key:n,format:"jwk"}).export({type:"spki",format:"pem"}).toString()}catch{}return Object.keys(e).length===0?{ok:!1,reason:"JWKS document published no usable ES256 (P-256) keys"}:{ok:!0,pems:e}}async function y0(t){return(await Fy(t)).keys}F.PACK_PROBE_INTERVAL_MS=1e3;F.PACK_FULL_REVERIFY_INTERVAL_MS=3e4;function w0(t={}){let e=t.probeIntervalMs??F.PACK_PROBE_INTERVAL_MS,n=t.fullReverifyIntervalMs??F.PACK_FULL_REVERIFY_INTERVAL_MS,r,s="",i="",o=0,a=0,c=0,l=d=>`${d.packDir}\0${d.pack}\0${d.packVersion}\0${Object.keys(d.keys).sort().join(",")}`,u=(d,f)=>{c+=1,s=l(d),i=np(d.packDir),o=f,a=f;let p=Ly(d.packDir);return r=p?My(p,d.keys,{packDir:d.packDir,pack:d.pack,packVersion:d.packVersion}):{ok:!1,kind:"unsigned",reason:`${d.pack} is not signed (no ${F.PACK_SIGNATURE_FILE} at the pack root)`},r};return{fullVerifications:()=>c,refresh(d,f=Date.now()){return u(d,f)},verify(d,f=Date.now()){return!r||s!==l(d)||f-a>=n?u(d,f):f-o<e||(o=f,np(d.packDir)===i)?r:u(d,f)}}}});var jo=T(ce=>{"use strict";Object.defineProperty(ce,"__esModule",{value:!0});ce.MAX_LEASE_ENVELOPE_TTL_SECONDS=ce.LEASE_JWS_TYP=ce.LeaseDeniedError=ce.LEASE_MAX_STALENESS_ENV=ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS=ce.MIN_LEASE_POLL_SECONDS=ce.DEFAULT_LEASE_POLL_SECONDS=void 0;ce.resolveLeasePollSeconds=ip;ce.leaseCacheSecondsFor=op;ce.effectiveKillLatencySeconds=T0;ce.leaseMaxStalenessFromEnv=qy;ce.resolveAllowServiceTurns=b0;ce.describeServiceTurnGate=v0;ce.denyVerdict=Yy;ce.resolveFollowedUsers=I0;ce.leaseIsDead=P0;ce.policyVersion=N0;ce.assertAdmitted=R0;ce.signLease=C0;ce.verifySignedLease=Xy;ce.requireSignedLease=zy;ce.leaseUrlDeployment=Qy;ce.createLeaseSource=$0;var S0=require("crypto"),Ky=si(),Wy=La(),A0=Ho();ce.DEFAULT_LEASE_POLL_SECONDS=30;ce.MIN_LEASE_POLL_SECONDS=5;function ip(t){let e=typeof t=="number"&&Number.isFinite(t)?t:ce.DEFAULT_LEASE_POLL_SECONDS;return Math.max(ce.MIN_LEASE_POLL_SECONDS,Math.floor(e))}function op(t){return ip(t)}function T0(t){let e=ip(t);return e+op(e)}ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS=1440*60;ce.LEASE_MAX_STALENESS_ENV="AGENTHIPPO_LEASE_MAX_STALENESS_SECONDS";function qy(t=process.env){let e=t[ce.LEASE_MAX_STALENESS_ENV]?.trim();if(e===void 0||e==="")return ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<0?ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS:Math.floor(n)}function b0(t){return t.managed?t.lease===!0?{allowed:!0,gate:"lease_allows"}:{allowed:!1,gate:t.lease===!1?"lease_denies":"lease_absent_field"}:{allowed:!0,gate:"unmanaged_no_lease"}}function v0(t){switch(t){case"lease_allows":return"permitted by the control plane (lease.allowServiceTurns)";case"unmanaged_no_lease":return"permitted: no control plane configured, so AGENTHIPPO_SERVICE_USER is the only gate";case"lease_denies":return"refused: the control plane set lease.allowServiceTurns=false";case"lease_absent_field":return"refused: this is a managed deployment and the lease does not set allowServiceTurns (absent means deny \u2014 enable it in the console)"}}function Yy(t,e,n){if(!t?.deny?.length)return{denied:!1};let r=n??Math.floor(Date.now()/1e3),s=e.sessionKey.indexOf("--"),i=s>=0?e.sessionKey.slice(s+2):e.sessionKey,o={denied:!1};for(let a of t.deny){if(a.until!==void 0&&a.until<=r)continue;let c=!1;if(a.scope==="pack"?c=a.match===e.pack:a.scope==="session"?(c=a.match===e.sessionKey||a.match===i,c&&a.user!==void 0&&e.userId!==void 0&&a.user!==e.userId&&(c=!1),!c&&a.followUser!==!1&&e.userId!==void 0&&O0(a,e.userId,e.followedUsers)&&(c=!0)):a.scope==="user"&&(c=e.userId!==void 0&&a.match===e.userId||e.userHash!==void 0&&e.sessionKey.startsWith(`u${e.userHash(a.match)}--`)),!c)continue;let l=`${a.mode==="kill"?"stopped":"draining"} by the control plane${a.reason?`: ${a.reason}`:""}`;if(a.mode==="kill")return{denied:!0,mode:"kill",reason:l};o.denied||(o={denied:!0,mode:"drain",reason:l})}return o}var Jy=t=>`${t.scope}:${t.match}`;function O0(t,e,n){return n?.get(Jy(t))?.has(e)??!1}function I0(t,e,n){let r=new Map;if(!t?.deny?.length)return r;let s=n??Math.floor(Date.now()/1e3);for(let i of t.deny){if(i.scope!=="session"||i.followUser===!1||i.until!==void 0&&i.until<=s)continue;let o=new Set;for(let[a,c]of e){let l=a.indexOf("--"),u=l>=0?a.slice(l+2):a;i.match!==a&&i.match!==u||i.user!==void 0&&i.user!==c||o.add(c)}o.size>0&&r.set(Jy(i),o)}return r}function P0(t,e){if(!t)return{dead:!1};let n=e??Math.floor(Date.now()/1e3);return t.enabled?t.expiresAt<=n?{dead:!0,reason:`lease expired at ${new Date(t.expiresAt*1e3).toISOString()}`}:{dead:!1}:{dead:!0,reason:`kill switch active${t.reason?`: ${t.reason}`:""}`}}function N0(t){if(!t)return;let{expiresAt:e,issuedAt:n,...r}=t,s=i=>Array.isArray(i)?i.map(s):i&&typeof i=="object"?Object.fromEntries(Object.keys(i).sort().map(o=>[o,s(i[o])])):i;return(0,S0.createHash)("sha256").update(JSON.stringify(s(r))).digest("hex")}var Rs=class extends Error{constructor(e){super(e),this.name="LeaseDeniedError"}};ce.LeaseDeniedError=Rs;function R0(t,e){if(!t)return;let n=e.nowSeconds??Math.floor(Date.now()/1e3);if(!t.enabled)throw new Rs(`kill switch active for pack ${e.pack}${t.reason?`: ${t.reason}`:""}`);if(t.pack!==e.pack)throw new Rs(`lease is for pack ${t.pack}, not ${e.pack}`);if(t.expiresAt<=n)throw new Rs(`lease for ${e.pack} expired at ${new Date(t.expiresAt*1e3).toISOString()}`);if(t.version&&t.version!==e.version)throw new Rs(`pack ${e.pack} is pinned to ${t.version}; refusing to start ${e.version} (rollback in force)`);if(t.imageDigest&&e.image&&!e.image.includes(t.imageDigest))throw new Rs(`image for ${e.pack} does not match the leased digest ${t.imageDigest}`);if(e.sessionKey){let r=Yy(t,{sessionKey:e.sessionKey,pack:e.pack,userHash:e.userHash,userId:e.userId,followedUsers:e.followedUsers},n);if(r.denied)throw new Rs(r.reason??"stopped by the control plane")}}ce.LEASE_JWS_TYP="agenthippo-lease+jws";ce.MAX_LEASE_ENVELOPE_TTL_SECONDS=3600;function C0(t,e,n){let r=n.nowSeconds??Math.floor(Date.now()/1e3),s=Math.min(n.ttlSeconds??300,ce.MAX_LEASE_ENVELOPE_TTL_SECONDS),i={lease:t,aud:n.instanceId??"*",sub:t.pack,iat:r,exp:r+s,...n.iss?{iss:n.iss}:{}};return(0,Ky.signCompactJws)({typ:ce.LEASE_JWS_TYP,kid:e.kid},i,e.privateKeyPem)}function Xy(t,e,n={}){if(Object.keys(e).length===0)return{ok:!1,reason:"no trusted lease-signing keys are configured on this instance"};let r=(0,Ky.verifyCompactJws)(t,e,{typ:ce.LEASE_JWS_TYP});if(!r.ok)return{ok:!1,reason:`lease signature: ${r.reason}`};let s=r.payload,i=n.nowSeconds??Math.floor(Date.now()/1e3),o=n.clockSkewSeconds??60;if(typeof s.iat!="number"||!Number.isFinite(s.iat))return{ok:!1,reason:"lease envelope has no issued-at"};if(typeof s.exp!="number"||!Number.isFinite(s.exp))return{ok:!1,reason:"lease envelope has no expiry"};if(s.exp-s.iat>ce.MAX_LEASE_ENVELOPE_TTL_SECONDS)return{ok:!1,reason:`lease envelope lifetime ${s.exp-s.iat}s exceeds the ${ce.MAX_LEASE_ENVELOPE_TTL_SECONDS}s cap`};if(s.exp+o<=i)return{ok:!1,reason:`lease envelope expired at ${new Date(s.exp*1e3).toISOString()}`};if(s.iat-o>i)return{ok:!1,reason:"lease envelope is issued in the future"};if(n.minIat!==void 0&&s.iat<n.minIat)return{ok:!1,reason:`lease envelope is older than one already accepted (replay/rollback: iat ${s.iat} < ${n.minIat})`};if(n.instanceId!==void 0&&s.aud!=="*"&&s.aud!==n.instanceId)return{ok:!1,reason:`lease envelope is for instance ${s.aud}, not ${n.instanceId}`};let a=(0,Wy.parseLease)(s.lease);return a.ok?s.sub!==a.lease.pack?{ok:!1,reason:`lease envelope subject ${s.sub} does not match lease.pack ${a.lease.pack}`}:{ok:!0,lease:a.lease,claims:s}:{ok:!1,reason:`signed lease is malformed: ${a.reason}`}}function zy(t,e){return!!t||!!e}var Vy=t=>/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(t),k0=2e4;function Qy(t){if(t)try{let e=/\/lease\/([^/]+)\.json$/.exec(new URL(t).pathname);return e?decodeURIComponent(e[1]):void 0}catch{return}}function $0(t){let e=t.staticLease,n=0,r,s,i=!1,o=!1,a,c=Qy(t.url),l=!1,u,d=!1,f=!1,p=!1,g=!1,_=t.cacheSeconds??op(ce.DEFAULT_LEASE_POLL_SECONDS),h=t.maxStalenessSeconds??qy(t.env),y=t.fetchImpl??fetch,E=()=>zy(l,t.requireSignedLease),w=P=>({...e??{pack:"",expiresAt:0},enabled:!1,reason:`the control plane has not been reachable for ${P}s, past the ${h}s staleness ceiling (${ce.LEASE_MAX_STALENESS_ENV}). Refusing work rather than running on a lease that can no longer be revoked. Set ${ce.LEASE_MAX_STALENESS_ENV}=0 to accept unbounded staleness.`}),A=()=>({pack:"",expiresAt:0,enabled:!1,reason:`this instance is managed (${t.url}) but has never successfully fetched its lease`+(s?` (${s})`:"")+". Refusing work until the control plane is reachable rather than booting ungoverned. For an air-gapped deployment, provide the lease with --static-lease."}),S=!1,C=P=>{if(S=!0,!t.persistence)return;let L;try{L=t.persistence.load()}catch(O){t.logger?.warn(`[Lease] persisted lease unreadable: ${O instanceof Error?O.message:String(O)}`);return}if(!L||typeof L.body!="string")return;typeof L.lastGoodAt=="number"&&Number.isFinite(L.lastGoodAt)&&(r=Math.min(L.lastGoodAt,P));let N=I(L.body,P);if(!N.ok){t.logger?.warn(`[Lease] persisted lease not reinstalled: ${N.reason}`);return}N.signed&&(i=!0,N.lease.requireSignedLease&&(l=!0)),e=N.lease,o=N.signed,a=void 0},v=P=>P.deployment!==void 0&&c!==void 0&&P.deployment!==c?`lease is for deployment ${P.deployment}, not ${c} (${t.url})`:void 0,I=(P,L)=>{let N=P.trim(),O,G;if(Vy(N))O=N;else{try{G=JSON.parse(N)}catch(J){return{ok:!1,reason:`lease body is not JSON: ${J instanceof Error?J.message:String(J)}`}}typeof G=="string"&&Vy(G.trim())?O=G.trim():G&&typeof G=="object"&&typeof G.lease=="string"&&(O=G.lease.trim())}if(O){let J=Xy(O,t.signingKeys?.()??{},{instanceId:t.instanceId,minIat:u,nowSeconds:L});if(!J.ok)return{ok:!1,reason:J.reason};let W=v(J.lease);return W?{ok:!1,reason:W}:(u=J.claims.iat,{ok:!0,lease:J.lease,signed:!0})}if(E())return{ok:!1,reason:'a signed lease is required but the control plane returned an unsigned one (expected a compact JWS body or {"lease":"<jws>"})'};let H=(0,Wy.parseLease)(G);if(!H.ok)return{ok:!1,reason:H.reason};for(let J of H.warnings)t.logger?.warn(`[Lease] ${J}`);let X=v(H.lease);return X?{ok:!1,reason:X}:{ok:!0,lease:H.lease,signed:!1}};return{status(P){let L=P??Math.floor(Date.now()/1e3),N=r===void 0?void 0:L-r,O=!!t.url&&e===void 0&&s!==void 0;return{signed:i,currentSigned:o,clockOffsetSeconds:a,requireSignedLease:E(),lastGoodAt:r,stalenessSeconds:N,maxStalenessSeconds:h,failClosed:O||h>0&&N!==void 0&&N>h,lastError:s}},async get(P){let L=P??Math.floor(Date.now()/1e3);if(!t.url)return e;if(!g){g=!0;let N=(0,A0.assertSecureTrustUrl)(t.url,"AGENTHIPPO_LEASE_URL",t.env??process.env);if(N.ok)for(let O of N.warnings)t.logger?.warn(`[Lease] ${O}`);else E()?t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${N.reason} Signed leases are required here, so the policy itself is still verified \u2014 but the channel is not: anyone on the path can read this instance's identity, pack and version, and can delay a kill switch by up to ${ce.MAX_LEASE_ENVELOPE_TTL_SECONDS}s by replaying the last envelope. requireSignedLease is not a substitute for https; serve the lease over https.`):t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${N.reason} Anyone on the path can lift this instance's kill switch, widen its caps or change its version pin. Continuing to poll (refusing would disable the kill switch entirely), but this deployment is not governable until the lease is signed: set requireSignedLease and have the control plane sign leases.`)}if(e===void 0&&!S&&C(L),e&&L-n<_)return e;try{let N={accept:"application/json, text/plain"};for(let[X,J]of Object.entries(t.identity?.()??{}))J!==void 0&&J!==""&&(N[`x-agenthippo-${X}`]=String(J));let O=await y(t.url,{headers:N,signal:AbortSignal.timeout(k0)});if(!O.ok)throw new Error(O.status===404?`lease fetch 404 \u2014 the control plane has no deployment at ${t.url}; check AGENTHIPPO_LEASE_URL`:`lease fetch ${O.status}`);let G=typeof O.text=="function"?await O.text():JSON.stringify(await O.json()),H=I(G,L);if(!H.ok)throw new Error(H.reason);H.signed?(i=!0,H.lease.requireSignedLease&&(l=!0)):p||(p=!0,t.logger?.warn(`[Lease] running on an UNSIGNED lease. Anyone who can answer or intercept ${t.url} can lift this instance's kill switch, widen its caps and change its version pin. Have the control plane sign leases (ES256 compact JWS) and set requireSignedLease.`)),e=H.lease,o=H.signed,a=H.signed&&H.lease.issuedAt!==void 0?H.lease.issuedAt-(P??Math.ceil(Date.now()/1e3)):void 0,n=L,r=L,s=void 0,d=!1,f=!1;try{t.persistence?.save({body:G,lastGoodAt:L})}catch(X){t.logger?.warn(`[Lease] could not persist lease: ${X instanceof Error?X.message:String(X)}`)}return e}catch(N){if(s=N instanceof Error?N.message:String(N),e===void 0)return f||(f=!0,t.logger?.warn(`[Lease] NO LEASE HAS EVER BEEN INSTALLED \u2014 fetch failed (${s}) and there is no persisted or static lease to fall back on. Failing closed: turns are refused until the control plane is reachable. For air-gapped use, provide --static-lease.`)),A();t.logger?.warn(`[Lease] fetch failed, using cached lease: ${s}`),r===void 0&&(r=L);let O=L-r;return h>0&&O>h?(d||(d=!0,t.logger?.warn(`[Lease] STALENESS CEILING PASSED \u2014 no successful lease refresh for ${O}s (ceiling ${h}s). Failing closed: turns are refused until the control plane is reachable.`)),w(O)):e}}}}});var tw=T(Cs=>{"use strict";var D0=Cs&&Cs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),L0=Cs&&Cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),M0=Cs&&Cs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&D0(n,e,r[s]);return L0(n,e),n}})();Object.defineProperty(Cs,"__esModule",{value:!0});Cs.startGrantGovernance=j0;var G0=M0(require("os")),Zy=jo(),ew=Ho(),U0=5*6e4,H0=6*36e5;async function j0(t){let e=Math.max(15,t.pollSeconds??60),n=t.env??process.env,r=await(0,ew.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}),s,i=`connector-${G0.hostname()}`,o=new Map,a=(0,Zy.createLeaseSource)({url:t.leaseUrl,fetchImpl:t.fetchImpl,env:n,instanceId:i,cacheSeconds:e-1,signingKeys:()=>r.keys,identity:()=>({instance:i,role:"connector",...s?{grants:JSON.stringify(s)}:{},...t.enrollToken?{"enroll-token":t.enrollToken}:{}}),logger:t.logger}),c=(0,Zy.leaseUrlDeployment)(t.leaseUrl),l=async()=>{let f;try{f=await t.provider.listGrants(),s=await t.provider.summary(f)}catch(S){t.logger?.warn(`[grants] could not count grants: ${S instanceof Error?S.message:S}`)}r.status!=="configured"&&(r=await(0,ew.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}));let p=await a.get(),g=p?.grants?.revoke??[],_=new Set(g.map(S=>S.user));for(let S of o.keys())_.has(S)||o.delete(S);if(!g.length)return;if(!a.status().currentSigned){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s) on an UNSIGNED lease \u2014 only a signed lease may revoke a user's grants`);return}if(!c||p?.deployment!==c){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s): the lease does not name deployment ${c??`(none in ${t.leaseUrl})`}`);return}let h=a.status().clockOffsetSeconds;if(h===void 0){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s) until a live lease poll measures the plane's clock`);return}let y=Date.now(),E=g.filter(S=>(o.get(S.user)?.at??0)<=y),w=new Set,A=E.map(S=>({...S,requestedAt:S.requestedAt-h}));await t.provider.applyRevocations(A,f,S=>{let C=S.result.ok?"grant_revoked_by_plane":"grant_revoke_failed";t.audit?.("control",C,{user_sha256:S.user,service:S.service,failed:S.result.failed}),t.logger?.info(`[grants] ${C}: ${S.service} for user sha256:${S.user.slice(0,12)}\u2026`),S.result.ok||w.add(S.user)});for(let S of E)if(w.has(S.user)){let C=Math.min((o.get(S.user)?.delayMs??U0/2)*2,H0);o.set(S.user,{at:y+C,delayMs:C})}else o.delete(S.user)};await l().catch(f=>t.logger?.warn(`[grants] first poll failed: ${f instanceof Error?f.message:f}`));let u,d=setInterval(()=>{u||(u=l().catch(f=>t.logger?.warn(`[grants] poll failed: ${f instanceof Error?f.message:f}`)).finally(()=>{u=void 0}))},e*1e3);return d.unref(),{tick:l,stop:()=>clearInterval(d)}}});var ap=T(Ql=>{"use strict";Object.defineProperty(Ql,"__esModule",{value:!0});Ql.createDataPlaneAuditSink=aw;Ql.dataPlaneSidecarCommand=K0;var nw=require("fs"),x0=ji(),rw=Vi(),B0=tw(),sw=ur(),ow=vo(),F0=So(),V0=Ii(),iw=Ui(),oi=en();async function aw(t,e){let{dir:n,ephemeral:r}=(0,sw.resolveStateDir)(t),s=(0,sw.resolveAnalyticsSessionsDir)(n,r),i=!0,o;try{await nw.promises.mkdir(s,{recursive:!0}),await nw.promises.access(s)}catch(l){i=!1,o=l instanceof Error?l.message:String(l)}let a=new ow.SessionEventWriter(s);return{audit:(l,u,d)=>{let f=typeof d.userId=="string"?d.userId:void 0,p=(0,F0.hashIdentity)(f),g=p?{...d,userId:p}:d,_=p&&l===f?p:l;a.append(_,(0,V0.generateRequestId)(),u,e?{...g,agent:{...e,digest:null}}:g)},auditDir:s,ephemeral:r,ok:i,error:o}}async function K0(t){let e=process.env.AGENTHIPPO_DATA_PLANE_TOKEN?.trim();e||(console.error("Error: AGENTHIPPO_DATA_PLANE_TOKEN is required (shared secret the trusted EDGE \u2014 or, legacy, the agent's serve \u2014 presents to register turns)."),process.exit(1));let n;try{n=await(0,x0.loadAgentPack)(t.agent,t.workspace)}catch(g){console.error(`Error: ${g instanceof Error?g.message:g}`),process.exit(1);return}let r=(0,rw.resolveDataPlaneConfig)(n.manifest.spec,n.packPath);if(!r){console.error("Error: pack declares no spec.dataPlane \u2014 nothing for the sidecar to run."),process.exit(1);return}let s=t.verbose?new iw.ConsoleLogger("[Sidecar]"):new iw.NoOpLogger,{audit:i,auditDir:o,ephemeral:a,ok:c,error:l}=await aw(t.stateDir,{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"});if(!c){let g=`${o}: ${l}`;if((0,ow.evidenceRequired)()){console.error(`${oi.COLORS.red}Error: data-plane audit directory is not writable${oi.COLORS.reset} \u2014 ${g}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1);return}console.warn(`${oi.COLORS.yellow}Warning:${oi.COLORS.reset} data-plane audit directory is not writable \u2014 ${g}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set --state-dir or AGENTHIPPO_HOME to a writable path.")}let u;try{u=await(0,rw.startDataPlaneSidecar)({config:r,registerToken:e,gatewayPort:t.gatewayPort,controlPort:t.controlPort,connectPort:t.connectPort,bindHost:t.host??"0.0.0.0",logger:s,audit:i,agent:{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"}})}catch(g){console.error(`${oi.COLORS.red}Error: failed to start the data-plane sidecar:${oi.COLORS.reset} ${g instanceof Error?g.message:g}`),process.exit(1);return}console.log(`OK: Data-plane sidecar (provider=${r.provider??"passthrough"}) \u2014 connector: ${r.connectorPath}`),console.log(` gateway (engine dials, nonce-auth): ${u.gatewayUrl}`),console.log(` control (edge/serve registers, bearer): :${u.controlPort}`),u.connectPort!==void 0&&console.log(` connect (users link accounts, via edge): :${u.connectPort}`),console.log(` audit (tool_authorize / tool_deny / register events): ${o}${a?" (EPHEMERAL \u2014 lost on restart; set AGENTHIPPO_HOME or --state-dir)":""}`),console.log(" Base credentials live here only \u2014 never in the agent container."),console.log(" Edge mode (P1): give the register token to the IdP edge only; serve runs with AGENTHIPPO_DATA_PLANE_EDGE=1 and no token.");let d,f=()=>{d?.stop(),u.close().finally(()=>process.exit(0))};process.on("SIGINT",f),process.on("SIGTERM",f);let p=process.env.AGENTHIPPO_LEASE_URL?.trim();d=u.grants&&p?await(0,B0.startGrantGovernance)({provider:u.grants,leaseUrl:p,enrollToken:process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()||void 0,logger:{info:g=>console.log(g),warn:g=>console.warn(`${oi.COLORS.yellow}Warning:${oi.COLORS.reset} ${g}`)},audit:i}):void 0,d&&console.log(` grants governance: counts reported and revocations applied on the lease poll (${p})`),await new Promise(()=>{})}});var lp=T(cp=>{"use strict";Object.defineProperty(cp,"__esModule",{value:!0});cp.resolveCliTurnScope=J0;var W0=Ry(),q0=ap(),cw=Vi(),Y0=vo(),lw=Ic(),ai=en();async function J0(t){let e=t.pack?.manifest.spec,n=t.pack?.packPath,r=!!((0,cw.resolveRemoteDataPlane)()||e&&n&&(0,cw.resolveDataPlaneConfig)(e,n)),s;if(r){let o=t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version??"0.0.0"}:void 0,a=await(0,q0.createDataPlaneAuditSink)(void 0,o);if(s=a.audit,!a.ok){let c=`${a.auditDir}: ${a.error}`;(0,Y0.evidenceRequired)()&&(console.error(`${ai.COLORS.red}Error: data-plane audit directory is not writable${ai.COLORS.reset} \u2014 ${c}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1)),console.warn(`${ai.COLORS.yellow}Warning:${ai.COLORS.reset} data-plane audit directory is not writable \u2014 ${c}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set AGENTHIPPO_HOME to a writable path.")}}let i;try{i=await(0,W0.resolveLocalTurnScope)({spec:e,packPath:n,agent:t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version}:void 0,logger:t.verbose?new lw.ConsoleLogger("[DataPlane]"):new lw.NoOpLogger,audit:s})}catch(o){console.error(`${ai.COLORS.red}Error: failed to start the data plane:${ai.COLORS.reset} ${o instanceof Error?o.message:o}`),process.exit(1)}return i&&!t.quiet&&console.log(`${ai.COLORS.green}OK:${ai.COLORS.reset} Data plane ${i.mode==="sidecar"?"SIDECAR":"(in-process)"} \u2014 gateway ${i.gatewayUrl}; acting as ${i.userId} (locally asserted; per-turn registration, session-stable nonce bytes)`),i}});var fw=T(ks=>{"use strict";var X0=ks&&ks.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),z0=ks&&ks.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),dp=ks&&ks.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&X0(n,e,r[s]);return z0(n,e),n}})();Object.defineProperty(ks,"__esModule",{value:!0});ks.chatCommand=sL;var Q0=dp(require("readline")),Z0=dp(require("path")),eL=dp(require("os")),Mr=Ui(),Ki=ji(),Ee=en(),tL=xi(),uw=ot(),nL=Cr(),dw=Qs(),rL=lp(),up="-".repeat(62);async function sL(t){let e=(0,Ki.getApiConfig)(),n,r="default",s,i,o,a,c=t.verbose?new Mr.ConsoleLogger("[Sync]"):new Mr.NoOpLogger;if(t.agent)try{n=await(0,Ki.loadAgentPack)(t.agent,t.workspace),r=n.manifest.metadata.name,s=t.engine||n.manifest.spec.engine;let I=["claude","codex"].includes(s)?void 0:(0,dw.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,P=t.model||n.manifest.spec.model||I||(0,Ki.getEnvDefaultModel)()||(0,Ki.getDefaultConfig)().model;i=(0,Mr.resolveModelAlias)(P);let L=n.manifest.spec.cheapModel?.trim();o=L?(0,Mr.resolveModelAlias)(L):void 0,a=n.manifest.spec.effort?.trim()||void 0,await(0,Mr.syncPackToWorkspace)(t.workspace,n.packPath,r,s,c,(0,Ee.findBundledBasePromptsDir)()),console.log(`${Ee.COLORS.green}OK:${Ee.COLORS.reset} Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),P!==i&&console.log(`${Ee.COLORS.dim} Model: ${P} -> ${i}${Ee.COLORS.reset}`),L&&L!==o&&console.log(`${Ee.COLORS.dim} Cheap model: ${L} -> ${o}${Ee.COLORS.reset}`)}catch(v){console.error(`${Ee.COLORS.red}Error: ${v instanceof Error?v.message:v}${Ee.COLORS.reset}`),process.exit(1)}else{let v=(0,Ki.getDefaultConfig)();s=t.engine||v.engine;let I=["claude","codex"].includes(s)?void 0:(0,dw.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,P=t.model||I||(0,Ki.getEnvDefaultModel)()||v.model;i=(0,Mr.resolveModelAlias)(P),P!==i&&console.log(`${Ee.COLORS.dim}Model: ${P} -> ${i}${Ee.COLORS.reset}`)}if(!e.apiKey&&(s==="claude"||s==="codex")){let v=(0,Ee.getLiteLLMQuickstartHintLines)();console.log(["To start a chat, set an API key and re-run the command. Example:",` ${v[1]}`,"","Other options:"," AGENTHIPPO_LITELLM_API_KEY=your_key AGENTHIPPO_LITELLM_BASE_URL=https://... dist/agenthippo chat"," LITELLM_API_KEY=your_key LITELLM_BASE_URL=https://... dist/agenthippo chat"," ANTHROPIC_API_KEY=your_key dist/agenthippo chat"," OPENAI_API_KEY=your_key dist/agenthippo chat"].join(`
505
- `)),process.exit(1)}let l=Z0.join(eL.tmpdir(),`${uw.AGENTIDE_CLI_NAME}-cli`),u=t.verbose?new Mr.ConsoleLogger("[Agent]"):new Mr.NoOpLogger,d=(0,Ee.findClaudeCodePath)(),f=(0,Ee.findCodexPath)(),p=(0,Ee.findBundledBasePromptsDir)();if(s==="claude"&&!d){console.error(`${Ee.COLORS.red}Error: Claude Code CLI not found.${Ee.COLORS.reset}`);let v=(0,tL.getUnsupportedClaudePlatformHint)();v&&console.error(` ${v}`),console.error(" Install it: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),console.error(" Or use --engine codex instead"),process.exit(1)}s==="codex"&&!f&&(console.error(`${Ee.COLORS.red}Error: Codex CLI not found.${Ee.COLORS.reset}`),console.error(" Install it: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),console.error(" Or use --engine claude instead"),process.exit(1));let g=new Mr.AutoApprovePermissionHandler,_={fileAccess:(0,Ki.getFileAccess)(n)},h=`cli-${Date.now()}`,y=await(0,rL.resolveCliTurnScope)({pack:n,verbose:t.verbose}),E=()=>(0,Mr.createHeadlessRunner)({storagePath:l,packId:r,packVersion:n?.manifest.metadata.version,bundledPromptsDir:p,apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey,logger:u,freshState:!1,claudeCodeExecutablePath:d,codexExecutablePath:f,permissionHandler:g,cliEnvPatch:(0,nL.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:h,baseEnv:process.env}),dataPlane:y??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}}),w={runner:E(),sessionId:h,engine:s,model:i},A=()=>({async thinking(v){process.stdout.write(`${Ee.COLORS.gray}${v}${Ee.COLORS.reset}`)},async text(v){process.stdout.write(v)},async toolStart(v,I){console.log(`
506
- ${Ee.COLORS.blue}Tool: ${v}${Ee.COLORS.reset}`),I&&I.length<200&&t.verbose&&console.log(` ${Ee.COLORS.gray}${I}${Ee.COLORS.reset}`)},async toolEnd(v,I,P,L){console.log(L?` ${Ee.COLORS.red}Error: ${P?.slice(0,100)}${Ee.COLORS.reset}`:` ${Ee.COLORS.green}OK${Ee.COLORS.reset}`)},async progress(v){t.verbose&&console.log(`${Ee.COLORS.yellow}Progress: ${v}${Ee.COLORS.reset}`)},async error(v){console.error(`${Ee.COLORS.red}Error: ${v}${Ee.COLORS.reset}`)},async question(v){return{selected:[],freeText:null,declined:!0}},async done(){console.log(`
507
- `)}});console.log(""),console.log(up),console.log(`${uw.AGENTIDE_BRAND_NAME} Chat`),console.log(up),console.log(`Engine: ${w.engine}`),console.log(`Model: ${w.model}`),o&&console.log(`Cheap: ${o}`),console.log(`Workspace: ${t.workspace}`),n&&console.log(`Agent: ${n.manifest.metadata.name}`),console.log(up),console.log("Type a message to chat. Commands: /help"),console.log("");let S=Q0.createInterface({input:process.stdin,output:process.stdout}),C=()=>{S.question(`${Ee.COLORS.cyan}> ${Ee.COLORS.reset}`,async v=>{let I=v.trim();if(!I){C();return}if(I.startsWith("/")){if(!await iL(I,w,S,{createRunner:E,claudeCodePath:d,codexPath:f,turnScope:y}))return;C();return}try{let P=await w.runner.run({engineId:w.engine,modelId:w.model,message:I,workspaceRoot:t.workspace,sessionId:w.sessionId,emitter:A(),permissions:_});!P.success&&P.error&&console.error(`
504
+ `)}F.PACK_JWKS_URL_ENV="AGENTHIPPO_PACK_JWKS_URL";F.PACK_JWKS_URL_ENV_LEGACY="AGENTHIPPO_PACK_SIGNING_JWKS_URL";F.PACK_JWKS_PINS_ENV="AGENTHIPPO_PACK_JWKS_PINS";F.ALLOW_INSECURE_TRUST_ROOT_ENV="AGENTHIPPO_ALLOW_INSECURE_TRUST_ROOT";F.LEASE_SIGNING_KEYS_ENV="AGENTHIPPO_LEASE_SIGNING_KEYS";F.LEASE_JWKS_URL_ENV="AGENTHIPPO_LEASE_JWKS_URL";F.LEASE_JWKS_PINS_ENV="AGENTHIPPO_LEASE_JWKS_PINS";function Hy(t){let e=Uo.createPublicKey(t),n=e.export({format:"jwk"}),r=n.kty==="EC"?{crv:n.crv,kty:n.kty,x:n.x,y:n.y}:n.kty==="RSA"?{e:n.e,kty:n.kty,n:n.n}:{kty:n.kty};return{jwk:Uo.createHash("sha256").update(JSON.stringify(r)).digest("base64url"),spki:Uo.createHash("sha256").update(e.export({type:"spki",format:"der"})).digest("hex")}}var f0=t=>t.trim().replace(/^sha256:/i,"").toLowerCase();function jy(t){return(t??"").split(",").map(f0).filter(e=>e.length>0)}function xy(t,e,n=process.env){let r;try{r=new URL(t)}catch{return{ok:!1,reason:`${e} is not a valid URL: ${t}`}}if(r.protocol==="https:")return{ok:!0,warnings:[]};let s=(n[F.ALLOW_INSECURE_TRUST_ROOT_ENV]??"").trim().toLowerCase();return s==="1"||s==="true"||s==="yes"?{ok:!0,warnings:[`INSECURE: ${e} is ${r.protocol}//${r.host} (not https) and ${F.ALLOW_INSECURE_TRUST_ROOT_ENV} is set. Anyone on the path between this instance and that host can choose which packs it will run and whether the kill switch is honoured. This must never be set outside local development.`]}:{ok:!1,reason:`${e} must be https (got ${r.protocol}//${r.host}). Set ${F.ALLOW_INSECURE_TRUST_ROOT_ENV}=1 to allow plaintext for LOCAL DEVELOPMENT ONLY.`}}var p0={label:"pack",purpose:"pack-signing",inlineEnv:"AGENTHIPPO_PACK_SIGNING_KEYS",urlEnvs:[F.PACK_JWKS_URL_ENV,F.PACK_JWKS_URL_ENV_LEGACY],pinsEnv:F.PACK_JWKS_PINS_ENV,derivedRisk:"chooses which packs this instance will run"},g0={label:"lease",purpose:"lease-signing",inlineEnv:F.LEASE_SIGNING_KEYS_ENV,urlEnvs:[F.LEASE_JWKS_URL_ENV],pinsEnv:F.LEASE_JWKS_PINS_ENV,derivedRisk:"chooses whether this instance's kill switch is ever honoured"};async function By(t,e){let n=e.env??process.env,r=[],s=jy(n[t.pinsEnv]),i=n[t.inlineEnv]?.trim(),o=t.urlEnvs.map(d=>n[d]).find(d=>d!==void 0&&d.trim()!=="")?.trim(),a=!!i||!!o,c=(d,g,p)=>{if(s.length===0)return Object.keys(d).length===0?{status:"unavailable",keys:{},source:g,url:p,warnings:r,explicitlyConfigured:a,reason:"the trust root published no usable ES256 keys"}:{status:"configured",keys:d,source:g,url:p,warnings:r,explicitlyConfigured:a};let _={};for(let[h,y]of Object.entries(d)){let E;try{E=Hy(y)}catch{r.push(`${t.label} trust root: key ${h} is unreadable and was dropped`);continue}s.some(A=>(0,Ma.timingSafeEqualString)(A,E.jwk.toLowerCase())||(0,Ma.timingSafeEqualString)(A,E.spki))?_[h]=y:r.push(`${t.label} trust root: key ${h} does not match any pin in ${t.pinsEnv} and was REFUSED (its thumbprints are jwk=${E.jwk} spki=${E.spki})`)}return Object.keys(_).length===0?{status:"unavailable",keys:{},source:g,url:p,warnings:r,explicitlyConfigured:a,reason:`every key offered by the trust root failed the ${t.pinsEnv} pin check`}:{status:"configured",keys:_,source:g,url:p,warnings:r,explicitlyConfigured:a}};if(i){let d;try{d=JSON.parse(i)}catch(g){return{status:"unavailable",keys:{},source:"inline",warnings:r,explicitlyConfigured:a,reason:`${t.inlineEnv} is set but is not valid JSON: ${g instanceof Error?g.message:String(g)}`}}return c(d,"inline")}let l=o,u=!1;if(!l&&e.leaseUrl){try{l=new URL(`/.well-known/jwks.json?purpose=${t.purpose}`,e.leaseUrl).toString()}catch{return{status:"unavailable",keys:{},warnings:r,explicitlyConfigured:a,reason:`AGENTHIPPO_LEASE_URL is not a valid URL: ${e.leaseUrl}`}}u=!0}if(!l)return{status:"unconfigured",keys:{},warnings:r,explicitlyConfigured:a};let f=xy(l,`the ${t.purpose} JWKS URL`,n);if(!f.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:f.reason,derivedFromLease:u,explicitlyConfigured:a};r.push(...f.warnings),u&&s.length===0&&r.push(`${t.label} trust root is derived from AGENTHIPPO_LEASE_URL (${l}) and is not pinned. Whoever can answer that origin ${t.derivedRisk}. Pin it with ${t.urlEnvs[0]} and ${t.pinsEnv}.`);try{let d=await(e.fetchImpl??fetch)(l);if(!d.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:`JWKS fetch returned HTTP ${d.status}`,derivedFromLease:u,explicitlyConfigured:a};let g=await d.json(),p=E0(g);return p.ok?{...c(p.pems,"jwks",l),derivedFromLease:u}:{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:p.reason,derivedFromLease:u,explicitlyConfigured:a}}catch(d){return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,derivedFromLease:u,explicitlyConfigured:a,reason:`JWKS fetch failed: ${d instanceof Error?d.message:String(d)}`}}}async function Fy(t){return By(p0,t)}async function h0(t){return By(g0,t)}function m0(t,e){return t.explicitlyConfigured?{keys:t.keys,packFallback:!1}:{keys:{...e.keys,...t.keys},packFallback:!0}}function _0(t,e){let n=[];if(!t.explicitlyConfigured)return{warnings:n};if(t.url){let s=null;try{s=new URL(t.url).searchParams.get("purpose")}catch{}if(s!==null&&s!=="lease-signing")return{warnings:n,fatal:`${F.LEASE_JWKS_URL_ENV} points at a '${s}' document (${t.url}). A plane that separates keys by purpose never serves a lease-signing key there, so signed-lease verification breaks at the next lease-key rotation \u2014 and requireSignedLease is sticky with no plane-side undo. Point it at ?purpose=lease-signing (with its own ${F.LEASE_JWKS_PINS_ENV}) instead.`};s===null&&e.url===t.url&&n.push(`the lease trust root and the pack trust root are the SAME document (${t.url}). An older plane that returns every key it holds supports this; a plane that separates keys by purpose does not, and the break lands at the next lease-key rotation, after requireSignedLease has latched. Give the lease root its own URL: ?purpose=lease-signing.`)}let r=Object.keys(t.keys).filter(s=>e.keys[s]!==void 0&&e.keys[s].trim()===t.keys[s].trim());return r.length>0&&n.push(`kid(s) ${r.map(s=>`'${s}'`).join(", ")} carry the same public key in BOTH the lease and the pack trust root \u2014 one key under two purposes. The control plane refuses to register such a key, so whichever purpose rotates first strands the other; give each purpose its own keypair.`),{warnings:n}}function E0(t){if(t.pemsByKid&&typeof t.pemsByKid=="object")return{ok:!0,pems:t.pemsByKid};if(!Array.isArray(t.keys))return{ok:!1,reason:"JWKS document has neither `pemsByKid` nor a `keys` array"};let e={};for(let n of t.keys)if(!(!n||typeof n!="object")&&!(n.kty!=="EC"||n.crv!=="P-256")&&!(n.alg!==void 0&&n.alg!=="ES256")&&!(typeof n.kid!="string"||!n.kid))try{e[n.kid]=Uo.createPublicKey({key:n,format:"jwk"}).export({type:"spki",format:"pem"}).toString()}catch{}return Object.keys(e).length===0?{ok:!1,reason:"JWKS document published no usable ES256 (P-256) keys"}:{ok:!0,pems:e}}async function y0(t){return(await Fy(t)).keys}F.PACK_PROBE_INTERVAL_MS=1e3;F.PACK_FULL_REVERIFY_INTERVAL_MS=3e4;function w0(t={}){let e=t.probeIntervalMs??F.PACK_PROBE_INTERVAL_MS,n=t.fullReverifyIntervalMs??F.PACK_FULL_REVERIFY_INTERVAL_MS,r,s="",i="",o=0,a=0,c=0,l=f=>`${f.packDir}\0${f.pack}\0${f.packVersion}\0${Object.keys(f.keys).sort().join(",")}`,u=(f,d)=>{c+=1,s=l(f),i=np(f.packDir),o=d,a=d;let g=Ly(f.packDir);return r=g?My(g,f.keys,{packDir:f.packDir,pack:f.pack,packVersion:f.packVersion}):{ok:!1,kind:"unsigned",reason:`${f.pack} is not signed (no ${F.PACK_SIGNATURE_FILE} at the pack root)`},r};return{fullVerifications:()=>c,refresh(f,d=Date.now()){return u(f,d)},verify(f,d=Date.now()){return!r||s!==l(f)||d-a>=n?u(f,d):d-o<e||(o=d,np(f.packDir)===i)?r:u(f,d)}}}});var jo=T(ce=>{"use strict";Object.defineProperty(ce,"__esModule",{value:!0});ce.MAX_LEASE_ENVELOPE_TTL_SECONDS=ce.LEASE_JWS_TYP=ce.LeaseDeniedError=ce.LEASE_MAX_STALENESS_ENV=ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS=ce.MIN_LEASE_POLL_SECONDS=ce.DEFAULT_LEASE_POLL_SECONDS=void 0;ce.resolveLeasePollSeconds=ip;ce.leaseCacheSecondsFor=op;ce.effectiveKillLatencySeconds=T0;ce.leaseMaxStalenessFromEnv=qy;ce.resolveAllowServiceTurns=b0;ce.describeServiceTurnGate=v0;ce.denyVerdict=Yy;ce.resolveFollowedUsers=I0;ce.leaseIsDead=P0;ce.policyVersion=N0;ce.assertAdmitted=R0;ce.signLease=C0;ce.verifySignedLease=Xy;ce.requireSignedLease=zy;ce.leaseUrlDeployment=Qy;ce.createLeaseSource=$0;var S0=require("crypto"),Ky=si(),Wy=La(),A0=Ho();ce.DEFAULT_LEASE_POLL_SECONDS=30;ce.MIN_LEASE_POLL_SECONDS=5;function ip(t){let e=typeof t=="number"&&Number.isFinite(t)?t:ce.DEFAULT_LEASE_POLL_SECONDS;return Math.max(ce.MIN_LEASE_POLL_SECONDS,Math.floor(e))}function op(t){return ip(t)}function T0(t){let e=ip(t);return e+op(e)}ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS=1440*60;ce.LEASE_MAX_STALENESS_ENV="AGENTHIPPO_LEASE_MAX_STALENESS_SECONDS";function qy(t=process.env){let e=t[ce.LEASE_MAX_STALENESS_ENV]?.trim();if(e===void 0||e==="")return ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<0?ce.DEFAULT_LEASE_MAX_STALENESS_SECONDS:Math.floor(n)}function b0(t){return t.managed?t.lease===!0?{allowed:!0,gate:"lease_allows"}:{allowed:!1,gate:t.lease===!1?"lease_denies":"lease_absent_field"}:{allowed:!0,gate:"unmanaged_no_lease"}}function v0(t){switch(t){case"lease_allows":return"permitted by the control plane (lease.allowServiceTurns)";case"unmanaged_no_lease":return"permitted: no control plane configured, so AGENTHIPPO_SERVICE_USER is the only gate";case"lease_denies":return"refused: the control plane set lease.allowServiceTurns=false";case"lease_absent_field":return"refused: this is a managed deployment and the lease does not set allowServiceTurns (absent means deny \u2014 enable it in the console)"}}function Yy(t,e,n){if(!t?.deny?.length)return{denied:!1};let r=n??Math.floor(Date.now()/1e3),s=e.sessionKey.indexOf("--"),i=s>=0?e.sessionKey.slice(s+2):e.sessionKey,o={denied:!1};for(let a of t.deny){if(a.until!==void 0&&a.until<=r)continue;let c=!1;if(a.scope==="pack"?c=a.match===e.pack:a.scope==="session"?(c=a.match===e.sessionKey||a.match===i,c&&a.user!==void 0&&e.userId!==void 0&&a.user!==e.userId&&(c=!1),!c&&a.followUser!==!1&&e.userId!==void 0&&O0(a,e.userId,e.followedUsers)&&(c=!0)):a.scope==="user"&&(c=e.userId!==void 0&&a.match===e.userId||e.userHash!==void 0&&e.sessionKey.startsWith(`u${e.userHash(a.match)}--`)),!c)continue;let l=`${a.mode==="kill"?"stopped":"draining"} by the control plane${a.reason?`: ${a.reason}`:""}`;if(a.mode==="kill")return{denied:!0,mode:"kill",reason:l};o.denied||(o={denied:!0,mode:"drain",reason:l})}return o}var Jy=t=>`${t.scope}:${t.match}`;function O0(t,e,n){return n?.get(Jy(t))?.has(e)??!1}function I0(t,e,n){let r=new Map;if(!t?.deny?.length)return r;let s=n??Math.floor(Date.now()/1e3);for(let i of t.deny){if(i.scope!=="session"||i.followUser===!1||i.until!==void 0&&i.until<=s)continue;let o=new Set;for(let[a,c]of e){let l=a.indexOf("--"),u=l>=0?a.slice(l+2):a;i.match!==a&&i.match!==u||i.user!==void 0&&i.user!==c||o.add(c)}o.size>0&&r.set(Jy(i),o)}return r}function P0(t,e){if(!t)return{dead:!1};let n=e??Math.floor(Date.now()/1e3);return t.enabled?t.expiresAt<=n?{dead:!0,reason:`lease expired at ${new Date(t.expiresAt*1e3).toISOString()}`}:{dead:!1}:{dead:!0,reason:`kill switch active${t.reason?`: ${t.reason}`:""}`}}function N0(t){if(!t)return;let{expiresAt:e,issuedAt:n,...r}=t,s=i=>Array.isArray(i)?i.map(s):i&&typeof i=="object"?Object.fromEntries(Object.keys(i).sort().map(o=>[o,s(i[o])])):i;return(0,S0.createHash)("sha256").update(JSON.stringify(s(r))).digest("hex")}var Rs=class extends Error{constructor(e){super(e),this.name="LeaseDeniedError"}};ce.LeaseDeniedError=Rs;function R0(t,e){if(!t)return;let n=e.nowSeconds??Math.floor(Date.now()/1e3);if(!t.enabled)throw new Rs(`kill switch active for pack ${e.pack}${t.reason?`: ${t.reason}`:""}`);if(t.pack!==e.pack)throw new Rs(`lease is for pack ${t.pack}, not ${e.pack}`);if(t.expiresAt<=n)throw new Rs(`lease for ${e.pack} expired at ${new Date(t.expiresAt*1e3).toISOString()}`);if(t.version&&t.version!==e.version)throw new Rs(`pack ${e.pack} is pinned to ${t.version}; refusing to start ${e.version} (rollback in force)`);if(t.imageDigest&&e.image&&!e.image.includes(t.imageDigest))throw new Rs(`image for ${e.pack} does not match the leased digest ${t.imageDigest}`);if(e.sessionKey){let r=Yy(t,{sessionKey:e.sessionKey,pack:e.pack,userHash:e.userHash,userId:e.userId,followedUsers:e.followedUsers},n);if(r.denied)throw new Rs(r.reason??"stopped by the control plane")}}ce.LEASE_JWS_TYP="agenthippo-lease+jws";ce.MAX_LEASE_ENVELOPE_TTL_SECONDS=3600;function C0(t,e,n){let r=n.nowSeconds??Math.floor(Date.now()/1e3),s=Math.min(n.ttlSeconds??300,ce.MAX_LEASE_ENVELOPE_TTL_SECONDS),i={lease:t,aud:n.instanceId??"*",sub:t.pack,iat:r,exp:r+s,...n.iss?{iss:n.iss}:{}};return(0,Ky.signCompactJws)({typ:ce.LEASE_JWS_TYP,kid:e.kid},i,e.privateKeyPem)}function Xy(t,e,n={}){if(Object.keys(e).length===0)return{ok:!1,reason:"no trusted lease-signing keys are configured on this instance"};let r=(0,Ky.verifyCompactJws)(t,e,{typ:ce.LEASE_JWS_TYP});if(!r.ok)return{ok:!1,reason:`lease signature: ${r.reason}`};let s=r.payload,i=n.nowSeconds??Math.floor(Date.now()/1e3),o=n.clockSkewSeconds??60;if(typeof s.iat!="number"||!Number.isFinite(s.iat))return{ok:!1,reason:"lease envelope has no issued-at"};if(typeof s.exp!="number"||!Number.isFinite(s.exp))return{ok:!1,reason:"lease envelope has no expiry"};if(s.exp-s.iat>ce.MAX_LEASE_ENVELOPE_TTL_SECONDS)return{ok:!1,reason:`lease envelope lifetime ${s.exp-s.iat}s exceeds the ${ce.MAX_LEASE_ENVELOPE_TTL_SECONDS}s cap`};if(s.exp+o<=i)return{ok:!1,reason:`lease envelope expired at ${new Date(s.exp*1e3).toISOString()}`};if(s.iat-o>i)return{ok:!1,reason:"lease envelope is issued in the future"};if(n.minIat!==void 0&&s.iat<n.minIat)return{ok:!1,reason:`lease envelope is older than one already accepted (replay/rollback: iat ${s.iat} < ${n.minIat})`};if(n.instanceId!==void 0&&s.aud!=="*"&&s.aud!==n.instanceId)return{ok:!1,reason:`lease envelope is for instance ${s.aud}, not ${n.instanceId}`};let a=(0,Wy.parseLease)(s.lease);return a.ok?s.sub!==a.lease.pack?{ok:!1,reason:`lease envelope subject ${s.sub} does not match lease.pack ${a.lease.pack}`}:{ok:!0,lease:a.lease,claims:s}:{ok:!1,reason:`signed lease is malformed: ${a.reason}`}}function zy(t,e){return!!t||!!e}var Vy=t=>/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(t),k0=2e4;function Qy(t){if(t)try{let e=/\/lease\/([^/]+)\.json$/.exec(new URL(t).pathname);return e?decodeURIComponent(e[1]):void 0}catch{return}}function $0(t){let e=t.staticLease,n=0,r,s,i=!1,o=!1,a,c=Qy(t.url),l=!1,u,f=!1,d=!1,g=!1,p=!1,_=t.cacheSeconds??op(ce.DEFAULT_LEASE_POLL_SECONDS),h=t.maxStalenessSeconds??qy(t.env),y=t.fetchImpl??fetch,E=()=>zy(l,t.requireSignedLease),w=P=>({...e??{pack:"",expiresAt:0},enabled:!1,reason:`the control plane has not been reachable for ${P}s, past the ${h}s staleness ceiling (${ce.LEASE_MAX_STALENESS_ENV}). Refusing work rather than running on a lease that can no longer be revoked. Set ${ce.LEASE_MAX_STALENESS_ENV}=0 to accept unbounded staleness.`}),A=()=>({pack:"",expiresAt:0,enabled:!1,reason:`this instance is managed (${t.url}) but has never successfully fetched its lease`+(s?` (${s})`:"")+". Refusing work until the control plane is reachable rather than booting ungoverned. For an air-gapped deployment, provide the lease with --static-lease."}),S=!1,C=P=>{if(S=!0,!t.persistence)return;let L;try{L=t.persistence.load()}catch(O){t.logger?.warn(`[Lease] persisted lease unreadable: ${O instanceof Error?O.message:String(O)}`);return}if(!L||typeof L.body!="string")return;typeof L.lastGoodAt=="number"&&Number.isFinite(L.lastGoodAt)&&(r=Math.min(L.lastGoodAt,P));let N=I(L.body,P);if(!N.ok){t.logger?.warn(`[Lease] persisted lease not reinstalled: ${N.reason}`);return}N.signed&&(i=!0,N.lease.requireSignedLease&&(l=!0)),e=N.lease,o=N.signed,a=void 0},b=P=>P.deployment!==void 0&&c!==void 0&&P.deployment!==c?`lease is for deployment ${P.deployment}, not ${c} (${t.url})`:void 0,I=(P,L)=>{let N=P.trim(),O,G;if(Vy(N))O=N;else{try{G=JSON.parse(N)}catch(J){return{ok:!1,reason:`lease body is not JSON: ${J instanceof Error?J.message:String(J)}`}}typeof G=="string"&&Vy(G.trim())?O=G.trim():G&&typeof G=="object"&&typeof G.lease=="string"&&(O=G.lease.trim())}if(O){let J=Xy(O,t.signingKeys?.()??{},{instanceId:t.instanceId,minIat:u,nowSeconds:L});if(!J.ok)return{ok:!1,reason:J.reason};let W=b(J.lease);return W?{ok:!1,reason:W}:(u=J.claims.iat,{ok:!0,lease:J.lease,signed:!0})}if(E())return{ok:!1,reason:'a signed lease is required but the control plane returned an unsigned one (expected a compact JWS body or {"lease":"<jws>"})'};let H=(0,Wy.parseLease)(G);if(!H.ok)return{ok:!1,reason:H.reason};for(let J of H.warnings)t.logger?.warn(`[Lease] ${J}`);let X=b(H.lease);return X?{ok:!1,reason:X}:{ok:!0,lease:H.lease,signed:!1}};return{status(P){let L=P??Math.floor(Date.now()/1e3),N=r===void 0?void 0:L-r,O=!!t.url&&e===void 0&&s!==void 0;return{signed:i,currentSigned:o,clockOffsetSeconds:a,requireSignedLease:E(),lastGoodAt:r,stalenessSeconds:N,maxStalenessSeconds:h,failClosed:O||h>0&&N!==void 0&&N>h,lastError:s}},async get(P){let L=P??Math.floor(Date.now()/1e3);if(!t.url)return e;if(!p){p=!0;let N=(0,A0.assertSecureTrustUrl)(t.url,"AGENTHIPPO_LEASE_URL",t.env??process.env);if(N.ok)for(let O of N.warnings)t.logger?.warn(`[Lease] ${O}`);else E()?t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${N.reason} Signed leases are required here, so the policy itself is still verified \u2014 but the channel is not: anyone on the path can read this instance's identity, pack and version, and can delay a kill switch by up to ${ce.MAX_LEASE_ENVELOPE_TTL_SECONDS}s by replaying the last envelope. requireSignedLease is not a substitute for https; serve the lease over https.`):t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${N.reason} Anyone on the path can lift this instance's kill switch, widen its caps or change its version pin. Continuing to poll (refusing would disable the kill switch entirely), but this deployment is not governable until the lease is signed: set requireSignedLease and have the control plane sign leases.`)}if(e===void 0&&!S&&C(L),e&&L-n<_)return e;try{let N={accept:"application/json, text/plain"};for(let[X,J]of Object.entries(t.identity?.()??{}))J!==void 0&&J!==""&&(N[`x-agenthippo-${X}`]=String(J));let O=await y(t.url,{headers:N,signal:AbortSignal.timeout(k0)});if(!O.ok)throw new Error(O.status===404?`lease fetch 404 \u2014 the control plane has no deployment at ${t.url}; check AGENTHIPPO_LEASE_URL`:`lease fetch ${O.status}`);let G=typeof O.text=="function"?await O.text():JSON.stringify(await O.json()),H=I(G,L);if(!H.ok)throw new Error(H.reason);H.signed?(i=!0,H.lease.requireSignedLease&&(l=!0)):g||(g=!0,t.logger?.warn(`[Lease] running on an UNSIGNED lease. Anyone who can answer or intercept ${t.url} can lift this instance's kill switch, widen its caps and change its version pin. Have the control plane sign leases (ES256 compact JWS) and set requireSignedLease.`)),e=H.lease,o=H.signed,a=H.signed&&H.lease.issuedAt!==void 0?H.lease.issuedAt-(P??Math.ceil(Date.now()/1e3)):void 0,n=L,r=L,s=void 0,f=!1,d=!1;try{t.persistence?.save({body:G,lastGoodAt:L})}catch(X){t.logger?.warn(`[Lease] could not persist lease: ${X instanceof Error?X.message:String(X)}`)}return e}catch(N){if(s=N instanceof Error?N.message:String(N),e===void 0)return d||(d=!0,t.logger?.warn(`[Lease] NO LEASE HAS EVER BEEN INSTALLED \u2014 fetch failed (${s}) and there is no persisted or static lease to fall back on. Failing closed: turns are refused until the control plane is reachable. For air-gapped use, provide --static-lease.`)),A();t.logger?.warn(`[Lease] fetch failed, using cached lease: ${s}`),r===void 0&&(r=L);let O=L-r;return h>0&&O>h?(f||(f=!0,t.logger?.warn(`[Lease] STALENESS CEILING PASSED \u2014 no successful lease refresh for ${O}s (ceiling ${h}s). Failing closed: turns are refused until the control plane is reachable.`)),w(O)):e}}}}});var tw=T(Cs=>{"use strict";var D0=Cs&&Cs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),L0=Cs&&Cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),M0=Cs&&Cs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&D0(n,e,r[s]);return L0(n,e),n}})();Object.defineProperty(Cs,"__esModule",{value:!0});Cs.startGrantGovernance=j0;var G0=M0(require("os")),Zy=jo(),ew=Ho(),U0=5*6e4,H0=6*36e5;async function j0(t){let e=Math.max(15,t.pollSeconds??60),n=t.env??process.env,r=await(0,ew.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}),s,i=`connector-${G0.hostname()}`,o=new Map,a=(0,Zy.createLeaseSource)({url:t.leaseUrl,fetchImpl:t.fetchImpl,env:n,instanceId:i,cacheSeconds:e-1,signingKeys:()=>r.keys,identity:()=>({instance:i,role:"connector",...s?{grants:JSON.stringify(s)}:{},...t.enrollToken?{"enroll-token":t.enrollToken}:{}}),logger:t.logger}),c=(0,Zy.leaseUrlDeployment)(t.leaseUrl),l=async()=>{let d;try{d=await t.provider.listGrants(),s=await t.provider.summary(d)}catch(S){t.logger?.warn(`[grants] could not count grants: ${S instanceof Error?S.message:S}`)}r.status!=="configured"&&(r=await(0,ew.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}));let g=await a.get(),p=g?.grants?.revoke??[],_=new Set(p.map(S=>S.user));for(let S of o.keys())_.has(S)||o.delete(S);if(!p.length)return;if(!a.status().currentSigned){t.logger?.warn(`[grants] ignoring ${p.length} revocation(s) on an UNSIGNED lease \u2014 only a signed lease may revoke a user's grants`);return}if(!c||g?.deployment!==c){t.logger?.warn(`[grants] ignoring ${p.length} revocation(s): the lease does not name deployment ${c??`(none in ${t.leaseUrl})`}`);return}let h=a.status().clockOffsetSeconds;if(h===void 0){t.logger?.warn(`[grants] ignoring ${p.length} revocation(s) until a live lease poll measures the plane's clock`);return}let y=Date.now(),E=p.filter(S=>(o.get(S.user)?.at??0)<=y),w=new Set,A=E.map(S=>({...S,requestedAt:S.requestedAt-h}));await t.provider.applyRevocations(A,d,S=>{let C=S.result.ok?"grant_revoked_by_plane":"grant_revoke_failed";t.audit?.("control",C,{user_sha256:S.user,service:S.service,failed:S.result.failed}),t.logger?.info(`[grants] ${C}: ${S.service} for user sha256:${S.user.slice(0,12)}\u2026`),S.result.ok||w.add(S.user)});for(let S of E)if(w.has(S.user)){let C=Math.min((o.get(S.user)?.delayMs??U0/2)*2,H0);o.set(S.user,{at:y+C,delayMs:C})}else o.delete(S.user)};await l().catch(d=>t.logger?.warn(`[grants] first poll failed: ${d instanceof Error?d.message:d}`));let u,f=setInterval(()=>{u||(u=l().catch(d=>t.logger?.warn(`[grants] poll failed: ${d instanceof Error?d.message:d}`)).finally(()=>{u=void 0}))},e*1e3);return f.unref(),{tick:l,stop:()=>clearInterval(f)}}});var ap=T(Ql=>{"use strict";Object.defineProperty(Ql,"__esModule",{value:!0});Ql.createDataPlaneAuditSink=aw;Ql.dataPlaneSidecarCommand=K0;var nw=require("fs"),x0=ji(),rw=Vi(),B0=tw(),sw=ur(),ow=vo(),F0=So(),V0=Ii(),iw=Ui(),oi=en();async function aw(t,e){let{dir:n,ephemeral:r}=(0,sw.resolveStateDir)(t),s=(0,sw.resolveAnalyticsSessionsDir)(n,r),i=!0,o;try{await nw.promises.mkdir(s,{recursive:!0}),await nw.promises.access(s)}catch(l){i=!1,o=l instanceof Error?l.message:String(l)}let a=new ow.SessionEventWriter(s);return{audit:(l,u,f)=>{let d=typeof f.userId=="string"?f.userId:void 0,g=(0,F0.hashIdentity)(d),p=g?{...f,userId:g}:f,_=g&&l===d?g:l;a.append(_,(0,V0.generateRequestId)(),u,e?{...p,agent:{...e,digest:null}}:p)},auditDir:s,ephemeral:r,ok:i,error:o}}async function K0(t){let e=process.env.AGENTHIPPO_DATA_PLANE_TOKEN?.trim();e||(console.error("Error: AGENTHIPPO_DATA_PLANE_TOKEN is required (shared secret the trusted EDGE \u2014 or, legacy, the agent's serve \u2014 presents to register turns)."),process.exit(1));let n;try{n=await(0,x0.loadAgentPack)(t.agent,t.workspace)}catch(p){console.error(`Error: ${p instanceof Error?p.message:p}`),process.exit(1);return}let r=(0,rw.resolveDataPlaneConfig)(n.manifest.spec,n.packPath);if(!r){console.error("Error: pack declares no spec.dataPlane \u2014 nothing for the sidecar to run."),process.exit(1);return}let s=t.verbose?new iw.ConsoleLogger("[Sidecar]"):new iw.NoOpLogger,{audit:i,auditDir:o,ephemeral:a,ok:c,error:l}=await aw(t.stateDir,{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"});if(!c){let p=`${o}: ${l}`;if((0,ow.evidenceRequired)()){console.error(`${oi.COLORS.red}Error: data-plane audit directory is not writable${oi.COLORS.reset} \u2014 ${p}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1);return}console.warn(`${oi.COLORS.yellow}Warning:${oi.COLORS.reset} data-plane audit directory is not writable \u2014 ${p}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set --state-dir or AGENTHIPPO_HOME to a writable path.")}let u;try{u=await(0,rw.startDataPlaneSidecar)({config:r,registerToken:e,gatewayPort:t.gatewayPort,controlPort:t.controlPort,connectPort:t.connectPort,bindHost:t.host??"0.0.0.0",logger:s,audit:i,agent:{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"}})}catch(p){console.error(`${oi.COLORS.red}Error: failed to start the data-plane sidecar:${oi.COLORS.reset} ${p instanceof Error?p.message:p}`),process.exit(1);return}console.log(`OK: Data-plane sidecar (provider=${r.provider??"passthrough"}) \u2014 connector: ${r.connectorPath}`),console.log(` gateway (engine dials, nonce-auth): ${u.gatewayUrl}`),console.log(` control (edge/serve registers, bearer): :${u.controlPort}`),u.connectPort!==void 0&&console.log(` connect (users link accounts, via edge): :${u.connectPort}`),console.log(` audit (tool_authorize / tool_deny / register events): ${o}${a?" (EPHEMERAL \u2014 lost on restart; set AGENTHIPPO_HOME or --state-dir)":""}`),console.log(" Base credentials live here only \u2014 never in the agent container."),console.log(" Edge mode (P1): give the register token to the IdP edge only; serve runs with AGENTHIPPO_DATA_PLANE_EDGE=1 and no token.");let f,d=()=>{f?.stop(),u.close().finally(()=>process.exit(0))};process.on("SIGINT",d),process.on("SIGTERM",d);let g=process.env.AGENTHIPPO_LEASE_URL?.trim();f=u.grants&&g?await(0,B0.startGrantGovernance)({provider:u.grants,leaseUrl:g,enrollToken:process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()||void 0,logger:{info:p=>console.log(p),warn:p=>console.warn(`${oi.COLORS.yellow}Warning:${oi.COLORS.reset} ${p}`)},audit:i}):void 0,f&&console.log(` grants governance: counts reported and revocations applied on the lease poll (${g})`),await new Promise(()=>{})}});var lp=T(cp=>{"use strict";Object.defineProperty(cp,"__esModule",{value:!0});cp.resolveCliTurnScope=J0;var W0=Ry(),q0=ap(),cw=Vi(),Y0=vo(),lw=Ic(),ai=en();async function J0(t){let e=t.pack?.manifest.spec,n=t.pack?.packPath,r=!!((0,cw.resolveRemoteDataPlane)()||e&&n&&(0,cw.resolveDataPlaneConfig)(e,n)),s;if(r){let o=t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version??"0.0.0"}:void 0,a=await(0,q0.createDataPlaneAuditSink)(void 0,o);if(s=a.audit,!a.ok){let c=`${a.auditDir}: ${a.error}`;(0,Y0.evidenceRequired)()&&(console.error(`${ai.COLORS.red}Error: data-plane audit directory is not writable${ai.COLORS.reset} \u2014 ${c}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1)),console.warn(`${ai.COLORS.yellow}Warning:${ai.COLORS.reset} data-plane audit directory is not writable \u2014 ${c}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set AGENTHIPPO_HOME to a writable path.")}}let i;try{i=await(0,W0.resolveLocalTurnScope)({spec:e,packPath:n,agent:t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version}:void 0,logger:t.verbose?new lw.ConsoleLogger("[DataPlane]"):new lw.NoOpLogger,audit:s})}catch(o){console.error(`${ai.COLORS.red}Error: failed to start the data plane:${ai.COLORS.reset} ${o instanceof Error?o.message:o}`),process.exit(1)}return i&&!t.quiet&&console.log(`${ai.COLORS.green}OK:${ai.COLORS.reset} Data plane ${i.mode==="sidecar"?"SIDECAR":"(in-process)"} \u2014 gateway ${i.gatewayUrl}; acting as ${i.userId} (locally asserted; per-turn registration, session-stable nonce bytes)`),i}});var fw=T(ks=>{"use strict";var X0=ks&&ks.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),z0=ks&&ks.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),dp=ks&&ks.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&X0(n,e,r[s]);return z0(n,e),n}})();Object.defineProperty(ks,"__esModule",{value:!0});ks.chatCommand=sL;var Q0=dp(require("readline")),Z0=dp(require("path")),eL=dp(require("os")),Mr=Ui(),Ki=ji(),Ee=en(),tL=xi(),uw=ot(),nL=Cr(),dw=Qs(),rL=lp(),up="-".repeat(62);async function sL(t){let e=(0,Ki.getApiConfig)(),n,r="default",s,i,o,a,c=t.verbose?new Mr.ConsoleLogger("[Sync]"):new Mr.NoOpLogger;if(t.agent)try{n=await(0,Ki.loadAgentPack)(t.agent,t.workspace),r=n.manifest.metadata.name,s=t.engine||n.manifest.spec.engine;let I=["claude","codex"].includes(s)?void 0:(0,dw.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,P=t.model||n.manifest.spec.model||I||(0,Ki.getEnvDefaultModel)()||(0,Ki.getDefaultConfig)().model;i=(0,Mr.resolveModelAlias)(P);let L=n.manifest.spec.cheapModel?.trim();o=L?(0,Mr.resolveModelAlias)(L):void 0,a=n.manifest.spec.effort?.trim()||void 0,await(0,Mr.syncPackToWorkspace)(t.workspace,n.packPath,r,s,c,(0,Ee.findBundledBasePromptsDir)()),console.log(`${Ee.COLORS.green}OK:${Ee.COLORS.reset} Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),P!==i&&console.log(`${Ee.COLORS.dim} Model: ${P} -> ${i}${Ee.COLORS.reset}`),L&&L!==o&&console.log(`${Ee.COLORS.dim} Cheap model: ${L} -> ${o}${Ee.COLORS.reset}`)}catch(b){console.error(`${Ee.COLORS.red}Error: ${b instanceof Error?b.message:b}${Ee.COLORS.reset}`),process.exit(1)}else{let b=(0,Ki.getDefaultConfig)();s=t.engine||b.engine;let I=["claude","codex"].includes(s)?void 0:(0,dw.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,P=t.model||I||(0,Ki.getEnvDefaultModel)()||b.model;i=(0,Mr.resolveModelAlias)(P),P!==i&&console.log(`${Ee.COLORS.dim}Model: ${P} -> ${i}${Ee.COLORS.reset}`)}if(!e.apiKey&&(s==="claude"||s==="codex")){let b=(0,Ee.getLiteLLMQuickstartHintLines)();console.log(["To start a chat, set an API key and re-run the command. Example:",` ${b[1]}`,"","Other options:"," AGENTHIPPO_LITELLM_API_KEY=your_key AGENTHIPPO_LITELLM_BASE_URL=https://... dist/agenthippo chat"," LITELLM_API_KEY=your_key LITELLM_BASE_URL=https://... dist/agenthippo chat"," ANTHROPIC_API_KEY=your_key dist/agenthippo chat"," OPENAI_API_KEY=your_key dist/agenthippo chat"].join(`
505
+ `)),process.exit(1)}let l=Z0.join(eL.tmpdir(),`${uw.AGENTIDE_CLI_NAME}-cli`),u=t.verbose?new Mr.ConsoleLogger("[Agent]"):new Mr.NoOpLogger,f=(0,Ee.findClaudeCodePath)(),d=(0,Ee.findCodexPath)(),g=(0,Ee.findBundledBasePromptsDir)();if(s==="claude"&&!f){console.error(`${Ee.COLORS.red}Error: Claude Code CLI not found.${Ee.COLORS.reset}`);let b=(0,tL.getUnsupportedClaudePlatformHint)();b&&console.error(` ${b}`),console.error(" Install it: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),console.error(" Or use --engine codex instead"),process.exit(1)}s==="codex"&&!d&&(console.error(`${Ee.COLORS.red}Error: Codex CLI not found.${Ee.COLORS.reset}`),console.error(" Install it: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),console.error(" Or use --engine claude instead"),process.exit(1));let p=new Mr.AutoApprovePermissionHandler,_={fileAccess:(0,Ki.getFileAccess)(n)},h=`cli-${Date.now()}`,y=await(0,rL.resolveCliTurnScope)({pack:n,verbose:t.verbose}),E=()=>(0,Mr.createHeadlessRunner)({storagePath:l,packId:r,packVersion:n?.manifest.metadata.version,bundledPromptsDir:g,apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey,logger:u,freshState:!1,claudeCodeExecutablePath:f,codexExecutablePath:d,permissionHandler:p,cliEnvPatch:(0,nL.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:h,baseEnv:process.env}),dataPlane:y??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}}),w={runner:E(),sessionId:h,engine:s,model:i},A=()=>({async thinking(b){process.stdout.write(`${Ee.COLORS.gray}${b}${Ee.COLORS.reset}`)},async text(b){process.stdout.write(b)},async toolStart(b,I){console.log(`
506
+ ${Ee.COLORS.blue}Tool: ${b}${Ee.COLORS.reset}`),I&&I.length<200&&t.verbose&&console.log(` ${Ee.COLORS.gray}${I}${Ee.COLORS.reset}`)},async toolEnd(b,I,P,L){console.log(L?` ${Ee.COLORS.red}Error: ${P?.slice(0,100)}${Ee.COLORS.reset}`:` ${Ee.COLORS.green}OK${Ee.COLORS.reset}`)},async progress(b){t.verbose&&console.log(`${Ee.COLORS.yellow}Progress: ${b}${Ee.COLORS.reset}`)},async error(b){console.error(`${Ee.COLORS.red}Error: ${b}${Ee.COLORS.reset}`)},async question(b){return{selected:[],freeText:null,declined:!0}},async done(){console.log(`
507
+ `)}});console.log(""),console.log(up),console.log(`${uw.AGENTIDE_BRAND_NAME} Chat`),console.log(up),console.log(`Engine: ${w.engine}`),console.log(`Model: ${w.model}`),o&&console.log(`Cheap: ${o}`),console.log(`Workspace: ${t.workspace}`),n&&console.log(`Agent: ${n.manifest.metadata.name}`),console.log(up),console.log("Type a message to chat. Commands: /help"),console.log("");let S=Q0.createInterface({input:process.stdin,output:process.stdout}),C=()=>{S.question(`${Ee.COLORS.cyan}> ${Ee.COLORS.reset}`,async b=>{let I=b.trim();if(!I){C();return}if(I.startsWith("/")){if(!await iL(I,w,S,{createRunner:E,claudeCodePath:f,codexPath:d,turnScope:y}))return;C();return}try{let P=await w.runner.run({engineId:w.engine,modelId:w.model,message:I,workspaceRoot:t.workspace,sessionId:w.sessionId,emitter:A(),permissions:_});!P.success&&P.error&&console.error(`
508
508
  ${Ee.COLORS.red}Error: ${P.error}${Ee.COLORS.reset}
509
509
  `)}catch(P){console.error(`
510
510
  ${Ee.COLORS.red}Error: ${P instanceof Error?P.message:P}${Ee.COLORS.reset}
@@ -520,13 +520,13 @@ ${l}`),t.file)try{let w=pw.resolve(t.workspace,t.file),A=cL.readFileSync(w,"utf-
520
520
  File content (${t.file}):
521
521
  \`\`\`
522
522
  ${A}
523
- \`\`\``}catch{t.json?console.log(JSON.stringify({error:`Failed to read file: ${t.file}`})):console.error(`Error: Failed to read file: ${t.file}`),process.exit(1)}let u=pw.join(lL.tmpdir(),"agenthippo-cli"),d=t.verbose?new ts.ConsoleLogger("[Agent]"):new ts.NoOpLogger,f=(0,ns.findClaudeCodePath)(),p=(0,ns.findCodexPath)(),g=(0,ns.findBundledBasePromptsDir)();if(s==="claude"&&!f){let w=(0,uL.getUnsupportedClaudePlatformHint)();t.json?console.log(JSON.stringify({error:"Claude Code CLI not found. Install: npm install -g @anthropic-ai/claude-code",...w?{reason:w}:{}})):(console.error(`${ns.COLORS.red}Error: Claude Code CLI not found.${ns.COLORS.reset}`),w&&console.error(` ${w}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH, or use --engine codex")),process.exit(1)}s==="codex"&&!p&&(t.json?console.log(JSON.stringify({error:"Codex CLI not found. Install: npm install -g @openai/codex"})):(console.error(`${ns.COLORS.red}Error: Codex CLI not found.${ns.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH, or use --engine claude")),process.exit(1));let _=new ts.AutoApprovePermissionHandler,h={fileAccess:(0,Wi.getFileAccess)(n)},y=await(0,fL.resolveCliTurnScope)({pack:n,verbose:t.verbose,quiet:t.json}),E=(0,ts.createHeadlessRunner)({storagePath:u,packId:r,packVersion:n?.manifest.metadata.version,bundledPromptsDir:g,apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey,logger:d,freshState:!t.sessionId?.trim(),permissionHandler:_,claudeCodeExecutablePath:f,codexExecutablePath:p,cliEnvPatch:(0,dL.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:t.sessionId,baseEnv:process.env}),dataPlane:y??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}});try{let w=await E.run({engineId:s,modelId:i,message:l,workspaceRoot:t.workspace,sessionId:t.sessionId,permissions:h});t.json?(t.outputMode==="agent-run"?console.log(JSON.stringify({text:w.text,media:[],session_id:t.sessionId||null,error:w.error||void 0})):console.log(JSON.stringify({success:w.success,text:w.text,thinking:w.thinking||void 0,toolCalls:w.toolCalls,error:w.error})),w.success||process.exit(1)):w.success?console.log(w.text):(console.error(`Error: ${w.error}`),process.exit(1))}catch(w){t.json?console.log(JSON.stringify({error:w instanceof Error?w.message:String(w)})):console.error(`Error: ${w instanceof Error?w.message:w}`),process.exit(1)}finally{E.dispose();try{await y?.close()}catch{}}}});var pp=T(rs=>{"use strict";Object.defineProperty(rs,"__esModule",{value:!0});rs.isTerminalFrame=gL;rs.isTaggedEvent=hL;rs.encodeRunnerFrame=mL;rs.encodeClientFrame=_L;rs.parseRunnerFrame=EL;rs.parseClientFrame=yL;rs.splitFrames=wL;rs.toWireOptions=SL;function gL(t){return"type"in t&&(t.type==="result"||t.type==="failed")}function hL(t){return"event"in t}function mL(t){return`${JSON.stringify(t)}
523
+ \`\`\``}catch{t.json?console.log(JSON.stringify({error:`Failed to read file: ${t.file}`})):console.error(`Error: Failed to read file: ${t.file}`),process.exit(1)}let u=pw.join(lL.tmpdir(),"agenthippo-cli"),f=t.verbose?new ts.ConsoleLogger("[Agent]"):new ts.NoOpLogger,d=(0,ns.findClaudeCodePath)(),g=(0,ns.findCodexPath)(),p=(0,ns.findBundledBasePromptsDir)();if(s==="claude"&&!d){let w=(0,uL.getUnsupportedClaudePlatformHint)();t.json?console.log(JSON.stringify({error:"Claude Code CLI not found. Install: npm install -g @anthropic-ai/claude-code",...w?{reason:w}:{}})):(console.error(`${ns.COLORS.red}Error: Claude Code CLI not found.${ns.COLORS.reset}`),w&&console.error(` ${w}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH, or use --engine codex")),process.exit(1)}s==="codex"&&!g&&(t.json?console.log(JSON.stringify({error:"Codex CLI not found. Install: npm install -g @openai/codex"})):(console.error(`${ns.COLORS.red}Error: Codex CLI not found.${ns.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH, or use --engine claude")),process.exit(1));let _=new ts.AutoApprovePermissionHandler,h={fileAccess:(0,Wi.getFileAccess)(n)},y=await(0,fL.resolveCliTurnScope)({pack:n,verbose:t.verbose,quiet:t.json}),E=(0,ts.createHeadlessRunner)({storagePath:u,packId:r,packVersion:n?.manifest.metadata.version,bundledPromptsDir:p,apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey,logger:f,freshState:!t.sessionId?.trim(),permissionHandler:_,claudeCodeExecutablePath:d,codexExecutablePath:g,cliEnvPatch:(0,dL.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:t.sessionId,baseEnv:process.env}),dataPlane:y??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}});try{let w=await E.run({engineId:s,modelId:i,message:l,workspaceRoot:t.workspace,sessionId:t.sessionId,permissions:h});t.json?(t.outputMode==="agent-run"?console.log(JSON.stringify({text:w.text,media:[],session_id:t.sessionId||null,error:w.error||void 0})):console.log(JSON.stringify({success:w.success,text:w.text,thinking:w.thinking||void 0,toolCalls:w.toolCalls,error:w.error})),w.success||process.exit(1)):w.success?console.log(w.text):(console.error(`Error: ${w.error}`),process.exit(1))}catch(w){t.json?console.log(JSON.stringify({error:w instanceof Error?w.message:String(w)})):console.error(`Error: ${w instanceof Error?w.message:w}`),process.exit(1)}finally{E.dispose();try{await y?.close()}catch{}}}});var pp=T(rs=>{"use strict";Object.defineProperty(rs,"__esModule",{value:!0});rs.isTerminalFrame=gL;rs.isTaggedEvent=hL;rs.encodeRunnerFrame=mL;rs.encodeClientFrame=_L;rs.parseRunnerFrame=EL;rs.parseClientFrame=yL;rs.splitFrames=wL;rs.toWireOptions=SL;function gL(t){return"type"in t&&(t.type==="result"||t.type==="failed")}function hL(t){return"event"in t}function mL(t){return`${JSON.stringify(t)}
524
524
  `}function _L(t){return`${JSON.stringify(t)}
525
525
  `}function EL(t){let e=_w(t);if(!e)return;let n=e.type;if(n==="ready")return{type:"ready",...e.demux===!0?{demux:!0}:{}};if(typeof e.id=="string"&&e.event&&typeof e.event=="object"){let r=e.event.type;return typeof r=="string"&&mw.has(r)?{id:e.id,event:e.event}:void 0}if(n==="result"&&typeof e.id=="string")return{type:"result",id:e.id,...typeof e.nativeSessionId=="string"?{nativeSessionId:e.nativeSessionId}:{}};if(n==="failed"&&typeof e.id=="string")return{type:"failed",id:e.id,message:typeof e.message=="string"?e.message:"Sandbox turn failed"};if(n==="question"&&e.payload&&typeof e.payload=="object")return{type:"question",payload:e.payload,...typeof e.id=="string"?{id:e.id}:{}};if(typeof n=="string"&&mw.has(n))return e}function yL(t){let e=_w(t);if(e){if(e.type==="run"&&typeof e.id=="string"&&typeof e.message=="string"){let n=e.options&&typeof e.options=="object"?e.options:{};return{type:"run",id:e.id,message:e.message,options:n}}if(e.type==="abort"&&typeof e.id=="string")return{type:"abort",id:e.id}}}var mw=new Set(["text","thinking","toolStart","toolEnd","progress","error","done","nativeSessionId","probe"]);function _w(t){let e;try{e=JSON.parse(t)}catch{return}if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function wL(t){let e=t.split(`
526
- `),n=e.pop()??"";return{lines:e.filter(r=>r.trim().length>0),rest:n}}function SL(t,e){let{apiKey:n,...r}=t;return{...r,...e.baseUrl?{baseUrl:e.baseUrl}:{},...e.modelToken?{modelToken:e.modelToken}:{}}}});var yw=T(Zl=>{"use strict";Object.defineProperty(Zl,"__esModule",{value:!0});Zl.RemoteEngine=void 0;var Ew=pl(),Ga=pp(),gp=class{id;displayName;channel;model;logger;onActivity;pending=new Map;buffer="";seq=0;wired=!1;peerDemux=!1;constructor(e){this.id=e.id,this.displayName=e.displayName,this.channel=e.channel,this.model=e.model??{},this.logger=e.logger,this.onActivity=e.onActivity}async stream(e,n,r,s,i){this.wire();let o=`r${++this.seq}`,a=new Promise((l,u)=>{this.pending.set(o,{emitter:r,resolve:l,reject:u,chain:Promise.resolve()})}),c=()=>{this.send({type:"abort",id:o})};i&&(i.aborted?c():i.addEventListener("abort",c,{once:!0}));try{let l=this.model.mintToken?await this.model.mintToken()??this.model.modelToken:this.model.modelToken;this.onActivity?.(),this.send({type:"run",id:o,message:e,options:(0,Ga.toWireOptions)(n,{...this.model,modelToken:l})}),await a}finally{this.pending.delete(o),i?.removeEventListener("abort",c)}}onMaintenance(){}dispose(){}wire(){this.wired||(this.wired=!0,this.channel.input.on("data",e=>{this.buffer+=typeof e=="string"?e:e.toString("utf8");let{lines:n,rest:r}=(0,Ga.splitFrames)(this.buffer);this.buffer=r;for(let s of n){let i=(0,Ga.parseRunnerFrame)(s);if(!i){this.logger?.warn("[RemoteEngine] dropped malformed runner frame");continue}this.onActivity?.(),this.dispatch(i)}}),this.channel.closed?.then(()=>this.failAll(new Error("sandbox channel closed")),e=>this.failAll(e instanceof Error?e:new Error(String(e)))))}dispatch(e){if((0,Ga.isTaggedEvent)(e)){this.enqueue(this.pending.get(e.id),n=>(0,Ew.applyParsedRunnerEvent)(n.emitter,e.event));return}if(e.type==="ready"){this.peerDemux=e.demux===!0;return}if(e.type==="result"){this.settle(e.id,n=>n.resolve(e.nativeSessionId));return}if(e.type==="failed"){this.settle(e.id,n=>n.reject(new Error(e.message)));return}if(e.type==="question"){let n=e.id?[this.pending.get(e.id)]:[...this.pending.values()];for(let r of n)this.enqueue(r,s=>s.emitter.question(e.payload).then(()=>{}));return}for(let n of this.pending.values())this.enqueue(n,r=>(0,Ew.applyParsedRunnerEvent)(r.emitter,e).then(()=>{}))}enqueue(e,n){e&&(e.chain=e.chain.then(()=>n(e)).then(()=>{},r=>{this.logger?.warn(`[RemoteEngine] emitter error: ${r instanceof Error?r.message:String(r)}`)}))}settle(e,n){let r=this.pending.get(e);r&&r.chain.then(()=>n(r))}supportsDemux(){return this.peerDemux}failAll(e){for(let[n,r]of this.pending)r.reject(e),this.pending.delete(n)}send(e){this.channel.output.write((0,Ga.encodeClientFrame)(e))}};Zl.RemoteEngine=gp});var Aw=T(hp=>{"use strict";Object.defineProperty(hp,"__esModule",{value:!0});hp.createSandboxRunner=vL;var AL=yw(),TL=er(),bL=As();function vL(t){let e=new Map,n=new Map,r=new Map,s=1e4,i=(d,f)=>{if(r.size>=s&&!r.has(d)){let p=r.keys().next();p.done||r.delete(p.value)}r.set(d,f)},o=d=>r.get(d)??d,a=async(d,f)=>{await t.admit?.({sandboxKey:d,sessionKey:f});let p=await t.driver.create({sandboxKey:d,image:t.image,tier:t.tier,routes:t.routes,fs:await t.fsFor?.(d)??t.fs??{readonly:[],writable:[]},...t.stateDirFor?{stateDir:await t.stateDirFor(d)}:{},limits:t.limits??{ttlSeconds:1800},env:{...t.env??{},...t.provenanceEnv?.()??{}}}),g=await t.mintModelToken?.(p.id,d),_=p.connect(),h=new AL.RemoteEngine({id:"sandbox",displayName:`Sandbox ${p.id}`,channel:_,model:{baseUrl:t.inferenceBaseUrl,modelToken:g,...t.mintModelToken?{mintToken:async()=>t.mintModelToken(p.id,d)}:{}},logger:t.logger,onActivity:()=>t.driver.touch?.(p)}),y={handle:p,engine:h,dead:!1,sessionKeys:new Set([f]),queue:Promise.resolve()},E=w=>{y.dead=!0;let A=e.get(d)===y;A&&e.delete(d);let S=w instanceof Error?`: ${w.message}`:"";t.logger?.info(`[Sandbox] ${p.id} closed${S}; ${d} will rehydrate on next message`),A&&t.driver.destroy(p).catch(()=>{})};return _.closed?.then(()=>E(),E),e.set(d,y),t.logger?.info(`[Sandbox] created ${p.id} for ${d} (tier ${p.tier})`),y},c=(d,f)=>{let p=e.get(d);if(p&&!p.dead)return Promise.resolve(p);p?.dead&&e.delete(d);let g=n.get(d);if(g)return g;let _=a(d,f).finally(()=>{n.delete(d)});return n.set(d,_),_},l=async(d,f)=>{if(d.engine.supportsDemux())return f(d);let p=d.queue,g;if(d.queue=new Promise(_=>{g=_}),await p,d.dead)throw g(),new Error("sandbox channel closed");try{return await f(d)}finally{g()}};return{run:async d=>{let f=d.sessionId??"default",p=d.sandboxKey??f,g=w=>(w.sessionKeys.add(f),i(f,p),w),_={text:"",thinking:"",toolCalls:[]},h=OL(d.emitter,_),y=()=>_.text===""&&_.thinking===""&&_.toolCalls.length===0,E=async w=>{await w.engine.stream(d.message,{engineId:d.engineId,modelId:d.modelId,workspaceRoot:d.workspaceRoot,additionalDirectories:d.additionalDirectories,sessionId:d.sessionId,permissions:d.permissions,analyticsUserId:d.analyticsUserId,engineHomeUserKey:(0,TL.engineHomeUserKey)((0,bL.currentCredential)()?.userId),turnEnv:d.turnEnv,gatewaySessionKey:d.gatewaySessionKey},h,t.runtime,d.signal)};try{let w=g(await c(p,f));try{await l(w,E)}catch(A){let S=ww(A);if(!/channel closed/i.test(S)||!y())throw A;e.get(p)===w&&e.delete(p),t.logger?.info(`[Sandbox] session ${f} lost its sandbox mid-turn; recreating and retrying once`),await l(g(await c(p,f)),E)}return{success:!0,text:_.text,thinking:_.thinking,toolCalls:_.toolCalls}}catch(w){return{success:!1,text:_.text,thinking:_.thinking,toolCalls:_.toolCalls,error:ww(w)}}},dispose(){for(let[d,f]of e)t.driver.destroy(f.handle).catch(()=>{}),e.delete(d)},sandboxes:()=>[...e.entries()].map(([d,f])=>({sandboxKey:d,sandboxId:f.handle.id,tier:f.handle.tier,sessionKeys:[...f.sessionKeys]})),async destroySession(d){let f=o(d),p=e.get(f);p&&(e.delete(f),await t.driver.destroy(p.handle),t.logger?.info(`[Sandbox] destroyed ${p.handle.id} (${f}${Sw(p,d)})`))},async revokeRoute(d,f){let p=o(d),g=e.get(p);g&&(await t.driver.revoke(g.handle,f),f==="all"&&e.delete(p),t.logger?.info(`[Sandbox] revoked ${f} on ${g.handle.id} (${p}${Sw(g,d)})`))}}}function OL(t,e){return{async thinking(n){e.thinking+=n,await t?.thinking(n)},async text(n){e.text+=n,await t?.text(n)},async toolStart(n,r,s,i){e.toolCalls.push({name:n,input:r}),await t?.toolStart(n,r,s,i)},async toolEnd(n,r,s,i,o){let a=[...e.toolCalls].reverse().find(c=>c.name===n&&c.result===void 0);a&&(a.result=s,a.isError=i),await t?.toolEnd(n,r,s,i,o)},async progress(n){await t?.progress(n)},async question(n){return await t?.question(n),{selected:[],freeText:null,declined:!0}},async error(n){await t?.error(n)},async done(){await t?.done()}}}function ww(t){return t instanceof Error?t.message:String(t)}function Sw(t,e){let n=[...t.sessionKeys].filter(r=>r!==e);return n.length===0?"":`, also ending ${n.length}: ${n.join(", ")}`}});var Ep=T(mn=>{"use strict";var IL=mn&&mn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),PL=mn&&mn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tw=mn&&mn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&IL(n,e,r[s]);return PL(n,e),n}})();Object.defineProperty(mn,"__esModule",{value:!0});mn.CURRENT_LINK=void 0;mn.safeJoin=bw;mn.promoteCurrent=_p;mn.reconcilePinnedPack=NL;mn.readDirAsFiles=vw;var Kt=Tw(require("node:fs")),Ds=Tw(require("node:path")),mp=Ho();mn.CURRENT_LINK="current";function bw(t,e){if(Ds.isAbsolute(e))return;let n=Ds.resolve(t,e),r=t.endsWith(Ds.sep)?t:t+Ds.sep;return n.startsWith(r)?n:void 0}function _p(t,e){let n=Ds.join(t,mn.CURRENT_LINK),r=`${n}.swap-${process.pid}-${Date.now()}`;return Kt.symlinkSync(e,r),Kt.renameSync(r,n),n}async function NL(t){let{pack:e,pinnedVersion:n,packsRoot:r,logger:s}=t,i=Ds.join(r,n);if(Kt.mkdirSync(r,{recursive:!0}),Kt.existsSync(i)){let c=RL(i,e,n,t.publicKeysByKid);if(c.ok)return _p(r,i),{ok:!0,packDir:i,version:n,alreadyPresent:!0};s?.warn(`[Pack] cached ${e}@${n} failed verification (${c.reason}); re-fetching`),Kt.rmSync(i,{recursive:!0,force:!0})}let o;try{o=await t.download(e,n)}catch(c){return{ok:!1,reason:`fetch failed: ${c instanceof Error?c.message:String(c)}`}}if(o.length===0)return{ok:!1,reason:`store returned no files for ${e}@${n}`};let a=Ds.join(r,`.staging-${n}-${process.pid}-${Date.now()}`);try{Kt.mkdirSync(a,{recursive:!0});for(let l of o){let u=bw(a,l.path);if(!u)return Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: entry escapes the pack root (${l.path})`};if(l.link)return Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: symlink entries are not accepted from the store (${l.path})`};Kt.mkdirSync(Ds.dirname(u),{recursive:!0}),Kt.writeFileSync(u,l.content)}let c=Ow(o,e,n,t.publicKeysByKid);return c.ok?(Kt.renameSync(a,i),_p(r,i),s?.info(`[Pack] converged to ${e}@${n} (signature verified)`),{ok:!0,packDir:i,version:n,alreadyPresent:!1}):(Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:c.reason})}catch(c){return Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`staging failed: ${c instanceof Error?c.message:String(c)}`}}}function vw(t){let e=[],n=(r,s)=>{for(let i of Kt.readdirSync(r)){let o=s?`${s}/${i}`:i;if(mp.DIGEST_EXCLUDED_SEGMENTS.has(i))continue;let a=Ds.join(r,i),c=Kt.lstatSync(a);c.isSymbolicLink()?e.push({path:o,content:Buffer.from(Kt.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({path:o,content:Kt.readFileSync(a)})}};return n(t,""),e}function Ow(t,e,n,r){if(Object.keys(r).length===0)return{ok:!1,reason:"no trusted signing keys configured"};let s=t.find(a=>a.path.replace(/\\/g,"/")===mp.PACK_SIGNATURE_FILE);if(!s)return{ok:!1,reason:`${e}@${n} is not signed`};let i=s.content.toString("utf8").trim(),o=(0,mp.verifyPackFromFiles)(i,r,e,n,t);return o.ok?{ok:!0}:{ok:!1,reason:o.reason}}function RL(t,e,n,r){return Ow(vw(t),e,n,r)}});var eu=T(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0});Pe.STORE_ICONS=Pe.STORE_PATHS=Pe.DEFAULT_STORE_BRANCH=Pe.DEFAULT_STORE_REPO=Pe.DEFAULT_STORE_OWNER=void 0;Pe.parseGitHubUrl=Iw;Pe.parseStoreUrl=CL;Pe.formatStoreUrl=kL;Pe.isStoreUrl=$L;Pe.getStorePath=Pw;Pe.getStoreIndexUrl=DL;Pe.getTagsApiUrl=LL;Pe.isForkOfStoreRepo=ML;Pe.formatStorePullRequestError=GL;Pe.DEFAULT_STORE_OWNER="agenthippoai";Pe.DEFAULT_STORE_REPO="agenthippo-store";Pe.DEFAULT_STORE_BRANCH="main";Pe.STORE_PATHS={packs:"agent-packs",skills:"skills",mcp:"mcp",engines:"engines",spotlightViews:"spotlight"};Pe.STORE_ICONS={local:"\u{1F4BE}",remote:"\u2601\uFE0F",installed:"\u2713",pack:"\u{1F4E6}",skill:"\u{1F3AF}",mcp:"\u{1F50C}",engine:"\u2699\uFE0F",view:"\u{1F4CA}"};function Iw(t,e=Pe.DEFAULT_STORE_OWNER,n=Pe.DEFAULT_STORE_REPO){let r=t.trim(),s=r.match(/github\.com\/([^/]+)\/([^/]+)(?:\/tree\/([^/]+)(?:\/(.+))?)?/);if(s){let[,o,a,c,l]=s,u=o===e&&a===n;return{owner:o,repo:a.replace(/\.git$/,""),ref:c,path:l,isStore:u}}let i=r.match(/^([^/]+)\/([^/@]+)(?:@(.+))?$/);if(i){let[,o,a,c]=i;return{owner:o,repo:a,ref:c,isStore:o===e&&a===n}}throw new Error(`Invalid GitHub URL: ${t}`)}function CL(t){let e=t.trim(),n=e.match(/github\.com\/[^/]+\/[^/]+\/tree\/[^/]+\/(.+)/);n&&(e=n[1]),e=e.replace(/^store:\/\//,"");let r;if(e.includes("@")){let[c,l]=e.split("@");e=c,r=l.replace(/^v/,"")}e=e.replace(/\/$/,"");let s=e.split("/");if(s.length<2)throw new Error(`Invalid store URL: ${t}. Expected format: type/slug[@version]`);let i=s[0],o=s.slice(1).join("/"),a;if(i==="agent-packs"||i==="packs"||i==="pack")a="pack";else if(i==="skills"||i==="skill")a="skill";else if(i==="mcp")a="mcp";else if(i==="engines"||i==="engine")a="engine";else if(i==="spotlight"||i==="spotlight-views"||i==="views"||i==="view")a="view";else throw new Error(`Invalid artifact type: ${i}. Expected: pack, skill, mcp, engine, or view`);return{type:a,slug:o,version:r}}function kL(t){let n=`store://${Pw(t.type)}/${t.slug}`;return t.version&&(n+=`@v${t.version}`),n}function $L(t,e=Pe.DEFAULT_STORE_OWNER,n=Pe.DEFAULT_STORE_REPO){let r=t.trim().replace(/^store:\/\//,"");if(/^(agent-packs|packs|pack|skills|skill|mcp|engines|engine|spotlight|spotlight-views|views|view)\//.test(r))return!0;try{let s=Iw(t,e,n);if(s.isStore&&s.path)return/^(agent-packs|skills|mcp|engines|spotlight|spotlight-views)\//.test(s.path)}catch{}return!1}function Pw(t){switch(t){case"pack":return Pe.STORE_PATHS.packs;case"skill":return Pe.STORE_PATHS.skills;case"mcp":return Pe.STORE_PATHS.mcp;case"engine":return Pe.STORE_PATHS.engines;case"view":return Pe.STORE_PATHS.spotlightViews}}function DL(t=Pe.DEFAULT_STORE_OWNER,e=Pe.DEFAULT_STORE_REPO){return`https://${t}.github.io/${e}/store-index.json`}function LL(t=Pe.DEFAULT_STORE_OWNER,e=Pe.DEFAULT_STORE_REPO){return`https://api.github.com/repos/${t}/${e}/git/refs/tags`}function ML(t,e,n){if(!t.fork)return!1;let r=`${e}/${n}`.toLowerCase();return(t.parentFullName??"").toLowerCase()===r}function GL(t,e,n,r){try{let s=JSON.parse(t),i=[s.message,...s.errors?.map(o=>o.message)??[]].filter(Boolean).join(" ");if(i.includes("no history in common")){let o=r?`https://github.com/${r}/${n}`:`your fork of ${e}/${n}`;return`Cannot open pull request: your fork has no shared git history with ${e}/${n}.
526
+ `),n=e.pop()??"";return{lines:e.filter(r=>r.trim().length>0),rest:n}}function SL(t,e){let{apiKey:n,...r}=t;return{...r,...e.baseUrl?{baseUrl:e.baseUrl}:{},...e.modelToken?{modelToken:e.modelToken}:{}}}});var yw=T(Zl=>{"use strict";Object.defineProperty(Zl,"__esModule",{value:!0});Zl.RemoteEngine=void 0;var Ew=pl(),Ga=pp(),gp=class{id;displayName;channel;model;logger;onActivity;pending=new Map;buffer="";seq=0;wired=!1;peerDemux=!1;constructor(e){this.id=e.id,this.displayName=e.displayName,this.channel=e.channel,this.model=e.model??{},this.logger=e.logger,this.onActivity=e.onActivity}async stream(e,n,r,s,i){this.wire();let o=`r${++this.seq}`,a=new Promise((l,u)=>{this.pending.set(o,{emitter:r,resolve:l,reject:u,chain:Promise.resolve()})}),c=()=>{this.send({type:"abort",id:o})};i&&(i.aborted?c():i.addEventListener("abort",c,{once:!0}));try{let l=this.model.mintToken?await this.model.mintToken()??this.model.modelToken:this.model.modelToken;this.onActivity?.(),this.send({type:"run",id:o,message:e,options:(0,Ga.toWireOptions)(n,{...this.model,modelToken:l})}),await a}finally{this.pending.delete(o),i?.removeEventListener("abort",c)}}onMaintenance(){}dispose(){}wire(){this.wired||(this.wired=!0,this.channel.input.on("data",e=>{this.buffer+=typeof e=="string"?e:e.toString("utf8");let{lines:n,rest:r}=(0,Ga.splitFrames)(this.buffer);this.buffer=r;for(let s of n){let i=(0,Ga.parseRunnerFrame)(s);if(!i){this.logger?.warn("[RemoteEngine] dropped malformed runner frame");continue}this.onActivity?.(),this.dispatch(i)}}),this.channel.closed?.then(()=>this.failAll(new Error("sandbox channel closed")),e=>this.failAll(e instanceof Error?e:new Error(String(e)))))}dispatch(e){if((0,Ga.isTaggedEvent)(e)){this.enqueue(this.pending.get(e.id),n=>(0,Ew.applyParsedRunnerEvent)(n.emitter,e.event));return}if(e.type==="ready"){this.peerDemux=e.demux===!0;return}if(e.type==="result"){this.settle(e.id,n=>n.resolve(e.nativeSessionId));return}if(e.type==="failed"){this.settle(e.id,n=>n.reject(new Error(e.message)));return}if(e.type==="question"){let n=e.id?[this.pending.get(e.id)]:[...this.pending.values()];for(let r of n)this.enqueue(r,s=>s.emitter.question(e.payload).then(()=>{}));return}for(let n of this.pending.values())this.enqueue(n,r=>(0,Ew.applyParsedRunnerEvent)(r.emitter,e).then(()=>{}))}enqueue(e,n){e&&(e.chain=e.chain.then(()=>n(e)).then(()=>{},r=>{this.logger?.warn(`[RemoteEngine] emitter error: ${r instanceof Error?r.message:String(r)}`)}))}settle(e,n){let r=this.pending.get(e);r&&r.chain.then(()=>n(r))}supportsDemux(){return this.peerDemux}failAll(e){for(let[n,r]of this.pending)r.reject(e),this.pending.delete(n)}send(e){this.channel.output.write((0,Ga.encodeClientFrame)(e))}};Zl.RemoteEngine=gp});var Aw=T(hp=>{"use strict";Object.defineProperty(hp,"__esModule",{value:!0});hp.createSandboxRunner=vL;var AL=yw(),TL=er(),bL=As();function vL(t){let e=new Map,n=new Map,r=Math.min(3e4,Math.max(1e3,(t.limits?.ttlSeconds??1800)*1e3/3)),s=new Map,i=1e4,o=(d,g)=>{if(s.size>=i&&!s.has(d)){let p=s.keys().next();p.done||s.delete(p.value)}s.set(d,g)},a=d=>s.get(d)??d,c=async(d,g)=>{await t.admit?.({sandboxKey:d,sessionKey:g});let p=await t.driver.create({sandboxKey:d,image:t.image,tier:t.tier,routes:t.routes,fs:await t.fsFor?.(d)??t.fs??{readonly:[],writable:[]},...t.stateDirFor?{stateDir:await t.stateDirFor(d)}:{},limits:t.limits??{ttlSeconds:1800},env:{...t.env??{},...t.provenanceEnv?.()??{}}}),_=await t.mintModelToken?.(p.id,d),h=p.connect(),y=new AL.RemoteEngine({id:"sandbox",displayName:`Sandbox ${p.id}`,channel:h,model:{baseUrl:t.inferenceBaseUrl,modelToken:_,...t.mintModelToken?{mintToken:async()=>t.mintModelToken(p.id,d)}:{}},logger:t.logger,onActivity:()=>t.driver.touch?.(p)}),E={handle:p,engine:y,dead:!1,sessionKeys:new Set([g]),queue:Promise.resolve()},w=A=>{E.dead=!0;let S=e.get(d)===E;S&&e.delete(d);let C=A instanceof Error?`: ${A.message}`:"";t.logger?.info(`[Sandbox] ${p.id} closed${C}; ${d} will rehydrate on next message`),S&&t.driver.destroy(p).catch(()=>{})};return h.closed?.then(()=>w(),w),e.set(d,E),t.logger?.info(`[Sandbox] created ${p.id} for ${d} (tier ${p.tier})`),E},l=(d,g)=>{let p=e.get(d);if(p&&!p.dead)return Promise.resolve(p);p?.dead&&e.delete(d);let _=n.get(d);if(_)return _;let h=c(d,g).finally(()=>{n.delete(d)});return n.set(d,h),h},u=async(d,g)=>{if(d.engine.supportsDemux())return g(d);let p=d.queue,_;if(d.queue=new Promise(h=>{_=h}),await p,d.dead)throw _(),new Error("sandbox channel closed");try{return await g(d)}finally{_()}};return{run:async d=>{let g=d.sessionId??"default",p=d.sandboxKey??g,_=S=>(S.sessionKeys.add(g),o(g,p),S),h={text:"",thinking:"",toolCalls:[]},y=OL(d.emitter,h),E=()=>h.text===""&&h.thinking===""&&h.toolCalls.length===0,w=async S=>{let C=setInterval(()=>t.driver.touch?.(S.handle),r);C.unref?.();try{await A(S)}finally{clearInterval(C)}},A=async S=>{await S.engine.stream(d.message,{engineId:d.engineId,modelId:d.modelId,workspaceRoot:d.workspaceRoot,additionalDirectories:d.additionalDirectories,sessionId:d.sessionId,permissions:d.permissions,analyticsUserId:d.analyticsUserId,engineHomeUserKey:(0,TL.engineHomeUserKey)((0,bL.currentCredential)()?.userId),turnEnv:d.turnEnv,gatewaySessionKey:d.gatewaySessionKey},y,t.runtime,d.signal)};try{let S=_(await l(p,g));try{await u(S,w)}catch(C){let b=ww(C);if(!/channel closed/i.test(b)||!E())throw C;e.get(p)===S&&e.delete(p),t.logger?.info(`[Sandbox] session ${g} lost its sandbox mid-turn; recreating and retrying once`),await u(_(await l(p,g)),w)}return{success:!0,text:h.text,thinking:h.thinking,toolCalls:h.toolCalls}}catch(S){return{success:!1,text:h.text,thinking:h.thinking,toolCalls:h.toolCalls,error:ww(S)}}},dispose(){for(let[d,g]of e)t.driver.destroy(g.handle).catch(()=>{}),e.delete(d)},sandboxes:()=>[...e.entries()].map(([d,g])=>({sandboxKey:d,sandboxId:g.handle.id,tier:g.handle.tier,sessionKeys:[...g.sessionKeys]})),async destroySession(d){let g=a(d),p=e.get(g);p&&(e.delete(g),await t.driver.destroy(p.handle),t.logger?.info(`[Sandbox] destroyed ${p.handle.id} (${g}${Sw(p,d)})`))},async revokeRoute(d,g){let p=a(d),_=e.get(p);_&&(await t.driver.revoke(_.handle,g),g==="all"&&e.delete(p),t.logger?.info(`[Sandbox] revoked ${g} on ${_.handle.id} (${p}${Sw(_,d)})`))}}}function OL(t,e){return{async thinking(n){e.thinking+=n,await t?.thinking(n)},async text(n){e.text+=n,await t?.text(n)},async toolStart(n,r,s,i){e.toolCalls.push({name:n,input:r}),await t?.toolStart(n,r,s,i)},async toolEnd(n,r,s,i,o){let a=[...e.toolCalls].reverse().find(c=>c.name===n&&c.result===void 0);a&&(a.result=s,a.isError=i),await t?.toolEnd(n,r,s,i,o)},async progress(n){await t?.progress(n)},async question(n){return await t?.question(n),{selected:[],freeText:null,declined:!0}},async error(n){await t?.error(n)},async done(){await t?.done()}}}function ww(t){return t instanceof Error?t.message:String(t)}function Sw(t,e){let n=[...t.sessionKeys].filter(r=>r!==e);return n.length===0?"":`, also ending ${n.length}: ${n.join(", ")}`}});var Ep=T(mn=>{"use strict";var IL=mn&&mn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),PL=mn&&mn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tw=mn&&mn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&IL(n,e,r[s]);return PL(n,e),n}})();Object.defineProperty(mn,"__esModule",{value:!0});mn.CURRENT_LINK=void 0;mn.safeJoin=bw;mn.promoteCurrent=_p;mn.reconcilePinnedPack=NL;mn.readDirAsFiles=vw;var Kt=Tw(require("node:fs")),Ds=Tw(require("node:path")),mp=Ho();mn.CURRENT_LINK="current";function bw(t,e){if(Ds.isAbsolute(e))return;let n=Ds.resolve(t,e),r=t.endsWith(Ds.sep)?t:t+Ds.sep;return n.startsWith(r)?n:void 0}function _p(t,e){let n=Ds.join(t,mn.CURRENT_LINK),r=`${n}.swap-${process.pid}-${Date.now()}`;return Kt.symlinkSync(e,r),Kt.renameSync(r,n),n}async function NL(t){let{pack:e,pinnedVersion:n,packsRoot:r,logger:s}=t,i=Ds.join(r,n);if(Kt.mkdirSync(r,{recursive:!0}),Kt.existsSync(i)){let c=RL(i,e,n,t.publicKeysByKid);if(c.ok)return _p(r,i),{ok:!0,packDir:i,version:n,alreadyPresent:!0};s?.warn(`[Pack] cached ${e}@${n} failed verification (${c.reason}); re-fetching`),Kt.rmSync(i,{recursive:!0,force:!0})}let o;try{o=await t.download(e,n)}catch(c){return{ok:!1,reason:`fetch failed: ${c instanceof Error?c.message:String(c)}`}}if(o.length===0)return{ok:!1,reason:`store returned no files for ${e}@${n}`};let a=Ds.join(r,`.staging-${n}-${process.pid}-${Date.now()}`);try{Kt.mkdirSync(a,{recursive:!0});for(let l of o){let u=bw(a,l.path);if(!u)return Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: entry escapes the pack root (${l.path})`};if(l.link)return Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: symlink entries are not accepted from the store (${l.path})`};Kt.mkdirSync(Ds.dirname(u),{recursive:!0}),Kt.writeFileSync(u,l.content)}let c=Ow(o,e,n,t.publicKeysByKid);return c.ok?(Kt.renameSync(a,i),_p(r,i),s?.info(`[Pack] converged to ${e}@${n} (signature verified)`),{ok:!0,packDir:i,version:n,alreadyPresent:!1}):(Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:c.reason})}catch(c){return Kt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`staging failed: ${c instanceof Error?c.message:String(c)}`}}}function vw(t){let e=[],n=(r,s)=>{for(let i of Kt.readdirSync(r)){let o=s?`${s}/${i}`:i;if(mp.DIGEST_EXCLUDED_SEGMENTS.has(i))continue;let a=Ds.join(r,i),c=Kt.lstatSync(a);c.isSymbolicLink()?e.push({path:o,content:Buffer.from(Kt.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({path:o,content:Kt.readFileSync(a)})}};return n(t,""),e}function Ow(t,e,n,r){if(Object.keys(r).length===0)return{ok:!1,reason:"no trusted signing keys configured"};let s=t.find(a=>a.path.replace(/\\/g,"/")===mp.PACK_SIGNATURE_FILE);if(!s)return{ok:!1,reason:`${e}@${n} is not signed`};let i=s.content.toString("utf8").trim(),o=(0,mp.verifyPackFromFiles)(i,r,e,n,t);return o.ok?{ok:!0}:{ok:!1,reason:o.reason}}function RL(t,e,n,r){return Ow(vw(t),e,n,r)}});var eu=T(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0});Pe.STORE_ICONS=Pe.STORE_PATHS=Pe.DEFAULT_STORE_BRANCH=Pe.DEFAULT_STORE_REPO=Pe.DEFAULT_STORE_OWNER=void 0;Pe.parseGitHubUrl=Iw;Pe.parseStoreUrl=CL;Pe.formatStoreUrl=kL;Pe.isStoreUrl=$L;Pe.getStorePath=Pw;Pe.getStoreIndexUrl=DL;Pe.getTagsApiUrl=LL;Pe.isForkOfStoreRepo=ML;Pe.formatStorePullRequestError=GL;Pe.DEFAULT_STORE_OWNER="agenthippoai";Pe.DEFAULT_STORE_REPO="agenthippo-store";Pe.DEFAULT_STORE_BRANCH="main";Pe.STORE_PATHS={packs:"agent-packs",skills:"skills",mcp:"mcp",engines:"engines",spotlightViews:"spotlight"};Pe.STORE_ICONS={local:"\u{1F4BE}",remote:"\u2601\uFE0F",installed:"\u2713",pack:"\u{1F4E6}",skill:"\u{1F3AF}",mcp:"\u{1F50C}",engine:"\u2699\uFE0F",view:"\u{1F4CA}"};function Iw(t,e=Pe.DEFAULT_STORE_OWNER,n=Pe.DEFAULT_STORE_REPO){let r=t.trim(),s=r.match(/github\.com\/([^/]+)\/([^/]+)(?:\/tree\/([^/]+)(?:\/(.+))?)?/);if(s){let[,o,a,c,l]=s,u=o===e&&a===n;return{owner:o,repo:a.replace(/\.git$/,""),ref:c,path:l,isStore:u}}let i=r.match(/^([^/]+)\/([^/@]+)(?:@(.+))?$/);if(i){let[,o,a,c]=i;return{owner:o,repo:a,ref:c,isStore:o===e&&a===n}}throw new Error(`Invalid GitHub URL: ${t}`)}function CL(t){let e=t.trim(),n=e.match(/github\.com\/[^/]+\/[^/]+\/tree\/[^/]+\/(.+)/);n&&(e=n[1]),e=e.replace(/^store:\/\//,"");let r;if(e.includes("@")){let[c,l]=e.split("@");e=c,r=l.replace(/^v/,"")}e=e.replace(/\/$/,"");let s=e.split("/");if(s.length<2)throw new Error(`Invalid store URL: ${t}. Expected format: type/slug[@version]`);let i=s[0],o=s.slice(1).join("/"),a;if(i==="agent-packs"||i==="packs"||i==="pack")a="pack";else if(i==="skills"||i==="skill")a="skill";else if(i==="mcp")a="mcp";else if(i==="engines"||i==="engine")a="engine";else if(i==="spotlight"||i==="spotlight-views"||i==="views"||i==="view")a="view";else throw new Error(`Invalid artifact type: ${i}. Expected: pack, skill, mcp, engine, or view`);return{type:a,slug:o,version:r}}function kL(t){let n=`store://${Pw(t.type)}/${t.slug}`;return t.version&&(n+=`@v${t.version}`),n}function $L(t,e=Pe.DEFAULT_STORE_OWNER,n=Pe.DEFAULT_STORE_REPO){let r=t.trim().replace(/^store:\/\//,"");if(/^(agent-packs|packs|pack|skills|skill|mcp|engines|engine|spotlight|spotlight-views|views|view)\//.test(r))return!0;try{let s=Iw(t,e,n);if(s.isStore&&s.path)return/^(agent-packs|skills|mcp|engines|spotlight|spotlight-views)\//.test(s.path)}catch{}return!1}function Pw(t){switch(t){case"pack":return Pe.STORE_PATHS.packs;case"skill":return Pe.STORE_PATHS.skills;case"mcp":return Pe.STORE_PATHS.mcp;case"engine":return Pe.STORE_PATHS.engines;case"view":return Pe.STORE_PATHS.spotlightViews}}function DL(t=Pe.DEFAULT_STORE_OWNER,e=Pe.DEFAULT_STORE_REPO){return`https://${t}.github.io/${e}/store-index.json`}function LL(t=Pe.DEFAULT_STORE_OWNER,e=Pe.DEFAULT_STORE_REPO){return`https://api.github.com/repos/${t}/${e}/git/refs/tags`}function ML(t,e,n){if(!t.fork)return!1;let r=`${e}/${n}`.toLowerCase();return(t.parentFullName??"").toLowerCase()===r}function GL(t,e,n,r){try{let s=JSON.parse(t),i=[s.message,...s.errors?.map(o=>o.message)??[]].filter(Boolean).join(" ");if(i.includes("no history in common")){let o=r?`https://github.com/${r}/${n}`:`your fork of ${e}/${n}`;return`Cannot open pull request: your fork has no shared git history with ${e}/${n}.
527
527
 
528
528
  Open ${o} on GitHub, use "Sync fork" \u2192 "Update branch", then publish again.
529
- If sync is unavailable, delete or rename the fork so AgentIDE can create a fresh fork of the store.`}return i?`Failed to create PR: ${i}`:`Failed to create PR: ${t}`}catch{return`Failed to create PR: ${t}`}}});var Sp=T(Gr=>{"use strict";var UL=Gr&&Gr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),HL=Gr&&Gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wp=Gr&&Gr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&UL(n,e,r[s]);return HL(n,e),n}})();Object.defineProperty(Gr,"__esModule",{value:!0});Gr.LocalRegistry=void 0;Gr.getRegistry=xL;var Ua=wp(require("fs")),Nw=wp(require("path")),jL=wp(require("os"));function Rw(){return{packs:{},skills:{},mcp:{}}}var tu=class{data=null;registryPath;constructor(e,n){this.registryPath=e||Nw.join(jL.homedir(),".agentide","registry.json")}ensureDir(){let e=Nw.dirname(this.registryPath);Ua.existsSync(e)||Ua.mkdirSync(e,{recursive:!0})}load(){if(this.data)return this.data;if(Ua.existsSync(this.registryPath))try{let e=Ua.readFileSync(this.registryPath,"utf-8");this.data=JSON.parse(e)}catch{this.data=Rw()}else this.data=Rw();return this.data}save(){this.data&&(this.ensureDir(),Ua.writeFileSync(this.registryPath,JSON.stringify(this.data,null,2)))}async registerPack(e){let n=this.load();n.packs[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,githubOwner:e.github?.owner,githubRepo:e.github?.repo,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,stars:e.stats.stars,updatedAt:Date.now()},this.save()}async getPack(e){return this.load().packs[e]||null}async listPacks(){let e=this.load();return Object.values(e.packs).sort((n,r)=>r.installs-n.installs)}async trackPackInstall(e){let r=this.load().packs[e];r&&(r.installs+=1,r.updatedAt=Date.now(),this.save())}async registerSkill(e){let n=this.load(),s=n.skills[e.slug]?.installedTo||[];e.agentPackId&&!s.includes(e.agentPackId)&&(s=[...s,e.agentPackId]),n.skills[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,githubOwner:e.github?.owner,githubRepo:e.github?.repo,githubPath:e.github?.path,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,updatedAt:Date.now(),installedTo:s},this.save()}async getSkill(e){return this.load().skills[e]||null}async listSkills(){let e=this.load();return Object.values(e.skills).sort((n,r)=>r.installs-n.installs)}async registerMcp(e){let n=this.load(),s=n.mcp[e.slug]?.installedTo||[];e.agentPackId&&!s.includes(e.agentPackId)&&(s=[...s,e.agentPackId]),n.mcp[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,transport:e.transport,githubOwner:e.github?.owner,githubRepo:e.github?.repo,npmPackage:e.npmPackage,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,updatedAt:Date.now(),installedTo:s},this.save()}async getMcp(e){return this.load().mcp[e]||null}async listMcp(){let e=this.load();return Object.values(e.mcp).sort((n,r)=>r.installs-n.installs)}async isSkillInstalledTo(e,n){return(await this.getSkill(e))?.installedTo?.includes(n)??!1}async isMcpInstalledTo(e,n){return(await this.getMcp(e))?.installedTo?.includes(n)??!1}async unregisterSkillFromPack(e,n){let s=this.load().skills[e];s&&s.installedTo&&(s.installedTo=s.installedTo.filter(i=>i!==n),s.updatedAt=Date.now(),this.save())}async unregisterMcpFromPack(e,n){let s=this.load().mcp[e];s&&s.installedTo&&(s.installedTo=s.installedTo.filter(i=>i!==n),s.updatedAt=Date.now(),this.save())}async search(e,n){let r=n?.types||["pack","skill","mcp"],s=n?.limit||20,i=[],a=e.toLowerCase().split(/\s+/).filter(l=>l.length>0),c=(l,u)=>{let d=`${l.slug} ${l.displayName} ${l.description||""} ${l.tags.join(" ")}`.toLowerCase(),f=0;for(let p of a)d.includes(p)&&(f+=10);return f===0?0:f+u/100};if(r.includes("pack")){let l=await this.listPacks();for(let u of l){let d=c(u,u.installs);d>0&&i.push({type:"pack",slug:u.slug,displayName:u.displayName,description:u.description,score:d,data:u})}}if(r.includes("skill")){let l=await this.listSkills();for(let u of l){let d=c(u,u.installs);d>0&&i.push({type:"skill",slug:u.slug,displayName:u.displayName,description:u.description,score:d,data:u})}}if(r.includes("mcp")){let l=await this.listMcp();for(let u of l){let d=c(u,u.installs);d>0&&i.push({type:"mcp",slug:u.slug,displayName:u.displayName,description:u.description,score:d,data:u})}}return i.sort((l,u)=>u.score-l.score).slice(0,s)}};Gr.LocalRegistry=tu;var yp=null;function xL(t){return yp||(yp=new tu(void 0,t)),yp}});var Ap=T((exports,module)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.formatStoreUrl=exports.parseStoreUrl=exports.STORE_CONFIG=exports.getRegistry=exports.formatStorePullRequestError=exports.isForkOfStoreRepo=exports.getTagsApiUrl=exports.getStoreIndexUrl=exports.getStorePath=exports.DEFAULT_STORE_BRANCH=exports.DEFAULT_STORE_REPO=exports.DEFAULT_STORE_OWNER=exports.STORE_PATHS=exports.STORE_ICONS=void 0;exports.listStoreVersions=listStoreVersions;exports.getLatestStoreVersion=getLatestStoreVersion;exports.downloadFromStore=downloadFromStore;exports.downloadFromExternalGitHub=downloadFromExternalGitHub;exports.canPublishDirectlyToStore=canPublishDirectlyToStore;exports.publishToStore=publishToStore;exports.parseGitHubUrl=parseGitHubUrl;exports.detectArtifactType=detectArtifactType;exports.isStoreUrl=isStoreUrl;exports.listStoreIndex=listStoreIndex;var utils_1=dn(),branding_1=ot(),github_1=ya(),shared_1=eu(),shared_2=eu();Object.defineProperty(exports,"STORE_ICONS",{enumerable:!0,get:function(){return shared_2.STORE_ICONS}});Object.defineProperty(exports,"STORE_PATHS",{enumerable:!0,get:function(){return shared_2.STORE_PATHS}});Object.defineProperty(exports,"DEFAULT_STORE_OWNER",{enumerable:!0,get:function(){return shared_2.DEFAULT_STORE_OWNER}});Object.defineProperty(exports,"DEFAULT_STORE_REPO",{enumerable:!0,get:function(){return shared_2.DEFAULT_STORE_REPO}});Object.defineProperty(exports,"DEFAULT_STORE_BRANCH",{enumerable:!0,get:function(){return shared_2.DEFAULT_STORE_BRANCH}});Object.defineProperty(exports,"getStorePath",{enumerable:!0,get:function(){return shared_2.getStorePath}});Object.defineProperty(exports,"getStoreIndexUrl",{enumerable:!0,get:function(){return shared_2.getStoreIndexUrl}});Object.defineProperty(exports,"getTagsApiUrl",{enumerable:!0,get:function(){return shared_2.getTagsApiUrl}});Object.defineProperty(exports,"isForkOfStoreRepo",{enumerable:!0,get:function(){return shared_2.isForkOfStoreRepo}});Object.defineProperty(exports,"formatStorePullRequestError",{enumerable:!0,get:function(){return shared_2.formatStorePullRequestError}});var index_1=Sp();Object.defineProperty(exports,"getRegistry",{enumerable:!0,get:function(){return index_1.getRegistry}});function getStoreRepo(){let repoEnv=process.env.AGENTHIPPO_STORE_REPO?.trim();if(repoEnv){let t=repoEnv.match(/^(?:https?:\/\/github\.com\/)?([^/]+)\/([^/]+?)(?:\.git)?$/);if(t)return{owner:t[1],repo:t[2]};let e=repoEnv.split("/").filter(Boolean);if(e.length===2)return{owner:e[0],repo:e[1]}}try{let vscode=eval("require")("vscode"),config=vscode.workspace.getConfiguration("agentide"),storeUrl=config.get("storeRepo");if(storeUrl){let t=storeUrl.match(/^(?:https?:\/\/github\.com\/)?([^/]+)\/([^/]+?)(?:\.git)?$/);if(t)return{owner:t[1],repo:t[2]}}}catch{}return{owner:shared_1.DEFAULT_STORE_OWNER,repo:shared_1.DEFAULT_STORE_REPO}}exports.STORE_CONFIG={get owner(){return getStoreRepo().owner},get repo(){return getStoreRepo().repo},defaultBranch:shared_1.DEFAULT_STORE_BRANCH,paths:shared_1.STORE_PATHS};async function listStoreVersions(t,e){let n=`${(0,shared_1.getStorePath)(t)}/${e}/v`,r=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/git/refs/tags`,s=await fetch(r,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!s.ok&&(s.status===401||s.status===403||s.status===429)){let a=await(0,github_1.getGitHubToken)();s=await fetch(r,{headers:{Authorization:`Bearer ${a}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}})}if(!s.ok){if(s.status===404)return[];throw new Error(`Failed to list tags: ${s.statusText}`)}let i=await s.json(),o=[];for(let{ref:a}of i){let c=a.replace("refs/tags/","");if(c.startsWith(n)){let l=c.slice(n.length-1);o.push({version:l.replace(/^v/,""),tagName:c,isPrerelease:/-(alpha|beta|rc|pre)/.test(l)})}}return o.sort((a,c)=>c.version.localeCompare(a.version,void 0,{numeric:!0}))}async function getLatestStoreVersion(t,e,n=!1){let r=await listStoreVersions(t,e);return n?r[0]||null:r.find(s=>!s.isPrerelease)||null}var zlib_1=require("zlib");function parseTar(t){let e=new Map,n=0,r,s=i=>i.toString("utf-8").replace(/\0/g,"").trim();for(;n<t.length-512;){let i=t.subarray(n,n+512);if(i.every(g=>g===0))break;let o=s(i.subarray(0,100)),a=s(i.subarray(345,500)),c=s(i.subarray(124,136)),l=i[156],u=parseInt(c,8)||0,d=t.subarray(n+512,n+512+u),f=512+Math.ceil(u/512)*512;if(l===120||l===103){let g=d.toString("utf-8").match(/\d+ path=([^\n]+)\n/);g&&(r=g[1]),n+=f;continue}if(l===76){r=s(d),n+=f;continue}let p=r??(a?`${a}/${o}`:o);r=void 0,p&&(l===0||l===48)&&e.set(p,Buffer.from(d)),n+=f}return e}async function downloadFromStore(t,e){let{type:n,slug:r,version:s,includePrerelease:i}=t,o=(0,shared_1.getStorePath)(n),a;if(s==="main"||s==="latest")a=exports.STORE_CONFIG.defaultBranch,e&&(0,utils_1.logInfo)(e,`[Store] Using ${a} branch (latest)`);else if(s)a=`${o}/${r}/v${s.replace(/^v/,"")}`;else{let h=await getLatestStoreVersion(n,r,i);h?(a=h.tagName,e&&(0,utils_1.logInfo)(e,`[Store] Using latest version: ${h.version}`)):(a=exports.STORE_CONFIG.defaultBranch,e&&(0,utils_1.logInfo)(e,`[Store] No version tags found, using ${a} branch`))}e&&(0,utils_1.logInfo)(e,`[Store] Downloading ${n}/${r} at ${a}`);let c=encodeURIComponent(a),l=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/tarball/${c}`,u=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!u.ok){if(u.status===401||u.status===403||u.status===404||u.status===429){e&&(0,utils_1.logInfo)(e,"[Store] Requires authentication, signing in...");let h=await(0,github_1.getGitHubToken)();u=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${h}`},redirect:"follow"})}if(!u.ok)throw new Error(`Version ${s||"latest"} not found for ${n} "${r}"`)}let d=Buffer.from(await u.arrayBuffer()),f=(0,zlib_1.gunzipSync)(d),p=parseTar(f),g=`${o}/${r}/`,_=[];for(let[h,y]of p){let E=h.indexOf("/");if(E===-1)continue;let w=h.slice(E+1);if(w.startsWith(g)){let A=w.slice(g.length);A&&(_.push({path:A,content:y}),e&&(0,utils_1.logInfo)(e,`[Store] \u2193 ${A}`))}}return _}async function downloadFromExternalGitHub(t,e){let{owner:n,repo:r,ref:s="main",path:i}=t;e&&(0,utils_1.logInfo)(e,`[GitHub] Downloading ${n}/${r}${i?`/${i}`:""} at ${s}`);let o=encodeURIComponent(s),a=`https://api.github.com/repos/${n}/${r}/tarball/${o}`,c=await fetch(a,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!c.ok){if(c.status===401||c.status===403||c.status===404||c.status===429){e&&(0,utils_1.logInfo)(e,"[GitHub] Requires authentication, signing in...");let _=await(0,github_1.getGitHubToken)();c=await fetch(a,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${_}`},redirect:"follow"})}if(!c.ok)throw new Error(`Failed to download from ${n}/${r}@${s}: ${c.statusText}`)}let l=Buffer.from(await c.arrayBuffer()),u=(0,zlib_1.gunzipSync)(l),d=parseTar(u),f="";for(let _ of d.keys())if(_.includes("/")){f=_.split("/")[0]+"/";break}let p=i?`${f}${i}/`:f,g=[];for(let[_,h]of d)if(_.startsWith(p)){let y=_.slice(p.length);y&&!y.endsWith("/")&&g.push({path:y,content:h.toString("utf-8")})}if(g.length===0)throw new Error(`No files found in ${n}/${r}${i?`/${i}`:""} at ${s}`);return e&&(0,utils_1.logInfo)(e,`[GitHub] Downloaded ${g.length} files`),g}async function getRepoForkMetadata(t,e){let n=await(0,github_1.getGitHubToken)(),r=await fetch(`https://api.github.com/repos/${t}/${e}`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(r.status===404)return null;if(!r.ok)throw new Error(`Failed to inspect repo ${t}/${e}: ${r.statusText}`);let s=await r.json();return{fork:s.fork===!0,parentFullName:s.parent?.full_name}}function assertStoreFork(t,e,n){if(!(0,shared_1.isForkOfStoreRepo)(n,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo))throw new Error(`Your GitHub repo ${t}/${e} is not a fork of ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}.
529
+ If sync is unavailable, delete or rename the fork so AgentIDE can create a fresh fork of the store.`}return i?`Failed to create PR: ${i}`:`Failed to create PR: ${t}`}catch{return`Failed to create PR: ${t}`}}});var Sp=T(Gr=>{"use strict";var UL=Gr&&Gr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),HL=Gr&&Gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wp=Gr&&Gr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&UL(n,e,r[s]);return HL(n,e),n}})();Object.defineProperty(Gr,"__esModule",{value:!0});Gr.LocalRegistry=void 0;Gr.getRegistry=xL;var Ua=wp(require("fs")),Nw=wp(require("path")),jL=wp(require("os"));function Rw(){return{packs:{},skills:{},mcp:{}}}var tu=class{data=null;registryPath;constructor(e,n){this.registryPath=e||Nw.join(jL.homedir(),".agentide","registry.json")}ensureDir(){let e=Nw.dirname(this.registryPath);Ua.existsSync(e)||Ua.mkdirSync(e,{recursive:!0})}load(){if(this.data)return this.data;if(Ua.existsSync(this.registryPath))try{let e=Ua.readFileSync(this.registryPath,"utf-8");this.data=JSON.parse(e)}catch{this.data=Rw()}else this.data=Rw();return this.data}save(){this.data&&(this.ensureDir(),Ua.writeFileSync(this.registryPath,JSON.stringify(this.data,null,2)))}async registerPack(e){let n=this.load();n.packs[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,githubOwner:e.github?.owner,githubRepo:e.github?.repo,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,stars:e.stats.stars,updatedAt:Date.now()},this.save()}async getPack(e){return this.load().packs[e]||null}async listPacks(){let e=this.load();return Object.values(e.packs).sort((n,r)=>r.installs-n.installs)}async trackPackInstall(e){let r=this.load().packs[e];r&&(r.installs+=1,r.updatedAt=Date.now(),this.save())}async registerSkill(e){let n=this.load(),s=n.skills[e.slug]?.installedTo||[];e.agentPackId&&!s.includes(e.agentPackId)&&(s=[...s,e.agentPackId]),n.skills[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,githubOwner:e.github?.owner,githubRepo:e.github?.repo,githubPath:e.github?.path,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,updatedAt:Date.now(),installedTo:s},this.save()}async getSkill(e){return this.load().skills[e]||null}async listSkills(){let e=this.load();return Object.values(e.skills).sort((n,r)=>r.installs-n.installs)}async registerMcp(e){let n=this.load(),s=n.mcp[e.slug]?.installedTo||[];e.agentPackId&&!s.includes(e.agentPackId)&&(s=[...s,e.agentPackId]),n.mcp[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,transport:e.transport,githubOwner:e.github?.owner,githubRepo:e.github?.repo,npmPackage:e.npmPackage,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,updatedAt:Date.now(),installedTo:s},this.save()}async getMcp(e){return this.load().mcp[e]||null}async listMcp(){let e=this.load();return Object.values(e.mcp).sort((n,r)=>r.installs-n.installs)}async isSkillInstalledTo(e,n){return(await this.getSkill(e))?.installedTo?.includes(n)??!1}async isMcpInstalledTo(e,n){return(await this.getMcp(e))?.installedTo?.includes(n)??!1}async unregisterSkillFromPack(e,n){let s=this.load().skills[e];s&&s.installedTo&&(s.installedTo=s.installedTo.filter(i=>i!==n),s.updatedAt=Date.now(),this.save())}async unregisterMcpFromPack(e,n){let s=this.load().mcp[e];s&&s.installedTo&&(s.installedTo=s.installedTo.filter(i=>i!==n),s.updatedAt=Date.now(),this.save())}async search(e,n){let r=n?.types||["pack","skill","mcp"],s=n?.limit||20,i=[],a=e.toLowerCase().split(/\s+/).filter(l=>l.length>0),c=(l,u)=>{let f=`${l.slug} ${l.displayName} ${l.description||""} ${l.tags.join(" ")}`.toLowerCase(),d=0;for(let g of a)f.includes(g)&&(d+=10);return d===0?0:d+u/100};if(r.includes("pack")){let l=await this.listPacks();for(let u of l){let f=c(u,u.installs);f>0&&i.push({type:"pack",slug:u.slug,displayName:u.displayName,description:u.description,score:f,data:u})}}if(r.includes("skill")){let l=await this.listSkills();for(let u of l){let f=c(u,u.installs);f>0&&i.push({type:"skill",slug:u.slug,displayName:u.displayName,description:u.description,score:f,data:u})}}if(r.includes("mcp")){let l=await this.listMcp();for(let u of l){let f=c(u,u.installs);f>0&&i.push({type:"mcp",slug:u.slug,displayName:u.displayName,description:u.description,score:f,data:u})}}return i.sort((l,u)=>u.score-l.score).slice(0,s)}};Gr.LocalRegistry=tu;var yp=null;function xL(t){return yp||(yp=new tu(void 0,t)),yp}});var Ap=T((exports,module)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.formatStoreUrl=exports.parseStoreUrl=exports.STORE_CONFIG=exports.getRegistry=exports.formatStorePullRequestError=exports.isForkOfStoreRepo=exports.getTagsApiUrl=exports.getStoreIndexUrl=exports.getStorePath=exports.DEFAULT_STORE_BRANCH=exports.DEFAULT_STORE_REPO=exports.DEFAULT_STORE_OWNER=exports.STORE_PATHS=exports.STORE_ICONS=void 0;exports.listStoreVersions=listStoreVersions;exports.getLatestStoreVersion=getLatestStoreVersion;exports.downloadFromStore=downloadFromStore;exports.downloadFromExternalGitHub=downloadFromExternalGitHub;exports.canPublishDirectlyToStore=canPublishDirectlyToStore;exports.publishToStore=publishToStore;exports.parseGitHubUrl=parseGitHubUrl;exports.detectArtifactType=detectArtifactType;exports.isStoreUrl=isStoreUrl;exports.listStoreIndex=listStoreIndex;var utils_1=dn(),branding_1=ot(),github_1=ya(),shared_1=eu(),shared_2=eu();Object.defineProperty(exports,"STORE_ICONS",{enumerable:!0,get:function(){return shared_2.STORE_ICONS}});Object.defineProperty(exports,"STORE_PATHS",{enumerable:!0,get:function(){return shared_2.STORE_PATHS}});Object.defineProperty(exports,"DEFAULT_STORE_OWNER",{enumerable:!0,get:function(){return shared_2.DEFAULT_STORE_OWNER}});Object.defineProperty(exports,"DEFAULT_STORE_REPO",{enumerable:!0,get:function(){return shared_2.DEFAULT_STORE_REPO}});Object.defineProperty(exports,"DEFAULT_STORE_BRANCH",{enumerable:!0,get:function(){return shared_2.DEFAULT_STORE_BRANCH}});Object.defineProperty(exports,"getStorePath",{enumerable:!0,get:function(){return shared_2.getStorePath}});Object.defineProperty(exports,"getStoreIndexUrl",{enumerable:!0,get:function(){return shared_2.getStoreIndexUrl}});Object.defineProperty(exports,"getTagsApiUrl",{enumerable:!0,get:function(){return shared_2.getTagsApiUrl}});Object.defineProperty(exports,"isForkOfStoreRepo",{enumerable:!0,get:function(){return shared_2.isForkOfStoreRepo}});Object.defineProperty(exports,"formatStorePullRequestError",{enumerable:!0,get:function(){return shared_2.formatStorePullRequestError}});var index_1=Sp();Object.defineProperty(exports,"getRegistry",{enumerable:!0,get:function(){return index_1.getRegistry}});function getStoreRepo(){let repoEnv=process.env.AGENTHIPPO_STORE_REPO?.trim();if(repoEnv){let t=repoEnv.match(/^(?:https?:\/\/github\.com\/)?([^/]+)\/([^/]+?)(?:\.git)?$/);if(t)return{owner:t[1],repo:t[2]};let e=repoEnv.split("/").filter(Boolean);if(e.length===2)return{owner:e[0],repo:e[1]}}try{let vscode=eval("require")("vscode"),config=vscode.workspace.getConfiguration("agentide"),storeUrl=config.get("storeRepo");if(storeUrl){let t=storeUrl.match(/^(?:https?:\/\/github\.com\/)?([^/]+)\/([^/]+?)(?:\.git)?$/);if(t)return{owner:t[1],repo:t[2]}}}catch{}return{owner:shared_1.DEFAULT_STORE_OWNER,repo:shared_1.DEFAULT_STORE_REPO}}exports.STORE_CONFIG={get owner(){return getStoreRepo().owner},get repo(){return getStoreRepo().repo},defaultBranch:shared_1.DEFAULT_STORE_BRANCH,paths:shared_1.STORE_PATHS};async function listStoreVersions(t,e){let n=`${(0,shared_1.getStorePath)(t)}/${e}/v`,r=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/git/refs/tags`,s=await fetch(r,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!s.ok&&(s.status===401||s.status===403||s.status===429)){let a=await(0,github_1.getGitHubToken)();s=await fetch(r,{headers:{Authorization:`Bearer ${a}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}})}if(!s.ok){if(s.status===404)return[];throw new Error(`Failed to list tags: ${s.statusText}`)}let i=await s.json(),o=[];for(let{ref:a}of i){let c=a.replace("refs/tags/","");if(c.startsWith(n)){let l=c.slice(n.length-1);o.push({version:l.replace(/^v/,""),tagName:c,isPrerelease:/-(alpha|beta|rc|pre)/.test(l)})}}return o.sort((a,c)=>c.version.localeCompare(a.version,void 0,{numeric:!0}))}async function getLatestStoreVersion(t,e,n=!1){let r=await listStoreVersions(t,e);return n?r[0]||null:r.find(s=>!s.isPrerelease)||null}var zlib_1=require("zlib");function parseTar(t){let e=new Map,n=0,r,s=i=>i.toString("utf-8").replace(/\0/g,"").trim();for(;n<t.length-512;){let i=t.subarray(n,n+512);if(i.every(p=>p===0))break;let o=s(i.subarray(0,100)),a=s(i.subarray(345,500)),c=s(i.subarray(124,136)),l=i[156],u=parseInt(c,8)||0,f=t.subarray(n+512,n+512+u),d=512+Math.ceil(u/512)*512;if(l===120||l===103){let p=f.toString("utf-8").match(/\d+ path=([^\n]+)\n/);p&&(r=p[1]),n+=d;continue}if(l===76){r=s(f),n+=d;continue}let g=r??(a?`${a}/${o}`:o);r=void 0,g&&(l===0||l===48)&&e.set(g,Buffer.from(f)),n+=d}return e}async function downloadFromStore(t,e){let{type:n,slug:r,version:s,includePrerelease:i}=t,o=(0,shared_1.getStorePath)(n),a;if(s==="main"||s==="latest")a=exports.STORE_CONFIG.defaultBranch,e&&(0,utils_1.logInfo)(e,`[Store] Using ${a} branch (latest)`);else if(s)a=`${o}/${r}/v${s.replace(/^v/,"")}`;else{let h=await getLatestStoreVersion(n,r,i);h?(a=h.tagName,e&&(0,utils_1.logInfo)(e,`[Store] Using latest version: ${h.version}`)):(a=exports.STORE_CONFIG.defaultBranch,e&&(0,utils_1.logInfo)(e,`[Store] No version tags found, using ${a} branch`))}e&&(0,utils_1.logInfo)(e,`[Store] Downloading ${n}/${r} at ${a}`);let c=encodeURIComponent(a),l=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/tarball/${c}`,u=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!u.ok){if(u.status===401||u.status===403||u.status===404||u.status===429){e&&(0,utils_1.logInfo)(e,"[Store] Requires authentication, signing in...");let h=await(0,github_1.getGitHubToken)();u=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${h}`},redirect:"follow"})}if(!u.ok)throw new Error(`Version ${s||"latest"} not found for ${n} "${r}"`)}let f=Buffer.from(await u.arrayBuffer()),d=(0,zlib_1.gunzipSync)(f),g=parseTar(d),p=`${o}/${r}/`,_=[];for(let[h,y]of g){let E=h.indexOf("/");if(E===-1)continue;let w=h.slice(E+1);if(w.startsWith(p)){let A=w.slice(p.length);A&&(_.push({path:A,content:y}),e&&(0,utils_1.logInfo)(e,`[Store] \u2193 ${A}`))}}return _}async function downloadFromExternalGitHub(t,e){let{owner:n,repo:r,ref:s="main",path:i}=t;e&&(0,utils_1.logInfo)(e,`[GitHub] Downloading ${n}/${r}${i?`/${i}`:""} at ${s}`);let o=encodeURIComponent(s),a=`https://api.github.com/repos/${n}/${r}/tarball/${o}`,c=await fetch(a,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!c.ok){if(c.status===401||c.status===403||c.status===404||c.status===429){e&&(0,utils_1.logInfo)(e,"[GitHub] Requires authentication, signing in...");let _=await(0,github_1.getGitHubToken)();c=await fetch(a,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${_}`},redirect:"follow"})}if(!c.ok)throw new Error(`Failed to download from ${n}/${r}@${s}: ${c.statusText}`)}let l=Buffer.from(await c.arrayBuffer()),u=(0,zlib_1.gunzipSync)(l),f=parseTar(u),d="";for(let _ of f.keys())if(_.includes("/")){d=_.split("/")[0]+"/";break}let g=i?`${d}${i}/`:d,p=[];for(let[_,h]of f)if(_.startsWith(g)){let y=_.slice(g.length);y&&!y.endsWith("/")&&p.push({path:y,content:h.toString("utf-8")})}if(p.length===0)throw new Error(`No files found in ${n}/${r}${i?`/${i}`:""} at ${s}`);return e&&(0,utils_1.logInfo)(e,`[GitHub] Downloaded ${p.length} files`),p}async function getRepoForkMetadata(t,e){let n=await(0,github_1.getGitHubToken)(),r=await fetch(`https://api.github.com/repos/${t}/${e}`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(r.status===404)return null;if(!r.ok)throw new Error(`Failed to inspect repo ${t}/${e}: ${r.statusText}`);let s=await r.json();return{fork:s.fork===!0,parentFullName:s.parent?.full_name}}function assertStoreFork(t,e,n){if(!(0,shared_1.isForkOfStoreRepo)(n,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo))throw new Error(`Your GitHub repo ${t}/${e} is not a fork of ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}.
530
530
 
531
531
  Publishing requires a fork of the store repository. Either delete or rename ${t}/${e} and retry (AgentIDE will create a proper fork), or fork ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo} on GitHub.`)}async function syncForkWithUpstream(t,e){let n=await(0,github_1.getGitHubToken)(),r=await fetch(`https://api.github.com/repos/${t}/${e}/merge-upstream`,{method:"POST",headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({branch:exports.STORE_CONFIG.defaultBranch})});if(r.ok||r.status===409)return;let s=await r.text().catch(()=>"");console.warn(`[Store] Warning: fork sync returned ${r.status}: ${s.slice(0,200)}`)}async function ensureFork(){let t=await(0,github_1.getGitHubToken)(),e=await(0,github_1.getGitHubUser)(),n=await(0,github_1.getRepo)(e.login,exports.STORE_CONFIG.repo);if(n){let o=await getRepoForkMetadata(e.login,exports.STORE_CONFIG.repo);if(!o)throw new Error(`Fork repo not found: ${e.login}/${exports.STORE_CONFIG.repo}`);return assertStoreFork(e.login,exports.STORE_CONFIG.repo,o),n}if(!await(0,github_1.getRepo)(exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo))throw new Error(`Store repo not found: ${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}
532
532
 
@@ -539,15 +539,15 @@ Try: Sign out and sign in again with GitHub.`):s.status===404?new Error(`Store r
539
539
  The repository may be private or doesn't exist.`):new Error(`Failed to fork store: ${s.status} ${s.statusText}
540
540
  ${o}`)}let i=await s.json();return await new Promise(o=>setTimeout(o,2e3)),i}async function ensurePublishBranch(t,e,n){let r=await(0,github_1.getGitHubToken)(),s=await(0,github_1.getBranchSha)(exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo,exports.STORE_CONFIG.defaultBranch),i={Authorization:`Bearer ${r}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},o=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs`,{method:"POST",headers:i,body:JSON.stringify({ref:`refs/heads/${n}`,sha:s})});if(o.ok)return;if(o.status===422){let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${encodeURIComponent(n)}`,{method:"PATCH",headers:i,body:JSON.stringify({sha:s,force:!0})});if(c.ok)return;let l=await c.text();throw new Error(`Failed to reset publish branch: ${c.status} ${l}`)}let a=await o.text();if(o.status===403&&a.includes("personal access token")){let c=t===exports.STORE_CONFIG.owner?`
541
541
 
542
- If this is an organization repo, authorize the token for SSO: GitHub \u2192 Settings \u2192 Developer settings \u2192 Personal access tokens \u2192 your token \u2192 Configure SSO \u2192 Authorize ${exports.STORE_CONFIG.owner}.`:"";throw new Error(`Failed to create publish branch: token cannot write to ${t}/${e}.${c}`)}throw new Error(`Failed to create publish branch: ${o.status} ${a}`)}async function verifyGitWriteAccess(t,e){let n=await(0,github_1.getGitHubToken)(),r=await fetch(`https://api.github.com/repos/${t}/${e}`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!r.ok)return!1;let s=await r.json();return s.permissions?.push===!0||s.permissions?.admin===!0}async function canPublishDirectlyToStore(){return verifyGitWriteAccess(exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo)}async function createPullRequest(t,e,n,r){let s=await(0,github_1.getGitHubToken)(),i=await fetch(`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/pulls`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({title:e,body:n,head:t,base:exports.STORE_CONFIG.defaultBranch})});if(!i.ok){let a=await i.text();throw new Error((0,shared_1.formatStorePullRequestError)(a,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo,r))}let o=await i.json();return{url:o.html_url,number:o.number}}async function publishToStore(t,e){let{type:n,slug:r,version:s,files:i,changelog:o}=t,a=(0,shared_1.getStorePath)(n),c=`${a}/${r}/v${s}`,l=`publish-${n}-${r}-v${s}`;e&&(0,utils_1.logInfo)(e,`[Store] Publishing ${n} "${r}" v${s}...`);let u=await canPublishDirectlyToStore(),d,f,p,g;if(u)d=exports.STORE_CONFIG.owner,f=exports.STORE_CONFIG.repo,p=l,e&&(0,utils_1.logInfo)(e,`[Store] Publishing directly to ${d}/${f}...`);else{e&&(0,utils_1.logInfo)(e,"[Store] Ensuring fork exists...");let E=await ensureFork();d=E.owner.login,f=E.name,p=`${E.owner.login}:${l}`,g=E.owner.login,e&&(0,utils_1.logInfo)(e,"[Store] Syncing fork with upstream..."),await syncForkWithUpstream(E.owner.login,E.name)}e&&(0,utils_1.logInfo)(e,`[Store] Creating branch: ${l}`),await ensurePublishBranch(d,f,l),e&&(0,utils_1.logInfo)(e,`[Store] Committing ${i.length} files...`);let _=i.map(E=>({path:`${a}/${r}/${E.path}`,content:E.content}));if(await(0,github_1.commitMultipleFiles)(d,f,l,_,`Add ${n}/${r} v${s}`),e)for(let E of i)(0,utils_1.logInfo)(e,`[Store] \u2713 ${E.path}`);e&&(0,utils_1.logInfo)(e,"[Store] Creating pull request...");let h=`
542
+ If this is an organization repo, authorize the token for SSO: GitHub \u2192 Settings \u2192 Developer settings \u2192 Personal access tokens \u2192 your token \u2192 Configure SSO \u2192 Authorize ${exports.STORE_CONFIG.owner}.`:"";throw new Error(`Failed to create publish branch: token cannot write to ${t}/${e}.${c}`)}throw new Error(`Failed to create publish branch: ${o.status} ${a}`)}async function verifyGitWriteAccess(t,e){let n=await(0,github_1.getGitHubToken)(),r=await fetch(`https://api.github.com/repos/${t}/${e}`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!r.ok)return!1;let s=await r.json();return s.permissions?.push===!0||s.permissions?.admin===!0}async function canPublishDirectlyToStore(){return verifyGitWriteAccess(exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo)}async function createPullRequest(t,e,n,r){let s=await(0,github_1.getGitHubToken)(),i=await fetch(`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/pulls`,{method:"POST",headers:{Authorization:`Bearer ${s}`,Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE","Content-Type":"application/json"},body:JSON.stringify({title:e,body:n,head:t,base:exports.STORE_CONFIG.defaultBranch})});if(!i.ok){let a=await i.text();throw new Error((0,shared_1.formatStorePullRequestError)(a,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo,r))}let o=await i.json();return{url:o.html_url,number:o.number}}async function publishToStore(t,e){let{type:n,slug:r,version:s,files:i,changelog:o}=t,a=(0,shared_1.getStorePath)(n),c=`${a}/${r}/v${s}`,l=`publish-${n}-${r}-v${s}`;e&&(0,utils_1.logInfo)(e,`[Store] Publishing ${n} "${r}" v${s}...`);let u=await canPublishDirectlyToStore(),f,d,g,p;if(u)f=exports.STORE_CONFIG.owner,d=exports.STORE_CONFIG.repo,g=l,e&&(0,utils_1.logInfo)(e,`[Store] Publishing directly to ${f}/${d}...`);else{e&&(0,utils_1.logInfo)(e,"[Store] Ensuring fork exists...");let E=await ensureFork();f=E.owner.login,d=E.name,g=`${E.owner.login}:${l}`,p=E.owner.login,e&&(0,utils_1.logInfo)(e,"[Store] Syncing fork with upstream..."),await syncForkWithUpstream(E.owner.login,E.name)}e&&(0,utils_1.logInfo)(e,`[Store] Creating branch: ${l}`),await ensurePublishBranch(f,d,l),e&&(0,utils_1.logInfo)(e,`[Store] Committing ${i.length} files...`);let _=i.map(E=>({path:`${a}/${r}/${E.path}`,content:E.content}));if(await(0,github_1.commitMultipleFiles)(f,d,l,_,`Add ${n}/${r} v${s}`),e)for(let E of i)(0,utils_1.logInfo)(e,`[Store] \u2713 ${E.path}`);e&&(0,utils_1.logInfo)(e,"[Store] Creating pull request...");let h=`
543
543
  ## New ${n}: ${r} v${s}
544
544
 
545
545
  ${o||"No changelog provided."}
546
546
 
547
547
  ---
548
548
  *Submitted via AgentIDE*
549
- `,y=await createPullRequest(p,`[${n}] Add ${r} v${s}`,h,g);return e&&(0,utils_1.logInfo)(e,`[Store] OK Created PR: ${y.url}`),{prUrl:y.url,prNumber:y.number,tagName:c}}function parseGitHubUrl(t){return(0,shared_1.parseGitHubUrl)(t,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo)}async function detectArtifactType(t,e,n,r,s){let i=r?`${r}/`:"",o=n||"main",a=async c=>{let l=`https://api.github.com/repos/${t}/${e}/contents/${i}${c}?ref=${o}`;try{return(await fetch(l,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}})).ok}catch{return!1}};if(s&&(0,utils_1.logInfo)(s,`[Store] Detecting artifact type for ${t}/${e}/${i}...`),await a("agent.yaml"))return"pack";if(await a("SKILL.md"))return"skill";if(await a(".mcp.json")||await a("mcp.json"))return"mcp";if(await a("engine.manifest.json"))return"engine";if(await a("view.yaml")&&await a("panel-entry.yaml"))return"view";throw new Error(`Cannot detect artifact type in ${t}/${e}${r?`/${r}`:""}. Expected agent.yaml, SKILL.md, .mcp.json, engine.manifest.json, or view.yaml with panel-entry.yaml`)}exports.parseStoreUrl=shared_1.parseStoreUrl;function isStoreUrl(t){return(0,shared_1.isStoreUrl)(t,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo)}async function listStoreIndex(t,e){let n=[],r=t?[(0,shared_1.getStorePath)(t)]:[exports.STORE_CONFIG.paths.packs,exports.STORE_CONFIG.paths.skills,exports.STORE_CONFIG.paths.mcp,exports.STORE_CONFIG.paths.engines,exports.STORE_CONFIG.paths.spotlightViews];for(let s of r){let i=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/contents/${s}`;try{let o=await fetch(i,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!o.ok){e&&(0,utils_1.logInfo)(e,`[Store] No ${s} directory found`);continue}let a=await o.json();for(let c of a)if(c.type==="dir"){let l=s===exports.STORE_CONFIG.paths.packs?"pack":s===exports.STORE_CONFIG.paths.skills?"skill":s===exports.STORE_CONFIG.paths.mcp?"mcp":s===exports.STORE_CONFIG.paths.engines?"engine":"view";n.push({type:l,slug:c.name,path:c.path})}}catch(o){e&&(0,utils_1.logInfo)(e,`[Store] Error listing ${s}: ${o}`)}}return n}exports.formatStoreUrl=shared_1.formatStoreUrl});var nu=T(Qe=>{"use strict";Object.defineProperty(Qe,"__esModule",{value:!0});Qe.CapMeter=Qe.CAP_ENV_ALIASES=Qe.parseCapPolicy=Qe.STRICTEST_ON_BREACH=Qe.ON_BREACH_ALIASES=Qe.ON_BREACH_ACTIONS=Qe.LEASE_CAP_FIELDS=Qe.LEASE_CAP_ALIASES=Qe.DEPRECATED_CAP_SPELLINGS=void 0;Qe.resolveOnBreach=Cw;Qe.mergeCaps=FL;Qe.capsAreUnbounded=VL;Qe.capsFromEnv=KL;var xo=La(),qi=La();Object.defineProperty(Qe,"DEPRECATED_CAP_SPELLINGS",{enumerable:!0,get:function(){return qi.DEPRECATED_CAP_SPELLINGS}});Object.defineProperty(Qe,"LEASE_CAP_ALIASES",{enumerable:!0,get:function(){return qi.LEASE_CAP_ALIASES}});Object.defineProperty(Qe,"LEASE_CAP_FIELDS",{enumerable:!0,get:function(){return qi.LEASE_CAP_FIELDS}});Object.defineProperty(Qe,"ON_BREACH_ACTIONS",{enumerable:!0,get:function(){return qi.ON_BREACH_ACTIONS}});Object.defineProperty(Qe,"ON_BREACH_ALIASES",{enumerable:!0,get:function(){return qi.ON_BREACH_ALIASES}});Object.defineProperty(Qe,"STRICTEST_ON_BREACH",{enumerable:!0,get:function(){return qi.STRICTEST_ON_BREACH}});Object.defineProperty(Qe,"parseCapPolicy",{enumerable:!0,get:function(){return qi.parseCapPolicy}});Qe.CAP_ENV_ALIASES={AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"};function Cw(t,e){let n=t?.trim();if(!n)return{action:void 0,warnings:[]};if(n in xo.ON_BREACH_ACTIONS)return{action:n,warnings:[]};let r=xo.ON_BREACH_ALIASES[n];return r?{action:r,warnings:[`${e}="${n}" is DEPRECATED; use "${xo.DEPRECATED_CAP_SPELLINGS[n]??r}". Treating it as "${r}". The old spelling will stop being accepted.`]}:{action:xo.STRICTEST_ON_BREACH,warnings:[`${e}="${n}" is not a breach action this build understands. FAILING CLOSED to "${xo.STRICTEST_ON_BREACH}" \u2014 an unreadable enforcement setting must never weaken enforcement. Known actions: ${Object.keys(xo.ON_BREACH_ACTIONS).join(", ")}.`]}}var BL=1e4;function FL(t,e){let n=t??{},r=e??{},s=(i,o)=>i===void 0?o:o===void 0?i:Math.min(i,o);return{maxTurnsPerSession:s(n.maxTurnsPerSession,r.maxTurnsPerSession),maxSessionSeconds:s(n.maxSessionSeconds,r.maxSessionSeconds),maxConcurrentSandboxes:s(n.maxConcurrentSandboxes,r.maxConcurrentSandboxes),onBreach:n.onBreach==="destroy-sandbox"||r.onBreach==="destroy-sandbox"?"destroy-sandbox":n.onBreach??r.onBreach}}function VL(t){return t.maxTurnsPerSession===void 0&&t.maxSessionSeconds===void 0&&t.maxConcurrentSandboxes===void 0}var Tp=class{caps;sessions=new Map;constructor(e){this.caps=e}setCaps(e){this.caps=e}policy(){return this.caps}check(e,n,r=Date.now()){let s=this.sessions.get(e);if(this.caps.maxTurnsPerSession!==void 0&&s&&s.turns>=this.caps.maxTurnsPerSession)return{allowed:!1,cap:"turns",reason:`session turn cap reached (${s.turns}/${this.caps.maxTurnsPerSession})`};if(this.caps.maxSessionSeconds!==void 0&&s){let i=Math.floor((r-s.startedAtMs)/1e3);if(i>=this.caps.maxSessionSeconds)return{allowed:!1,cap:"duration",reason:`session duration cap reached (${i}s/${this.caps.maxSessionSeconds}s)`}}return this.caps.maxConcurrentSandboxes!==void 0&&!s&&n>=this.caps.maxConcurrentSandboxes?{allowed:!1,cap:"concurrency",reason:`instance is at its concurrent sandbox cap (${n}/${this.caps.maxConcurrentSandboxes})`}:{allowed:!0}}record(e,n=Date.now()){let r=this.sessions.get(e);if(r){r.turns+=1;return}if(this.sessions.size>=BL){let s,i=1/0;for(let[o,a]of this.sessions)a.startedAtMs<i&&(i=a.startedAtMs,s=o);s&&this.sessions.delete(s)}this.sessions.set(e,{turns:1,startedAtMs:n})}forget(e){this.sessions.delete(e)}usage(e){let n=this.sessions.get(e);if(n)return{turns:n.turns,ageSeconds:Math.floor((Date.now()-n.startedAtMs)/1e3)}}};Qe.CapMeter=Tp;function KL(t=process.env,e=n=>console.warn(`Warning: ${n}`)){let n=i=>{let o=parseInt((i??"").trim(),10);return Number.isFinite(o)&&o>0?o:void 0},r=i=>{let o=n(t[i]);if(o!==void 0)return o;for(let[a,c]of Object.entries(Qe.CAP_ENV_ALIASES)){if(c!==i)continue;let l=n(t[a]);if(l!==void 0)return e(`${a} is DEPRECATED; use ${i}. Honouring it for now.`),l}},s=Cw(t.AGENTHIPPO_CAP_ON_BREACH,"AGENTHIPPO_CAP_ON_BREACH");for(let i of s.warnings)e(i);return{maxTurnsPerSession:r("AGENTHIPPO_MAX_TURNS_PER_SESSION"),maxSessionSeconds:r("AGENTHIPPO_MAX_SESSION_SECONDS"),maxConcurrentSandboxes:r("AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"),onBreach:s.action}}});var $w=T(Ha=>{"use strict";Object.defineProperty(Ha,"__esModule",{value:!0});Ha.effectiveDenyMode=kw;Ha.createGovernor=WL;Ha.withGovernor=qL;var ru=nu(),Bo=jo();function kw(t,e){return t==="kill"&&!e?"drain":t}function WL(t){let e=new ru.CapMeter(t.caps),n=(0,ru.capsAreUnbounded)(t.caps),r,s,i,o=new Map,a=t.sandboxes.supportsInFlightTermination!==!1,c=new Map,l=new Set,u=(h,y)=>{try{t.audit?.(h,y)}catch{}},d=1e4,f=(h,y)=>{if(o.size>=d&&!o.has(h)){let E=o.keys().next();E.done||o.delete(E.value)}o.set(h,y)},p=async(h,y)=>{let E=e.policy().onBreach??"revoke-inference";try{E==="destroy-sandbox"?await t.sandboxes.destroySession(h):await t.sandboxes.revokeRoute(h,"inference")}catch(w){t.logger?.warn(`[Governor] ${E} failed for ${h}, destroying instead: ${w instanceof Error?w.message:String(w)}`),await t.sandboxes.destroySession(h).catch(()=>{})}t.logger?.warn(`[Governor] cap breach on ${h}: ${y.reason} \u2014 ${E}`),u("cap_breach",{sessionKey:h,cap:y.cap,reason:y.reason,action:E})},g=async(h,y=!1)=>{let E=t.sandboxes.sandboxes();for(let w of E)await t.sandboxes.destroySession(w.sandboxKey).catch(()=>{});return E.length>0?t.logger?.warn(`[Governor] kill switch: destroyed ${E.length} live sandbox(s) \u2014 ${h}`):!a&&!y&&t.logger?.warn(`[Governor] kill switch: no sandbox driver, so nothing running can be stopped \u2014 in-flight turns will finish and only NEW turns are refused (${h}). Run with --sandbox for true in-flight kill.`),(E.length>0||!y)&&u("kill_switch",{reason:h,destroyed:E.length,inFlightTerminated:a}),E.length},_=async()=>{if(t.getLease)try{let h=await t.getLease(),y=(0,ru.mergeCaps)(h?.caps,t.caps);if(e.setCaps(y),n=(0,ru.capsAreUnbounded)(y),i=h,c=(0,Bo.resolveFollowedUsers)(h,o),!a)for(let w of h?.deny??[]){if(w.mode!=="kill")continue;let A=`${w.scope}:${w.match}`;l.has(A)||(l.add(A),t.logger?.warn(`[Governor] deny(kill) on ${A} DEGRADED TO DRAIN: this deployment has no sandbox driver, so a turn already executing cannot be stopped. It will run to completion; only the next turn is refused. Run serve with --sandbox for a kill that ends work mid-flight.`),u("deny_kill_degraded",{scope:w.scope,match:w.match,effectiveMode:"drain"}))}for(let w of t.sandboxes.sandboxes()){let A=w.sessionKeys.map(S=>({sessionKey:S,v:(0,Bo.denyVerdict)(h,{sessionKey:S,pack:t.pack??"",userHash:t.userHash,userId:o.get(S),followedUsers:c})})).find(({v:S})=>S.denied&&kw(S.mode,a)==="kill");if(A){await t.sandboxes.destroySession(w.sandboxKey).catch(()=>{});for(let S of w.sessionKeys)o.delete(S);t.logger?.warn(`[Governor] deny(kill) destroyed ${w.sandboxId} \u2014 ${A.v.reason}`),u("session_killed",{sessionKey:A.sessionKey,sandboxId:w.sandboxId,reason:A.v.reason,collateralSessions:w.sessionKeys.filter(S=>S!==A.sessionKey)})}}let E=(0,Bo.leaseIsDead)(h);if(E.dead){let w=E.reason??"lease revoked",A=s===w;s=w,await g(w,A)}else s&&(t.logger?.info("[Governor] lease restored \u2014 accepting turns again"),u("kill_switch_lifted",{}),s=void 0)}catch(h){t.logger?.warn(`[Governor] lease check failed: ${h instanceof Error?h.message:String(h)}`)}};return{async admitTurn(h,y){if(s)return{allowed:!1,reason:`stopped by the control plane: ${s}`};y&&f(h,y);let E=(0,Bo.denyVerdict)(i,{sessionKey:h,pack:t.pack??"",userHash:t.userHash,userId:y??o.get(h),followedUsers:(0,Bo.resolveFollowedUsers)(i,o)});if(E.denied)return{allowed:!1,reason:E.reason};if(t.admitPack){let A=t.admitPack(h,i);if(!A.allowed)return{allowed:!1,reason:A.reason??"refused by pack admission"}}if(n)return{allowed:!0};let w=e.check(h,t.sandboxes.sandboxes().length);return w.allowed||w.cap!=="concurrency"&&await p(h,w),w},atCapacity(h){if(s||n)return;let y=e.check(h,t.sandboxes.sandboxes().length);return!y.allowed&&y.cap==="concurrency"?y.reason:void 0},recordTurn(h){e.record(h)},killAll:g,refresh:_,start(){if(!t.getLease||r)return;let h=(0,Bo.resolveLeasePollSeconds)(t.pollSeconds)*1e3;r=setInterval(()=>{_()},h),r.unref?.(),_()},stop(){r&&(clearInterval(r),r=void 0)},policy:()=>e.policy()}}function qL(t,e){return{async run(n){let r=n.sessionId??"default",s=await e.admitTurn(r,n.analyticsUserId);return s.allowed?(e.recordTurn(r),t.run(n)):{success:!1,text:"",thinking:"",toolCalls:[],error:s.reason??"refused by policy",...s.cap==="concurrency"?{atCapacity:!0}:{}}},dispose(){e.stop(),t.dispose()}}}});var Bw=T(Ye=>{"use strict";var YL=Ye&&Ye.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),JL=Ye&&Ye.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ja=Ye&&Ye.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&YL(n,e,r[s]);return JL(n,e),n}})();Object.defineProperty(Ye,"__esModule",{value:!0});Ye.ContainerSandboxDriver=Ye.SANDBOX_PACK_DIR=Ye.SANDBOX_WORKSPACE_DIR=Ye.SANDBOX_STATE_DIR=Ye.SANDBOX_SOCKET_DIR_IN_SANDBOX=Ye.ORPHAN_SWEEP_INTERVAL_MS=void 0;Ye.strictEgressFromEnv=Hw;Ye.prepareSocketDir=jw;Ye.assertOwnSocket=xw;var XL=ja(require("node:crypto")),Gt=ja(require("node:fs")),zL=ja(require("node:net")),QL=ja(require("node:os")),Ls=ja(require("node:path")),Dw=al(),Lw="ai.agenthippo.owner",Mw="ai.agenthippo.instance";Ye.ORPHAN_SWEEP_INTERVAL_MS=3e4;var ZL=3*Ye.ORPHAN_SWEEP_INTERVAL_MS;function Hw(t=process.env){return t.AGENTHIPPO_SANDBOX_STRICT_EGRESS==="1"}function eM(){let t=[process.env.AGENTHIPPO_SANDBOX_SOCKET_DIR,"/run/agenthippo/sandboxes",process.env.XDG_RUNTIME_DIR?Ls.join(process.env.XDG_RUNTIME_DIR,"agenthippo-sandboxes"):void 0,Ls.join(QL.tmpdir(),"agenthippo-sandboxes")].filter(e=>!!e);for(let e of t)try{if(Gt.mkdirSync(e,{recursive:!0}),Gt.accessSync(e,Gt.constants.W_OK),e.length>60)continue;return e}catch{}return"/run/agenthippo/sandboxes"}var Gw=eM(),tM=9e4,nM=150;Ye.SANDBOX_SOCKET_DIR_IN_SANDBOX="/run/sandbox";Ye.SANDBOX_STATE_DIR="/state";Ye.SANDBOX_WORKSPACE_DIR="/state/workspace";Ye.SANDBOX_PACK_DIR="/app/pack";var vp=class{opts;kind="container";tier=2;sandboxes=new Map;seq=0;instance=XL.randomBytes(2).toString("hex");constructor(e){this.opts=e}async create(e){rM(e.image);let n=`sandbox-${this.instance}-${++this.seq}-${aM(e.sandboxKey)}`,r=this.opts.socketDir??Gw,s=Ls.join(r,n),i=Ls.join(s,"sandbox.sock");Gt.rmSync(s,{recursive:!0,force:!0}),jw(s,this.opts.socketOwner);let o=e.routes.map(h=>({kind:h.kind,network:iM(h.target)})),c=await this.assertRouteNetworks(o)?this.tier:1,l=o[0],u=["run","--detach","--name",n,"--network",l?l.network:"none","--cap-drop","ALL","--security-opt","no-new-privileges","--read-only","--tmpfs","/tmp:rw,exec,nosuid,size=512m",...e.stateDir?["--volume",`${e.stateDir}:${Ye.SANDBOX_STATE_DIR}`]:["--tmpfs",`${Ye.SANDBOX_STATE_DIR}:rw,exec,nosuid,size=512m,mode=1777`],"--volume",`${s}:${Ye.SANDBOX_SOCKET_DIR_IN_SANDBOX}`,"--label",`ai.agenthippo.sandbox=${n}`,"--label",`ai.agenthippo.session=${e.sandboxKey}`,"--label",`ai.agenthippo.tier=${e.tier}`,"--label",`${Mw}=${this.instance}`,...this.opts.owner?["--label",`${Lw}=${this.opts.owner}`]:[]];for(let h of e.fs.readonly)u.push("--volume",Uw(h,!0));for(let h of e.fs.writable)u.push("--volume",Uw(h,!1));e.limits.memMiB&&u.push("--memory",`${e.limits.memMiB}m`),e.limits.cpu&&u.push("--cpus",e.limits.cpu);for(let[h,y]of Object.entries(e.env??{}))u.push("--env",`${h}=${y}`);u.push("--env",`${Dw.SANDBOX_TIER_ENV}=${c}`),u.push(e.image);let d=await this.opts.exec(u);if(d.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to create sandbox ${n}: ${d.stdout.trim()||`exit ${d.code}`}`);let f=d.stdout.trim(),p=new Map;l&&p.set(l.kind,l.network);for(let h of o.slice(1)){let y=await this.opts.exec(["network","connect",h.network,n]);if(y.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to attach ${h.kind} route for sandbox ${n}: ${y.stdout.trim()}`);p.set(h.kind,h.network)}await this.waitForSocket(n,i);let g={containerId:f,socketPath:i,networks:p,idleSeconds:e.limits.ttlSeconds};this.armIdleReap(n,g),this.sandboxes.set(n,g);let _=this.opts.connectFn??oM;return{id:n,tier:c,endpoint:i,connect:()=>_(i)}}async assertRouteNetworks(e){let n=new Set,r=!0;for(let s of e){if(n.has(s.network))continue;n.add(s.network);let i=await this.opts.exec(["network","inspect","--format","{{.Internal}}",s.network]);if(i.code!==0)throw new Error(`route network "${s.network}" (${s.kind}) does not exist \u2014 a tier-2 sandbox is created on its declared route networks and nothing creates them for you. Create it (\`docker network create --internal ${s.network}\`) and put the ${s.kind} service on it.`);if(i.stdout.trim()!=="true"){if(r=!1,this.opts.strictEgress??Hw())throw new Error(`route network "${s.network}" (${s.kind}) is not --internal, and strict egress containment is enabled (AGENTHIPPO_SANDBOX_STRICT_EGRESS=1). A sandbox on this network can reach any host it routes to, so the tier-2 containment claim would be false. Recreate it as internal (\`docker network rm ${s.network} && docker network create --internal ${s.network}\`), or unset AGENTHIPPO_SANDBOX_STRICT_EGRESS to accept a sandbox whose egress is bounded by the network topology instead.`);this.opts.logger?.warn(`route network "${s.network}" (${s.kind}) is not --internal: this sandbox can reach any host that network routes to, so tier-2 egress is bounded by that network's topology, not by the sandbox. This sandbox is therefore reported as tier 1, not tier 2. Make the network internal (or set AGENTHIPPO_SANDBOX_STRICT_EGRESS=1 to refuse outright).`)}}return r}async waitForSocket(e,n){let r=this.opts.socketWaitMs??tM;if(r<=0)return;let s=Date.now()+r;for(;Date.now()<s;){if(Gt.existsSync(n)){try{xw(n,this.opts.socketOwner)}catch(a){throw await this.opts.exec(["rm","--force",e]),a}return}if((await this.opts.exec(["inspect","--format","{{.State.Running}}",e])).stdout.trim()==="false"){let a=await this.opts.exec(["logs","--tail","20",e]);throw await this.opts.exec(["rm","--force",e]),new Error(`sandbox ${e} exited during boot: ${bp(a)}`)}await new Promise(a=>setTimeout(a,nM))}let i=await this.opts.exec(["logs","--tail","20",e]);throw await this.opts.exec(["rm","--force",e]),new Error(`sandbox ${e} did not bind ${n} within ${r/1e3}s: ${bp(i)}`)}async revoke(e,n){let r=this.sandboxes.get(e.id);if(!r)return;if(n==="all")return this.destroyById(e.id);let s=r.networks.get(n);if(!s)throw new Dw.RevocationUnsupportedError("container",n);let i=await this.opts.exec(["network","disconnect","--force",s,e.id]);if(i.code!==0)throw new Error(`failed to revoke ${n} for sandbox ${e.id}: ${i.stdout.trim()}`);r.networks.delete(n)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.destroyById(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.destroyById(e.id)}async sweepOrphans(){if(!this.opts.owner)return[];this.beat();let e=this.opts.heartbeatDir,n=new Set;if(e)for(let a of Gt.readdirSync(e)){let c=Ls.join(e,a);try{Date.now()-Gt.statSync(c).mtimeMs<ZL?n.add(a):Gt.rmSync(c,{force:!0})}catch{}}let r=await this.opts.exec(["ps","--all","--filter",`label=${Lw}=${this.opts.owner}`,"--format",`{{.Names}} {{.Label "${Mw}"}}`]);if(r.code!==0)throw new Error(`failed to list sandboxes: ${bp(r)}`);let s=r.stdout.split(`
550
- `).map(a=>a.trim().split(" ")).filter(([a,c])=>a&&c!==this.instance&&!n.has(c??"")).map(([a])=>a),i=this.opts.socketDir??Gw,o=[];for(let a of s)if((await this.opts.exec(["rm","--force",a])).code===0){o.push(a);try{Gt.rmSync(Ls.join(i,a),{recursive:!0,force:!0})}catch{}}return o}beat(){!this.opts.owner||!this.opts.heartbeatDir||(Gt.mkdirSync(this.opts.heartbeatDir,{recursive:!0}),Gt.writeFileSync(Ls.join(this.opts.heartbeatDir,this.instance),""))}async destroyAll(){await Promise.all([...this.sandboxes.keys()].map(e=>this.destroyById(e))),this.opts.heartbeatDir&&Gt.rmSync(Ls.join(this.opts.heartbeatDir,this.instance),{force:!0})}async destroyById(e){let n=this.sandboxes.get(e);if(n){this.sandboxes.delete(e),n.ttl&&clearTimeout(n.ttl),await this.opts.exec(["rm","--force",e]);try{Gt.rmSync(Ls.dirname(n.socketPath),{recursive:!0,force:!0})}catch{}}}};Ye.ContainerSandboxDriver=vp;function jw(t,e){if(Gt.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Gt.chownSync(t,e.uid,e.gid),Gt.chmodSync(t,448);return}catch{}Gt.chmodSync(t,987)}function xw(t,e,n=typeof process.getuid=="function"?process.getuid():void 0){let r=Gt.lstatSync(t);if(r.isSymbolicLink())throw new Error(`sandbox socket ${t} is a symlink \u2014 refusing to connect`);if(!r.isSocket())throw new Error(`sandbox socket ${t} is not a unix socket \u2014 refusing to connect`);let s=new Set;if(n!==void 0&&s.add(n),e&&s.add(e.uid),s.add(0),!s.has(r.uid))throw new Error(`sandbox socket ${t} is owned by uid ${r.uid}, which is neither this process nor the sandbox \u2014 another local user may have raced the bind. Refusing to connect.`)}function Uw(t,e){let n=t.indexOf(":"),[r,s]=n===-1?[t,t]:[t.slice(0,n),t.slice(n+1)];return`${r}:${s}${e?":ro":""}`}function rM(t){let e=/@sha256:[a-f0-9]{64}$/.test(t),n=/^sha256:[a-f0-9]{64}$/.test(t);if(!e&&!n)throw new Error(`sandbox image must be pinned by digest (got "${t}") \u2014 a mutable tag makes signing and rollback unverifiable`)}function bp(t){return`${t.stdout??""}${t.stderr??""}`.trim()||"(no output)"}var sM=new Set(["localhost","127.0.0.1","::1","0.0.0.0","[::1]"]);function iM(t){let e=t.replace(/^\w+:\/\//,"").split(/[:/]/)[0];if(sM.has(e.toLowerCase()))throw new Error(`route target "${t}" is loopback, which inside a sandbox means the sandbox itself \u2014 a tier-2 sandbox cannot reach a service on the host this way. Give the service a name the sandbox can resolve (a compose service name, or host.docker.internal) on a network named agenthippo-<host>, or run this deployment with --sandbox process.`);return`agenthippo-${e}`}function oM(t){let e=zL.createConnection(t),n=new Promise((r,s)=>{e.once("close",()=>r()),e.once("error",i=>s(new Error(`sandbox channel closed: ${i.message}`)))});return{input:e,output:{write:r=>e.write(r)},closed:n}}function aM(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Yw=T(gt=>{"use strict";Object.defineProperty(gt,"__esModule",{value:!0});gt.ProcessSandboxDriver=gt.PROVIDER_KEY_PASSTHROUGH_VARS=gt.NS_PROBE_ARGS=gt.UNSHARE_WRAP_ARGS=void 0;gt.namespaceIsolationFromEnv=lM;gt.probeNamespaceIsolation=Vw;gt.providerKeyPassthroughFromEnv=Kw;gt.sandboxEnvCarriesProviderKey=Ww;gt.baseSandboxEnv=qw;var Fw=require("node:child_process"),Op=al(),cM=Li();function lM(t=process.env){let e=t.AGENTHIPPO_SANDBOX_NS_ISOLATION?.trim().toLowerCase();return e==="off"||e==="0"?"off":e==="require"?"require":"auto"}gt.UNSHARE_WRAP_ARGS=["--user","--map-current-user","--pid","--fork","--kill-child=SIGTERM","--mount-proc"];gt.NS_PROBE_ARGS=[...gt.UNSHARE_WRAP_ARGS,"unshare","--user","true"];async function Vw(t=Fw.spawn,e=5e3){return new Promise(n=>{let r,s=!1,i=a=>{s||(s=!0,r&&clearTimeout(r),n(a))},o;try{o=t("unshare",[...gt.NS_PROBE_ARGS],{stdio:"ignore"})}catch{i(!1);return}r=setTimeout(()=>{o.kill("SIGKILL"),i(!1)},e),r.unref?.(),o.once("error",()=>i(!1)),o.once("exit",a=>i(a===0))})}gt.PROVIDER_KEY_PASSTHROUGH_VARS=["CURSOR_API_KEY"];function Kw(t=process.env){return t.AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY==="1"}function Ww(t){return gt.PROVIDER_KEY_PASSTHROUGH_VARS.some(e=>!!t[e])}var Ip=class{opts;kind="process";tier=0;sandboxes=new Map;seq=0;nsWrap;constructor(e){this.opts=e}namespaceWrap(){if(!this.nsWrap){let e=this.opts.namespaceIsolation??"off";if(e==="off")this.nsWrap=Promise.resolve(!1);else{let n=this.opts.probeFn??(()=>Vw());this.nsWrap=n().then(r=>{if(r)return this.opts.logger?.info("[Sandbox] namespace isolation active: each sandbox gets its own PID namespace (/proc shows only its own tree)"),!0;if(e==="require")throw new Error(`AGENTHIPPO_SANDBOX_NS_ISOLATION=require, but this host cannot run \`unshare ${gt.UNSHARE_WRAP_ARGS.join(" ")}\` \u2014 no sandbox may exist here whose env is readable by a concurrent tenant. Enable unprivileged user namespaces (or use --sandbox container), or drop the requirement.`);return this.opts.logger?.warn("namespace isolation unavailable on this host (unshare probe failed) \u2014 tier-0 sandboxes share one /proc, so a concurrent same-uid process can read a turn's env. Fine on a laptop; on a multi-tenant host set AGENTHIPPO_SANDBOX_NS_ISOLATION=require or use --sandbox container."),!1})}}return this.nsWrap}async create(e){let n=`sandbox-${++this.seq}-${uM(e.sandboxKey)}`,r=this.opts.spawnFn??Fw.spawn,s=await this.namespaceWrap(),i=s?"unshare":this.opts.command,o=s?[...gt.UNSHARE_WRAP_ARGS,this.opts.command,...this.opts.args??[]]:this.opts.args??[],c={...qw({...this.opts.allowProviderKeyPassthrough!==void 0?{allowProviderKeyPassthrough:this.opts.allowProviderKeyPassthrough}:{},logger:{warn:g=>console.warn(g)}}),...this.opts.env,...e.env},l=Ww(c),u=r(i,o,{cwd:this.opts.cwd,stdio:["pipe","pipe","inherit"],env:{...c,[Op.SANDBOX_TIER_ENV]:String(this.tier),...l?{[Op.SANDBOX_PROVIDER_KEY_ENV]:"1"}:{}}});l&&console.warn(`[Sandbox] ${n} runs WITH a raw provider key in its environment (${gt.PROVIDER_KEY_PASSTHROUGH_VARS.filter(g=>c[g]).join(", ")}). This sandbox does not have the model-credential containment the other engines get; disclose it in the deployment.`);let d=new Promise(g=>{u.once("exit",()=>g()),u.once("error",()=>g())}),f={input:u.stdout,output:{write:g=>u.stdin?.write(g)??!1},closed:d},p={child:u,channel:f,idleSeconds:e.limits.ttlSeconds};return this.armIdleReap(n,p),this.sandboxes.set(n,p),{id:n,tier:this.tier,endpoint:"stdio",connect:()=>f}}async revoke(e,n){if(n!=="all")throw new Op.RevocationUnsupportedError("process",n);await this.kill(e.id)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.kill(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.kill(e.id)}async kill(e){let n=this.sandboxes.get(e);n&&(this.sandboxes.delete(e),n.ttl&&clearTimeout(n.ttl),n.child.exitCode===null&&!n.child.killed&&n.child.kill("SIGTERM"))}};gt.ProcessSandboxDriver=Ip;function qw(t={},e=process.env){let n=["PATH","HOME","LANG","LC_ALL","TMPDIR","TERM","NODE_ENV","CLAUDE_CODE_PATH","CODEX_PATH","AGENTHIPPO_CUSTOM_ENGINES_DIR","AGENTHIPPO_NO_AUTO_INSTALL","AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_LITELLM_BASE_URL","AGENTHIPPO_SERVE",cM.ENGINE_IDLE_TTL_ENV,"HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","NO_PROXY","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE"],r={};for(let i of n){let o=e[i];o&&(r[i]=o)}let s=t.allowProviderKeyPassthrough??Kw(e);for(let i of gt.PROVIDER_KEY_PASSTHROUGH_VARS){let o=e[i];if(o){if(!s){t.logger?.warn(`[Sandbox] ${i} is set but was NOT passed into the sandbox: a raw provider key in a sandbox can call the provider directly, around the inference proxy and its spend cap. Cursor packs need it and cannot be proxied \u2014 set AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY=1 to allow it and accept that this sandbox holds a provider credential.`);continue}r[i]=o}}return r}function uM(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Pp=T(Nt=>{"use strict";var dM=Nt&&Nt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fM=Nt&&Nt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Xw=Nt&&Nt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dM(n,e,r[s]);return fM(n,e),n}})();Object.defineProperty(Nt,"__esModule",{value:!0});Nt.DEPRECATED_SANDBOX_ENV_ALIASES=void 0;Nt.dockerExec=hM;Nt.alignSandboxWorkspaceOwnership=mM;Nt.resolveSandboxImageUser=Qw;Nt.ensureSandboxStateDir=_M;Nt.sandboxScriptArg=wM;Nt.applyDeprecatedSandboxEnvAliases=eS;Nt.loadWarrantKeypair=AM;Nt.mintSandboxInferenceWarrant=TM;var pM=require("node:child_process"),xa=Xw(require("node:fs")),gM=Xw(require("node:path")),zw=si();function hM(t){return new Promise(e=>{(0,pM.execFile)("docker",t,{maxBuffer:8<<20},(n,r,s)=>{if(n){let i=typeof n.code=="number"?n.code:1;e({stdout:`${r??""}${s??""}`,code:i});return}e({stdout:r??"",stderr:s??"",code:0})})})}async function mM(t){let e=t.writable.map(i=>i.includes(":")?i.slice(0,i.indexOf(":")):i);if(e.length===0)return;let n=await Qw(t.exec,t.image);if(!n){t.logger?.warn(`[Sandbox] could not determine the sandbox image's uid; if turns fail with EACCES in the workspace, run: chown -R <image-uid> ${e.join(" ")}`);return}if(n.uid===0)return;let{uid:r,gid:s}=n;for(let i of e)try{let o=Zw(i,r,s);o>0&&t.logger?.info(`[Sandbox] aligned ${o} path(s) under ${i} to the sandbox image's uid ${r}:${s}`)}catch(o){t.logger?.warn(`[Sandbox] could not align ownership of ${i} for the sandbox (uid ${r}): ${o instanceof Error?o.message:String(o)}. Run: chown -R ${r}:${s} ${i}`)}}async function Qw(t,e){let n=await Jw(t,e,"-u");if(n!==void 0)return{uid:n,gid:await Jw(t,e,"-g")??n}}function _M(t,e){if(xa.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Zw(t,e.uid,e.gid)}catch{}return t}async function Jw(t,e,n){let r=await t(["run","--rm","--network","none","--entrypoint","id",e,n]);if(r.code!==0)return;let s=Number.parseInt(r.stdout.trim(),10);return Number.isInteger(s)?s:void 0}function Zw(t,e,n){let r=0,s=i=>{let o=xa.lstatSync(i);if((o.uid!==e||o.gid!==n)&&(xa.lchownSync(i,e,n),r++),o.isDirectory())for(let a of xa.readdirSync(i))s(gM.join(i,a))};return xa.existsSync(t)?(s(t),r):0}var EM=["/$bunfs","/snapshot"];function yM(t){return t.replace(/\\/g,"/").replace(/^[A-Za-z]:/,"")}function wM(t=process.argv,e=process.execPath){let n=t[1];if(!n||n===e)return[];let r=yM(n);return EM.some(s=>r.startsWith(s))?[]:[n]}Nt.DEPRECATED_SANDBOX_ENV_ALIASES=[["AGENTHIPPO_CELL","AGENTHIPPO_SANDBOX"],["AGENTHIPPO_CELL_TIER","AGENTHIPPO_SANDBOX_TIER"],["AGENTHIPPO_CELL_SOCKET_DIR","AGENTHIPPO_SANDBOX_SOCKET_DIR"],["AGENTHIPPO_CELL_STRICT_EGRESS","AGENTHIPPO_SANDBOX_STRICT_EGRESS"],["AGENTHIPPO_CELL_ALLOW_PROVIDER_KEY","AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY"]];var SM=new Set;function eS(t=process.env,e=r=>console.warn(r),n=SM){let r=[];for(let[s,i]of Nt.DEPRECATED_SANDBOX_ENV_ALIASES){let o=t[s];if(!(o===void 0||o==="")){if(t[i]!==void 0&&t[i]!==""){n.has(s)||(n.add(s),e(`[Sandbox] DEPRECATED: ${s} is set but ${i} is also set \u2014 using ${i} and IGNORING ${s}. Remove ${s}; it was renamed in the cell \u2192 sandbox migration.`));continue}t[i]=o,r.push(i),n.has(s)||(n.add(s),e(`[Sandbox] DEPRECATED: ${s} was renamed to ${i} in the cell \u2192 sandbox migration. The old value is being honoured for now, but it will stop working \u2014 set ${i}=${o} instead.`))}}return r}eS();function AM(t){let e=process.env.AGENTHIPPO_WARRANT_PRIVATE_KEY?.trim(),n=process.env.AGENTHIPPO_WARRANT_KID?.trim();if(e){let i=require("node:crypto").createPublicKey(e).export({type:"spki",format:"pem"}).toString();return{privateKeyPem:e,publicKeyPem:i,kid:n||"default"}}let r=(0,zw.generateWarrantKeypair)(n);return t?.info(`[Warrant] no AGENTHIPPO_WARRANT_PRIVATE_KEY \u2014 generated an ephemeral key (kid=${r.kid}). Configure gateways with:
549
+ `,y=await createPullRequest(g,`[${n}] Add ${r} v${s}`,h,p);return e&&(0,utils_1.logInfo)(e,`[Store] OK Created PR: ${y.url}`),{prUrl:y.url,prNumber:y.number,tagName:c}}function parseGitHubUrl(t){return(0,shared_1.parseGitHubUrl)(t,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo)}async function detectArtifactType(t,e,n,r,s){let i=r?`${r}/`:"",o=n||"main",a=async c=>{let l=`https://api.github.com/repos/${t}/${e}/contents/${i}${c}?ref=${o}`;try{return(await fetch(l,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}})).ok}catch{return!1}};if(s&&(0,utils_1.logInfo)(s,`[Store] Detecting artifact type for ${t}/${e}/${i}...`),await a("agent.yaml"))return"pack";if(await a("SKILL.md"))return"skill";if(await a(".mcp.json")||await a("mcp.json"))return"mcp";if(await a("engine.manifest.json"))return"engine";if(await a("view.yaml")&&await a("panel-entry.yaml"))return"view";throw new Error(`Cannot detect artifact type in ${t}/${e}${r?`/${r}`:""}. Expected agent.yaml, SKILL.md, .mcp.json, engine.manifest.json, or view.yaml with panel-entry.yaml`)}exports.parseStoreUrl=shared_1.parseStoreUrl;function isStoreUrl(t){return(0,shared_1.isStoreUrl)(t,exports.STORE_CONFIG.owner,exports.STORE_CONFIG.repo)}async function listStoreIndex(t,e){let n=[],r=t?[(0,shared_1.getStorePath)(t)]:[exports.STORE_CONFIG.paths.packs,exports.STORE_CONFIG.paths.skills,exports.STORE_CONFIG.paths.mcp,exports.STORE_CONFIG.paths.engines,exports.STORE_CONFIG.paths.spotlightViews];for(let s of r){let i=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/contents/${s}`;try{let o=await fetch(i,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"AgentIDE"}});if(!o.ok){e&&(0,utils_1.logInfo)(e,`[Store] No ${s} directory found`);continue}let a=await o.json();for(let c of a)if(c.type==="dir"){let l=s===exports.STORE_CONFIG.paths.packs?"pack":s===exports.STORE_CONFIG.paths.skills?"skill":s===exports.STORE_CONFIG.paths.mcp?"mcp":s===exports.STORE_CONFIG.paths.engines?"engine":"view";n.push({type:l,slug:c.name,path:c.path})}}catch(o){e&&(0,utils_1.logInfo)(e,`[Store] Error listing ${s}: ${o}`)}}return n}exports.formatStoreUrl=shared_1.formatStoreUrl});var nu=T(Qe=>{"use strict";Object.defineProperty(Qe,"__esModule",{value:!0});Qe.CapMeter=Qe.CAP_ENV_ALIASES=Qe.parseCapPolicy=Qe.STRICTEST_ON_BREACH=Qe.ON_BREACH_ALIASES=Qe.ON_BREACH_ACTIONS=Qe.LEASE_CAP_FIELDS=Qe.LEASE_CAP_ALIASES=Qe.DEPRECATED_CAP_SPELLINGS=void 0;Qe.resolveOnBreach=Cw;Qe.mergeCaps=FL;Qe.capsAreUnbounded=VL;Qe.capsFromEnv=KL;var xo=La(),qi=La();Object.defineProperty(Qe,"DEPRECATED_CAP_SPELLINGS",{enumerable:!0,get:function(){return qi.DEPRECATED_CAP_SPELLINGS}});Object.defineProperty(Qe,"LEASE_CAP_ALIASES",{enumerable:!0,get:function(){return qi.LEASE_CAP_ALIASES}});Object.defineProperty(Qe,"LEASE_CAP_FIELDS",{enumerable:!0,get:function(){return qi.LEASE_CAP_FIELDS}});Object.defineProperty(Qe,"ON_BREACH_ACTIONS",{enumerable:!0,get:function(){return qi.ON_BREACH_ACTIONS}});Object.defineProperty(Qe,"ON_BREACH_ALIASES",{enumerable:!0,get:function(){return qi.ON_BREACH_ALIASES}});Object.defineProperty(Qe,"STRICTEST_ON_BREACH",{enumerable:!0,get:function(){return qi.STRICTEST_ON_BREACH}});Object.defineProperty(Qe,"parseCapPolicy",{enumerable:!0,get:function(){return qi.parseCapPolicy}});Qe.CAP_ENV_ALIASES={AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"};function Cw(t,e){let n=t?.trim();if(!n)return{action:void 0,warnings:[]};if(n in xo.ON_BREACH_ACTIONS)return{action:n,warnings:[]};let r=xo.ON_BREACH_ALIASES[n];return r?{action:r,warnings:[`${e}="${n}" is DEPRECATED; use "${xo.DEPRECATED_CAP_SPELLINGS[n]??r}". Treating it as "${r}". The old spelling will stop being accepted.`]}:{action:xo.STRICTEST_ON_BREACH,warnings:[`${e}="${n}" is not a breach action this build understands. FAILING CLOSED to "${xo.STRICTEST_ON_BREACH}" \u2014 an unreadable enforcement setting must never weaken enforcement. Known actions: ${Object.keys(xo.ON_BREACH_ACTIONS).join(", ")}.`]}}var BL=1e4;function FL(t,e){let n=t??{},r=e??{},s=(i,o)=>i===void 0?o:o===void 0?i:Math.min(i,o);return{maxTurnsPerSession:s(n.maxTurnsPerSession,r.maxTurnsPerSession),maxSessionSeconds:s(n.maxSessionSeconds,r.maxSessionSeconds),maxConcurrentSandboxes:s(n.maxConcurrentSandboxes,r.maxConcurrentSandboxes),onBreach:n.onBreach==="destroy-sandbox"||r.onBreach==="destroy-sandbox"?"destroy-sandbox":n.onBreach??r.onBreach}}function VL(t){return t.maxTurnsPerSession===void 0&&t.maxSessionSeconds===void 0&&t.maxConcurrentSandboxes===void 0}var Tp=class{caps;sessions=new Map;constructor(e){this.caps=e}setCaps(e){this.caps=e}policy(){return this.caps}check(e,n,r=Date.now()){let s=this.sessions.get(e);if(this.caps.maxTurnsPerSession!==void 0&&s&&s.turns>=this.caps.maxTurnsPerSession)return{allowed:!1,cap:"turns",reason:`session turn cap reached (${s.turns}/${this.caps.maxTurnsPerSession})`};if(this.caps.maxSessionSeconds!==void 0&&s){let i=Math.floor((r-s.startedAtMs)/1e3);if(i>=this.caps.maxSessionSeconds)return{allowed:!1,cap:"duration",reason:`session duration cap reached (${i}s/${this.caps.maxSessionSeconds}s)`}}return this.caps.maxConcurrentSandboxes!==void 0&&!s&&n>=this.caps.maxConcurrentSandboxes?{allowed:!1,cap:"concurrency",reason:`instance is at its concurrent sandbox cap (${n}/${this.caps.maxConcurrentSandboxes})`}:{allowed:!0}}record(e,n=Date.now()){let r=this.sessions.get(e);if(r){r.turns+=1;return}if(this.sessions.size>=BL){let s,i=1/0;for(let[o,a]of this.sessions)a.startedAtMs<i&&(i=a.startedAtMs,s=o);s&&this.sessions.delete(s)}this.sessions.set(e,{turns:1,startedAtMs:n})}forget(e){this.sessions.delete(e)}usage(e){let n=this.sessions.get(e);if(n)return{turns:n.turns,ageSeconds:Math.floor((Date.now()-n.startedAtMs)/1e3)}}};Qe.CapMeter=Tp;function KL(t=process.env,e=n=>console.warn(`Warning: ${n}`)){let n=i=>{let o=parseInt((i??"").trim(),10);return Number.isFinite(o)&&o>0?o:void 0},r=i=>{let o=n(t[i]);if(o!==void 0)return o;for(let[a,c]of Object.entries(Qe.CAP_ENV_ALIASES)){if(c!==i)continue;let l=n(t[a]);if(l!==void 0)return e(`${a} is DEPRECATED; use ${i}. Honouring it for now.`),l}},s=Cw(t.AGENTHIPPO_CAP_ON_BREACH,"AGENTHIPPO_CAP_ON_BREACH");for(let i of s.warnings)e(i);return{maxTurnsPerSession:r("AGENTHIPPO_MAX_TURNS_PER_SESSION"),maxSessionSeconds:r("AGENTHIPPO_MAX_SESSION_SECONDS"),maxConcurrentSandboxes:r("AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"),onBreach:s.action}}});var $w=T(Ha=>{"use strict";Object.defineProperty(Ha,"__esModule",{value:!0});Ha.effectiveDenyMode=kw;Ha.createGovernor=WL;Ha.withGovernor=qL;var ru=nu(),Bo=jo();function kw(t,e){return t==="kill"&&!e?"drain":t}function WL(t){let e=new ru.CapMeter(t.caps),n=(0,ru.capsAreUnbounded)(t.caps),r,s,i,o=new Map,a=t.sandboxes.supportsInFlightTermination!==!1,c=new Map,l=new Set,u=(h,y)=>{try{t.audit?.(h,y)}catch{}},f=1e4,d=(h,y)=>{if(o.size>=f&&!o.has(h)){let E=o.keys().next();E.done||o.delete(E.value)}o.set(h,y)},g=async(h,y)=>{let E=e.policy().onBreach??"revoke-inference";try{E==="destroy-sandbox"?await t.sandboxes.destroySession(h):await t.sandboxes.revokeRoute(h,"inference")}catch(w){t.logger?.warn(`[Governor] ${E} failed for ${h}, destroying instead: ${w instanceof Error?w.message:String(w)}`),await t.sandboxes.destroySession(h).catch(()=>{})}t.logger?.warn(`[Governor] cap breach on ${h}: ${y.reason} \u2014 ${E}`),u("cap_breach",{sessionKey:h,cap:y.cap,reason:y.reason,action:E})},p=async(h,y=!1)=>{let E=t.sandboxes.sandboxes();for(let w of E)await t.sandboxes.destroySession(w.sandboxKey).catch(()=>{});return E.length>0?t.logger?.warn(`[Governor] kill switch: destroyed ${E.length} live sandbox(s) \u2014 ${h}`):!a&&!y&&t.logger?.warn(`[Governor] kill switch: no sandbox driver, so nothing running can be stopped \u2014 in-flight turns will finish and only NEW turns are refused (${h}). Run with --sandbox for true in-flight kill.`),(E.length>0||!y)&&u("kill_switch",{reason:h,destroyed:E.length,inFlightTerminated:a}),E.length},_=async()=>{if(t.getLease)try{let h=await t.getLease(),y=(0,ru.mergeCaps)(h?.caps,t.caps);if(e.setCaps(y),n=(0,ru.capsAreUnbounded)(y),i=h,c=(0,Bo.resolveFollowedUsers)(h,o),!a)for(let w of h?.deny??[]){if(w.mode!=="kill")continue;let A=`${w.scope}:${w.match}`;l.has(A)||(l.add(A),t.logger?.warn(`[Governor] deny(kill) on ${A} DEGRADED TO DRAIN: this deployment has no sandbox driver, so a turn already executing cannot be stopped. It will run to completion; only the next turn is refused. Run serve with --sandbox for a kill that ends work mid-flight.`),u("deny_kill_degraded",{scope:w.scope,match:w.match,effectiveMode:"drain"}))}for(let w of t.sandboxes.sandboxes()){let A=w.sessionKeys.map(S=>({sessionKey:S,v:(0,Bo.denyVerdict)(h,{sessionKey:S,pack:t.pack??"",userHash:t.userHash,userId:o.get(S),followedUsers:c})})).find(({v:S})=>S.denied&&kw(S.mode,a)==="kill");if(A){await t.sandboxes.destroySession(w.sandboxKey).catch(()=>{});for(let S of w.sessionKeys)o.delete(S);t.logger?.warn(`[Governor] deny(kill) destroyed ${w.sandboxId} \u2014 ${A.v.reason}`),u("session_killed",{sessionKey:A.sessionKey,sandboxId:w.sandboxId,reason:A.v.reason,collateralSessions:w.sessionKeys.filter(S=>S!==A.sessionKey)})}}let E=(0,Bo.leaseIsDead)(h);if(E.dead){let w=E.reason??"lease revoked",A=s===w;s=w,await p(w,A)}else s&&(t.logger?.info("[Governor] lease restored \u2014 accepting turns again"),u("kill_switch_lifted",{}),s=void 0)}catch(h){t.logger?.warn(`[Governor] lease check failed: ${h instanceof Error?h.message:String(h)}`)}};return{async admitTurn(h,y){if(s)return{allowed:!1,reason:`stopped by the control plane: ${s}`};y&&d(h,y);let E=(0,Bo.denyVerdict)(i,{sessionKey:h,pack:t.pack??"",userHash:t.userHash,userId:y??o.get(h),followedUsers:(0,Bo.resolveFollowedUsers)(i,o)});if(E.denied)return{allowed:!1,reason:E.reason};if(t.admitPack){let A=t.admitPack(h,i);if(!A.allowed)return{allowed:!1,reason:A.reason??"refused by pack admission"}}if(n)return{allowed:!0};let w=e.check(h,t.sandboxes.sandboxes().length);return w.allowed||w.cap!=="concurrency"&&await g(h,w),w},atCapacity(h){if(s||n)return;let y=e.check(h,t.sandboxes.sandboxes().length);return!y.allowed&&y.cap==="concurrency"?y.reason:void 0},recordTurn(h){e.record(h)},killAll:p,refresh:_,start(){if(!t.getLease||r)return;let h=(0,Bo.resolveLeasePollSeconds)(t.pollSeconds)*1e3;r=setInterval(()=>{_()},h),r.unref?.(),_()},stop(){r&&(clearInterval(r),r=void 0)},policy:()=>e.policy()}}function qL(t,e){return{async run(n){let r=n.sessionId??"default",s=await e.admitTurn(r,n.analyticsUserId);return s.allowed?(e.recordTurn(r),t.run(n)):{success:!1,text:"",thinking:"",toolCalls:[],error:s.reason??"refused by policy",...s.cap==="concurrency"?{atCapacity:!0}:{}}},dispose(){e.stop(),t.dispose()}}}});var Bw=T(Ye=>{"use strict";var YL=Ye&&Ye.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),JL=Ye&&Ye.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ja=Ye&&Ye.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&YL(n,e,r[s]);return JL(n,e),n}})();Object.defineProperty(Ye,"__esModule",{value:!0});Ye.ContainerSandboxDriver=Ye.SANDBOX_PACK_DIR=Ye.SANDBOX_WORKSPACE_DIR=Ye.SANDBOX_STATE_DIR=Ye.SANDBOX_SOCKET_DIR_IN_SANDBOX=Ye.ORPHAN_SWEEP_INTERVAL_MS=void 0;Ye.strictEgressFromEnv=Hw;Ye.prepareSocketDir=jw;Ye.assertOwnSocket=xw;var XL=ja(require("node:crypto")),Gt=ja(require("node:fs")),zL=ja(require("node:net")),QL=ja(require("node:os")),Ls=ja(require("node:path")),Dw=al(),Lw="ai.agenthippo.owner",Mw="ai.agenthippo.instance";Ye.ORPHAN_SWEEP_INTERVAL_MS=3e4;var ZL=3*Ye.ORPHAN_SWEEP_INTERVAL_MS;function Hw(t=process.env){return t.AGENTHIPPO_SANDBOX_STRICT_EGRESS==="1"}function eM(){let t=[process.env.AGENTHIPPO_SANDBOX_SOCKET_DIR,"/run/agenthippo/sandboxes",process.env.XDG_RUNTIME_DIR?Ls.join(process.env.XDG_RUNTIME_DIR,"agenthippo-sandboxes"):void 0,Ls.join(QL.tmpdir(),"agenthippo-sandboxes")].filter(e=>!!e);for(let e of t)try{if(Gt.mkdirSync(e,{recursive:!0}),Gt.accessSync(e,Gt.constants.W_OK),e.length>60)continue;return e}catch{}return"/run/agenthippo/sandboxes"}var Gw=eM(),tM=9e4,nM=150;Ye.SANDBOX_SOCKET_DIR_IN_SANDBOX="/run/sandbox";Ye.SANDBOX_STATE_DIR="/state";Ye.SANDBOX_WORKSPACE_DIR="/state/workspace";Ye.SANDBOX_PACK_DIR="/app/pack";var vp=class{opts;kind="container";tier=2;sandboxes=new Map;seq=0;instance=XL.randomBytes(2).toString("hex");constructor(e){this.opts=e}async create(e){rM(e.image);let n=`sandbox-${this.instance}-${++this.seq}-${aM(e.sandboxKey)}`,r=this.opts.socketDir??Gw,s=Ls.join(r,n),i=Ls.join(s,"sandbox.sock");Gt.rmSync(s,{recursive:!0,force:!0}),jw(s,this.opts.socketOwner);let o=e.routes.map(h=>({kind:h.kind,network:iM(h.target)})),c=await this.assertRouteNetworks(o)?this.tier:1,l=o[0],u=["run","--detach","--name",n,"--network",l?l.network:"none","--cap-drop","ALL","--security-opt","no-new-privileges","--read-only","--tmpfs","/tmp:rw,exec,nosuid,size=512m",...e.stateDir?["--volume",`${e.stateDir}:${Ye.SANDBOX_STATE_DIR}`]:["--tmpfs",`${Ye.SANDBOX_STATE_DIR}:rw,exec,nosuid,size=512m,mode=1777`],"--volume",`${s}:${Ye.SANDBOX_SOCKET_DIR_IN_SANDBOX}`,"--label",`ai.agenthippo.sandbox=${n}`,"--label",`ai.agenthippo.session=${e.sandboxKey}`,"--label",`ai.agenthippo.tier=${e.tier}`,"--label",`${Mw}=${this.instance}`,...this.opts.owner?["--label",`${Lw}=${this.opts.owner}`]:[]];for(let h of e.fs.readonly)u.push("--volume",Uw(h,!0));for(let h of e.fs.writable)u.push("--volume",Uw(h,!1));e.limits.memMiB&&u.push("--memory",`${e.limits.memMiB}m`),e.limits.cpu&&u.push("--cpus",e.limits.cpu);for(let[h,y]of Object.entries(e.env??{}))u.push("--env",`${h}=${y}`);u.push("--env",`${Dw.SANDBOX_TIER_ENV}=${c}`),u.push(e.image);let f=await this.opts.exec(u);if(f.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to create sandbox ${n}: ${f.stdout.trim()||`exit ${f.code}`}`);let d=f.stdout.trim(),g=new Map;l&&g.set(l.kind,l.network);for(let h of o.slice(1)){let y=await this.opts.exec(["network","connect",h.network,n]);if(y.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to attach ${h.kind} route for sandbox ${n}: ${y.stdout.trim()}`);g.set(h.kind,h.network)}await this.waitForSocket(n,i);let p={containerId:d,socketPath:i,networks:g,idleSeconds:e.limits.ttlSeconds};this.armIdleReap(n,p),this.sandboxes.set(n,p);let _=this.opts.connectFn??oM;return{id:n,tier:c,endpoint:i,connect:()=>_(i)}}async assertRouteNetworks(e){let n=new Set,r=!0;for(let s of e){if(n.has(s.network))continue;n.add(s.network);let i=await this.opts.exec(["network","inspect","--format","{{.Internal}}",s.network]);if(i.code!==0)throw new Error(`route network "${s.network}" (${s.kind}) does not exist \u2014 a tier-2 sandbox is created on its declared route networks and nothing creates them for you. Create it (\`docker network create --internal ${s.network}\`) and put the ${s.kind} service on it.`);if(i.stdout.trim()!=="true"){if(r=!1,this.opts.strictEgress??Hw())throw new Error(`route network "${s.network}" (${s.kind}) is not --internal, and strict egress containment is enabled (AGENTHIPPO_SANDBOX_STRICT_EGRESS=1). A sandbox on this network can reach any host it routes to, so the tier-2 containment claim would be false. Recreate it as internal (\`docker network rm ${s.network} && docker network create --internal ${s.network}\`), or unset AGENTHIPPO_SANDBOX_STRICT_EGRESS to accept a sandbox whose egress is bounded by the network topology instead.`);this.opts.logger?.warn(`route network "${s.network}" (${s.kind}) is not --internal: this sandbox can reach any host that network routes to, so tier-2 egress is bounded by that network's topology, not by the sandbox. This sandbox is therefore reported as tier 1, not tier 2. Make the network internal (or set AGENTHIPPO_SANDBOX_STRICT_EGRESS=1 to refuse outright).`)}}return r}async waitForSocket(e,n){let r=this.opts.socketWaitMs??tM;if(r<=0)return;let s=Date.now()+r;for(;Date.now()<s;){if(Gt.existsSync(n)){try{xw(n,this.opts.socketOwner)}catch(a){throw await this.opts.exec(["rm","--force",e]),a}return}if((await this.opts.exec(["inspect","--format","{{.State.Running}}",e])).stdout.trim()==="false"){let a=await this.opts.exec(["logs","--tail","20",e]);throw await this.opts.exec(["rm","--force",e]),new Error(`sandbox ${e} exited during boot: ${bp(a)}`)}await new Promise(a=>setTimeout(a,nM))}let i=await this.opts.exec(["logs","--tail","20",e]);throw await this.opts.exec(["rm","--force",e]),new Error(`sandbox ${e} did not bind ${n} within ${r/1e3}s: ${bp(i)}`)}async revoke(e,n){let r=this.sandboxes.get(e.id);if(!r)return;if(n==="all")return this.destroyById(e.id);let s=r.networks.get(n);if(!s)throw new Dw.RevocationUnsupportedError("container",n);let i=await this.opts.exec(["network","disconnect","--force",s,e.id]);if(i.code!==0)throw new Error(`failed to revoke ${n} for sandbox ${e.id}: ${i.stdout.trim()}`);r.networks.delete(n)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.destroyById(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.destroyById(e.id)}async sweepOrphans(){if(!this.opts.owner)return[];this.beat();let e=this.opts.heartbeatDir,n=new Set;if(e)for(let a of Gt.readdirSync(e)){let c=Ls.join(e,a);try{Date.now()-Gt.statSync(c).mtimeMs<ZL?n.add(a):Gt.rmSync(c,{force:!0})}catch{}}let r=await this.opts.exec(["ps","--all","--filter",`label=${Lw}=${this.opts.owner}`,"--format",`{{.Names}} {{.Label "${Mw}"}}`]);if(r.code!==0)throw new Error(`failed to list sandboxes: ${bp(r)}`);let s=r.stdout.split(`
550
+ `).map(a=>a.trim().split(" ")).filter(([a,c])=>a&&c!==this.instance&&!n.has(c??"")).map(([a])=>a),i=this.opts.socketDir??Gw,o=[];for(let a of s)if((await this.opts.exec(["rm","--force",a])).code===0){o.push(a);try{Gt.rmSync(Ls.join(i,a),{recursive:!0,force:!0})}catch{}}return o}beat(){!this.opts.owner||!this.opts.heartbeatDir||(Gt.mkdirSync(this.opts.heartbeatDir,{recursive:!0}),Gt.writeFileSync(Ls.join(this.opts.heartbeatDir,this.instance),""))}async destroyAll(){await Promise.all([...this.sandboxes.keys()].map(e=>this.destroyById(e))),this.opts.heartbeatDir&&Gt.rmSync(Ls.join(this.opts.heartbeatDir,this.instance),{force:!0})}async destroyById(e){let n=this.sandboxes.get(e);if(n){this.sandboxes.delete(e),n.ttl&&clearTimeout(n.ttl),await this.opts.exec(["rm","--force",e]);try{Gt.rmSync(Ls.dirname(n.socketPath),{recursive:!0,force:!0})}catch{}}}};Ye.ContainerSandboxDriver=vp;function jw(t,e){if(Gt.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Gt.chownSync(t,e.uid,e.gid),Gt.chmodSync(t,448);return}catch{}Gt.chmodSync(t,987)}function xw(t,e,n=typeof process.getuid=="function"?process.getuid():void 0){let r=Gt.lstatSync(t);if(r.isSymbolicLink())throw new Error(`sandbox socket ${t} is a symlink \u2014 refusing to connect`);if(!r.isSocket())throw new Error(`sandbox socket ${t} is not a unix socket \u2014 refusing to connect`);let s=new Set;if(n!==void 0&&s.add(n),e&&s.add(e.uid),s.add(0),!s.has(r.uid))throw new Error(`sandbox socket ${t} is owned by uid ${r.uid}, which is neither this process nor the sandbox \u2014 another local user may have raced the bind. Refusing to connect.`)}function Uw(t,e){let n=t.indexOf(":"),[r,s]=n===-1?[t,t]:[t.slice(0,n),t.slice(n+1)];return`${r}:${s}${e?":ro":""}`}function rM(t){let e=/@sha256:[a-f0-9]{64}$/.test(t),n=/^sha256:[a-f0-9]{64}$/.test(t);if(!e&&!n)throw new Error(`sandbox image must be pinned by digest (got "${t}") \u2014 a mutable tag makes signing and rollback unverifiable`)}function bp(t){return`${t.stdout??""}${t.stderr??""}`.trim()||"(no output)"}var sM=new Set(["localhost","127.0.0.1","::1","0.0.0.0","[::1]"]);function iM(t){let e=t.replace(/^\w+:\/\//,"").split(/[:/]/)[0];if(sM.has(e.toLowerCase()))throw new Error(`route target "${t}" is loopback, which inside a sandbox means the sandbox itself \u2014 a tier-2 sandbox cannot reach a service on the host this way. Give the service a name the sandbox can resolve (a compose service name, or host.docker.internal) on a network named agenthippo-<host>, or run this deployment with --sandbox process.`);return`agenthippo-${e}`}function oM(t){let e=zL.createConnection(t),n=new Promise((r,s)=>{e.once("close",()=>r()),e.once("error",i=>s(new Error(`sandbox channel closed: ${i.message}`)))});return{input:e,output:{write:r=>e.write(r)},closed:n}}function aM(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Yw=T(gt=>{"use strict";Object.defineProperty(gt,"__esModule",{value:!0});gt.ProcessSandboxDriver=gt.PROVIDER_KEY_PASSTHROUGH_VARS=gt.NS_PROBE_ARGS=gt.UNSHARE_WRAP_ARGS=void 0;gt.namespaceIsolationFromEnv=lM;gt.probeNamespaceIsolation=Vw;gt.providerKeyPassthroughFromEnv=Kw;gt.sandboxEnvCarriesProviderKey=Ww;gt.baseSandboxEnv=qw;var Fw=require("node:child_process"),Op=al(),cM=Li();function lM(t=process.env){let e=t.AGENTHIPPO_SANDBOX_NS_ISOLATION?.trim().toLowerCase();return e==="off"||e==="0"?"off":e==="require"?"require":"auto"}gt.UNSHARE_WRAP_ARGS=["--user","--map-current-user","--pid","--fork","--kill-child=SIGTERM","--mount-proc"];gt.NS_PROBE_ARGS=[...gt.UNSHARE_WRAP_ARGS,"unshare","--user","true"];async function Vw(t=Fw.spawn,e=5e3){return new Promise(n=>{let r,s=!1,i=a=>{s||(s=!0,r&&clearTimeout(r),n(a))},o;try{o=t("unshare",[...gt.NS_PROBE_ARGS],{stdio:"ignore"})}catch{i(!1);return}r=setTimeout(()=>{o.kill("SIGKILL"),i(!1)},e),r.unref?.(),o.once("error",()=>i(!1)),o.once("exit",a=>i(a===0))})}gt.PROVIDER_KEY_PASSTHROUGH_VARS=["CURSOR_API_KEY"];function Kw(t=process.env){return t.AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY==="1"}function Ww(t){return gt.PROVIDER_KEY_PASSTHROUGH_VARS.some(e=>!!t[e])}var Ip=class{opts;kind="process";tier=0;sandboxes=new Map;seq=0;nsWrap;constructor(e){this.opts=e}namespaceWrap(){if(!this.nsWrap){let e=this.opts.namespaceIsolation??"off";if(e==="off")this.nsWrap=Promise.resolve(!1);else{let n=this.opts.probeFn??(()=>Vw());this.nsWrap=n().then(r=>{if(r)return this.opts.logger?.info("[Sandbox] namespace isolation active: each sandbox gets its own PID namespace (/proc shows only its own tree)"),!0;if(e==="require")throw new Error(`AGENTHIPPO_SANDBOX_NS_ISOLATION=require, but this host cannot run \`unshare ${gt.UNSHARE_WRAP_ARGS.join(" ")}\` \u2014 no sandbox may exist here whose env is readable by a concurrent tenant. Enable unprivileged user namespaces (or use --sandbox container), or drop the requirement.`);return this.opts.logger?.warn("namespace isolation unavailable on this host (unshare probe failed) \u2014 tier-0 sandboxes share one /proc, so a concurrent same-uid process can read a turn's env. Fine on a laptop; on a multi-tenant host set AGENTHIPPO_SANDBOX_NS_ISOLATION=require or use --sandbox container."),!1})}}return this.nsWrap}async create(e){let n=`sandbox-${++this.seq}-${uM(e.sandboxKey)}`,r=this.opts.spawnFn??Fw.spawn,s=await this.namespaceWrap(),i=s?"unshare":this.opts.command,o=s?[...gt.UNSHARE_WRAP_ARGS,this.opts.command,...this.opts.args??[]]:this.opts.args??[],c={...qw({...this.opts.allowProviderKeyPassthrough!==void 0?{allowProviderKeyPassthrough:this.opts.allowProviderKeyPassthrough}:{},logger:{warn:p=>console.warn(p)}}),...this.opts.env,...e.env},l=Ww(c),u=r(i,o,{cwd:this.opts.cwd,stdio:["pipe","pipe","inherit"],env:{...c,[Op.SANDBOX_TIER_ENV]:String(this.tier),...l?{[Op.SANDBOX_PROVIDER_KEY_ENV]:"1"}:{}}});l&&console.warn(`[Sandbox] ${n} runs WITH a raw provider key in its environment (${gt.PROVIDER_KEY_PASSTHROUGH_VARS.filter(p=>c[p]).join(", ")}). This sandbox does not have the model-credential containment the other engines get; disclose it in the deployment.`);let f=new Promise(p=>{u.once("exit",()=>p()),u.once("error",()=>p())}),d={input:u.stdout,output:{write:p=>u.stdin?.write(p)??!1},closed:f},g={child:u,channel:d,idleSeconds:e.limits.ttlSeconds};return this.armIdleReap(n,g),this.sandboxes.set(n,g),{id:n,tier:this.tier,endpoint:"stdio",connect:()=>d}}async revoke(e,n){if(n!=="all")throw new Op.RevocationUnsupportedError("process",n);await this.kill(e.id)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.kill(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.kill(e.id)}async kill(e){let n=this.sandboxes.get(e);n&&(this.sandboxes.delete(e),n.ttl&&clearTimeout(n.ttl),n.child.exitCode===null&&!n.child.killed&&n.child.kill("SIGTERM"))}};gt.ProcessSandboxDriver=Ip;function qw(t={},e=process.env){let n=["PATH","HOME","LANG","LC_ALL","TMPDIR","TERM","NODE_ENV","CLAUDE_CODE_PATH","CODEX_PATH","AGENTHIPPO_CUSTOM_ENGINES_DIR","AGENTHIPPO_NO_AUTO_INSTALL","AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_LITELLM_BASE_URL","AGENTHIPPO_SERVE",cM.ENGINE_IDLE_TTL_ENV,"HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","NO_PROXY","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE"],r={};for(let i of n){let o=e[i];o&&(r[i]=o)}let s=t.allowProviderKeyPassthrough??Kw(e);for(let i of gt.PROVIDER_KEY_PASSTHROUGH_VARS){let o=e[i];if(o){if(!s){t.logger?.warn(`[Sandbox] ${i} is set but was NOT passed into the sandbox: a raw provider key in a sandbox can call the provider directly, around the inference proxy and its spend cap. Cursor packs need it and cannot be proxied \u2014 set AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY=1 to allow it and accept that this sandbox holds a provider credential.`);continue}r[i]=o}}return r}function uM(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Pp=T(Nt=>{"use strict";var dM=Nt&&Nt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fM=Nt&&Nt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Xw=Nt&&Nt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dM(n,e,r[s]);return fM(n,e),n}})();Object.defineProperty(Nt,"__esModule",{value:!0});Nt.DEPRECATED_SANDBOX_ENV_ALIASES=void 0;Nt.dockerExec=hM;Nt.alignSandboxWorkspaceOwnership=mM;Nt.resolveSandboxImageUser=Qw;Nt.ensureSandboxStateDir=_M;Nt.sandboxScriptArg=wM;Nt.applyDeprecatedSandboxEnvAliases=eS;Nt.loadWarrantKeypair=AM;Nt.mintSandboxInferenceWarrant=TM;var pM=require("node:child_process"),xa=Xw(require("node:fs")),gM=Xw(require("node:path")),zw=si();function hM(t){return new Promise(e=>{(0,pM.execFile)("docker",t,{maxBuffer:8<<20},(n,r,s)=>{if(n){let i=typeof n.code=="number"?n.code:1;e({stdout:`${r??""}${s??""}`,code:i});return}e({stdout:r??"",stderr:s??"",code:0})})})}async function mM(t){let e=t.writable.map(i=>i.includes(":")?i.slice(0,i.indexOf(":")):i);if(e.length===0)return;let n=await Qw(t.exec,t.image);if(!n){t.logger?.warn(`[Sandbox] could not determine the sandbox image's uid; if turns fail with EACCES in the workspace, run: chown -R <image-uid> ${e.join(" ")}`);return}if(n.uid===0)return;let{uid:r,gid:s}=n;for(let i of e)try{let o=Zw(i,r,s);o>0&&t.logger?.info(`[Sandbox] aligned ${o} path(s) under ${i} to the sandbox image's uid ${r}:${s}`)}catch(o){t.logger?.warn(`[Sandbox] could not align ownership of ${i} for the sandbox (uid ${r}): ${o instanceof Error?o.message:String(o)}. Run: chown -R ${r}:${s} ${i}`)}}async function Qw(t,e){let n=await Jw(t,e,"-u");if(n!==void 0)return{uid:n,gid:await Jw(t,e,"-g")??n}}function _M(t,e){if(xa.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Zw(t,e.uid,e.gid)}catch{}return t}async function Jw(t,e,n){let r=await t(["run","--rm","--network","none","--entrypoint","id",e,n]);if(r.code!==0)return;let s=Number.parseInt(r.stdout.trim(),10);return Number.isInteger(s)?s:void 0}function Zw(t,e,n){let r=0,s=i=>{let o=xa.lstatSync(i);if((o.uid!==e||o.gid!==n)&&(xa.lchownSync(i,e,n),r++),o.isDirectory())for(let a of xa.readdirSync(i))s(gM.join(i,a))};return xa.existsSync(t)?(s(t),r):0}var EM=["/$bunfs","/snapshot"];function yM(t){return t.replace(/\\/g,"/").replace(/^[A-Za-z]:/,"")}function wM(t=process.argv,e=process.execPath){let n=t[1];if(!n||n===e)return[];let r=yM(n);return EM.some(s=>r.startsWith(s))?[]:[n]}Nt.DEPRECATED_SANDBOX_ENV_ALIASES=[["AGENTHIPPO_CELL","AGENTHIPPO_SANDBOX"],["AGENTHIPPO_CELL_TIER","AGENTHIPPO_SANDBOX_TIER"],["AGENTHIPPO_CELL_SOCKET_DIR","AGENTHIPPO_SANDBOX_SOCKET_DIR"],["AGENTHIPPO_CELL_STRICT_EGRESS","AGENTHIPPO_SANDBOX_STRICT_EGRESS"],["AGENTHIPPO_CELL_ALLOW_PROVIDER_KEY","AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY"]];var SM=new Set;function eS(t=process.env,e=r=>console.warn(r),n=SM){let r=[];for(let[s,i]of Nt.DEPRECATED_SANDBOX_ENV_ALIASES){let o=t[s];if(!(o===void 0||o==="")){if(t[i]!==void 0&&t[i]!==""){n.has(s)||(n.add(s),e(`[Sandbox] DEPRECATED: ${s} is set but ${i} is also set \u2014 using ${i} and IGNORING ${s}. Remove ${s}; it was renamed in the cell \u2192 sandbox migration.`));continue}t[i]=o,r.push(i),n.has(s)||(n.add(s),e(`[Sandbox] DEPRECATED: ${s} was renamed to ${i} in the cell \u2192 sandbox migration. The old value is being honoured for now, but it will stop working \u2014 set ${i}=${o} instead.`))}}return r}eS();function AM(t){let e=process.env.AGENTHIPPO_WARRANT_PRIVATE_KEY?.trim(),n=process.env.AGENTHIPPO_WARRANT_KID?.trim();if(e){let i=require("node:crypto").createPublicKey(e).export({type:"spki",format:"pem"}).toString();return{privateKeyPem:e,publicKeyPem:i,kid:n||"default"}}let r=(0,zw.generateWarrantKeypair)(n);return t?.info(`[Warrant] no AGENTHIPPO_WARRANT_PRIVATE_KEY \u2014 generated an ephemeral key (kid=${r.kid}). Configure gateways with:
551
551
  GATEWAY_SANDBOX_WARRANT_KEYS=${JSON.stringify({[r.kid]:r.publicKeyPem})}`),r}function TM(t,e){return(0,zw.mintWarrant)({...e,aud:"inference"},t)}});var Cp=T(Rp=>{"use strict";Object.defineProperty(Rp,"__esModule",{value:!0});Rp.createPackRunner=OM;var bM=Ui(),vM=Cr(),Np=en();function OM(t){return(0,bM.createHeadlessRunner)({storagePath:t.storagePath,analyticsSessionsDir:t.analyticsSessionsDir,packId:t.packId,packVersion:t.packVersion,provenance:t.provenance,bundledPromptsDir:(0,Np.findBundledBasePromptsDir)(),apiKey:t.credentials.apiKey,baseUrl:t.credentials.baseUrl,useLiteLLM:t.credentials.useLiteLLM,litellmApiKey:t.credentials.litellmApiKey,openaiApiKey:t.credentials.openaiApiKey,anthropicApiKey:t.credentials.anthropicApiKey,logger:t.logger,freshState:t.freshState??!1,claudeCodeExecutablePath:(0,Np.findClaudeCodePath)(),codexExecutablePath:(0,Np.findCodexPath)(),permissionHandler:t.permissionHandler,cliEnvPatch:(0,vM.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspaceRoot,agentId:t.packId,chatSessionId:t.chatSessionId,baseEnv:process.env,omitGatewayToken:t.omitGatewayToken}),engineSettings:{...t.claudeCheapModel?{claudeCheapModel:t.claudeCheapModel}:{},...t.effort?{effort:t.effort}:{}}})}});var fS=T(Fn=>{"use strict";var IM=Fn&&Fn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),PM=Fn&&Fn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),NM=Fn&&Fn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&IM(n,e,r[s]);return PM(n,e),n}})();Object.defineProperty(Fn,"__esModule",{value:!0});Fn.getEvidenceShipStatus=cS;Fn.validateEvidenceUrl=uS;Fn.resolveSessionShipConfig=LM;Fn.redactSessionLine=dS;Fn.startSessionShipper=GM;var Yi=NM(require("path")),dr=require("fs"),sS=require("crypto"),RM=require("zlib"),CM=So(),iS=vo(),su="AGENTHIPPO_EVIDENCE_SHIP",Ba="AGENTHIPPO_EVIDENCE_URL",tS="AGENTHIPPO_EVIDENCE_SHIP_TOKEN",kM="AGENTHIPPO_EVIDENCE_SHIP_INTERVAL_SEC",oS="AGENTHIPPO_EVIDENCE_SHIP_SINCE_DAYS",aS="AGENTHIPPO_EVIDENCE_SHIP_DRAIN_TIMEOUT_SEC",iu="AGENTHIPPO_EVIDENCE_ALLOW_INSECURE_URL",kp=30,$p=30,$M=/(^|_)(input|output|result|prompt|completion|content|text|messages?)(_|$)|preview$/i,Dp={enabled:!1,disabledReason:"not-configured",consecutiveFailures:0,recordsStaged:0,recordsShipped:0,recordsSkippedTooOld:0,filesSkippedTooOld:0,writeFailures:0,contentCapture:!1};function cS(){return{...Dp,writeFailures:(0,iS.getSessionEventWriterStats)().failed}}function Fo(t){Dp={...Dp,...t}}function Lp(t){return["1","true","yes","on"].includes((t??"").trim().toLowerCase())}function lS(t){return Lp(t[iu])||Lp(t.EVIDENCE_ALLOW_INSECURE_URL)}var DM=new Set(["localhost","127.0.0.1","::1","[::1]","0.0.0.0"]);function uS(t,e=process.env){let n;try{n=new URL(t)}catch{return{error:`${Ba} is not a valid URL: ${JSON.stringify(t)}`}}if(n.protocol==="https:")return{url:n.toString().replace(/\/$/,"")};if(n.protocol!=="http:")return{error:`${Ba} must be https (got ${n.protocol.replace(":","")})`};if(DM.has(n.hostname))return{url:n.toString().replace(/\/$/,"")};if(lS(e)){let r=Lp(e[iu])?iu:"EVIDENCE_ALLOW_INSECURE_URL";return console.warn(`[evidence-ship] INSECURE: shipping evidence and the ingest token over plaintext http to ${n.host} because ${r} is set. Use https unless this network is genuinely private.`),{url:n.toString().replace(/\/$/,"")}}return{error:`${Ba} must use https \u2014 plaintext http to ${n.host} would put the ingest token and the audit trail on the wire. Use https, a loopback address, or set ${iu}=1 (or EVIDENCE_ALLOW_INSECURE_URL=1) if the network is genuinely private.`}}function LM(t,e,n,r=process.env){if(r[su]==="0"||r[su]?.toLowerCase()==="false"){console.warn(`
552
552
  ############################################################
553
553
  ## EVIDENCE SHIPPING IS DISABLED ##
@@ -556,11 +556,11 @@ GATEWAY_SANDBOX_WARRANT_KEYS=${JSON.stringify({[r.kid]:r.publicKeyPem})}`),r}fun
556
556
  ## this instance goes away. Unset to re-enable. ##
557
557
  ############################################################
558
558
  `),Fo({enabled:!1,disabledReason:"disabled-by-env"});return}let s=r[Ba]?.trim(),i=r[tS]?.trim();if(!s||!i){(s||i)&&console.warn(`[evidence-ship] disabled \u2014 ${s?tS:Ba} is not set (the other half of the pair is)`),Fo({enabled:!1,disabledReason:"not-configured"});return}let o=uS(s,r);if("error"in o){console.error(`[evidence-ship] DISABLED \u2014 ${o.error}`),Fo({enabled:!1,disabledReason:"invalid-url"});return}let a=Math.max(15,Number(r[kM]??60)||60),c=Math.max(1,Number(r[oS]??kp)||kp),l=Math.max(1,Number(r[aS]??$p)||$p);return{evidenceUrl:o.url,shipToken:i,instanceId:t,sessionsDir:e,stateDir:n,intervalSec:a,sinceDays:c,drainTimeoutSec:l,allowInsecure:lS(r)}}function MM(t){return{sha256:(0,sS.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function dS(t,e){if(e)return t;let n;try{n=JSON.parse(t)}catch{return t}if(!n||typeof n!="object")return t;let r=n;if(!r.payload||typeof r.payload!="object")return t;let s=r.payload,i=!1;for(let o of Object.keys(s)){if(!$M.test(o)||o.endsWith("_sha256")||o.endsWith("_length"))continue;let a=s[o];if(a==null)continue;let c=typeof a=="string"?a:JSON.stringify(a),l=MM(c);delete s[o],s[`${o}_sha256`]=l.sha256,s[`${o}_length`]=l.length,s[`${o}_redacted`]=!0,i=!0}return i?JSON.stringify(r):t}function nS(){return{version:1,files:{},pending:{staged:0,shipped:0,skippedRecords:0,skippedFiles:0}}}function rS(t){let e=0;for(let n of t.split(`
559
- `))n.trim()&&e++;return e}function GM(t){let e=Yi.join(t.stateDir,".evidence-ship-cursor.json"),n=Yi.join(t.stateDir,".evidence-stage-cursor.json"),r=Yi.join(t.stateDir,"evidence-staging","sessions"),s=t.logger?.info??(()=>{}),i=t.logger?.warn??(()=>{}),o=t.sinceDays??kp,a=t.intervalSec??60,c=(t.drainTimeoutSec??$p)*1e3,l=(0,CM.isContentCaptureEnabled)(),u=t.allowInsecure===!0,d=!1,f=!1,p,g=0,_,h,y,E=0,w={staged:0,shipped:0,skippedRecords:0,skippedFiles:0};Fo({enabled:!0,disabledReason:void 0,evidenceUrl:t.evidenceUrl,intervalSec:a,sinceDays:o,consecutiveFailures:0,recordsStaged:0,recordsShipped:0,recordsSkippedTooOld:0,filesSkippedTooOld:0,contentCapture:l});let A=()=>(h||(h=import("@agenthippo-ai/evidence-ship").then(({createShipper:N})=>N({serverUrl:t.evidenceUrl,token:t.shipToken,instanceId:t.instanceId,source:"serve",sinceDays:o,cursorFile:e,captureContent:l,allowInsecure:u,heartbeat:!1,log:O=>s(O),error:O=>i(O)}))),h),S=async()=>{if(y)return y;try{let N=await dr.promises.readFile(n,"utf8"),O=JSON.parse(N);y={version:1,files:O.files??{},windowFrom:O.windowFrom,pending:O.pending??nS().pending}}catch{y=nS()}return y},C=async()=>{if(y)try{await dr.promises.mkdir(Yi.dirname(n),{recursive:!0}),await dr.promises.writeFile(n,JSON.stringify(y,null,1))}catch(N){i(`[evidence-ship] could not persist stage cursor: ${N instanceof Error?N.message:String(N)}`)}},v=async()=>{let N=await S(),O=Date.now(),G=O-o*864e5,H=0,X;try{X=(await dr.promises.readdir(t.sessionsDir)).filter(W=>W.endsWith(".jsonl"))}catch{return 0}await dr.promises.mkdir(r,{recursive:!0});let J=[];for(let W of X){if(W.startsWith("_evidence-loss"))continue;let ee=Yi.join(t.sessionsDir,W),le;try{le=await dr.promises.stat(ee)}catch{continue}if(le.mtimeMs<G){let it=N.files[W];if(!it?.lostReported){let sn=0;try{sn=rS(await dr.promises.readFile(ee,"utf8"))}catch{}w.skippedFiles++,w.skippedRecords+=sn,N.pending.skippedFiles++,N.pending.skippedRecords+=sn,N.files[W]={size:le.size,sha256:"",stagedAt:0,stagedMtimeMs:it?.stagedMtimeMs??0,lostReported:!0},i(`[evidence-ship] EVIDENCE PERMANENTLY SKIPPED: ${W} last changed ${new Date(le.mtimeMs).toISOString()}, older than the ${o}-day ship window \u2014 ${sn} record(s) will never be shipped. Raise ${oS} before the next restart to recover a backlog this old.`),J.push(JSON.stringify({session_id:"_evidence-loss",request_id:W,timestamp:O,event_type:"evidence_skipped",payload:{reason:"older_than_ship_window",file:W,file_mtime_ms:le.mtimeMs,file_bytes:le.size,records:sn,since_days:o,instance_id:t.instanceId,permanent:!0}}))}continue}let pe;try{pe=await dr.promises.readFile(ee,"utf8")}catch(it){i(`[evidence-ship] cannot read ${W}: ${it instanceof Error?it.message:String(it)}`);continue}let We=(0,sS.createHash)("sha256").update(pe,"utf8").digest("hex"),Ue=N.files[W];if(Ue&&Ue.sha256===We&&Ue.size===pe.length)continue;let vt=pe.split(`
559
+ `))n.trim()&&e++;return e}function GM(t){let e=Yi.join(t.stateDir,".evidence-ship-cursor.json"),n=Yi.join(t.stateDir,".evidence-stage-cursor.json"),r=Yi.join(t.stateDir,"evidence-staging","sessions"),s=t.logger?.info??(()=>{}),i=t.logger?.warn??(()=>{}),o=t.sinceDays??kp,a=t.intervalSec??60,c=(t.drainTimeoutSec??$p)*1e3,l=(0,CM.isContentCaptureEnabled)(),u=t.allowInsecure===!0,f=!1,d=!1,g,p=0,_,h,y,E=0,w={staged:0,shipped:0,skippedRecords:0,skippedFiles:0};Fo({enabled:!0,disabledReason:void 0,evidenceUrl:t.evidenceUrl,intervalSec:a,sinceDays:o,consecutiveFailures:0,recordsStaged:0,recordsShipped:0,recordsSkippedTooOld:0,filesSkippedTooOld:0,contentCapture:l});let A=()=>(h||(h=import("@agenthippo-ai/evidence-ship").then(({createShipper:N})=>N({serverUrl:t.evidenceUrl,token:t.shipToken,instanceId:t.instanceId,source:"serve",sinceDays:o,cursorFile:e,captureContent:l,allowInsecure:u,heartbeat:!1,log:O=>s(O),error:O=>i(O)}))),h),S=async()=>{if(y)return y;try{let N=await dr.promises.readFile(n,"utf8"),O=JSON.parse(N);y={version:1,files:O.files??{},windowFrom:O.windowFrom,pending:O.pending??nS().pending}}catch{y=nS()}return y},C=async()=>{if(y)try{await dr.promises.mkdir(Yi.dirname(n),{recursive:!0}),await dr.promises.writeFile(n,JSON.stringify(y,null,1))}catch(N){i(`[evidence-ship] could not persist stage cursor: ${N instanceof Error?N.message:String(N)}`)}},b=async()=>{let N=await S(),O=Date.now(),G=O-o*864e5,H=0,X;try{X=(await dr.promises.readdir(t.sessionsDir)).filter(W=>W.endsWith(".jsonl"))}catch{return 0}await dr.promises.mkdir(r,{recursive:!0});let J=[];for(let W of X){if(W.startsWith("_evidence-loss"))continue;let ee=Yi.join(t.sessionsDir,W),le;try{le=await dr.promises.stat(ee)}catch{continue}if(le.mtimeMs<G){let it=N.files[W];if(!it?.lostReported){let sn=0;try{sn=rS(await dr.promises.readFile(ee,"utf8"))}catch{}w.skippedFiles++,w.skippedRecords+=sn,N.pending.skippedFiles++,N.pending.skippedRecords+=sn,N.files[W]={size:le.size,sha256:"",stagedAt:0,stagedMtimeMs:it?.stagedMtimeMs??0,lostReported:!0},i(`[evidence-ship] EVIDENCE PERMANENTLY SKIPPED: ${W} last changed ${new Date(le.mtimeMs).toISOString()}, older than the ${o}-day ship window \u2014 ${sn} record(s) will never be shipped. Raise ${oS} before the next restart to recover a backlog this old.`),J.push(JSON.stringify({session_id:"_evidence-loss",request_id:W,timestamp:O,event_type:"evidence_skipped",payload:{reason:"older_than_ship_window",file:W,file_mtime_ms:le.mtimeMs,file_bytes:le.size,records:sn,since_days:o,instance_id:t.instanceId,permanent:!0}}))}continue}let pe;try{pe=await dr.promises.readFile(ee,"utf8")}catch(it){i(`[evidence-ship] cannot read ${W}: ${it instanceof Error?it.message:String(it)}`);continue}let We=(0,sS.createHash)("sha256").update(pe,"utf8").digest("hex"),Ue=N.files[W];if(Ue&&Ue.sha256===We&&Ue.size===pe.length)continue;let vt=pe.split(`
560
560
  `).map(it=>it.trim()?dS(it,l):it).join(`
561
561
  `),xe=Yi.join(r,W);await dr.promises.writeFile(xe,vt);let dt=Math.max(Date.now(),(Ue?.stagedMtimeMs??0)+1e3),yn=dt/1e3;await dr.promises.utimes(xe,yn,yn);let zn=rS(vt);H+=zn,N.files[W]={size:pe.length,sha256:We,stagedAt:O,stagedMtimeMs:dt}}if(J.length>0){let W=Yi.join(r,"evidence-loss.jsonl");await dr.promises.appendFile(W,`${J.join(`
562
562
  `)}
563
- `);let ee=Date.now()/1e3;await dr.promises.utimes(W,ee,ee),H+=J.length}return w.staged+=H,N.pending.staged+=H,N.windowFrom===void 0&&(N.windowFrom=O),await C(),H},I=async()=>{let N=await S(),O=Date.now(),G=(0,iS.getSessionEventWriterStats)(),H={kind:"session_ship_heartbeat",instance_id:t.instanceId,wire:"agenthippo/session-ship/1",window_from_ms:N.windowFrom??O,window_to_ms:O,interval_sec:a,since_days:o,records_staged:N.pending.staged,records_shipped:N.pending.shipped,records_skipped_too_old:N.pending.skippedRecords,files_skipped_too_old:N.pending.skippedFiles,evidence_write_failures:G.failed,evidence_writes:G.written,consecutive_ship_failures:g,content_capture:l,totals:{...w}},X=1;try{({INGEST_WIRE_VERSION:X}=await import("@agenthippo-ai/evidence-ship"))}catch{}let J=JSON.stringify(H),W=await fetch(`${t.evidenceUrl.replace(/\/$/,"")}/ingest/batch`,{method:"POST",headers:{authorization:`Bearer ${t.shipToken}`,"content-type":"application/json","X-Evidence-Ingest-Version":String(X)},body:JSON.stringify({instance_id:t.instanceId,kind:"heartbeat",name:"heartbeat.json",content_gzip_b64:(0,RM.gzipSync)(Buffer.from(J)).toString("base64")})});if(!W.ok)throw new Error(`heartbeat HTTP ${W.status}`);return N.windowFrom=O,N.pending={staged:0,shipped:0,skippedRecords:0,skippedFiles:0},Fo({lastHeartbeatAt:O}),await C(),!0},P=async()=>{if(!(d||f)){f=!0;try{let N=await v();E+=N;try{if(await(await A()).drain({sessions:r,heartbeat:!1})){let H=await S();H.pending.shipped+=E,w.shipped+=E,E=0,p=Date.now(),g=0}else g++,i(`[evidence-ship] drain failed (${g} in a row); ${E} record(s) still unshipped`)}catch(O){g++,i(`[evidence-ship] ${O instanceof Error?O.message:String(O)}`)}}catch(N){g++,i(`[evidence-ship] ${N instanceof Error?N.message:String(N)}`)}finally{try{await I()}catch(N){i(`[evidence-ship] heartbeat failed: ${N instanceof Error?N.message:String(N)}`)}f=!1,Fo({lastOkAt:p,consecutiveFailures:g,recordsStaged:w.staged,recordsShipped:w.shipped,recordsSkippedTooOld:w.skippedRecords,filesSkippedTooOld:w.skippedFiles})}}};P(),_=setInterval(()=>void P(),a*1e3),_.unref?.(),s(`[evidence-ship] enabled \u2192 ${t.evidenceUrl} (every ${a}s, ${o}-day window, content capture ${l?"ON":"off"})`);let L=()=>{d=!0,_&&clearInterval(_)};return{stop:L,async flush(){L();let N=Date.now()+c;for(;f&&Date.now()<N;)await new Promise(O=>setTimeout(O,50));if(f){i(`[evidence-ship] FINAL DRAIN ABANDONED after ${Math.round(c/1e3)}s \u2014 a ship was still in flight. ${E} staged record(s) plus anything written since are lost if this state dir is ephemeral. Raise ${aS} if this recurs.`);return}d=!1;try{await P()}finally{d=!0}E>0&&i(`[evidence-ship] final drain finished with ${E} record(s) still unshipped`)},lastOkAt:()=>p,status:()=>cS()}}});var gS=T(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.TURN_COST_HEADER=Ji.TURN_COST_ENV=void 0;Ji.fetchTurnCost=xM;var UM=si();Ji.TURN_COST_ENV="AGENTHIPPO_TURN_COST";Ji.TURN_COST_HEADER="x-agenthippo-turn-cost";var pS=20,HM=3e3,jM=8e3;async function xM(t){let e=[...new Set(t.jtis)];if(e.length===0)return{complete:!1,error:"no warrant was minted for this turn"};let n={complete:!0,usd:0,requests:0,inputTokens:0,outputTokens:0},r;try{let i=new URL(t.gatewayBaseUrl).toString().replace(/\/+$/,"");r=i.endsWith("/v1")?`${i}/warrant-usage`:`${i}/v1/warrant-usage`}catch{return{complete:!1,error:"no usable gateway URL"}}let s=t.fetchImpl??fetch;for(let i=0;i<e.length;i+=pS){let o;try{let a=await s(r,{method:"POST",headers:{authorization:`Bearer ${(0,UM.mintWarrantUsageQuery)(t.key,e.slice(i,i+pS))}`,"content-type":"application/json"},body:JSON.stringify({wait_ms:HM}),signal:AbortSignal.timeout(jM)});if(!a.ok)return{complete:!1,error:`the gateway answered ${a.status}`};let c=await a.json();if(!c||typeof c!="object")return{complete:!1,error:"the gateway sent no usage"};o=c}catch{return{complete:!1,error:"the gateway did not answer"}}n.usd+=Number(o.billed_usd)||0,n.requests+=Number(o.requests)||0,n.inputTokens+=Number(o.input_tokens)||0,n.outputTokens+=Number(o.output_tokens)||0,(Number(o.pending)||0)>0&&(n.complete=!1)}return n}});var hS=T(fr=>{"use strict";Object.defineProperty(fr,"__esModule",{value:!0});fr.PROTOCOL_VERSION=fr.DEFAULT_GATEWAY_OPERATOR_SCOPES=fr.GATEWAY_CLIENT_CAPS=fr.GATEWAY_CLIENT_MODES=fr.GATEWAY_CLIENT_IDS=void 0;fr.GATEWAY_CLIENT_IDS={GATEWAY_CLIENT:"gateway-client"};fr.GATEWAY_CLIENT_MODES={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",AGENT_BACKEND:"agent-backend",NODE:"node",PROBE:"probe",TEST:"test"};fr.GATEWAY_CLIENT_CAPS={TOOL_EVENTS:"tool-events"};fr.DEFAULT_GATEWAY_OPERATOR_SCOPES=["operator.admin","operator.read","operator.write","operator.approvals","operator.pairing"];fr.PROTOCOL_VERSION=3});var ou=T(pr=>{"use strict";Object.defineProperty(pr,"__esModule",{value:!0});pr.GatewayClient=pr.MAX_GATEWAY_MESSAGE_CHARS=pr.MAX_GATEWAY_FRAME_BYTES=void 0;pr.createAgentIDEGatewayClient=KM;pr.createEphemeralGatewayClient=WM;var BM=require("events"),ci=hS();pr.MAX_GATEWAY_FRAME_BYTES=(()=>{let t=Number(process.env.AGENTHIPPO_GATEWAY_MAX_FRAME_BYTES);return Number.isFinite(t)&&t>=1024*1024?t:16*1024*1024})();pr.MAX_GATEWAY_MESSAGE_CHARS=256*1024;function FM(t){if(!t)return"WebSocket closed";let e=typeof t.code=="number"?t.code:void 0,n=typeof t.reason=="string"?t.reason.trim():"";if(e===1011)return`WebSocket closed (1011: internal error)${n?`: ${n}`:""}. Check the gateway/server logs for details.`;let r=e!==void 0?` (${e})`:"",s=n?`: ${n}`:"";return`WebSocket closed${r}${s}`}function VM(t){let e=typeof t?.code=="number"?t.code:void 0;return e!==void 0&&e!==1e3&&e!==1001}var Fa=class extends BM.EventEmitter{options;ws=null;requestId=0;pendingRequests=new Map;connected=!1;reconnectAttempts=0;clientInfo=null;constructor(e){super(),this.options=e,this.on("error",()=>{})}async connect(e){return this.clientInfo=e,new Promise((n,r)=>{try{this.ws=new WebSocket(this.options.url)}catch(s){r(s);return}this.ws.onopen=async()=>{try{let s={minProtocol:ci.PROTOCOL_VERSION,maxProtocol:ci.PROTOCOL_VERSION,client:e,caps:[ci.GATEWAY_CLIENT_CAPS.TOOL_EVENTS],role:"operator",scopes:[...ci.DEFAULT_GATEWAY_OPERATOR_SCOPES],auth:this.options.token?{token:this.options.token}:void 0},i=await this.request("connect",s);this.connected=!0,this.reconnectAttempts=0,this.emit("connected",i),n(i)}catch(s){r(s)}},this.ws.onmessage=s=>{let i=typeof s.data=="string"?s.data:String(s.data);this.handleMessage(i)},this.ws.onerror=s=>{let i=new Error("WebSocket error");this.emit("error",i),this.connected||r(i)},this.ws.onclose=s=>{let i=this.connected;this.connected=!1,VM(s)&&this.emit("error",new Error(FM(s))),this.emit("disconnected",{code:typeof s?.code=="number"?s.code:void 0,reason:typeof s?.reason=="string"?s.reason:void 0,wasClean:typeof s?.wasClean=="boolean"?s.wasClean:void 0}),i&&this.clientInfo&&this.handleReconnect()}})}async request(e,n,r=3e4){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("Not connected to Gateway");let s=String(++this.requestId);return new Promise((i,o)=>{let a=setTimeout(()=>{this.pendingRequests.delete(s),o(new Error(`Request ${e} timed out`))},r);this.pendingRequests.set(s,{resolve:i,reject:o,timeout:a});let c={type:"req",id:s,method:e,params:n};this.ws?.send(JSON.stringify(c))})}respond(e,n,r=!0,s){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return;let i={type:"res",id:e,ok:r,payload:r?n:void 0,error:r?void 0:s};this.ws.send(JSON.stringify(i))}sendEvent(e,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return;let r={type:"event",event:e,payload:n};this.ws.send(JSON.stringify(r))}handleMessage(e){let n=typeof e=="string"?Buffer.byteLength(e,"utf8"):0;if(n>pr.MAX_GATEWAY_FRAME_BYTES){this.emit("error",new Error(`Gateway frame of ${n} bytes exceeds the ${pr.MAX_GATEWAY_FRAME_BYTES}-byte limit and was dropped. Attachments normally travel as references, so this suggests inline payloads; raise AGENTHIPPO_GATEWAY_MAX_FRAME_BYTES if this traffic is expected.`));return}let r;try{r=JSON.parse(e)}catch{this.emit("error",new Error("Failed to parse Gateway message"));return}r.type==="res"?this.handleResponse(r):r.type==="event"?this.handleEvent(r):r.type==="req"&&this.emit("request",r)}handleResponse(e){let n=this.pendingRequests.get(e.id);if(n)if(clearTimeout(n.timeout),this.pendingRequests.delete(e.id),e.ok)n.resolve(e.payload);else{let r=new Error(e.error?.message||"Request failed");r.code=e.error?.code,n.reject(r)}}handleEvent(e){this.emit("event",e.event,e.payload),this.emit(`event:${e.event}`,e.payload)}reconnectTimer=null;isReconnecting=!1;handleReconnect(){if(this.options.reconnectInterval&&!this.isReconnecting){if(this.reconnectAttempts>=(this.options.maxReconnectAttempts??10)){this.emit("reconnect-failed");return}this.isReconnecting=!0,this.reconnectAttempts++,this.emit("reconnecting",this.reconnectAttempts),this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=setTimeout(async()=>{if(this.isReconnecting=!1,this.clientInfo)try{await this.connect(this.clientInfo)}catch(e){this.emit("error",e instanceof Error?e:new Error(String(e)))}},this.options.reconnectInterval)}}async reconnect(){if(!this.clientInfo)throw new Error("Cannot reconnect: never connected");this.close(),this.reconnectAttempts=0,await this.connect(this.clientInfo)}close(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.isReconnecting=!1,this.clientInfo=null;for(let[,n]of this.pendingRequests)clearTimeout(n.timeout),n.reject(new Error("Connection closed"));this.pendingRequests.clear();let e=this.ws;this.ws=null,this.connected=!1,e?.close()}get isConnected(){return this.connected}};pr.GatewayClient=Fa;function KM(t,e,n="1.0.0"){let r=new Fa({url:t,token:e,reconnectInterval:5e3,maxReconnectAttempts:10}),s={id:ci.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo IDE",version:n,platform:process.platform,mode:ci.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}function WM(t,e,n="1.0.0"){let r=new Fa({url:t,token:e}),s={id:ci.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo CLI",version:n,platform:process.platform,mode:ci.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}});var Hp=T(Wt=>{"use strict";var qM=Wt&&Wt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),YM=Wt&&Wt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Gp=Wt&&Wt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&qM(n,e,r[s]);return YM(n,e),n}})();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.GATEWAY_OUTBOUND_RPC_METHOD=void 0;Wt.stageLocalMediaIfNeeded=mS;Wt.buildGatewayOutboundSendArgs=_S;Wt.buildGatewaySendParams=Up;Wt.buildGatewayRpcCommand=Mp;Wt.sendGatewayOutboundMessage=cG;var JM=require("child_process"),XM=require("crypto"),Vo=Gp(require("fs")),zM=Gp(require("os")),Ur=Gp(require("path")),QM=Cr(),ZM=ou(),eG=18789;Wt.GATEWAY_OUTBOUND_RPC_METHOD="send";function tG(t){return t?.trim()||process.env.AGENTHIPPO_GATEWAY_CLI?.trim()||"hippoclaw"}var nG=".openclaw",rG=[".clawdbot",".moldbot",".moltbot"];function sG(){let t=zM.homedir(),e=process.env.OPENCLAW_STATE_DIR?.trim()||process.env.CLAWDBOT_STATE_DIR?.trim();if(e)return e==="~"||e.startsWith("~/")||e.startsWith("~\\")?Ur.join(t,e.slice(1)):Ur.resolve(e);let n=Ur.join(t,nG);if(Vo.existsSync(n))return n;for(let r of rG){let s=Ur.join(t,r);if(Vo.existsSync(s))return s}return n}function iG(t){return/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||t.startsWith("data:")}function mS(t){let e=t?.trim();if(!e||iG(e))return t;let n;try{n=Vo.realpathSync(e)}catch{return e}let r=Ur.join(sG(),"media"),s=Ur.resolve(r);try{s=Vo.realpathSync(r)}catch{}let i=Ur.relative(s,n);if(i&&!i.startsWith("..")&&!Ur.isAbsolute(i))return n;let o=Ur.extname(n),a=Ur.basename(n,o),c=(0,XM.createHash)("sha256").update(n).digest("hex").slice(0,8),l=Ur.join(r,`${a}-${c}${o}`);return Vo.mkdirSync(r,{recursive:!0}),Vo.copyFileSync(n,l),l}function _S(t,e,n){let r=["message","send","--channel",t.channel,"--target",t.target,"--message",e];return n?.trim()&&r.push("--media",n.trim()),t.accountId&&r.push("--account",t.accountId),t.threadId&&r.push("--thread-id",t.threadId),r}function Up(t,e,n){return{to:t.target,message:e,channel:t.channel,accountId:t.accountId,threadId:t.threadId,sessionKey:t.sessionKey,agentId:t.agentId,idempotencyKey:`proactive:${t.agentId}:${Date.now()}`,...n?.trim()?{mediaUrl:n.trim()}:{}}}function Mp(t,e,n){return[Wt.GATEWAY_OUTBOUND_RPC_METHOD,JSON.stringify(Up(t,e,n))]}async function oG(t,e,n,r){let s=process.env.OPENCLAW_GATEWAY_URL?.trim()||`ws://127.0.0.1:${eG}`,i=r?.trim()||(0,QM.readOpenClawGatewayToken)(),{client:o,clientInfo:a}=(0,ZM.createEphemeralGatewayClient)(s,i);await o.connect(a);try{let c=await o.request(Wt.GATEWAY_OUTBOUND_RPC_METHOD,Up(t,e,n),6e4);return{stdout:JSON.stringify(c),stderr:""}}finally{o.close()}}function aG(t,e){let n=(0,JM.spawnSync)(t,e,{encoding:"utf-8",env:process.env});return{stdout:(n.stdout??"").trim(),stderr:(n.stderr??"").trim(),exitCode:n.status}}async function cG(t,e){let n=tG(e.cli);if(e.dryRun)return{ok:!0,via:"dry-run",command:Mp(t,e.message,e.media),stdout:"",stderr:"",exitCode:0};let r=mS(e.media),s=_S(t,e.message,r),i=[n,...s],o=Mp(t,e.message,r);try{let a=await oG(t,e.message,r,e.token);return{ok:!0,via:"gateway-rpc",command:o,stdout:a.stdout,stderr:a.stderr,exitCode:0}}catch(a){let c=a instanceof Error?a.message:String(a),l=aG(n,s);if(l.exitCode===0)return{ok:!0,via:"hippoclaw",command:i,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode};let u=l.stderr||l.stdout||"unknown error";return{ok:!1,via:"gateway-rpc",command:o,stdout:l.stdout,stderr:`Gateway RPC failed: ${c}
563
+ `);let ee=Date.now()/1e3;await dr.promises.utimes(W,ee,ee),H+=J.length}return w.staged+=H,N.pending.staged+=H,N.windowFrom===void 0&&(N.windowFrom=O),await C(),H},I=async()=>{let N=await S(),O=Date.now(),G=(0,iS.getSessionEventWriterStats)(),H={kind:"session_ship_heartbeat",instance_id:t.instanceId,wire:"agenthippo/session-ship/1",window_from_ms:N.windowFrom??O,window_to_ms:O,interval_sec:a,since_days:o,records_staged:N.pending.staged,records_shipped:N.pending.shipped,records_skipped_too_old:N.pending.skippedRecords,files_skipped_too_old:N.pending.skippedFiles,evidence_write_failures:G.failed,evidence_writes:G.written,consecutive_ship_failures:p,content_capture:l,totals:{...w}},X=1;try{({INGEST_WIRE_VERSION:X}=await import("@agenthippo-ai/evidence-ship"))}catch{}let J=JSON.stringify(H),W=await fetch(`${t.evidenceUrl.replace(/\/$/,"")}/ingest/batch`,{method:"POST",headers:{authorization:`Bearer ${t.shipToken}`,"content-type":"application/json","X-Evidence-Ingest-Version":String(X)},body:JSON.stringify({instance_id:t.instanceId,kind:"heartbeat",name:"heartbeat.json",content_gzip_b64:(0,RM.gzipSync)(Buffer.from(J)).toString("base64")})});if(!W.ok)throw new Error(`heartbeat HTTP ${W.status}`);return N.windowFrom=O,N.pending={staged:0,shipped:0,skippedRecords:0,skippedFiles:0},Fo({lastHeartbeatAt:O}),await C(),!0},P=async()=>{if(!(f||d)){d=!0;try{let N=await b();E+=N;try{if(await(await A()).drain({sessions:r,heartbeat:!1})){let H=await S();H.pending.shipped+=E,w.shipped+=E,E=0,g=Date.now(),p=0}else p++,i(`[evidence-ship] drain failed (${p} in a row); ${E} record(s) still unshipped`)}catch(O){p++,i(`[evidence-ship] ${O instanceof Error?O.message:String(O)}`)}}catch(N){p++,i(`[evidence-ship] ${N instanceof Error?N.message:String(N)}`)}finally{try{await I()}catch(N){i(`[evidence-ship] heartbeat failed: ${N instanceof Error?N.message:String(N)}`)}d=!1,Fo({lastOkAt:g,consecutiveFailures:p,recordsStaged:w.staged,recordsShipped:w.shipped,recordsSkippedTooOld:w.skippedRecords,filesSkippedTooOld:w.skippedFiles})}}};P(),_=setInterval(()=>void P(),a*1e3),_.unref?.(),s(`[evidence-ship] enabled \u2192 ${t.evidenceUrl} (every ${a}s, ${o}-day window, content capture ${l?"ON":"off"})`);let L=()=>{f=!0,_&&clearInterval(_)};return{stop:L,async flush(){L();let N=Date.now()+c;for(;d&&Date.now()<N;)await new Promise(O=>setTimeout(O,50));if(d){i(`[evidence-ship] FINAL DRAIN ABANDONED after ${Math.round(c/1e3)}s \u2014 a ship was still in flight. ${E} staged record(s) plus anything written since are lost if this state dir is ephemeral. Raise ${aS} if this recurs.`);return}f=!1;try{await P()}finally{f=!0}E>0&&i(`[evidence-ship] final drain finished with ${E} record(s) still unshipped`)},lastOkAt:()=>g,status:()=>cS()}}});var gS=T(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.TURN_COST_HEADER=Ji.TURN_COST_ENV=void 0;Ji.fetchTurnCost=xM;var UM=si();Ji.TURN_COST_ENV="AGENTHIPPO_TURN_COST";Ji.TURN_COST_HEADER="x-agenthippo-turn-cost";var pS=20,HM=3e3,jM=8e3;async function xM(t){let e=[...new Set(t.jtis)];if(e.length===0)return{complete:!1,error:"no warrant was minted for this turn"};let n={complete:!0,usd:0,requests:0,inputTokens:0,outputTokens:0},r;try{let i=new URL(t.gatewayBaseUrl).toString().replace(/\/+$/,"");r=i.endsWith("/v1")?`${i}/warrant-usage`:`${i}/v1/warrant-usage`}catch{return{complete:!1,error:"no usable gateway URL"}}let s=t.fetchImpl??fetch;for(let i=0;i<e.length;i+=pS){let o;try{let a=await s(r,{method:"POST",headers:{authorization:`Bearer ${(0,UM.mintWarrantUsageQuery)(t.key,e.slice(i,i+pS))}`,"content-type":"application/json"},body:JSON.stringify({wait_ms:HM}),signal:AbortSignal.timeout(jM)});if(!a.ok)return{complete:!1,error:`the gateway answered ${a.status}`};let c=await a.json();if(!c||typeof c!="object")return{complete:!1,error:"the gateway sent no usage"};o=c}catch{return{complete:!1,error:"the gateway did not answer"}}n.usd+=Number(o.billed_usd)||0,n.requests+=Number(o.requests)||0,n.inputTokens+=Number(o.input_tokens)||0,n.outputTokens+=Number(o.output_tokens)||0,(Number(o.pending)||0)>0&&(n.complete=!1)}return n}});var hS=T(fr=>{"use strict";Object.defineProperty(fr,"__esModule",{value:!0});fr.PROTOCOL_VERSION=fr.DEFAULT_GATEWAY_OPERATOR_SCOPES=fr.GATEWAY_CLIENT_CAPS=fr.GATEWAY_CLIENT_MODES=fr.GATEWAY_CLIENT_IDS=void 0;fr.GATEWAY_CLIENT_IDS={GATEWAY_CLIENT:"gateway-client"};fr.GATEWAY_CLIENT_MODES={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",AGENT_BACKEND:"agent-backend",NODE:"node",PROBE:"probe",TEST:"test"};fr.GATEWAY_CLIENT_CAPS={TOOL_EVENTS:"tool-events"};fr.DEFAULT_GATEWAY_OPERATOR_SCOPES=["operator.admin","operator.read","operator.write","operator.approvals","operator.pairing"];fr.PROTOCOL_VERSION=3});var ou=T(pr=>{"use strict";Object.defineProperty(pr,"__esModule",{value:!0});pr.GatewayClient=pr.MAX_GATEWAY_MESSAGE_CHARS=pr.MAX_GATEWAY_FRAME_BYTES=void 0;pr.createAgentIDEGatewayClient=KM;pr.createEphemeralGatewayClient=WM;var BM=require("events"),ci=hS();pr.MAX_GATEWAY_FRAME_BYTES=(()=>{let t=Number(process.env.AGENTHIPPO_GATEWAY_MAX_FRAME_BYTES);return Number.isFinite(t)&&t>=1024*1024?t:16*1024*1024})();pr.MAX_GATEWAY_MESSAGE_CHARS=256*1024;function FM(t){if(!t)return"WebSocket closed";let e=typeof t.code=="number"?t.code:void 0,n=typeof t.reason=="string"?t.reason.trim():"";if(e===1011)return`WebSocket closed (1011: internal error)${n?`: ${n}`:""}. Check the gateway/server logs for details.`;let r=e!==void 0?` (${e})`:"",s=n?`: ${n}`:"";return`WebSocket closed${r}${s}`}function VM(t){let e=typeof t?.code=="number"?t.code:void 0;return e!==void 0&&e!==1e3&&e!==1001}var Fa=class extends BM.EventEmitter{options;ws=null;requestId=0;pendingRequests=new Map;connected=!1;reconnectAttempts=0;clientInfo=null;constructor(e){super(),this.options=e,this.on("error",()=>{})}async connect(e){return this.clientInfo=e,new Promise((n,r)=>{try{this.ws=new WebSocket(this.options.url)}catch(s){r(s);return}this.ws.onopen=async()=>{try{let s={minProtocol:ci.PROTOCOL_VERSION,maxProtocol:ci.PROTOCOL_VERSION,client:e,caps:[ci.GATEWAY_CLIENT_CAPS.TOOL_EVENTS],role:"operator",scopes:[...ci.DEFAULT_GATEWAY_OPERATOR_SCOPES],auth:this.options.token?{token:this.options.token}:void 0},i=await this.request("connect",s);this.connected=!0,this.reconnectAttempts=0,this.emit("connected",i),n(i)}catch(s){r(s)}},this.ws.onmessage=s=>{let i=typeof s.data=="string"?s.data:String(s.data);this.handleMessage(i)},this.ws.onerror=s=>{let i=new Error("WebSocket error");this.emit("error",i),this.connected||r(i)},this.ws.onclose=s=>{let i=this.connected;this.connected=!1,VM(s)&&this.emit("error",new Error(FM(s))),this.emit("disconnected",{code:typeof s?.code=="number"?s.code:void 0,reason:typeof s?.reason=="string"?s.reason:void 0,wasClean:typeof s?.wasClean=="boolean"?s.wasClean:void 0}),i&&this.clientInfo&&this.handleReconnect()}})}async request(e,n,r=3e4){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("Not connected to Gateway");let s=String(++this.requestId);return new Promise((i,o)=>{let a=setTimeout(()=>{this.pendingRequests.delete(s),o(new Error(`Request ${e} timed out`))},r);this.pendingRequests.set(s,{resolve:i,reject:o,timeout:a});let c={type:"req",id:s,method:e,params:n};this.ws?.send(JSON.stringify(c))})}respond(e,n,r=!0,s){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return;let i={type:"res",id:e,ok:r,payload:r?n:void 0,error:r?void 0:s};this.ws.send(JSON.stringify(i))}sendEvent(e,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return;let r={type:"event",event:e,payload:n};this.ws.send(JSON.stringify(r))}handleMessage(e){let n=typeof e=="string"?Buffer.byteLength(e,"utf8"):0;if(n>pr.MAX_GATEWAY_FRAME_BYTES){this.emit("error",new Error(`Gateway frame of ${n} bytes exceeds the ${pr.MAX_GATEWAY_FRAME_BYTES}-byte limit and was dropped. Attachments normally travel as references, so this suggests inline payloads; raise AGENTHIPPO_GATEWAY_MAX_FRAME_BYTES if this traffic is expected.`));return}let r;try{r=JSON.parse(e)}catch{this.emit("error",new Error("Failed to parse Gateway message"));return}r.type==="res"?this.handleResponse(r):r.type==="event"?this.handleEvent(r):r.type==="req"&&this.emit("request",r)}handleResponse(e){let n=this.pendingRequests.get(e.id);if(n)if(clearTimeout(n.timeout),this.pendingRequests.delete(e.id),e.ok)n.resolve(e.payload);else{let r=new Error(e.error?.message||"Request failed");r.code=e.error?.code,n.reject(r)}}handleEvent(e){this.emit("event",e.event,e.payload),this.emit(`event:${e.event}`,e.payload)}reconnectTimer=null;isReconnecting=!1;handleReconnect(){if(this.options.reconnectInterval&&!this.isReconnecting){if(this.reconnectAttempts>=(this.options.maxReconnectAttempts??10)){this.emit("reconnect-failed");return}this.isReconnecting=!0,this.reconnectAttempts++,this.emit("reconnecting",this.reconnectAttempts),this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=setTimeout(async()=>{if(this.isReconnecting=!1,this.clientInfo)try{await this.connect(this.clientInfo)}catch(e){this.emit("error",e instanceof Error?e:new Error(String(e)))}},this.options.reconnectInterval)}}async reconnect(){if(!this.clientInfo)throw new Error("Cannot reconnect: never connected");this.close(),this.reconnectAttempts=0,await this.connect(this.clientInfo)}close(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.isReconnecting=!1,this.clientInfo=null;for(let[,n]of this.pendingRequests)clearTimeout(n.timeout),n.reject(new Error("Connection closed"));this.pendingRequests.clear();let e=this.ws;this.ws=null,this.connected=!1,e?.close()}get isConnected(){return this.connected}};pr.GatewayClient=Fa;function KM(t,e,n="1.0.0"){let r=new Fa({url:t,token:e,reconnectInterval:5e3,maxReconnectAttempts:10}),s={id:ci.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo IDE",version:n,platform:process.platform,mode:ci.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}function WM(t,e,n="1.0.0"){let r=new Fa({url:t,token:e}),s={id:ci.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo CLI",version:n,platform:process.platform,mode:ci.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}});var Hp=T(Wt=>{"use strict";var qM=Wt&&Wt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),YM=Wt&&Wt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Gp=Wt&&Wt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&qM(n,e,r[s]);return YM(n,e),n}})();Object.defineProperty(Wt,"__esModule",{value:!0});Wt.GATEWAY_OUTBOUND_RPC_METHOD=void 0;Wt.stageLocalMediaIfNeeded=mS;Wt.buildGatewayOutboundSendArgs=_S;Wt.buildGatewaySendParams=Up;Wt.buildGatewayRpcCommand=Mp;Wt.sendGatewayOutboundMessage=cG;var JM=require("child_process"),XM=require("crypto"),Vo=Gp(require("fs")),zM=Gp(require("os")),Ur=Gp(require("path")),QM=Cr(),ZM=ou(),eG=18789;Wt.GATEWAY_OUTBOUND_RPC_METHOD="send";function tG(t){return t?.trim()||process.env.AGENTHIPPO_GATEWAY_CLI?.trim()||"hippoclaw"}var nG=".openclaw",rG=[".clawdbot",".moldbot",".moltbot"];function sG(){let t=zM.homedir(),e=process.env.OPENCLAW_STATE_DIR?.trim()||process.env.CLAWDBOT_STATE_DIR?.trim();if(e)return e==="~"||e.startsWith("~/")||e.startsWith("~\\")?Ur.join(t,e.slice(1)):Ur.resolve(e);let n=Ur.join(t,nG);if(Vo.existsSync(n))return n;for(let r of rG){let s=Ur.join(t,r);if(Vo.existsSync(s))return s}return n}function iG(t){return/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||t.startsWith("data:")}function mS(t){let e=t?.trim();if(!e||iG(e))return t;let n;try{n=Vo.realpathSync(e)}catch{return e}let r=Ur.join(sG(),"media"),s=Ur.resolve(r);try{s=Vo.realpathSync(r)}catch{}let i=Ur.relative(s,n);if(i&&!i.startsWith("..")&&!Ur.isAbsolute(i))return n;let o=Ur.extname(n),a=Ur.basename(n,o),c=(0,XM.createHash)("sha256").update(n).digest("hex").slice(0,8),l=Ur.join(r,`${a}-${c}${o}`);return Vo.mkdirSync(r,{recursive:!0}),Vo.copyFileSync(n,l),l}function _S(t,e,n){let r=["message","send","--channel",t.channel,"--target",t.target,"--message",e];return n?.trim()&&r.push("--media",n.trim()),t.accountId&&r.push("--account",t.accountId),t.threadId&&r.push("--thread-id",t.threadId),r}function Up(t,e,n){return{to:t.target,message:e,channel:t.channel,accountId:t.accountId,threadId:t.threadId,sessionKey:t.sessionKey,agentId:t.agentId,idempotencyKey:`proactive:${t.agentId}:${Date.now()}`,...n?.trim()?{mediaUrl:n.trim()}:{}}}function Mp(t,e,n){return[Wt.GATEWAY_OUTBOUND_RPC_METHOD,JSON.stringify(Up(t,e,n))]}async function oG(t,e,n,r){let s=process.env.OPENCLAW_GATEWAY_URL?.trim()||`ws://127.0.0.1:${eG}`,i=r?.trim()||(0,QM.readOpenClawGatewayToken)(),{client:o,clientInfo:a}=(0,ZM.createEphemeralGatewayClient)(s,i);await o.connect(a);try{let c=await o.request(Wt.GATEWAY_OUTBOUND_RPC_METHOD,Up(t,e,n),6e4);return{stdout:JSON.stringify(c),stderr:""}}finally{o.close()}}function aG(t,e){let n=(0,JM.spawnSync)(t,e,{encoding:"utf-8",env:process.env});return{stdout:(n.stdout??"").trim(),stderr:(n.stderr??"").trim(),exitCode:n.status}}async function cG(t,e){let n=tG(e.cli);if(e.dryRun)return{ok:!0,via:"dry-run",command:Mp(t,e.message,e.media),stdout:"",stderr:"",exitCode:0};let r=mS(e.media),s=_S(t,e.message,r),i=[n,...s],o=Mp(t,e.message,r);try{let a=await oG(t,e.message,r,e.token);return{ok:!0,via:"gateway-rpc",command:o,stdout:a.stdout,stderr:a.stderr,exitCode:0}}catch(a){let c=a instanceof Error?a.message:String(a),l=aG(n,s);if(l.exitCode===0)return{ok:!0,via:"hippoclaw",command:i,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode};let u=l.stderr||l.stdout||"unknown error";return{ok:!1,via:"gateway-rpc",command:o,stdout:l.stdout,stderr:`Gateway RPC failed: ${c}
564
564
  HippoClaw CLI fallback failed (exit ${l.exitCode??"unknown"}): ${u}`.trim(),exitCode:l.exitCode}}}});var Va=T(Vn=>{"use strict";Object.defineProperty(Vn,"__esModule",{value:!0});Vn.Downsampler3=Vn.TELEPHONY_SAMPLE_RATE=Vn.REALTIME_SAMPLE_RATE=void 0;Vn.ulawDecode=uG;Vn.ulawEncode=dG;Vn.upsample3=fG;Vn.pcm16FromBytes=pG;Vn.pcm16ToBuffer=gG;Vn.REALTIME_SAMPLE_RATE=24e3;Vn.TELEPHONY_SAMPLE_RATE=8e3;var lG=(()=>{let t=new Int16Array(256);for(let e=0;e<256;e++){let n=~e&255,r=n&128,s=n>>4&7,o=(((n&15)<<3)+132<<s)-132;t[e]=r?-o:o}return t})();function uG(t){let e=new Int16Array(t.length);for(let n=0;n<t.length;n++)e[n]=lG[t[n]];return e}function dG(t){let e=new Uint8Array(t.length);for(let n=0;n<t.length;n++){let r=t[n],s=r<0?128:0;s&&(r=-r),r=Math.min(r,32635)+132;let i=7;for(let a=16384;(r&a)===0&&i>0;a>>=1)i--;let o=r>>i+3&15;e[n]=~(s|i<<4|o)&255}return e}function fG(t,e){let n=new Int16Array(t.length*3),r=e;for(let s=0;s<t.length;s++){let i=t[s];n[3*s]=Math.round(r+(i-r)/3),n[3*s+1]=Math.round(r+2*(i-r)/3),n[3*s+2]=i,r=i}return n}var jp=class{rest=new Int16Array(0);push(e){let n=new Int16Array(this.rest.length+e.length);n.set(this.rest),n.set(e,this.rest.length);let r=Math.floor(n.length/3),s=new Int16Array(r);for(let i=0;i<r;i++)s[i]=Math.round((n[3*i]+n[3*i+1]+n[3*i+2])/3);return this.rest=n.slice(r*3),s}reset(){this.rest=new Int16Array(0)}};Vn.Downsampler3=jp;function pG(t){let e=new Uint8Array(t.byteLength-t.byteLength%2);return e.set(t.subarray(0,e.byteLength)),new Int16Array(e.buffer)}function gG(t){return Buffer.from(t.buffer,t.byteOffset,t.byteLength)}});var ES=T(au=>{"use strict";Object.defineProperty(au,"__esModule",{value:!0});au.VoiceCall=void 0;var hG=Va(),mG=[{name:"ask_agent",description:"Hand a request to the agent behind this call. It can look things up, check availability, book, send messages, remember and use its tools. Use it for anything your instructions do not answer directly.",parameters:{type:"object",properties:{request:{type:"string",description:"The full request, with every detail the caller gave (names, dates, numbers, addresses)."}},required:["request"]}},{name:"end_call",description:"Hang up the call. Call it in the same reply as your goodbye; the goodbye still plays before the line closes.",parameters:{type:"object",properties:{}}}],_G={gateway:'Say one short line first, such as "Let me check that for you."',gemini:"Call it right away, without saying anything first; you will be told when to reassure the caller."},EG=t=>`You are the voice of the agent described below, on a live phone call.
565
565
  - Speak briefly and naturally: one to three short sentences at a time. Use the caller's language.
566
566
  - For anything these instructions do not answer, call ask_agent with the complete request. ${_G[t]} Never guess or make up facts, prices, times or availability.
@@ -581,17 +581,17 @@ ${this.callerLine()}
581
581
  Transcript:
582
582
  ${s}
583
583
 
584
- ${this.opts.spec.afterCall}`;await this.turnChain,r.afterCall=await this.opts.runTurn(i).catch(o=>({success:!1,error:String(o)})),this.opts.log(`after-call turn: ${r.afterCall.success?"ok":`failed (${r.afterCall.error})`}`)}this.resolveEnded(r)}};au.VoiceCall=xp});var Bp=T(cu=>{"use strict";Object.defineProperty(cu,"__esModule",{value:!0});cu.VOICE_DEBUG=void 0;cu.VOICE_DEBUG=process.env.AGENTHIPPO_VOICE_DEBUG==="1"});var SS=T(Ms=>{"use strict";var IG=Ms&&Ms.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ms,"__esModule",{value:!0});Ms.GeminiLiveUpstream=Ms.GEMINI_LIVE_URL=void 0;var yS=IG(require("ws")),wS=Va(),PG=Bp(),Fp=1500;Ms.GEMINI_LIVE_URL="wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent";function Vp(t){return Array.isArray(t)?t.map(Vp):!t||typeof t!="object"?t:Object.fromEntries(Object.entries(t).map(([e,n])=>[e,e==="type"&&typeof n=="string"?n.toUpperCase():Vp(n)]))}var Kp=class{model;apiKey;url;label;ws;events;ready=!1;pending=[];generating=!1;deferredText=[];lastCallerAt=0;flushTimer;callerBuf="";agentBuf="";startedAt=Date.now();constructor(e,n,r=Ms.GEMINI_LIVE_URL){this.model=e,this.apiKey=n,this.url=r,this.label=`gemini ${e} (direct)`}get busy(){return this.generating}start(e,n){this.events=n;let r=new yS.default(this.url,{headers:{"x-goog-api-key":this.apiKey}});this.ws=r,r.on("open",()=>r.send(JSON.stringify({setup:this.setup(e)}))),r.on("message",s=>this.onMessage(s.toString())),r.on("unexpected-response",(s,i)=>n.closed(`Gemini refused the session (HTTP ${i.statusCode})`)),r.on("error",s=>n.closed(`Gemini connection failed: ${s.message}`)),r.on("close",(s,i)=>n.closed(`Gemini closed the session (${s}${i.length?` ${i.toString().slice(0,200)}`:""})`))}sendAudio(e){this.ready&&this.send({realtimeInput:{audio:{data:Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64"),mimeType:`audio/pcm;rate=${wS.REALTIME_SAMPLE_RATE}`}}})}toolResult(e,n,r){this.send({toolResponse:{functionResponses:[{id:e,name:n,response:r}]}})}say(e){if(!this.generating&&Date.now()-this.lastCallerAt>Fp){this.send({realtimeInput:{text:e}});return}this.deferredText.push(e),this.flushTimer??=setInterval(()=>{!this.generating&&Date.now()-this.lastCallerAt>Fp&&this.flushDeferred()},250)}close(){clearInterval(this.flushTimer);try{this.ws?.close()}catch{}}setup(e){return{model:this.model.startsWith("models/")?this.model:`models/${this.model}`,generationConfig:{responseModalities:["AUDIO"],thinkingConfig:{thinkingBudget:0},...e.voice?{speechConfig:{voiceConfig:{prebuiltVoiceConfig:{voiceName:e.voice}}}}:{}},systemInstruction:{parts:[{text:e.instructions}]},tools:[{functionDeclarations:e.tools.map(n=>({name:n.name,description:n.description,parameters:Vp(n.parameters)}))}],realtimeInputConfig:{automaticActivityDetection:{silenceDurationMs:500}},inputAudioTranscription:{},outputAudioTranscription:{}}}send(e){let n=JSON.stringify(e);this.ready?this.ws?.readyState===yS.default.OPEN&&this.ws.send(n):this.pending.push(n)}flushDeferred(){clearInterval(this.flushTimer),this.flushTimer=void 0;for(let e of this.deferredText.splice(0))this.send({realtimeInput:{text:e}})}flushCaller(){this.callerBuf.trim()&&this.events.callerText(this.callerBuf.trim()),this.callerBuf=""}flushAgent(){this.agentBuf.trim()&&this.events.agentText(this.agentBuf.trim()),this.agentBuf=""}onMessage(e){let n;try{n=JSON.parse(e)}catch{return}if(PG.VOICE_DEBUG){let s=Object.keys(n.serverContent??{}).filter(o=>o!=="modelTurn"),i=Object.keys(n).filter(o=>o!=="serverContent"||s.length);i.length&&this.events.log(`\u2190 ${i.join(",")}${s.length?`[${s.join(",")}]`:""} (+${Date.now()-this.startedAt} ms)`)}if(n.setupComplete){this.ready=!0;for(let s of this.pending.splice(0))this.ws?.send(s);this.events.open()}if(n.usageMetadata&&this.events.usage(Number(n.usageMetadata.promptTokenCount??0),Number(n.usageMetadata.responseTokenCount??0)),n.goAway&&this.events.log(`Gemini goAway: ${JSON.stringify(n.goAway).slice(0,200)}`),n.toolCall?.functionCalls){this.flushCaller();for(let s of n.toolCall.functionCalls)this.events.toolCall(String(s.name),String(s.id),s.args??{})}let r=n.serverContent;if(r){r.inputTranscription?.text&&(this.callerBuf+=r.inputTranscription.text,this.lastCallerAt=Date.now(),this.events.callerActivity());for(let s of r.modelTurn?.parts??[])s.inlineData?.data&&(this.generating||(this.generating=!0,this.flushCaller()),this.events.audio((0,wS.pcm16FromBytes)(Buffer.from(s.inlineData.data,"base64"))));r.outputTranscription?.text&&(this.agentBuf+=r.outputTranscription.text),r.interrupted&&(this.generating=!1,this.flushAgent(),this.events.interrupted()),r.turnComplete&&(this.generating=!1,this.flushCaller(),this.flushAgent(),Date.now()-this.lastCallerAt>Fp&&this.flushDeferred())}}};Ms.GeminiLiveUpstream=Kp});var TS=T(Ko=>{"use strict";var NG=Ko&&Ko.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ko,"__esModule",{value:!0});Ko.OpenAIRealtimeUpstream=void 0;var Wp=NG(require("ws")),AS=Va(),qp=Bp(),Yp=class{url;headers;label;ws;events;startedAt=Date.now();responseActive=!1;wantResponse=!1;pendingItems=[];ownRequestPending=!1;turnAnswered=!1;vadEvents=!1;expectStray=!1;dropResponseId;constructor(e,n,r){this.url=e,this.headers=n,this.label=`gateway ${r}`}get busy(){return this.responseActive}start(e,n){this.events=n;let r=new Wp.default(this.url,{headers:this.headers});this.ws=r,r.on("open",()=>{this.send({type:"session.update",session:this.sessionConfig(e)}),n.open()}),r.on("message",s=>this.onMessage(s.toString())),r.on("unexpected-response",(s,i)=>n.closed(`gateway refused the realtime session (HTTP ${i.statusCode})`)),r.on("error",s=>n.closed(`realtime connection failed: ${s.message}`)),r.on("close",s=>n.closed(`realtime connection closed (${s})`))}sendAudio(e){this.ws?.readyState===Wp.default.OPEN&&this.send({type:"input_audio_buffer.append",audio:Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64")})}toolResult(e,n,r){this.pendingItems.push({type:"conversation.item.create",item:{type:"function_call_output",call_id:e,output:JSON.stringify(r)}}),this.flushPending()}say(e){this.pendingItems.push({type:"conversation.item.create",item:{type:"message",role:"user",content:[{type:"input_text",text:e}]}}),this.flushPending()}close(){try{this.ws?.close()}catch{}}sessionConfig(e){let n={type:"audio/pcm",rate:AS.REALTIME_SAMPLE_RATE};return{type:"realtime",instructions:e.instructions,output_modalities:["audio"],audio:{input:{format:n,transcription:{model:e.transcription},turn_detection:{type:"server_vad"}},output:{format:n,...e.voice?{voice:e.voice}:{}}},tools:e.tools.map(r=>({type:"function",...r}))}}send(e){let n=e.type;qp.VOICE_DEBUG&&n!=="input_audio_buffer.append"&&this.events.log(`\u2192 ${n} (+${Date.now()-this.startedAt} ms, active=${this.responseActive})`),this.ws?.readyState===Wp.default.OPEN&&this.ws.send(JSON.stringify(e))}requestResponse(){if(this.responseActive){this.wantResponse=!0;return}this.wantResponse=!1,this.responseActive=!0,this.ownRequestPending=!0,this.send({type:"response.create"})}flushPending(){if(!(this.responseActive||!this.pendingItems.length)){for(let e of this.pendingItems.splice(0))this.send(e);this.requestResponse()}}onMessage(e){let n;try{n=JSON.parse(e)}catch{return}switch(qp.VOICE_DEBUG&&!String(n.type).endsWith(".delta")&&this.events.log(`\u2190 ${n.type} (+${Date.now()-this.startedAt} ms)`),n.type){case"response.output_audio.delta":case"response.audio.delta":(!n.response_id||n.response_id!==this.dropResponseId)&&this.events.audio((0,AS.pcm16FromBytes)(Buffer.from(String(n.delta??""),"base64")));break;case"input_audio_buffer.speech_started":this.turnAnswered=!1,this.vadEvents=!0,this.events.interrupted();break;case"input_audio_buffer.speech_stopped":this.events.callerActivity();break;case"response.created":if(this.responseActive=!0,this.expectStray&&!this.ownRequestPending&&n.response?.id){this.expectStray=!1,this.dropResponseId=n.response.id,this.send({type:"response.cancel",response_id:n.response.id});break}this.ownRequestPending=!1,this.turnAnswered=!0;break;case"response.done":{this.responseActive=!1;let r=n.response?.usage;this.events.usage(Number(r?.input_tokens??0),Number(r?.output_tokens??0)),this.pendingItems.length?this.flushPending():this.wantResponse&&this.requestResponse();break}case"response.output_audio_transcript.done":case"response.audio_transcript.done":this.events.agentText(String(n.transcript??""));break;case"conversation.item.input_audio_transcription.completed":this.onTranscriptionDone(),this.events.callerText(String(n.transcript??""));break;case"response.output_item.done":if(n.item?.type==="function_call"){let r={};try{r=JSON.parse(String(n.item.arguments??"{}"))}catch{}this.events.toolCall(String(n.item.name),String(n.item.call_id),r)}break;case"error":if(n.error?.code==="conversation_already_has_active_response"&&!qp.VOICE_DEBUG)break;this.events.log(`realtime error: ${JSON.stringify(n.error??n).slice(0,300)}`);break}}onTranscriptionDone(){this.vadEvents&&this.turnAnswered&&!this.responseActive&&(this.expectStray=!0)}};Ko.OpenAIRealtimeUpstream=Yp});var NS=T(be=>{"use strict";var RG=be&&be.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),CG=be&&be.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),OS=be&&be.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&RG(n,e,r[s]);return CG(n,e),n}})();Object.defineProperty(be,"__esModule",{value:!0});be.VoiceRoute=be.MAX_CONCURRENT_VOICE_TURNS_ENV=be.VoiceRefusal=be.VOICE_DRAIN_SECONDS_ENV=be.VOICE_GEMINI_API_KEY_ENV=be.VOICE_STREAM_SECRET_ENV=be.MAX_CONCURRENT_CALLS_ENV=be.VOICE_SESSION_PATH=void 0;be.createVoiceTurnGate=UG;be.voiceDrainMsFromEnv=HG;be.maxCallsFromEnv=jG;be.signStreamToken=xG;be.verifyStreamToken=IS;be.realtimeUrl=PS;var lu=OS(require("crypto")),li=OS(require("ws")),Wo=Va(),kG=ur(),$G=ES(),DG=SS(),LG=TS();be.VOICE_SESSION_PATH="/v1/voice/session";be.MAX_CONCURRENT_CALLS_ENV="AGENTHIPPO_MAX_CONCURRENT_CALLS";be.VOICE_STREAM_SECRET_ENV="AGENTHIPPO_VOICE_STREAM_SECRET";be.VOICE_GEMINI_API_KEY_ENV="AGENTHIPPO_VOICE_GEMINI_API_KEY";be.VOICE_DRAIN_SECONDS_ENV="AGENTHIPPO_VOICE_DRAIN_SECONDS";var MG=15e3,bS=160,GG=64*1024,tn=class extends Error{status;constructor(e,n){super(n),this.status=e}};be.VoiceRefusal=tn;be.MAX_CONCURRENT_VOICE_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_VOICE_TURNS";function UG(t=process.env){let e=Number(t[be.MAX_CONCURRENT_VOICE_TURNS_ENV]??4);return new kG.TurnGate(Number.isFinite(e)&&e>0?e:4,8)}function HG(t=process.env){let e=Number(t[be.VOICE_DRAIN_SECONDS_ENV]??720);return(Number.isFinite(e)&&e>=0?e:720)*1e3}function jG(t=process.env){let e=Number(t[be.MAX_CONCURRENT_CALLS_ENV]??20);return Number.isFinite(e)&&e>0?Math.floor(e):20}var vS=t=>Buffer.from(t).toString("base64url");function xG(t,e){let n=vS(JSON.stringify(t));return`${n}.${vS(lu.createHmac("sha256",e).update(n).digest())}`}function IS(t,e,n=Date.now()/1e3){let[r,s]=t.split(".");if(!r||!s)throw new tn(401,"malformed stream token");let i=lu.createHmac("sha256",e).update(r).digest(),o=Buffer.from(s,"base64url");if(o.length!==i.length||!lu.timingSafeEqual(o,i))throw new tn(401,"bad stream token");let a;try{a=JSON.parse(Buffer.from(r,"base64url").toString("utf-8"))}catch{throw new tn(401,"malformed stream token")}if(!a||typeof a!="object"||!a.sid||!(a.exp>n))throw new tn(401,"expired stream token");return a}function PS(t,e){return`${t.replace(/\/+$/,"").replace(/\/v1$/,"").replace(/^http/,"ws")}/v1/realtime?model=${encodeURIComponent(e)}`}function BG(t){return{sendAudio:e=>t.readyState===li.default.OPEN&&t.send((0,Wo.pcm16ToBuffer)(e)),clear:()=>t.readyState===li.default.OPEN&&t.send(JSON.stringify({type:"clear"})),transcript:e=>t.readyState===li.default.OPEN&&t.send(JSON.stringify({type:"transcript",...e})),close:e=>{t.readyState===li.default.OPEN&&(t.send(JSON.stringify({type:"ended",reason:e})),t.close(1e3,e.slice(0,120)))},onAudio:e=>t.on("message",(n,r)=>{r&&e((0,Wo.pcm16FromBytes)(n))}),onClose:e=>t.on("close",e)}}function FG(t){let e=new Wo.Downsampler3,n=new Uint8Array(0),r=0;return{sendAudio:s=>{let i=(0,Wo.ulawEncode)(e.push(s)),o=new Uint8Array(n.length+i.length);o.set(n),o.set(i,n.length);let a=Math.floor(o.length/bS)*bS;a&&t.readyState===li.default.OPEN&&t.send(JSON.stringify({event:"media",media:{payload:Buffer.from(o.subarray(0,a)).toString("base64")}})),n=o.slice(a)},clear:()=>{n=new Uint8Array(0),e.reset(),t.readyState===li.default.OPEN&&t.send(JSON.stringify({event:"clear"}))},close:s=>t.readyState===li.default.OPEN&&t.close(1e3,s.slice(0,120)),onAudio:s=>t.on("message",i=>{let o;try{o=JSON.parse(i.toString())}catch{return}if(o.event==="media"&&o.media?.payload&&(o.media.track??"inbound")==="inbound"){let a=(0,Wo.ulawDecode)(Buffer.from(o.media.payload,"base64"));a.length&&(s((0,Wo.upsample3)(a,r)),r=a[a.length-1])}else o.event==="stop"&&t.close(1e3,"stream stopped")}),onClose:s=>t.on("close",s)}}var Jp=class{deps;wss=new li.WebSocketServer({noServer:!0,maxPayload:GG,verifyClient:(e,n)=>void this.admitCall(e.req).then(()=>n(!0),r=>{this.deps.log(`refusing call: ${r instanceof Error?r.message:String(r)}`);let s=r instanceof tn?r.status:500,i=r instanceof tn?r.message:"internal error";n(!1,s,JSON.stringify({error:i}),{"Content-Type":"application/json",...s===503?{"Retry-After":"5"}:{}})})});admitted=new WeakMap;calls=new Map;reserved=0;draining=!1;recheck;constructor(e){this.deps=e,this.recheck=setInterval(()=>void this.recheckLeases(),e.leaseRecheckMs??MG),this.recheck.unref?.()}get active(){return this.reserved}get max(){return this.deps.maxCalls}handleUpgrade(e,n,r){return new URL(e.url??"/","http://serve").pathname!==be.VOICE_SESSION_PATH?!1:(n.once("close",()=>{let s=this.admitted.get(e);s&&!s.started&&(this.admitted.delete(e),this.reserved-=1)}),this.wss.handleUpgrade(e,n,r,s=>this.startCall(s,e)),!0)}async admitCall(e){if(this.draining)throw new tn(503,"Shutting down");if(this.reserved>=this.deps.maxCalls)throw new tn(503,`At capacity (${this.reserved}/${this.deps.maxCalls})`);this.reserved+=1;try{let n=new URL(e.url??"/","http://serve"),r=n.searchParams.get("format")??"pcm16";if(r!=="pcm16"&&r!=="telnyx")throw new tn(400,`unknown format ${r}`);let s;this.deps.streamSecret?s=IS(n.searchParams.get("token")??"",this.deps.streamSecret):s={sid:n.searchParams.get("session_id")??void 0,caller:n.searchParams.get("caller")??void 0};let i=this.deps.loadSpec();if(!i)throw new tn(404,"this agent pack has no spec.voice");if(i.provider==="gemini"&&!this.deps.geminiApiKey)throw new tn(503,`voice on Gemini needs ${be.VOICE_GEMINI_API_KEY_ENV}`);if(i.provider==="gateway"&&!this.deps.gatewayBaseUrl)throw new tn(503,"voice through the gateway needs AGENTHIPPO_LITELLM_BASE_URL");let o=await this.deps.resolveCall(e,s);await this.deps.admit(o.sessionKey).catch(a=>{throw new tn(403,a instanceof Error?a.message:"not admitted")}),this.admitted.set(e,{ctx:{...o,callId:lu.randomUUID(),caller:s.caller},spec:i,format:r,started:!1})}catch(n){throw this.reserved-=1,n}}startCall(e,n){let r=this.admitted.get(n);if(!r){e.close(1011,"not admitted");return}r.started=!0,this.admitted.delete(n);let{ctx:s,spec:i,format:o}=r,a=o==="telnyx"?FG(e):BG(e),c=u=>this.deps.log(`[call ${s.callId.slice(0,8)}] ${u}`);e.on("error",u=>c(`caller connection error: ${u.message}`));let l=new $G.VoiceCall({callId:s.callId,caller:s.caller,spec:i,upstream:i.provider==="gemini"?new DG.GeminiLiveUpstream(i.model,this.deps.geminiApiKey??"",this.deps.geminiUrl):new LG.OpenAIRealtimeUpstream(PS(this.deps.gatewayBaseUrl,i.model),{Authorization:`Bearer ${this.deps.gatewayApiKey}`,...this.deps.upstreamHeaders(s)},i.model),transport:a,runTurn:u=>this.deps.runTurn(s,u),log:c});this.calls.set(s.callId,{call:l,ctx:s}),c(`started (${o}, session ${s.sessionKey}, ${this.reserved}/${this.deps.maxCalls} live)`),this.deps.onCallStart?.(s),l.start(),l.done.then(u=>{this.calls.delete(s.callId),this.reserved-=1,this.deps.onCallEnd?.(s,u)})}async recheckLeases(){for(let{call:e,ctx:n}of this.calls.values())try{await this.deps.admit(n.sessionKey)}catch(r){this.deps.log(`[call ${n.callId.slice(0,8)}] ending: ${r instanceof Error?r.message:"no longer admitted"}`),e.stop("the agent was stopped")}}async drain(e){this.draining=!0,clearInterval(this.recheck);let n=Date.now()+e;for(;this.calls.size&&Date.now()<n;)await new Promise(s=>setTimeout(s,500));let r=[...this.calls.values()];for(let{call:s}of r)s.stop("server shutting down");await Promise.race([Promise.all(r.map(({call:s})=>s.done)),new Promise(s=>setTimeout(s,5e3))]),this.wss.close()}};be.VoiceRoute=Jp});var GS=T(Ze=>{"use strict";var VG=Ze&&Ze.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),KG=Ze&&Ze.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),RS=Ze&&Ze.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&VG(n,e,r[s]);return KG(n,e),n}})();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.isAwsCliAvailable=JG;Ze.resolveS3StateConfig=XG;Ze.resolveRestoreBootMode=zG;Ze.safeSessionId=du;Ze.sessionRemoteUri=Xp;Ze.shardBelongsToSession=zp;Ze.hasLocalSessionState=CS;Ze.listSessionShardFiles=kS;Ze.stageSessionPushDir=$S;Ze.mergeSessionStagingIntoState=DS;Ze.restoreState=eU;Ze.pushState=LS;Ze.pushSessionState=MS;Ze.ensureSessionLocal=tU;Ze.clearRestoreAttemptCache=nU;Ze.makeStatePusher=rU;Ze.providerSessionShardName=sU;var WG=require("crypto"),qG=require("child_process"),nn=RS(require("fs/promises")),Nn=RS(require("path")),YG=require("util"),Ka=(0,YG.promisify)(qG.execFile),uu=new Set;async function JG(){try{return await Ka("aws",["--version"]),!0}catch{return!1}}function XG(t=process.env){let e=t.AGENTHIPPO_STATE_S3_URI?.trim();return e?{uri:e.replace(/\/+$/,""),endpoint:t.AGENTHIPPO_STATE_S3_ENDPOINT?.trim()||void 0}:null}function zG(t=process.env){return t.AGENTHIPPO_STATE_RESTORE_BOOT?.trim().toLowerCase()==="none"?"none":"all"}function du(t){return t.trim().replace(/[<>:"/\\|?*\x00-\x1F]+/g,"_").replace(/\.\./g,"_").slice(0,160)||"session"}function Xp(t,e){return`${t.uri}/sessions/${du(e)}`}function fu(t,e,n){let r=["s3","sync",e,n,"--no-progress"];return t.endpoint&&r.push("--endpoint-url",t.endpoint),r}function QG(t,e){return`${Nn.resolve(t)}\0${e}`}function zp(t,e,n){if(n?.chatSessionId&&n.chatSessionId===e)return!0;let r=t.split(":");return r.length>=2&&r[1]===e}async function CS(t,e){let n=Nn.join(t,"provider-sessions"),r;try{r=await nn.readdir(n)}catch{return!1}for(let s of r)if(s.endsWith(".json"))try{let i=await nn.readFile(Nn.join(n,s),"utf8"),o=JSON.parse(i);if(typeof o.key=="string"&&zp(o.key,e,o.value))return!0}catch{}return!1}async function kS(t,e){let n=Nn.join(t,"provider-sessions"),r;try{r=await nn.readdir(n)}catch{return[]}let s=[];for(let i of r)if(i.endsWith(".json"))try{let o=await nn.readFile(Nn.join(n,i),"utf8"),a=JSON.parse(o);typeof a.key=="string"&&zp(a.key,e,a.value)&&s.push(i)}catch{}return s}async function ZG(t){try{return await nn.access(t),!0}catch{return!1}}async function $S(t,e,n){await nn.rm(n,{recursive:!0,force:!0}),await nn.mkdir(n,{recursive:!0});let r=await kS(t,e),s=Nn.join(n,"provider-sessions");if(r.length>0){await nn.mkdir(s,{recursive:!0});for(let i of r)await nn.copyFile(Nn.join(t,"provider-sessions",i),Nn.join(s,i))}return r.length>0}async function DS(t,e){let n=Nn.join(t,"provider-sessions");if(await ZG(n)){let r=Nn.join(e,"provider-sessions");await nn.mkdir(r,{recursive:!0});for(let s of await nn.readdir(n))s.endsWith(".json")&&await nn.copyFile(Nn.join(n,s),Nn.join(r,s))}}async function eU(t,e,n){try{await Ka("aws",fu(t,t.uri,e)),n?.(`State restored from ${t.uri}`)}catch(r){n?.(`State restore skipped: ${r instanceof Error?r.message:String(r)}`)}}async function LS(t,e,n){try{await Ka("aws",fu(t,e,t.uri))}catch(r){console.error(`[state-sync] push to ${t.uri} failed: ${r instanceof Error?r.message:String(r)}`),n?.(`State push failed: ${r instanceof Error?r.message:String(r)}`)}}async function MS(t,e,n,r){let s=du(n),i=Nn.join(e,".push-staging",s);try{if(!await $S(e,n,i)){r?.(`State push skipped for session ${s}: nothing local`);return}let a=Xp(t,n);await Ka("aws",fu(t,i,a)),r?.(`State pushed session ${s} \u2192 ${a}`)}catch(o){console.error(`[state-sync] push session ${s} failed: ${o instanceof Error?o.message:String(o)}`),r?.(`State push failed for ${s}: ${o instanceof Error?o.message:String(o)}`)}finally{await nn.rm(i,{recursive:!0,force:!0}).catch(()=>{})}}async function tU(t,e,n,r){let s=QG(e,n);if(uu.has(s))return;if(await CS(e,n)){uu.add(s);return}let i=du(n),o=Nn.join(e,".restore-staging",i);try{await nn.rm(o,{recursive:!0,force:!0}),await nn.mkdir(o,{recursive:!0});let a=Xp(t,n);await Ka("aws",fu(t,a,o)),await DS(o,e),r?.(`State restored session ${i} from ${a}`)}catch(a){r?.(`State restore-on-miss skipped for ${i}: ${a instanceof Error?a.message:String(a)}`)}finally{uu.add(s),await nn.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}function nU(){uu.clear()}function rU(t,e,n,r=1e3){let s=null,i=!1,o=null,a=new Set,c=!1,l=()=>{i=!0;let f=[...a],p=c;return a.clear(),c=!1,o=(async()=>{p&&await LS(t,e,n);for(let g of f)await MS(t,e,g,n)})().catch(g=>{console.error(`[state-sync] push batch failed: ${g instanceof Error?g.message:String(g)}`)}).finally(()=>{i=!1,o=null,(a.size>0||c)&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))}),o};return{schedule:f=>{f?.trim()?a.add(f.trim()):c=!0,!i&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))},flush:async()=>{s&&(clearTimeout(s),s=null),o&&await o,(a.size>0||c)&&(await l(),o&&await o)}}}function sU(t){return`${(0,WG.createHash)("sha256").update(t).digest("hex").slice(0,40)}.json`}});var US=T(ss=>{"use strict";Object.defineProperty(ss,"__esModule",{value:!0});ss.CLI_GATEWAY_AGENT_PREFIX=void 0;ss.resolveCliGatewayAgentId=aU;ss.isCliGatewayAgentId=cU;var iU=er();ss.CLI_GATEWAY_AGENT_PREFIX="agenthippo-cli";function oU(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,32)||"unnamed"}function aU(t){let e=(t??"").trim().toLowerCase();return!e||e===iU.AGENT_CONSTANTS.DEFAULT_AGENT_ID?ss.CLI_GATEWAY_AGENT_PREFIX:`${ss.CLI_GATEWAY_AGENT_PREFIX}-${oU(e)}`}function cU(t){let e=(t??"").trim().toLowerCase();return e===ss.CLI_GATEWAY_AGENT_PREFIX||e.startsWith(`${ss.CLI_GATEWAY_AGENT_PREFIX}-`)}});var eg=T(Gs=>{"use strict";Object.defineProperty(Gs,"__esModule",{value:!0});Gs.fetchMeetAgentChannelContext=HS;Gs.mapChannelsStatusToMeetAgentRows=Zp;Gs.parseChannelBindSpecs=fU;Gs.applyAgentChannelBindingsViaConfigPatch=_U;Gs.fetchMeetAgentChannelRows=EU;Gs.waitForChannelsLive=wU;Gs.resolvePublishedGatewayChannelIds=SU;var Qp={probe:!1,timeoutMs:1e4};async function HS(t){let e=await t("channels.status",Qp);return{rows:Zp(e),statusPayload:e}}function ui(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Zp(t){let e=ui(t);if(!e)return[];let n=Array.isArray(e.channelOrder)?e.channelOrder:null,r=ui(e.channelLabels)??{},s=ui(e.channels)??{},i=ui(e.channelAccounts)??{},o=ui(e.channelDefaultAccountId)??{},a=n&&n.length>0?n:[...Object.keys(s)].sort((l,u)=>l.localeCompare(u)),c=[];for(let l of a){let u=typeof r[l]=="string"?r[l]:l,d=i[l],f=Array.isArray(d)?d:[],p=f.length>0?f.map(w=>typeof w.accountId=="string"?w.accountId:"default"):[typeof o[l]=="string"?o[l]:"default"],g=ui(s[l]),_=g&&typeof g.connected=="boolean"?g.connected:g?.running===!0,h=f.some(w=>typeof w.connected=="boolean"&&w.connected||w.running===!0),y=_||h,E=g?.configured===!0||f.some(w=>w.configured===!0&&w.enabled!==!1)||y;c.push({id:l,label:u,connected:y,enabled:E,accounts:p})}return c}function lU(t){let e=ui(t);if(!e)return{};let n=ui(e.channelDefaultAccountId)??{},r={};for(let[s,i]of Object.entries(n))typeof i=="string"&&i.trim()&&(r[s]=i.trim());return r}function uU(t,e){if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t;if(n.type==="acp"||String(n.agentId??"").trim().toLowerCase()!==e)return!1;let r=n.match;return!r||typeof r!="object"||r.peer?!1:typeof r.channel=="string"&&r.channel.trim().length>0}function dU(t){return typeof t!="string"||!t.trim()?"default":t.trim().toLowerCase()}function fU(t){return t.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let n=e.indexOf(":");if(n===-1)return{channelId:e};let r=e.slice(0,n).trim(),s=e.slice(n+1).trim();return s?{channelId:r,accountId:s}:{channelId:e}})}function pU(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t.match?.channel;return typeof e=="string"&&e.trim()?e.trim():void 0}function gU(t){let e=pU(t);return!!(e&&e.includes(":"))}function hU(t,e,n){if(!t||typeof t!="object"||Array.isArray(t))return!1;let r=t;if(r.type==="acp"||String(r.type??"route").toLowerCase()!=="route")return!1;let i=r.match;if(!i||typeof i!="object"||i.peer)return!1;let o=typeof i.channel=="string"?i.channel.trim().toLowerCase():"",a=dU(i.accountId);return o===e.trim().toLowerCase()&&a===n.trim().toLowerCase()}function mU(t){let e=t.agentId.trim().toLowerCase(),n=i=>t.channelAccountOverrides?.[i]??t.channelDefaultAccountId[i]??"default",r=t.existingBindings.filter(i=>{if(gU(i)||uU(i,e))return!1;for(let o of t.selectedChannelIds){let a=n(o);if(hU(i,o,a))return!1}return!0}),s=t.selectedChannelIds.map(i=>{let o=n(i);return{type:"route",agentId:t.agentId.trim(),match:{channel:i,accountId:o}}});return[...r,...s]}async function _U(t,e){let n=e.statusPayload??await t("channels.status",Qp),r=lU(n),s=await t("config.get",{}),i=typeof s.hash=="string"?s.hash.trim():"";if(!i)throw new Error("config.get did not return hash; cannot config.patch bindings");let o=Array.isArray(s.config?.bindings)?s.config.bindings:[],a=mU({existingBindings:o,agentId:e.agentId,selectedChannelIds:e.selectedChannelIds,channelDefaultAccountId:r,channelAccountOverrides:e.channelAccountOverrides});return JSON.stringify(o)===JSON.stringify(a)?!1:(await t("config.patch",{baseHash:i,raw:JSON.stringify({bindings:a})}),!0)}async function EU(t){let{rows:e}=await HS(t);return e}var yU=t=>new Promise(e=>setTimeout(e,t));async function wU(t,e,n={}){let r=[...new Set(e.map(f=>f.trim().toLowerCase()).filter(Boolean))];if(r.length===0)return{ready:!0,live:[],pending:[],polls:0,timedOut:!1};let s=n.timeoutMs??8e3,i=n.intervalMs??400,o=n.sleep??yU,a=n.now??Date.now,c=a(),l=0,u=[],d=[...r];for(;;){l++;let f;try{let g=await t("channels.status",Qp);f=Zp(g)}catch{f=[]}let p=new Set(f.filter(g=>g.connected).map(g=>g.id.trim().toLowerCase()));if(u=r.filter(g=>p.has(g)),d=r.filter(g=>!p.has(g)),d.length===0)return{ready:!0,live:u,pending:d,polls:l,timedOut:!1};if(a()-c>=s)return{ready:!1,live:u,pending:d,polls:l,timedOut:!0};await o(i)}}function SU(t,e){let n=e?.trim();return n?t.filter(r=>r.id.toLowerCase()===n.toLowerCase()).map(r=>r.id):t.filter(r=>r.enabled).map(r=>r.id)}});var WS=T(rn=>{"use strict";var xS=rn&&rn.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(rn,"__esModule",{value:!0});rn.GatewayBridge=rn.MAX_GATEWAY_ID_CHARS=void 0;rn.isIdeThreadCompositeRouteKey=BS;rn.parseIdeThreadIdFromCompositeRouteKey=vU;rn.findOversizedRunField=FS;rn.buildIdeSessionRouteKey=VS;rn.extractRouteLabelFromGatewaySessionKey=KS;rn.looksLikeGatewayChannelRouteKey=IU;rn.createGatewayBridge=PU;var AU=require("events"),tg=ou(),TU=xS(require("node:os")),ng=xS(require("node:path")),bU=jl(),jS=Zc(),qo="::sid:";function BS(t){return!!t?.includes(qo)}function vU(t){if(!t||!BS(t))return;let e=t.lastIndexOf(qo),n=t.slice(e+qo.length).trim();return n.length>0?n:void 0}rn.MAX_GATEWAY_ID_CHARS=512;var OU=["agentId","sessionKey","sessionId","channel","accountId","target","threadId","groupId","senderUsername","senderName","senderId"];function FS(t){let e=t;for(let n of OU){let r=e[n];if(r!=null&&(typeof r!="string"||r.length>rn.MAX_GATEWAY_ID_CHARS))return n}}function VS(t,e){let n=t?.trim(),r=e?.trim();return n&&r?`${n}${qo}${r}`:n||r}function KS(t){let e=t.trim(),n="agent:";if(!e.toLowerCase().startsWith(n))return;let r=e.slice(n.length),s=r.indexOf(":");if(s<0)return;let i=r.slice(s+1).trim();return i.length>0?i:void 0}function IU(t){let e=t&&t.includes(qo)?t.slice(0,t.lastIndexOf(qo)):t,r=(e?KS(e)??e:void 0)?.split(":").filter(Boolean)??[];return r.length<2?!1:["channel","chat","dm","group","thread","user"].includes(r[1].trim().toLowerCase())}var pu=class extends AU.EventEmitter{options;client;clientInfo;agents=new Map;serverConnId=null;supportsAgentRegistration=null;isUnknownMethodError(e){return(e instanceof Error?e.message:String(e)).toLowerCase().includes("unknown method")}async ensureGatewayRuntimeRegistration(e,n){try{await this.client.request("agents.register",{agent:{id:e.id,name:e.name??e.id,workspace:n}})}catch(r){if(this.isUnknownMethodError(r))return;this.log(`agents.register follow-up failed (non-fatal): ${r instanceof Error?r.message:String(r)}`)}}constructor(e){super(),this.options=e,this.on("error",()=>{});let{client:n,clientInfo:r}=(0,tg.createAgentIDEGatewayClient)(e.gatewayUrl,e.token,e.version);this.client=n,this.clientInfo=r,this.setupEventHandlers()}setupEventHandlers(){this.client.on("connected",async e=>{this.serverConnId=e.server.connId,this.log(`Connected to Gateway (connId=${this.serverConnId})`),this.emit("connected",e),this.agents.size>0&&await this.reregisterAllAgents()}),this.client.on("disconnected",()=>{this.log("Disconnected from Gateway"),this.emit("disconnected")}),this.client.on("error",e=>{this.log(`Gateway error: ${e.message}`),this.emit("error",e)}),this.client.on("reconnecting",e=>{this.log(`Reconnecting to Gateway (attempt ${e})...`),this.emit("reconnecting",e)}),this.client.on("request",e=>{this.handleServerRequest(e)}),this.client.on("event:agents.updated",e=>{this.emit("agents.updated",e)})}async connect(){return this.log(`Connecting to Gateway at ${this.options.gatewayUrl}...`),this.client.connect(this.clientInfo)}async registerAgent(e){if(this.agents.has(e.id))throw new Error(`Agent ${e.id} is already registered`);let n=(e.workspace??this.resolveOpenClawWorkspaceDir(e.id)).trim();if(!(e.syncOpenClawConfigAgent!==!1))await this.ensureGatewayRuntimeRegistration(e,n);else if(this.supportsAgentRegistration===!1)this.log(`Gateway remote agent management unavailable; using local registration for ${e.id}`);else{try{await this.client.request("agents.create",{name:e.id,workspace:n}),this.supportsAgentRegistration=!0}catch(s){let i=s instanceof Error?s.message:String(s);if(this.isUnknownMethodError(s))this.supportsAgentRegistration=!1,this.log(`Gateway remote agent management rejected (unknown method); using local registration for ${e.id}`);else if(i.toLowerCase().includes("already exists"))await this.client.request("agents.update",{agentId:e.id,workspace:n,name:e.name??e.id}),this.supportsAgentRegistration=!0;else throw s}await this.ensureGatewayRuntimeRegistration(e,n)}this.agents.set(e.id,e),this.log(`Registered agent: ${e.id}`),this.emit("agent.registered",e.id,{needsBinding:!0})}async reregisterAllAgents(){this.log(`Re-registering ${this.agents.size} agent(s) after reconnect...`);for(let e of this.agents.values())try{if(e.syncOpenClawConfigAgent===!1){let r=(e.workspace??this.resolveOpenClawWorkspaceDir(e.id)).trim();await this.ensureGatewayRuntimeRegistration(e,r),this.log(`Re-registered runtime agent: ${e.id}`);continue}if(this.supportsAgentRegistration===!1){this.log(`Skipping remote re-register for ${e.id} (gateway compatibility mode)`);continue}let n=(e.workspace??this.resolveOpenClawWorkspaceDir(e.id)).trim();try{await this.client.request("agents.create",{name:e.id,workspace:n})}catch(r){if((r instanceof Error?r.message:String(r)).toLowerCase().includes("already exists"))await this.client.request("agents.update",{agentId:e.id,workspace:n,name:e.name??e.id});else throw r}await this.ensureGatewayRuntimeRegistration(e,n),this.supportsAgentRegistration=!0,this.log(`Re-registered agent: ${e.id}`)}catch(n){if(this.isUnknownMethodError(n)){this.supportsAgentRegistration=!1,this.log(`Gateway rejected remote agent management during reconnect (unknown method); keeping local registration for ${e.id}`);continue}this.log(`Failed to re-register agent ${e.id}: ${n}`)}this.supportsAgentRegistration===!1&&this.log("Gateway compatibility mode active: inbound routing relies on plugin/session bridge, not agents.register.")}async unregisterAgent(e){if(this.agents.get(e))try{if(this.supportsAgentRegistration===!1){this.agents.delete(e),this.log(`Unregistered local agent: ${e} (gateway compatibility mode)`),this.emit("agent.unregistered",e);return}await this.client.request("agents.delete",{agentId:e,deleteFiles:!1},3e4),this.agents.delete(e),this.log(`Unregistered agent: ${e}`),this.emit("agent.unregistered",e)}catch(r){if(this.isUnknownMethodError(r)){this.supportsAgentRegistration=!1,this.agents.delete(e),this.log(`Gateway rejected remote agent management delete (unknown method); removed local agent ${e} instead`),this.emit("agent.unregistered",e);return}this.log(`Failed to unregister agent ${e}: ${r}`)}}isGatewayCompatMode(){return this.supportsAgentRegistration===!1}resolveOpenClawWorkspaceDir(e){let n=ng.default.join(TU.default.homedir(),".openclaw");return e==="main"?ng.default.join(n,"workspace"):ng.default.join(n,`workspace-${e}`)}async handleServerRequest(e){e.method==="agent.run"?await this.handleAgentRun(e):e.method==="session.new"?await this.handleSessionNew(e):e.method==="agent.cancel"?this.handleAgentCancel(e):this.client.respond(e.id,void 0,!1,{code:"UNKNOWN_METHOD",message:`Unknown method: ${e.method}`})}handleAgentCancel(e){let n=e.params;this.log(`Received agent.cancel (agentId=${n?.agentId}, sessionKey=${n?.sessionKey})`),this.emit("agent.cancel",n),this.client.respond(e.id,{success:!0},!0)}async handleSessionNew(e){let n=e.params;this.log(`Received session.new request from ${n?.requestedBy??"unknown"}`),this.emit("session.new.request",{requestId:e.id,params:n??{}})}respondSessionNew(e,n){this.client.respond(e,n,n.success,n.success?void 0:{code:"SESSION_CREATE_ERROR",message:n.error??"Failed to create session"})}persistHeadlessGatewayOutbound(e,n,r,s,i){let o=e.workspace?.trim();if(!o)return;let a=r.sessionKey?.trim()||i,c=(0,jS.resolveGatewaySessionDirId)({gatewaySessionKey:a});if(!c)return;let l=(0,jS.getGatewayOutboundFilePath)(o,c),u=e.agentId?.trim()||n;(0,bU.upsertGatewayOutboundHandle)(l,u,r,s,{gatewayAgentId:n}).then(d=>{d&&this.log(`Gateway outbound routes: ${l}`)}).catch(d=>{this.log(`Failed to persist outbound handle: ${d instanceof Error?d.message:String(d)}`)})}async handleAgentRun(e){let n=e.params;if(!n?.message||typeof n.message!="string"){this.client.respond(e.id,void 0,!1,{code:"INVALID_PARAMS",message:"message is required"});return}if(n.message.length>tg.MAX_GATEWAY_MESSAGE_CHARS){this.client.respond(e.id,void 0,!1,{code:"MESSAGE_TOO_LARGE",message:`message exceeds ${tg.MAX_GATEWAY_MESSAGE_CHARS} characters`});return}let r=FS(n);if(r){this.client.respond(e.id,void 0,!1,{code:"INVALID_PARAMS",message:`${r} is not a valid string`});return}let s=n.agentId||this.getDefaultAgentId();if(!s){this.client.respond(e.id,void 0,!1,{code:"NO_AGENT",message:"No agent available"});return}let i=this.agents.get(s);if(!i){this.client.respond(e.id,void 0,!1,{code:"AGENT_NOT_FOUND",message:`Agent ${s} not found`});return}this.log(`Running agent ${s} for message: ${n.message.slice(0,50)}...`);let o=VS(n.sessionKey,n.sessionId),a=n.idempotencyKey||`${s}-${Date.now()}`;this.emit("agent.message",{agentId:s,message:n.message,channel:n.channel,sessionKey:n.sessionKey,sessionId:n.sessionId,routeKey:o});try{if(!!(i.useChatUI&&i.chatUIHandler)){this.log(`Routing gateway message to Chat UI for agent ${s} (routeKey=${o??"none"})`),await this.handleAgentRunViaChatUI(e,i,n,a,o);return}let l=i.engineId||"claude";if(!i.messageHandler)throw new Error("No message handler configured for agent");this.log(`Agent ${s} processing message via direct handler, engine=${l}`),this.persistHeadlessGatewayOutbound(i,s,n,a,o);let u=this.client,d="",f="",p=0,g=!1,_=150,h=o,y=()=>{d!==f&&(f=d,p=Date.now(),u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"delta",text:d}))},E={async thinking(){g||(y(),g=!0,u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"thinking"}))},async text(S){g=!1,d+=S,Date.now()-p>=_&&y()},async toolStart(S){y(),u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:S,toolState:"start"})},async toolEnd(S){u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:S,toolState:"end"})},async progress(S){u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:S})},async question(S){return u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:`Question: ${S.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(S){d+=`
585
- [Error: ${S}]`,u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"error",message:S})},async done(){}},w=await i.messageHandler(n.message,{engineId:l,sessionId:o,gatewaySessionKey:n.sessionKey,workspaceRoot:i.workspace,emitter:E,peerInfo:n.senderUsername||n.senderName||n.senderId||n.channel?{senderUsername:n.senderUsername,senderName:n.senderName,senderId:n.senderId,channel:n.channel}:void 0});if(!w.success&&w.error)throw new Error(w.error);this.log(`Agent ${s} completed: fullText.len=${d?.length||0}`),d||this.log(`WARNING: Agent ${s} produced empty response!`),y();let A={text:d,runId:n.idempotencyKey};this.client.respond(e.id,A,!0),this.log(`Agent ${s} completed successfully, response length=${d.length}`),this.emit("agent.response",{agentId:s,message:n.message,response:d})}catch(c){this.client.respond(e.id,void 0,!1,{code:"AGENT_ERROR",message:c instanceof Error?c.message:String(c)}),this.log(`Agent ${s} failed: ${c}`)}}async handleAgentRunViaChatUI(e,n,r,s,i){let o=n.id,a=this.client;this.log(`handleAgentRunViaChatUI: agentId=${o}, message="${r.message.slice(0,50)}...", runId=${s}`);let c="",l=!1,u={async thinking(){l||(l=!0,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"thinking"}))},async text(d){l=!1,c+=d,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"delta",text:c})},async toolStart(d){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"tool",toolName:d,toolState:"start"})},async toolEnd(d){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"tool",toolName:d,toolState:"end"})},async progress(d){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"progress",message:d})},async question(d){return a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"progress",message:`Question: ${d.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(d){c+=`
586
- [Error: ${d}]`,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"error",message:d})},async done(){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"done"})}};try{let d=r.senderUsername||r.senderName||r.senderId||r.channel?{senderUsername:r.senderUsername,senderName:r.senderName,senderId:r.senderId,channel:r.channel}:void 0,f=await n.chatUIHandler(r.message,i,d,u,{params:r,runId:s,agentId:o}),p=c||f;this.log(`Agent ${o} (Chat UI) completed: response.len=${p.length}`),p||this.log(`WARNING: Agent ${o} (Chat UI) produced empty response!`);let g={text:p,runId:r.idempotencyKey};this.client.respond(e.id,g,!0),this.emit("agent.response",{agentId:o,message:r.message,response:p})}catch(d){this.client.respond(e.id,void 0,!1,{code:"CHAT_UI_ERROR",message:d instanceof Error?d.message:String(d)}),this.log(`Agent ${o} (Chat UI) failed: ${d}`)}}getDefaultAgentId(){if(this.agents.size===1){let e=this.agents.keys().next();return e.done?void 0:e.value}}log(e){let n=`[GatewayBridge] ${e}`;this.options.outputChannel&&this.options.outputChannel.appendLine(n),this.emit("log",n)}async disconnect(){for(let e of this.agents.keys())await this.unregisterAgent(e);this.client.close(),this.log("Disconnected from Gateway")}get isConnected(){return this.client.isConnected}get connId(){return this.serverConnId}get registeredAgents(){return Array.from(this.agents.keys())}async reconnect(){this.log("Force reconnecting to Gateway..."),await this.client.reconnect()}async request(e,n){return this.client.request(e,n)}};rn.GatewayBridge=pu;function PU(t){return new pu(t)}});var aA=T(Rn=>{"use strict";var NU=Rn&&Rn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),RU=Rn&&Rn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ja=Rn&&Rn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&NU(n,e,r[s]);return RU(n,e),n}})();Object.defineProperty(Rn,"__esModule",{value:!0});Rn.resolvePackEngineModel=ag;Rn.engineUnavailableReason=rA;Rn.serveCommand=xU;Rn.resolveGatewaySessionKey=sA;Rn.runGatewayTurn=cg;Rn.runBridgeTurn=iA;var rg=Ja(require("crypto")),_n=Ja(require("fs")),qS=Ja(require("os")),CU=Ja(require("http")),En=Ja(require("path")),mu=require("node:crypto"),kU=Aw(),Wa=xi(),Kn=Ho(),gu=Ep(),$U=Ap(),Xi=jo(),DU=La(),YS=nu(),JS=$w(),qa=Bw(),XS=Yw(),is=Pp(),LU=si(),Wn=Ui(),Us=ji(),R=en(),MU=Cp(),sg=fS(),fe=ur(),Yo=As(),ig=gS(),hu=jo(),GU=So(),ht=Vi(),zS=Cr(),UU=Hp(),QS=vo(),zi=Ii(),ZS=gf(),os=NS(),di=GS(),HU=US(),og=eg(),jU=Qs(),eA=Li(),Ya="-".repeat(62);function ag(t,e){let n=(e.engine||t.spec.engine||(0,Us.getDefaultConfig)().engine).trim().toLowerCase(),r=["claude","codex"].includes(n)?void 0:(0,jU.tryResolveCustomEngineManifest)(e.workspace,n)?.model?.defaultModel,s=e.model||t.spec.model||r||(0,Us.getEnvDefaultModel)()||(0,Us.getDefaultConfig)().model;return{engine:n,model:(0,Wn.resolveModelAlias)(s)}}function rA(t,e){if(!(0,Us.hasCredentialForEngine)(t,e.apiConfig))return`no usable API key for engine "${t}" (${t==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"} or the LiteLLM proxy)`;if(!e.engineRunsInSandbox&&t==="claude"&&!e.claudeCodePath)return"Claude Code CLI not found on this host";if(!e.engineRunsInSandbox&&t==="codex"&&!e.codexPath)return"Codex CLI not found on this host"}async function xU(t){process.env.AGENTHIPPO_SERVE="1";let e=(0,Us.getApiConfig)();e.useLiteLLM&&!e.litellmApiKey&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} AGENTHIPPO_LITELLM_BASE_URL is set without AGENTHIPPO_LITELLM_API_KEY \u2014 gateway calls will authenticate as 'sk-dummy' (a strict gateway will 401). Provider keys are never sent to the gateway.`);let n,r=t.verbose?new Wn.ConsoleLogger("[Sync]"):new Wn.NoOpLogger;try{n=await(0,Us.loadAgentPack)(t.agent,t.workspace)}catch(m){console.error(`Error: ${m instanceof Error?m.message:m}`),process.exit(1)}let s=n.manifest.metadata.name,i=(0,HU.resolveCliGatewayAgentId)(s),o=ag(n.manifest,t),a=o.engine,c=o.model,l=n.manifest.spec.cheapModel?.trim(),u=l?(0,Wn.resolveModelAlias)(l):void 0,d=n.manifest.spec.effort?.trim()||void 0;if(!(0,Us.hasCredentialForEngine)(a,e)){console.error(`Error: No usable API key for engine "${a}". Set ${a==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}, or configure the LiteLLM proxy (AGENTHIPPO_LITELLM_API_KEY + AGENTHIPPO_LITELLM_BASE_URL).`);for(let b of(0,R.getLiteLLMQuickstartHintLines)())console.error(b);process.exit(1)}let f=t.verbose?new Wn.ConsoleLogger("[Server]"):new Wn.NoOpLogger,p=n.packPath,g=n.manifest.metadata.version??"0.0.0",_,h=await(0,Kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL}),y=(m,b="pack")=>{for(let x of m.warnings)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${x}`);m.status==="unavailable"&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${b} trust root is configured but unusable: ${m.reason}`)};y(h);let E=(0,Kn.createPackVerifier)(),w={ok:!1,kind:"no-pack",reason:"not verified"},A=(m,b)=>(w=E.refresh({packDir:m,pack:s,packVersion:b,keys:h.keys}),_=w.ok?w.claims.digest:void 0,f.info(w.ok?`[Pack] signature verified for ${s}`:`[Pack] unverified \u2014 ${w.reason}`),w),S=m=>{if(m.ok)return"";let b=h.status==="unavailable"&&m.kind==="no-trust-root"?"trust-root-unavailable":m.kind;return(0,Kn.describePackRefusal)({kind:b,detail:b==="trust-root-unavailable"?h.reason??m.reason:m.reason,pack:s,packVersion:g,packDir:p,trustRootHint:h.url?`Trust root: ${h.url} (${h.reason??"unavailable"})`:h.reason})};A(p,g);let C=!!t.allowUnsignedPack||(0,Kn.allowUnsignedPackFromEnv)();w.ok||(C||(console.error(`${R.COLORS.red}Error: ${S(w)}${R.COLORS.reset}`),process.exit(1)),console.warn(Ya),console.warn(`${R.COLORS.yellow}!! RUNNING AN UNVERIFIED PACK \u2014 signature checking is DISABLED on this instance.${R.COLORS.reset}`),console.warn(`${R.COLORS.yellow}!! ${w.reason}${R.COLORS.reset}`),console.warn(`${R.COLORS.yellow}!! Whatever is in ${p} will be executed, verified by nobody.${R.COLORS.reset}`),console.warn(`${R.COLORS.yellow}!! This is a LOCAL DEVELOPMENT setting (AGENTHIPPO_ALLOW_UNSIGNED_PACK). Do not ship it.${R.COLORS.reset}`),console.warn(Ya));let v=(0,R.findBundledBasePromptsDir)();await(0,Wn.syncPackToWorkspace)(t.workspace,n.packPath,s,a,r,v),console.log(`OK: Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),console.log(`agenthippo pack=${n.manifest.metadata.name}@${n.manifest.metadata.version} engine=${a}`);let{dir:I,ephemeral:P}=(0,fe.resolveStateDir)(t.stateDir),L=(0,fe.resolveBindHost)(t.host);for(let m of(0,fe.identityHeaderAdvice)(process.env,L))console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`);let N=(0,fe.tenantIsolationAdvice)({sandbox:t.sandbox,sharedWorkspace:!!t.sharedWorkspace,workspace:t.workspace,stateDir:I});if(N.level==="refuse"){for(let m of N.lines)console.error(`${R.COLORS.red}Error:${R.COLORS.reset} ${m}`);console.error(`Refusing to start because ${fe.REQUIRE_TENANT_ISOLATION_ENV} is set. Unset it to downgrade this to a warning.`),process.exit(1)}for(let m of N.lines)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`);let O=(0,fe.resolveAnalyticsSessionsDir)(I,P),G=new QS.SessionEventWriter(O),H=m=>b=>G.append(m,(0,zi.generateRequestId)(),"warrant_denied",{reason:b}),X=(0,ht.resolveDataPlaneConfig)(n.manifest.spec,n.packPath),J=(0,ht.resolveEdgeDataPlane)(),W=J?new ht.EdgeDataPlane(J):null,ee=W?null:(0,ht.resolveRemoteDataPlane)(),le=ee?new ht.RemoteDataPlane(ee):null,pe=X&&!le&&!W||t.gatewayBridge?new ht.TurnRegistry:null,We=(m,b,x)=>G.append(m,(0,zi.generateRequestId)(),b,{...x,agent:{pack:s,version:g,digest:_??null}}),Ue=null,vt=null;if(W)process.env[ht.DATA_MCP_URL_ENV]=W.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,delete process.env.AGENTHIPPO_DATA_PLANE_CONTROL_URL,console.log(`OK: Data plane EDGE-registered \u2014 gateway ${W.url}; turn nonces are minted at the edge, serve holds no registration credential`);else if(le)process.env[ht.DATA_MCP_URL_ENV]=le.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,console.log(`OK: Data plane SIDECAR \u2014 gateway ${le.url}; base credentials stay in the connector container, not here`);else if(X)try{Ue=await ht.DataPlane.start(X,{logger:t.verbose?new Wn.ConsoleLogger("[DataPlane]"):new Wn.NoOpLogger,audit:We,registry:pe??void 0}),process.env[ht.DATA_MCP_URL_ENV]=Ue.url,console.log(`OK: Data gateway (provider=${Ue.broker.provider.name}) on loopback \u2014 connector: ${X.connectorPath}`);let m=Ue.broker.provider;m instanceof ht.StoredGrantProvider&&(vt=(0,ht.createConnectHandler)({provider:m,browserUser:b=>(0,fe.resolveUserId)(b.headers,void 0),audit:We}),console.log(m.connectBaseUrl?`OK: Personal connections \u2014 consent pages at ${m.connectBaseUrl}/connect/ (route it through the identity edge)`:`${R.COLORS.yellow}Warning:${R.COLORS.reset} provider=stored-grant without AGENTHIPPO_CONNECT_BASE_URL \u2014 users cannot connect accounts`),m.cfg.ticketOnly&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} AGENTHIPPO_CONNECT_TICKET_ONLY=1 \u2014 connect links are accepted without a verified browser identity. Single-user development only.`))}catch(m){console.error(`${R.COLORS.red}Error: failed to start the data-plane gateway:${R.COLORS.reset} ${m instanceof Error?m.message:m}`),process.exit(1)}let xe=(0,zS.readOpenClawGatewayToken)();delete process.env.OPENCLAW_GATEWAY_TOKEN;let dt=null,yn=async m=>{if(W){let K=m.edgeNonce?.trim();if(!K)return console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} edge data plane active but no ${ht.TURN_NONCE_HEADER} header on this turn \u2014 data tools will fail closed (check the edge route's forward_auth)`),null;let re=W.adoptTurn(K),Be={...re.env};return dt&&(Be[ht.EGRESS_URL_ENV]=dt.url),{nonce:re.nonce,env:Be,release:re.release}}if(le){let K=await le.registerTurn({...m,agent:{pack:s,version:g,digest:_}}),re={...K.env};return dt&&(re[ht.EGRESS_URL_ENV]=dt.url),{nonce:K.nonce,env:re,release:K.release}}if(!pe)return null;let{nonce:b,release:x}=pe.register(m),ie={[ht.TURN_NONCE_ENV]:b};return Ue&&(ie[ht.DATA_MCP_URL_ENV]=Ue.url),dt&&(ie[ht.EGRESS_URL_ENV]=dt.url),{nonce:b,env:ie,release:x}},zn=m=>{if(!W)return;let b=m[ht.TURN_NONCE_HEADER];return Array.isArray(b)?b[0]:b},it=new Map,sn=600*1e3,_i=1e4,Vr=new Map,se=30*1e3,Ei=300*1e3,D=(m,b)=>{if(Vr.size>=_i&&!Vr.has(m)){let x=Vr.keys().next();x.done||Vr.delete(x.value)}Vr.set(m,Date.now()+b)},ae=async(m,b)=>{let x=b[ht.ASSERTION_HEADER],ie=(Array.isArray(x)?x[0]:x)?.trim();if(!ie||!e.baseUrl)return;let K=it.get(m);if(K!==void 0&&K>Date.now())return;let re=Vr.get(m);if(re!==void 0&&re>Date.now()||(await ye.get())?.billUsers!==!0)return;let Be=e.baseUrl.replace(/\/+$/,""),cn=Be.endsWith("/v1")?`${Be}/credits`:`${Be}/v1/credits`;try{let He=await fetch(cn,{headers:{Authorization:`Bearer ${ie}`},signal:AbortSignal.timeout(5e3)});if(He.ok){let Ss=await He.json().catch(()=>{});if(Ss!==void 0&&(Ss.enabled===!1||typeof Ss.email=="string"&&Ss.email.trim().toLowerCase()===m.trim().toLowerCase())){if(it.size>=_i&&!it.has(m)){let Yr=it.keys().next();Yr.done||it.delete(Yr.value)}it.set(m,Date.now()+sn)}else D(m,Ei),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} billUsers is on but the assertion's account (${Ss?.email??"unknown"}) does not match this turn's user \u2014 the turn may be refused as identity-not-billable`)}else D(m,He.status>=500?se:Ei),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} billUsers is on but the gateway did not open a credit account for this turn's user (GET ${cn} \u2192 ${He.status}) \u2014 the turn may be refused as identity-not-billable`)}catch(He){D(m,se),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} billUsers is on but the credit-account check failed (${He instanceof Error?He.message:String(He)}) \u2014 the turn may be refused as identity-not-billable`)}},oe=new fe.TurnLimiter(t.maxTurnsPerSession??0),Ne=Number(process.env.AGENTHIPPO_SERVE_RATE_LIMIT??120),jt=new fe.RateLimiter(Number.isFinite(Ne)?Ne:120),Q=(0,fe.createTurnGateFromEnv)(),_t=(0,fe.createRejectionWarner)(),on;if(t.wwwDir?.trim()){let m=En.join(En.resolve(t.wwwDir.trim()),"index.html");try{on=_n.readFileSync(m,"utf8")}catch{console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} --www-dir set but unreadable: ${m}`)}}P&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} Session state is in a tmpdir (ephemeral). Pass --state-dir or set AGENTHIPPO_HOME to persist sessions across restarts.`);let ve=(0,di.resolveS3StateConfig)(),xt=(0,di.resolveRestoreBootMode)();ve&&(await(0,di.isAwsCliAvailable)()||(console.error(`${R.COLORS.red}Error: AGENTHIPPO_STATE_S3_URI is set but the \`aws\` CLI was not found.${R.COLORS.reset}`),console.error(" State sync requires the AWS CLI (S3-compatible via --endpoint-url). Install it or unset AGENTHIPPO_STATE_S3_URI."),process.exit(1)),xt==="all"?(console.log(`State sync: boot-restore from ${ve.uri} \u2026`),await(0,di.restoreState)(ve,I,m=>console.log(` ${m}`))):console.log(`State sync: restore-on-miss from ${ve.uri} (boot restore disabled)`));let Ot=ve?(0,di.makeStatePusher)(ve,I,t.verbose?m=>console.error(m):void 0):null,kn=t.verbose?m=>console.error(m):void 0,an=async m=>{ve&&await(0,di.ensureSessionLocal)(ve,I,m,kn)},ws=(0,R.findClaudeCodePath)(),ao=(0,R.findCodexPath)(),co=t.sandbox==="container";if(!co&&a==="claude"&&!ws){console.error(`${R.COLORS.red}Error: Claude Code CLI not found.${R.COLORS.reset}`);let m=(0,Wa.getUnsupportedClaudePlatformHint)();m&&console.error(` ${m}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),process.exit(1)}!co&&a==="codex"&&!ao&&(console.error(`${R.COLORS.red}Error: Codex CLI not found.${R.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),process.exit(1));let Ws=m=>rA(m,{apiConfig:e,engineRunsInSandbox:co,claudeCodePath:ws,codexPath:ao}),ca=new Wn.AutoApprovePermissionHandler,yi={fileAccess:(0,Us.getFileAccess)(n)},wi,la=!1,lo=m=>{let b=(0,Xi.policyVersion)(m);la&&b===wi||(la=!0,wi=b,G.append("serve",(0,zi.generateRequestId)(),"policy_applied",{instance_id:j,policy_version:b??null,pack_digest:_??null,engine_version:(0,Wa.installedEngineVersion)(a)??null,tier:t.sandbox==="container"?2:t.sandbox?0:null,enabled:m?.enabled??null,pinned_version:m?.version??null,caps:m?.caps??null,deny_count:m?.deny?.length??0}))},uo,Tr=En.join(I,"packs"),Qu=async(m,b)=>(await(0,$U.downloadFromStore)({type:"pack",slug:m,version:b})).map(ie=>({path:ie.path,content:ie.content})),fo=async m=>{if(!t.pullPacks||!m||m===g)return;let b=async re=>{try{return ag((await(0,Us.loadAgentPack)(re,t.workspace)).manifest,t)}catch{return}},x=En.join(Tr,m),ie=_n.existsSync(En.join(x,"agent.yaml"))?await b(x):void 0;if(ie){let re=Ws(ie.engine);if(re){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} cannot converge to ${s}@${m}: it runs engine "${ie.engine}" \u2014 ${re}. Still serving @${g} on ${a}.`);return}}let K=await(0,gu.reconcilePinnedPack)({pack:s,currentVersion:g,pinnedVersion:m,packsRoot:Tr,download:Qu,publicKeysByKid:h.keys,logger:{info:re=>f.info(re),warn:re=>f.info(re)}});if(K.ok){if(!ie){ie=await b(K.packDir);let re=ie?Ws(ie.engine):"its manifest is unreadable";if(re){(0,gu.promoteCurrent)(Tr,En.join(Tr,g)),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} cannot converge to ${s}@${m}: ${ie?`it runs engine "${ie.engine}" \u2014 `:""}${re}. Still serving @${g} on ${a}.`);return}}g=K.version,p=K.packDir,A(p,g),(ie.engine!==a||ie.model!==c)&&(f.info(`[Pack] ${s}@${g}: engine ${a} \u2192 ${ie.engine}, model ${c} \u2192 ${ie.model} (new sandboxes; running ones drain)`),a=ie.engine,c=ie.model);try{await(0,Wn.syncPackToWorkspace)(t.workspace,p,s,a,r,v)}catch(re){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} workspace sync for ${s}@${g} failed: ${re instanceof Error?re.message:String(re)}`)}f.info(`[Pack] now serving ${s}@${g} (engine ${a}, model ${c}) from ${K.packDir}`);return}console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} cannot converge to ${s}@${m}: ${K.reason}. Still serving @${g}.`)},qs=(0,is.loadWarrantKeypair)(f),po=process.env[ig.TURN_COST_ENV]?.trim()==="1",ua=m=>po&&Z!==void 0&&String(m.headers[ig.TURN_COST_HEADER]??"").trim()==="1",da=m=>(0,ig.fetchTurnCost)({gatewayBaseUrl:e.baseUrl??"",key:qs,jtis:m}),Z,j=(()=>{try{let m=En.join((0,fe.resolveStateDir)(t.stateDir).dir,"instance-id");if(_n.existsSync(m))return _n.readFileSync(m,"utf-8").trim();let b=`${qS.hostname()}-${rg.randomBytes(4).toString("hex")}`;return _n.mkdirSync(En.dirname(m),{recursive:!0}),_n.writeFileSync(m,b),b}catch{return`${qS.hostname()}-${rg.randomBytes(4).toString("hex")}`}})(),Re={get:()=>n?.manifest.metadata.version},Oe=(0,Xi.resolveLeasePollSeconds)(t.leasePollSeconds),Le=await(0,Kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});Le.explicitlyConfigured&&y(Le,"lease");let Te=(0,Kn.checkTrustRootSeparation)(Le,h);for(let m of Te.warnings)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} [TrustRoot] ${m}`);Te.fatal&&(console.error(`Error: [TrustRoot] ${Te.fatal}`),process.exit(1));let ft=!1,Xt=()=>{let m=(0,Kn.selectLeaseSigningKeys)(Le,h);return m.packFallback&&!ft&&(ft=!0,console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} verifying signed leases against the PACK trust root \u2014 no lease trust root is configured on this instance. The control plane publishes lease keys under purpose \`lease-signing\` and refuses to register one kid under two purposes, so this stops working the moment the plane rotates to a dedicated lease key \u2014 and requireSignedLease is sticky with no plane-side undo, so that failure cannot be fixed from the console. Set ${Kn.LEASE_JWKS_URL_ENV}=https://<plane>/.well-known/jwks.json?purpose=lease-signing (or ${Kn.LEASE_SIGNING_KEYS_ENV} with inline {"<kid>":"<public PEM>"} for an air-gapped install).`+(Le.reason?` The derived lease trust root is unusable: ${Le.reason}`:""))),m.keys},Ct=(()=>{if(t.staticLeaseFile)try{let m=(0,DU.parseLease)(JSON.parse(_n.readFileSync(t.staticLeaseFile,"utf-8")));if(!m.ok)throw new Error(m.reason);for(let b of m.warnings)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} [Lease] --static-lease: ${b}`);return m.lease}catch(m){console.error(`Error: --static-lease ${t.staticLeaseFile} is not a usable lease: ${m instanceof Error?m.message:m}`),process.exit(1)}})(),tt=En.join(I,"lease.json"),Ce={load:()=>{if(!_n.existsSync(tt))return;let m=JSON.parse(_n.readFileSync(tt,"utf-8"));if(m&&typeof m=="object"&&typeof m.body=="string"&&typeof m.lastGoodAt=="number")return m},save:m=>{_n.mkdirSync(En.dirname(tt),{recursive:!0});let b=`${tt}.tmp`;_n.writeFileSync(b,JSON.stringify(m)),_n.renameSync(b,tt)}},ye=(0,Xi.createLeaseSource)({url:process.env.AGENTHIPPO_LEASE_URL,staticLease:Ct,persistence:Ce,identity:()=>({instance:j,pack:s,version:Re.get(),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,sandboxes:Z?.sandboxes().length,engine:a,engineversion:(0,Wa.installedEngineVersion)(a),...t.model?{model:t.model}:{},...process.env.AGENTHIPPO_ADVERTISED_URL?.trim()?{url:process.env.AGENTHIPPO_ADVERTISED_URL.trim()}:{},...process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()?{"enroll-token":process.env.AGENTHIPPO_ENROLL_TOKEN.trim()}:{}}),cacheSeconds:(0,Xi.leaseCacheSecondsFor)(Oe),signingKeys:()=>Xt(),requireSignedLease:t.requireSignedLease,instanceId:j,...t.leaseMaxStalenessSeconds!==void 0?{maxStalenessSeconds:t.leaseMaxStalenessSeconds}:{},logger:{info:m=>f.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}),Qn=async()=>{if(h.status!=="configured"){let m=await(0,Kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});m.status==="configured"&&(h=m,y(m),f.info(`[Pack] signing keys now available (${Object.keys(m.keys).length}); re-verifying`),A(p,g))}if(Le.status!=="configured"){let m=await(0,Kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});m.status==="configured"&&(Le=m,m.explicitlyConfigured&&y(m,"lease"),f.info(`[Lease] lease-signing keys now available (${Object.keys(m.keys).length})`))}};ye.get().then(lo).catch(()=>{});{let m=Oe*1e3;setInterval(()=>{ye.get().then(lo).catch(()=>{}),Qn().catch(()=>{})},m).unref?.()}if(t.pullPacks){_n.mkdirSync(Tr,{recursive:!0});let m=En.join(Tr,g);_n.existsSync(m)||_n.cpSync(n.packPath,m,{recursive:!0}),(0,gu.promoteCurrent)(Tr,m),p=En.join(Tr,gu.CURRENT_LINK),await fo((await ye.get())?.version),A(p,g)}if(Re.get=()=>g,uo=(0,MU.createPackRunner)({storagePath:I,analyticsSessionsDir:O,packId:s,packVersion:g,provenance:()=>({policyVersion:wi,packDigest:_,engineVersion:(0,Wa.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:j}),workspaceRoot:t.workspace,credentials:{apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey},logger:f,permissionHandler:ca,claudeCheapModel:u,effort:d,omitGatewayToken:!0}),t.pullPacks){let m=Oe*1e3;setInterval(()=>{ye.get().then(x=>fo(x?.version)).catch(()=>{})},m).unref?.()}let go=!!t.sharedWorkspace,br=t.sandboxScope==="user"?"user":"session",we=t.sandbox==="container"?{readonly:[`${p}:${qa.SANDBOX_PACK_DIR}`],writable:[`${t.workspace}:${qa.SANDBOX_WORKSPACE_DIR}`]}:void 0;we&&go&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} --shared-workspace: every session's sandbox mounts ${t.workspace} read-write, so sessions can read and overwrite each other's files. Only safe when all sessions belong to one trust domain.`);let wn;we&&t.sandboxImage&&(await(0,is.alignSandboxWorkspaceOwnership)({exec:is.dockerExec,image:t.sandboxImage,writable:we.writable,logger:{info:m=>f.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}),wn=await(0,is.resolveSandboxImageUser)(is.dockerExec,t.sandboxImage));let Zn=m=>(0,is.ensureSandboxStateDir)(En.join(I,"sandbox-state",(0,di.safeSessionId)(m)),wn),Kr=async m=>{if(!we)return{readonly:[],writable:[]};if(go)return we;let b=(0,is.ensureSandboxStateDir)(En.join(I,"sandbox-workspace",(0,di.safeSessionId)(m)),wn);return{readonly:we.readonly,writable:[`${b}:${qa.SANDBOX_WORKSPACE_DIR}`]}},Ys=(m,b,x)=>{if((0,Kn.resolveRequireSignedPack)({lease:m?.requireSignedPack,localRequire:t.requireSignedPack,localAllowUnsigned:C})){let K=E.verify({packDir:p,pack:s,packVersion:g,keys:h.keys});if(K!==w&&(w=K,_=K.ok?K.claims.digest:void 0),!K.ok)throw new Xi.LeaseDeniedError(S(K))}(0,Xi.assertAdmitted)(m,{pack:s,version:g,image:t.sandboxImage,sessionKey:b,userHash:fe.userNamespaceHash,userId:x})},ho=t.sandbox==="container"?new qa.ContainerSandboxDriver({exec:is.dockerExec,socketOwner:wn,owner:rg.createHash("sha256").update(`${s}\0${I}`).digest("hex").slice(0,16),heartbeatDir:En.join(I,"sandbox-instances"),logger:{info:m=>f.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}):void 0;if(ho){let m=!1,b=async()=>{if(!m){m=!0;try{let x=await ho.sweepOrphans();x.length&&console.log(`OK: Removed ${x.length} sandbox(es) left by a previous serve`)}catch(x){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} sandbox orphan sweep failed: ${x instanceof Error?x.message:String(x)}`)}finally{m=!1}}};await b(),setInterval(()=>{try{ho.beat()}catch{}b()},qa.ORPHAN_SWEEP_INTERVAL_MS).unref()}let Wr=t.sandbox?(0,kU.createSandboxRunner)({driver:ho??new XS.ProcessSandboxDriver({command:process.execPath,args:[...(0,is.sandboxScriptArg)(),"sandbox","--agent",p,"--stdio","--state-dir",I,"--workspace",t.workspace],namespaceIsolation:(0,XS.namespaceIsolationFromEnv)(),logger:{info:m=>f.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}),image:t.sandboxImage??"",tier:t.sandbox==="container"?2:0,...we?{fs:we,fsFor:Kr,stateDirFor:Zn}:{},routes:[...process.env.AGENTHIPPO_DATA_MCP_URL?[{kind:"data",target:process.env.AGENTHIPPO_DATA_MCP_URL}]:[],...e.baseUrl?[{kind:"inference",target:e.baseUrl}]:[]],limits:{ttlSeconds:t.sandboxTtlSeconds??1800},env:Object.fromEntries(["AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_SERVE",eA.ENGINE_IDLE_TTL_ENV].filter(m=>process.env[m]).map(m=>[m,process.env[m]])),provenanceEnv:()=>(0,zS.buildProvenanceEnv)({policyVersion:wi,packDigest:_,engineVersion:(0,Wa.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:j}),admit:async({sessionKey:m})=>{let b=await ye.get();Ys(b,m)},inferenceBaseUrl:e.baseUrl,mintModelToken:async(m,b)=>{let x=(0,Yo.currentCredential)()?.userId?.trim()||`anon:${b}`,ie=await ye.get(),K=ie?.budget,re=K===void 0?void 0:K.scope==="user"?`user:${x}`:`session:${b}`,Be=(0,mu.randomUUID)();return(0,Yo.currentCredential)()?.warrantJtis?.push(Be),(0,is.mintSandboxInferenceWarrant)(qs,{jti:Be,user:x,pack:s,packVersion:g,sandboxId:m,tier:t.sandbox==="container"?2:0,ttlSeconds:(0,LU.warrantTtlFromEnv)(),...ie?.billUsers===!0?{billing:"user"}:{},...re?{budgetKey:re}:{},...K?.windowSeconds?{budgetWindowSeconds:K.windowSeconds}:{}})},logger:f,runtime:{logger:f,editTracker:void 0,configProvider:void 0,permissionHandler:ca}}):void 0;Z=Wr??void 0;let Zu=m=>typeof m=="number"&&Number.isFinite(m)&&m>0?m:void 0,uc={...(0,YS.capsFromEnv)(),...Zu(t.maxTurnsPerSession)!==void 0?{maxTurnsPerSession:t.maxTurnsPerSession}:{},...Zu(t.maxSessionSeconds)!==void 0?{maxSessionSeconds:t.maxSessionSeconds}:{},...Zu(t.maxConcurrentSandboxes)!==void 0?{maxConcurrentSandboxes:t.maxConcurrentSandboxes}:{},...t.capOnBreach?{onBreach:t.capOnBreach}:{}},Hh=uc.maxTurnsPerSession!==void 0||uc.maxSessionSeconds!==void 0||uc.maxConcurrentSandboxes!==void 0,Ob={sandboxes:()=>[],destroySession:async()=>{},revokeRoute:async()=>{},supportsInFlightTermination:!1},qr=!!(Wr||process.env.AGENTHIPPO_LEASE_URL||Hh)?(0,JS.createGovernor)({caps:(0,YS.mergeCaps)((await ye.get())?.caps,uc),sandboxes:Wr??Ob,getLease:()=>ye.get(),pollSeconds:Oe,pack:s,userHash:fe.userNamespaceHash,...Wr?{}:{admitPack:(m,b)=>{try{return Ys(b,m),{allowed:!0}}catch(x){return{allowed:!1,reason:x instanceof Error?x.message:String(x)}}}},logger:f,audit:(m,b)=>We(String(b.sessionKey??"instance"),m,b)}):void 0;Hh&&!Wr&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} caps are configured but --sandbox is not set. Turn and duration caps still refuse the turn; the concurrency cap and route revocation need sandboxes, so those are IGNORED.`),Wr||setInterval(()=>{try{uo.runMaintenance?.()}catch(b){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} engine maintenance failed: ${b instanceof Error?b.message:String(b)}`)}},(0,eA.engineMaintenanceIntervalMs)()).unref();let jh=Wr??uo,fa=qr?(0,JS.withGovernor)(jh,qr):jh;if(qr){qr.start();let m=qr.policy(),b=(0,Xi.effectiveKillLatencySeconds)(Oe);f.info(`[Serve] control plane: caps turns=${m.maxTurnsPerSession??"\u221E"} session=${m.maxSessionSeconds??"\u221E"}s sandboxes=${m.maxConcurrentSandboxes??"\u221E"} onBreach=${m.onBreach??"revoke-inference"}; lease poll ${Oe}s (worst-case kill latency ${b}s; an admin refresh is immediate)`),Wr||f.info("[Serve] no sandbox driver: a deny rule with mode=kill takes effect as DRAIN \u2014 the in-flight turn finishes and only the next one is refused.");let x=ye.status();process.env.AGENTHIPPO_LEASE_URL&&!x.requireSignedLease&&f.info("[Serve] lease signature is NOT required \u2014 set --require-signed-lease (or lease.requireSignedLease) once the control plane signs leases.")}let Js=(0,fe.resolveServiceIdentity)();Js.error&&(console.error(`${R.COLORS.red}Error:${R.COLORS.reset} ${Js.error}`),process.exit(1)),Js.warning&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${Js.warning}`);let ed=!!process.env.AGENTHIPPO_LEASE_URL,Ib=async()=>{if(!Js.identity)return;let m=(0,hu.resolveAllowServiceTurns)({lease:(await ye.get())?.allowServiceTurns,managed:ed});if(!m.allowed){We("service-turn","service_turn_denied",{identity:(0,GU.hashIdentity)(Js.identity),gate:m.gate,detail:(0,hu.describeServiceTurnGate)(m.gate)});return}return Js.identity};if(Js.identity){let m=(0,hu.resolveAllowServiceTurns)({lease:void 0,managed:ed});f.info(`[Serve] unattended runs: identity configured (${fe.SERVICE_USER_ENV}); `+(ed?"the control plane decides per turn via lease.allowServiceTurns \u2014 absent means deny":(0,hu.describeServiceTurnGate)(m.gate)))}Wr&&(f.info(`[Serve] sandbox mode: ${t.sandbox} (tier ${t.sandbox==="container"?2:0}) \u2014 engines run in per-session sandboxes`),e.baseUrl||console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} --sandbox without an inference proxy: a sandbox holds no provider key, so model calls will fail 401. Set AGENTHIPPO_LITELLM_BASE_URL.`));let dc=null,fc=!1,pa,td=CU.createServer(async(m,b)=>{let x=(0,fe.corsHeaders)();for(let[ie,K]of Object.entries(x))b.setHeader(ie,K);if(m.method==="OPTIONS"){b.writeHead(204),b.end();return}try{if(m.method==="GET"&&m.url==="/health"){let K={status:"ok"};K.evidence_ship_enabled=!!pa;let re=pa?.lastOkAt();re!==void 0&&(K.evidence_ship_last_ok_at=new Date(re).toISOString());let Be=(0,sg.getEvidenceShipStatus)();K.evidence_ship_disabled_reason=Be.disabledReason??null,K.evidence_ship_consecutive_failures=Be.consecutiveFailures,K.evidence_records_staged=Be.recordsStaged,K.evidence_records_shipped=Be.recordsShipped,K.evidence_records_skipped_too_old=Be.recordsSkippedTooOld,K.evidence_files_skipped_too_old=Be.filesSkippedTooOld,K.evidence_content_capture=Be.contentCapture,Be.lastHeartbeatAt!==void 0&&(K.evidence_ship_last_heartbeat_at=new Date(Be.lastHeartbeatAt).toISOString());let cn=(0,QS.getSessionEventWriterStats)();K.evidence_writes_ok=cn.written,K.evidence_writes_failed=cn.failed,cn.lastError&&(K.evidence_write_last_error={at:new Date(cn.lastError.at).toISOString(),event_type:cn.lastError.eventType,message:cn.lastError.message});let He=ye.status();K.lease_configured=!!process.env.AGENTHIPPO_LEASE_URL,K.lease_signed=He.signed,K.lease_signature_required=He.requireSignedLease,K.lease_staleness_seconds=He.stalenessSeconds??null,K.lease_fail_closed=He.failClosed,K.pack_signature_ok=w.ok,K.pack_signature_required=(0,Kn.resolveRequireSignedPack)({localRequire:t.requireSignedPack,localAllowUnsigned:C}),K.pack_trust_root=h.status,K.lease_trust_root=Le.status,K.lease_trust_root_source=Le.explicitlyConfigured?"lease":"pack-fallback",K.kill_in_flight_supported=!!Wr,b.writeHead(200,{"Content-Type":"application/json"}),b.end(JSON.stringify(K));return}if(m.method==="GET"&&m.url==="/ready"){b.writeHead(fc?200:503,{"Content-Type":"application/json"}),b.end(JSON.stringify({ready:fc,inflight:Q.inflight,queued:Q.queued,max:Q.max,calls:mo.active,calls_max:mo.max,voice_inflight:xh.inflight}));return}let ie=m.url?.split("?")[0]??"";if(vt&&ie.startsWith("/connect/")&&await vt(m,b))return;if(m.method==="GET"&&on&&(ie==="/"||ie==="/index.html")){b.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),b.end(on);return}if(m.method==="POST"&&ie==="/v1/chat"){let K=await tA(m),re=(0,fe.resolveUserId)(m.headers,K),Be=(0,fe.resolveDataToken)(m.headers),cn=(0,fe.resolveUserId)(m.headers,void 0)??(0,fe.clientIp)(m);if(!jt.tryConsume(cn)){b.writeHead(429,{"Content-Type":"application/json","Retry-After":String(jt.retryAfterSeconds(cn))}),b.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:Ss,rejected:_o}=(0,fe.resolveServeSessionKey)(K.session_id,re,br);if(_o){G.append("unverified",(0,zi.generateRequestId)(),"warrant_denied",{reason:_o}),b.writeHead(403,{"Content-Type":"application/json"}),b.end(JSON.stringify({error:"verified user identity required"}));return}let Yr=qr?.atCapacity(He);if(Yr){_t(`Sandbox cap: rejecting /v1/chat (${Yr})`),(0,fe.writeAtCapacity)(b,Yr);return}let ga=await Q.acquire();if(!ga){_t(`TurnGate: rejecting /v1/chat (inflight=${Q.inflight} queued=${Q.queued} max=${Q.max})`),(0,fe.writeAtCapacity)(b);return}let Si=null,ha=Ai=>{b.writeHead(200,{"Content-Type":"application/json"}),b.end(JSON.stringify(Ai)),Ot?.schedule(He)},Eo;try{if(!oe.tryConsume(He)){b.writeHead(429,{"Content-Type":"application/json"}),b.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await an(He),re?.trim()&&(Si=await yn({userId:re.trim(),sessionKey:He,inboundToken:Be,edgeNonce:zn(m.headers)}),await ae(re.trim(),m.headers));let Ai=ua(m),ma={userId:re,dataToken:Be,...Ai?{warrantJtis:[]}:{}},pc=await(0,Yo.runWithCredential)(ma,()=>nA(fa,K,He,Ss,a,c,t.workspace,yi,re,Si?.env),{onDenied:H(He)});if(pc.atCapacity){(0,fe.writeAtCapacity)(b,pc.error);return}if(!Ai){ha(pc);return}Eo={result:pc,jtis:ma.warrantJtis??[]}}finally{await Si?.release(),ga()}ha({...Eo.result,cost:await da(Eo.jtis)});return}if(m.method==="POST"&&ie==="/v1/chat/stream"){let K=await tA(m),re=(0,fe.resolveUserId)(m.headers,K),Be=(0,fe.resolveDataToken)(m.headers),cn=(0,fe.resolveUserId)(m.headers,void 0)??(0,fe.clientIp)(m);if(!jt.tryConsume(cn)){b.writeHead(429,{"Content-Type":"application/json","Retry-After":String(jt.retryAfterSeconds(cn))}),b.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:Ss,rejected:_o}=(0,fe.resolveServeSessionKey)(K.session_id,re,br);if(_o){G.append("unverified",(0,zi.generateRequestId)(),"warrant_denied",{reason:_o}),b.writeHead(403,{"Content-Type":"application/json"}),b.end(JSON.stringify({error:"verified user identity required"}));return}let Yr=qr?.atCapacity(He);if(Yr){_t(`Sandbox cap: rejecting /v1/chat/stream (${Yr})`),(0,fe.writeAtCapacity)(b,Yr);return}let ga=await Q.acquire();if(!ga){_t(`TurnGate: rejecting /v1/chat/stream (inflight=${Q.inflight} queued=${Q.queued} max=${Q.max})`),(0,fe.writeAtCapacity)(b);return}let Si=null,ha=!1,Eo=async()=>{ha||(ha=!0,await Si?.release(),ga())};try{if(!oe.tryConsume(He)){b.writeHead(429,{"Content-Type":"application/json"}),b.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await an(He),re?.trim()&&(Si=await yn({userId:re.trim(),sessionKey:He,inboundToken:Be,edgeNonce:zn(m.headers)}),await ae(re.trim(),m.headers));let Ai=ua(m),ma={userId:re,dataToken:Be,...Ai?{warrantJtis:[]}:{}};await(0,Yo.runWithCredential)(ma,async()=>{b.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),await VU(fa,K,He,Ss,a,c,t.workspace,yi,b,re,Si?.env,Ai?()=>da(ma.warrantJtis??[]):void 0,Eo)},{onDenied:H(He)}),Ot?.schedule(He)}finally{await Eo()}return}b.writeHead(404,{"Content-Type":"application/json"}),b.end(JSON.stringify({error:"Not found"}))}catch(ie){if(ie?.tooLarge===!0){b.headersSent||b.writeHead(413,{"Content-Type":"application/json",Connection:"close"}),b.end(JSON.stringify({error:"Payload too large"}));return}console.error("Request error:",ie),b.headersSent||b.writeHead(500,{"Content-Type":"application/json"}),b.end(JSON.stringify({error:ie instanceof Error?ie.message:"Internal error"}))}}),xh=(0,os.createVoiceTurnGate)(),Bh=process.env[os.VOICE_GEMINI_API_KEY_ENV]?.trim()||void 0;delete process.env[os.VOICE_GEMINI_API_KEY_ENV];let Pb=(m,b)=>cg({rateLimiter:jt,turnLimiter:oe,turnGate:xh,warnGateReject:_t,rlKey:m.userId??`voice:${m.sessionKey}`,sessionKey:m.sessionKey,emitter:void 0,atCapacity:()=>qr?.atCapacity(m.sessionKey),run:async()=>{await an(m.sessionKey);let x=m.userId?.trim()?await yn({userId:m.userId.trim(),sessionKey:m.sessionKey,inboundToken:m.dataToken,edgeNonce:m.edgeNonce}):null;try{return await(0,Yo.runWithCredential)({userId:m.userId,dataToken:m.dataToken},()=>nA(fa,{message:b},m.sessionKey,m.sandboxKey,a,c,t.workspace,yi,m.userId,x?.env),{onDenied:H(m.sessionKey)})}finally{await x?.release(),Ot?.schedule(m.sessionKey)}}}),mo=new os.VoiceRoute({maxCalls:(0,os.maxCallsFromEnv)(),streamSecret:process.env[os.VOICE_STREAM_SECRET_ENV]?.trim()||void 0,gatewayBaseUrl:e.useLiteLLM?e.baseUrl??"":"",gatewayApiKey:e.litellmApiKey??"",geminiApiKey:Bh,loadSpec:()=>(0,ZS.loadVoiceSpec)(p),resolveCall:async(m,b)=>{let x=b.user??(0,fe.resolveUserId)(m.headers,void 0),ie=x??(0,fe.clientIp)(m);if(!jt.tryConsume(ie))throw new os.VoiceRefusal(429,"Rate limit exceeded");let{sessionKey:K,sandboxKey:re,rejected:Be}=(0,fe.resolveServeSessionKey)(b.sid??`voice-${(0,mu.randomUUID)()}`,x,br);if(Be)throw G.append("unverified",(0,zi.generateRequestId)(),"warrant_denied",{reason:Be}),new os.VoiceRefusal(403,"verified user identity required");return{sessionKey:K,sandboxKey:re,userId:x,dataToken:(0,fe.resolveDataToken)(m.headers),edgeNonce:zn(m.headers)}},admit:async m=>Ys(await ye.get(),m),runTurn:Pb,upstreamHeaders:m=>Object.fromEntries((0,zi.buildLiteLLMMetadataHeaders)(!0,{analyticsUserId:m.userId,sessionId:m.sessionKey,agentId:s,agentVersion:g,source:"voice",engine:"realtime",requestId:m.callId}).map(b=>[b.slice(0,b.indexOf(":")),b.slice(b.indexOf(":")+1).trim()])),onCallStart:m=>void G.append(m.sessionKey,m.callId,"voice_call_start",{caller_present:!!m.caller,agent_version:g}),onCallEnd:(m,b)=>void G.append(m.sessionKey,m.callId,"voice_call_end",{reason:b.reason,duration_seconds:b.durationSeconds,delegations:b.delegations,transcript_lines:b.transcript.length,after_call_ok:b.afterCall?.success??null,realtime_input_tokens:b.usage.inputTokens,realtime_output_tokens:b.usage.outputTokens}),log:m=>console.log(`[Voice] ${m}`)});n.manifest.spec?.voice&&td.on("upgrade",(m,b,x)=>{mo.handleUpgrade(m,b,x)||b.destroy()}),td.listen(t.port,L,()=>{(async()=>{console.log(""),console.log(Ya),console.log("Agent Hippo Server"),console.log(Ya),console.log(`Host: ${L}`),console.log(`Port: ${t.port}`),console.log(`Engine: ${a}`),console.log(`Model: ${c}`),u&&console.log(`Cheap: ${u}`),console.log(`Workspace: ${t.workspace}`),n&&(console.log(`Pack: ${n.manifest.metadata.name}@${n.manifest.metadata.version}`),console.log(`Gateway: ${i}`)),console.log(Ya),console.log(""),console.log("Endpoints:"),console.log(` POST http://localhost:${t.port}/v1/chat`),console.log(` POST http://localhost:${t.port}/v1/chat/stream`),console.log(` GET http://localhost:${t.port}/health`);try{let x=(0,ZS.loadVoiceSpec)(p);if(x){let ie=x.provider==="gemini"?Bh?", spend bypasses gateway caps":`, needs ${os.VOICE_GEMINI_API_KEY_ENV}`:e.useLiteLLM?"":", needs AGENTHIPPO_LITELLM_BASE_URL";console.log(` WS ws://localhost:${t.port}/v1/voice/session (voice: ${x.provider} ${x.model}${ie})`)}}catch(x){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} spec.voice is invalid, live calls will be refused: ${x instanceof Error?x.message:String(x)}`)}console.log(""),console.log("Press Ctrl+C to stop."),console.log("");let m=(0,sg.resolveSessionShipConfig)(j,O,I);m&&(pa=(0,sg.startSessionShipper)({...m,logger:{info:x=>f.info(x),warn:x=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${x}`)}}));let b=t.bind?.trim();if(b)try{await FU(i,b,xe)}catch(x){console.error(`${R.COLORS.yellow}Warning:${R.COLORS.reset} Failed to bind channels: ${x instanceof Error?x.message:String(x)}`)}if(t.gatewayBridge){if(pe)try{dt=await(0,ht.startEgressBroker)({registry:pe,workspaceRoot:t.workspace,agentId:n.manifest.metadata.name,send:async(x,ie,K)=>{let re=await(0,UU.sendGatewayOutboundMessage)(x,{message:ie,media:K,token:xe});return{ok:re.ok,via:re.via,stdout:re.stdout,stderr:re.stderr}},logger:t.verbose?new Wn.ConsoleLogger("[Egress]"):new Wn.NoOpLogger,audit:We}),process.env[ht.EGRESS_URL_ENV]=dt.url,console.log("OK: Egress broker on loopback \u2014 gateway token stays broker-side; agent sends via turn nonce")}catch(x){console.error(`${R.COLORS.red}Error:${R.COLORS.reset} Egress broker failed to start: ${x instanceof Error?x.message:String(x)}`),process.exit(1)}try{dc=await BU({gatewayAgentId:i,packName:n.manifest.metadata.name,workspace:t.workspace,registerTurn:yn,brokerGatewayToken:xe,engine:a,defaultModel:c,current:()=>({engine:a,defaultModel:c}),runner:fa,permissions:yi,turnGate:Q,rateLimiter:jt,turnLimiter:oe,warnGateReject:_t,...qr?{atCapacity:x=>qr.atCapacity(x)}:{},prepareSession:an,sandboxScope:br,onTurnComplete:x=>Ot?.schedule(x),logWarrantDenied:H,serviceUserIfPermitted:Ib})}catch(x){console.error(`${R.COLORS.yellow}Warning:${R.COLORS.reset} Gateway bridge failed: ${x instanceof Error?x.message:String(x)}`)}}fc=!0})()});let Fh=!1,Vh=()=>{Fh||(Fh=!0,fc=!1,console.log(`
587
- Shutting down...`),(async()=>{if(mo.active&&console.log(`Waiting for ${mo.active} live call(s) to finish...`),await mo.drain((0,os.voiceDrainMsFromEnv)()),Ot)try{await Ot.flush()}catch{}if(dc){try{await dc.unregisterAgent(i)}catch{}dc=null}if(Ue)try{await Ue.close()}catch{}if(dt)try{await dt.close()}catch{}if(pa)try{await pa.flush()}catch{}let m=async()=>{if(ho)try{await ho.destroyAll()}catch{}fa.dispose(),process.exit(0)};td.close(()=>{m()}),setTimeout(()=>{m()},1e4).unref()})())};process.on("SIGINT",Vh),process.on("SIGTERM",Vh)}async function tA(t){let e=await(0,fe.readBodyWithCap)(t);try{return JSON.parse(e)}catch{throw new Error("Invalid JSON")}}async function nA(t,e,n,r,s,i,o,a,c,l){let u=await t.run({engineId:oA(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:c,permissions:a,turnEnv:l});return{success:u.success,text:u.text,thinking:u.thinking||void 0,tool_calls:u.toolCalls,error:u.error,...u.atCapacity?{atCapacity:!0}:{}}}function sA(t,e,n="session",r=!1){if(r&&e){let a=`gateway-${e}`;return{sessionKey:`${a}--${(0,mu.randomUUID)()}`,sandboxKey:a,outboundKey:t.sessionId?.trim()||t.gatewaySessionKey?.trim()||a,durable:!1}}let s=e?`u${(0,fe.userNamespaceHash)(e)}`:void 0,i=t.sessionId?.trim()||t.gatewaySessionKey?.trim();if(i){let a=e?`u${(0,fe.userNamespaceHash)(e)}--${i}`:i;return{sessionKey:a,sandboxKey:n==="user"&&s?s:a,outboundKey:i,durable:!0}}if(e){let a=`gateway-${e}`;return{sessionKey:a,sandboxKey:n==="user"&&s?s:a,outboundKey:a,durable:!0}}let o=`gateway-anon-${(0,mu.randomUUID)()}`;return{sessionKey:o,sandboxKey:o,outboundKey:o,durable:!1}}async function cg(t){let e=async s=>{try{await t.emitter?.text(s),await t.emitter?.done()}catch{}};if(!t.rateLimiter.tryConsume(t.rlKey))return await e(fe.RATE_LIMIT_BUSY_MESSAGE),{success:!1,error:"rate_limited"};let n=t.atCapacity?.();if(n)return t.warnGateReject(`Sandbox cap: rejecting gateway turn (${n})`),await e(fe.TURN_GATE_BUSY_MESSAGE),{success:!1,error:"busy"};let r=await t.turnGate.acquire();if(!r)return t.warnGateReject(`TurnGate: rejecting gateway turn (inflight=${t.turnGate.inflight} queued=${t.turnGate.queued} max=${t.turnGate.max})`),await e(fe.TURN_GATE_BUSY_MESSAGE),{success:!1,error:"busy"};try{return t.trackSession!==!1&&!t.turnLimiter.tryConsume(t.sessionKey)?(await e(fe.TURN_LIMIT_BUSY_MESSAGE),{success:!1,error:"turn_limit"}):await t.run()}finally{r()}}async function BU(t){let{GatewayBridge:e}=await Promise.resolve().then(()=>$n(WS())),r=process.env.OPENCLAW_GATEWAY_URL??"ws://127.0.0.1:18789",s=t.brokerGatewayToken,i=new e({gatewayUrl:r,token:s});return await i.connect(),await i.registerAgent({id:t.gatewayAgentId,agentId:t.packName,name:`${t.packName} (CLI)`,workspace:t.workspace,engineId:t.engine,syncOpenClawConfigAgent:!0,messageHandler:(o,a)=>iA(t,o,a)}),console.log(`${R.COLORS.green}\u2713${R.COLORS.reset} Gateway bridge: registered "${t.gatewayAgentId}" at ${r}`),console.log(`${R.COLORS.dim} Gateway outbound routes: ${t.workspace}/.agent-hippo/sessions/<sessionKey>/gateway-outbound.json${R.COLORS.reset}`),console.log(`${R.COLORS.dim} openclaw agent --agent ${t.gatewayAgentId} --message "\u2026"${R.COLORS.reset}`),i}async function iA(t,e,n){let r=t.current?.()??{engine:t.engine,defaultModel:t.defaultModel},s=n.engineId?.trim().toLowerCase(),i=s==="custom"?r.engine:s||r.engine,o=(0,fe.peerToUserId)(n.peerInfo),a=o?void 0:await t.serviceUserIfPermitted?.(),c=o??a,{sessionKey:l,sandboxKey:u,outboundKey:d,durable:f}=sA(n,c,t.sandboxScope,!!a);return cg({rateLimiter:t.rateLimiter,turnLimiter:t.turnLimiter,turnGate:t.turnGate,warnGateReject:t.warnGateReject,rlKey:c??"gateway",sessionKey:l,trackSession:f,emitter:n.emitter,atCapacity:()=>t.atCapacity?.(l),run:async()=>{f&&await t.prepareSession(l);let p=c?.trim()?await t.registerTurn({userId:c.trim(),sessionKey:l,egressStoreKey:d}):null;try{let g=await(0,Yo.runWithCredential)({userId:c},()=>t.runner.run({engineId:i,modelId:r.defaultModel,message:e,workspaceRoot:t.workspace,sessionId:l,sandboxKey:u,gatewaySessionKey:d,analyticsUserId:c,emitter:n.emitter,permissions:t.permissions,turnEnv:p?.env}),{onDenied:t.logWarrantDenied(l)});return f&&t.onTurnComplete?.(l),{success:g.success,error:g.error}}finally{await p?.release()}}})}async function FU(t,e,n){let{createAgentIDEGatewayClient:r}=await Promise.resolve().then(()=>$n(ou())),i=process.env.OPENCLAW_GATEWAY_URL??"ws://127.0.0.1:18789",{client:o,clientInfo:a}=r(i,n);try{await o.connect(a)}catch(c){throw new Error(`Cannot connect to gateway at ${i}: ${c instanceof Error?c.message:String(c)}`)}try{let c,l,u;if(e.trim()==="*"){let f=await(0,og.fetchMeetAgentChannelContext)(o.request.bind(o));c=f.rows.map(p=>p.id),u=f.statusPayload}else{let f=(0,og.parseChannelBindSpecs)(e);c=f.map(p=>p.channelId),l=Object.fromEntries(f.filter(p=>p.accountId).map(p=>[p.channelId,p.accountId])),Object.keys(l).length===0&&(l=void 0)}if(c.length===0){console.log(`${R.COLORS.yellow}Warning:${R.COLORS.reset} No channels to bind.`);return}let d=await(0,og.applyAgentChannelBindingsViaConfigPatch)(o.request.bind(o),{agentId:t,selectedChannelIds:c,channelAccountOverrides:l,statusPayload:u});console.log(d?`${R.COLORS.green}\u2713${R.COLORS.reset} Bound ${t} to: ${c.join(", ")}`:`${R.COLORS.dim}Slack already bound to ${t}; skipped config.patch${R.COLORS.reset}`)}finally{o.close()}}async function VU(t,e,n,r,s,i,o,a,c,l,u,d,f){let p=!1,g=(y,E)=>{p||c.writableEnded||c.write(`data: ${JSON.stringify({type:y,...E})}
584
+ ${this.opts.spec.afterCall}`;await this.turnChain,r.afterCall=await this.opts.runTurn(i).catch(o=>({success:!1,error:String(o)})),this.opts.log(`after-call turn: ${r.afterCall.success?"ok":`failed (${r.afterCall.error})`}`)}this.resolveEnded(r)}};au.VoiceCall=xp});var Bp=T(cu=>{"use strict";Object.defineProperty(cu,"__esModule",{value:!0});cu.VOICE_DEBUG=void 0;cu.VOICE_DEBUG=process.env.AGENTHIPPO_VOICE_DEBUG==="1"});var SS=T(Ms=>{"use strict";var IG=Ms&&Ms.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ms,"__esModule",{value:!0});Ms.GeminiLiveUpstream=Ms.GEMINI_LIVE_URL=void 0;var yS=IG(require("ws")),wS=Va(),PG=Bp(),Fp=1500;Ms.GEMINI_LIVE_URL="wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent";function Vp(t){return Array.isArray(t)?t.map(Vp):!t||typeof t!="object"?t:Object.fromEntries(Object.entries(t).map(([e,n])=>[e,e==="type"&&typeof n=="string"?n.toUpperCase():Vp(n)]))}var Kp=class{model;apiKey;url;label;ws;events;ready=!1;pending=[];generating=!1;deferredText=[];lastCallerAt=0;flushTimer;callerBuf="";agentBuf="";startedAt=Date.now();constructor(e,n,r=Ms.GEMINI_LIVE_URL){this.model=e,this.apiKey=n,this.url=r,this.label=`gemini ${e} (direct)`}get busy(){return this.generating}start(e,n){this.events=n;let r=new yS.default(this.url,{headers:{"x-goog-api-key":this.apiKey}});this.ws=r,r.on("open",()=>r.send(JSON.stringify({setup:this.setup(e)}))),r.on("message",s=>this.onMessage(s.toString())),r.on("unexpected-response",(s,i)=>n.closed(`Gemini refused the session (HTTP ${i.statusCode})`)),r.on("error",s=>n.closed(`Gemini connection failed: ${s.message}`)),r.on("close",(s,i)=>n.closed(`Gemini closed the session (${s}${i.length?` ${i.toString().slice(0,200)}`:""})`))}sendAudio(e){this.ready&&this.send({realtimeInput:{audio:{data:Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64"),mimeType:`audio/pcm;rate=${wS.REALTIME_SAMPLE_RATE}`}}})}toolResult(e,n,r){this.send({toolResponse:{functionResponses:[{id:e,name:n,response:r}]}})}say(e){if(!this.generating&&Date.now()-this.lastCallerAt>Fp){this.send({realtimeInput:{text:e}});return}this.deferredText.push(e),this.flushTimer??=setInterval(()=>{!this.generating&&Date.now()-this.lastCallerAt>Fp&&this.flushDeferred()},250)}close(){clearInterval(this.flushTimer);try{this.ws?.close()}catch{}}setup(e){return{model:this.model.startsWith("models/")?this.model:`models/${this.model}`,generationConfig:{responseModalities:["AUDIO"],thinkingConfig:{thinkingBudget:0},...e.voice?{speechConfig:{voiceConfig:{prebuiltVoiceConfig:{voiceName:e.voice}}}}:{}},systemInstruction:{parts:[{text:e.instructions}]},tools:[{functionDeclarations:e.tools.map(n=>({name:n.name,description:n.description,parameters:Vp(n.parameters)}))}],realtimeInputConfig:{automaticActivityDetection:{silenceDurationMs:500}},inputAudioTranscription:{},outputAudioTranscription:{}}}send(e){let n=JSON.stringify(e);this.ready?this.ws?.readyState===yS.default.OPEN&&this.ws.send(n):this.pending.push(n)}flushDeferred(){clearInterval(this.flushTimer),this.flushTimer=void 0;for(let e of this.deferredText.splice(0))this.send({realtimeInput:{text:e}})}flushCaller(){this.callerBuf.trim()&&this.events.callerText(this.callerBuf.trim()),this.callerBuf=""}flushAgent(){this.agentBuf.trim()&&this.events.agentText(this.agentBuf.trim()),this.agentBuf=""}onMessage(e){let n;try{n=JSON.parse(e)}catch{return}if(PG.VOICE_DEBUG){let s=Object.keys(n.serverContent??{}).filter(o=>o!=="modelTurn"),i=Object.keys(n).filter(o=>o!=="serverContent"||s.length);i.length&&this.events.log(`\u2190 ${i.join(",")}${s.length?`[${s.join(",")}]`:""} (+${Date.now()-this.startedAt} ms)`)}if(n.setupComplete){this.ready=!0;for(let s of this.pending.splice(0))this.ws?.send(s);this.events.open()}if(n.usageMetadata&&this.events.usage(Number(n.usageMetadata.promptTokenCount??0),Number(n.usageMetadata.responseTokenCount??0)),n.goAway&&this.events.log(`Gemini goAway: ${JSON.stringify(n.goAway).slice(0,200)}`),n.toolCall?.functionCalls){this.flushCaller();for(let s of n.toolCall.functionCalls)this.events.toolCall(String(s.name),String(s.id),s.args??{})}let r=n.serverContent;if(r){r.inputTranscription?.text&&(this.callerBuf+=r.inputTranscription.text,this.lastCallerAt=Date.now(),this.events.callerActivity());for(let s of r.modelTurn?.parts??[])s.inlineData?.data&&(this.generating||(this.generating=!0,this.flushCaller()),this.events.audio((0,wS.pcm16FromBytes)(Buffer.from(s.inlineData.data,"base64"))));r.outputTranscription?.text&&(this.agentBuf+=r.outputTranscription.text),r.interrupted&&(this.generating=!1,this.flushAgent(),this.events.interrupted()),r.turnComplete&&(this.generating=!1,this.flushCaller(),this.flushAgent(),Date.now()-this.lastCallerAt>Fp&&this.flushDeferred())}}};Ms.GeminiLiveUpstream=Kp});var TS=T(Ko=>{"use strict";var NG=Ko&&Ko.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ko,"__esModule",{value:!0});Ko.OpenAIRealtimeUpstream=void 0;var Wp=NG(require("ws")),AS=Va(),qp=Bp(),Yp=class{url;headers;label;ws;events;startedAt=Date.now();responseActive=!1;wantResponse=!1;pendingItems=[];ownRequestPending=!1;turnAnswered=!1;vadEvents=!1;expectStray=!1;dropResponseId;constructor(e,n,r){this.url=e,this.headers=n,this.label=`gateway ${r}`}get busy(){return this.responseActive}start(e,n){this.events=n;let r=new Wp.default(this.url,{headers:this.headers});this.ws=r,r.on("open",()=>{this.send({type:"session.update",session:this.sessionConfig(e)}),n.open()}),r.on("message",s=>this.onMessage(s.toString())),r.on("unexpected-response",(s,i)=>n.closed(`gateway refused the realtime session (HTTP ${i.statusCode})`)),r.on("error",s=>n.closed(`realtime connection failed: ${s.message}`)),r.on("close",s=>n.closed(`realtime connection closed (${s})`))}sendAudio(e){this.ws?.readyState===Wp.default.OPEN&&this.send({type:"input_audio_buffer.append",audio:Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64")})}toolResult(e,n,r){this.pendingItems.push({type:"conversation.item.create",item:{type:"function_call_output",call_id:e,output:JSON.stringify(r)}}),this.flushPending()}say(e){this.pendingItems.push({type:"conversation.item.create",item:{type:"message",role:"user",content:[{type:"input_text",text:e}]}}),this.flushPending()}close(){try{this.ws?.close()}catch{}}sessionConfig(e){let n={type:"audio/pcm",rate:AS.REALTIME_SAMPLE_RATE};return{type:"realtime",instructions:e.instructions,output_modalities:["audio"],audio:{input:{format:n,transcription:{model:e.transcription},turn_detection:{type:"server_vad"}},output:{format:n,...e.voice?{voice:e.voice}:{}}},tools:e.tools.map(r=>({type:"function",...r}))}}send(e){let n=e.type;qp.VOICE_DEBUG&&n!=="input_audio_buffer.append"&&this.events.log(`\u2192 ${n} (+${Date.now()-this.startedAt} ms, active=${this.responseActive})`),this.ws?.readyState===Wp.default.OPEN&&this.ws.send(JSON.stringify(e))}requestResponse(){if(this.responseActive){this.wantResponse=!0;return}this.wantResponse=!1,this.responseActive=!0,this.ownRequestPending=!0,this.send({type:"response.create"})}flushPending(){if(!(this.responseActive||!this.pendingItems.length)){for(let e of this.pendingItems.splice(0))this.send(e);this.requestResponse()}}onMessage(e){let n;try{n=JSON.parse(e)}catch{return}switch(qp.VOICE_DEBUG&&!String(n.type).endsWith(".delta")&&this.events.log(`\u2190 ${n.type} (+${Date.now()-this.startedAt} ms)`),n.type){case"response.output_audio.delta":case"response.audio.delta":(!n.response_id||n.response_id!==this.dropResponseId)&&this.events.audio((0,AS.pcm16FromBytes)(Buffer.from(String(n.delta??""),"base64")));break;case"input_audio_buffer.speech_started":this.turnAnswered=!1,this.vadEvents=!0,this.events.interrupted();break;case"input_audio_buffer.speech_stopped":this.events.callerActivity();break;case"response.created":if(this.responseActive=!0,this.expectStray&&!this.ownRequestPending&&n.response?.id){this.expectStray=!1,this.dropResponseId=n.response.id,this.send({type:"response.cancel",response_id:n.response.id});break}this.ownRequestPending=!1,this.turnAnswered=!0;break;case"response.done":{this.responseActive=!1;let r=n.response?.usage;this.events.usage(Number(r?.input_tokens??0),Number(r?.output_tokens??0)),this.pendingItems.length?this.flushPending():this.wantResponse&&this.requestResponse();break}case"response.output_audio_transcript.done":case"response.audio_transcript.done":this.events.agentText(String(n.transcript??""));break;case"conversation.item.input_audio_transcription.completed":this.onTranscriptionDone(),this.events.callerText(String(n.transcript??""));break;case"response.output_item.done":if(n.item?.type==="function_call"){let r={};try{r=JSON.parse(String(n.item.arguments??"{}"))}catch{}this.events.toolCall(String(n.item.name),String(n.item.call_id),r)}break;case"error":if(n.error?.code==="conversation_already_has_active_response"&&!qp.VOICE_DEBUG)break;this.events.log(`realtime error: ${JSON.stringify(n.error??n).slice(0,300)}`);break}}onTranscriptionDone(){this.vadEvents&&this.turnAnswered&&!this.responseActive&&(this.expectStray=!0)}};Ko.OpenAIRealtimeUpstream=Yp});var NS=T(be=>{"use strict";var RG=be&&be.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),CG=be&&be.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),OS=be&&be.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&RG(n,e,r[s]);return CG(n,e),n}})();Object.defineProperty(be,"__esModule",{value:!0});be.VoiceRoute=be.MAX_CONCURRENT_VOICE_TURNS_ENV=be.VoiceRefusal=be.VOICE_DRAIN_SECONDS_ENV=be.VOICE_GEMINI_API_KEY_ENV=be.VOICE_STREAM_SECRET_ENV=be.MAX_CONCURRENT_CALLS_ENV=be.VOICE_SESSION_PATH=void 0;be.createVoiceTurnGate=UG;be.voiceDrainMsFromEnv=HG;be.maxCallsFromEnv=jG;be.signStreamToken=xG;be.verifyStreamToken=IS;be.realtimeUrl=PS;var lu=OS(require("crypto")),li=OS(require("ws")),Wo=Va(),kG=ur(),$G=ES(),DG=SS(),LG=TS();be.VOICE_SESSION_PATH="/v1/voice/session";be.MAX_CONCURRENT_CALLS_ENV="AGENTHIPPO_MAX_CONCURRENT_CALLS";be.VOICE_STREAM_SECRET_ENV="AGENTHIPPO_VOICE_STREAM_SECRET";be.VOICE_GEMINI_API_KEY_ENV="AGENTHIPPO_VOICE_GEMINI_API_KEY";be.VOICE_DRAIN_SECONDS_ENV="AGENTHIPPO_VOICE_DRAIN_SECONDS";var MG=15e3,bS=160,GG=64*1024,tn=class extends Error{status;constructor(e,n){super(n),this.status=e}};be.VoiceRefusal=tn;be.MAX_CONCURRENT_VOICE_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_VOICE_TURNS";function UG(t=process.env){let e=Number(t[be.MAX_CONCURRENT_VOICE_TURNS_ENV]??4);return new kG.TurnGate(Number.isFinite(e)&&e>0?e:4,8)}function HG(t=process.env){let e=Number(t[be.VOICE_DRAIN_SECONDS_ENV]??720);return(Number.isFinite(e)&&e>=0?e:720)*1e3}function jG(t=process.env){let e=Number(t[be.MAX_CONCURRENT_CALLS_ENV]??20);return Number.isFinite(e)&&e>0?Math.floor(e):20}var vS=t=>Buffer.from(t).toString("base64url");function xG(t,e){let n=vS(JSON.stringify(t));return`${n}.${vS(lu.createHmac("sha256",e).update(n).digest())}`}function IS(t,e,n=Date.now()/1e3){let[r,s]=t.split(".");if(!r||!s)throw new tn(401,"malformed stream token");let i=lu.createHmac("sha256",e).update(r).digest(),o=Buffer.from(s,"base64url");if(o.length!==i.length||!lu.timingSafeEqual(o,i))throw new tn(401,"bad stream token");let a;try{a=JSON.parse(Buffer.from(r,"base64url").toString("utf-8"))}catch{throw new tn(401,"malformed stream token")}if(!a||typeof a!="object"||!a.sid||!(a.exp>n))throw new tn(401,"expired stream token");return a}function PS(t,e){return`${t.replace(/\/+$/,"").replace(/\/v1$/,"").replace(/^http/,"ws")}/v1/realtime?model=${encodeURIComponent(e)}`}function BG(t){return{sendAudio:e=>t.readyState===li.default.OPEN&&t.send((0,Wo.pcm16ToBuffer)(e)),clear:()=>t.readyState===li.default.OPEN&&t.send(JSON.stringify({type:"clear"})),transcript:e=>t.readyState===li.default.OPEN&&t.send(JSON.stringify({type:"transcript",...e})),close:e=>{t.readyState===li.default.OPEN&&(t.send(JSON.stringify({type:"ended",reason:e})),t.close(1e3,e.slice(0,120)))},onAudio:e=>t.on("message",(n,r)=>{r&&e((0,Wo.pcm16FromBytes)(n))}),onClose:e=>t.on("close",e)}}function FG(t){let e=new Wo.Downsampler3,n=new Uint8Array(0),r=0;return{sendAudio:s=>{let i=(0,Wo.ulawEncode)(e.push(s)),o=new Uint8Array(n.length+i.length);o.set(n),o.set(i,n.length);let a=Math.floor(o.length/bS)*bS;a&&t.readyState===li.default.OPEN&&t.send(JSON.stringify({event:"media",media:{payload:Buffer.from(o.subarray(0,a)).toString("base64")}})),n=o.slice(a)},clear:()=>{n=new Uint8Array(0),e.reset(),t.readyState===li.default.OPEN&&t.send(JSON.stringify({event:"clear"}))},close:s=>t.readyState===li.default.OPEN&&t.close(1e3,s.slice(0,120)),onAudio:s=>t.on("message",i=>{let o;try{o=JSON.parse(i.toString())}catch{return}if(o.event==="media"&&o.media?.payload&&(o.media.track??"inbound")==="inbound"){let a=(0,Wo.ulawDecode)(Buffer.from(o.media.payload,"base64"));a.length&&(s((0,Wo.upsample3)(a,r)),r=a[a.length-1])}else o.event==="stop"&&t.close(1e3,"stream stopped")}),onClose:s=>t.on("close",s)}}var Jp=class{deps;wss=new li.WebSocketServer({noServer:!0,maxPayload:GG,verifyClient:(e,n)=>void this.admitCall(e.req).then(()=>n(!0),r=>{this.deps.log(`refusing call: ${r instanceof Error?r.message:String(r)}`);let s=r instanceof tn?r.status:500,i=r instanceof tn?r.message:"internal error";n(!1,s,JSON.stringify({error:i}),{"Content-Type":"application/json",...s===503?{"Retry-After":"5"}:{}})})});admitted=new WeakMap;calls=new Map;reserved=0;draining=!1;recheck;constructor(e){this.deps=e,this.recheck=setInterval(()=>void this.recheckLeases(),e.leaseRecheckMs??MG),this.recheck.unref?.()}get active(){return this.reserved}get max(){return this.deps.maxCalls}handleUpgrade(e,n,r){return new URL(e.url??"/","http://serve").pathname!==be.VOICE_SESSION_PATH?!1:(n.once("close",()=>{let s=this.admitted.get(e);s&&!s.started&&(this.admitted.delete(e),this.reserved-=1)}),this.wss.handleUpgrade(e,n,r,s=>this.startCall(s,e)),!0)}async admitCall(e){if(this.draining)throw new tn(503,"Shutting down");if(this.reserved>=this.deps.maxCalls)throw new tn(503,`At capacity (${this.reserved}/${this.deps.maxCalls})`);this.reserved+=1;try{let n=new URL(e.url??"/","http://serve"),r=n.searchParams.get("format")??"pcm16";if(r!=="pcm16"&&r!=="telnyx")throw new tn(400,`unknown format ${r}`);let s;this.deps.streamSecret?s=IS(n.searchParams.get("token")??"",this.deps.streamSecret):s={sid:n.searchParams.get("session_id")??void 0,caller:n.searchParams.get("caller")??void 0};let i=this.deps.loadSpec();if(!i)throw new tn(404,"this agent pack has no spec.voice");if(i.provider==="gemini"&&!this.deps.geminiApiKey)throw new tn(503,`voice on Gemini needs ${be.VOICE_GEMINI_API_KEY_ENV}`);if(i.provider==="gateway"&&!this.deps.gatewayBaseUrl)throw new tn(503,"voice through the gateway needs AGENTHIPPO_LITELLM_BASE_URL");let o=await this.deps.resolveCall(e,s);await this.deps.admit(o.sessionKey).catch(a=>{throw new tn(403,a instanceof Error?a.message:"not admitted")}),this.admitted.set(e,{ctx:{...o,callId:lu.randomUUID(),caller:s.caller},spec:i,format:r,started:!1})}catch(n){throw this.reserved-=1,n}}startCall(e,n){let r=this.admitted.get(n);if(!r){e.close(1011,"not admitted");return}r.started=!0,this.admitted.delete(n);let{ctx:s,spec:i,format:o}=r,a=o==="telnyx"?FG(e):BG(e),c=u=>this.deps.log(`[call ${s.callId.slice(0,8)}] ${u}`);e.on("error",u=>c(`caller connection error: ${u.message}`));let l=new $G.VoiceCall({callId:s.callId,caller:s.caller,spec:i,upstream:i.provider==="gemini"?new DG.GeminiLiveUpstream(i.model,this.deps.geminiApiKey??"",this.deps.geminiUrl):new LG.OpenAIRealtimeUpstream(PS(this.deps.gatewayBaseUrl,i.model),{Authorization:`Bearer ${this.deps.gatewayApiKey}`,...this.deps.upstreamHeaders(s)},i.model),transport:a,runTurn:u=>this.deps.runTurn(s,u),log:c});this.calls.set(s.callId,{call:l,ctx:s}),c(`started (${o}, session ${s.sessionKey}, ${this.reserved}/${this.deps.maxCalls} live)`),this.deps.onCallStart?.(s),l.start(),l.done.then(u=>{this.calls.delete(s.callId),this.reserved-=1,this.deps.onCallEnd?.(s,u)})}async recheckLeases(){for(let{call:e,ctx:n}of this.calls.values())try{await this.deps.admit(n.sessionKey)}catch(r){this.deps.log(`[call ${n.callId.slice(0,8)}] ending: ${r instanceof Error?r.message:"no longer admitted"}`),e.stop("the agent was stopped")}}async drain(e){this.draining=!0,clearInterval(this.recheck);let n=Date.now()+e;for(;this.calls.size&&Date.now()<n;)await new Promise(s=>setTimeout(s,500));let r=[...this.calls.values()];for(let{call:s}of r)s.stop("server shutting down");await Promise.race([Promise.all(r.map(({call:s})=>s.done)),new Promise(s=>setTimeout(s,5e3))]),this.wss.close()}};be.VoiceRoute=Jp});var GS=T(Ze=>{"use strict";var VG=Ze&&Ze.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),KG=Ze&&Ze.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),RS=Ze&&Ze.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&VG(n,e,r[s]);return KG(n,e),n}})();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.isAwsCliAvailable=JG;Ze.resolveS3StateConfig=XG;Ze.resolveRestoreBootMode=zG;Ze.safeSessionId=du;Ze.sessionRemoteUri=Xp;Ze.shardBelongsToSession=zp;Ze.hasLocalSessionState=CS;Ze.listSessionShardFiles=kS;Ze.stageSessionPushDir=$S;Ze.mergeSessionStagingIntoState=DS;Ze.restoreState=eU;Ze.pushState=LS;Ze.pushSessionState=MS;Ze.ensureSessionLocal=tU;Ze.clearRestoreAttemptCache=nU;Ze.makeStatePusher=rU;Ze.providerSessionShardName=sU;var WG=require("crypto"),qG=require("child_process"),nn=RS(require("fs/promises")),Nn=RS(require("path")),YG=require("util"),Ka=(0,YG.promisify)(qG.execFile),uu=new Set;async function JG(){try{return await Ka("aws",["--version"]),!0}catch{return!1}}function XG(t=process.env){let e=t.AGENTHIPPO_STATE_S3_URI?.trim();return e?{uri:e.replace(/\/+$/,""),endpoint:t.AGENTHIPPO_STATE_S3_ENDPOINT?.trim()||void 0}:null}function zG(t=process.env){return t.AGENTHIPPO_STATE_RESTORE_BOOT?.trim().toLowerCase()==="none"?"none":"all"}function du(t){return t.trim().replace(/[<>:"/\\|?*\x00-\x1F]+/g,"_").replace(/\.\./g,"_").slice(0,160)||"session"}function Xp(t,e){return`${t.uri}/sessions/${du(e)}`}function fu(t,e,n){let r=["s3","sync",e,n,"--no-progress"];return t.endpoint&&r.push("--endpoint-url",t.endpoint),r}function QG(t,e){return`${Nn.resolve(t)}\0${e}`}function zp(t,e,n){if(n?.chatSessionId&&n.chatSessionId===e)return!0;let r=t.split(":");return r.length>=2&&r[1]===e}async function CS(t,e){let n=Nn.join(t,"provider-sessions"),r;try{r=await nn.readdir(n)}catch{return!1}for(let s of r)if(s.endsWith(".json"))try{let i=await nn.readFile(Nn.join(n,s),"utf8"),o=JSON.parse(i);if(typeof o.key=="string"&&zp(o.key,e,o.value))return!0}catch{}return!1}async function kS(t,e){let n=Nn.join(t,"provider-sessions"),r;try{r=await nn.readdir(n)}catch{return[]}let s=[];for(let i of r)if(i.endsWith(".json"))try{let o=await nn.readFile(Nn.join(n,i),"utf8"),a=JSON.parse(o);typeof a.key=="string"&&zp(a.key,e,a.value)&&s.push(i)}catch{}return s}async function ZG(t){try{return await nn.access(t),!0}catch{return!1}}async function $S(t,e,n){await nn.rm(n,{recursive:!0,force:!0}),await nn.mkdir(n,{recursive:!0});let r=await kS(t,e),s=Nn.join(n,"provider-sessions");if(r.length>0){await nn.mkdir(s,{recursive:!0});for(let i of r)await nn.copyFile(Nn.join(t,"provider-sessions",i),Nn.join(s,i))}return r.length>0}async function DS(t,e){let n=Nn.join(t,"provider-sessions");if(await ZG(n)){let r=Nn.join(e,"provider-sessions");await nn.mkdir(r,{recursive:!0});for(let s of await nn.readdir(n))s.endsWith(".json")&&await nn.copyFile(Nn.join(n,s),Nn.join(r,s))}}async function eU(t,e,n){try{await Ka("aws",fu(t,t.uri,e)),n?.(`State restored from ${t.uri}`)}catch(r){n?.(`State restore skipped: ${r instanceof Error?r.message:String(r)}`)}}async function LS(t,e,n){try{await Ka("aws",fu(t,e,t.uri))}catch(r){console.error(`[state-sync] push to ${t.uri} failed: ${r instanceof Error?r.message:String(r)}`),n?.(`State push failed: ${r instanceof Error?r.message:String(r)}`)}}async function MS(t,e,n,r){let s=du(n),i=Nn.join(e,".push-staging",s);try{if(!await $S(e,n,i)){r?.(`State push skipped for session ${s}: nothing local`);return}let a=Xp(t,n);await Ka("aws",fu(t,i,a)),r?.(`State pushed session ${s} \u2192 ${a}`)}catch(o){console.error(`[state-sync] push session ${s} failed: ${o instanceof Error?o.message:String(o)}`),r?.(`State push failed for ${s}: ${o instanceof Error?o.message:String(o)}`)}finally{await nn.rm(i,{recursive:!0,force:!0}).catch(()=>{})}}async function tU(t,e,n,r){let s=QG(e,n);if(uu.has(s))return;if(await CS(e,n)){uu.add(s);return}let i=du(n),o=Nn.join(e,".restore-staging",i);try{await nn.rm(o,{recursive:!0,force:!0}),await nn.mkdir(o,{recursive:!0});let a=Xp(t,n);await Ka("aws",fu(t,a,o)),await DS(o,e),r?.(`State restored session ${i} from ${a}`)}catch(a){r?.(`State restore-on-miss skipped for ${i}: ${a instanceof Error?a.message:String(a)}`)}finally{uu.add(s),await nn.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}function nU(){uu.clear()}function rU(t,e,n,r=1e3){let s=null,i=!1,o=null,a=new Set,c=!1,l=()=>{i=!0;let d=[...a],g=c;return a.clear(),c=!1,o=(async()=>{g&&await LS(t,e,n);for(let p of d)await MS(t,e,p,n)})().catch(p=>{console.error(`[state-sync] push batch failed: ${p instanceof Error?p.message:String(p)}`)}).finally(()=>{i=!1,o=null,(a.size>0||c)&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))}),o};return{schedule:d=>{d?.trim()?a.add(d.trim()):c=!0,!i&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))},flush:async()=>{s&&(clearTimeout(s),s=null),o&&await o,(a.size>0||c)&&(await l(),o&&await o)}}}function sU(t){return`${(0,WG.createHash)("sha256").update(t).digest("hex").slice(0,40)}.json`}});var US=T(ss=>{"use strict";Object.defineProperty(ss,"__esModule",{value:!0});ss.CLI_GATEWAY_AGENT_PREFIX=void 0;ss.resolveCliGatewayAgentId=aU;ss.isCliGatewayAgentId=cU;var iU=er();ss.CLI_GATEWAY_AGENT_PREFIX="agenthippo-cli";function oU(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,32)||"unnamed"}function aU(t){let e=(t??"").trim().toLowerCase();return!e||e===iU.AGENT_CONSTANTS.DEFAULT_AGENT_ID?ss.CLI_GATEWAY_AGENT_PREFIX:`${ss.CLI_GATEWAY_AGENT_PREFIX}-${oU(e)}`}function cU(t){let e=(t??"").trim().toLowerCase();return e===ss.CLI_GATEWAY_AGENT_PREFIX||e.startsWith(`${ss.CLI_GATEWAY_AGENT_PREFIX}-`)}});var eg=T(Gs=>{"use strict";Object.defineProperty(Gs,"__esModule",{value:!0});Gs.fetchMeetAgentChannelContext=HS;Gs.mapChannelsStatusToMeetAgentRows=Zp;Gs.parseChannelBindSpecs=fU;Gs.applyAgentChannelBindingsViaConfigPatch=_U;Gs.fetchMeetAgentChannelRows=EU;Gs.waitForChannelsLive=wU;Gs.resolvePublishedGatewayChannelIds=SU;var Qp={probe:!1,timeoutMs:1e4};async function HS(t){let e=await t("channels.status",Qp);return{rows:Zp(e),statusPayload:e}}function ui(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Zp(t){let e=ui(t);if(!e)return[];let n=Array.isArray(e.channelOrder)?e.channelOrder:null,r=ui(e.channelLabels)??{},s=ui(e.channels)??{},i=ui(e.channelAccounts)??{},o=ui(e.channelDefaultAccountId)??{},a=n&&n.length>0?n:[...Object.keys(s)].sort((l,u)=>l.localeCompare(u)),c=[];for(let l of a){let u=typeof r[l]=="string"?r[l]:l,f=i[l],d=Array.isArray(f)?f:[],g=d.length>0?d.map(w=>typeof w.accountId=="string"?w.accountId:"default"):[typeof o[l]=="string"?o[l]:"default"],p=ui(s[l]),_=p&&typeof p.connected=="boolean"?p.connected:p?.running===!0,h=d.some(w=>typeof w.connected=="boolean"&&w.connected||w.running===!0),y=_||h,E=p?.configured===!0||d.some(w=>w.configured===!0&&w.enabled!==!1)||y;c.push({id:l,label:u,connected:y,enabled:E,accounts:g})}return c}function lU(t){let e=ui(t);if(!e)return{};let n=ui(e.channelDefaultAccountId)??{},r={};for(let[s,i]of Object.entries(n))typeof i=="string"&&i.trim()&&(r[s]=i.trim());return r}function uU(t,e){if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t;if(n.type==="acp"||String(n.agentId??"").trim().toLowerCase()!==e)return!1;let r=n.match;return!r||typeof r!="object"||r.peer?!1:typeof r.channel=="string"&&r.channel.trim().length>0}function dU(t){return typeof t!="string"||!t.trim()?"default":t.trim().toLowerCase()}function fU(t){return t.split(",").map(e=>e.trim()).filter(Boolean).map(e=>{let n=e.indexOf(":");if(n===-1)return{channelId:e};let r=e.slice(0,n).trim(),s=e.slice(n+1).trim();return s?{channelId:r,accountId:s}:{channelId:e}})}function pU(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t.match?.channel;return typeof e=="string"&&e.trim()?e.trim():void 0}function gU(t){let e=pU(t);return!!(e&&e.includes(":"))}function hU(t,e,n){if(!t||typeof t!="object"||Array.isArray(t))return!1;let r=t;if(r.type==="acp"||String(r.type??"route").toLowerCase()!=="route")return!1;let i=r.match;if(!i||typeof i!="object"||i.peer)return!1;let o=typeof i.channel=="string"?i.channel.trim().toLowerCase():"",a=dU(i.accountId);return o===e.trim().toLowerCase()&&a===n.trim().toLowerCase()}function mU(t){let e=t.agentId.trim().toLowerCase(),n=i=>t.channelAccountOverrides?.[i]??t.channelDefaultAccountId[i]??"default",r=t.existingBindings.filter(i=>{if(gU(i)||uU(i,e))return!1;for(let o of t.selectedChannelIds){let a=n(o);if(hU(i,o,a))return!1}return!0}),s=t.selectedChannelIds.map(i=>{let o=n(i);return{type:"route",agentId:t.agentId.trim(),match:{channel:i,accountId:o}}});return[...r,...s]}async function _U(t,e){let n=e.statusPayload??await t("channels.status",Qp),r=lU(n),s=await t("config.get",{}),i=typeof s.hash=="string"?s.hash.trim():"";if(!i)throw new Error("config.get did not return hash; cannot config.patch bindings");let o=Array.isArray(s.config?.bindings)?s.config.bindings:[],a=mU({existingBindings:o,agentId:e.agentId,selectedChannelIds:e.selectedChannelIds,channelDefaultAccountId:r,channelAccountOverrides:e.channelAccountOverrides});return JSON.stringify(o)===JSON.stringify(a)?!1:(await t("config.patch",{baseHash:i,raw:JSON.stringify({bindings:a})}),!0)}async function EU(t){let{rows:e}=await HS(t);return e}var yU=t=>new Promise(e=>setTimeout(e,t));async function wU(t,e,n={}){let r=[...new Set(e.map(d=>d.trim().toLowerCase()).filter(Boolean))];if(r.length===0)return{ready:!0,live:[],pending:[],polls:0,timedOut:!1};let s=n.timeoutMs??8e3,i=n.intervalMs??400,o=n.sleep??yU,a=n.now??Date.now,c=a(),l=0,u=[],f=[...r];for(;;){l++;let d;try{let p=await t("channels.status",Qp);d=Zp(p)}catch{d=[]}let g=new Set(d.filter(p=>p.connected).map(p=>p.id.trim().toLowerCase()));if(u=r.filter(p=>g.has(p)),f=r.filter(p=>!g.has(p)),f.length===0)return{ready:!0,live:u,pending:f,polls:l,timedOut:!1};if(a()-c>=s)return{ready:!1,live:u,pending:f,polls:l,timedOut:!0};await o(i)}}function SU(t,e){let n=e?.trim();return n?t.filter(r=>r.id.toLowerCase()===n.toLowerCase()).map(r=>r.id):t.filter(r=>r.enabled).map(r=>r.id)}});var WS=T(rn=>{"use strict";var xS=rn&&rn.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(rn,"__esModule",{value:!0});rn.GatewayBridge=rn.MAX_GATEWAY_ID_CHARS=void 0;rn.isIdeThreadCompositeRouteKey=BS;rn.parseIdeThreadIdFromCompositeRouteKey=vU;rn.findOversizedRunField=FS;rn.buildIdeSessionRouteKey=VS;rn.extractRouteLabelFromGatewaySessionKey=KS;rn.looksLikeGatewayChannelRouteKey=IU;rn.createGatewayBridge=PU;var AU=require("events"),tg=ou(),TU=xS(require("node:os")),ng=xS(require("node:path")),bU=jl(),jS=Zc(),qo="::sid:";function BS(t){return!!t?.includes(qo)}function vU(t){if(!t||!BS(t))return;let e=t.lastIndexOf(qo),n=t.slice(e+qo.length).trim();return n.length>0?n:void 0}rn.MAX_GATEWAY_ID_CHARS=512;var OU=["agentId","sessionKey","sessionId","channel","accountId","target","threadId","groupId","senderUsername","senderName","senderId"];function FS(t){let e=t;for(let n of OU){let r=e[n];if(r!=null&&(typeof r!="string"||r.length>rn.MAX_GATEWAY_ID_CHARS))return n}}function VS(t,e){let n=t?.trim(),r=e?.trim();return n&&r?`${n}${qo}${r}`:n||r}function KS(t){let e=t.trim(),n="agent:";if(!e.toLowerCase().startsWith(n))return;let r=e.slice(n.length),s=r.indexOf(":");if(s<0)return;let i=r.slice(s+1).trim();return i.length>0?i:void 0}function IU(t){let e=t&&t.includes(qo)?t.slice(0,t.lastIndexOf(qo)):t,r=(e?KS(e)??e:void 0)?.split(":").filter(Boolean)??[];return r.length<2?!1:["channel","chat","dm","group","thread","user"].includes(r[1].trim().toLowerCase())}var pu=class extends AU.EventEmitter{options;client;clientInfo;agents=new Map;serverConnId=null;supportsAgentRegistration=null;isUnknownMethodError(e){return(e instanceof Error?e.message:String(e)).toLowerCase().includes("unknown method")}async ensureGatewayRuntimeRegistration(e,n){try{await this.client.request("agents.register",{agent:{id:e.id,name:e.name??e.id,workspace:n}})}catch(r){if(this.isUnknownMethodError(r))return;this.log(`agents.register follow-up failed (non-fatal): ${r instanceof Error?r.message:String(r)}`)}}constructor(e){super(),this.options=e,this.on("error",()=>{});let{client:n,clientInfo:r}=(0,tg.createAgentIDEGatewayClient)(e.gatewayUrl,e.token,e.version);this.client=n,this.clientInfo=r,this.setupEventHandlers()}setupEventHandlers(){this.client.on("connected",async e=>{this.serverConnId=e.server.connId,this.log(`Connected to Gateway (connId=${this.serverConnId})`),this.emit("connected",e),this.agents.size>0&&await this.reregisterAllAgents()}),this.client.on("disconnected",()=>{this.log("Disconnected from Gateway"),this.emit("disconnected")}),this.client.on("error",e=>{this.log(`Gateway error: ${e.message}`),this.emit("error",e)}),this.client.on("reconnecting",e=>{this.log(`Reconnecting to Gateway (attempt ${e})...`),this.emit("reconnecting",e)}),this.client.on("request",e=>{this.handleServerRequest(e)}),this.client.on("event:agents.updated",e=>{this.emit("agents.updated",e)})}async connect(){return this.log(`Connecting to Gateway at ${this.options.gatewayUrl}...`),this.client.connect(this.clientInfo)}async registerAgent(e){if(this.agents.has(e.id))throw new Error(`Agent ${e.id} is already registered`);let n=(e.workspace??this.resolveOpenClawWorkspaceDir(e.id)).trim();if(!(e.syncOpenClawConfigAgent!==!1))await this.ensureGatewayRuntimeRegistration(e,n);else if(this.supportsAgentRegistration===!1)this.log(`Gateway remote agent management unavailable; using local registration for ${e.id}`);else{try{await this.client.request("agents.create",{name:e.id,workspace:n}),this.supportsAgentRegistration=!0}catch(s){let i=s instanceof Error?s.message:String(s);if(this.isUnknownMethodError(s))this.supportsAgentRegistration=!1,this.log(`Gateway remote agent management rejected (unknown method); using local registration for ${e.id}`);else if(i.toLowerCase().includes("already exists"))await this.client.request("agents.update",{agentId:e.id,workspace:n,name:e.name??e.id}),this.supportsAgentRegistration=!0;else throw s}await this.ensureGatewayRuntimeRegistration(e,n)}this.agents.set(e.id,e),this.log(`Registered agent: ${e.id}`),this.emit("agent.registered",e.id,{needsBinding:!0})}async reregisterAllAgents(){this.log(`Re-registering ${this.agents.size} agent(s) after reconnect...`);for(let e of this.agents.values())try{if(e.syncOpenClawConfigAgent===!1){let r=(e.workspace??this.resolveOpenClawWorkspaceDir(e.id)).trim();await this.ensureGatewayRuntimeRegistration(e,r),this.log(`Re-registered runtime agent: ${e.id}`);continue}if(this.supportsAgentRegistration===!1){this.log(`Skipping remote re-register for ${e.id} (gateway compatibility mode)`);continue}let n=(e.workspace??this.resolveOpenClawWorkspaceDir(e.id)).trim();try{await this.client.request("agents.create",{name:e.id,workspace:n})}catch(r){if((r instanceof Error?r.message:String(r)).toLowerCase().includes("already exists"))await this.client.request("agents.update",{agentId:e.id,workspace:n,name:e.name??e.id});else throw r}await this.ensureGatewayRuntimeRegistration(e,n),this.supportsAgentRegistration=!0,this.log(`Re-registered agent: ${e.id}`)}catch(n){if(this.isUnknownMethodError(n)){this.supportsAgentRegistration=!1,this.log(`Gateway rejected remote agent management during reconnect (unknown method); keeping local registration for ${e.id}`);continue}this.log(`Failed to re-register agent ${e.id}: ${n}`)}this.supportsAgentRegistration===!1&&this.log("Gateway compatibility mode active: inbound routing relies on plugin/session bridge, not agents.register.")}async unregisterAgent(e){if(this.agents.get(e))try{if(this.supportsAgentRegistration===!1){this.agents.delete(e),this.log(`Unregistered local agent: ${e} (gateway compatibility mode)`),this.emit("agent.unregistered",e);return}await this.client.request("agents.delete",{agentId:e,deleteFiles:!1},3e4),this.agents.delete(e),this.log(`Unregistered agent: ${e}`),this.emit("agent.unregistered",e)}catch(r){if(this.isUnknownMethodError(r)){this.supportsAgentRegistration=!1,this.agents.delete(e),this.log(`Gateway rejected remote agent management delete (unknown method); removed local agent ${e} instead`),this.emit("agent.unregistered",e);return}this.log(`Failed to unregister agent ${e}: ${r}`)}}isGatewayCompatMode(){return this.supportsAgentRegistration===!1}resolveOpenClawWorkspaceDir(e){let n=ng.default.join(TU.default.homedir(),".openclaw");return e==="main"?ng.default.join(n,"workspace"):ng.default.join(n,`workspace-${e}`)}async handleServerRequest(e){e.method==="agent.run"?await this.handleAgentRun(e):e.method==="session.new"?await this.handleSessionNew(e):e.method==="agent.cancel"?this.handleAgentCancel(e):this.client.respond(e.id,void 0,!1,{code:"UNKNOWN_METHOD",message:`Unknown method: ${e.method}`})}handleAgentCancel(e){let n=e.params;this.log(`Received agent.cancel (agentId=${n?.agentId}, sessionKey=${n?.sessionKey})`),this.emit("agent.cancel",n),this.client.respond(e.id,{success:!0},!0)}async handleSessionNew(e){let n=e.params;this.log(`Received session.new request from ${n?.requestedBy??"unknown"}`),this.emit("session.new.request",{requestId:e.id,params:n??{}})}respondSessionNew(e,n){this.client.respond(e,n,n.success,n.success?void 0:{code:"SESSION_CREATE_ERROR",message:n.error??"Failed to create session"})}persistHeadlessGatewayOutbound(e,n,r,s,i){let o=e.workspace?.trim();if(!o)return;let a=r.sessionKey?.trim()||i,c=(0,jS.resolveGatewaySessionDirId)({gatewaySessionKey:a});if(!c)return;let l=(0,jS.getGatewayOutboundFilePath)(o,c),u=e.agentId?.trim()||n;(0,bU.upsertGatewayOutboundHandle)(l,u,r,s,{gatewayAgentId:n}).then(f=>{f&&this.log(`Gateway outbound routes: ${l}`)}).catch(f=>{this.log(`Failed to persist outbound handle: ${f instanceof Error?f.message:String(f)}`)})}async handleAgentRun(e){let n=e.params;if(!n?.message||typeof n.message!="string"){this.client.respond(e.id,void 0,!1,{code:"INVALID_PARAMS",message:"message is required"});return}if(n.message.length>tg.MAX_GATEWAY_MESSAGE_CHARS){this.client.respond(e.id,void 0,!1,{code:"MESSAGE_TOO_LARGE",message:`message exceeds ${tg.MAX_GATEWAY_MESSAGE_CHARS} characters`});return}let r=FS(n);if(r){this.client.respond(e.id,void 0,!1,{code:"INVALID_PARAMS",message:`${r} is not a valid string`});return}let s=n.agentId||this.getDefaultAgentId();if(!s){this.client.respond(e.id,void 0,!1,{code:"NO_AGENT",message:"No agent available"});return}let i=this.agents.get(s);if(!i){this.client.respond(e.id,void 0,!1,{code:"AGENT_NOT_FOUND",message:`Agent ${s} not found`});return}this.log(`Running agent ${s} for message: ${n.message.slice(0,50)}...`);let o=VS(n.sessionKey,n.sessionId),a=n.idempotencyKey||`${s}-${Date.now()}`;this.emit("agent.message",{agentId:s,message:n.message,channel:n.channel,sessionKey:n.sessionKey,sessionId:n.sessionId,routeKey:o});try{if(!!(i.useChatUI&&i.chatUIHandler)){this.log(`Routing gateway message to Chat UI for agent ${s} (routeKey=${o??"none"})`),await this.handleAgentRunViaChatUI(e,i,n,a,o);return}let l=i.engineId||"claude";if(!i.messageHandler)throw new Error("No message handler configured for agent");this.log(`Agent ${s} processing message via direct handler, engine=${l}`),this.persistHeadlessGatewayOutbound(i,s,n,a,o);let u=this.client,f="",d="",g=0,p=!1,_=150,h=o,y=()=>{f!==d&&(d=f,g=Date.now(),u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"delta",text:f}))},E={async thinking(){p||(y(),p=!0,u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"thinking"}))},async text(S){p=!1,f+=S,Date.now()-g>=_&&y()},async toolStart(S){y(),u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:S,toolState:"start"})},async toolEnd(S){u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:S,toolState:"end"})},async progress(S){u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:S})},async question(S){return u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:`Question: ${S.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(S){f+=`
585
+ [Error: ${S}]`,u.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"error",message:S})},async done(){}},w=await i.messageHandler(n.message,{engineId:l,sessionId:o,gatewaySessionKey:n.sessionKey,workspaceRoot:i.workspace,emitter:E,peerInfo:n.senderUsername||n.senderName||n.senderId||n.channel?{senderUsername:n.senderUsername,senderName:n.senderName,senderId:n.senderId,channel:n.channel}:void 0});if(!w.success&&w.error)throw new Error(w.error);this.log(`Agent ${s} completed: fullText.len=${f?.length||0}`),f||this.log(`WARNING: Agent ${s} produced empty response!`),y();let A={text:f,runId:n.idempotencyKey};this.client.respond(e.id,A,!0),this.log(`Agent ${s} completed successfully, response length=${f.length}`),this.emit("agent.response",{agentId:s,message:n.message,response:f})}catch(c){this.client.respond(e.id,void 0,!1,{code:"AGENT_ERROR",message:c instanceof Error?c.message:String(c)}),this.log(`Agent ${s} failed: ${c}`)}}async handleAgentRunViaChatUI(e,n,r,s,i){let o=n.id,a=this.client;this.log(`handleAgentRunViaChatUI: agentId=${o}, message="${r.message.slice(0,50)}...", runId=${s}`);let c="",l=!1,u={async thinking(){l||(l=!0,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"thinking"}))},async text(f){l=!1,c+=f,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"delta",text:c})},async toolStart(f){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"tool",toolName:f,toolState:"start"})},async toolEnd(f){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"tool",toolName:f,toolState:"end"})},async progress(f){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"progress",message:f})},async question(f){return a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"progress",message:`Question: ${f.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(f){c+=`
586
+ [Error: ${f}]`,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"error",message:f})},async done(){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"done"})}};try{let f=r.senderUsername||r.senderName||r.senderId||r.channel?{senderUsername:r.senderUsername,senderName:r.senderName,senderId:r.senderId,channel:r.channel}:void 0,d=await n.chatUIHandler(r.message,i,f,u,{params:r,runId:s,agentId:o}),g=c||d;this.log(`Agent ${o} (Chat UI) completed: response.len=${g.length}`),g||this.log(`WARNING: Agent ${o} (Chat UI) produced empty response!`);let p={text:g,runId:r.idempotencyKey};this.client.respond(e.id,p,!0),this.emit("agent.response",{agentId:o,message:r.message,response:g})}catch(f){this.client.respond(e.id,void 0,!1,{code:"CHAT_UI_ERROR",message:f instanceof Error?f.message:String(f)}),this.log(`Agent ${o} (Chat UI) failed: ${f}`)}}getDefaultAgentId(){if(this.agents.size===1){let e=this.agents.keys().next();return e.done?void 0:e.value}}log(e){let n=`[GatewayBridge] ${e}`;this.options.outputChannel&&this.options.outputChannel.appendLine(n),this.emit("log",n)}async disconnect(){for(let e of this.agents.keys())await this.unregisterAgent(e);this.client.close(),this.log("Disconnected from Gateway")}get isConnected(){return this.client.isConnected}get connId(){return this.serverConnId}get registeredAgents(){return Array.from(this.agents.keys())}async reconnect(){this.log("Force reconnecting to Gateway..."),await this.client.reconnect()}async request(e,n){return this.client.request(e,n)}};rn.GatewayBridge=pu;function PU(t){return new pu(t)}});var aA=T(Rn=>{"use strict";var NU=Rn&&Rn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),RU=Rn&&Rn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ja=Rn&&Rn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&NU(n,e,r[s]);return RU(n,e),n}})();Object.defineProperty(Rn,"__esModule",{value:!0});Rn.resolvePackEngineModel=ag;Rn.engineUnavailableReason=rA;Rn.serveCommand=xU;Rn.resolveGatewaySessionKey=sA;Rn.runGatewayTurn=cg;Rn.runBridgeTurn=iA;var rg=Ja(require("crypto")),_n=Ja(require("fs")),qS=Ja(require("os")),CU=Ja(require("http")),En=Ja(require("path")),mu=require("node:crypto"),kU=Aw(),Wa=xi(),Kn=Ho(),gu=Ep(),$U=Ap(),Xi=jo(),DU=La(),YS=nu(),JS=$w(),qa=Bw(),XS=Yw(),is=Pp(),LU=si(),Wn=Ui(),Us=ji(),R=en(),MU=Cp(),sg=fS(),fe=ur(),Yo=As(),ig=gS(),hu=jo(),GU=So(),ht=Vi(),zS=Cr(),UU=Hp(),QS=vo(),zi=Ii(),ZS=gf(),os=NS(),di=GS(),HU=US(),og=eg(),jU=Qs(),eA=Li(),Ya="-".repeat(62);function ag(t,e){let n=(e.engine||t.spec.engine||(0,Us.getDefaultConfig)().engine).trim().toLowerCase(),r=["claude","codex"].includes(n)?void 0:(0,jU.tryResolveCustomEngineManifest)(e.workspace,n)?.model?.defaultModel,s=e.model||t.spec.model||r||(0,Us.getEnvDefaultModel)()||(0,Us.getDefaultConfig)().model;return{engine:n,model:(0,Wn.resolveModelAlias)(s)}}function rA(t,e){if(!(0,Us.hasCredentialForEngine)(t,e.apiConfig))return`no usable API key for engine "${t}" (${t==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"} or the LiteLLM proxy)`;if(!e.engineRunsInSandbox&&t==="claude"&&!e.claudeCodePath)return"Claude Code CLI not found on this host";if(!e.engineRunsInSandbox&&t==="codex"&&!e.codexPath)return"Codex CLI not found on this host"}async function xU(t){process.env.AGENTHIPPO_SERVE="1";let e=(0,Us.getApiConfig)();e.useLiteLLM&&!e.litellmApiKey&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} AGENTHIPPO_LITELLM_BASE_URL is set without AGENTHIPPO_LITELLM_API_KEY \u2014 gateway calls will authenticate as 'sk-dummy' (a strict gateway will 401). Provider keys are never sent to the gateway.`);let n,r=t.verbose?new Wn.ConsoleLogger("[Sync]"):new Wn.NoOpLogger;try{n=await(0,Us.loadAgentPack)(t.agent,t.workspace)}catch(m){console.error(`Error: ${m instanceof Error?m.message:m}`),process.exit(1)}let s=n.manifest.metadata.name,i=(0,HU.resolveCliGatewayAgentId)(s),o=ag(n.manifest,t),a=o.engine,c=o.model,l=n.manifest.spec.cheapModel?.trim(),u=l?(0,Wn.resolveModelAlias)(l):void 0,f=n.manifest.spec.effort?.trim()||void 0;if(!(0,Us.hasCredentialForEngine)(a,e)){console.error(`Error: No usable API key for engine "${a}". Set ${a==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}, or configure the LiteLLM proxy (AGENTHIPPO_LITELLM_API_KEY + AGENTHIPPO_LITELLM_BASE_URL).`);for(let v of(0,R.getLiteLLMQuickstartHintLines)())console.error(v);process.exit(1)}let d=t.verbose?new Wn.ConsoleLogger("[Server]"):new Wn.NoOpLogger,g=n.packPath,p=n.manifest.metadata.version??"0.0.0",_,h=await(0,Kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL}),y=(m,v="pack")=>{for(let x of m.warnings)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${x}`);m.status==="unavailable"&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${v} trust root is configured but unusable: ${m.reason}`)};y(h);let E=(0,Kn.createPackVerifier)(),w={ok:!1,kind:"no-pack",reason:"not verified"},A=(m,v)=>(w=E.refresh({packDir:m,pack:s,packVersion:v,keys:h.keys}),_=w.ok?w.claims.digest:void 0,d.info(w.ok?`[Pack] signature verified for ${s}`:`[Pack] unverified \u2014 ${w.reason}`),w),S=m=>{if(m.ok)return"";let v=h.status==="unavailable"&&m.kind==="no-trust-root"?"trust-root-unavailable":m.kind;return(0,Kn.describePackRefusal)({kind:v,detail:v==="trust-root-unavailable"?h.reason??m.reason:m.reason,pack:s,packVersion:p,packDir:g,trustRootHint:h.url?`Trust root: ${h.url} (${h.reason??"unavailable"})`:h.reason})};A(g,p);let C=!!t.allowUnsignedPack||(0,Kn.allowUnsignedPackFromEnv)();w.ok||(C||(console.error(`${R.COLORS.red}Error: ${S(w)}${R.COLORS.reset}`),process.exit(1)),console.warn(Ya),console.warn(`${R.COLORS.yellow}!! RUNNING AN UNVERIFIED PACK \u2014 signature checking is DISABLED on this instance.${R.COLORS.reset}`),console.warn(`${R.COLORS.yellow}!! ${w.reason}${R.COLORS.reset}`),console.warn(`${R.COLORS.yellow}!! Whatever is in ${g} will be executed, verified by nobody.${R.COLORS.reset}`),console.warn(`${R.COLORS.yellow}!! This is a LOCAL DEVELOPMENT setting (AGENTHIPPO_ALLOW_UNSIGNED_PACK). Do not ship it.${R.COLORS.reset}`),console.warn(Ya));let b=(0,R.findBundledBasePromptsDir)();await(0,Wn.syncPackToWorkspace)(t.workspace,n.packPath,s,a,r,b),console.log(`OK: Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),console.log(`agenthippo pack=${n.manifest.metadata.name}@${n.manifest.metadata.version} engine=${a}`);let{dir:I,ephemeral:P}=(0,fe.resolveStateDir)(t.stateDir),L=(0,fe.resolveBindHost)(t.host);for(let m of(0,fe.identityHeaderAdvice)(process.env,L))console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`);let N=(0,fe.tenantIsolationAdvice)({sandbox:t.sandbox,sharedWorkspace:!!t.sharedWorkspace,workspace:t.workspace,stateDir:I});if(N.level==="refuse"){for(let m of N.lines)console.error(`${R.COLORS.red}Error:${R.COLORS.reset} ${m}`);console.error(`Refusing to start because ${fe.REQUIRE_TENANT_ISOLATION_ENV} is set. Unset it to downgrade this to a warning.`),process.exit(1)}for(let m of N.lines)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`);let O=(0,fe.resolveAnalyticsSessionsDir)(I,P),G=new QS.SessionEventWriter(O),H=m=>v=>G.append(m,(0,zi.generateRequestId)(),"warrant_denied",{reason:v}),X=(0,ht.resolveDataPlaneConfig)(n.manifest.spec,n.packPath),J=(0,ht.resolveEdgeDataPlane)(),W=J?new ht.EdgeDataPlane(J):null,ee=W?null:(0,ht.resolveRemoteDataPlane)(),le=ee?new ht.RemoteDataPlane(ee):null,pe=X&&!le&&!W||t.gatewayBridge?new ht.TurnRegistry:null,We=(m,v,x)=>G.append(m,(0,zi.generateRequestId)(),v,{...x,agent:{pack:s,version:p,digest:_??null}}),Ue=null,vt=null;if(W)process.env[ht.DATA_MCP_URL_ENV]=W.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,delete process.env.AGENTHIPPO_DATA_PLANE_CONTROL_URL,console.log(`OK: Data plane EDGE-registered \u2014 gateway ${W.url}; turn nonces are minted at the edge, serve holds no registration credential`);else if(le)process.env[ht.DATA_MCP_URL_ENV]=le.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,console.log(`OK: Data plane SIDECAR \u2014 gateway ${le.url}; base credentials stay in the connector container, not here`);else if(X)try{Ue=await ht.DataPlane.start(X,{logger:t.verbose?new Wn.ConsoleLogger("[DataPlane]"):new Wn.NoOpLogger,audit:We,registry:pe??void 0}),process.env[ht.DATA_MCP_URL_ENV]=Ue.url,console.log(`OK: Data gateway (provider=${Ue.broker.provider.name}) on loopback \u2014 connector: ${X.connectorPath}`);let m=Ue.broker.provider;m instanceof ht.StoredGrantProvider&&(vt=(0,ht.createConnectHandler)({provider:m,browserUser:v=>(0,fe.resolveUserId)(v.headers,void 0),audit:We}),console.log(m.connectBaseUrl?`OK: Personal connections \u2014 consent pages at ${m.connectBaseUrl}/connect/ (route it through the identity edge)`:`${R.COLORS.yellow}Warning:${R.COLORS.reset} provider=stored-grant without AGENTHIPPO_CONNECT_BASE_URL \u2014 users cannot connect accounts`),m.cfg.ticketOnly&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} AGENTHIPPO_CONNECT_TICKET_ONLY=1 \u2014 connect links are accepted without a verified browser identity. Single-user development only.`))}catch(m){console.error(`${R.COLORS.red}Error: failed to start the data-plane gateway:${R.COLORS.reset} ${m instanceof Error?m.message:m}`),process.exit(1)}let xe=(0,zS.readOpenClawGatewayToken)();delete process.env.OPENCLAW_GATEWAY_TOKEN;let dt=null,yn=async m=>{if(W){let K=m.edgeNonce?.trim();if(!K)return console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} edge data plane active but no ${ht.TURN_NONCE_HEADER} header on this turn \u2014 data tools will fail closed (check the edge route's forward_auth)`),null;let re=W.adoptTurn(K),Be={...re.env};return dt&&(Be[ht.EGRESS_URL_ENV]=dt.url),{nonce:re.nonce,env:Be,release:re.release}}if(le){let K=await le.registerTurn({...m,agent:{pack:s,version:p,digest:_}}),re={...K.env};return dt&&(re[ht.EGRESS_URL_ENV]=dt.url),{nonce:K.nonce,env:re,release:K.release}}if(!pe)return null;let{nonce:v,release:x}=pe.register(m),ie={[ht.TURN_NONCE_ENV]:v};return Ue&&(ie[ht.DATA_MCP_URL_ENV]=Ue.url),dt&&(ie[ht.EGRESS_URL_ENV]=dt.url),{nonce:v,env:ie,release:x}},zn=m=>{if(!W)return;let v=m[ht.TURN_NONCE_HEADER];return Array.isArray(v)?v[0]:v},it=new Map,sn=600*1e3,_i=1e4,Vr=new Map,se=30*1e3,Ei=300*1e3,D=(m,v)=>{if(Vr.size>=_i&&!Vr.has(m)){let x=Vr.keys().next();x.done||Vr.delete(x.value)}Vr.set(m,Date.now()+v)},ae=async(m,v)=>{let x=v[ht.ASSERTION_HEADER],ie=(Array.isArray(x)?x[0]:x)?.trim();if(!ie||!e.baseUrl)return;let K=it.get(m);if(K!==void 0&&K>Date.now())return;let re=Vr.get(m);if(re!==void 0&&re>Date.now()||(await ye.get())?.billUsers!==!0)return;let Be=e.baseUrl.replace(/\/+$/,""),cn=Be.endsWith("/v1")?`${Be}/credits`:`${Be}/v1/credits`;try{let He=await fetch(cn,{headers:{Authorization:`Bearer ${ie}`},signal:AbortSignal.timeout(5e3)});if(He.ok){let Ss=await He.json().catch(()=>{});if(Ss!==void 0&&(Ss.enabled===!1||typeof Ss.email=="string"&&Ss.email.trim().toLowerCase()===m.trim().toLowerCase())){if(it.size>=_i&&!it.has(m)){let Yr=it.keys().next();Yr.done||it.delete(Yr.value)}it.set(m,Date.now()+sn)}else D(m,Ei),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} billUsers is on but the assertion's account (${Ss?.email??"unknown"}) does not match this turn's user \u2014 the turn may be refused as identity-not-billable`)}else D(m,He.status>=500?se:Ei),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} billUsers is on but the gateway did not open a credit account for this turn's user (GET ${cn} \u2192 ${He.status}) \u2014 the turn may be refused as identity-not-billable`)}catch(He){D(m,se),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} billUsers is on but the credit-account check failed (${He instanceof Error?He.message:String(He)}) \u2014 the turn may be refused as identity-not-billable`)}},oe=new fe.TurnLimiter(t.maxTurnsPerSession??0),Ne=Number(process.env.AGENTHIPPO_SERVE_RATE_LIMIT??120),jt=new fe.RateLimiter(Number.isFinite(Ne)?Ne:120),Q=(0,fe.createTurnGateFromEnv)(),_t=(0,fe.createRejectionWarner)(),on;if(t.wwwDir?.trim()){let m=En.join(En.resolve(t.wwwDir.trim()),"index.html");try{on=_n.readFileSync(m,"utf8")}catch{console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} --www-dir set but unreadable: ${m}`)}}P&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} Session state is in a tmpdir (ephemeral). Pass --state-dir or set AGENTHIPPO_HOME to persist sessions across restarts.`);let ve=(0,di.resolveS3StateConfig)(),xt=(0,di.resolveRestoreBootMode)();ve&&(await(0,di.isAwsCliAvailable)()||(console.error(`${R.COLORS.red}Error: AGENTHIPPO_STATE_S3_URI is set but the \`aws\` CLI was not found.${R.COLORS.reset}`),console.error(" State sync requires the AWS CLI (S3-compatible via --endpoint-url). Install it or unset AGENTHIPPO_STATE_S3_URI."),process.exit(1)),xt==="all"?(console.log(`State sync: boot-restore from ${ve.uri} \u2026`),await(0,di.restoreState)(ve,I,m=>console.log(` ${m}`))):console.log(`State sync: restore-on-miss from ${ve.uri} (boot restore disabled)`));let Ot=ve?(0,di.makeStatePusher)(ve,I,t.verbose?m=>console.error(m):void 0):null,kn=t.verbose?m=>console.error(m):void 0,an=async m=>{ve&&await(0,di.ensureSessionLocal)(ve,I,m,kn)},ws=(0,R.findClaudeCodePath)(),ao=(0,R.findCodexPath)(),co=t.sandbox==="container";if(!co&&a==="claude"&&!ws){console.error(`${R.COLORS.red}Error: Claude Code CLI not found.${R.COLORS.reset}`);let m=(0,Wa.getUnsupportedClaudePlatformHint)();m&&console.error(` ${m}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),process.exit(1)}!co&&a==="codex"&&!ao&&(console.error(`${R.COLORS.red}Error: Codex CLI not found.${R.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),process.exit(1));let Ws=m=>rA(m,{apiConfig:e,engineRunsInSandbox:co,claudeCodePath:ws,codexPath:ao}),ca=new Wn.AutoApprovePermissionHandler,yi={fileAccess:(0,Us.getFileAccess)(n)},wi,la=!1,lo=m=>{let v=(0,Xi.policyVersion)(m);la&&v===wi||(la=!0,wi=v,G.append("serve",(0,zi.generateRequestId)(),"policy_applied",{instance_id:j,policy_version:v??null,pack_digest:_??null,engine_version:(0,Wa.installedEngineVersion)(a)??null,tier:t.sandbox==="container"?2:t.sandbox?0:null,enabled:m?.enabled??null,pinned_version:m?.version??null,caps:m?.caps??null,deny_count:m?.deny?.length??0}))},uo,Tr=En.join(I,"packs"),Qu=async(m,v)=>(await(0,$U.downloadFromStore)({type:"pack",slug:m,version:v})).map(ie=>({path:ie.path,content:ie.content})),fo=async m=>{if(!t.pullPacks||!m||m===p)return;let v=async re=>{try{return ag((await(0,Us.loadAgentPack)(re,t.workspace)).manifest,t)}catch{return}},x=En.join(Tr,m),ie=_n.existsSync(En.join(x,"agent.yaml"))?await v(x):void 0;if(ie){let re=Ws(ie.engine);if(re){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} cannot converge to ${s}@${m}: it runs engine "${ie.engine}" \u2014 ${re}. Still serving @${p} on ${a}.`);return}}let K=await(0,gu.reconcilePinnedPack)({pack:s,currentVersion:p,pinnedVersion:m,packsRoot:Tr,download:Qu,publicKeysByKid:h.keys,logger:{info:re=>d.info(re),warn:re=>d.info(re)}});if(K.ok){if(!ie){ie=await v(K.packDir);let re=ie?Ws(ie.engine):"its manifest is unreadable";if(re){(0,gu.promoteCurrent)(Tr,En.join(Tr,p)),console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} cannot converge to ${s}@${m}: ${ie?`it runs engine "${ie.engine}" \u2014 `:""}${re}. Still serving @${p} on ${a}.`);return}}p=K.version,g=K.packDir,A(g,p),(ie.engine!==a||ie.model!==c)&&(d.info(`[Pack] ${s}@${p}: engine ${a} \u2192 ${ie.engine}, model ${c} \u2192 ${ie.model} (new sandboxes; running ones drain)`),a=ie.engine,c=ie.model);try{await(0,Wn.syncPackToWorkspace)(t.workspace,g,s,a,r,b)}catch(re){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} workspace sync for ${s}@${p} failed: ${re instanceof Error?re.message:String(re)}`)}d.info(`[Pack] now serving ${s}@${p} (engine ${a}, model ${c}) from ${K.packDir}`);return}console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} cannot converge to ${s}@${m}: ${K.reason}. Still serving @${p}.`)},qs=(0,is.loadWarrantKeypair)(d),po=process.env[ig.TURN_COST_ENV]?.trim()==="1",ua=m=>po&&Z!==void 0&&String(m.headers[ig.TURN_COST_HEADER]??"").trim()==="1",da=m=>(0,ig.fetchTurnCost)({gatewayBaseUrl:e.baseUrl??"",key:qs,jtis:m}),Z,j=(()=>{try{let m=En.join((0,fe.resolveStateDir)(t.stateDir).dir,"instance-id");if(_n.existsSync(m))return _n.readFileSync(m,"utf-8").trim();let v=`${qS.hostname()}-${rg.randomBytes(4).toString("hex")}`;return _n.mkdirSync(En.dirname(m),{recursive:!0}),_n.writeFileSync(m,v),v}catch{return`${qS.hostname()}-${rg.randomBytes(4).toString("hex")}`}})(),Re={get:()=>n?.manifest.metadata.version},Oe=(0,Xi.resolveLeasePollSeconds)(t.leasePollSeconds),Le=await(0,Kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});Le.explicitlyConfigured&&y(Le,"lease");let Te=(0,Kn.checkTrustRootSeparation)(Le,h);for(let m of Te.warnings)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} [TrustRoot] ${m}`);Te.fatal&&(console.error(`Error: [TrustRoot] ${Te.fatal}`),process.exit(1));let ft=!1,Xt=()=>{let m=(0,Kn.selectLeaseSigningKeys)(Le,h);return m.packFallback&&!ft&&(ft=!0,console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} verifying signed leases against the PACK trust root \u2014 no lease trust root is configured on this instance. The control plane publishes lease keys under purpose \`lease-signing\` and refuses to register one kid under two purposes, so this stops working the moment the plane rotates to a dedicated lease key \u2014 and requireSignedLease is sticky with no plane-side undo, so that failure cannot be fixed from the console. Set ${Kn.LEASE_JWKS_URL_ENV}=https://<plane>/.well-known/jwks.json?purpose=lease-signing (or ${Kn.LEASE_SIGNING_KEYS_ENV} with inline {"<kid>":"<public PEM>"} for an air-gapped install).`+(Le.reason?` The derived lease trust root is unusable: ${Le.reason}`:""))),m.keys},Ct=(()=>{if(t.staticLeaseFile)try{let m=(0,DU.parseLease)(JSON.parse(_n.readFileSync(t.staticLeaseFile,"utf-8")));if(!m.ok)throw new Error(m.reason);for(let v of m.warnings)console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} [Lease] --static-lease: ${v}`);return m.lease}catch(m){console.error(`Error: --static-lease ${t.staticLeaseFile} is not a usable lease: ${m instanceof Error?m.message:m}`),process.exit(1)}})(),tt=En.join(I,"lease.json"),Ce={load:()=>{if(!_n.existsSync(tt))return;let m=JSON.parse(_n.readFileSync(tt,"utf-8"));if(m&&typeof m=="object"&&typeof m.body=="string"&&typeof m.lastGoodAt=="number")return m},save:m=>{_n.mkdirSync(En.dirname(tt),{recursive:!0});let v=`${tt}.tmp`;_n.writeFileSync(v,JSON.stringify(m)),_n.renameSync(v,tt)}},ye=(0,Xi.createLeaseSource)({url:process.env.AGENTHIPPO_LEASE_URL,staticLease:Ct,persistence:Ce,identity:()=>({instance:j,pack:s,version:Re.get(),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,sandboxes:Z?.sandboxes().length,engine:a,engineversion:(0,Wa.installedEngineVersion)(a),...t.model?{model:t.model}:{},...process.env.AGENTHIPPO_ADVERTISED_URL?.trim()?{url:process.env.AGENTHIPPO_ADVERTISED_URL.trim()}:{},...process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()?{"enroll-token":process.env.AGENTHIPPO_ENROLL_TOKEN.trim()}:{}}),cacheSeconds:(0,Xi.leaseCacheSecondsFor)(Oe),signingKeys:()=>Xt(),requireSignedLease:t.requireSignedLease,instanceId:j,...t.leaseMaxStalenessSeconds!==void 0?{maxStalenessSeconds:t.leaseMaxStalenessSeconds}:{},logger:{info:m=>d.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}),Qn=async()=>{if(h.status!=="configured"){let m=await(0,Kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});m.status==="configured"&&(h=m,y(m),d.info(`[Pack] signing keys now available (${Object.keys(m.keys).length}); re-verifying`),A(g,p))}if(Le.status!=="configured"){let m=await(0,Kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});m.status==="configured"&&(Le=m,m.explicitlyConfigured&&y(m,"lease"),d.info(`[Lease] lease-signing keys now available (${Object.keys(m.keys).length})`))}};ye.get().then(lo).catch(()=>{});{let m=Oe*1e3;setInterval(()=>{ye.get().then(lo).catch(()=>{}),Qn().catch(()=>{})},m).unref?.()}if(t.pullPacks){_n.mkdirSync(Tr,{recursive:!0});let m=En.join(Tr,p);_n.existsSync(m)||_n.cpSync(n.packPath,m,{recursive:!0}),(0,gu.promoteCurrent)(Tr,m),g=En.join(Tr,gu.CURRENT_LINK),await fo((await ye.get())?.version),A(g,p)}if(Re.get=()=>p,uo=(0,MU.createPackRunner)({storagePath:I,analyticsSessionsDir:O,packId:s,packVersion:p,provenance:()=>({policyVersion:wi,packDigest:_,engineVersion:(0,Wa.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:j}),workspaceRoot:t.workspace,credentials:{apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey},logger:d,permissionHandler:ca,claudeCheapModel:u,effort:f,omitGatewayToken:!0}),t.pullPacks){let m=Oe*1e3;setInterval(()=>{ye.get().then(x=>fo(x?.version)).catch(()=>{})},m).unref?.()}let go=!!t.sharedWorkspace,br=t.sandboxScope==="user"?"user":"session",we=t.sandbox==="container"?{readonly:[`${g}:${qa.SANDBOX_PACK_DIR}`],writable:[`${t.workspace}:${qa.SANDBOX_WORKSPACE_DIR}`]}:void 0;we&&go&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} --shared-workspace: every session's sandbox mounts ${t.workspace} read-write, so sessions can read and overwrite each other's files. Only safe when all sessions belong to one trust domain.`);let wn;we&&t.sandboxImage&&(await(0,is.alignSandboxWorkspaceOwnership)({exec:is.dockerExec,image:t.sandboxImage,writable:we.writable,logger:{info:m=>d.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}),wn=await(0,is.resolveSandboxImageUser)(is.dockerExec,t.sandboxImage));let Zn=m=>(0,is.ensureSandboxStateDir)(En.join(I,"sandbox-state",(0,di.safeSessionId)(m)),wn),Kr=async m=>{if(!we)return{readonly:[],writable:[]};if(go)return we;let v=(0,is.ensureSandboxStateDir)(En.join(I,"sandbox-workspace",(0,di.safeSessionId)(m)),wn);return{readonly:we.readonly,writable:[`${v}:${qa.SANDBOX_WORKSPACE_DIR}`]}},Ys=(m,v,x)=>{if((0,Kn.resolveRequireSignedPack)({lease:m?.requireSignedPack,localRequire:t.requireSignedPack,localAllowUnsigned:C})){let K=E.verify({packDir:g,pack:s,packVersion:p,keys:h.keys});if(K!==w&&(w=K,_=K.ok?K.claims.digest:void 0),!K.ok)throw new Xi.LeaseDeniedError(S(K))}(0,Xi.assertAdmitted)(m,{pack:s,version:p,image:t.sandboxImage,sessionKey:v,userHash:fe.userNamespaceHash,userId:x})},ho=t.sandbox==="container"?new qa.ContainerSandboxDriver({exec:is.dockerExec,socketOwner:wn,owner:rg.createHash("sha256").update(`${s}\0${I}`).digest("hex").slice(0,16),heartbeatDir:En.join(I,"sandbox-instances"),logger:{info:m=>d.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}):void 0;if(ho){let m=!1,v=async()=>{if(!m){m=!0;try{let x=await ho.sweepOrphans();x.length&&console.log(`OK: Removed ${x.length} sandbox(es) left by a previous serve`)}catch(x){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} sandbox orphan sweep failed: ${x instanceof Error?x.message:String(x)}`)}finally{m=!1}}};await v(),setInterval(()=>{try{ho.beat()}catch{}v()},qa.ORPHAN_SWEEP_INTERVAL_MS).unref()}let Wr=t.sandbox?(0,kU.createSandboxRunner)({driver:ho??new XS.ProcessSandboxDriver({command:process.execPath,args:[...(0,is.sandboxScriptArg)(),"sandbox","--agent",g,"--stdio","--state-dir",I,"--workspace",t.workspace],namespaceIsolation:(0,XS.namespaceIsolationFromEnv)(),logger:{info:m=>d.info(m),warn:m=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${m}`)}}),image:t.sandboxImage??"",tier:t.sandbox==="container"?2:0,...we?{fs:we,fsFor:Kr,stateDirFor:Zn}:{},routes:[...process.env.AGENTHIPPO_DATA_MCP_URL?[{kind:"data",target:process.env.AGENTHIPPO_DATA_MCP_URL}]:[],...e.baseUrl?[{kind:"inference",target:e.baseUrl}]:[]],limits:{ttlSeconds:t.sandboxTtlSeconds??1800},env:Object.fromEntries(["AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_SERVE",eA.ENGINE_IDLE_TTL_ENV].filter(m=>process.env[m]).map(m=>[m,process.env[m]])),provenanceEnv:()=>(0,zS.buildProvenanceEnv)({policyVersion:wi,packDigest:_,engineVersion:(0,Wa.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:j}),admit:async({sessionKey:m})=>{let v=await ye.get();Ys(v,m)},inferenceBaseUrl:e.baseUrl,mintModelToken:async(m,v)=>{let x=(0,Yo.currentCredential)()?.userId?.trim()||`anon:${v}`,ie=await ye.get(),K=ie?.budget,re=K===void 0?void 0:K.scope==="user"?`user:${x}`:`session:${v}`,Be=(0,mu.randomUUID)();return(0,Yo.currentCredential)()?.warrantJtis?.push(Be),(0,is.mintSandboxInferenceWarrant)(qs,{jti:Be,user:x,pack:s,packVersion:p,sandboxId:m,tier:t.sandbox==="container"?2:0,ttlSeconds:(0,LU.warrantTtlFromEnv)(),...ie?.billUsers===!0?{billing:"user"}:{},...re?{budgetKey:re}:{},...K?.windowSeconds?{budgetWindowSeconds:K.windowSeconds}:{}})},logger:d,runtime:{logger:d,editTracker:void 0,configProvider:void 0,permissionHandler:ca}}):void 0;Z=Wr??void 0;let Zu=m=>typeof m=="number"&&Number.isFinite(m)&&m>0?m:void 0,uc={...(0,YS.capsFromEnv)(),...Zu(t.maxTurnsPerSession)!==void 0?{maxTurnsPerSession:t.maxTurnsPerSession}:{},...Zu(t.maxSessionSeconds)!==void 0?{maxSessionSeconds:t.maxSessionSeconds}:{},...Zu(t.maxConcurrentSandboxes)!==void 0?{maxConcurrentSandboxes:t.maxConcurrentSandboxes}:{},...t.capOnBreach?{onBreach:t.capOnBreach}:{}},Hh=uc.maxTurnsPerSession!==void 0||uc.maxSessionSeconds!==void 0||uc.maxConcurrentSandboxes!==void 0,Ob={sandboxes:()=>[],destroySession:async()=>{},revokeRoute:async()=>{},supportsInFlightTermination:!1},qr=!!(Wr||process.env.AGENTHIPPO_LEASE_URL||Hh)?(0,JS.createGovernor)({caps:(0,YS.mergeCaps)((await ye.get())?.caps,uc),sandboxes:Wr??Ob,getLease:()=>ye.get(),pollSeconds:Oe,pack:s,userHash:fe.userNamespaceHash,...Wr?{}:{admitPack:(m,v)=>{try{return Ys(v,m),{allowed:!0}}catch(x){return{allowed:!1,reason:x instanceof Error?x.message:String(x)}}}},logger:d,audit:(m,v)=>We(String(v.sessionKey??"instance"),m,v)}):void 0;Hh&&!Wr&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} caps are configured but --sandbox is not set. Turn and duration caps still refuse the turn; the concurrency cap and route revocation need sandboxes, so those are IGNORED.`),Wr||setInterval(()=>{try{uo.runMaintenance?.()}catch(v){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} engine maintenance failed: ${v instanceof Error?v.message:String(v)}`)}},(0,eA.engineMaintenanceIntervalMs)()).unref();let jh=Wr??uo,fa=qr?(0,JS.withGovernor)(jh,qr):jh;if(qr){qr.start();let m=qr.policy(),v=(0,Xi.effectiveKillLatencySeconds)(Oe);d.info(`[Serve] control plane: caps turns=${m.maxTurnsPerSession??"\u221E"} session=${m.maxSessionSeconds??"\u221E"}s sandboxes=${m.maxConcurrentSandboxes??"\u221E"} onBreach=${m.onBreach??"revoke-inference"}; lease poll ${Oe}s (worst-case kill latency ${v}s; an admin refresh is immediate)`),Wr||d.info("[Serve] no sandbox driver: a deny rule with mode=kill takes effect as DRAIN \u2014 the in-flight turn finishes and only the next one is refused.");let x=ye.status();process.env.AGENTHIPPO_LEASE_URL&&!x.requireSignedLease&&d.info("[Serve] lease signature is NOT required \u2014 set --require-signed-lease (or lease.requireSignedLease) once the control plane signs leases.")}let Js=(0,fe.resolveServiceIdentity)();Js.error&&(console.error(`${R.COLORS.red}Error:${R.COLORS.reset} ${Js.error}`),process.exit(1)),Js.warning&&console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${Js.warning}`);let ed=!!process.env.AGENTHIPPO_LEASE_URL,Ib=async()=>{if(!Js.identity)return;let m=(0,hu.resolveAllowServiceTurns)({lease:(await ye.get())?.allowServiceTurns,managed:ed});if(!m.allowed){We("service-turn","service_turn_denied",{identity:(0,GU.hashIdentity)(Js.identity),gate:m.gate,detail:(0,hu.describeServiceTurnGate)(m.gate)});return}return Js.identity};if(Js.identity){let m=(0,hu.resolveAllowServiceTurns)({lease:void 0,managed:ed});d.info(`[Serve] unattended runs: identity configured (${fe.SERVICE_USER_ENV}); `+(ed?"the control plane decides per turn via lease.allowServiceTurns \u2014 absent means deny":(0,hu.describeServiceTurnGate)(m.gate)))}Wr&&(d.info(`[Serve] sandbox mode: ${t.sandbox} (tier ${t.sandbox==="container"?2:0}) \u2014 engines run in per-session sandboxes`),e.baseUrl||console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} --sandbox without an inference proxy: a sandbox holds no provider key, so model calls will fail 401. Set AGENTHIPPO_LITELLM_BASE_URL.`));let dc=null,fc=!1,pa,td=CU.createServer(async(m,v)=>{let x=(0,fe.corsHeaders)();for(let[ie,K]of Object.entries(x))v.setHeader(ie,K);if(m.method==="OPTIONS"){v.writeHead(204),v.end();return}try{if(m.method==="GET"&&m.url==="/health"){let K={status:"ok"};K.evidence_ship_enabled=!!pa;let re=pa?.lastOkAt();re!==void 0&&(K.evidence_ship_last_ok_at=new Date(re).toISOString());let Be=(0,sg.getEvidenceShipStatus)();K.evidence_ship_disabled_reason=Be.disabledReason??null,K.evidence_ship_consecutive_failures=Be.consecutiveFailures,K.evidence_records_staged=Be.recordsStaged,K.evidence_records_shipped=Be.recordsShipped,K.evidence_records_skipped_too_old=Be.recordsSkippedTooOld,K.evidence_files_skipped_too_old=Be.filesSkippedTooOld,K.evidence_content_capture=Be.contentCapture,Be.lastHeartbeatAt!==void 0&&(K.evidence_ship_last_heartbeat_at=new Date(Be.lastHeartbeatAt).toISOString());let cn=(0,QS.getSessionEventWriterStats)();K.evidence_writes_ok=cn.written,K.evidence_writes_failed=cn.failed,cn.lastError&&(K.evidence_write_last_error={at:new Date(cn.lastError.at).toISOString(),event_type:cn.lastError.eventType,message:cn.lastError.message});let He=ye.status();K.lease_configured=!!process.env.AGENTHIPPO_LEASE_URL,K.lease_signed=He.signed,K.lease_signature_required=He.requireSignedLease,K.lease_staleness_seconds=He.stalenessSeconds??null,K.lease_fail_closed=He.failClosed,K.pack_signature_ok=w.ok,K.pack_signature_required=(0,Kn.resolveRequireSignedPack)({localRequire:t.requireSignedPack,localAllowUnsigned:C}),K.pack_trust_root=h.status,K.lease_trust_root=Le.status,K.lease_trust_root_source=Le.explicitlyConfigured?"lease":"pack-fallback",K.kill_in_flight_supported=!!Wr,v.writeHead(200,{"Content-Type":"application/json"}),v.end(JSON.stringify(K));return}if(m.method==="GET"&&m.url==="/ready"){v.writeHead(fc?200:503,{"Content-Type":"application/json"}),v.end(JSON.stringify({ready:fc,inflight:Q.inflight,queued:Q.queued,max:Q.max,calls:mo.active,calls_max:mo.max,voice_inflight:xh.inflight}));return}let ie=m.url?.split("?")[0]??"";if(vt&&ie.startsWith("/connect/")&&await vt(m,v))return;if(m.method==="GET"&&on&&(ie==="/"||ie==="/index.html")){v.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),v.end(on);return}if(m.method==="POST"&&ie==="/v1/chat"){let K=await tA(m),re=(0,fe.resolveUserId)(m.headers,K),Be=(0,fe.resolveDataToken)(m.headers),cn=(0,fe.resolveUserId)(m.headers,void 0)??(0,fe.clientIp)(m);if(!jt.tryConsume(cn)){v.writeHead(429,{"Content-Type":"application/json","Retry-After":String(jt.retryAfterSeconds(cn))}),v.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:Ss,rejected:_o}=(0,fe.resolveServeSessionKey)(K.session_id,re,br);if(_o){G.append("unverified",(0,zi.generateRequestId)(),"warrant_denied",{reason:_o}),v.writeHead(403,{"Content-Type":"application/json"}),v.end(JSON.stringify({error:"verified user identity required"}));return}let Yr=qr?.atCapacity(He);if(Yr){_t(`Sandbox cap: rejecting /v1/chat (${Yr})`),(0,fe.writeAtCapacity)(v,Yr);return}let ga=await Q.acquire();if(!ga){_t(`TurnGate: rejecting /v1/chat (inflight=${Q.inflight} queued=${Q.queued} max=${Q.max})`),(0,fe.writeAtCapacity)(v);return}let Si=null,ha=Ai=>{v.writeHead(200,{"Content-Type":"application/json"}),v.end(JSON.stringify(Ai)),Ot?.schedule(He)},Eo;try{if(!oe.tryConsume(He)){v.writeHead(429,{"Content-Type":"application/json"}),v.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await an(He),re?.trim()&&(Si=await yn({userId:re.trim(),sessionKey:He,inboundToken:Be,edgeNonce:zn(m.headers)}),await ae(re.trim(),m.headers));let Ai=ua(m),ma={userId:re,dataToken:Be,...Ai?{warrantJtis:[]}:{}},pc=await(0,Yo.runWithCredential)(ma,()=>nA(fa,K,He,Ss,a,c,t.workspace,yi,re,Si?.env),{onDenied:H(He)});if(pc.atCapacity){(0,fe.writeAtCapacity)(v,pc.error);return}if(!Ai){ha(pc);return}Eo={result:pc,jtis:ma.warrantJtis??[]}}finally{await Si?.release(),ga()}ha({...Eo.result,cost:await da(Eo.jtis)});return}if(m.method==="POST"&&ie==="/v1/chat/stream"){let K=await tA(m),re=(0,fe.resolveUserId)(m.headers,K),Be=(0,fe.resolveDataToken)(m.headers),cn=(0,fe.resolveUserId)(m.headers,void 0)??(0,fe.clientIp)(m);if(!jt.tryConsume(cn)){v.writeHead(429,{"Content-Type":"application/json","Retry-After":String(jt.retryAfterSeconds(cn))}),v.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:Ss,rejected:_o}=(0,fe.resolveServeSessionKey)(K.session_id,re,br);if(_o){G.append("unverified",(0,zi.generateRequestId)(),"warrant_denied",{reason:_o}),v.writeHead(403,{"Content-Type":"application/json"}),v.end(JSON.stringify({error:"verified user identity required"}));return}let Yr=qr?.atCapacity(He);if(Yr){_t(`Sandbox cap: rejecting /v1/chat/stream (${Yr})`),(0,fe.writeAtCapacity)(v,Yr);return}let ga=await Q.acquire();if(!ga){_t(`TurnGate: rejecting /v1/chat/stream (inflight=${Q.inflight} queued=${Q.queued} max=${Q.max})`),(0,fe.writeAtCapacity)(v);return}let Si=null,ha=!1,Eo=async()=>{ha||(ha=!0,await Si?.release(),ga())};try{if(!oe.tryConsume(He)){v.writeHead(429,{"Content-Type":"application/json"}),v.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await an(He),re?.trim()&&(Si=await yn({userId:re.trim(),sessionKey:He,inboundToken:Be,edgeNonce:zn(m.headers)}),await ae(re.trim(),m.headers));let Ai=ua(m),ma={userId:re,dataToken:Be,...Ai?{warrantJtis:[]}:{}};await(0,Yo.runWithCredential)(ma,async()=>{v.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),await VU(fa,K,He,Ss,a,c,t.workspace,yi,v,re,Si?.env,Ai?()=>da(ma.warrantJtis??[]):void 0,Eo)},{onDenied:H(He)}),Ot?.schedule(He)}finally{await Eo()}return}v.writeHead(404,{"Content-Type":"application/json"}),v.end(JSON.stringify({error:"Not found"}))}catch(ie){if(ie?.tooLarge===!0){v.headersSent||v.writeHead(413,{"Content-Type":"application/json",Connection:"close"}),v.end(JSON.stringify({error:"Payload too large"}));return}console.error("Request error:",ie),v.headersSent||v.writeHead(500,{"Content-Type":"application/json"}),v.end(JSON.stringify({error:ie instanceof Error?ie.message:"Internal error"}))}}),xh=(0,os.createVoiceTurnGate)(),Bh=process.env[os.VOICE_GEMINI_API_KEY_ENV]?.trim()||void 0;delete process.env[os.VOICE_GEMINI_API_KEY_ENV];let Pb=(m,v)=>cg({rateLimiter:jt,turnLimiter:oe,turnGate:xh,warnGateReject:_t,rlKey:m.userId??`voice:${m.sessionKey}`,sessionKey:m.sessionKey,emitter:void 0,atCapacity:()=>qr?.atCapacity(m.sessionKey),run:async()=>{await an(m.sessionKey);let x=m.userId?.trim()?await yn({userId:m.userId.trim(),sessionKey:m.sessionKey,inboundToken:m.dataToken,edgeNonce:m.edgeNonce}):null;try{return await(0,Yo.runWithCredential)({userId:m.userId,dataToken:m.dataToken},()=>nA(fa,{message:v},m.sessionKey,m.sandboxKey,a,c,t.workspace,yi,m.userId,x?.env),{onDenied:H(m.sessionKey)})}finally{await x?.release(),Ot?.schedule(m.sessionKey)}}}),mo=new os.VoiceRoute({maxCalls:(0,os.maxCallsFromEnv)(),streamSecret:process.env[os.VOICE_STREAM_SECRET_ENV]?.trim()||void 0,gatewayBaseUrl:e.useLiteLLM?e.baseUrl??"":"",gatewayApiKey:e.litellmApiKey??"",geminiApiKey:Bh,loadSpec:()=>(0,ZS.loadVoiceSpec)(g),resolveCall:async(m,v)=>{let x=v.user??(0,fe.resolveUserId)(m.headers,void 0),ie=x??(0,fe.clientIp)(m);if(!jt.tryConsume(ie))throw new os.VoiceRefusal(429,"Rate limit exceeded");let{sessionKey:K,sandboxKey:re,rejected:Be}=(0,fe.resolveServeSessionKey)(v.sid??`voice-${(0,mu.randomUUID)()}`,x,br);if(Be)throw G.append("unverified",(0,zi.generateRequestId)(),"warrant_denied",{reason:Be}),new os.VoiceRefusal(403,"verified user identity required");return{sessionKey:K,sandboxKey:re,userId:x,dataToken:(0,fe.resolveDataToken)(m.headers),edgeNonce:zn(m.headers)}},admit:async m=>Ys(await ye.get(),m),runTurn:Pb,upstreamHeaders:m=>Object.fromEntries((0,zi.buildLiteLLMMetadataHeaders)(!0,{analyticsUserId:m.userId,sessionId:m.sessionKey,agentId:s,agentVersion:p,source:"voice",engine:"realtime",requestId:m.callId}).map(v=>[v.slice(0,v.indexOf(":")),v.slice(v.indexOf(":")+1).trim()])),onCallStart:m=>void G.append(m.sessionKey,m.callId,"voice_call_start",{caller_present:!!m.caller,agent_version:p}),onCallEnd:(m,v)=>void G.append(m.sessionKey,m.callId,"voice_call_end",{reason:v.reason,duration_seconds:v.durationSeconds,delegations:v.delegations,transcript_lines:v.transcript.length,after_call_ok:v.afterCall?.success??null,realtime_input_tokens:v.usage.inputTokens,realtime_output_tokens:v.usage.outputTokens}),log:m=>console.log(`[Voice] ${m}`)});n.manifest.spec?.voice&&td.on("upgrade",(m,v,x)=>{mo.handleUpgrade(m,v,x)||v.destroy()}),td.listen(t.port,L,()=>{(async()=>{console.log(""),console.log(Ya),console.log("Agent Hippo Server"),console.log(Ya),console.log(`Host: ${L}`),console.log(`Port: ${t.port}`),console.log(`Engine: ${a}`),console.log(`Model: ${c}`),u&&console.log(`Cheap: ${u}`),console.log(`Workspace: ${t.workspace}`),n&&(console.log(`Pack: ${n.manifest.metadata.name}@${n.manifest.metadata.version}`),console.log(`Gateway: ${i}`)),console.log(Ya),console.log(""),console.log("Endpoints:"),console.log(` POST http://localhost:${t.port}/v1/chat`),console.log(` POST http://localhost:${t.port}/v1/chat/stream`),console.log(` GET http://localhost:${t.port}/health`);try{let x=(0,ZS.loadVoiceSpec)(g);if(x){let ie=x.provider==="gemini"?Bh?", spend bypasses gateway caps":`, needs ${os.VOICE_GEMINI_API_KEY_ENV}`:e.useLiteLLM?"":", needs AGENTHIPPO_LITELLM_BASE_URL";console.log(` WS ws://localhost:${t.port}/v1/voice/session (voice: ${x.provider} ${x.model}${ie})`)}}catch(x){console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} spec.voice is invalid, live calls will be refused: ${x instanceof Error?x.message:String(x)}`)}console.log(""),console.log("Press Ctrl+C to stop."),console.log("");let m=(0,sg.resolveSessionShipConfig)(j,O,I);m&&(pa=(0,sg.startSessionShipper)({...m,logger:{info:x=>d.info(x),warn:x=>console.warn(`${R.COLORS.yellow}Warning:${R.COLORS.reset} ${x}`)}}));let v=t.bind?.trim();if(v)try{await FU(i,v,xe)}catch(x){console.error(`${R.COLORS.yellow}Warning:${R.COLORS.reset} Failed to bind channels: ${x instanceof Error?x.message:String(x)}`)}if(t.gatewayBridge){if(pe)try{dt=await(0,ht.startEgressBroker)({registry:pe,workspaceRoot:t.workspace,agentId:n.manifest.metadata.name,send:async(x,ie,K)=>{let re=await(0,UU.sendGatewayOutboundMessage)(x,{message:ie,media:K,token:xe});return{ok:re.ok,via:re.via,stdout:re.stdout,stderr:re.stderr}},logger:t.verbose?new Wn.ConsoleLogger("[Egress]"):new Wn.NoOpLogger,audit:We}),process.env[ht.EGRESS_URL_ENV]=dt.url,console.log("OK: Egress broker on loopback \u2014 gateway token stays broker-side; agent sends via turn nonce")}catch(x){console.error(`${R.COLORS.red}Error:${R.COLORS.reset} Egress broker failed to start: ${x instanceof Error?x.message:String(x)}`),process.exit(1)}try{dc=await BU({gatewayAgentId:i,packName:n.manifest.metadata.name,workspace:t.workspace,registerTurn:yn,brokerGatewayToken:xe,engine:a,defaultModel:c,current:()=>({engine:a,defaultModel:c}),runner:fa,permissions:yi,turnGate:Q,rateLimiter:jt,turnLimiter:oe,warnGateReject:_t,...qr?{atCapacity:x=>qr.atCapacity(x)}:{},prepareSession:an,sandboxScope:br,onTurnComplete:x=>Ot?.schedule(x),logWarrantDenied:H,serviceUserIfPermitted:Ib})}catch(x){console.error(`${R.COLORS.yellow}Warning:${R.COLORS.reset} Gateway bridge failed: ${x instanceof Error?x.message:String(x)}`)}}fc=!0})()});let Fh=!1,Vh=()=>{Fh||(Fh=!0,fc=!1,console.log(`
587
+ Shutting down...`),(async()=>{if(mo.active&&console.log(`Waiting for ${mo.active} live call(s) to finish...`),await mo.drain((0,os.voiceDrainMsFromEnv)()),Ot)try{await Ot.flush()}catch{}if(dc){try{await dc.unregisterAgent(i)}catch{}dc=null}if(Ue)try{await Ue.close()}catch{}if(dt)try{await dt.close()}catch{}if(pa)try{await pa.flush()}catch{}let m=async()=>{if(ho)try{await ho.destroyAll()}catch{}fa.dispose(),process.exit(0)};td.close(()=>{m()}),setTimeout(()=>{m()},1e4).unref()})())};process.on("SIGINT",Vh),process.on("SIGTERM",Vh)}async function tA(t){let e=await(0,fe.readBodyWithCap)(t);try{return JSON.parse(e)}catch{throw new Error("Invalid JSON")}}async function nA(t,e,n,r,s,i,o,a,c,l){let u=await t.run({engineId:oA(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:c,permissions:a,turnEnv:l});return{success:u.success,text:u.text,thinking:u.thinking||void 0,tool_calls:u.toolCalls,error:u.error,...u.atCapacity?{atCapacity:!0}:{}}}function sA(t,e,n="session",r=!1){if(r&&e){let a=`gateway-${e}`;return{sessionKey:`${a}--${(0,mu.randomUUID)()}`,sandboxKey:a,outboundKey:t.sessionId?.trim()||t.gatewaySessionKey?.trim()||a,durable:!1}}let s=e?`u${(0,fe.userNamespaceHash)(e)}`:void 0,i=t.sessionId?.trim()||t.gatewaySessionKey?.trim();if(i){let a=e?`u${(0,fe.userNamespaceHash)(e)}--${i}`:i;return{sessionKey:a,sandboxKey:n==="user"&&s?s:a,outboundKey:i,durable:!0}}if(e){let a=`gateway-${e}`;return{sessionKey:a,sandboxKey:n==="user"&&s?s:a,outboundKey:a,durable:!0}}let o=`gateway-anon-${(0,mu.randomUUID)()}`;return{sessionKey:o,sandboxKey:o,outboundKey:o,durable:!1}}async function cg(t){let e=async s=>{try{await t.emitter?.text(s),await t.emitter?.done()}catch{}};if(!t.rateLimiter.tryConsume(t.rlKey))return await e(fe.RATE_LIMIT_BUSY_MESSAGE),{success:!1,error:"rate_limited"};let n=t.atCapacity?.();if(n)return t.warnGateReject(`Sandbox cap: rejecting gateway turn (${n})`),await e(fe.TURN_GATE_BUSY_MESSAGE),{success:!1,error:"busy"};let r=await t.turnGate.acquire();if(!r)return t.warnGateReject(`TurnGate: rejecting gateway turn (inflight=${t.turnGate.inflight} queued=${t.turnGate.queued} max=${t.turnGate.max})`),await e(fe.TURN_GATE_BUSY_MESSAGE),{success:!1,error:"busy"};try{return t.trackSession!==!1&&!t.turnLimiter.tryConsume(t.sessionKey)?(await e(fe.TURN_LIMIT_BUSY_MESSAGE),{success:!1,error:"turn_limit"}):await t.run()}finally{r()}}async function BU(t){let{GatewayBridge:e}=await Promise.resolve().then(()=>$n(WS())),r=process.env.OPENCLAW_GATEWAY_URL??"ws://127.0.0.1:18789",s=t.brokerGatewayToken,i=new e({gatewayUrl:r,token:s});return await i.connect(),await i.registerAgent({id:t.gatewayAgentId,agentId:t.packName,name:`${t.packName} (CLI)`,workspace:t.workspace,engineId:t.engine,syncOpenClawConfigAgent:!0,messageHandler:(o,a)=>iA(t,o,a)}),console.log(`${R.COLORS.green}\u2713${R.COLORS.reset} Gateway bridge: registered "${t.gatewayAgentId}" at ${r}`),console.log(`${R.COLORS.dim} Gateway outbound routes: ${t.workspace}/.agent-hippo/sessions/<sessionKey>/gateway-outbound.json${R.COLORS.reset}`),console.log(`${R.COLORS.dim} openclaw agent --agent ${t.gatewayAgentId} --message "\u2026"${R.COLORS.reset}`),i}async function iA(t,e,n){let r=t.current?.()??{engine:t.engine,defaultModel:t.defaultModel},s=n.engineId?.trim().toLowerCase(),i=s==="custom"?r.engine:s||r.engine,o=(0,fe.peerToUserId)(n.peerInfo),a=o?void 0:await t.serviceUserIfPermitted?.(),c=o??a,{sessionKey:l,sandboxKey:u,outboundKey:f,durable:d}=sA(n,c,t.sandboxScope,!!a);return cg({rateLimiter:t.rateLimiter,turnLimiter:t.turnLimiter,turnGate:t.turnGate,warnGateReject:t.warnGateReject,rlKey:c??"gateway",sessionKey:l,trackSession:d,emitter:n.emitter,atCapacity:()=>t.atCapacity?.(l),run:async()=>{d&&await t.prepareSession(l);let g=c?.trim()?await t.registerTurn({userId:c.trim(),sessionKey:l,egressStoreKey:f}):null;try{let p=await(0,Yo.runWithCredential)({userId:c},()=>t.runner.run({engineId:i,modelId:r.defaultModel,message:e,workspaceRoot:t.workspace,sessionId:l,sandboxKey:u,gatewaySessionKey:f,analyticsUserId:c,emitter:n.emitter,permissions:t.permissions,turnEnv:g?.env}),{onDenied:t.logWarrantDenied(l)});return d&&t.onTurnComplete?.(l),{success:p.success,error:p.error}}finally{await g?.release()}}})}async function FU(t,e,n){let{createAgentIDEGatewayClient:r}=await Promise.resolve().then(()=>$n(ou())),i=process.env.OPENCLAW_GATEWAY_URL??"ws://127.0.0.1:18789",{client:o,clientInfo:a}=r(i,n);try{await o.connect(a)}catch(c){throw new Error(`Cannot connect to gateway at ${i}: ${c instanceof Error?c.message:String(c)}`)}try{let c,l,u;if(e.trim()==="*"){let d=await(0,og.fetchMeetAgentChannelContext)(o.request.bind(o));c=d.rows.map(g=>g.id),u=d.statusPayload}else{let d=(0,og.parseChannelBindSpecs)(e);c=d.map(g=>g.channelId),l=Object.fromEntries(d.filter(g=>g.accountId).map(g=>[g.channelId,g.accountId])),Object.keys(l).length===0&&(l=void 0)}if(c.length===0){console.log(`${R.COLORS.yellow}Warning:${R.COLORS.reset} No channels to bind.`);return}let f=await(0,og.applyAgentChannelBindingsViaConfigPatch)(o.request.bind(o),{agentId:t,selectedChannelIds:c,channelAccountOverrides:l,statusPayload:u});console.log(f?`${R.COLORS.green}\u2713${R.COLORS.reset} Bound ${t} to: ${c.join(", ")}`:`${R.COLORS.dim}Slack already bound to ${t}; skipped config.patch${R.COLORS.reset}`)}finally{o.close()}}async function VU(t,e,n,r,s,i,o,a,c,l,u,f,d){let g=!1,p=(y,E)=>{g||c.writableEnded||c.write(`data: ${JSON.stringify({type:y,...E})}
588
588
 
589
- `)},_=()=>{p||(p=!0,c.end())},h={async thinking(y){g("thinking",{delta:y})},async text(y){g("text",{delta:y})},async toolStart(y,E,w){g("tool_start",{name:y,input:E,tool_call_id:w})},async toolEnd(y,E,w,A){g("tool_end",{name:y,tool_call_id:E,result:w,is_error:A})},async progress(y){g("progress",{message:y})},async question(y){return g("question",{payload:y}),{selected:[],freeText:null,declined:!0}},async error(y){g("error",{message:y})},async done(){d||(g("done",{}),_())}};try{let y=await t.run({engineId:oA(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:l,emitter:h,permissions:a,turnEnv:u});!y.success&&!p&&g("error",{message:y.error??"refused by policy"}),p||(d&&await f?.(),g("done",d?{cost:await d()}:{}),_())}catch(y){g("error",{message:y instanceof Error?y.message:"Unknown error"}),_()}}function oA(t,e){let n=t?.trim().toLowerCase();return!n||n==="custom"?e:n}});var lg=T(gr=>{"use strict";var KU=gr&&gr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),WU=gr&&gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qU=gr&&gr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KU(n,e,r[s]);return WU(n,e),n}})();Object.defineProperty(gr,"__esModule",{value:!0});gr.signJwt=YU;gr.verifyJwt=JU;gr.extractBearerToken=XU;gr.looksLikeJwt=zU;var lA=qU(require("crypto"));function cA(t){return(typeof t=="string"?Buffer.from(t,"utf8"):t).toString("base64url")}function YU(t,e,n){let r={alg:"HS256",typ:"JWT"},s=Math.floor(Date.now()/1e3),i={...t,iat:s,exp:s+n},o=cA(JSON.stringify(r)),a=cA(JSON.stringify(i)),c=lA.createHmac("sha256",e).update(`${o}.${a}`).digest("base64url");return`${o}.${a}.${c}`}function JU(t,e){let n=t.split(".");if(n.length!==3)return;let[r,s,i]=n,o=lA.createHmac("sha256",e).update(`${r}.${s}`).digest("base64url");if(i.length!==o.length)return;let a=0;for(let c=0;c<i.length;c++)a|=i.charCodeAt(c)^o.charCodeAt(c);if(a===0)try{let c=JSON.parse(Buffer.from(s,"base64url").toString("utf8")),l=Math.floor(Date.now()/1e3);return typeof c.exp=="number"&&c.exp<l?void 0:c}catch{return}}function XU(t){return t?.trim()&&/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||void 0}function zU(t){return t.split(".").length===3}});var uA=T(as=>{"use strict";var QU=as&&as.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),ZU=as&&as.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),fg=as&&as.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&QU(n,e,r[s]);return ZU(n,e),n}})();Object.defineProperty(as,"__esModule",{value:!0});as.AuthBrokerStore=void 0;var ug=fg(require("crypto")),Jo=fg(require("fs")),eH=fg(require("path")),tH=Ca(),nH=lg(),dg=class{config;users=new Map;codes=new Map;refreshTokens=new Map;persistPath;constructor(e,n){this.config=e,this.persistPath=n,n&&this.loadFromDisk(n)}loadFromDisk(e){try{if(!Jo.existsSync(e))return;let n=Jo.readFileSync(e,"utf8"),r=JSON.parse(n);for(let i of r.users??[])this.users.set(i.id,i);let s=Date.now();for(let i of r.refreshTokens??[])i.revoked||i.expiresAt<s||this.refreshTokens.set(i.token,i)}catch{}}persist(){if(!this.persistPath)return;let e=eH.dirname(this.persistPath);Jo.mkdirSync(e,{recursive:!0});let n=Date.now(),r=[...this.refreshTokens.values()].filter(o=>!o.revoked&&o.expiresAt>n),s={users:[...this.users.values()],refreshTokens:r},i=`${this.persistPath}.tmp.${process.pid}`;try{Jo.writeFileSync(i,JSON.stringify(s,null,2),"utf8"),Jo.renameSync(i,this.persistPath)}catch(o){try{Jo.unlinkSync(i)}catch{}throw o}}pruneRefreshTokens(){let e=Date.now();for(let[n,r]of this.refreshTokens)(r.revoked||r.expiresAt<e)&&this.refreshTokens.delete(n)}pruneAuthCodes(){let e=Date.now();for(let[n,r]of this.codes)r.expiresAt<e&&this.codes.delete(n)}upsertUser(e,n){let r=e.trim().toLowerCase();if(!(0,tH.emailDomainAllowed)(r,this.config.allowedEmailDomains)){let i=new Error(`Email domain not allowed for sign-in: ${r}`);throw i.status=403,i}for(let i of this.users.values())if(i.email===r)return i;let s={id:`usr_${ug.randomBytes(8).toString("hex")}`,email:r,displayName:n?.trim()||r.split("@")[0]||r,...this.config.teamConfigured?{teamId:this.config.team.id}:{}};return this.users.set(s.id,s),this.persist(),s}getUser(e){return this.users.get(e)}createAuthCode(e){this.pruneAuthCodes();let n=ug.randomBytes(24).toString("base64url");return this.codes.set(n,{code:n,userId:e.userId,clientId:e.clientId,redirectUri:e.redirectUri,codeChallenge:e.codeChallenge,expiresAt:Date.now()+600*1e3}),n}consumeAuthCode(e){let n=this.codes.get(e);if(n&&(this.codes.delete(e),!(n.expiresAt<Date.now())))return n}createRefreshToken(e,n){let r=ug.randomBytes(32).toString("base64url");return this.refreshTokens.set(r,{token:r,userId:e,clientId:n,expiresAt:Date.now()+this.config.refreshTokenTtlSec*1e3,revoked:!1}),this.persist(),r}consumeRefreshToken(e){let n=this.refreshTokens.get(e);if(!(!n||n.revoked||n.expiresAt<Date.now()))return n.revoked=!0,this.persist(),n}revokeRefreshTokensForUser(e){let n=!1;for(let r of this.refreshTokens.values())r.userId===e&&!r.revoked&&(r.revoked=!0,n=!0);n&&this.persist()}issueTokens(e,n,r){this.pruneRefreshTokens(),this.pruneAuthCodes();let s=(0,nH.signJwt)({sub:e.id,email:e.email,name:e.displayName,...e.teamId?{team_id:e.teamId}:{},scope:r},this.config.jwtSecret,this.config.accessTokenTtlSec),i=this.createRefreshToken(e.id,n);return{accessToken:s,refreshToken:i,expiresIn:this.config.accessTokenTtlSec}}buildBootstrap(e){let n=this.config.teamConfigured;return{version:1,user:{id:e.id,email:e.email,displayName:e.displayName},...n?{team:{id:this.config.team.id,name:this.config.team.name,role:"member"}}:{},store:{repo:this.config.team.storeRepo,indexUrl:this.config.team.storeIndexUrl,githubOrg:this.config.team.githubOrg},routing:{inferenceGatewayUrl:this.config.team.gatewayUrl},policy:{teamManagedSettings:n?["store","routing"]:[]}}}buildMe(e){return{user:{id:e.id,email:e.email,displayName:e.displayName},...this.config.teamConfigured?{team:{id:this.config.team.id,name:this.config.team.name,role:"member"}}:{}}}};as.AuthBrokerStore=dg});var pA=T(Hr=>{"use strict";var rH=Hr&&Hr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),sH=Hr&&Hr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),iH=Hr&&Hr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&rH(n,e,r[s]);return sH(n,e),n}})();Object.defineProperty(Hr,"__esModule",{value:!0});Hr.generateCodeVerifier=oH;Hr.codeChallengeFromVerifier=fA;Hr.verifyPkceChallenge=aH;var pg=iH(require("crypto")),dA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";function oH(t=64){let e=pg.randomBytes(t),n="";for(let r=0;r<t;r++)n+=dA[e[r]%dA.length];return n}function fA(t){return pg.createHash("sha256").update(t).digest("base64url")}function aH(t,e){let n=Buffer.from(fA(t)),r=Buffer.from(e);return n.length===r.length&&pg.timingSafeEqual(n,r)}});var gg=T(hr=>{"use strict";Object.defineProperty(hr,"__esModule",{value:!0});hr.AUTH_CALLBACK_PATH=hr.AUTH_EXTENSION_AUTHORITY=hr.AUTH_SCOPES=hr.AUTH_CLIENT_ID=hr.AUTH_PROVIDER_ID=void 0;hr.AUTH_PROVIDER_ID="agenthippo";hr.AUTH_CLIENT_ID="agenthippo-ide";hr.AUTH_SCOPES=["openid","profile","email","agenthippo:ide"];hr.AUTH_EXTENSION_AUTHORITY="agenthippo.agenthippo";hr.AUTH_CALLBACK_PATH="/auth/callback"});var hA=T(Xo=>{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});Xo.parseAuthCallback=gA;Xo.parseAuthCallbackFromText=cH;Xo.isAuthCallbackParts=lH;Xo.parseAuthCallbackFromLoopbackUrl=uH;var _u=gg();function gA(t,e){if(t.authority!==_u.AUTH_EXTENSION_AUTHORITY||t.path!==_u.AUTH_CALLBACK_PATH)return;let n=new URLSearchParams(t.query),r=n.get("code"),s=n.get("state");if(!(!r||s!==e))return r}function cH(t,e){let n=t.trim();if(n)try{let r=new URL(n);return gA({authority:r.host,path:r.pathname,query:r.search.replace(/^\?/,"")},e)}catch{return}}function lH(t,e){return t===_u.AUTH_EXTENSION_AUTHORITY&&e===_u.AUTH_CALLBACK_PATH}function uH(t,e){try{let n=new URL(t.trim());if(n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"||n.pathname!=="/callback")return;let r=n.searchParams.get("code"),s=n.searchParams.get("state");return!r||s!==e?void 0:r}catch{return}}});var yA=T(qn=>{"use strict";var dH=qn&&qn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fH=qn&&qn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_g=qn&&qn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dH(n,e,r[s]);return fH(n,e),n}})();Object.defineProperty(qn,"__esModule",{value:!0});qn.hasTrustedProxyProof=void 0;qn.isAllowedRedirectUri=_A;qn.createAuthBrokerServer=EA;qn.startAuthBrokerServer=TH;var pH=_g(require("http")),gH=_g(require("crypto")),Qa=require("url"),hH=_g(require("path")),za=Ca(),mH=uA(),_H=pA(),Xa=lg(),cs=kf(),Eu=gg(),EH=hA(),yu=ur();function _A(t){let e;try{e=new Qa.URL(t)}catch{return!1}return e.username||e.password||e.search||e.hash?!1:e.protocol==="http:"?e.hostname!=="127.0.0.1"&&e.hostname!=="localhost"||e.pathname!=="/callback"?!1:e.port!==""&&Number(e.port)>1024:e.protocol==="https:"?!1:(0,EH.isAuthCallbackParts)(e.host,e.pathname)}var yH=ur();Object.defineProperty(qn,"hasTrustedProxyProof",{enumerable:!0,get:function(){return yH.hasTrustedProxyProof}});function Se(t,e,n){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(n))}function wH(t){let e=t.indexOf("@");return e<=0?t:`${t[0]}***@${t.slice(e+1)}`}var SH=64*1024;async function hg(t){let e=[],n=0;for await(let r of t){let s=typeof r=="string"?Buffer.from(r):r;if(n+=s.length,n>SH){let i=new Error("Request body too large");throw i.status=413,i}e.push(s)}return Buffer.concat(e).toString("utf8")}function mg(t){let e=new URLSearchParams(t),n={};for(let[r,s]of e.entries())n[r]=s;return n}function mA(t,e){if(t?.trim())for(let n of t.split(";")){let r=n.indexOf("=");if(r<=0)continue;if(n.slice(0,r).trim()===e){let i=n.slice(r+1).trim();if(i)return i}}}function AH(t,e,n){try{let r=new Qa.URL(t);if(r.protocol!=="http:"&&r.protocol!=="https:")return n;if(e){let s=e.replace(/^\./,"").toLowerCase();if(r.hostname.toLowerCase()===s||r.hostname.toLowerCase().endsWith("."+s))return r.toString()}else if(r.hostname==="127.0.0.1"||r.hostname==="localhost")return r.toString()}catch{}return n}function EA(t){let e=t??(0,za.loadAuthBrokerConfig)();if(!e.devMode&&e.jwtSecret===za.DEFAULT_JWT_SECRET)throw new Error("AGENTHIPPO_AUTH_JWT_SECRET must be set to a strong secret in production. Generate one with: openssl rand -hex 32");if(!e.devMode&&!e.proxySecret&&!e.trustProxyHeadersUnverified)throw new Error(`AGENTHIPPO_AUTH_PROXY_SECRET must be set in production. The broker trusts X-Auth-Request-Email from the oauth2-proxy/Caddy forward_auth sidecar; without a shared secret proving the header came from that sidecar, any caller that reaches this port can mint a token for an arbitrary email.
589
+ `)},_=()=>{g||(g=!0,c.end())},h={async thinking(y){p("thinking",{delta:y})},async text(y){p("text",{delta:y})},async toolStart(y,E,w){p("tool_start",{name:y,input:E,tool_call_id:w})},async toolEnd(y,E,w,A){p("tool_end",{name:y,tool_call_id:E,result:w,is_error:A})},async progress(y){p("progress",{message:y})},async question(y){return p("question",{payload:y}),{selected:[],freeText:null,declined:!0}},async error(y){p("error",{message:y})},async done(){f||(p("done",{}),_())}};try{let y=await t.run({engineId:oA(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:l,emitter:h,permissions:a,turnEnv:u});!y.success&&!g&&p("error",{message:y.error??"refused by policy"}),g||(f&&await d?.(),p("done",f?{cost:await f()}:{}),_())}catch(y){p("error",{message:y instanceof Error?y.message:"Unknown error"}),_()}}function oA(t,e){let n=t?.trim().toLowerCase();return!n||n==="custom"?e:n}});var lg=T(gr=>{"use strict";var KU=gr&&gr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),WU=gr&&gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qU=gr&&gr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KU(n,e,r[s]);return WU(n,e),n}})();Object.defineProperty(gr,"__esModule",{value:!0});gr.signJwt=YU;gr.verifyJwt=JU;gr.extractBearerToken=XU;gr.looksLikeJwt=zU;var lA=qU(require("crypto"));function cA(t){return(typeof t=="string"?Buffer.from(t,"utf8"):t).toString("base64url")}function YU(t,e,n){let r={alg:"HS256",typ:"JWT"},s=Math.floor(Date.now()/1e3),i={...t,iat:s,exp:s+n},o=cA(JSON.stringify(r)),a=cA(JSON.stringify(i)),c=lA.createHmac("sha256",e).update(`${o}.${a}`).digest("base64url");return`${o}.${a}.${c}`}function JU(t,e){let n=t.split(".");if(n.length!==3)return;let[r,s,i]=n,o=lA.createHmac("sha256",e).update(`${r}.${s}`).digest("base64url");if(i.length!==o.length)return;let a=0;for(let c=0;c<i.length;c++)a|=i.charCodeAt(c)^o.charCodeAt(c);if(a===0)try{let c=JSON.parse(Buffer.from(s,"base64url").toString("utf8")),l=Math.floor(Date.now()/1e3);return typeof c.exp=="number"&&c.exp<l?void 0:c}catch{return}}function XU(t){return t?.trim()&&/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||void 0}function zU(t){return t.split(".").length===3}});var uA=T(as=>{"use strict";var QU=as&&as.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),ZU=as&&as.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),fg=as&&as.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&QU(n,e,r[s]);return ZU(n,e),n}})();Object.defineProperty(as,"__esModule",{value:!0});as.AuthBrokerStore=void 0;var ug=fg(require("crypto")),Jo=fg(require("fs")),eH=fg(require("path")),tH=Ca(),nH=lg(),dg=class{config;users=new Map;codes=new Map;refreshTokens=new Map;persistPath;constructor(e,n){this.config=e,this.persistPath=n,n&&this.loadFromDisk(n)}loadFromDisk(e){try{if(!Jo.existsSync(e))return;let n=Jo.readFileSync(e,"utf8"),r=JSON.parse(n);for(let i of r.users??[])this.users.set(i.id,i);let s=Date.now();for(let i of r.refreshTokens??[])i.revoked||i.expiresAt<s||this.refreshTokens.set(i.token,i)}catch{}}persist(){if(!this.persistPath)return;let e=eH.dirname(this.persistPath);Jo.mkdirSync(e,{recursive:!0});let n=Date.now(),r=[...this.refreshTokens.values()].filter(o=>!o.revoked&&o.expiresAt>n),s={users:[...this.users.values()],refreshTokens:r},i=`${this.persistPath}.tmp.${process.pid}`;try{Jo.writeFileSync(i,JSON.stringify(s,null,2),"utf8"),Jo.renameSync(i,this.persistPath)}catch(o){try{Jo.unlinkSync(i)}catch{}throw o}}pruneRefreshTokens(){let e=Date.now();for(let[n,r]of this.refreshTokens)(r.revoked||r.expiresAt<e)&&this.refreshTokens.delete(n)}pruneAuthCodes(){let e=Date.now();for(let[n,r]of this.codes)r.expiresAt<e&&this.codes.delete(n)}upsertUser(e,n){let r=e.trim().toLowerCase();if(!(0,tH.emailDomainAllowed)(r,this.config.allowedEmailDomains)){let i=new Error(`Email domain not allowed for sign-in: ${r}`);throw i.status=403,i}for(let i of this.users.values())if(i.email===r)return i;let s={id:`usr_${ug.randomBytes(8).toString("hex")}`,email:r,displayName:n?.trim()||r.split("@")[0]||r,...this.config.teamConfigured?{teamId:this.config.team.id}:{}};return this.users.set(s.id,s),this.persist(),s}getUser(e){return this.users.get(e)}createAuthCode(e){this.pruneAuthCodes();let n=ug.randomBytes(24).toString("base64url");return this.codes.set(n,{code:n,userId:e.userId,clientId:e.clientId,redirectUri:e.redirectUri,codeChallenge:e.codeChallenge,expiresAt:Date.now()+600*1e3}),n}consumeAuthCode(e){let n=this.codes.get(e);if(n&&(this.codes.delete(e),!(n.expiresAt<Date.now())))return n}createRefreshToken(e,n){let r=ug.randomBytes(32).toString("base64url");return this.refreshTokens.set(r,{token:r,userId:e,clientId:n,expiresAt:Date.now()+this.config.refreshTokenTtlSec*1e3,revoked:!1}),this.persist(),r}consumeRefreshToken(e){let n=this.refreshTokens.get(e);if(!(!n||n.revoked||n.expiresAt<Date.now()))return n.revoked=!0,this.persist(),n}revokeRefreshTokensForUser(e){let n=!1;for(let r of this.refreshTokens.values())r.userId===e&&!r.revoked&&(r.revoked=!0,n=!0);n&&this.persist()}issueTokens(e,n,r){this.pruneRefreshTokens(),this.pruneAuthCodes();let s=(0,nH.signJwt)({sub:e.id,email:e.email,name:e.displayName,...e.teamId?{team_id:e.teamId}:{},scope:r},this.config.jwtSecret,this.config.accessTokenTtlSec),i=this.createRefreshToken(e.id,n);return{accessToken:s,refreshToken:i,expiresIn:this.config.accessTokenTtlSec}}buildBootstrap(e){let n=this.config.teamConfigured;return{version:1,user:{id:e.id,email:e.email,displayName:e.displayName},...n?{team:{id:this.config.team.id,name:this.config.team.name,role:"member"}}:{},store:{repo:this.config.team.storeRepo,indexUrl:this.config.team.storeIndexUrl,githubOrg:this.config.team.githubOrg},routing:{inferenceGatewayUrl:this.config.team.gatewayUrl},policy:{teamManagedSettings:n?["store","routing"]:[]}}}buildMe(e){return{user:{id:e.id,email:e.email,displayName:e.displayName},...this.config.teamConfigured?{team:{id:this.config.team.id,name:this.config.team.name,role:"member"}}:{}}}};as.AuthBrokerStore=dg});var pA=T(Hr=>{"use strict";var rH=Hr&&Hr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),sH=Hr&&Hr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),iH=Hr&&Hr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&rH(n,e,r[s]);return sH(n,e),n}})();Object.defineProperty(Hr,"__esModule",{value:!0});Hr.generateCodeVerifier=oH;Hr.codeChallengeFromVerifier=fA;Hr.verifyPkceChallenge=aH;var pg=iH(require("crypto")),dA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";function oH(t=64){let e=pg.randomBytes(t),n="";for(let r=0;r<t;r++)n+=dA[e[r]%dA.length];return n}function fA(t){return pg.createHash("sha256").update(t).digest("base64url")}function aH(t,e){let n=Buffer.from(fA(t)),r=Buffer.from(e);return n.length===r.length&&pg.timingSafeEqual(n,r)}});var gg=T(hr=>{"use strict";Object.defineProperty(hr,"__esModule",{value:!0});hr.AUTH_CALLBACK_PATH=hr.AUTH_EXTENSION_AUTHORITY=hr.AUTH_SCOPES=hr.AUTH_CLIENT_ID=hr.AUTH_PROVIDER_ID=void 0;hr.AUTH_PROVIDER_ID="agenthippo";hr.AUTH_CLIENT_ID="agenthippo-ide";hr.AUTH_SCOPES=["openid","profile","email","agenthippo:ide"];hr.AUTH_EXTENSION_AUTHORITY="agenthippo.agenthippo";hr.AUTH_CALLBACK_PATH="/auth/callback"});var hA=T(Xo=>{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});Xo.parseAuthCallback=gA;Xo.parseAuthCallbackFromText=cH;Xo.isAuthCallbackParts=lH;Xo.parseAuthCallbackFromLoopbackUrl=uH;var _u=gg();function gA(t,e){if(t.authority!==_u.AUTH_EXTENSION_AUTHORITY||t.path!==_u.AUTH_CALLBACK_PATH)return;let n=new URLSearchParams(t.query),r=n.get("code"),s=n.get("state");if(!(!r||s!==e))return r}function cH(t,e){let n=t.trim();if(n)try{let r=new URL(n);return gA({authority:r.host,path:r.pathname,query:r.search.replace(/^\?/,"")},e)}catch{return}}function lH(t,e){return t===_u.AUTH_EXTENSION_AUTHORITY&&e===_u.AUTH_CALLBACK_PATH}function uH(t,e){try{let n=new URL(t.trim());if(n.hostname!=="127.0.0.1"&&n.hostname!=="localhost"||n.pathname!=="/callback")return;let r=n.searchParams.get("code"),s=n.searchParams.get("state");return!r||s!==e?void 0:r}catch{return}}});var yA=T(qn=>{"use strict";var dH=qn&&qn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fH=qn&&qn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_g=qn&&qn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dH(n,e,r[s]);return fH(n,e),n}})();Object.defineProperty(qn,"__esModule",{value:!0});qn.hasTrustedProxyProof=void 0;qn.isAllowedRedirectUri=_A;qn.createAuthBrokerServer=EA;qn.startAuthBrokerServer=TH;var pH=_g(require("http")),gH=_g(require("crypto")),Qa=require("url"),hH=_g(require("path")),za=Ca(),mH=uA(),_H=pA(),Xa=lg(),cs=kf(),Eu=gg(),EH=hA(),yu=ur();function _A(t){let e;try{e=new Qa.URL(t)}catch{return!1}return e.username||e.password||e.search||e.hash?!1:e.protocol==="http:"?e.hostname!=="127.0.0.1"&&e.hostname!=="localhost"||e.pathname!=="/callback"?!1:e.port!==""&&Number(e.port)>1024:e.protocol==="https:"?!1:(0,EH.isAuthCallbackParts)(e.host,e.pathname)}var yH=ur();Object.defineProperty(qn,"hasTrustedProxyProof",{enumerable:!0,get:function(){return yH.hasTrustedProxyProof}});function Se(t,e,n){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(n))}function wH(t){let e=t.indexOf("@");return e<=0?t:`${t[0]}***@${t.slice(e+1)}`}var SH=64*1024;async function hg(t){let e=[],n=0;for await(let r of t){let s=typeof r=="string"?Buffer.from(r):r;if(n+=s.length,n>SH){let i=new Error("Request body too large");throw i.status=413,i}e.push(s)}return Buffer.concat(e).toString("utf8")}function mg(t){let e=new URLSearchParams(t),n={};for(let[r,s]of e.entries())n[r]=s;return n}function mA(t,e){if(t?.trim())for(let n of t.split(";")){let r=n.indexOf("=");if(r<=0)continue;if(n.slice(0,r).trim()===e){let i=n.slice(r+1).trim();if(i)return i}}}function AH(t,e,n){try{let r=new Qa.URL(t);if(r.protocol!=="http:"&&r.protocol!=="https:")return n;if(e){let s=e.replace(/^\./,"").toLowerCase();if(r.hostname.toLowerCase()===s||r.hostname.toLowerCase().endsWith("."+s))return r.toString()}else if(r.hostname==="127.0.0.1"||r.hostname==="localhost")return r.toString()}catch{}return n}function EA(t){let e=t??(0,za.loadAuthBrokerConfig)();if(!e.devMode&&e.jwtSecret===za.DEFAULT_JWT_SECRET)throw new Error("AGENTHIPPO_AUTH_JWT_SECRET must be set to a strong secret in production. Generate one with: openssl rand -hex 32");if(!e.devMode&&!e.proxySecret&&!e.trustProxyHeadersUnverified)throw new Error(`AGENTHIPPO_AUTH_PROXY_SECRET must be set in production. The broker trusts X-Auth-Request-Email from the oauth2-proxy/Caddy forward_auth sidecar; without a shared secret proving the header came from that sidecar, any caller that reaches this port can mint a token for an arbitrary email.
590
590
  1. Generate one: openssl rand -hex 32
591
591
  2. Set it here: AGENTHIPPO_AUTH_PROXY_SECRET=<secret>
592
592
  3. Have the proxy send it, e.g. in the Caddyfile:
593
593
  header_up ${za.AUTH_PROXY_SECRET_HEADER} {env.AGENTHIPPO_AUTH_PROXY_SECRET}
594
- If the broker is genuinely unreachable except through the proxy and you accept the risk, set AGENTHIPPO_AUTH_TRUST_PROXY_UNVERIFIED=1.`);!e.devMode&&!e.proxySecret&&e.trustProxyHeadersUnverified&&console.warn("[auth-broker] WARNING: AGENTHIPPO_AUTH_TRUST_PROXY_UNVERIFIED=1 \u2014 X-Auth-Request-Email is accepted without proof. Anything that can reach this port can mint a token for any email. Set AGENTHIPPO_AUTH_PROXY_SECRET to close this."),!e.devMode&&e.allowedEmailDomains.length===0&&console.warn('[auth-broker] Warning: AGENTHIPPO_AUTH_ALLOWED_DOMAINS is not set \u2014 any upstream-SSO-authenticated email can receive a token. Set it to restrict sign-in (e.g. "example.com").');let n=e.dataDir?hH.join(e.dataDir,"auth-store.json"):void 0,r=new mH.AuthBrokerStore(e,n),s=new yu.RateLimiter(e.rateLimitPerMin),i=e.issuers??[],o=new Map(i.map(A=>[A.name,new yu.RateLimiter(A.ratePerMin)])),a=new Map(i.map(A=>[A.name,cs.JtiReplayCache.forIssuer(A)])),c=[`${e.publicBaseUrl}/oauth/token`,e.publicBaseUrl],l=e.federatedAudiences??[];for(let A of i){console.log(`[auth-broker] federated issuer ${A.name}: identities ${A.prefix}:<id>, tokens for ${A.audiences.join(", ")}`);let S=A.audiences.filter(C=>!l.includes(C));S.length>0&&console.log(`[auth-broker] ${A.name}'s tokens for ${S.join(", ")} are honoured only by a broker fronting those hosts (AGENTHIPPO_AUTH_AUDIENCES), not by this one`)}l.length>0&&console.log(`[auth-broker] honours federated tokens for: ${l.join(", ")}`);let u=(A,S={})=>{let C=Object.entries(S).filter(([,v])=>v!==void 0&&v!=="").map(([v,I])=>{let P=!e.logPii&&typeof I=="string"&&I.includes("@")?wH(I):I,L=typeof P=="string"&&/[\s"\\\u0000-\u001f\u007f]/.test(P)?JSON.stringify(P):P;return`${v}=${L}`}).join(" ");console.log(`[auth-broker] ${A}${C?" "+C:""}`)},d=1e4,f=2048,p=new Map,g=5e3,_=0;function h(A){let S=(0,Xa.extractBearerToken)(A.headers.authorization)||mA(A.headers.cookie,e.cookieName);if(!S)return;let C=gH.createHash("sha256").update(S).digest("hex"),v=p.get(C);if(v){if(v.exp>Date.now())return v.user;p.delete(C)}let I=(0,Xa.verifyJwt)(S,e.jwtSecret);if(!I?.sub)return;let P=typeof I.email=="string"?I.email:"",N=!P||I.aud!==void 0;if(N&&!(0,cs.federatedTokenAccepted)(I.aud,(0,cs.forwardedHost)(A.headers),l))return;let O=r.getUser(String(I.sub));if(!O){let G=typeof I.team_id=="string"&&I.team_id?I.team_id:void 0;O={id:String(I.sub),email:P,displayName:typeof I.name=="string"&&I.name?I.name:P||String(I.sub),teamId:G??(e.teamConfigured?e.team.id:void 0)}}if(I.exp&&!N){let G=Math.min(I.exp*1e3,Date.now()+d);if(p.size>=f){let H=Date.now();for(let[X,J]of p)J.exp<H&&p.delete(X);p.size>=f&&p.clear()}p.set(C,{user:O,exp:G})}return O}let y=A=>{let S=(A.headers["x-auth-request-email"]||"").trim().toLowerCase();if(S)return e.devMode||!e.proxySecret&&e.trustProxyHeadersUnverified||(0,yu.hasTrustedProxyProof)(A.headers,e.proxySecret)?S:null},E=(A,S,C)=>{u("proxy_header.unverified",{ip:S,path:C}),Se(A,401,{error:"unauthorized",error_description:`X-Auth-Request-Email was present without a valid ${za.AUTH_PROXY_SECRET_HEADER} header. Only the trusted reverse proxy may assert an identity to this broker.`})},w=pH.createServer(async(A,S)=>{try{let C=A.headers.host||`127.0.0.1:${e.port}`,v=new Qa.URL(A.url||"/",`http://${C}`),I=v.pathname,P=(0,yu.clientIp)(A),L=()=>s.tryConsume(P)?!1:(u("rate_limited",{ip:P,path:I}),S.writeHead(429,{"Content-Type":"application/json","Retry-After":String(s.retryAfterSeconds(P))}),S.end(JSON.stringify({error:"rate_limited"})),!0);if(A.method==="GET"&&(I==="/health"||I==="/api/ide/health")){Se(S,200,{status:"ok",service:"auth-broker"});return}if(A.method==="GET"&&I==="/oauth/authorize"){if(L())return;let O=v.searchParams.get("client_id")||"",G=v.searchParams.get("redirect_uri")||"",H=v.searchParams.get("code_challenge")||"",X=v.searchParams.get("state")||"",J=v.searchParams.get("login_hint")||v.searchParams.get("email")||"";if(O!==Eu.AUTH_CLIENT_ID||!G||!H){u("authorize.invalid_request",{client_id:O}),Se(S,400,{error:"invalid_request"});return}if(!_A(G)){u("authorize.invalid_redirect_uri",{client_id:O}),Se(S,400,{error:"invalid_request",error_description:"redirect_uri not allowed"});return}if(e.devMode&&J){let We=r.upsertUser(J),Ue=r.createAuthCode({userId:We.id,clientId:O,redirectUri:G,codeChallenge:H});u("authorize.dev",{user:We.email});let vt=new Qa.URL(G);vt.searchParams.set("code",Ue),X&&vt.searchParams.set("state",X),S.writeHead(302,{Location:vt.toString()}),S.end();return}let W=y(A);if(W===null){E(S,P,I);return}if(!W){Se(S,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let ee=r.upsertUser(W),le=r.createAuthCode({userId:ee.id,clientId:O,redirectUri:G,codeChallenge:H});u("authorize.signin",{user:ee.email});let pe=new Qa.URL(G);pe.searchParams.set("code",le),X&&pe.searchParams.set("state",X),S.writeHead(302,{Location:pe.toString()}),S.end();return}if(A.method==="GET"&&I==="/oauth/browser-login"){if(L())return;let O=y(A);if(O===null){E(S,P,I);return}if(!O){Se(S,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let G=r.upsertUser(O),H=r.issueTokens(G,Eu.AUTH_CLIENT_ID,"openid profile email agenthippo:ide");u("browser.login",{user:G.email});let X=e.publicBaseUrl.startsWith("https"),J=[`${e.cookieName}=${H.accessToken}`,"Path=/","HttpOnly","SameSite=Lax",...X?["Secure"]:[],...e.cookieDomain?[`Domain=${e.cookieDomain}`]:[],`Max-Age=${H.expiresIn}`],W=AH(v.searchParams.get("return_to")||"",e.cookieDomain,e.publicBaseUrl||"/");S.writeHead(302,{"Set-Cookie":J.join("; "),Location:W}),S.end();return}if(A.method==="POST"&&I==="/oauth/dev/login"){if(L())return;if(!e.devMode){Se(S,404,{error:"not_found"});return}let O=await hg(A),G=O.trim().startsWith("{")?JSON.parse(O):mg(O),H=G.email?.trim(),X=G.code_challenge?.trim(),J=G.redirect_uri?.trim(),W=G.client_id?.trim()||Eu.AUTH_CLIENT_ID;if(!H||!X||!J){Se(S,400,{error:"invalid_request"});return}let ee=r.upsertUser(H),le=r.createAuthCode({userId:ee.id,clientId:W,redirectUri:J,codeChallenge:X});u("dev.login",{user:ee.email}),Se(S,200,{code:le});return}if(A.method==="POST"&&I==="/oauth/token"){let O=await hg(A),G=mg(O),H=G.grant_type;if(H!==cs.JWT_BEARER_GRANT&&L())return;let X=G.client_id||Eu.AUTH_CLIENT_ID,J=G.scope||"openid profile email agenthippo:ide";if(H===cs.JWT_BEARER_GRANT){let W=i.length===0?{ok:!1,reason:"no federated issuers are configured on this broker",detail:"no issuers"}:(0,cs.verifyAssertion)(G.assertion??"",i,c);if(!W.ok){if(L())return;u("token.federated.invalid_grant",{ip:P,reason:W.detail}),Se(S,400,{error:"invalid_grant",error_description:W.reason});return}let{issuer:ee}=W,le=(0,cs.hostOf)(W.resource);if(!le||!ee.audiences.includes(le)||(0,cs.hostOf)(G.resource??"")!==le){if(L())return;u("token.federated.invalid_target",{issuer:ee.name,resource:W.resource}),Se(S,400,{error:"invalid_target",error_description:`resource must be one of the hosts configured for ${ee.name}`});return}let pe=W.jti,We=a.get(ee.name);if(We?.has(pe)){if(L())return;u("token.federated.replay",{issuer:ee.name,ip:P}),Se(S,400,{error:"invalid_grant",error_description:"this assertion (jti) was already used"});return}let Ue=o.get(ee.name);if(Ue&&!Ue.tryConsume(ee.name)){u("token.federated.rate_limited",{issuer:ee.name}),S.writeHead(429,{"Content-Type":"application/json","Retry-After":String(Ue.retryAfterSeconds(ee.name))}),S.end(JSON.stringify({error:"rate_limited"}));return}if(!We?.claim(pe,W.exp)){u("token.federated.replay",{issuer:ee.name,ip:P}),Se(S,400,{error:"invalid_grant",error_description:"this assertion (jti) was already used"});return}let vt=`${ee.prefix}:${W.sub}`,xe=(0,Xa.signJwt)({sub:vt,name:vt,aud:le,scope:cs.FEDERATED_SCOPE},e.jwtSecret,ee.tokenTtlSec);u("token.federated",{issuer:ee.name,sub:vt,aud:le}),Se(S,200,{access_token:xe,token_type:"Bearer",expires_in:ee.tokenTtlSec,scope:cs.FEDERATED_SCOPE});return}if(H==="authorization_code"){let W=G.code,ee=G.code_verifier,le=G.redirect_uri;if(!W||!ee||!le){Se(S,400,{error:"invalid_request"});return}let pe=r.consumeAuthCode(W);if(!pe||pe.clientId!==X||pe.redirectUri!==le){Se(S,400,{error:"invalid_grant"});return}if(!(0,_H.verifyPkceChallenge)(ee,pe.codeChallenge)){Se(S,400,{error:"invalid_grant",error_description:"PKCE verification failed"});return}let We=r.getUser(pe.userId);if(!We){Se(S,400,{error:"invalid_grant"});return}let Ue=r.issueTokens(We,X,J);u("token.signin",{user:We.email,client_id:X}),Se(S,200,{access_token:Ue.accessToken,refresh_token:Ue.refreshToken,token_type:"Bearer",expires_in:Ue.expiresIn,scope:J});return}if(H==="refresh_token"){let W=G.refresh_token;if(!W){Se(S,400,{error:"invalid_request"});return}let ee=r.consumeRefreshToken(W);if(!ee||ee.clientId!==X){u("token.refresh.invalid_grant"),Se(S,400,{error:"invalid_grant"});return}let le=r.getUser(ee.userId);if(!le){Se(S,400,{error:"invalid_grant"});return}let pe=r.issueTokens(le,X,J);u("token.refresh",{user:le.email}),Se(S,200,{access_token:pe.accessToken,refresh_token:pe.refreshToken,token_type:"Bearer",expires_in:pe.expiresIn,scope:J});return}Se(S,400,{error:"unsupported_grant_type"});return}if(A.method==="POST"&&I==="/oauth/introspect"){if(!h(A)){u("introspect.unauthorized"),Se(S,401,{error:"unauthorized"});return}let O=await hg(A),H=mg(O).token;if(!H){Se(S,400,{error:"invalid_request"});return}let X=(0,Xa.verifyJwt)(H,e.jwtSecret);if(!X?.sub||typeof X.email!="string"||!X.email){Se(S,200,{active:!1});return}Se(S,200,{active:!0,sub:X.sub,email:X.email,team_id:X.team_id,scope:X.scope,exp:X.exp});return}let N=h(A);if(A.method==="GET"&&I==="/api/ide/me"){if(!N){let G=Date.now();G-_>g&&(_=G,u("me.unauthorized")),Se(S,401,{error:"unauthorized"});return}S.setHeader("X-Agent-User",N.email||N.id);let O=(0,Xa.extractBearerToken)(A.headers.authorization)||mA(A.headers.cookie,e.cookieName);O&&S.setHeader("X-Agent-User-Assertion",O),Se(S,200,r.buildMe(N));return}if(A.method==="GET"&&I==="/api/ide/bootstrap"){if(!N){Se(S,401,{error:"unauthorized"});return}Se(S,200,r.buildBootstrap(N));return}if(A.method==="POST"&&I==="/api/ide/signout"){N&&(r.revokeRefreshTokensForUser(N.id),u("signout",{user:N.email})),Se(S,200,{ok:!0});return}Se(S,404,{error:"not_found"})}catch(C){let v=C.status;if(v===413){Se(S,413,{error:"request_entity_too_large"});return}if(v===403){u("forbidden",{reason:"email_domain"}),Se(S,403,{error:"forbidden",error_description:"email domain not allowed"});return}console.error("[auth-broker] internal error",C),Se(S,500,{error:"server_error"})}});return{server:w,baseUrl:e.publicBaseUrl,store:r,config:e,close:()=>new Promise((A,S)=>{w.close(C=>C?S(C):A())})}}async function TH(t){let e=EA(t),n=(0,za.resolveAuthBrokerBind)();return n.isPublic&&console.warn(`[auth-broker] WARNING: listening on ${n.address}:${e.config.port} \u2014 this token-issuing endpoint is reachable from off-host (AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND=1). Ensure only the reverse proxy can reach it and that AGENTHIPPO_AUTH_PROXY_SECRET is set.`),await new Promise((r,s)=>{e.server.listen(e.config.port,n.address,()=>r()),e.server.once("error",s)}),e}});var wA=T(Eg=>{"use strict";Object.defineProperty(Eg,"__esModule",{value:!0});Eg.authBrokerCommand=OH;var bH=Ca(),vH=yA();async function OH(){let t=(0,bH.loadAuthBrokerConfig)(),e=await(0,vH.startAuthBrokerServer)(t);console.log(`AgentHippo auth broker listening on ${e.baseUrl}`),console.log(" GET /health"),console.log(" GET /oauth/authorize"),console.log(" POST /oauth/token"),console.log(" GET /api/ide/bootstrap"),await new Promise(n=>{let r=()=>{e.close().then(n).catch(()=>n())};process.once("SIGINT",r),process.once("SIGTERM",r)})}});var wg=T(jr=>{"use strict";Object.defineProperty(jr,"__esModule",{value:!0});jr.EDGE_AGENT_PORT=void 0;jr.renderIdentityLayer=yg;jr.renderSidecarEdgeCaddyfile=IH;jr.renderSidecarFedCaddyfile=PH;var SA=[" # Proves this hop is the trusted proxy \u2014 the broker 401s X-Auth-Request-Email without it."," header_up x-agenthippo-proxy-secret {env.AGENTHIPPO_AUTH_PROXY_SECRET}"];function yg(t){let{mode:e,authBrokerAddr:n,healthProxy:r,agentProxy:s}=t,i=t.oauth2ProxyAddr??"",o=t.catchallBody??s,a=t.turnRegistration,c=a?[" # Turn registration \u2014 after identity: X-Agent-User (set above) names the user the"," # sidecar mints the nonce for. Only POST chat turns match; others pass through."," # X-Agent-User-Assertion (also set above) rides along as the turn's inboundToken:"," # without it `passthrough` fails closed on every call and an RFC 8693 `exchange`"," # provider has no subject_token.",` forward_auth @turnStart ${a.connectorAddr} {`," uri /edge/turn"," copy_headers X-Agent-Turn-Nonce",` header_up Authorization "Bearer {$${a.tokenEnvVar}}"`," }"]:[],l=f=>f.map(p=>p.trim()?` ${p}`:p),u=(f,p)=>a?[" route {",...l(f),...c,...l(p)," }"]:[...f,...p],d=[];if(d.push(" # Hygiene: never let a client-supplied nonce or assertion header through. The trusted"," # values are set from the verified /api/ide/me response below, never from the client \u2014"," # a forged assertion would ride as the turn's inboundToken."," request_header -X-Agent-Turn-Nonce"," request_header -X-Agent-User-Assertion"),e==="self-issued"&&d.push(" # IDE PKCE sign-in: broker requires X-Auth-Request-Email from oauth2-proxy. Must come"," # before the generic /oauth/* handle so authorize is gated (not dumped straight to broker)."," handle /oauth/authorize {",` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...SA," }"," }"," # Federated SSO (A\u2032): browsers from other subdomains land here to stamp the shared cookie."," # Same oauth2-proxy gate as authorize; must precede the generic /oauth/* handle."," handle /oauth/browser-login {",` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...SA," }"," }"," # Auth-broker: token exchange + other /oauth/* routes that must stay ungated."," handle /oauth/* {",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),d.push(" handle /api/ide/* {",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),e==="self-issued"&&d.push(" # oauth2-proxy: Google SSO callback + sign-in."," handle /oauth2/* {",` reverse_proxy ${i} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),d.push(" @health path /health /ready"," handle @health {",...r," }"),a&&d.push(" # Chat-turn matcher for edge turn registration (P1 fix): only POST chat turns register."," @turnStart {"," method POST"," path /v1/chat /v1/chat/stream"," }"),d.push(" # API clients (IDE) with a Bearer token: validate via auth-broker, copy identity header."," @apiWithAuth {"," path /v1/*"," header Authorization *"," }"," handle @apiWithAuth {",...u([` forward_auth ${n} {`," uri /api/ide/me",` copy_headers X-Agent-User${a?" X-Agent-User-Assertion":""}`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' respond "Unauthorized" 401'," }"," }"],s)," }"),e==="self-issued")d.push(" # Browser clients: SSO via oauth2-proxy, identity injected as X-Agent-User."," handle {",...u([` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email>X-Agent-User"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }"],o)," }");else{let f=t.idpUrl?.trim()||"",p=f?` redir * "${f}/oauth/browser-login?return_to=https://{http.request.host}{http.request.uri_escaped}" 302`:' respond "Unauthorized" 401';d.push(" # Browser clients: the shared .agenthippo.ai cookie is verified by auth-broker. No cookie"," # \u2192 redirect to the central IdP to log in (it stamps the cookie), then return."," handle {",...u([` forward_auth ${n} {`," uri /api/ide/me"," copy_headers X-Agent-User"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",p," }"," }"],o)," }")}return d}jr.EDGE_AGENT_PORT=8090;function IH(){return["# Sidecar-platform edge ingress. TLS terminates in front; Caddy listens on HTTP :{$PORT}.","# Containers share one task/pod's localhost \u2192 upstreams are 127.0.0.1:<port> (not docker-DNS names).","{"," auto_https off","}","",":{$PORT} {",...yg({mode:"self-issued",oauth2ProxyAddr:"localhost:4180",authBrokerAddr:"localhost:9780",healthProxy:[` reverse_proxy localhost:${jr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${jr.EDGE_AGENT_PORT}`]}),"}",""].join(`
594
+ If the broker is genuinely unreachable except through the proxy and you accept the risk, set AGENTHIPPO_AUTH_TRUST_PROXY_UNVERIFIED=1.`);!e.devMode&&!e.proxySecret&&e.trustProxyHeadersUnverified&&console.warn("[auth-broker] WARNING: AGENTHIPPO_AUTH_TRUST_PROXY_UNVERIFIED=1 \u2014 X-Auth-Request-Email is accepted without proof. Anything that can reach this port can mint a token for any email. Set AGENTHIPPO_AUTH_PROXY_SECRET to close this."),!e.devMode&&e.allowedEmailDomains.length===0&&console.warn('[auth-broker] Warning: AGENTHIPPO_AUTH_ALLOWED_DOMAINS is not set \u2014 any upstream-SSO-authenticated email can receive a token. Set it to restrict sign-in (e.g. "example.com").');let n=e.dataDir?hH.join(e.dataDir,"auth-store.json"):void 0,r=new mH.AuthBrokerStore(e,n),s=new yu.RateLimiter(e.rateLimitPerMin),i=e.issuers??[],o=new Map(i.map(A=>[A.name,new yu.RateLimiter(A.ratePerMin)])),a=new Map(i.map(A=>[A.name,cs.JtiReplayCache.forIssuer(A)])),c=[`${e.publicBaseUrl}/oauth/token`,e.publicBaseUrl],l=e.federatedAudiences??[];for(let A of i){console.log(`[auth-broker] federated issuer ${A.name}: identities ${A.prefix}:<id>, tokens for ${A.audiences.join(", ")}`);let S=A.audiences.filter(C=>!l.includes(C));S.length>0&&console.log(`[auth-broker] ${A.name}'s tokens for ${S.join(", ")} are honoured only by a broker fronting those hosts (AGENTHIPPO_AUTH_AUDIENCES), not by this one`)}l.length>0&&console.log(`[auth-broker] honours federated tokens for: ${l.join(", ")}`);let u=(A,S={})=>{let C=Object.entries(S).filter(([,b])=>b!==void 0&&b!=="").map(([b,I])=>{let P=!e.logPii&&typeof I=="string"&&I.includes("@")?wH(I):I,L=typeof P=="string"&&/[\s"\\\u0000-\u001f\u007f]/.test(P)?JSON.stringify(P):P;return`${b}=${L}`}).join(" ");console.log(`[auth-broker] ${A}${C?" "+C:""}`)},f=1e4,d=2048,g=new Map,p=5e3,_=0;function h(A){let S=(0,Xa.extractBearerToken)(A.headers.authorization)||mA(A.headers.cookie,e.cookieName);if(!S)return;let C=gH.createHash("sha256").update(S).digest("hex"),b=g.get(C);if(b){if(b.exp>Date.now())return b.user;g.delete(C)}let I=(0,Xa.verifyJwt)(S,e.jwtSecret);if(!I?.sub)return;let P=typeof I.email=="string"?I.email:"",N=!P||I.aud!==void 0;if(N&&!(0,cs.federatedTokenAccepted)(I.aud,(0,cs.forwardedHost)(A.headers),l))return;let O=r.getUser(String(I.sub));if(!O){let G=typeof I.team_id=="string"&&I.team_id?I.team_id:void 0;O={id:String(I.sub),email:P,displayName:typeof I.name=="string"&&I.name?I.name:P||String(I.sub),teamId:G??(e.teamConfigured?e.team.id:void 0)}}if(I.exp&&!N){let G=Math.min(I.exp*1e3,Date.now()+f);if(g.size>=d){let H=Date.now();for(let[X,J]of g)J.exp<H&&g.delete(X);g.size>=d&&g.clear()}g.set(C,{user:O,exp:G})}return O}let y=A=>{let S=(A.headers["x-auth-request-email"]||"").trim().toLowerCase();if(S)return e.devMode||!e.proxySecret&&e.trustProxyHeadersUnverified||(0,yu.hasTrustedProxyProof)(A.headers,e.proxySecret)?S:null},E=(A,S,C)=>{u("proxy_header.unverified",{ip:S,path:C}),Se(A,401,{error:"unauthorized",error_description:`X-Auth-Request-Email was present without a valid ${za.AUTH_PROXY_SECRET_HEADER} header. Only the trusted reverse proxy may assert an identity to this broker.`})},w=pH.createServer(async(A,S)=>{try{let C=A.headers.host||`127.0.0.1:${e.port}`,b=new Qa.URL(A.url||"/",`http://${C}`),I=b.pathname,P=(0,yu.clientIp)(A),L=()=>s.tryConsume(P)?!1:(u("rate_limited",{ip:P,path:I}),S.writeHead(429,{"Content-Type":"application/json","Retry-After":String(s.retryAfterSeconds(P))}),S.end(JSON.stringify({error:"rate_limited"})),!0);if(A.method==="GET"&&(I==="/health"||I==="/api/ide/health")){Se(S,200,{status:"ok",service:"auth-broker"});return}if(A.method==="GET"&&I==="/oauth/authorize"){if(L())return;let O=b.searchParams.get("client_id")||"",G=b.searchParams.get("redirect_uri")||"",H=b.searchParams.get("code_challenge")||"",X=b.searchParams.get("state")||"",J=b.searchParams.get("login_hint")||b.searchParams.get("email")||"";if(O!==Eu.AUTH_CLIENT_ID||!G||!H){u("authorize.invalid_request",{client_id:O}),Se(S,400,{error:"invalid_request"});return}if(!_A(G)){u("authorize.invalid_redirect_uri",{client_id:O}),Se(S,400,{error:"invalid_request",error_description:"redirect_uri not allowed"});return}if(e.devMode&&J){let We=r.upsertUser(J),Ue=r.createAuthCode({userId:We.id,clientId:O,redirectUri:G,codeChallenge:H});u("authorize.dev",{user:We.email});let vt=new Qa.URL(G);vt.searchParams.set("code",Ue),X&&vt.searchParams.set("state",X),S.writeHead(302,{Location:vt.toString()}),S.end();return}let W=y(A);if(W===null){E(S,P,I);return}if(!W){Se(S,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let ee=r.upsertUser(W),le=r.createAuthCode({userId:ee.id,clientId:O,redirectUri:G,codeChallenge:H});u("authorize.signin",{user:ee.email});let pe=new Qa.URL(G);pe.searchParams.set("code",le),X&&pe.searchParams.set("state",X),S.writeHead(302,{Location:pe.toString()}),S.end();return}if(A.method==="GET"&&I==="/oauth/browser-login"){if(L())return;let O=y(A);if(O===null){E(S,P,I);return}if(!O){Se(S,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let G=r.upsertUser(O),H=r.issueTokens(G,Eu.AUTH_CLIENT_ID,"openid profile email agenthippo:ide");u("browser.login",{user:G.email});let X=e.publicBaseUrl.startsWith("https"),J=[`${e.cookieName}=${H.accessToken}`,"Path=/","HttpOnly","SameSite=Lax",...X?["Secure"]:[],...e.cookieDomain?[`Domain=${e.cookieDomain}`]:[],`Max-Age=${H.expiresIn}`],W=AH(b.searchParams.get("return_to")||"",e.cookieDomain,e.publicBaseUrl||"/");S.writeHead(302,{"Set-Cookie":J.join("; "),Location:W}),S.end();return}if(A.method==="POST"&&I==="/oauth/dev/login"){if(L())return;if(!e.devMode){Se(S,404,{error:"not_found"});return}let O=await hg(A),G=O.trim().startsWith("{")?JSON.parse(O):mg(O),H=G.email?.trim(),X=G.code_challenge?.trim(),J=G.redirect_uri?.trim(),W=G.client_id?.trim()||Eu.AUTH_CLIENT_ID;if(!H||!X||!J){Se(S,400,{error:"invalid_request"});return}let ee=r.upsertUser(H),le=r.createAuthCode({userId:ee.id,clientId:W,redirectUri:J,codeChallenge:X});u("dev.login",{user:ee.email}),Se(S,200,{code:le});return}if(A.method==="POST"&&I==="/oauth/token"){let O=await hg(A),G=mg(O),H=G.grant_type;if(H!==cs.JWT_BEARER_GRANT&&L())return;let X=G.client_id||Eu.AUTH_CLIENT_ID,J=G.scope||"openid profile email agenthippo:ide";if(H===cs.JWT_BEARER_GRANT){let W=i.length===0?{ok:!1,reason:"no federated issuers are configured on this broker",detail:"no issuers"}:(0,cs.verifyAssertion)(G.assertion??"",i,c);if(!W.ok){if(L())return;u("token.federated.invalid_grant",{ip:P,reason:W.detail}),Se(S,400,{error:"invalid_grant",error_description:W.reason});return}let{issuer:ee}=W,le=(0,cs.hostOf)(W.resource);if(!le||!ee.audiences.includes(le)||(0,cs.hostOf)(G.resource??"")!==le){if(L())return;u("token.federated.invalid_target",{issuer:ee.name,resource:W.resource}),Se(S,400,{error:"invalid_target",error_description:`resource must be one of the hosts configured for ${ee.name}`});return}let pe=W.jti,We=a.get(ee.name);if(We?.has(pe)){if(L())return;u("token.federated.replay",{issuer:ee.name,ip:P}),Se(S,400,{error:"invalid_grant",error_description:"this assertion (jti) was already used"});return}let Ue=o.get(ee.name);if(Ue&&!Ue.tryConsume(ee.name)){u("token.federated.rate_limited",{issuer:ee.name}),S.writeHead(429,{"Content-Type":"application/json","Retry-After":String(Ue.retryAfterSeconds(ee.name))}),S.end(JSON.stringify({error:"rate_limited"}));return}if(!We?.claim(pe,W.exp)){u("token.federated.replay",{issuer:ee.name,ip:P}),Se(S,400,{error:"invalid_grant",error_description:"this assertion (jti) was already used"});return}let vt=`${ee.prefix}:${W.sub}`,xe=(0,Xa.signJwt)({sub:vt,name:vt,aud:le,scope:cs.FEDERATED_SCOPE},e.jwtSecret,ee.tokenTtlSec);u("token.federated",{issuer:ee.name,sub:vt,aud:le}),Se(S,200,{access_token:xe,token_type:"Bearer",expires_in:ee.tokenTtlSec,scope:cs.FEDERATED_SCOPE});return}if(H==="authorization_code"){let W=G.code,ee=G.code_verifier,le=G.redirect_uri;if(!W||!ee||!le){Se(S,400,{error:"invalid_request"});return}let pe=r.consumeAuthCode(W);if(!pe||pe.clientId!==X||pe.redirectUri!==le){Se(S,400,{error:"invalid_grant"});return}if(!(0,_H.verifyPkceChallenge)(ee,pe.codeChallenge)){Se(S,400,{error:"invalid_grant",error_description:"PKCE verification failed"});return}let We=r.getUser(pe.userId);if(!We){Se(S,400,{error:"invalid_grant"});return}let Ue=r.issueTokens(We,X,J);u("token.signin",{user:We.email,client_id:X}),Se(S,200,{access_token:Ue.accessToken,refresh_token:Ue.refreshToken,token_type:"Bearer",expires_in:Ue.expiresIn,scope:J});return}if(H==="refresh_token"){let W=G.refresh_token;if(!W){Se(S,400,{error:"invalid_request"});return}let ee=r.consumeRefreshToken(W);if(!ee||ee.clientId!==X){u("token.refresh.invalid_grant"),Se(S,400,{error:"invalid_grant"});return}let le=r.getUser(ee.userId);if(!le){Se(S,400,{error:"invalid_grant"});return}let pe=r.issueTokens(le,X,J);u("token.refresh",{user:le.email}),Se(S,200,{access_token:pe.accessToken,refresh_token:pe.refreshToken,token_type:"Bearer",expires_in:pe.expiresIn,scope:J});return}Se(S,400,{error:"unsupported_grant_type"});return}if(A.method==="POST"&&I==="/oauth/introspect"){if(!h(A)){u("introspect.unauthorized"),Se(S,401,{error:"unauthorized"});return}let O=await hg(A),H=mg(O).token;if(!H){Se(S,400,{error:"invalid_request"});return}let X=(0,Xa.verifyJwt)(H,e.jwtSecret);if(!X?.sub||typeof X.email!="string"||!X.email){Se(S,200,{active:!1});return}Se(S,200,{active:!0,sub:X.sub,email:X.email,team_id:X.team_id,scope:X.scope,exp:X.exp});return}let N=h(A);if(A.method==="GET"&&I==="/api/ide/me"){if(!N){let G=Date.now();G-_>p&&(_=G,u("me.unauthorized")),Se(S,401,{error:"unauthorized"});return}S.setHeader("X-Agent-User",N.email||N.id);let O=(0,Xa.extractBearerToken)(A.headers.authorization)||mA(A.headers.cookie,e.cookieName);O&&S.setHeader("X-Agent-User-Assertion",O),Se(S,200,r.buildMe(N));return}if(A.method==="GET"&&I==="/api/ide/bootstrap"){if(!N){Se(S,401,{error:"unauthorized"});return}Se(S,200,r.buildBootstrap(N));return}if(A.method==="POST"&&I==="/api/ide/signout"){N&&(r.revokeRefreshTokensForUser(N.id),u("signout",{user:N.email})),Se(S,200,{ok:!0});return}Se(S,404,{error:"not_found"})}catch(C){let b=C.status;if(b===413){Se(S,413,{error:"request_entity_too_large"});return}if(b===403){u("forbidden",{reason:"email_domain"}),Se(S,403,{error:"forbidden",error_description:"email domain not allowed"});return}console.error("[auth-broker] internal error",C),Se(S,500,{error:"server_error"})}});return{server:w,baseUrl:e.publicBaseUrl,store:r,config:e,close:()=>new Promise((A,S)=>{w.close(C=>C?S(C):A())})}}async function TH(t){let e=EA(t),n=(0,za.resolveAuthBrokerBind)();return n.isPublic&&console.warn(`[auth-broker] WARNING: listening on ${n.address}:${e.config.port} \u2014 this token-issuing endpoint is reachable from off-host (AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND=1). Ensure only the reverse proxy can reach it and that AGENTHIPPO_AUTH_PROXY_SECRET is set.`),await new Promise((r,s)=>{e.server.listen(e.config.port,n.address,()=>r()),e.server.once("error",s)}),e}});var wA=T(Eg=>{"use strict";Object.defineProperty(Eg,"__esModule",{value:!0});Eg.authBrokerCommand=OH;var bH=Ca(),vH=yA();async function OH(){let t=(0,bH.loadAuthBrokerConfig)(),e=await(0,vH.startAuthBrokerServer)(t);console.log(`AgentHippo auth broker listening on ${e.baseUrl}`),console.log(" GET /health"),console.log(" GET /oauth/authorize"),console.log(" POST /oauth/token"),console.log(" GET /api/ide/bootstrap"),await new Promise(n=>{let r=()=>{e.close().then(n).catch(()=>n())};process.once("SIGINT",r),process.once("SIGTERM",r)})}});var wg=T(jr=>{"use strict";Object.defineProperty(jr,"__esModule",{value:!0});jr.EDGE_AGENT_PORT=void 0;jr.renderIdentityLayer=yg;jr.renderSidecarEdgeCaddyfile=IH;jr.renderSidecarFedCaddyfile=PH;var SA=[" # Proves this hop is the trusted proxy \u2014 the broker 401s X-Auth-Request-Email without it."," header_up x-agenthippo-proxy-secret {env.AGENTHIPPO_AUTH_PROXY_SECRET}"];function yg(t){let{mode:e,authBrokerAddr:n,healthProxy:r,agentProxy:s}=t,i=t.oauth2ProxyAddr??"",o=t.catchallBody??s,a=t.turnRegistration,c=a?[" # Turn registration \u2014 after identity: X-Agent-User (set above) names the user the"," # sidecar mints the nonce for. Only POST chat turns match; others pass through."," # X-Agent-User-Assertion (also set above) rides along as the turn's inboundToken:"," # without it `passthrough` fails closed on every call and an RFC 8693 `exchange`"," # provider has no subject_token.",` forward_auth @turnStart ${a.connectorAddr} {`," uri /edge/turn"," copy_headers X-Agent-Turn-Nonce",` header_up Authorization "Bearer {$${a.tokenEnvVar}}"`," }"]:[],l=d=>d.map(g=>g.trim()?` ${g}`:g),u=(d,g)=>a?[" route {",...l(d),...c,...l(g)," }"]:[...d,...g],f=[];if(f.push(" # Hygiene: never let a client-supplied nonce or assertion header through. The trusted"," # values are set from the verified /api/ide/me response below, never from the client \u2014"," # a forged assertion would ride as the turn's inboundToken."," request_header -X-Agent-Turn-Nonce"," request_header -X-Agent-User-Assertion"),e==="self-issued"&&f.push(" # IDE PKCE sign-in: broker requires X-Auth-Request-Email from oauth2-proxy. Must come"," # before the generic /oauth/* handle so authorize is gated (not dumped straight to broker)."," handle /oauth/authorize {",` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...SA," }"," }"," # Federated SSO (A\u2032): browsers from other subdomains land here to stamp the shared cookie."," # Same oauth2-proxy gate as authorize; must precede the generic /oauth/* handle."," handle /oauth/browser-login {",` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...SA," }"," }"," # Auth-broker: token exchange + other /oauth/* routes that must stay ungated."," handle /oauth/* {",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),f.push(" handle /api/ide/* {",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),e==="self-issued"&&f.push(" # oauth2-proxy: Google SSO callback + sign-in."," handle /oauth2/* {",` reverse_proxy ${i} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),f.push(" @health path /health /ready"," handle @health {",...r," }"),a&&f.push(" # Chat-turn matcher for edge turn registration (P1 fix): only POST chat turns register."," @turnStart {"," method POST"," path /v1/chat /v1/chat/stream"," }"),f.push(" # API clients (IDE) with a Bearer token: validate via auth-broker, copy identity header."," @apiWithAuth {"," path /v1/*"," header Authorization *"," }"," handle @apiWithAuth {",...u([` forward_auth ${n} {`," uri /api/ide/me",` copy_headers X-Agent-User${a?" X-Agent-User-Assertion":""}`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' respond "Unauthorized" 401'," }"," }"],s)," }"),e==="self-issued")f.push(" # Browser clients: SSO via oauth2-proxy, identity injected as X-Agent-User."," handle {",...u([` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email>X-Agent-User"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }"],o)," }");else{let d=t.idpUrl?.trim()||"",g=d?` redir * "${d}/oauth/browser-login?return_to=https://{http.request.host}{http.request.uri_escaped}" 302`:' respond "Unauthorized" 401';f.push(" # Browser clients: the shared .agenthippo.ai cookie is verified by auth-broker. No cookie"," # \u2192 redirect to the central IdP to log in (it stamps the cookie), then return."," handle {",...u([` forward_auth ${n} {`," uri /api/ide/me"," copy_headers X-Agent-User"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",g," }"," }"],o)," }")}return f}jr.EDGE_AGENT_PORT=8090;function IH(){return["# Sidecar-platform edge ingress. TLS terminates in front; Caddy listens on HTTP :{$PORT}.","# Containers share one task/pod's localhost \u2192 upstreams are 127.0.0.1:<port> (not docker-DNS names).","{"," auto_https off","}","",":{$PORT} {",...yg({mode:"self-issued",oauth2ProxyAddr:"localhost:4180",authBrokerAddr:"localhost:9780",healthProxy:[` reverse_proxy localhost:${jr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${jr.EDGE_AGENT_PORT}`]}),"}",""].join(`
595
595
  `)}function PH(t){let e=(t||"").trim().replace(/\/+$/,"");return["# Sidecar-platform federated edge (A\u2032). TLS terminates in front; Caddy listens on HTTP :{$PORT}.",`# No oauth2-proxy \u2014 Google login happens once at the central IdP (${e||"<IDP_URL>"});`,"# this agent only verifies the shared AgentHippo JWT (Bearer for IDE, cookie for browser).","{"," auto_https off","}","",":{$PORT} {",...yg({mode:"federated",authBrokerAddr:"localhost:9780",idpUrl:e,healthProxy:[` reverse_proxy localhost:${jr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${jr.EDGE_AGENT_PORT}`]}),"}",""].join(`
596
596
  `)}});var Og=T(te=>{"use strict";var NH=te&&te.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),RH=te&&te.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),AA=te&&te.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&NH(n,e,r[s]);return RH(n,e),n}})();Object.defineProperty(te,"__esModule",{value:!0});te.DEPLOY_PUBLIC_HOSTNAME=te.DEFAULT_DEPLOY_PUBLIC_HOSTNAME=te.AGENTHIPPO_HIPPOCLAW_NPM=te.AGENTHIPPO_LITELLM_IMAGE_TAG=te.AGENTHIPPO_RUNTIME_IMAGE_TAG=te.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK=te.AGENTHIPPO_CLI_NPM_PACKAGE=te.AGENTHIPPO_IMAGE_REGISTRY=te.DEPLOY_TARGETS=void 0;te.isDeployTarget=CH;te.resolveCliReleaseVersion=Sg;te.resolveAgentHippoCliNpmVersion=vA;te.agenthippoImage=js;te.defaultRuntimeImage=kH;te.packAttributionBody=OA;te.packAttributionComment=Ag;te.withPackAttribution=IA;te.serveCmdArgs=Qi;te.resolveDeployPublicHostname=Tg;te.scanEnvRefs=LH;te.renderEnvExample=PA;te.renderAuthEnvExample=NA;te.renderAuthBrokerDockerfile=bg;te.renderChannelsDockerfile=RA;te.isSecretLikeBasename=MH;te.dataPlaneTokenEnvVar=GA;te.renderTarget=ij;var zo=AA(require("fs")),Qo=AA(require("path")),wu=ur(),At=wg();te.DEPLOY_TARGETS=["vm","compose","cloudrun","databricks-app","spcs","cloudflare","aws-ecs","azure-container-apps"];function CH(t){return te.DEPLOY_TARGETS.includes(t)}te.AGENTHIPPO_IMAGE_REGISTRY="ghcr.io/agenthippoai";te.AGENTHIPPO_CLI_NPM_PACKAGE="@agenthippo-ai/agenthippo";te.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK="latest";function TA(){try{return Tl()}catch{try{let t=Qo.join(__dirname,"..","..","package.json");if(zo.existsSync(t))return JSON.parse(zo.readFileSync(t,"utf8"))}catch{}return}}function bA(t){let e=TA()?.agenthippo?.[t]?.trim();if(!e)throw new Error(`extensions/agentide/package.json agenthippo.${t} is missing`);return e}function Sg(){let t=TA()?.version?.trim();if(t&&t!=="0.0.0"&&t!=="dev")return t;try{let e=Qo.join(__dirname,"..","..","..","..","package.json");if(zo.existsSync(e)){let n=JSON.parse(zo.readFileSync(e,"utf8")).version?.trim();if(n&&n!=="0.0.0"&&n!=="dev")return n}}catch{}}function vA(){return Sg()??te.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK}te.AGENTHIPPO_RUNTIME_IMAGE_TAG=Sg()??"dev";te.AGENTHIPPO_LITELLM_IMAGE_TAG=bA("litellmImageTag");te.AGENTHIPPO_HIPPOCLAW_NPM=bA("hippoclawNpm");function js(t,e){let n=t==="runtime"?te.AGENTHIPPO_RUNTIME_IMAGE_TAG:te.AGENTHIPPO_LITELLM_IMAGE_TAG;return`${te.AGENTHIPPO_IMAGE_REGISTRY}/${t}:${n}${e?`-${e}`:""}`}function kH(t){return t.trim().toLowerCase()==="cursor"?js("runtime","cursor"):js("runtime")}function OA(t){return`Generated from Agent Pack ${t.packName}@${t.packVersion} \u2014 packs.agenthippo.ai`}function Ag(t,e="hash"){let n=OA(t);return e==="html"?`<!-- ${n} -->`:e==="sql"?`-- ${n}`:`# ${n}`}function IA(t,e,n){if(n.slice(0,400).includes("packs.agenthippo.ai"))return n;let s=Qo.basename(e),i=Qo.extname(s).toLowerCase();if(i===".json"||i===".jsonc"||s==="wrangler.toml"||s==="package.json")return n;let a=Ag(t,i===".html"||i===".md"?"html":i===".sql"?"sql":"hash");if(n.startsWith("#!")){let c=n.indexOf(`
597
597
  `);return c===-1?`${n}
@@ -658,7 +658,7 @@ ${n}`}function Qi(t,e){let n=["serve","--agent","/app/pack","--workspace","/stat
658
658
  `)}}let i=[{name:"caddy",image:"caddy:2.11-alpine",env:[{name:"PORT",value:String(s)},{name:"AGENTHIPPO_PUBLIC_HOSTNAME",value:t.publicHostname}],resources:{cpu:.25,memory:"0.5Gi"}},...e?[]:[{name:"oauth2-proxy",image:"quay.io/oauth2-proxy/oauth2-proxy:v7.7.1",env:[{name:"OAUTH2_PROXY_HTTP_ADDRESS",value:"0.0.0.0:4180"},{name:"OAUTH2_PROXY_UPSTREAMS",value:"file:///dev/null"},{name:"OAUTH2_PROXY_SET_XAUTHREQUEST",value:"true"},{name:"OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER",value:"true"},{name:"OAUTH2_PROXY_SKIP_PROVIDER_BUTTON",value:"true"},{name:"OAUTH2_PROXY_REVERSE_PROXY",value:"true"},{name:"OAUTH2_PROXY_CLIENT_ID",secretRef:"oauth-client-id"},{name:"OAUTH2_PROXY_CLIENT_SECRET",secretRef:"oauth-client-secret"},{name:"OAUTH2_PROXY_COOKIE_SECRET",secretRef:"oauth-cookie-secret"}],resources:{cpu:.25,memory:"0.5Gi"}}],{name:"auth-broker",image:"${IMAGE}",command:["agenthippo","auth-broker"],env:[{name:"AGENTHIPPO_AUTH_PORT",value:"9780"},{name:"AGENTHIPPO_AUTH_JWT_SECRET",secretRef:"auth-jwt-secret"},...e?[{name:"AGENTHIPPO_AUTH_COOKIE_DOMAIN",value:t.cookieDomain||""},{name:"AGENTHIPPO_AUTH_IDP_URL",value:t.idpUrl||""}]:[]],resources:{cpu:.25,memory:"0.5Gi"}},{name:"agent",image:"${IMAGE}",command:Qi(t,{wwwDir:"/app/pack/deploy/www",port:At.EDGE_AGENT_PORT}),env:[{name:"AGENTHIPPO_NO_AUTO_INSTALL",value:"1"},{name:r,secretRef:"provider-key"}],resources:{cpu:.5,memory:"1Gi"}}],o={properties:{configuration:{ingress:{external:!0,targetPort:s},secrets:[{name:"auth-jwt-secret",value:"${AUTH_JWT_SECRET}"},{name:"provider-key",value:"${PROVIDER_KEY}"},...e?[]:[{name:"oauth-client-id",value:"${OAUTH_CLIENT_ID}"},{name:"oauth-client-secret",value:"${OAUTH_CLIENT_SECRET}"},{name:"oauth-cookie-secret",value:"${OAUTH_COOKIE_SECRET}"}]]},template:{containers:i}}},a=['AUTH_JWT_SECRET="${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET}"',`PROVIDER_KEY="\${PROVIDER_KEY:?set PROVIDER_KEY \u2014 your ${r}}"`,...e?[]:['OAUTH_CLIENT_ID="${OAUTH_CLIENT_ID:?set OAUTH_CLIENT_ID}"','OAUTH_CLIENT_SECRET="${OAUTH_CLIENT_SECRET:?set OAUTH_CLIENT_SECRET}"','OAUTH_COOKIE_SECRET="${OAUTH_COOKIE_SECRET:?set OAUTH_COOKIE_SECRET}"']],c=["#!/usr/bin/env bash",`# Azure Container Apps + AgentHippo edge (${e?"edge-fed: federated identity, no oauth2-proxy":"edge: self-issued"}).`,"# Container Apps environments provide built-in ingress + TLS \u2014 no separate load balancer.","set -euo pipefail",...ls(),'SERVICE="'+t.packName+'"','RESOURCE_GROUP="${RESOURCE_GROUP:?set RESOURCE_GROUP}"','ENVIRONMENT="${CONTAINERAPPS_ENVIRONMENT:?set CONTAINERAPPS_ENVIRONMENT \u2014 az containerapp env create (one-time)}"','ACR_NAME="${ACR_NAME:?set ACR_NAME \u2014 an Azure Container Registry (one-time: az acr create)}"','IMAGE="${ACR_NAME}.azurecr.io/${SERVICE}:latest"',"","# auth-broker reuses the agent image (CLI ships `auth-broker`). Builds in ACR.",'az acr build --registry "$ACR_NAME" --image "${SERVICE}:latest" --file deploy/Dockerfile .',"",...a,'SPEC_JSON="$(sed -e "s|\\${IMAGE}|${IMAGE}|g" -e "s|\\${AUTH_JWT_SECRET}|${AUTH_JWT_SECRET}|g" \\',' -e "s|\\${PROVIDER_KEY}|${PROVIDER_KEY}|g" \\',...e?[]:[' -e "s|\\${OAUTH_CLIENT_ID}|${OAUTH_CLIENT_ID}|g" -e "s|\\${OAUTH_CLIENT_SECRET}|${OAUTH_CLIENT_SECRET}|g" \\',' -e "s|\\${OAUTH_COOKIE_SECRET}|${OAUTH_COOKIE_SECRET}|g" \\'],' deploy/containerapp.json)"','echo "$SPEC_JSON" > /tmp/${SERVICE}-containerapp.json',"","# `--yaml` also accepts JSON (JSON is valid YAML) \u2014 kept as .json so it's reviewable","# alongside the other checked-in templates without a format switch.",'az containerapp show --name "$SERVICE" --resource-group "$RESOURCE_GROUP" >/dev/null 2>&1 \\',' && az containerapp update --name "$SERVICE" --resource-group "$RESOURCE_GROUP" \\'," --yaml /tmp/${SERVICE}-containerapp.json >/dev/null \\",' || az containerapp create --name "$SERVICE" --resource-group "$RESOURCE_GROUP" \\',' --environment "$ENVIRONMENT" --yaml /tmp/${SERVICE}-containerapp.json >/dev/null','echo "Deployed $SERVICE behind the AgentHippo edge in $ENVIRONMENT"',""].join(`
659
659
  `);return{Dockerfile:Yn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":xs(t.packName),Caddyfile:e?(0,At.renderSidecarFedCaddyfile)(t.idpUrl):(0,At.renderSidecarEdgeCaddyfile)(),"containerapp.json":JSON.stringify(o,null,2)+`
660
660
  `,"deploy.sh":c,"README.md":[`# Deploy: ${t.packName} \u2014 Azure Container Apps + AgentHippo edge (${e?"edge-fed":"edge"})`,"",`Engine: **${t.engine}**${t.model?`, model: **${t.model}**`:""}.`,"","One Container App, containers share the replica's localhost \u2014 the same sidecar shape","Cloud Run/ECS Fargate use, so the Caddyfile is identical:","- **caddy** (ingress, the only published port) \u2192 "+(e?"verifies the shared AgentHippo JWT":"SSO edge: oauth2-proxy for browsers, auth-broker for IDE Bearer"),`- **agent** \u2192 serves www + /v1/* on localhost:${At.EDGE_AGENT_PORT} (not published)`,"- **auth-broker** \u2192 validates IDE AgentHippo JWTs (`/api/ide/me`)"+(e?" against the shared IdP secret":""),...e?[]:["- **oauth2-proxy** \u2192 Google SSO for browser clients"],"","Built-in ingress + TLS termination \u2014 no separate load balancer to stand up.","","```bash","export RESOURCE_GROUP=<rg> CONTAINERAPPS_ENVIRONMENT=<env> ACR_NAME=<registry>",...a.map(l=>"export "+l.split("=")[0]+"=<...>"),"bash deploy/deploy.sh","```","","> \u26A0\uFE0F Newer and far less exercised than the Cloud Run target \u2014 read `deploy.sh` before","> running it against a real account.","",...mr(t)].join(`
661
- `)}}var sj={vm:HH,compose:jH,cloudrun:WH,"databricks-app":ZH,spcs:ej,cloudflare:tj,"aws-ecs":nj,"azure-container-apps":rj};function ij(t,e){let n=sj[t](e),r=e.ingress==="edge-fed",s=!!e.colocate&&r&&(t==="vm"||t==="compose"),i=vg(e)&&t==="cloudrun"&&r,o=!s&&(t==="vm"||t==="compose"||(t==="cloudrun"||t==="aws-ecs"||t==="azure-container-apps")&&(e.ingress==="edge"||r)),a=Object.keys(n).some(u=>u==="Dockerfile"||u.endsWith("/Dockerfile")),c={...n,...a?{".dockerignore":GH()}:{},".env.example":PA(e.envVars,{edge:o,engine:e.engine,hostname:e.publicHostname,gatewayDirect:i}),...o?{".env.auth.example":NA({hostname:e.publicHostname,fed:r,idpUrl:e.idpUrl,cookieDomain:e.cookieDomain})}:{},"DATA-ACCESS.md":xH(e,t,o,r,s)},l={};for(let[u,d]of Object.entries(c))l[u]=IA(e,u,d);return l}});var BA=T(us=>{"use strict";Object.defineProperty(us,"__esModule",{value:!0});us.BLUEPRINTS=us.BLUEPRINT_IDS=void 0;us.isBlueprintId=oj;us.resolveBlueprint=aj;us.BLUEPRINT_IDS=["sandbox","prospect-demo","team-pilot","regulated-air-gapped","enterprise-fleet"];function oj(t){return us.BLUEPRINT_IDS.includes(t)}us.BLUEPRINTS={sandbox:{id:"sandbox",description:"Internal test, no external users \u2014 no edge, no SSO, no host port beyond localhost.",targets:["vm"]},"prospect-demo":{id:"prospect-demo",description:"Throwaway public demo for a prospect \u2014 Cloudflare Tunnel + a throwaway Google OAuth client.",targets:["vm","compose"]},"team-pilot":{id:"team-pilot",description:"Single-agent pilot. Rides the customer platform's own identity when one exists (GCP IAP, Databricks workspace SSO, Snowflake network, Cloudflare Access); falls back to a self-issued edge (own Caddy + oauth2-proxy + Google client) on vm/compose/aws-ecs/azure-container-apps, which have no platform-native option yet.",targets:["cloudrun","databricks-app","spcs","cloudflare","vm","compose","aws-ecs","azure-container-apps"]},"regulated-air-gapped":{id:"regulated-air-gapped",description:"VPN/localhost only, no tunnel, no external telemetry \u2014 the highest-scrutiny buyer profile. Currently generator-identical to sandbox; the distinction is buyer framing, not yet enforced posture.",targets:["vm"]},"enterprise-fleet":{id:"enterprise-fleet",description:"Federated identity against a central IdP (enterprise-deploy/idp/) for a growing fleet of agents. Same-host colocation (no edge of its own) is available for vm/compose via the raw `--ingress edge-fed --colocate` flag \u2014 not yet encoded as a blueprint variant.",targets:["cloudrun","vm","compose","aws-ecs","azure-container-apps"]}};function aj(t,e){let n=us.BLUEPRINTS[t],r=e??n.targets[0];if(!n.targets.includes(r))throw new Error(`Blueprint "${t}" does not support --platform ${r}. Supported: ${n.targets.join(", ")}.`);switch(t){case"sandbox":case"regulated-air-gapped":return{target:r};case"prospect-demo":return{target:r,ingress:"edge"};case"enterprise-fleet":return{target:r,ingress:"edge-fed"};case"team-pilot":return r==="cloudrun"?{target:r,ingress:"iap"}:r==="databricks-app"||r==="spcs"||r==="cloudflare"?{target:r}:{target:r,ingress:"edge"}}}});var VA=T(ps=>{"use strict";var cj=ps&&ps.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),lj=ps&&ps.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Pg=ps&&ps.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&cj(n,e,r[s]);return lj(n,e),n}})();Object.defineProperty(ps,"__esModule",{value:!0});ps.copyPackToStaging=FA;ps.deployCommand=gj;var fs=Pg(require("fs")),qt=Pg(require("path")),uj=Pg(require("js-yaml")),ds=Og(),Ig=BA(),_r=en(),dj=8080;function fj(t){let e=qt.join(t,"agent.yaml");if(!fs.existsSync(e))throw new Error(`No agent.yaml in ${t} \u2014 point deploy init at a pack directory.`);let n=uj.load(fs.readFileSync(e,"utf8")),r=n?.metadata?.name?.trim();if(!r)throw new Error(`agent.yaml is missing metadata.name in ${t}`);let s=n?.metadata?.version?.trim();if(!s)throw new Error(`agent.yaml is missing metadata.version in ${t}`);let i=n?.spec?.model?.trim();return{name:r,version:s,engine:n?.spec?.engine?.trim()||"claude",...i?{model:i}:{}}}var pj=new Set([".git","node_modules","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".venv","venv",".next",".turbo",".cache","dist","build",".DS_Store",".idea",".vscode"]);function FA(t,e){let n=[],r=qt.resolve(e);return fs.cpSync(t,e,{recursive:!0,force:!0,dereference:!0,preserveTimestamps:!0,filter:s=>{let i=qt.relative(t,s);if(!i)return!0;if(s===r||s.startsWith(r+qt.sep))return!1;let o=qt.basename(s);if(i==="deploy"||i.startsWith("deploy"+qt.sep)||i==="deploy-out"||i.startsWith("deploy-out"+qt.sep)||pj.has(o)||o.startsWith(".nfs"))return!1;try{if(fs.lstatSync(s).isSymbolicLink()&&!fs.existsSync(s))return n.push(i),!1}catch{return!1}return!(o===".env"||o===".env.local"||o===".env.production"||o.endsWith(".log")||(0,ds.isSecretLikeBasename)(o))}}),n}async function gj(t,e,n){t!=="init"&&(console.error(`Unknown deploy action "${t}". Supported: init`),process.exit(1));let r=n.target,s=n.ingress;if(n.blueprint){if(!(0,Ig.isBlueprintId)(n.blueprint)){console.error(`Unknown --blueprint "${n.blueprint}". Supported: ${Object.keys(Ig.BLUEPRINTS).join(", ")}`),process.exit(1);return}if(n.platform&&!(0,ds.isDeployTarget)(n.platform)){console.error(`Unknown --platform "${n.platform}". Supported: ${ds.DEPLOY_TARGETS.join(", ")}`),process.exit(1);return}try{let f=(0,Ig.resolveBlueprint)(n.blueprint,n.platform);r=f.target,s=f.ingress}catch(f){console.error(`Error: ${f instanceof Error?f.message:f}`),process.exit(1);return}}let i=qt.resolve(n.packdir||e||process.cwd()),o=r==="all"?[...ds.DEPLOY_TARGETS]:[r];for(let f of o)(0,ds.isDeployTarget)(f)||(console.error(`Unknown --target "${f}". Supported: ${ds.DEPLOY_TARGETS.join(", ")}, all`),process.exit(1));let a;try{a=fj(i)}catch(f){console.error(`Error: ${f instanceof Error?f.message:f}`),process.exit(1);return}let c=(0,ds.scanEnvRefs)(i),l=n.gateway?.trim();if(l)for(let f of["OPENCLAW_GATEWAY_TOKEN","SLACK_BOT_TOKEN","SLACK_APP_TOKEN"])c.includes(f)||c.push(f);let u=n.modelRouting==="gateway"?"gateway":n.modelRouting==="sidecar"?"sidecar":void 0;n.modelRouting&&n.modelRouting!=="gateway"&&n.modelRouting!=="sidecar"&&(console.error(`Unknown --model-routing "${n.modelRouting}". Supported: sidecar, gateway`),process.exit(1));let d={packName:a.name,packVersion:a.version,image:n.image||(0,ds.defaultRuntimeImage)(a.engine),port:n.port||dj,engine:a.engine,model:a.model,envVars:c,gatewayChannels:l,publicHostname:(0,ds.resolveDeployPublicHostname)(n.hostname),ingress:s,idpUrl:n.idpUrl,cookieDomain:n.cookieDomain,colocate:n.colocate,modelRouting:u,edgeTurnConnector:n.edgeTurnConnector?.trim()||void 0};for(let f of o){let p=u==="gateway"?"-gateway":"",g=n.out?o.length>1?qt.join(qt.resolve(n.out),f+p):qt.resolve(n.out):qt.join(process.cwd(),"deploy-out",`${a.name}-${f}${p}`);fs.mkdirSync(g,{recursive:!0});let _=FA(i,g);if(_.length>0){let w=_.slice(0,3).join(", ");console.log(` ${_r.COLORS.yellow}\u26A0 ${_.length} broken symlink(s) skipped (not staged \u2014 the image would have no content for these). Sample: ${w}${_.length>3?", \u2026":""}${_r.COLORS.reset}`)}fs.mkdirSync(qt.join(g,"deploy"),{recursive:!0});let h=(0,ds.renderTarget)(f,d),y=[],E=[];for(let[w,A]of Object.entries(h)){let S=w===".dockerignore"?qt.join(g,".dockerignore"):qt.join(g,"deploy",w);if(fs.existsSync(S)&&!n.force){E.push(w);continue}fs.mkdirSync(qt.dirname(S),{recursive:!0}),fs.writeFileSync(S,A),y.push(w)}console.log(`${_r.COLORS.green}\u2713${_r.COLORS.reset} ${f} \u2192 ${qt.relative(process.cwd(),g)||"."}`);for(let w of y)console.log(` ${_r.COLORS.dim}+ ${w}${_r.COLORS.reset}`);for(let w of E)console.log(` ${_r.COLORS.yellow}\u2022 ${w} (exists; --force to overwrite)${_r.COLORS.reset}`)}c.length>0&&console.log(`
661
+ `)}}var sj={vm:HH,compose:jH,cloudrun:WH,"databricks-app":ZH,spcs:ej,cloudflare:tj,"aws-ecs":nj,"azure-container-apps":rj};function ij(t,e){let n=sj[t](e),r=e.ingress==="edge-fed",s=!!e.colocate&&r&&(t==="vm"||t==="compose"),i=vg(e)&&t==="cloudrun"&&r,o=!s&&(t==="vm"||t==="compose"||(t==="cloudrun"||t==="aws-ecs"||t==="azure-container-apps")&&(e.ingress==="edge"||r)),a=Object.keys(n).some(u=>u==="Dockerfile"||u.endsWith("/Dockerfile")),c={...n,...a?{".dockerignore":GH()}:{},".env.example":PA(e.envVars,{edge:o,engine:e.engine,hostname:e.publicHostname,gatewayDirect:i}),...o?{".env.auth.example":NA({hostname:e.publicHostname,fed:r,idpUrl:e.idpUrl,cookieDomain:e.cookieDomain})}:{},"DATA-ACCESS.md":xH(e,t,o,r,s)},l={};for(let[u,f]of Object.entries(c))l[u]=IA(e,u,f);return l}});var BA=T(us=>{"use strict";Object.defineProperty(us,"__esModule",{value:!0});us.BLUEPRINTS=us.BLUEPRINT_IDS=void 0;us.isBlueprintId=oj;us.resolveBlueprint=aj;us.BLUEPRINT_IDS=["sandbox","prospect-demo","team-pilot","regulated-air-gapped","enterprise-fleet"];function oj(t){return us.BLUEPRINT_IDS.includes(t)}us.BLUEPRINTS={sandbox:{id:"sandbox",description:"Internal test, no external users \u2014 no edge, no SSO, no host port beyond localhost.",targets:["vm"]},"prospect-demo":{id:"prospect-demo",description:"Throwaway public demo for a prospect \u2014 Cloudflare Tunnel + a throwaway Google OAuth client.",targets:["vm","compose"]},"team-pilot":{id:"team-pilot",description:"Single-agent pilot. Rides the customer platform's own identity when one exists (GCP IAP, Databricks workspace SSO, Snowflake network, Cloudflare Access); falls back to a self-issued edge (own Caddy + oauth2-proxy + Google client) on vm/compose/aws-ecs/azure-container-apps, which have no platform-native option yet.",targets:["cloudrun","databricks-app","spcs","cloudflare","vm","compose","aws-ecs","azure-container-apps"]},"regulated-air-gapped":{id:"regulated-air-gapped",description:"VPN/localhost only, no tunnel, no external telemetry \u2014 the highest-scrutiny buyer profile. Currently generator-identical to sandbox; the distinction is buyer framing, not yet enforced posture.",targets:["vm"]},"enterprise-fleet":{id:"enterprise-fleet",description:"Federated identity against a central IdP (enterprise-deploy/idp/) for a growing fleet of agents. Same-host colocation (no edge of its own) is available for vm/compose via the raw `--ingress edge-fed --colocate` flag \u2014 not yet encoded as a blueprint variant.",targets:["cloudrun","vm","compose","aws-ecs","azure-container-apps"]}};function aj(t,e){let n=us.BLUEPRINTS[t],r=e??n.targets[0];if(!n.targets.includes(r))throw new Error(`Blueprint "${t}" does not support --platform ${r}. Supported: ${n.targets.join(", ")}.`);switch(t){case"sandbox":case"regulated-air-gapped":return{target:r};case"prospect-demo":return{target:r,ingress:"edge"};case"enterprise-fleet":return{target:r,ingress:"edge-fed"};case"team-pilot":return r==="cloudrun"?{target:r,ingress:"iap"}:r==="databricks-app"||r==="spcs"||r==="cloudflare"?{target:r}:{target:r,ingress:"edge"}}}});var VA=T(ps=>{"use strict";var cj=ps&&ps.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),lj=ps&&ps.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Pg=ps&&ps.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&cj(n,e,r[s]);return lj(n,e),n}})();Object.defineProperty(ps,"__esModule",{value:!0});ps.copyPackToStaging=FA;ps.deployCommand=gj;var fs=Pg(require("fs")),qt=Pg(require("path")),uj=Pg(require("js-yaml")),ds=Og(),Ig=BA(),_r=en(),dj=8080;function fj(t){let e=qt.join(t,"agent.yaml");if(!fs.existsSync(e))throw new Error(`No agent.yaml in ${t} \u2014 point deploy init at a pack directory.`);let n=uj.load(fs.readFileSync(e,"utf8")),r=n?.metadata?.name?.trim();if(!r)throw new Error(`agent.yaml is missing metadata.name in ${t}`);let s=n?.metadata?.version?.trim();if(!s)throw new Error(`agent.yaml is missing metadata.version in ${t}`);let i=n?.spec?.model?.trim();return{name:r,version:s,engine:n?.spec?.engine?.trim()||"claude",...i?{model:i}:{}}}var pj=new Set([".git","node_modules","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".venv","venv",".next",".turbo",".cache","dist","build",".DS_Store",".idea",".vscode"]);function FA(t,e){let n=[],r=qt.resolve(e);return fs.cpSync(t,e,{recursive:!0,force:!0,dereference:!0,preserveTimestamps:!0,filter:s=>{let i=qt.relative(t,s);if(!i)return!0;if(s===r||s.startsWith(r+qt.sep))return!1;let o=qt.basename(s);if(i==="deploy"||i.startsWith("deploy"+qt.sep)||i==="deploy-out"||i.startsWith("deploy-out"+qt.sep)||pj.has(o)||o.startsWith(".nfs"))return!1;try{if(fs.lstatSync(s).isSymbolicLink()&&!fs.existsSync(s))return n.push(i),!1}catch{return!1}return!(o===".env"||o===".env.local"||o===".env.production"||o.endsWith(".log")||(0,ds.isSecretLikeBasename)(o))}}),n}async function gj(t,e,n){t!=="init"&&(console.error(`Unknown deploy action "${t}". Supported: init`),process.exit(1));let r=n.target,s=n.ingress;if(n.blueprint){if(!(0,Ig.isBlueprintId)(n.blueprint)){console.error(`Unknown --blueprint "${n.blueprint}". Supported: ${Object.keys(Ig.BLUEPRINTS).join(", ")}`),process.exit(1);return}if(n.platform&&!(0,ds.isDeployTarget)(n.platform)){console.error(`Unknown --platform "${n.platform}". Supported: ${ds.DEPLOY_TARGETS.join(", ")}`),process.exit(1);return}try{let d=(0,Ig.resolveBlueprint)(n.blueprint,n.platform);r=d.target,s=d.ingress}catch(d){console.error(`Error: ${d instanceof Error?d.message:d}`),process.exit(1);return}}let i=qt.resolve(n.packdir||e||process.cwd()),o=r==="all"?[...ds.DEPLOY_TARGETS]:[r];for(let d of o)(0,ds.isDeployTarget)(d)||(console.error(`Unknown --target "${d}". Supported: ${ds.DEPLOY_TARGETS.join(", ")}, all`),process.exit(1));let a;try{a=fj(i)}catch(d){console.error(`Error: ${d instanceof Error?d.message:d}`),process.exit(1);return}let c=(0,ds.scanEnvRefs)(i),l=n.gateway?.trim();if(l)for(let d of["OPENCLAW_GATEWAY_TOKEN","SLACK_BOT_TOKEN","SLACK_APP_TOKEN"])c.includes(d)||c.push(d);let u=n.modelRouting==="gateway"?"gateway":n.modelRouting==="sidecar"?"sidecar":void 0;n.modelRouting&&n.modelRouting!=="gateway"&&n.modelRouting!=="sidecar"&&(console.error(`Unknown --model-routing "${n.modelRouting}". Supported: sidecar, gateway`),process.exit(1));let f={packName:a.name,packVersion:a.version,image:n.image||(0,ds.defaultRuntimeImage)(a.engine),port:n.port||dj,engine:a.engine,model:a.model,envVars:c,gatewayChannels:l,publicHostname:(0,ds.resolveDeployPublicHostname)(n.hostname),ingress:s,idpUrl:n.idpUrl,cookieDomain:n.cookieDomain,colocate:n.colocate,modelRouting:u,edgeTurnConnector:n.edgeTurnConnector?.trim()||void 0};for(let d of o){let g=u==="gateway"?"-gateway":"",p=n.out?o.length>1?qt.join(qt.resolve(n.out),d+g):qt.resolve(n.out):qt.join(process.cwd(),"deploy-out",`${a.name}-${d}${g}`);fs.mkdirSync(p,{recursive:!0});let _=FA(i,p);if(_.length>0){let w=_.slice(0,3).join(", ");console.log(` ${_r.COLORS.yellow}\u26A0 ${_.length} broken symlink(s) skipped (not staged \u2014 the image would have no content for these). Sample: ${w}${_.length>3?", \u2026":""}${_r.COLORS.reset}`)}fs.mkdirSync(qt.join(p,"deploy"),{recursive:!0});let h=(0,ds.renderTarget)(d,f),y=[],E=[];for(let[w,A]of Object.entries(h)){let S=w===".dockerignore"?qt.join(p,".dockerignore"):qt.join(p,"deploy",w);if(fs.existsSync(S)&&!n.force){E.push(w);continue}fs.mkdirSync(qt.dirname(S),{recursive:!0}),fs.writeFileSync(S,A),y.push(w)}console.log(`${_r.COLORS.green}\u2713${_r.COLORS.reset} ${d} \u2192 ${qt.relative(process.cwd(),p)||"."}`);for(let w of y)console.log(` ${_r.COLORS.dim}+ ${w}${_r.COLORS.reset}`);for(let w of E)console.log(` ${_r.COLORS.yellow}\u2022 ${w} (exists; --force to overwrite)${_r.COLORS.reset}`)}c.length>0&&console.log(`
662
662
  ${_r.COLORS.dim}Scanned pack secrets into .env.example: ${c.join(", ")}${_r.COLORS.reset}`),console.log("\nNext: cd into the staging dir above, `cp deploy/.env.example deploy/.env`, then run the command in deploy/README.md (scripts anchor themselves to the staging root)."),console.log(`${_r.COLORS.dim}Tip: run deploy init from the pack's parent directory \u2014 not from inside the pack (default deploy-out/ inside the pack copies into itself and fails).${_r.COLORS.reset}`)}});var WA=T(Ng=>{"use strict";Object.defineProperty(Ng,"__esModule",{value:!0});Ng.renderIdpArtifacts=yj;var hj=wg(),KA=Og();function mj(t){if(t.cookieDomain?.trim())return t.cookieDomain.trim();let e=t.hostname.split(".");return e.length>2?`.${e.slice(-2).join(".")}`:`.${t.hostname}`}function _j(){return["# Central IdP.","#","# ./run.sh","#","# Env split (matches `agenthippo deploy init`):","# ~/.agent-hippo/.env (+ optional ./.env) \u2014 hostname only","# ~/.agent-hippo/.env.auth (+ optional ./.env.auth) \u2014 JWT/OAuth; broker + oauth2-proxy ONLY","# Profiles: edge (SSO stack), tunnel (Cloudflare \u2192 Caddy)","# Org identity infra only \u2014 no agent runs here. Per-agent edges are generated separately","# by `agenthippo deploy init` and deployed on their own host/service.","services:"," oauth2-proxy:",' profiles: ["edge"]'," image: quay.io/oauth2-proxy/oauth2-proxy:v7.7.1"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," - path: ${HOME}/.agent-hippo/.env.auth"," required: false"," - path: .env.auth"," required: false"," environment:"," OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:4180"," OAUTH2_PROXY_UPSTREAMS: file:///dev/null",' OAUTH2_PROXY_SET_XAUTHREQUEST: "true"',' OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER: "true"',' OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true"',' OAUTH2_PROXY_REVERSE_PROXY: "true"'," # Absolute post-login redirects (rd=https://<host>/\u2026) are only honoured for whitelisted",' # hosts. The Caddyfile uses absolute rd so an IDE redirect_uri containing "//" inside'," # the authorize query is not rejected by the oauth2-proxy relative-URL validator."," OAUTH2_PROXY_WHITELIST_DOMAINS: ${OAUTH2_PROXY_WHITELIST_DOMAINS:-${AGENTHIPPO_PUBLIC_HOSTNAME}}",' expose: ["4180"]',""," auth-broker:",' profiles: ["edge"]'," build:"," context: ."," dockerfile: Dockerfile.auth-broker"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," - path: ${HOME}/.agent-hippo/.env.auth"," required: false"," - path: .env.auth"," required: false"," environment:",' AGENTHIPPO_AUTH_PORT: "9780"'," AGENTHIPPO_AUTH_DATA_DIR: /data"," # The broker now defaults to binding 127.0.0.1 and REFUSES a public bind unless told"," # otherwise. Here it must listen on the container interface, because Caddy reaches it"," # as `auth-broker:9780` over the compose network \u2014 a loopback bind makes it unreachable."," # Safe: the port is `expose`d, never published to the host, so the only thing that can"," # dial it is another service on this network.",' AGENTHIPPO_AUTH_BIND: "0.0.0.0"',' AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND: "1"'," # Shared secret proving an X-Auth-Request-Email came from THIS Caddy. Without it the"," # broker treats that header as unverified and 401s the forward_auth-gated routes."," # No default on purpose: compose FAILS to start rather than silently running with an"," # empty secret on both sides, which would accept every caller. Put it in ./.env.",' AGENTHIPPO_AUTH_PROXY_SECRET: "${AGENTHIPPO_AUTH_PROXY_SECRET:?set AGENTHIPPO_AUTH_PROXY_SECRET in .env (openssl rand -hex 32)}"'," # Proxy hops in front of the broker: 1 = Caddy only (edge profile), 2 = Cloudflare"," # Tunnel \u2192 Caddy (run.sh sets 2; at 1 the rate limiter would key every tunnel"," # client on cloudflared's IP \u2014 one shared bucket)."," AGENTHIPPO_XFF_TRUSTED_HOPS: ${AGENTHIPPO_XFF_TRUSTED_HOPS:-1}",' volumes: ["auth-broker-data:/data"]',' expose: ["9780"]',""," caddy:",' profiles: ["edge"]'," image: caddy:2.11-alpine"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," # With the tunnel profile, set AGENTHIPPO_CADDY_BIND=127.0.0.1 so a public-IP host"," # cannot be hit directly on 80/443, bypassing Cloudflare."," # Bare-metal / BYO nginx or ALB already on 80/443? Set AGENTHIPPO_CADDY_HTTP_PORT /"," # AGENTHIPPO_CADDY_HTTPS_PORT to alternate host ports and point your own reverse proxy"," # at them \u2014 the container still listens on 80 internally, only the host mapping moves."," ports:",' - "${AGENTHIPPO_CADDY_BIND:-0.0.0.0}:${AGENTHIPPO_CADDY_HTTP_PORT:-80}:80"',' - "${AGENTHIPPO_CADDY_BIND:-0.0.0.0}:${AGENTHIPPO_CADDY_HTTPS_PORT:-443}:443"'," environment:"," # Caddy stamps this on the two broker hops that forward a verified X-Auth-Request-Email"," # (/oauth/authorize, /oauth/browser-login). Same value the broker checks; same fail-closed"," # rule \u2014 compose refuses to start rather than send an empty secret.",' AGENTHIPPO_AUTH_PROXY_SECRET: "${AGENTHIPPO_AUTH_PROXY_SECRET:?set AGENTHIPPO_AUTH_PROXY_SECRET in .env (openssl rand -hex 32)}"'," volumes:"," - ./Caddyfile:/etc/caddy/Caddyfile:ro"," # Colocated agents (deploy init --colocate) drop a route snippet here \u2014 see Caddyfile."," - ./agents:/etc/caddy/agents:ro"," networks: [default, colocate]"," depends_on: [oauth2-proxy, auth-broker]",""," cloudflared:",' profiles: ["tunnel"]'," image: cloudflare/cloudflared:2024.12.2"," restart: unless-stopped"," command: tunnel --config /etc/cloudflared/config.yml run"," volumes:"," - ./cloudflared.yml:/etc/cloudflared/config.yml:ro"," # Set by run.sh from its argument (./run.sh /path/to/tunnel-credentials.json);"," # falls back to the conventional location for a direct `docker compose` invocation."," - ${AGENTHIPPO_TUNNEL_CREDENTIALS:-${HOME}/.agent-hippo/tunnel-credentials.json}:/etc/cloudflared/credentials.json:ro"," depends_on: [caddy]","","volumes:"," auth-broker-data:","","networks:"," default:",` # Stable, explicitly-named network (not the implicit "idp_default") so a colocated agent's`," # own compose project can join it reliably regardless of which directory `docker compose`"," # runs from. Only Caddy needs it \u2014 its per-agent snippets `reverse_proxy` straight to the"," # agent container by name; auth-broker is reached over the (already-shared) default network."," colocate:"," name: agenthippo-idp-colocate",""].join(`
663
663
  `)}function Ej(){return["# SSO edge + Cloudflare Tunnel. Set AGENTHIPPO_PUBLIC_HOSTNAME in .env (Caddy reads it below).","# TLS terminates at Cloudflare; origin listens on HTTP only.","{"," auto_https off","}","","# Same-host colocation: agents deployed with `deploy init --ingress edge-fed --colocate`","# on THIS host ship a route snippet instead of their own Caddy/oauth2-proxy/auth-broker.","# Drop it in ./agents/<name>.caddy (mounted in docker-compose.yml) and","# `docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile` to pick it up \u2014","# no rebuild, no restart of the IdP itself.","import agents/*.caddy","","http://{$AGENTHIPPO_PUBLIC_HOSTNAME} {",...(0,hj.renderIdentityLayer)({mode:"self-issued",oauth2ProxyAddr:"oauth2-proxy:4180",authBrokerAddr:"auth-broker:9780",healthProxy:[" reverse_proxy auth-broker:9780"],agentProxy:[' respond "not_found" 404'],catchallBody:[' respond "AgentHippo IdP" 200']}),"}",""].join(`
664
664
  `)}function yj(t){let e=mj(t);return{"docker-compose.yml":_j(),"Dockerfile.auth-broker":(0,KA.renderAuthBrokerDockerfile)(),Caddyfile:Ej(),".env.example":["# Caddy hostname for the central IdP. No agent runs on this stack \u2014 auth secrets:","# see .env.auth.example \u2192 ~/.agent-hippo/.env.auth (broker + oauth2-proxy only).","",`AGENTHIPPO_PUBLIC_HOSTNAME=${t.hostname}`,"","# REQUIRED. Shared secret between Caddy and auth-broker, proving that an","# X-Auth-Request-Email reached the broker through this Caddy rather than from a client","# that merely found the port. The broker 401s that header without a matching secret, and","# docker compose refuses to start if this is unset \u2014 an empty secret on both sides would","# accept everyone. It lives HERE (not .env.auth) because Caddy needs it too, and Caddy","# must not be handed the OAuth client secret or the JWT signing key.","# openssl rand -hex 32","AGENTHIPPO_AUTH_PROXY_SECRET=","","# Proxy hops / Caddy bind (optional; run.sh sets XFF hops=2 for tunnel)","# AGENTHIPPO_XFF_TRUSTED_HOPS=1","# AGENTHIPPO_CADDY_BIND=0.0.0.0","","# Bare metal / BYO nginx or ALB already on 80/443? Rebind Caddy to alternate host ports","# and point your reverse proxy at them (container still listens on 80 internally):","# AGENTHIPPO_CADDY_HTTP_PORT=8080","# AGENTHIPPO_CADDY_HTTPS_PORT=8443",""].join(`
@@ -666,37 +666,37 @@ ${_r.COLORS.dim}Scanned pack secrets into .env.example: ${c.join(", ")}${_r.COLO
666
666
  `),"run.sh":["#!/usr/bin/env bash","# Start central IdP: Caddy + oauth2-proxy + auth-broker (+ Cloudflare tunnel, if requested).","# No agent here \u2014 per-agent edges are generated separately by `agenthippo deploy init`.","#","# Usage:","# ./run.sh bare metal / BYO nginx or ALB in front","# ./run.sh /path/to/tunnel-credentials.json Cloudflare Tunnel","#","# Bare metal / BYO nginx or ALB: run with no argument \u2014 starts --profile edge only.","# If 80/443 are already taken by your reverse proxy, set AGENTHIPPO_CADDY_HTTP_PORT/","# _HTTPS_PORT in .env first so Caddy rebinds elsewhere.","set -euo pipefail",'cd "$(dirname "$0")"',"if [[ $# -ge 1 ]]; then",' export AGENTHIPPO_TUNNEL_CREDENTIALS="$1"',' [[ -f "$AGENTHIPPO_TUNNEL_CREDENTIALS" ]] || {',' echo "Tunnel credentials file not found: $AGENTHIPPO_TUNNEL_CREDENTIALS" >&2; exit 1; }'," # Two proxy hops behind the tunnel (cloudflared \u2192 Caddy) \u2014 see docker-compose.yml.",' export AGENTHIPPO_XFF_TRUSTED_HOPS="${AGENTHIPPO_XFF_TRUSTED_HOPS:-2}"'," docker compose --profile edge --profile tunnel up -d --build",` echo "IdP: https://\${AGENTHIPPO_PUBLIC_HOSTNAME:-${t.hostname}} (via Cloudflare Tunnel)"`,"else",' echo "No tunnel credentials path given \u2014 starting --profile edge only (no tunnel)."',' echo "Front this host with your own nginx/ALB; see AGENTHIPPO_CADDY_HTTP_PORT/AGENTHIPPO_CADDY_BIND in .env."',' echo "(To use a Cloudflare Tunnel instead: ./run.sh /path/to/tunnel-credentials.json)"'," docker compose --profile edge up -d --build",` echo "IdP: http://\${AGENTHIPPO_PUBLIC_HOSTNAME:-${t.hostname}} (behind your own reverse proxy)"`,"fi",""].join(`
667
667
  `),"agents/README.md":["# Colocated agent routes","","Drop `*.caddy` route snippets here for agents deployed on **this same host** via:","","```bash","agenthippo deploy init <pack> --target compose --ingress edge-fed --colocate","```","","That command generates `deploy/agent-route.caddy` (copy it here, renamed to something","identifying the agent) plus a `docker-compose.yml` containing only the `agent` service","(no Caddy/oauth2-proxy/auth-broker of its own \u2014 it joins this IdP's","`agenthippo-idp-colocate` network and rides the IdP's existing edge).","","After copying a new snippet in:","","```bash","docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile","```","","No rebuild, no restart of the IdP itself. See `../Caddyfile`'s `import agents/*.caddy` and","the IdP documentation for the full picture.",""].join(`
668
668
  `),"README.md":["# Central IdP","","**One per organization.** Hosts Google SSO (oauth2-proxy) and the IDE auth-broker only \u2014","no agent runs here. Agent edges are generated and deployed separately.","","Generated by `agenthippo idp init` \u2014 regenerate (don't hand-edit `Caddyfile`, which comes","straight from the same identity module every agent's Caddyfile uses) if you need to change","routing: that lives in the CLI itself, not in this output.","","This stack runs on **any host with Docker** \u2014 local laptop, team VM, cloud VM, or on-prem.","`./run.sh` picks the path below based on whether you pass it a tunnel credentials path.","","## Quick start","","```bash","cp .env.example ~/.agent-hippo/.env","cp .env.auth.example ~/.agent-hippo/.env.auth # fill in; never put AGENTHIPPO_AUTH_JWT_SECRET in .env","","# REQUIRED: the Caddy\u2194broker proxy secret. It must be visible to `docker compose`","# ITSELF (compose interpolates it into both services), so it goes in ./.env here \u2014","# not only in ~/.agent-hippo/.env, which is read by containers but not by compose.",'echo "AGENTHIPPO_AUTH_PROXY_SECRET=$(openssl rand -hex 32)" >> .env',"```","","Without it `docker compose up` fails immediately with a message naming the variable. That","is deliberate: the broker refuses an `X-Auth-Request-Email` that arrives without a matching","`x-agenthippo-proxy-secret`, so an empty secret on both sides would accept every caller.","","**Cloudflare Tunnel** (no public ports to manage yourself):","","```bash","cp cloudflared.yml.example cloudflared.yml # set tunnel id","cloudflared tunnel create agenthippo-auth # writes ~/.cloudflared/<tunnel-id>.json","cp ~/.cloudflared/<tunnel-id>.json ~/.agent-hippo/tunnel-credentials.json","./run.sh ~/.agent-hippo/tunnel-credentials.json","```","","**Bare metal / BYO nginx or ALB already fronting this host:**","","```bash","# skip cloudflared.yml entirely. If 80/443 are already taken by your reverse proxy,","# set AGENTHIPPO_CADDY_HTTP_PORT/AGENTHIPPO_CADDY_HTTPS_PORT in .env first.","./run.sh # no argument \u2014 starts --profile edge only","# point your nginx/ALB at this host's Caddy (AGENTHIPPO_CADDY_BIND / _HTTP_PORT above)","```","","Agent edges (e.g. `cs.corp.example`) are separate.",""].join(`
669
- `)}}});var YA=T(Bs=>{"use strict";var wj=Bs&&Bs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Sj=Bs&&Bs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qA=Bs&&Bs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&wj(n,e,r[s]);return Sj(n,e),n}})();Object.defineProperty(Bs,"__esModule",{value:!0});Bs.idpCommand=Tj;var Tu=qA(require("fs")),tc=qA(require("path")),Aj=WA(),Zo=en();async function Tj(t,e){if(t!=="init"){console.error(`Unknown idp action "${t}". Supported: init`),process.exit(1);return}if(!e.hostname?.trim()){console.error("idp init requires --hostname <public-hostname> (e.g. auth.corp.example)"),process.exit(1);return}let n=tc.resolve(e.out||"./enterprise-deploy/idp");Tu.mkdirSync(n,{recursive:!0});let r={hostname:e.hostname.trim(),cookieDomain:e.cookieDomain},s=(0,Aj.renderIdpArtifacts)(r),i=[],o=[];for(let[a,c]of Object.entries(s)){let l=tc.join(n,a);if(Tu.existsSync(l)&&!e.force){o.push(a);continue}Tu.mkdirSync(tc.dirname(l),{recursive:!0}),Tu.writeFileSync(l,c),i.push(a)}console.log(`${Zo.COLORS.green}\u2713${Zo.COLORS.reset} idp \u2192 ${tc.relative(process.cwd(),n)||"."}`);for(let a of i)console.log(` ${Zo.COLORS.dim}+ ${a}${Zo.COLORS.reset}`);for(let a of o)console.log(` ${Zo.COLORS.yellow}\u2022 ${a} (exists; --force to overwrite)${Zo.COLORS.reset}`);console.log(`Next: cd ${tc.relative(process.cwd(),n)||"."}, cp .env.example ~/.agent-hippo/.env, cp .env.auth.example ~/.agent-hippo/.env.auth (fill in), then ./run.sh`)}});var zA=T(Rg=>{"use strict";Object.defineProperty(Rg,"__esModule",{value:!0});Rg.grantsCommand=bj;var JA=Vi(),XA=en();function bu(t){console.error(`${XA.COLORS.red}Error:${XA.COLORS.reset} ${t}`),process.exit(1)}async function bj(t,e){let n;try{n=new JA.StoredGrantProvider((0,JA.readStoredGrantConfig)(process.env))}catch(r){bu(r instanceof Error?r.message:String(r))}if(t==="list"){let r=await n.cfg.store.list();console.log(JSON.stringify(r.map(s=>"error"in s?s:{user:s.userId,google:s.grants.google?{email:s.grants.google.email,scopes:s.grants.google.scopes,connected_at:s.grants.google.connectedAt}:null,banks:(s.grants.plaid?.items??[]).map(i=>({institution:i.institution,item_id:i.itemId,env:i.env,connected_at:i.connectedAt,...i.replacedBy?{replaced_by:i.replacedBy}:{}}))}),null,2));return}if(t==="revoke"){let r=e.user?.trim();r||bu("revoke needs --user <verified user id>"),e.service&&e.service!=="google"&&e.service!=="bank"&&bu("--service must be google or bank");let s=e.service?[e.service]:["google","bank"],i={};for(let o of s)try{i[o]=await n.revoke(r,o,o==="bank"?e.bank:void 0)}catch(a){i[o]={ok:!1,disconnected:[],failed:[{error:a instanceof Error?a.message:String(a)}]}}console.log(JSON.stringify(i,null,2)),Object.values(i).some(o=>!o.ok)&&(process.exitCode=1);return}bu(`unknown action "${t}" (use: list | revoke --user <id> [--service google|bank] [--bank <name>])`)}});var $g=T(Xn=>{"use strict";var vj=Xn&&Xn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Oj=Xn&&Xn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ij=Xn&&Xn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&vj(n,e,r[s]);return Oj(n,e),n}})();Object.defineProperty(Xn,"__esModule",{value:!0});Xn.discoverPublishableEngines=eT;Xn.resolveEngineSourceDir=Gj;Xn.validateEngineForPublish=Uj;Xn.collectEngineFiles=Hj;Xn.isValidPublishVersion=jj;var Pj=require("child_process"),fi=require("fs"),Jn=Ij(require("path")),Nj=require("util"),Rj=ot(),eo=dn(),Cj=Uc(),kj=(0,Nj.promisify)(Pj.execFile),vu="engine.manifest.json",$j=new Set([".git",".hg",".svn",".DS_Store","node_modules","dist","coverage",".turbo",".cache",".pnpm-store","Thumbs.db"]),Dj=[["private key",/-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],["OpenAI-style key",/\bsk-(?!dummy\b|ant-)[A-Za-z0-9_-]{20,}\b/],["Anthropic key",/\bsk-ant-[A-Za-z0-9_-]{20,}\b/],["Google API key",/\bAIza[0-9A-Za-z_-]{30,}\b/],["GitHub token",/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/],["Atlassian API token",/\bATATT[A-Za-z0-9_=+/\-]{20,}\b/],["AWS access key",/\bAKIA[0-9A-Z]{16}\b/],["JWT",/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/]];function QA(t){return!!($j.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function Cg(t){let e=t.replace(/\\/g,"/").trim().replace(/^\.\//,"");if(!e||e==="."||e==="..")throw new Error("must be a non-empty relative path");if(e.includes("\0")||Jn.posix.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e))throw new Error(`must be a safe relative path: ${t}`);for(let n of e.split("/"))if(!n||n==="."||n==="..")throw new Error(`must not contain empty, "." or ".." segments: ${t}`);return e}async function ZA(t){let e=Jn.join(t,vu),n=await fi.promises.readFile(e,"utf-8"),r=JSON.parse(n);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${e} must contain a JSON object`);if(r.version!==2)throw new Error(`${e} must use custom engine manifest version 2`);if(typeof r.id!="string"||!/^[a-z0-9][a-z0-9._-]*$/.test(r.id))throw new Error(`${e} has invalid id: ${String(r.id)}`);if(typeof r.entry!="string")throw new Error(`${e} must define string entry`);let s=Cg(r.entry),i=Jn.join(t,s);if(!await(0,eo.pathExists)(i))throw new Error(`${e} entry does not exist: ${s}`);if(r.workspaceSync&&typeof r.workspaceSync=="object"){let o=r.workspaceSync;o.enabled&&(typeof o.dir=="string"&&Cg(o.dir),typeof o.rulesFile=="string"&&Cg(o.rulesFile))}return{manifest:r,manifestPath:e,entryPath:i}}async function kg(t,e=""){let n=Jn.join(t,e),r=await fi.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(QA(i.name))continue;let o=e?Jn.join(e,i.name):i.name,a=Jn.join(t,o);i.isDirectory()?s.push(...await kg(t,o)):i.isFile()&&s.push({rel:o.replace(/\\/g,"/"),abs:a})}return s}async function Lj(t){let e=[];for(let n of t){if((await fi.promises.stat(n.abs)).size>5*1024*1024)continue;let s=await fi.promises.readFile(n.abs);if(s.includes(0))continue;let i=s.toString("utf8");for(let[o,a]of Dj)a.test(i)&&e.push(`${n.rel}: ${o}`)}return e}async function Mj(t){let e=Jn.join(t,"package.json");if(await(0,eo.pathExists)(e))try{let n=JSON.parse(await fi.promises.readFile(e,"utf-8"));if(n.version&&/^\d+\.\d+\.\d+/.test(n.version))return n.version}catch{return}}async function eT(t){let e=[];t?.trim()&&e.push({root:Jn.join(Jn.resolve(t),Rj.AGENTIDE_DIR_NAME,"engines"),label:"workspace"}),e.push({root:(0,Cj.getDefaultCustomEnginesInstallRoot)(),label:"home"});let n=new Map;for(let{root:r,label:s}of e){if(!await(0,eo.pathExists)(r))continue;let i=await fi.promises.readdir(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||QA(o.name))continue;let a=Jn.join(r,o.name),c=Jn.join(a,vu);if(await(0,eo.pathExists)(c))try{let{manifest:l}=await ZA(a),u=l.id;if(n.has(u))continue;n.set(u,{id:u,displayName:typeof l.displayName=="string"?l.displayName:u,sourceDir:a,sourceLabel:s})}catch{}}}return[...n.values()].sort((r,s)=>r.id.localeCompare(s.id))}async function Gj(t,e){return(await eT(e)).find(r=>r.id===t)?.sourceDir}async function Uj(t,e){let n=[],r=[];if(!await(0,eo.pathExists)(t))return{valid:!1,errors:[`Engine directory not found: ${t}`],warnings:r};let s,i;try{({manifest:s,entryPath:i}=await ZA(t))}catch(d){return{valid:!1,errors:[d instanceof Error?d.message:String(d)],warnings:r}}let o=s.id;e&&e!==o&&n.push(`Engine folder id "${e}" does not match manifest id "${o}"`);let a=Jn.join(t,"package.json");await(0,eo.pathExists)(a)&&!await(0,eo.pathExists)(Jn.join(t,"package-lock.json"))&&n.push("package.json present but package-lock.json is missing");let c=await kg(t);c.some(d=>d.rel===vu)||n.push(`Missing ${vu} in publishable files`);let l=await Lj(c);l.length>0&&n.push(`Possible secrets found:
670
- ${l.map(d=>` - ${d}`).join(`
671
- `)}`);try{await kj(process.execPath,["--check",i],{windowsHide:!0})}catch(d){let f=d instanceof Error?d.message:String(d);n.push(`engine entry failed node --check: ${f}`)}s.description||r.push("Consider adding description to engine.manifest.json");let u=await Mj(t);return u||r.push("No package.json version found; you will be prompted for a publish version"),{valid:n.length===0,errors:n,warnings:r,metadata:n.length===0?{id:o,displayName:typeof s.displayName=="string"?s.displayName:o,description:typeof s.description=="string"?s.description:void 0,suggestedVersion:u}:void 0}}async function Hj(t){let e=await kg(t),n=[];for(let r of e){if((await fi.promises.stat(r.abs)).size>5*1024*1024)throw new Error(`File too large to publish (>5MB): ${r.rel}`);let i=await fi.promises.readFile(r.abs);if(i.includes(0))throw new Error(`Binary file cannot be published as text: ${r.rel}`);n.push({path:r.rel,content:i.toString("utf8")})}return n}function jj(t){return/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t.trim())}});var oT=T(Ge=>{"use strict";Object.defineProperty(Ge,"__esModule",{value:!0});Ge.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE=Ge.VIEW_EXPORT_SNAPSHOT_MESSAGE=Ge.WORKFLOWS_SIDECAR_SCRIPTS=Ge.WORKFLOWS_RUN_SCRIPT=Ge.WORKFLOWS_VIEW_ID=Ge.FLEET_WIDGET_SCRIPT=void 0;Ge.createDefaultWorkflowsView=tT;Ge.viewRunsFleetWidget=nT;Ge.resolveRefreshOnNavigate=Mg;Ge.resolveGalleryLayout=rT;Ge.resolvePreserveFleetIframe=sT;Ge.shouldPreserveFleetIframe=Bj;Ge.buildViewExportSnapshotMessages=Vj;Ge.shouldRunScriptsOnNavigation=Kj;Ge.normalizeDashboardViewId=nc;Ge.formatDisplayNameForAllocatedViewId=Wj;Ge.createDefaultDashboardViewsConfig=iT;Ge.resolveMergedActiveViewId=Lg;Ge.mergeDashboardViewsConfigs=qj;Ge.FLEET_WIDGET_SCRIPT="agent-fleet-widget.js";Ge.WORKFLOWS_VIEW_ID="workflows";Ge.WORKFLOWS_RUN_SCRIPT="workflows-widget.cjs";Ge.WORKFLOWS_SIDECAR_SCRIPTS=["workflows-collector.cjs","workflows-daemon.mjs","fleet-workflow.sh"];function tT(){return{id:Ge.WORKFLOWS_VIEW_ID,name:"Workflows",scope:"global",scripts:[Ge.WORKFLOWS_RUN_SCRIPT],bundledScripts:Ge.WORKFLOWS_SIDECAR_SCRIPTS,system:!0,refreshOnNavigate:"always",layout:"fleet-dashboard",preserveFleetIframe:!0}}Ge.VIEW_EXPORT_SNAPSHOT_MESSAGE="viewExportSnapshot";Ge.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE="requestViewExportSnapshot";function xj(t){return t.trim().replace(/^.*[/\\]/,"").toLowerCase()}function nT(t){return t.scripts.some(e=>xj(e)===Ge.FLEET_WIDGET_SCRIPT)}function Mg(t){return t.refreshOnNavigate==="always"||t.refreshOnNavigate==="when-empty"?t.refreshOnNavigate:nT(t)?"always":"when-empty"}function rT(t){return t.layout==="fleet-dashboard"||t.layout==="gallery"?t.layout:Mg(t)==="always"?"fleet-dashboard":"gallery"}function sT(t){return t.preserveFleetIframe===!1?!1:t.preserveFleetIframe===!0?!0:rT(t)==="fleet-dashboard"}function Bj(t){return sT(t)}var Fj=192*1024,Dg=100;function Vj(t){let e=Array.isArray(t.sessions)?t.sessions:[],n={ok:!0,sessionCount:e.length,cliActive:!!t.diagnostics?.cliActive,daemonHint:!1};if(!Array.isArray(t.sessions))return[{payload:t,meta:n}];let r=Buffer.byteLength(JSON.stringify(e),"utf8");if(r<=Fj)return[{payload:t,meta:n}];let s={...t,sessions:[]},i=Math.max(1,Math.ceil(e.length/Dg)),o=`${Date.now()}-${e.length}-${r}`,a=[];for(let c=0;c<i;c+=1)a.push({payload:{...s,sessions:e.slice(c*Dg,(c+1)*Dg)},meta:{...n,chunkedSessions:!0,chunkIndex:c,chunkCount:i,snapshotId:o}});return a}function Kj(t,e){return Mg(t)==="always"?!0:!e.some(n=>n==="chart")}function nc(t,e="global"){return(t??e).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||e}function Wj(t,e,n=nc){let r=n(t,"view");if(e===r)return t;let s=`${r}-`;if(e.startsWith(s)){let i=e.slice(s.length);if(/^\d+$/.test(i))return`${t} ${i}`}return t}function iT(t="global"){return{version:1,activeViewId:t,views:[{id:"global",name:"Global",scope:"global",scripts:[],system:!0},{id:"workspace",name:"Workspace",scope:"workspace",scripts:[],system:!0},{id:"fleet",name:"Fleet",scope:"global",scripts:["agent-fleet-widget.js"],system:!0},tT()]}}function Lg(t,e,n,r){let s=r?.preferWorkspaceScopeFallback===!0,i=e?nc(e,""):"";if(i&&t.some(a=>a.id===i))return i;if(s&&t.some(a=>a.id==="workspace"))return"workspace";if(t.some(a=>a.id===n.activeViewId))return n.activeViewId;if(t.some(a=>a.id==="global"))return"global";let o=t.find(a=>a.system!==!0&&a.id!=="fleet"&&a.id!=="workspace"&&a.id!=="global");return o?o.id:n.activeViewId}function qj(t,e,n=iT()){let r=t??n,s=new Map;for(let a of r.views)s.set(a.id,a);if(e)for(let a of e.views)s.set(a.id,a);let i=[...s.values()];if(e){let a=nc(e.activeViewId,n.activeViewId);return{activeViewId:Lg(i,a,n,{preferWorkspaceScopeFallback:!0}),views:i}}let o=nc(r.activeViewId,n.activeViewId);return{activeViewId:Lg(i,o,n,{preferWorkspaceScopeFallback:!1}),views:i}}});var Gg=T(rc=>{"use strict";Object.defineProperty(rc,"__esModule",{value:!0});rc.normalizeSpotlightViewId=Jj;rc.parseSpotlightYamlRecord=Xj;rc.dumpSpotlightYaml=zj;var Yj=oT();function Jj(t,e="view"){return(0,Yj.normalizeDashboardViewId)(t,e)}function Xj(t){let n=require("js-yaml").load(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function zj(t){return require("js-yaml").dump(t,{lineWidth:120,noRefs:!0})}});var xg=T(Er=>{"use strict";var Qj=Er&&Er.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Zj=Er&&Er.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ex=Er&&Er.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Qj(n,e,r[s]);return Zj(n,e),n}})();Object.defineProperty(Er,"__esModule",{value:!0});Er.resolveViewPublishVersionFromParsed=aT;Er.discoverPublishableViews=hx;Er.validateViewForPublish=mx;Er.collectViewFiles=_x;var Fs=require("fs"),Ut=ex(require("path")),tx=ot(),Hg=$g(),gs=dn(),nx=ba(),ea=Gg();function aT(t){if(t){if(typeof t.version=="string"&&t.version.trim()){let e=t.version.trim().replace(/^v/,"");if((0,Hg.isValidPublishVersion)(e))return e}if(typeof t.semver=="string"&&t.semver.trim()){let e=t.semver.trim().replace(/^v/,"");if((0,Hg.isValidPublishVersion)(e))return e}}}var cT=new Set(["global","workspace","fleet","workflows","default"]),lT="view.yaml",rx="panel-entry.yaml",sx=new Set(["charts","reports","exports","panel-state","assets","images"]),uT=["assets","images","charts","reports","exports"],jg="manifest.json",ix=new Set([".png",".jpg",".jpeg",".gif",".webp",".pdf",".ico",".woff",".woff2"]),ox=new Set([...sx,"node_modules",".git",".hg",".svn",".DS_Store","__pycache__",".turbo",".cache"]),dT=new Set([".DS_Store","Thumbs.db"]),ax=[["private key",/-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],["OpenAI-style key",/\bsk-(?!dummy\b|ant-)[A-Za-z0-9_-]{20,}\b/],["Anthropic key",/\bsk-ant-[A-Za-z0-9_-]{20,}\b/],["Google API key",/\bAIza[0-9A-Za-z_-]{30,}\b/],["GitHub token",/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/],["Atlassian API token",/\bATATT[A-Za-z0-9_=+/\-]{20,}\b/],["AWS access key",/\bAKIA[0-9A-Z]{16}\b/],["JWT",/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/]],cx=1024*1024,lx=10*1024*1024;function fT(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Ut.basename(e.trim())):[]}function Ou(t){let e=new Set,n=[];for(let r of t){let s=Ut.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function ux(t){let e=[];return t?.trim()&&e.push({root:Ut.join(t.trim(),tx.AGENTIDE_DIR_NAME,"analytics"),label:"workspace"}),e.push({root:Ut.join((0,nx.getAgentideHome)(),"analytics"),label:"home"}),e}function dx(t){return Ut.join(t,"panel","views.yaml")}async function fx(t){try{let e=await Fs.promises.readFile(t,"utf-8"),n=(0,ea.parseSpotlightYamlRecord)(e),r=Array.isArray(n?.views)?n.views:[],s=[];for(let i of r){if(!i||typeof i!="object")continue;let o=i,a=(0,ea.normalizeSpotlightViewId)(typeof o.id=="string"?o.id:void 0);if(!a)continue;let c=o.scope==="workspace"?"workspace":"global",l=typeof o.name=="string"&&o.name.trim()?o.name.trim():a,u=Ou(fT(o.scripts)),d=o.system===!0;s.push({id:a,name:l,scope:c,scripts:u,system:d})}return s}catch{return[]}}async function pT(t){let e=Ut.join(t,lT);try{let n=await Fs.promises.readFile(e,"utf-8"),r=(0,ea.parseSpotlightYamlRecord)(n);if(!r)return;let s=(0,ea.normalizeSpotlightViewId)(typeof r.id=="string"?r.id:void 0);if(!s)return;let i=r.scope==="workspace"?"workspace":"global",o=typeof r.name=="string"&&r.name.trim()?r.name.trim():s;return{id:s,name:o,description:typeof r.description=="string"?r.description.trim():void 0,author:typeof r.author=="string"?r.author.trim():void 0,publishVersion:aT(r),scope:i,tags:Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):void 0,scripts:Ou(fT(r.scripts))}}catch{return}}async function px(t){let e=[];for(let n of t)for(let[r,s]of ax)s.test(n.content)&&e.push(`${n.rel}: possible ${r}`);return e}function gT(t,e){return!!(dT.has(t)||t.startsWith(".")&&t!=="."||e&&ox.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function hT(t,e){return!!(dT.has(t)||t.startsWith(".")||e&&(t==="node_modules"||t==="__pycache__")||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function mT(t){let e=Ut.extname(t).toLowerCase();return ix.has(e)}async function Ug(t,e){let n=await Fs.promises.readFile(t);return n.includes(0)||mT(e)?{path:e,content:n.toString("base64"),encoding:"base64"}:{path:e,content:n.toString("utf-8"),encoding:"utf-8"}}async function gx(t){let e=0;for(let n of uT){let r=Ut.join(t,n);if(!await(0,gs.pathExists)(r))continue;async function s(i){let o=await Fs.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(hT(a.name,a.isDirectory()))continue;let c=Ut.join(i,a.name);if(a.isDirectory()){await s(c);continue}e++}}await s(r)}return await(0,gs.pathExists)(Ut.join(t,jg))&&e++,e}async function _T(t,e){for(let r of uT){let s=Ut.join(t,r);await(0,gs.pathExists)(s)&&await Iu(s,r,hT,e)}let n=Ut.join(t,jg);if(await(0,gs.pathExists)(n)){let r=await Fs.promises.stat(n);await e(n,jg,r.size)}}async function Iu(t,e,n,r){let s=await Fs.promises.readdir(t,{withFileTypes:!0});for(let i of s){if(n(i.name,i.isDirectory()))continue;let o=Ut.join(t,i.name),a=e?`${e}/${i.name}`:i.name;if(i.isDirectory()){await Iu(o,a,n,r);continue}let c=await Fs.promises.stat(o);await r(o,a,c.size)}}async function hx(t){let e=new Map;for(let{root:n,label:r}of ux(t)){let s=dx(n);if(!await(0,gs.pathExists)(s))continue;let i=await fx(s);for(let o of i){if(o.system||cT.has(o.id)||e.has(o.id))continue;let a=Ut.join(n,"views",o.id),c=await pT(a),l=Ou(c?.scripts.length?c.scripts:o.scripts);e.set(o.id,{id:o.id,name:c?.name??o.name,scope:c?.scope??o.scope,scripts:l,viewRoot:a,viewsConfigPath:s,analyticsRoot:n,sourceLabel:r})}}return[...e.values()].sort((n,r)=>n.id.localeCompare(r.id))}async function mx(t,e){let n=e?.mode??"scripts-only",r=e?.expectedId,s=[],i=[];if(r&&r!==t.id&&s.push(`View id "${r}" does not match selected view "${t.id}"`),cT.has(t.id)&&s.push(`View id "${t.id}" is reserved for built-in Spotlight views`),!await(0,gs.pathExists)(t.viewRoot))return s.push(`View directory not found: ${t.viewRoot}`),{valid:!1,errors:s,warnings:i};let o=await pT(t.viewRoot),a=Ou(o?.scripts.length?o.scripts:t.scripts),c=n==="full"?await gx(t.viewRoot):0;o||i.push("Missing view.yaml; publish will generate manifest from panel config"),o?.description||i.push("Consider adding description to view.yaml for store discoverability"),(!o?.tags||o.tags.length===0)&&i.push("Consider adding tags to view.yaml for store discoverability"),n==="scripts-only"?a.length===0&&s.push("View has no scripts registered"):a.length===0&&c===0?s.push("Full bundle requires at least one script or content under assets/, images/, charts/, reports/, exports/, or manifest.json"):a.length===0&&i.push("Publishing generated artifacts only (no widget scripts)");let l=Ut.join(t.viewRoot,"scripts");for(let _ of a){let h=Ut.join(l,_);await(0,gs.pathExists)(h)||s.push(`Missing script file: scripts/${_}`)}let u=[],d=0;async function f(_,h,y){if(y===void 0&&(y=(await Fs.promises.stat(_)).size),y>cx){s.push(`File too large (>1MB): ${h}`);return}if(d+=y,d>lx){s.push("Total bundle size exceeds 10MB");return}if(mT(h))return;let E=await Fs.promises.readFile(_);u.push({rel:h,content:E.toString("utf-8")})}await(0,gs.pathExists)(l)&&await Iu(l,"scripts",gT,f),n==="full"&&await _T(t.viewRoot,f);let p=await px(u);p.length>0&&s.push(`Possible secrets found:
672
- ${p.map(_=>` - ${_}`).join(`
673
- `)}`);let g={id:t.id,name:o?.name??t.name,description:o?.description,author:o?.author,publishVersion:o?.publishVersion,scope:o?.scope??t.scope,tags:o?.tags,scripts:a,...n==="full"?{publishBundle:"full"}:{}};return{valid:s.length===0,errors:s,warnings:i,metadata:s.length===0?g:void 0}}async function _x(t,e,n,r="scripts-only"){if(!(0,Hg.isValidPublishVersion)(e.replace(/^v/,"")))throw new Error(`Invalid publish version: ${e}`);let s=[],i=Ut.join(t.viewRoot,"scripts"),a={version:e.replace(/^v/,""),id:t.id,name:n.name,scope:n.scope,scripts:n.scripts,...n.description?{description:n.description}:{},...n.author?{author:n.author}:{},...n.tags?.length?{tags:n.tags}:{},...r==="full"?{publishBundle:"full"}:{}};s.push({path:lT,content:(0,ea.dumpSpotlightYaml)(a),encoding:"utf-8"}),s.push({path:rx,content:(0,ea.dumpSpotlightYaml)({id:t.id,name:n.name,scope:n.scope,scripts:n.scripts}),encoding:"utf-8"});let c=Ut.join(t.viewRoot,"README.md");return await(0,gs.pathExists)(c)&&s.push(await Ug(c,"README.md")),await(0,gs.pathExists)(i)&&await Iu(i,"scripts",gT,async(l,u)=>{s.push(await Ug(l,u))}),r==="full"&&await _T(t.viewRoot,async(l,u)=>{s.push(await Ug(l,u))}),s}});var yT=T(yr=>{"use strict";var Ex=yr&&yr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),yx=yr&&yr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wx=yr&&yr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Ex(n,e,r[s]);return yx(n,e),n}})();Object.defineProperty(yr,"__esModule",{value:!0});yr.installSpotlightViewFromFiles=bx;yr.listInstalledSpotlightViews=vx;yr.setActiveSpotlightView=Ox;yr.isSpotlightViewInstalled=Ix;var Cn=require("fs"),Rt=wx(require("path")),Vg=ot(),Pu=dn(),Kg=ba(),Fg=xg(),Yt=Gg();function Bg(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Rt.basename(e.trim())):[]}function ET(t){let e=new Set,n=[];for(let r of t){let s=Rt.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function Sx(t,e){if(t==="workspace"){if(!e?.trim())throw new Error("Workspace-scoped views require an open workspace folder");return Rt.join(e.trim(),Vg.AGENTIDE_DIR_NAME,"analytics")}return Rt.join((0,Kg.getAgentideHome)(),"analytics")}function Ax(t){let e=new Map;for(let n of t){let r=Buffer.isBuffer(n.content)?n.content:Buffer.from(n.content,"utf-8");e.set(n.path.replace(/\\/g,"/"),r)}return e}async function Tx(t,e,n){await Cn.promises.mkdir(Rt.dirname(t),{recursive:!0});let r;try{let c=await Cn.promises.readFile(t,"utf-8");r=(0,Yt.parseSpotlightYamlRecord)(c)??{version:1,activeViewId:"global",views:[]}}catch{r={version:1,activeViewId:"global",views:[]}}let s=Array.isArray(r.views)?[...r.views]:[],i=(0,Yt.normalizeSpotlightViewId)(e.id),o=s.findIndex(c=>{if(!c||typeof c!="object")return!1;let l=c;return(0,Yt.normalizeSpotlightViewId)(typeof l.id=="string"?l.id:void 0)===i}),a={id:i,name:e.name,scope:e.scope,scripts:ET(e.scripts)};if(o>=0){if(!n)throw new Error(`Spotlight view "${i}" is already registered in ${t}`);s[o]=a}else s.push(a);r.views=s,typeof r.version!="number"&&(r.version=1),typeof r.activeViewId!="string"&&(r.activeViewId="global"),await Cn.promises.writeFile(t,(0,Yt.dumpSpotlightYaml)(r),"utf-8")}async function bx(t,e){let n=Ax(t),r=n.get("view.yaml"),s=n.get("panel-entry.yaml");if(!r||!s)throw new Error("Store bundle is missing view.yaml or panel-entry.yaml");let i=(0,Yt.parseSpotlightYamlRecord)(r.toString("utf-8")),o=(0,Yt.parseSpotlightYamlRecord)(s.toString("utf-8"));if(!i||!o)throw new Error("Invalid view.yaml or panel-entry.yaml in store bundle");let a=(0,Yt.normalizeSpotlightViewId)(typeof i.id=="string"?i.id:e.slug,e.slug);if(a!==(0,Yt.normalizeSpotlightViewId)(e.slug,e.slug))throw new Error(`Bundle id "${a}" does not match requested slug "${e.slug}"`);let c=i.scope==="workspace"||o.scope==="workspace"?"workspace":"global",l=typeof i.name=="string"&&i.name.trim()?i.name.trim():typeof o.name=="string"&&o.name.trim()?o.name.trim():a,u=ET(Bg(i.scripts).length?Bg(i.scripts):Bg(o.scripts)),d=Sx(c,e.workspaceRoot),f=Rt.join(d,"views",a),p=Rt.join(d,"panel","views.yaml"),g=Rt.join(f,"scripts");if(!e.overwrite&&await(0,Pu.pathExists)(f))throw new Error(`Spotlight view "${a}" already exists at ${f}`);e.overwrite&&await Cn.promises.rm(f,{recursive:!0,force:!0}),await Cn.promises.mkdir(g,{recursive:!0});let _=["scripts/","assets/","images/","charts/","reports/","exports/"],h=new Set(["manifest.json","README.md"]),y=new Set(["view.yaml","panel-entry.yaml"]);for(let[S,C]of n.entries()){if(y.has(S)||!h.has(S)&&!_.some(P=>S.startsWith(P)))continue;let v=Rt.resolve(f),I=Rt.resolve(v,S);if(!I.startsWith(v+Rt.sep))throw new Error(`Store bundle entry "${S}" escapes the install directory`);await Cn.promises.mkdir(Rt.dirname(I),{recursive:!0}),await Cn.promises.writeFile(I,C)}let E=new Date().toISOString(),w=(0,Fg.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0",A={version:w,id:a,name:l,description:typeof i.description=="string"?i.description:"",author:typeof i.author=="string"?i.author:void 0,scope:c,projectId:"",agentId:"",createdAt:E,updatedAt:E,scripts:u,storeVersion:w};if(Array.isArray(i.tags)&&(A.tags=i.tags.filter(S=>typeof S=="string")),await Cn.promises.writeFile(Rt.join(f,"view.yaml"),(0,Yt.dumpSpotlightYaml)(A),"utf-8"),await Tx(p,{id:a,name:l,scope:c,scripts:u},!!e.overwrite),e.activate){let S;try{let C=await Cn.promises.readFile(p,"utf-8");S=(0,Yt.parseSpotlightYamlRecord)(C)??{}}catch{S={version:1,views:[]}}S.activeViewId=a,typeof S.version!="number"&&(S.version=1),await Cn.promises.writeFile(p,(0,Yt.dumpSpotlightYaml)(S),"utf-8")}return e.logger&&(0,Pu.logInfo)(e.logger,`[Spotlight] Installed view "${a}" to ${f}`),{id:a,scope:c,installDir:f,viewsConfigPath:p,version:(0,Fg.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0"}}async function vx(t){let e=[],n=new Set;async function r(s){let i=Rt.join(s,"views");if(!await(0,Pu.pathExists)(i))return;let o=await Cn.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(!a.isDirectory()||a.name.startsWith("."))continue;let c=a.name.toLowerCase();if(n.has(c))continue;let l=Rt.join(i,a.name,"view.yaml");try{let u=await Cn.promises.readFile(l,"utf-8"),d=(0,Yt.parseSpotlightYamlRecord)(u);if(!d)continue;let f=(0,Yt.normalizeSpotlightViewId)(typeof d.id=="string"?d.id:a.name,a.name),p=d.scope==="workspace"?"workspace":"global";n.add(c),e.push({slug:f,displayName:typeof d.name=="string"&&d.name.trim()?d.name.trim():f,description:typeof d.description=="string"?d.description.trim():void 0,tags:Array.isArray(d.tags)?d.tags.filter(g=>typeof g=="string"):["spotlight"],latestVersion:typeof d.storeVersion=="string"?d.storeVersion:(0,Fg.resolveViewPublishVersionFromParsed)(d)??"local",scope:p})}catch{}}}return await r(Rt.join((0,Kg.getAgentideHome)(),"analytics")),t?.trim()&&await r(Rt.join(t.trim(),Vg.AGENTIDE_DIR_NAME,"analytics")),e.sort((s,i)=>s.slug.localeCompare(i.slug))}async function Ox(t,e){let n=(0,Yt.normalizeSpotlightViewId)(e,e),r;try{let s=await Cn.promises.readFile(t,"utf-8");r=(0,Yt.parseSpotlightYamlRecord)(s)??{version:1,views:[]}}catch{r={version:1,views:[]}}r.activeViewId=n,typeof r.version!="number"&&(r.version=1),await Cn.promises.writeFile(t,(0,Yt.dumpSpotlightYaml)(r),"utf-8")}async function Ix(t,e){let n=(0,Yt.normalizeSpotlightViewId)(t,t);for(let r of[Rt.join((0,Kg.getAgentideHome)(),"analytics","views",n,"view.yaml"),e?.trim()?Rt.join(e.trim(),Vg.AGENTIDE_DIR_NAME,"analytics","views",n,"view.yaml"):""].filter(Boolean))if(await(0,Pu.pathExists)(r))return!0;return!1}});var eh=T(Br=>{"use strict";var Px=Br&&Br.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Nx=Br&&Br.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Jg=Br&&Br.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Px(n,e,r[s]);return Nx(n,e),n}})();Object.defineProperty(Br,"__esModule",{value:!0});Br.storeCommand=Dx;Br.installFromStore=AT;Br.resolvePublishBundleMode=TT;var ta=Jg(require("fs/promises")),to=Jg(require("path")),wT=Jg(require("os")),Rx=require("zlib"),Nu=ot(),Cx=Ep(),ST=Sp(),pi=eu(),Xg=Uc(),sc=$g(),kx=Ap(),Wg=xg();function na(){let t=process.env.AGENTHIPPO_STORE_REPO,e=pi.DEFAULT_STORE_OWNER,n=pi.DEFAULT_STORE_REPO;if(t){let r=t.split("/");r.length===2&&(e=r[0],n=r[1])}return{owner:e,repo:n,defaultBranch:pi.DEFAULT_STORE_BRANCH,paths:pi.STORE_PATHS}}function $x(){if(process.env.AGENTHIPPO_STORE_URL)return process.env.AGENTHIPPO_STORE_URL;let t=na();return`https://${t.owner}.github.io/${t.repo}/store-index.json`}function zg(){return process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN}async function Qg(t,e={}){let n=zg(),r={"User-Agent":"AgentHippo-CLI",Accept:"application/vnd.github.v3+json",...e.headers||{}};return n&&(r.Authorization=`Bearer ${n}`),fetch(t,{...e,headers:r,redirect:"follow"})}var gi={appendLine:t=>{process.env.VERBOSE==="1"&&console.error(t)}};async function Dx(t){switch(t.verbose&&(process.env.VERBOSE="1"),t.action){case"search":await Lx(t);break;case"install":await AT(t);break;case"publish":await Mx(t);break;case"uninstall":case"remove":await Hx(t);break;case"info":await jx(t);break;case"list":await xx(t);break;default:console.error(`Error: Unknown action: ${t.action}`),console.log(""),console.log("Available actions:"),console.log(" search <query> Search for skills, packs, MCP servers, engines"),console.log(" install <ref> Install artifact (e.g., skill/pdf-tools@1.0.0)"),console.log(" publish <ref> Publish engine/<id> or view/<id>[@version]"),console.log(" uninstall <ref> Uninstall artifact (currently engine/<slug>)"),console.log(" info <ref> Show artifact details"),console.log(" list List all available artifacts"),console.log(""),console.log(" Override store repo (CLI): AGENTHIPPO_STORE_REPO=owner/repo"),process.exit(1)}}var wr=pi.STORE_ICONS;async function Lx(t){let e=t.query?.toLowerCase()||"",n=t.limit||20,r=t.type,s=await Zg(),i=new ST.LocalRegistry,o=new Set((await i.listPacks()).map(g=>g.slug)),a=await i.listSkills(),c=await i.listMcp(),l=await vT(),u=new Map(a.map(g=>[g.slug,g.installedTo||[]])),d=new Map(c.map(g=>[g.slug,g.installedTo||[]])),f=s.artifacts.filter(g=>r&&g.type!==r?!1:e?[g.slug,g.displayName,g.description,...g.tags||[]].join(" ").toLowerCase().includes(e):!0);f.sort((g,_)=>{let h=g.slug.toLowerCase()===e,y=_.slug.toLowerCase()===e;return h&&!y?-1:!h&&y?1:g.slug.localeCompare(_.slug)}),f=f.slice(0,n);let p=f.map(g=>{let _=!1,h;return g.type==="pack"?_=o.has(g.slug):g.type==="skill"?(h=u.get(g.slug),_=h!==void 0&&h.length>0):g.type==="mcp"?(h=d.get(g.slug),_=h!==void 0&&h.length>0):g.type==="engine"&&(_=l.has(g.slug)),{...g,isLocal:_,installedTo:h}});if(t.json){console.log(JSON.stringify(p,null,2));return}if(p.length===0){console.log(`No results found for "${e}"`);return}console.log(""),console.log(`Found ${p.length} result(s):`),console.log("");for(let g of p){let _=g.latestVersion?`v${g.latestVersion}`:"",h=g.isLocal?wr.local:wr.remote,y=g.isLocal?` ${wr.installed}`:"";if(console.log(` ${h} ${g.type}/${g.slug} ${_}${y}`),g.description){let E=g.description.length>60?g.description.slice(0,57)+"...":g.description;console.log(` ${E}`)}g.installedTo&&g.installedTo.length>0&&console.log(` Installed to: ${g.installedTo.join(", ")}`)}console.log(""),console.log(`Legend: ${wr.local} Local ${wr.remote} Remote ${wr.installed} Installed`),console.log(""),console.log("Install with:"),console.log(" agenthippo store install <type>/<slug>"),console.log("")}async function AT(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store install <type>/<slug>[@version]"),console.log(""),console.log("Examples:"),console.log(" agenthippo store install skill/pdf-tools"),console.log(" agenthippo store install pack/code-reviewer@1.0.0"),console.log(" agenthippo store install mcp/filesystem"),console.log(" agenthippo store install engine/gemini"),console.log(" agenthippo store install view/cost-ops@1.0.0"),process.exit(1));let e=Ru(t.query),{type:n,slug:r,version:s}=e,i=t.workspace||process.cwd();console.log(`Installing ${n}/${r}${s?`@${s}`:""}...`);let o=s||t.version;if(!o){let u=await Yg(n,r);u.length>0?(o=u.find(f=>!f.isPrerelease)?.version||u[0].version,console.log(` Using latest version: ${o}`)):(o="main",console.log(" No versions found, using main branch"))}if(n==="view"){console.log(" Downloading...");let u=await qg(n,r,o);u.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let{installSpotlightViewFromFiles:d}=await Promise.resolve().then(()=>$n(yT())),f=await d(u.map(p=>({path:p.path,content:p.content})),{slug:r,version:o,overwrite:!!t.force,workspaceRoot:i,logger:gi});console.log(""),console.log(`\u2713 Installed view/${f.id} to:`),console.log(` ${f.installDir}`),console.log(` Panel config: ${f.viewsConfigPath}`),console.log("");return}if(n==="engine"){console.log(" Downloading...");let u=await qg(n,r,o);u.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let d=await(0,Xg.installCustomEngineFromFiles)(u,{slug:r,version:o,overwrite:!!t.force,logger:gi});console.log(""),console.log(`\u2713 Installed engine/${d.id} to:`),console.log(` ${d.installDir}`),console.log("");return}let a=t.agent||"default",c;switch(n){case"skill":c=to.join(i,Nu.AGENTIDE_DIR_NAME,"agents",a,"skills",r);break;case"pack":c=t.installDir?to.resolve(t.installDir):to.join(wT.homedir(),Nu.AGENTIDE_DIR_NAME,"agents",r,o);break;case"mcp":c=to.join(i,Nu.AGENTIDE_DIR_NAME,"agents",a,"mcp",r);break}try{await ta.access(c),t.force||(console.error(`Error: ${n}/${r} already exists at ${c}`),console.log("Use --force to overwrite."),process.exit(1)),console.log(" Removing existing installation..."),await ta.rm(c,{recursive:!0,force:!0})}catch{}console.log(" Downloading...");let l=await qg(n,r,o);l.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1)),console.log(` Extracting ${l.length} files...`),await ta.mkdir(c,{recursive:!0});for(let u of l){let d=(0,Cx.safeJoin)(c,u.path);d||(console.error(`Error: refusing install \u2014 artifact path escapes destination (${u.path})`),process.exit(1)),await ta.mkdir(to.dirname(d),{recursive:!0}),await ta.writeFile(d,u.content)}if(n==="pack"&&!t.installDir){let u=to.join(wT.homedir(),Nu.AGENTIDE_DIR_NAME,"agents",r);await ta.writeFile(to.join(u,"current.txt"),o)}console.log(""),console.log(`\u2713 Installed ${n}/${r} to:`),console.log(` ${c}`),console.log("")}function TT(t){if(t.full&&t.bundle&&t.bundle.trim().toLowerCase()!=="full"&&(console.error("Error: Cannot combine --full with --bundle scripts-only"),process.exit(1)),t.full)return"full";if(t.bundle){let e=t.bundle.trim().toLowerCase();if(e==="full"||e==="scripts-only")return e;console.error("Error: Invalid --bundle value. Use scripts-only or full."),process.exit(1)}return"scripts-only"}async function Mx(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store publish <engine|view>/<slug>[@version]"),console.log(""),console.log("Examples:"),console.log(" agenthippo store publish engine/rovo"),console.log(" agenthippo store publish engine/rovo@1.0.0"),console.log(" agenthippo store publish view/cost-ops@1.0.0"),console.log(" agenthippo store publish view/brand-board --bundle full"),console.log(" agenthippo store publish view/brand-board --full"),console.log(""),console.log("Requires GITHUB_TOKEN (or GH_TOKEN / AGENTHIPPO_GITHUB_TOKEN) with fork + PR access."),console.log("Override store repo (CLI): AGENTHIPPO_STORE_REPO=owner/repo"),process.exit(1));let e=Ru(t.query),{type:n,slug:r,version:s}=e;if(n!=="engine"&&n!=="view"&&(console.error(`Error: store publish supports engine and view only, got ${n}/${r}`),console.log("Use: agenthippo store publish engine/<id>[@version]"),console.log(" agenthippo store publish view/<id>[@version] [--bundle full|scripts-only]"),process.exit(1)),zg()||(console.error("Error: GitHub token required to publish."),console.log("Set GITHUB_TOKEN, GH_TOKEN, or AGENTHIPPO_GITHUB_TOKEN, then retry."),process.exit(1)),n==="engine"){await Gx(t,r,s);return}await Ux(t,r,s)}async function Gx(t,e,n){let r=t.workspace||process.cwd(),s=await(0,sc.resolveEngineSourceDir)(e,r);s||(console.error(`Error: Engine "${e}" not found under .agent-hippo/engines/ (workspace or home).`),process.exit(1)),console.log(`Publishing engine/${e} from ${s}...`);let i=await(0,sc.validateEngineForPublish)(s,e);if(!i.valid){console.error(`Error: Cannot publish engine/${e}`);for(let l of i.errors)console.error(` - ${l}`);process.exit(1)}for(let l of i.warnings)console.log(` Warning: ${l}`);let o=n||t.version||i.metadata?.suggestedVersion;o||(console.error("Error: Publish version required."),console.log("Pass a version: agenthippo store publish engine/<slug>@1.0.0"),console.log("Or add a semver version field to package.json in the engine folder."),process.exit(1)),o=o.replace(/^v/,""),(0,sc.isValidPublishVersion)(o)||(console.error(`Error: Invalid version "${o}". Use semver (e.g., 1.0.0).`),process.exit(1));let a=await(0,sc.collectEngineFiles)(s),c=na();console.log(` Target store: ${c.owner}/${c.repo}`),console.log(` Version tag: engines/${e}/v${o}`),console.log(` Files: ${a.length}`),await bT({options:t,type:"engine",slug:e,version:o,files:a,installHint:`agenthippo store install engine/${e}`})}async function Ux(t,e,n){let r=t.workspace||process.cwd(),s=TT(t),i=await(0,Wg.discoverPublishableViews)(r),o=i.find(f=>f.id===e);if(!o){if(console.error(`Error: Spotlight view "${e}" not found.`),console.log("Register a user view in .agent-hippo/analytics/panel/views.yaml (non-system id)."),i.length>0){console.log(""),console.log("Publishable views:");for(let f of i)console.log(` - view/${f.id} (${f.sourceLabel}, ${f.scope})`)}process.exit(1)}console.log(`Publishing view/${e} from ${o.viewRoot}...`),console.log(` Bundle: ${s==="full"?"full (scripts + assets + charts/reports/exports + manifest.json)":"scripts only"}`);let a=await(0,Wg.validateViewForPublish)(o,{expectedId:e,mode:s});if(!a.valid){console.error(`Error: Cannot publish view/${e}`);for(let f of a.errors)console.error(` - ${f}`);process.exit(1)}for(let f of a.warnings)console.log(` Warning: ${f}`);a.metadata||(console.error("Error: Validation succeeded but metadata is missing."),process.exit(1));let c=n||t.version||a.metadata.publishVersion;c||(console.error("Error: Publish version required."),console.log("Pass a version: agenthippo store publish view/<slug>@1.0.0"),console.log("Or add version to view.yaml (e.g. version: 1.0.0)."),process.exit(1)),c=c.replace(/^v/,""),(0,sc.isValidPublishVersion)(c)||(console.error(`Error: Invalid version "${c}". Use semver (e.g., 1.0.0).`),process.exit(1));let l=await(0,Wg.collectViewFiles)(o,c,a.metadata,s),u=na(),d=l.filter(f=>f.encoding==="base64").length;console.log(` Target store: ${u.owner}/${u.repo}`),console.log(` Version tag: spotlight/${e}/v${c}`),console.log(` Files: ${l.length}${d>0?` (${d} binary)`:""}`),await bT({options:t,type:"view",slug:e,version:c,files:l,bundle:s,installHint:`agenthippo store install view/${e}`})}async function bT(t){let{options:e,type:n,slug:r,version:s,files:i,bundle:o,installHint:a}=t;try{let c=await(0,kx.publishToStore)({type:n,slug:r,version:s,files:i},gi);e.json?console.log(JSON.stringify({success:!0,type:n,slug:r,version:s,bundle:o,prUrl:c.prUrl,prNumber:c.prNumber,tagName:c.tagName},null,2)):(console.log(""),console.log(`\u2713 Opened pull request for ${n}/${r} v${s}${o==="full"?" (full bundle)":""}`),console.log(` ${c.prUrl}`),console.log(""),console.log(`After merge, install with: ${a}`))}catch(c){let l=c instanceof Error?c.message:String(c);e.json?console.log(JSON.stringify({success:!1,error:l})):console.error(`Error: ${l}`),process.exit(1)}}async function Hx(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store uninstall engine/<slug>"),console.log(""),console.log("Examples:"),console.log(" agenthippo store uninstall engine/gemini"),process.exit(1));let{type:e,slug:n}=Ru(t.query);e!=="engine"&&(console.error(`Error: store uninstall currently supports custom engines only, got ${e}/${n}`),process.exit(1));let r=await(0,Xg.uninstallCustomEngine)(n,{logger:gi});r.removed||(console.error(`Error: engine/${r.id} is not installed.`),process.exit(1)),console.log(""),console.log(`\u2713 Uninstalled engine/${r.id} from:`),console.log(` ${r.installDir}`),console.log("")}async function jx(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store info <type>/<slug>"),process.exit(1));let e=Ru(t.query),r=(await Zg()).artifacts.find(i=>i.type===e.type&&i.slug===e.slug);if(r||(console.error(`Error: ${e.type}/${e.slug} not found in store.`),process.exit(1)),t.json){let i=await Yg(e.type,e.slug);console.log(JSON.stringify({...r,versions:i},null,2));return}console.log(""),console.log("\u2500".repeat(60)),console.log(`${r.type}/${r.slug}`),console.log("\u2500".repeat(60)),console.log(`Name: ${r.displayName}`),console.log(`Type: ${r.type}`),console.log(`Version: ${r.latestVersion||"N/A"}`),r.author&&console.log(`Author: ${r.author}`),r.description&&console.log(`Description: ${r.description}`),r.tags?.length&&console.log(`Tags: ${r.tags.join(", ")}`);let s=await Yg(e.type,e.slug);if(s.length>0){console.log(""),console.log("Available versions:");for(let i of s.slice(0,10)){let o=i.isPrerelease?" (pre-release)":"";console.log(` - ${i.version}${o}`)}s.length>10&&console.log(` ... and ${s.length-10} more`)}console.log("\u2500".repeat(60)),console.log(""),console.log("Install with:"),console.log(` agenthippo store install ${r.type}/${r.slug}`),console.log("")}async function xx(t){let e=await Zg(),n=t.type,r=new ST.LocalRegistry,s=new Set((await r.listPacks()).map(p=>p.slug)),i=await r.listSkills(),o=await r.listMcp(),a=await vT(),c=new Map(i.map(p=>[p.slug,p.installedTo||[]])),l=new Map(o.map(p=>[p.slug,p.installedTo||[]])),u=e.artifacts;n&&(u=u.filter(p=>p.type===n));let d=p=>{if(p.type==="pack")return s.has(p.slug);if(p.type==="skill"){let g=c.get(p.slug);return g!==void 0&&g.length>0}if(p.type==="mcp"){let g=l.get(p.slug);return g!==void 0&&g.length>0}return p.type==="engine"?a.has(p.slug):!1};if(t.json){let p=u.map(g=>({...g,isLocal:d(g),installedTo:g.type==="skill"?c.get(g.slug):g.type==="mcp"?l.get(g.slug):void 0}));console.log(JSON.stringify(p,null,2));return}console.log(""),console.log(`Store contains ${u.length} artifact(s):`),console.log("");let f={};for(let p of u)f[p.type]=f[p.type]||[],f[p.type].push(p);for(let p of["pack","skill","mcp","engine"]){let g=f[p]||[];if(g.length!==0){console.log(`${p}s (${g.length}):`);for(let _ of g){let h=_.latestVersion?` v${_.latestVersion}`:"",y=d(_),E=y?wr.local:wr.remote,w=y?` ${wr.installed}`:"";console.log(` ${E} ${_.slug}${h}${w}`)}console.log("")}}console.log(`Legend: ${wr.local} Local ${wr.remote} Remote ${wr.installed} Installed`),console.log("")}function Ru(t){try{return(0,pi.parseStoreUrl)(t)}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`Error: ${n}`),console.log("Expected format: <type>/<slug>[@version]"),console.log("Examples: skill/pdf-tools, pack/code-reviewer@1.0.0, engine/gemini, view/cost-ops"),process.exit(1)}}async function vT(){return new Set((await(0,Xg.listInstalledCustomEngines)()).map(t=>t.id))}async function Zg(){let t=$x();gi.appendLine(`[Store] Fetching index from ${t}`);let e=await fetch(t,{headers:{"User-Agent":"AgentHippo-CLI",Accept:"application/json"}});if(e.ok)return await e.json();if(zg()&&(e.status===403||e.status===404)){gi.appendLine("[Store] GitHub Pages not available, trying API with auth...");let r=na(),s=`https://api.github.com/repos/${r.owner}/${r.repo}/contents/dist/store-index.json`;if(e=await Qg(s,{headers:{Accept:"application/vnd.github.raw+json"}}),e.ok)return await e.json()}throw new Error(`Failed to fetch store index: ${e.status} ${e.statusText}`)}async function Yg(t,e){let n=na(),s=`${(0,pi.getStorePath)(t)}/${e}/v`,i=`https://api.github.com/repos/${n.owner}/${n.repo}/git/refs/tags`;gi.appendLine(`[Store] Listing versions for ${t}/${e}`);let o=await Qg(i);if(!o.ok){if(o.status===404)return[];throw new Error(`Failed to list versions: ${o.statusText}`)}let a=await o.json(),c=[];for(let{ref:l}of a){let u=l.replace("refs/tags/","");if(u.startsWith(s)){let d=u.slice(s.length-1);c.push({version:d.replace(/^v/,""),tagName:u,isPrerelease:/-(alpha|beta|rc|pre)/.test(d)})}}return c.sort((l,u)=>u.version.localeCompare(l.version,void 0,{numeric:!0}))}async function qg(t,e,n){let r=na(),s=(0,pi.getStorePath)(t),i;n==="main"||n==="latest"?i=r.defaultBranch:i=`${s}/${e}/v${n.replace(/^v/,"")}`,gi.appendLine(`[Store] Downloading ${t}/${e} at ${i}`);let o=encodeURIComponent(i),a=`https://api.github.com/repos/${r.owner}/${r.repo}/tarball/${o}`,c=await Qg(a);if(!c.ok)throw new Error(`Failed to download: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer()),u=(0,Rx.gunzipSync)(l),d=Bx(u),f=`${s}/${e}/`,p=[];for(let[g,_]of d){let h=g.indexOf("/");if(h===-1)continue;let y=g.slice(h+1);if(y.startsWith(f)){let E=y.slice(f.length);E&&p.push({path:E,content:_})}}return p}function Bx(t){let e=new Map,n=0;for(;n<t.length-512;){let r=t.subarray(n,n+512);if(r.every(c=>c===0))break;let s=r.subarray(0,100).toString("utf-8").replace(/\0/g,"").trim(),i=r.subarray(124,136).toString("utf-8").replace(/\0/g,"").trim(),o=r[156];if(!s){n+=512;continue}let a=parseInt(i,8)||0;n+=512,(o===0||o===48)&&e.set(s,Buffer.from(t.subarray(n,n+a))),n+=Math.ceil(a/512)*512}return e}});var OT=T(th=>{"use strict";Object.defineProperty(th,"__esModule",{value:!0});th.parsePackInstallRef=Fx;function Fx(t){let e=t.trim(),n=e.lastIndexOf("@");return n>0?{slug:e.slice(0,n),version:e.slice(n+1)||void 0}:{slug:e}}});var PT=T(Vs=>{"use strict";var Vx=Vs&&Vs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Kx=Vs&&Vs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),IT=Vs&&Vs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Vx(n,e,r[s]);return Kx(n,e),n}})();Object.defineProperty(Vs,"__esModule",{value:!0});Vs.packCommand=Jx;var ra=IT(require("fs")),ku=IT(require("path")),sa=ji(),Cu=ot(),Wx=si(),Sr=Ho(),qx=eh(),Yx=OT(),nh="-".repeat(62);async function Jx(t){let e=t.workspace;switch(t.action){case"list":await zx(e);break;case"validate":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack validate <name>"),process.exit(1)),await Qx(t.name,e);break;case"info":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack info <name>"),process.exit(1)),await Zx(t.name,e);break;case"sign":await t1(t);break;case"verify":await n1(t);break;case"digest":await r1(t);break;case"keygen":e1(t);break;case"install":await Xx(t);break;case"export":console.log("Pack export is not yet implemented.");break;default:console.error(`Error: Unknown action: ${t.action}`),console.log(""),console.log("Available actions:"),console.log(" list List installed packs"),console.log(" validate Validate a pack"),console.log(" info Show pack details"),console.log(" sign Sign a pack so a fleet can verify it before running"),console.log(" verify Verify a pack against trusted public keys"),console.log(" digest Print the pack content digest (what a signature covers)"),console.log(" keygen Generate an ES256 signing keypair"),console.log(" install Install a pack from the store to a folder"),console.log(" export Export a pack (coming soon)"),process.exit(1)}}async function Xx(t){t.name?.trim()||(console.error("Error: pack slug required."),console.log("Usage: agenthippo pack install <slug>[@version] --to <dir>"),console.log(""),console.log("Examples:"),console.log(" agenthippo pack install joker1 --to ./packs/joker1"),console.log(" agenthippo pack install code-reviewer@1.0.0 --to ./packs/code-reviewer"),process.exit(1));let e=t.to?.trim();e||(console.error("Error: --to <dir> is required."),console.log("Usage: agenthippo pack install <slug>[@version] --to <dir>"),console.log(""),console.log("Same download as `agenthippo store install pack/<slug>`, extracted flat for serve/deploy."),process.exit(1));let{slug:n,version:r}=(0,Yx.parsePackInstallRef)(t.name);await(0,qx.installFromStore)({action:"install",query:`pack/${n}${r?`@${r}`:""}`,workspace:t.workspace,version:r,force:t.force,installDir:ku.resolve(e),verbose:t.verbose})}async function zx(t){let e=(0,sa.listAvailablePacks)(t);if(e.length===0){console.log("No agent packs found."),console.log(""),console.log("Agent packs are stored in:"),t&&console.log(` Workspace: ${t}/${Cu.AGENTIDE_DIR_NAME}/agents/`),console.log(` User library: ~/${Cu.AGENTIDE_DIR_NAME}/agents/`),console.log(""),console.log("Create a pack with:"),console.log(` mkdir -p ~/${Cu.AGENTIDE_DIR_NAME}/agents/my-agent/1.0.0`),console.log(` echo "1.0.0" > ~/${Cu.AGENTIDE_DIR_NAME}/agents/my-agent/current.txt`),console.log(" # Add agent.yaml and AGENTS.md");return}console.log(""),console.log("Installed Agent Packs:"),console.log("");for(let n of e){let r=n.version?` (v${n.version})`:"",s=n.source==="workspace"?" [workspace]":"";console.log(` ${n.name}${r}${s}`),console.log(` ${n.path}`)}console.log("")}async function Qx(t,e){console.log(`Validating pack: ${t}`),console.log("");let n=(0,sa.resolvePackPath)(t,e);n||(console.error(`Error: Pack not found: ${t}`),process.exit(1));let r=[],s=[],i=ku.join(n,"agent.yaml");ra.existsSync(i)?console.log(" OK: agent.yaml exists"):r.push("Missing agent.yaml");try{let o=await(0,sa.loadAgentPack)(t,e);console.log(` OK: metadata.name: ${o.manifest.metadata.name}`),console.log(` OK: metadata.version: ${o.manifest.metadata.version}`),console.log(` OK: spec.engine: ${o.manifest.spec.engine}`),o.manifest.spec.model?console.log(` OK: spec.model: ${o.manifest.spec.model}`):s.push("spec.model not specified, will use default"),o.manifest.spec.cheapModel&&console.log(` OK: spec.cheapModel: ${o.manifest.spec.cheapModel}`),o.manifest.spec.effort&&console.log(` OK: spec.effort: ${o.manifest.spec.effort}`);let a=ku.join(n,"AGENTS.md");if(ra.existsSync(a)){let c=ra.statSync(a);console.log(` OK: AGENTS.md exists (${(c.size/1024).toFixed(1)} KB)`)}else s.push("No AGENTS.md found")}catch(o){r.push(o instanceof Error?o.message:String(o))}if(console.log(""),s.length>0)for(let o of s)console.log(` Warning: ${o}`);if(r.length>0){for(let o of r)console.log(` Error: ${o}`);console.log(""),console.log("Pack is INVALID"),process.exit(1)}console.log(""),console.log("Pack is valid.")}async function Zx(t,e){try{let n=await(0,sa.loadAgentPack)(t,e);if(console.log(""),console.log(nh),console.log(`Agent: ${n.manifest.metadata.name}`),console.log(nh),console.log(`Version: ${n.manifest.metadata.version}`),n.manifest.metadata.description&&console.log(`Description: ${n.manifest.metadata.description}`),n.manifest.metadata.author&&console.log(`Author: ${n.manifest.metadata.author}`),console.log(`Engine: ${n.manifest.spec.engine}`),n.manifest.spec.model&&console.log(`Model: ${n.manifest.spec.model}`),n.manifest.spec.cheapModel&&console.log(`Cheap Model: ${n.manifest.spec.cheapModel}`),n.manifest.spec.effort&&console.log(`Effort: ${n.manifest.spec.effort}`),console.log(`Path: ${n.packPath}`),n.manifest.spec.permissions&&(console.log(""),console.log("Permissions:"),console.log(` File Access: ${n.manifest.spec.permissions.fileAccess||"default"}`)),n.manifest.spec.mcpServers&&n.manifest.spec.mcpServers.length>0){console.log(""),console.log("MCP Servers:");for(let r of n.manifest.spec.mcpServers)console.log(` - ${r.name}`)}console.log(nh),console.log("")}catch(n){console.error(`Error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function rh(t,e){t||(console.error("Error: pack name or path required"),process.exit(1));let n=(0,sa.resolvePackPath)(t,e);n||(console.error(`Error: pack not found: ${t}`),process.exit(1));let r=await(0,sa.loadAgentPack)(n,e);return{packPath:r.packPath,name:r.manifest.metadata.name,version:r.manifest.metadata.version??"0.0.0"}}function e1(t){let e=t.kid||`sign-${new Date().toISOString().slice(0,10)}`,n=(0,Wx.generateWarrantKeypair)(e),r=t.output;r?(ra.writeFileSync(r,n.privateKeyPem,{mode:384}),console.log(`Private key written to ${r} (mode 0600) \u2014 keep it off shared disks.`)):console.log(n.privateKeyPem),console.log(""),console.log(`kid: ${e}`),console.log("Public half \u2014 publish this to the control plane so instances can verify:"),console.log(n.publicKeyPem.trim()),console.log(""),console.log(` curl -X POST "$CONTROL/api/keys" -H 'content-type: application/json' \\`),console.log(` -d '{"kid":"${e}","publicPem":"\u2026"}'`)}async function t1(t){let{packPath:e,name:n,version:r}=await rh(t.name,t.workspace);t.key||(console.error("Error: --key <private-key.pem> required. Generate one with: agenthippo pack keygen -o key.pem"),process.exit(1));let s;try{s=ra.readFileSync(t.key,"utf8")}catch(a){console.error(`Error: cannot read key ${t.key}: ${a instanceof Error?a.message:a}`),process.exit(1);return}let i=t.kid;i||(console.error("Error: --kid <id> required \u2014 it is how a verifier finds the public half in JWKS."),process.exit(1));let{digest:o}=(0,Sr.signPack)({packDir:e,pack:n,packVersion:r,privateKeyPem:s,kid:i});console.log(`Signed ${n}@${r}`),console.log(` digest ${o}`),console.log(` key ${i}`),console.log(` written ${ku.join(e,Sr.PACK_SIGNATURE_FILE)}`),console.log(""),console.log("Commit pack.sig with the pack: it travels WITH the artifact, and a fleet that"),console.log("requires signatures refuses anything whose contents no longer match it.")}async function n1(t){let{packPath:e,name:n,version:r}=await rh(t.name,t.workspace),s=(0,Sr.readPackSignature)(e);s||(console.error(`UNSIGNED: no ${Sr.PACK_SIGNATURE_FILE} at ${e}`),console.error((0,Sr.describePackRefusal)({kind:"unsigned",detail:`no ${Sr.PACK_SIGNATURE_FILE}`,pack:n,packVersion:r,packDir:e})),process.exit(1));let i={};if(t.keys)try{i=JSON.parse(ra.readFileSync(t.keys,"utf8"))}catch(a){console.error(`Error: cannot read keys ${t.keys}: ${a instanceof Error?a.message:a}`),process.exit(1)}else{let a=await(0,Sr.loadPackTrustRoot)({env:t.jwks?{...process.env,[Sr.PACK_JWKS_URL_ENV]:t.jwks}:process.env,leaseUrl:process.env.AGENTHIPPO_LEASE_URL});for(let c of a.warnings)console.error(`Warning: ${c}`);a.status==="unavailable"&&(console.error(`REFUSED: a trust root is configured but could not be loaded \u2014 ${a.reason}`),console.error((0,Sr.describePackRefusal)({kind:"trust-root-unavailable",detail:a.reason??"unavailable",pack:n,packVersion:r,packDir:e,trustRootHint:a.url?`Trust root: ${a.url}`:void 0})),process.exit(1)),i=a.keys}Object.keys(i).length===0&&(console.error("REFUSED: no trusted public keys. Pass --keys <file>, --jwks <url>, or set AGENTHIPPO_PACK_SIGNING_KEYS."),process.exit(1));let o=(0,Sr.verifyPack)(s,i,{packDir:e,pack:n,packVersion:r});o.ok||(console.error(`INVALID: ${o.reason}`),console.error((0,Sr.describePackRefusal)({kind:o.kind,detail:o.reason,pack:n,packVersion:r,packDir:e})),process.exit(1)),console.log(`OK: ${n}@${r} verified`),console.log(` digest ${o.claims.digest}`),console.log(" NOTE: .claude/, .codex/ and .agent-hippo/ ARE covered by this digest \u2014 they carry hooks"),console.log(" and other executable content, and were previously outside the signature.")}async function r1(t){let{packPath:e,name:n,version:r}=await rh(t.name,t.workspace);console.log(`${(0,Sr.computePackDigest)(e)} ${n}@${r}`)}});var RT=T(ic=>{"use strict";Object.defineProperty(ic,"__esModule",{value:!0});ic.parseStrictJsonConfig=NT;ic.collectMissingChannelEnvSecrets=i1;ic.disableChannelsInConfigText=o1;var s1=8;function no(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function NT(t){try{return JSON.parse(t)}catch{return}}function sh(t,e,n){if(!(n>s1)){if(Array.isArray(t)){for(let r of t)sh(r,e,n+1);return}if(no(t)){if(t.source==="env"&&typeof t.id=="string"&&t.id.trim()){e.add(t.id.trim());return}for(let r of Object.values(t))sh(r,e,n+1)}}}function i1(t,e){if(!no(t)||!no(t.channels))return[];let n=[];for(let[r,s]of Object.entries(t.channels)){if(!no(s)||s.enabled===!1)continue;let i=new Set;sh(s,i,0);let o=[...i].filter(a=>!e[a]?.trim()).sort();o.length&&n.push({channel:r,envVars:o})}return n}function o1(t,e){let n=NT(t);if(!(!no(n)||!no(n.channels))){for(let r of e){let s=n.channels[r];no(s)&&(s.enabled=!1)}return`${JSON.stringify(n,null,2)}
669
+ `)}}});var YA=T(Bs=>{"use strict";var wj=Bs&&Bs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Sj=Bs&&Bs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qA=Bs&&Bs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&wj(n,e,r[s]);return Sj(n,e),n}})();Object.defineProperty(Bs,"__esModule",{value:!0});Bs.idpCommand=Tj;var Tu=qA(require("fs")),tc=qA(require("path")),Aj=WA(),Zo=en();async function Tj(t,e){if(t!=="init"){console.error(`Unknown idp action "${t}". Supported: init`),process.exit(1);return}if(!e.hostname?.trim()){console.error("idp init requires --hostname <public-hostname> (e.g. auth.corp.example)"),process.exit(1);return}let n=tc.resolve(e.out||"./enterprise-deploy/idp");Tu.mkdirSync(n,{recursive:!0});let r={hostname:e.hostname.trim(),cookieDomain:e.cookieDomain},s=(0,Aj.renderIdpArtifacts)(r),i=[],o=[];for(let[a,c]of Object.entries(s)){let l=tc.join(n,a);if(Tu.existsSync(l)&&!e.force){o.push(a);continue}Tu.mkdirSync(tc.dirname(l),{recursive:!0}),Tu.writeFileSync(l,c),i.push(a)}console.log(`${Zo.COLORS.green}\u2713${Zo.COLORS.reset} idp \u2192 ${tc.relative(process.cwd(),n)||"."}`);for(let a of i)console.log(` ${Zo.COLORS.dim}+ ${a}${Zo.COLORS.reset}`);for(let a of o)console.log(` ${Zo.COLORS.yellow}\u2022 ${a} (exists; --force to overwrite)${Zo.COLORS.reset}`);console.log(`Next: cd ${tc.relative(process.cwd(),n)||"."}, cp .env.example ~/.agent-hippo/.env, cp .env.auth.example ~/.agent-hippo/.env.auth (fill in), then ./run.sh`)}});var zA=T(Rg=>{"use strict";Object.defineProperty(Rg,"__esModule",{value:!0});Rg.grantsCommand=bj;var JA=Vi(),XA=en();function bu(t){console.error(`${XA.COLORS.red}Error:${XA.COLORS.reset} ${t}`),process.exit(1)}async function bj(t,e){let n;try{n=new JA.StoredGrantProvider((0,JA.readStoredGrantConfig)(process.env))}catch(r){bu(r instanceof Error?r.message:String(r))}if(t==="list"){let r=await n.cfg.store.list();console.log(JSON.stringify(r.map(s=>"error"in s?s:{user:s.userId,google:s.grants.google?{email:s.grants.google.email,scopes:s.grants.google.scopes,connected_at:s.grants.google.connectedAt}:null,banks:(s.grants.plaid?.items??[]).map(i=>({institution:i.institution,item_id:i.itemId,env:i.env,connected_at:i.connectedAt,...i.replacedBy?{replaced_by:i.replacedBy}:{}}))}),null,2));return}if(t==="revoke"){let r=e.user?.trim();r||bu("revoke needs --user <verified user id>"),e.service&&e.service!=="google"&&e.service!=="bank"&&bu("--service must be google or bank");let s=e.service?[e.service]:["google","bank"],i={};for(let o of s)try{i[o]=await n.revoke(r,o,o==="bank"?e.bank:void 0)}catch(a){i[o]={ok:!1,disconnected:[],failed:[{error:a instanceof Error?a.message:String(a)}]}}console.log(JSON.stringify(i,null,2)),Object.values(i).some(o=>!o.ok)&&(process.exitCode=1);return}bu(`unknown action "${t}" (use: list | revoke --user <id> [--service google|bank] [--bank <name>])`)}});var $g=T(Xn=>{"use strict";var vj=Xn&&Xn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Oj=Xn&&Xn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ij=Xn&&Xn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&vj(n,e,r[s]);return Oj(n,e),n}})();Object.defineProperty(Xn,"__esModule",{value:!0});Xn.discoverPublishableEngines=eT;Xn.resolveEngineSourceDir=Gj;Xn.validateEngineForPublish=Uj;Xn.collectEngineFiles=Hj;Xn.isValidPublishVersion=jj;var Pj=require("child_process"),fi=require("fs"),Jn=Ij(require("path")),Nj=require("util"),Rj=ot(),eo=dn(),Cj=Uc(),kj=(0,Nj.promisify)(Pj.execFile),vu="engine.manifest.json",$j=new Set([".git",".hg",".svn",".DS_Store","node_modules","dist","coverage",".turbo",".cache",".pnpm-store","Thumbs.db"]),Dj=[["private key",/-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],["OpenAI-style key",/\bsk-(?!dummy\b|ant-)[A-Za-z0-9_-]{20,}\b/],["Anthropic key",/\bsk-ant-[A-Za-z0-9_-]{20,}\b/],["Google API key",/\bAIza[0-9A-Za-z_-]{30,}\b/],["GitHub token",/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/],["Atlassian API token",/\bATATT[A-Za-z0-9_=+/\-]{20,}\b/],["AWS access key",/\bAKIA[0-9A-Z]{16}\b/],["JWT",/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/]];function QA(t){return!!($j.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function Cg(t){let e=t.replace(/\\/g,"/").trim().replace(/^\.\//,"");if(!e||e==="."||e==="..")throw new Error("must be a non-empty relative path");if(e.includes("\0")||Jn.posix.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e))throw new Error(`must be a safe relative path: ${t}`);for(let n of e.split("/"))if(!n||n==="."||n==="..")throw new Error(`must not contain empty, "." or ".." segments: ${t}`);return e}async function ZA(t){let e=Jn.join(t,vu),n=await fi.promises.readFile(e,"utf-8"),r=JSON.parse(n);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${e} must contain a JSON object`);if(r.version!==2)throw new Error(`${e} must use custom engine manifest version 2`);if(typeof r.id!="string"||!/^[a-z0-9][a-z0-9._-]*$/.test(r.id))throw new Error(`${e} has invalid id: ${String(r.id)}`);if(typeof r.entry!="string")throw new Error(`${e} must define string entry`);let s=Cg(r.entry),i=Jn.join(t,s);if(!await(0,eo.pathExists)(i))throw new Error(`${e} entry does not exist: ${s}`);if(r.workspaceSync&&typeof r.workspaceSync=="object"){let o=r.workspaceSync;o.enabled&&(typeof o.dir=="string"&&Cg(o.dir),typeof o.rulesFile=="string"&&Cg(o.rulesFile))}return{manifest:r,manifestPath:e,entryPath:i}}async function kg(t,e=""){let n=Jn.join(t,e),r=await fi.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(QA(i.name))continue;let o=e?Jn.join(e,i.name):i.name,a=Jn.join(t,o);i.isDirectory()?s.push(...await kg(t,o)):i.isFile()&&s.push({rel:o.replace(/\\/g,"/"),abs:a})}return s}async function Lj(t){let e=[];for(let n of t){if((await fi.promises.stat(n.abs)).size>5*1024*1024)continue;let s=await fi.promises.readFile(n.abs);if(s.includes(0))continue;let i=s.toString("utf8");for(let[o,a]of Dj)a.test(i)&&e.push(`${n.rel}: ${o}`)}return e}async function Mj(t){let e=Jn.join(t,"package.json");if(await(0,eo.pathExists)(e))try{let n=JSON.parse(await fi.promises.readFile(e,"utf-8"));if(n.version&&/^\d+\.\d+\.\d+/.test(n.version))return n.version}catch{return}}async function eT(t){let e=[];t?.trim()&&e.push({root:Jn.join(Jn.resolve(t),Rj.AGENTIDE_DIR_NAME,"engines"),label:"workspace"}),e.push({root:(0,Cj.getDefaultCustomEnginesInstallRoot)(),label:"home"});let n=new Map;for(let{root:r,label:s}of e){if(!await(0,eo.pathExists)(r))continue;let i=await fi.promises.readdir(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||QA(o.name))continue;let a=Jn.join(r,o.name),c=Jn.join(a,vu);if(await(0,eo.pathExists)(c))try{let{manifest:l}=await ZA(a),u=l.id;if(n.has(u))continue;n.set(u,{id:u,displayName:typeof l.displayName=="string"?l.displayName:u,sourceDir:a,sourceLabel:s})}catch{}}}return[...n.values()].sort((r,s)=>r.id.localeCompare(s.id))}async function Gj(t,e){return(await eT(e)).find(r=>r.id===t)?.sourceDir}async function Uj(t,e){let n=[],r=[];if(!await(0,eo.pathExists)(t))return{valid:!1,errors:[`Engine directory not found: ${t}`],warnings:r};let s,i;try{({manifest:s,entryPath:i}=await ZA(t))}catch(f){return{valid:!1,errors:[f instanceof Error?f.message:String(f)],warnings:r}}let o=s.id;e&&e!==o&&n.push(`Engine folder id "${e}" does not match manifest id "${o}"`);let a=Jn.join(t,"package.json");await(0,eo.pathExists)(a)&&!await(0,eo.pathExists)(Jn.join(t,"package-lock.json"))&&n.push("package.json present but package-lock.json is missing");let c=await kg(t);c.some(f=>f.rel===vu)||n.push(`Missing ${vu} in publishable files`);let l=await Lj(c);l.length>0&&n.push(`Possible secrets found:
670
+ ${l.map(f=>` - ${f}`).join(`
671
+ `)}`);try{await kj(process.execPath,["--check",i],{windowsHide:!0})}catch(f){let d=f instanceof Error?f.message:String(f);n.push(`engine entry failed node --check: ${d}`)}s.description||r.push("Consider adding description to engine.manifest.json");let u=await Mj(t);return u||r.push("No package.json version found; you will be prompted for a publish version"),{valid:n.length===0,errors:n,warnings:r,metadata:n.length===0?{id:o,displayName:typeof s.displayName=="string"?s.displayName:o,description:typeof s.description=="string"?s.description:void 0,suggestedVersion:u}:void 0}}async function Hj(t){let e=await kg(t),n=[];for(let r of e){if((await fi.promises.stat(r.abs)).size>5*1024*1024)throw new Error(`File too large to publish (>5MB): ${r.rel}`);let i=await fi.promises.readFile(r.abs);if(i.includes(0))throw new Error(`Binary file cannot be published as text: ${r.rel}`);n.push({path:r.rel,content:i.toString("utf8")})}return n}function jj(t){return/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t.trim())}});var oT=T(Ge=>{"use strict";Object.defineProperty(Ge,"__esModule",{value:!0});Ge.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE=Ge.VIEW_EXPORT_SNAPSHOT_MESSAGE=Ge.WORKFLOWS_SIDECAR_SCRIPTS=Ge.WORKFLOWS_RUN_SCRIPT=Ge.WORKFLOWS_VIEW_ID=Ge.FLEET_WIDGET_SCRIPT=void 0;Ge.createDefaultWorkflowsView=tT;Ge.viewRunsFleetWidget=nT;Ge.resolveRefreshOnNavigate=Mg;Ge.resolveGalleryLayout=rT;Ge.resolvePreserveFleetIframe=sT;Ge.shouldPreserveFleetIframe=Bj;Ge.buildViewExportSnapshotMessages=Vj;Ge.shouldRunScriptsOnNavigation=Kj;Ge.normalizeDashboardViewId=nc;Ge.formatDisplayNameForAllocatedViewId=Wj;Ge.createDefaultDashboardViewsConfig=iT;Ge.resolveMergedActiveViewId=Lg;Ge.mergeDashboardViewsConfigs=qj;Ge.FLEET_WIDGET_SCRIPT="agent-fleet-widget.js";Ge.WORKFLOWS_VIEW_ID="workflows";Ge.WORKFLOWS_RUN_SCRIPT="workflows-widget.cjs";Ge.WORKFLOWS_SIDECAR_SCRIPTS=["workflows-collector.cjs","workflows-daemon.mjs","fleet-workflow.sh"];function tT(){return{id:Ge.WORKFLOWS_VIEW_ID,name:"Workflows",scope:"global",scripts:[Ge.WORKFLOWS_RUN_SCRIPT],bundledScripts:Ge.WORKFLOWS_SIDECAR_SCRIPTS,system:!0,refreshOnNavigate:"always",layout:"fleet-dashboard",preserveFleetIframe:!0}}Ge.VIEW_EXPORT_SNAPSHOT_MESSAGE="viewExportSnapshot";Ge.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE="requestViewExportSnapshot";function xj(t){return t.trim().replace(/^.*[/\\]/,"").toLowerCase()}function nT(t){return t.scripts.some(e=>xj(e)===Ge.FLEET_WIDGET_SCRIPT)}function Mg(t){return t.refreshOnNavigate==="always"||t.refreshOnNavigate==="when-empty"?t.refreshOnNavigate:nT(t)?"always":"when-empty"}function rT(t){return t.layout==="fleet-dashboard"||t.layout==="gallery"?t.layout:Mg(t)==="always"?"fleet-dashboard":"gallery"}function sT(t){return t.preserveFleetIframe===!1?!1:t.preserveFleetIframe===!0?!0:rT(t)==="fleet-dashboard"}function Bj(t){return sT(t)}var Fj=192*1024,Dg=100;function Vj(t){let e=Array.isArray(t.sessions)?t.sessions:[],n={ok:!0,sessionCount:e.length,cliActive:!!t.diagnostics?.cliActive,daemonHint:!1};if(!Array.isArray(t.sessions))return[{payload:t,meta:n}];let r=Buffer.byteLength(JSON.stringify(e),"utf8");if(r<=Fj)return[{payload:t,meta:n}];let s={...t,sessions:[]},i=Math.max(1,Math.ceil(e.length/Dg)),o=`${Date.now()}-${e.length}-${r}`,a=[];for(let c=0;c<i;c+=1)a.push({payload:{...s,sessions:e.slice(c*Dg,(c+1)*Dg)},meta:{...n,chunkedSessions:!0,chunkIndex:c,chunkCount:i,snapshotId:o}});return a}function Kj(t,e){return Mg(t)==="always"?!0:!e.some(n=>n==="chart")}function nc(t,e="global"){return(t??e).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||e}function Wj(t,e,n=nc){let r=n(t,"view");if(e===r)return t;let s=`${r}-`;if(e.startsWith(s)){let i=e.slice(s.length);if(/^\d+$/.test(i))return`${t} ${i}`}return t}function iT(t="global"){return{version:1,activeViewId:t,views:[{id:"global",name:"Global",scope:"global",scripts:[],system:!0},{id:"workspace",name:"Workspace",scope:"workspace",scripts:[],system:!0},{id:"fleet",name:"Fleet",scope:"global",scripts:["agent-fleet-widget.js"],system:!0},tT()]}}function Lg(t,e,n,r){let s=r?.preferWorkspaceScopeFallback===!0,i=e?nc(e,""):"";if(i&&t.some(a=>a.id===i))return i;if(s&&t.some(a=>a.id==="workspace"))return"workspace";if(t.some(a=>a.id===n.activeViewId))return n.activeViewId;if(t.some(a=>a.id==="global"))return"global";let o=t.find(a=>a.system!==!0&&a.id!=="fleet"&&a.id!=="workspace"&&a.id!=="global");return o?o.id:n.activeViewId}function qj(t,e,n=iT()){let r=t??n,s=new Map;for(let a of r.views)s.set(a.id,a);if(e)for(let a of e.views)s.set(a.id,a);let i=[...s.values()];if(e){let a=nc(e.activeViewId,n.activeViewId);return{activeViewId:Lg(i,a,n,{preferWorkspaceScopeFallback:!0}),views:i}}let o=nc(r.activeViewId,n.activeViewId);return{activeViewId:Lg(i,o,n,{preferWorkspaceScopeFallback:!1}),views:i}}});var Gg=T(rc=>{"use strict";Object.defineProperty(rc,"__esModule",{value:!0});rc.normalizeSpotlightViewId=Jj;rc.parseSpotlightYamlRecord=Xj;rc.dumpSpotlightYaml=zj;var Yj=oT();function Jj(t,e="view"){return(0,Yj.normalizeDashboardViewId)(t,e)}function Xj(t){let n=require("js-yaml").load(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function zj(t){return require("js-yaml").dump(t,{lineWidth:120,noRefs:!0})}});var xg=T(Er=>{"use strict";var Qj=Er&&Er.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Zj=Er&&Er.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ex=Er&&Er.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Qj(n,e,r[s]);return Zj(n,e),n}})();Object.defineProperty(Er,"__esModule",{value:!0});Er.resolveViewPublishVersionFromParsed=aT;Er.discoverPublishableViews=hx;Er.validateViewForPublish=mx;Er.collectViewFiles=_x;var Fs=require("fs"),Ut=ex(require("path")),tx=ot(),Hg=$g(),gs=dn(),nx=ba(),ea=Gg();function aT(t){if(t){if(typeof t.version=="string"&&t.version.trim()){let e=t.version.trim().replace(/^v/,"");if((0,Hg.isValidPublishVersion)(e))return e}if(typeof t.semver=="string"&&t.semver.trim()){let e=t.semver.trim().replace(/^v/,"");if((0,Hg.isValidPublishVersion)(e))return e}}}var cT=new Set(["global","workspace","fleet","workflows","default"]),lT="view.yaml",rx="panel-entry.yaml",sx=new Set(["charts","reports","exports","panel-state","assets","images"]),uT=["assets","images","charts","reports","exports"],jg="manifest.json",ix=new Set([".png",".jpg",".jpeg",".gif",".webp",".pdf",".ico",".woff",".woff2"]),ox=new Set([...sx,"node_modules",".git",".hg",".svn",".DS_Store","__pycache__",".turbo",".cache"]),dT=new Set([".DS_Store","Thumbs.db"]),ax=[["private key",/-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],["OpenAI-style key",/\bsk-(?!dummy\b|ant-)[A-Za-z0-9_-]{20,}\b/],["Anthropic key",/\bsk-ant-[A-Za-z0-9_-]{20,}\b/],["Google API key",/\bAIza[0-9A-Za-z_-]{30,}\b/],["GitHub token",/\bgh[pousr]_[A-Za-z0-9_]{20,}\b/],["Atlassian API token",/\bATATT[A-Za-z0-9_=+/\-]{20,}\b/],["AWS access key",/\bAKIA[0-9A-Z]{16}\b/],["JWT",/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/]],cx=1024*1024,lx=10*1024*1024;function fT(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Ut.basename(e.trim())):[]}function Ou(t){let e=new Set,n=[];for(let r of t){let s=Ut.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function ux(t){let e=[];return t?.trim()&&e.push({root:Ut.join(t.trim(),tx.AGENTIDE_DIR_NAME,"analytics"),label:"workspace"}),e.push({root:Ut.join((0,nx.getAgentideHome)(),"analytics"),label:"home"}),e}function dx(t){return Ut.join(t,"panel","views.yaml")}async function fx(t){try{let e=await Fs.promises.readFile(t,"utf-8"),n=(0,ea.parseSpotlightYamlRecord)(e),r=Array.isArray(n?.views)?n.views:[],s=[];for(let i of r){if(!i||typeof i!="object")continue;let o=i,a=(0,ea.normalizeSpotlightViewId)(typeof o.id=="string"?o.id:void 0);if(!a)continue;let c=o.scope==="workspace"?"workspace":"global",l=typeof o.name=="string"&&o.name.trim()?o.name.trim():a,u=Ou(fT(o.scripts)),f=o.system===!0;s.push({id:a,name:l,scope:c,scripts:u,system:f})}return s}catch{return[]}}async function pT(t){let e=Ut.join(t,lT);try{let n=await Fs.promises.readFile(e,"utf-8"),r=(0,ea.parseSpotlightYamlRecord)(n);if(!r)return;let s=(0,ea.normalizeSpotlightViewId)(typeof r.id=="string"?r.id:void 0);if(!s)return;let i=r.scope==="workspace"?"workspace":"global",o=typeof r.name=="string"&&r.name.trim()?r.name.trim():s;return{id:s,name:o,description:typeof r.description=="string"?r.description.trim():void 0,author:typeof r.author=="string"?r.author.trim():void 0,publishVersion:aT(r),scope:i,tags:Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):void 0,scripts:Ou(fT(r.scripts))}}catch{return}}async function px(t){let e=[];for(let n of t)for(let[r,s]of ax)s.test(n.content)&&e.push(`${n.rel}: possible ${r}`);return e}function gT(t,e){return!!(dT.has(t)||t.startsWith(".")&&t!=="."||e&&ox.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function hT(t,e){return!!(dT.has(t)||t.startsWith(".")||e&&(t==="node_modules"||t==="__pycache__")||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function mT(t){let e=Ut.extname(t).toLowerCase();return ix.has(e)}async function Ug(t,e){let n=await Fs.promises.readFile(t);return n.includes(0)||mT(e)?{path:e,content:n.toString("base64"),encoding:"base64"}:{path:e,content:n.toString("utf-8"),encoding:"utf-8"}}async function gx(t){let e=0;for(let n of uT){let r=Ut.join(t,n);if(!await(0,gs.pathExists)(r))continue;async function s(i){let o=await Fs.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(hT(a.name,a.isDirectory()))continue;let c=Ut.join(i,a.name);if(a.isDirectory()){await s(c);continue}e++}}await s(r)}return await(0,gs.pathExists)(Ut.join(t,jg))&&e++,e}async function _T(t,e){for(let r of uT){let s=Ut.join(t,r);await(0,gs.pathExists)(s)&&await Iu(s,r,hT,e)}let n=Ut.join(t,jg);if(await(0,gs.pathExists)(n)){let r=await Fs.promises.stat(n);await e(n,jg,r.size)}}async function Iu(t,e,n,r){let s=await Fs.promises.readdir(t,{withFileTypes:!0});for(let i of s){if(n(i.name,i.isDirectory()))continue;let o=Ut.join(t,i.name),a=e?`${e}/${i.name}`:i.name;if(i.isDirectory()){await Iu(o,a,n,r);continue}let c=await Fs.promises.stat(o);await r(o,a,c.size)}}async function hx(t){let e=new Map;for(let{root:n,label:r}of ux(t)){let s=dx(n);if(!await(0,gs.pathExists)(s))continue;let i=await fx(s);for(let o of i){if(o.system||cT.has(o.id)||e.has(o.id))continue;let a=Ut.join(n,"views",o.id),c=await pT(a),l=Ou(c?.scripts.length?c.scripts:o.scripts);e.set(o.id,{id:o.id,name:c?.name??o.name,scope:c?.scope??o.scope,scripts:l,viewRoot:a,viewsConfigPath:s,analyticsRoot:n,sourceLabel:r})}}return[...e.values()].sort((n,r)=>n.id.localeCompare(r.id))}async function mx(t,e){let n=e?.mode??"scripts-only",r=e?.expectedId,s=[],i=[];if(r&&r!==t.id&&s.push(`View id "${r}" does not match selected view "${t.id}"`),cT.has(t.id)&&s.push(`View id "${t.id}" is reserved for built-in Spotlight views`),!await(0,gs.pathExists)(t.viewRoot))return s.push(`View directory not found: ${t.viewRoot}`),{valid:!1,errors:s,warnings:i};let o=await pT(t.viewRoot),a=Ou(o?.scripts.length?o.scripts:t.scripts),c=n==="full"?await gx(t.viewRoot):0;o||i.push("Missing view.yaml; publish will generate manifest from panel config"),o?.description||i.push("Consider adding description to view.yaml for store discoverability"),(!o?.tags||o.tags.length===0)&&i.push("Consider adding tags to view.yaml for store discoverability"),n==="scripts-only"?a.length===0&&s.push("View has no scripts registered"):a.length===0&&c===0?s.push("Full bundle requires at least one script or content under assets/, images/, charts/, reports/, exports/, or manifest.json"):a.length===0&&i.push("Publishing generated artifacts only (no widget scripts)");let l=Ut.join(t.viewRoot,"scripts");for(let _ of a){let h=Ut.join(l,_);await(0,gs.pathExists)(h)||s.push(`Missing script file: scripts/${_}`)}let u=[],f=0;async function d(_,h,y){if(y===void 0&&(y=(await Fs.promises.stat(_)).size),y>cx){s.push(`File too large (>1MB): ${h}`);return}if(f+=y,f>lx){s.push("Total bundle size exceeds 10MB");return}if(mT(h))return;let E=await Fs.promises.readFile(_);u.push({rel:h,content:E.toString("utf-8")})}await(0,gs.pathExists)(l)&&await Iu(l,"scripts",gT,d),n==="full"&&await _T(t.viewRoot,d);let g=await px(u);g.length>0&&s.push(`Possible secrets found:
672
+ ${g.map(_=>` - ${_}`).join(`
673
+ `)}`);let p={id:t.id,name:o?.name??t.name,description:o?.description,author:o?.author,publishVersion:o?.publishVersion,scope:o?.scope??t.scope,tags:o?.tags,scripts:a,...n==="full"?{publishBundle:"full"}:{}};return{valid:s.length===0,errors:s,warnings:i,metadata:s.length===0?p:void 0}}async function _x(t,e,n,r="scripts-only"){if(!(0,Hg.isValidPublishVersion)(e.replace(/^v/,"")))throw new Error(`Invalid publish version: ${e}`);let s=[],i=Ut.join(t.viewRoot,"scripts"),a={version:e.replace(/^v/,""),id:t.id,name:n.name,scope:n.scope,scripts:n.scripts,...n.description?{description:n.description}:{},...n.author?{author:n.author}:{},...n.tags?.length?{tags:n.tags}:{},...r==="full"?{publishBundle:"full"}:{}};s.push({path:lT,content:(0,ea.dumpSpotlightYaml)(a),encoding:"utf-8"}),s.push({path:rx,content:(0,ea.dumpSpotlightYaml)({id:t.id,name:n.name,scope:n.scope,scripts:n.scripts}),encoding:"utf-8"});let c=Ut.join(t.viewRoot,"README.md");return await(0,gs.pathExists)(c)&&s.push(await Ug(c,"README.md")),await(0,gs.pathExists)(i)&&await Iu(i,"scripts",gT,async(l,u)=>{s.push(await Ug(l,u))}),r==="full"&&await _T(t.viewRoot,async(l,u)=>{s.push(await Ug(l,u))}),s}});var yT=T(yr=>{"use strict";var Ex=yr&&yr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),yx=yr&&yr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wx=yr&&yr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Ex(n,e,r[s]);return yx(n,e),n}})();Object.defineProperty(yr,"__esModule",{value:!0});yr.installSpotlightViewFromFiles=bx;yr.listInstalledSpotlightViews=vx;yr.setActiveSpotlightView=Ox;yr.isSpotlightViewInstalled=Ix;var Cn=require("fs"),Rt=wx(require("path")),Vg=ot(),Pu=dn(),Kg=ba(),Fg=xg(),Yt=Gg();function Bg(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Rt.basename(e.trim())):[]}function ET(t){let e=new Set,n=[];for(let r of t){let s=Rt.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function Sx(t,e){if(t==="workspace"){if(!e?.trim())throw new Error("Workspace-scoped views require an open workspace folder");return Rt.join(e.trim(),Vg.AGENTIDE_DIR_NAME,"analytics")}return Rt.join((0,Kg.getAgentideHome)(),"analytics")}function Ax(t){let e=new Map;for(let n of t){let r=Buffer.isBuffer(n.content)?n.content:Buffer.from(n.content,"utf-8");e.set(n.path.replace(/\\/g,"/"),r)}return e}async function Tx(t,e,n){await Cn.promises.mkdir(Rt.dirname(t),{recursive:!0});let r;try{let c=await Cn.promises.readFile(t,"utf-8");r=(0,Yt.parseSpotlightYamlRecord)(c)??{version:1,activeViewId:"global",views:[]}}catch{r={version:1,activeViewId:"global",views:[]}}let s=Array.isArray(r.views)?[...r.views]:[],i=(0,Yt.normalizeSpotlightViewId)(e.id),o=s.findIndex(c=>{if(!c||typeof c!="object")return!1;let l=c;return(0,Yt.normalizeSpotlightViewId)(typeof l.id=="string"?l.id:void 0)===i}),a={id:i,name:e.name,scope:e.scope,scripts:ET(e.scripts)};if(o>=0){if(!n)throw new Error(`Spotlight view "${i}" is already registered in ${t}`);s[o]=a}else s.push(a);r.views=s,typeof r.version!="number"&&(r.version=1),typeof r.activeViewId!="string"&&(r.activeViewId="global"),await Cn.promises.writeFile(t,(0,Yt.dumpSpotlightYaml)(r),"utf-8")}async function bx(t,e){let n=Ax(t),r=n.get("view.yaml"),s=n.get("panel-entry.yaml");if(!r||!s)throw new Error("Store bundle is missing view.yaml or panel-entry.yaml");let i=(0,Yt.parseSpotlightYamlRecord)(r.toString("utf-8")),o=(0,Yt.parseSpotlightYamlRecord)(s.toString("utf-8"));if(!i||!o)throw new Error("Invalid view.yaml or panel-entry.yaml in store bundle");let a=(0,Yt.normalizeSpotlightViewId)(typeof i.id=="string"?i.id:e.slug,e.slug);if(a!==(0,Yt.normalizeSpotlightViewId)(e.slug,e.slug))throw new Error(`Bundle id "${a}" does not match requested slug "${e.slug}"`);let c=i.scope==="workspace"||o.scope==="workspace"?"workspace":"global",l=typeof i.name=="string"&&i.name.trim()?i.name.trim():typeof o.name=="string"&&o.name.trim()?o.name.trim():a,u=ET(Bg(i.scripts).length?Bg(i.scripts):Bg(o.scripts)),f=Sx(c,e.workspaceRoot),d=Rt.join(f,"views",a),g=Rt.join(f,"panel","views.yaml"),p=Rt.join(d,"scripts");if(!e.overwrite&&await(0,Pu.pathExists)(d))throw new Error(`Spotlight view "${a}" already exists at ${d}`);e.overwrite&&await Cn.promises.rm(d,{recursive:!0,force:!0}),await Cn.promises.mkdir(p,{recursive:!0});let _=["scripts/","assets/","images/","charts/","reports/","exports/"],h=new Set(["manifest.json","README.md"]),y=new Set(["view.yaml","panel-entry.yaml"]);for(let[S,C]of n.entries()){if(y.has(S)||!h.has(S)&&!_.some(P=>S.startsWith(P)))continue;let b=Rt.resolve(d),I=Rt.resolve(b,S);if(!I.startsWith(b+Rt.sep))throw new Error(`Store bundle entry "${S}" escapes the install directory`);await Cn.promises.mkdir(Rt.dirname(I),{recursive:!0}),await Cn.promises.writeFile(I,C)}let E=new Date().toISOString(),w=(0,Fg.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0",A={version:w,id:a,name:l,description:typeof i.description=="string"?i.description:"",author:typeof i.author=="string"?i.author:void 0,scope:c,projectId:"",agentId:"",createdAt:E,updatedAt:E,scripts:u,storeVersion:w};if(Array.isArray(i.tags)&&(A.tags=i.tags.filter(S=>typeof S=="string")),await Cn.promises.writeFile(Rt.join(d,"view.yaml"),(0,Yt.dumpSpotlightYaml)(A),"utf-8"),await Tx(g,{id:a,name:l,scope:c,scripts:u},!!e.overwrite),e.activate){let S;try{let C=await Cn.promises.readFile(g,"utf-8");S=(0,Yt.parseSpotlightYamlRecord)(C)??{}}catch{S={version:1,views:[]}}S.activeViewId=a,typeof S.version!="number"&&(S.version=1),await Cn.promises.writeFile(g,(0,Yt.dumpSpotlightYaml)(S),"utf-8")}return e.logger&&(0,Pu.logInfo)(e.logger,`[Spotlight] Installed view "${a}" to ${d}`),{id:a,scope:c,installDir:d,viewsConfigPath:g,version:(0,Fg.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0"}}async function vx(t){let e=[],n=new Set;async function r(s){let i=Rt.join(s,"views");if(!await(0,Pu.pathExists)(i))return;let o=await Cn.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(!a.isDirectory()||a.name.startsWith("."))continue;let c=a.name.toLowerCase();if(n.has(c))continue;let l=Rt.join(i,a.name,"view.yaml");try{let u=await Cn.promises.readFile(l,"utf-8"),f=(0,Yt.parseSpotlightYamlRecord)(u);if(!f)continue;let d=(0,Yt.normalizeSpotlightViewId)(typeof f.id=="string"?f.id:a.name,a.name),g=f.scope==="workspace"?"workspace":"global";n.add(c),e.push({slug:d,displayName:typeof f.name=="string"&&f.name.trim()?f.name.trim():d,description:typeof f.description=="string"?f.description.trim():void 0,tags:Array.isArray(f.tags)?f.tags.filter(p=>typeof p=="string"):["spotlight"],latestVersion:typeof f.storeVersion=="string"?f.storeVersion:(0,Fg.resolveViewPublishVersionFromParsed)(f)??"local",scope:g})}catch{}}}return await r(Rt.join((0,Kg.getAgentideHome)(),"analytics")),t?.trim()&&await r(Rt.join(t.trim(),Vg.AGENTIDE_DIR_NAME,"analytics")),e.sort((s,i)=>s.slug.localeCompare(i.slug))}async function Ox(t,e){let n=(0,Yt.normalizeSpotlightViewId)(e,e),r;try{let s=await Cn.promises.readFile(t,"utf-8");r=(0,Yt.parseSpotlightYamlRecord)(s)??{version:1,views:[]}}catch{r={version:1,views:[]}}r.activeViewId=n,typeof r.version!="number"&&(r.version=1),await Cn.promises.writeFile(t,(0,Yt.dumpSpotlightYaml)(r),"utf-8")}async function Ix(t,e){let n=(0,Yt.normalizeSpotlightViewId)(t,t);for(let r of[Rt.join((0,Kg.getAgentideHome)(),"analytics","views",n,"view.yaml"),e?.trim()?Rt.join(e.trim(),Vg.AGENTIDE_DIR_NAME,"analytics","views",n,"view.yaml"):""].filter(Boolean))if(await(0,Pu.pathExists)(r))return!0;return!1}});var eh=T(Br=>{"use strict";var Px=Br&&Br.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Nx=Br&&Br.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Jg=Br&&Br.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Px(n,e,r[s]);return Nx(n,e),n}})();Object.defineProperty(Br,"__esModule",{value:!0});Br.storeCommand=Dx;Br.installFromStore=AT;Br.resolvePublishBundleMode=TT;var ta=Jg(require("fs/promises")),to=Jg(require("path")),wT=Jg(require("os")),Rx=require("zlib"),Nu=ot(),Cx=Ep(),ST=Sp(),pi=eu(),Xg=Uc(),sc=$g(),kx=Ap(),Wg=xg();function na(){let t=process.env.AGENTHIPPO_STORE_REPO,e=pi.DEFAULT_STORE_OWNER,n=pi.DEFAULT_STORE_REPO;if(t){let r=t.split("/");r.length===2&&(e=r[0],n=r[1])}return{owner:e,repo:n,defaultBranch:pi.DEFAULT_STORE_BRANCH,paths:pi.STORE_PATHS}}function $x(){if(process.env.AGENTHIPPO_STORE_URL)return process.env.AGENTHIPPO_STORE_URL;let t=na();return`https://${t.owner}.github.io/${t.repo}/store-index.json`}function zg(){return process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN}async function Qg(t,e={}){let n=zg(),r={"User-Agent":"AgentHippo-CLI",Accept:"application/vnd.github.v3+json",...e.headers||{}};return n&&(r.Authorization=`Bearer ${n}`),fetch(t,{...e,headers:r,redirect:"follow"})}var gi={appendLine:t=>{process.env.VERBOSE==="1"&&console.error(t)}};async function Dx(t){switch(t.verbose&&(process.env.VERBOSE="1"),t.action){case"search":await Lx(t);break;case"install":await AT(t);break;case"publish":await Mx(t);break;case"uninstall":case"remove":await Hx(t);break;case"info":await jx(t);break;case"list":await xx(t);break;default:console.error(`Error: Unknown action: ${t.action}`),console.log(""),console.log("Available actions:"),console.log(" search <query> Search for skills, packs, MCP servers, engines"),console.log(" install <ref> Install artifact (e.g., skill/pdf-tools@1.0.0)"),console.log(" publish <ref> Publish engine/<id> or view/<id>[@version]"),console.log(" uninstall <ref> Uninstall artifact (currently engine/<slug>)"),console.log(" info <ref> Show artifact details"),console.log(" list List all available artifacts"),console.log(""),console.log(" Override store repo (CLI): AGENTHIPPO_STORE_REPO=owner/repo"),process.exit(1)}}var wr=pi.STORE_ICONS;async function Lx(t){let e=t.query?.toLowerCase()||"",n=t.limit||20,r=t.type,s=await Zg(),i=new ST.LocalRegistry,o=new Set((await i.listPacks()).map(p=>p.slug)),a=await i.listSkills(),c=await i.listMcp(),l=await vT(),u=new Map(a.map(p=>[p.slug,p.installedTo||[]])),f=new Map(c.map(p=>[p.slug,p.installedTo||[]])),d=s.artifacts.filter(p=>r&&p.type!==r?!1:e?[p.slug,p.displayName,p.description,...p.tags||[]].join(" ").toLowerCase().includes(e):!0);d.sort((p,_)=>{let h=p.slug.toLowerCase()===e,y=_.slug.toLowerCase()===e;return h&&!y?-1:!h&&y?1:p.slug.localeCompare(_.slug)}),d=d.slice(0,n);let g=d.map(p=>{let _=!1,h;return p.type==="pack"?_=o.has(p.slug):p.type==="skill"?(h=u.get(p.slug),_=h!==void 0&&h.length>0):p.type==="mcp"?(h=f.get(p.slug),_=h!==void 0&&h.length>0):p.type==="engine"&&(_=l.has(p.slug)),{...p,isLocal:_,installedTo:h}});if(t.json){console.log(JSON.stringify(g,null,2));return}if(g.length===0){console.log(`No results found for "${e}"`);return}console.log(""),console.log(`Found ${g.length} result(s):`),console.log("");for(let p of g){let _=p.latestVersion?`v${p.latestVersion}`:"",h=p.isLocal?wr.local:wr.remote,y=p.isLocal?` ${wr.installed}`:"";if(console.log(` ${h} ${p.type}/${p.slug} ${_}${y}`),p.description){let E=p.description.length>60?p.description.slice(0,57)+"...":p.description;console.log(` ${E}`)}p.installedTo&&p.installedTo.length>0&&console.log(` Installed to: ${p.installedTo.join(", ")}`)}console.log(""),console.log(`Legend: ${wr.local} Local ${wr.remote} Remote ${wr.installed} Installed`),console.log(""),console.log("Install with:"),console.log(" agenthippo store install <type>/<slug>"),console.log("")}async function AT(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store install <type>/<slug>[@version]"),console.log(""),console.log("Examples:"),console.log(" agenthippo store install skill/pdf-tools"),console.log(" agenthippo store install pack/code-reviewer@1.0.0"),console.log(" agenthippo store install mcp/filesystem"),console.log(" agenthippo store install engine/gemini"),console.log(" agenthippo store install view/cost-ops@1.0.0"),process.exit(1));let e=Ru(t.query),{type:n,slug:r,version:s}=e,i=t.workspace||process.cwd();console.log(`Installing ${n}/${r}${s?`@${s}`:""}...`);let o=s||t.version;if(!o){let u=await Yg(n,r);u.length>0?(o=u.find(d=>!d.isPrerelease)?.version||u[0].version,console.log(` Using latest version: ${o}`)):(o="main",console.log(" No versions found, using main branch"))}if(n==="view"){console.log(" Downloading...");let u=await qg(n,r,o);u.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let{installSpotlightViewFromFiles:f}=await Promise.resolve().then(()=>$n(yT())),d=await f(u.map(g=>({path:g.path,content:g.content})),{slug:r,version:o,overwrite:!!t.force,workspaceRoot:i,logger:gi});console.log(""),console.log(`\u2713 Installed view/${d.id} to:`),console.log(` ${d.installDir}`),console.log(` Panel config: ${d.viewsConfigPath}`),console.log("");return}if(n==="engine"){console.log(" Downloading...");let u=await qg(n,r,o);u.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let f=await(0,Xg.installCustomEngineFromFiles)(u,{slug:r,version:o,overwrite:!!t.force,logger:gi});console.log(""),console.log(`\u2713 Installed engine/${f.id} to:`),console.log(` ${f.installDir}`),console.log("");return}let a=t.agent||"default",c;switch(n){case"skill":c=to.join(i,Nu.AGENTIDE_DIR_NAME,"agents",a,"skills",r);break;case"pack":c=t.installDir?to.resolve(t.installDir):to.join(wT.homedir(),Nu.AGENTIDE_DIR_NAME,"agents",r,o);break;case"mcp":c=to.join(i,Nu.AGENTIDE_DIR_NAME,"agents",a,"mcp",r);break}try{await ta.access(c),t.force||(console.error(`Error: ${n}/${r} already exists at ${c}`),console.log("Use --force to overwrite."),process.exit(1)),console.log(" Removing existing installation..."),await ta.rm(c,{recursive:!0,force:!0})}catch{}console.log(" Downloading...");let l=await qg(n,r,o);l.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1)),console.log(` Extracting ${l.length} files...`),await ta.mkdir(c,{recursive:!0});for(let u of l){let f=(0,Cx.safeJoin)(c,u.path);f||(console.error(`Error: refusing install \u2014 artifact path escapes destination (${u.path})`),process.exit(1)),await ta.mkdir(to.dirname(f),{recursive:!0}),await ta.writeFile(f,u.content)}if(n==="pack"&&!t.installDir){let u=to.join(wT.homedir(),Nu.AGENTIDE_DIR_NAME,"agents",r);await ta.writeFile(to.join(u,"current.txt"),o)}console.log(""),console.log(`\u2713 Installed ${n}/${r} to:`),console.log(` ${c}`),console.log("")}function TT(t){if(t.full&&t.bundle&&t.bundle.trim().toLowerCase()!=="full"&&(console.error("Error: Cannot combine --full with --bundle scripts-only"),process.exit(1)),t.full)return"full";if(t.bundle){let e=t.bundle.trim().toLowerCase();if(e==="full"||e==="scripts-only")return e;console.error("Error: Invalid --bundle value. Use scripts-only or full."),process.exit(1)}return"scripts-only"}async function Mx(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store publish <engine|view>/<slug>[@version]"),console.log(""),console.log("Examples:"),console.log(" agenthippo store publish engine/rovo"),console.log(" agenthippo store publish engine/rovo@1.0.0"),console.log(" agenthippo store publish view/cost-ops@1.0.0"),console.log(" agenthippo store publish view/brand-board --bundle full"),console.log(" agenthippo store publish view/brand-board --full"),console.log(""),console.log("Requires GITHUB_TOKEN (or GH_TOKEN / AGENTHIPPO_GITHUB_TOKEN) with fork + PR access."),console.log("Override store repo (CLI): AGENTHIPPO_STORE_REPO=owner/repo"),process.exit(1));let e=Ru(t.query),{type:n,slug:r,version:s}=e;if(n!=="engine"&&n!=="view"&&(console.error(`Error: store publish supports engine and view only, got ${n}/${r}`),console.log("Use: agenthippo store publish engine/<id>[@version]"),console.log(" agenthippo store publish view/<id>[@version] [--bundle full|scripts-only]"),process.exit(1)),zg()||(console.error("Error: GitHub token required to publish."),console.log("Set GITHUB_TOKEN, GH_TOKEN, or AGENTHIPPO_GITHUB_TOKEN, then retry."),process.exit(1)),n==="engine"){await Gx(t,r,s);return}await Ux(t,r,s)}async function Gx(t,e,n){let r=t.workspace||process.cwd(),s=await(0,sc.resolveEngineSourceDir)(e,r);s||(console.error(`Error: Engine "${e}" not found under .agent-hippo/engines/ (workspace or home).`),process.exit(1)),console.log(`Publishing engine/${e} from ${s}...`);let i=await(0,sc.validateEngineForPublish)(s,e);if(!i.valid){console.error(`Error: Cannot publish engine/${e}`);for(let l of i.errors)console.error(` - ${l}`);process.exit(1)}for(let l of i.warnings)console.log(` Warning: ${l}`);let o=n||t.version||i.metadata?.suggestedVersion;o||(console.error("Error: Publish version required."),console.log("Pass a version: agenthippo store publish engine/<slug>@1.0.0"),console.log("Or add a semver version field to package.json in the engine folder."),process.exit(1)),o=o.replace(/^v/,""),(0,sc.isValidPublishVersion)(o)||(console.error(`Error: Invalid version "${o}". Use semver (e.g., 1.0.0).`),process.exit(1));let a=await(0,sc.collectEngineFiles)(s),c=na();console.log(` Target store: ${c.owner}/${c.repo}`),console.log(` Version tag: engines/${e}/v${o}`),console.log(` Files: ${a.length}`),await bT({options:t,type:"engine",slug:e,version:o,files:a,installHint:`agenthippo store install engine/${e}`})}async function Ux(t,e,n){let r=t.workspace||process.cwd(),s=TT(t),i=await(0,Wg.discoverPublishableViews)(r),o=i.find(d=>d.id===e);if(!o){if(console.error(`Error: Spotlight view "${e}" not found.`),console.log("Register a user view in .agent-hippo/analytics/panel/views.yaml (non-system id)."),i.length>0){console.log(""),console.log("Publishable views:");for(let d of i)console.log(` - view/${d.id} (${d.sourceLabel}, ${d.scope})`)}process.exit(1)}console.log(`Publishing view/${e} from ${o.viewRoot}...`),console.log(` Bundle: ${s==="full"?"full (scripts + assets + charts/reports/exports + manifest.json)":"scripts only"}`);let a=await(0,Wg.validateViewForPublish)(o,{expectedId:e,mode:s});if(!a.valid){console.error(`Error: Cannot publish view/${e}`);for(let d of a.errors)console.error(` - ${d}`);process.exit(1)}for(let d of a.warnings)console.log(` Warning: ${d}`);a.metadata||(console.error("Error: Validation succeeded but metadata is missing."),process.exit(1));let c=n||t.version||a.metadata.publishVersion;c||(console.error("Error: Publish version required."),console.log("Pass a version: agenthippo store publish view/<slug>@1.0.0"),console.log("Or add version to view.yaml (e.g. version: 1.0.0)."),process.exit(1)),c=c.replace(/^v/,""),(0,sc.isValidPublishVersion)(c)||(console.error(`Error: Invalid version "${c}". Use semver (e.g., 1.0.0).`),process.exit(1));let l=await(0,Wg.collectViewFiles)(o,c,a.metadata,s),u=na(),f=l.filter(d=>d.encoding==="base64").length;console.log(` Target store: ${u.owner}/${u.repo}`),console.log(` Version tag: spotlight/${e}/v${c}`),console.log(` Files: ${l.length}${f>0?` (${f} binary)`:""}`),await bT({options:t,type:"view",slug:e,version:c,files:l,bundle:s,installHint:`agenthippo store install view/${e}`})}async function bT(t){let{options:e,type:n,slug:r,version:s,files:i,bundle:o,installHint:a}=t;try{let c=await(0,kx.publishToStore)({type:n,slug:r,version:s,files:i},gi);e.json?console.log(JSON.stringify({success:!0,type:n,slug:r,version:s,bundle:o,prUrl:c.prUrl,prNumber:c.prNumber,tagName:c.tagName},null,2)):(console.log(""),console.log(`\u2713 Opened pull request for ${n}/${r} v${s}${o==="full"?" (full bundle)":""}`),console.log(` ${c.prUrl}`),console.log(""),console.log(`After merge, install with: ${a}`))}catch(c){let l=c instanceof Error?c.message:String(c);e.json?console.log(JSON.stringify({success:!1,error:l})):console.error(`Error: ${l}`),process.exit(1)}}async function Hx(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store uninstall engine/<slug>"),console.log(""),console.log("Examples:"),console.log(" agenthippo store uninstall engine/gemini"),process.exit(1));let{type:e,slug:n}=Ru(t.query);e!=="engine"&&(console.error(`Error: store uninstall currently supports custom engines only, got ${e}/${n}`),process.exit(1));let r=await(0,Xg.uninstallCustomEngine)(n,{logger:gi});r.removed||(console.error(`Error: engine/${r.id} is not installed.`),process.exit(1)),console.log(""),console.log(`\u2713 Uninstalled engine/${r.id} from:`),console.log(` ${r.installDir}`),console.log("")}async function jx(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store info <type>/<slug>"),process.exit(1));let e=Ru(t.query),r=(await Zg()).artifacts.find(i=>i.type===e.type&&i.slug===e.slug);if(r||(console.error(`Error: ${e.type}/${e.slug} not found in store.`),process.exit(1)),t.json){let i=await Yg(e.type,e.slug);console.log(JSON.stringify({...r,versions:i},null,2));return}console.log(""),console.log("\u2500".repeat(60)),console.log(`${r.type}/${r.slug}`),console.log("\u2500".repeat(60)),console.log(`Name: ${r.displayName}`),console.log(`Type: ${r.type}`),console.log(`Version: ${r.latestVersion||"N/A"}`),r.author&&console.log(`Author: ${r.author}`),r.description&&console.log(`Description: ${r.description}`),r.tags?.length&&console.log(`Tags: ${r.tags.join(", ")}`);let s=await Yg(e.type,e.slug);if(s.length>0){console.log(""),console.log("Available versions:");for(let i of s.slice(0,10)){let o=i.isPrerelease?" (pre-release)":"";console.log(` - ${i.version}${o}`)}s.length>10&&console.log(` ... and ${s.length-10} more`)}console.log("\u2500".repeat(60)),console.log(""),console.log("Install with:"),console.log(` agenthippo store install ${r.type}/${r.slug}`),console.log("")}async function xx(t){let e=await Zg(),n=t.type,r=new ST.LocalRegistry,s=new Set((await r.listPacks()).map(g=>g.slug)),i=await r.listSkills(),o=await r.listMcp(),a=await vT(),c=new Map(i.map(g=>[g.slug,g.installedTo||[]])),l=new Map(o.map(g=>[g.slug,g.installedTo||[]])),u=e.artifacts;n&&(u=u.filter(g=>g.type===n));let f=g=>{if(g.type==="pack")return s.has(g.slug);if(g.type==="skill"){let p=c.get(g.slug);return p!==void 0&&p.length>0}if(g.type==="mcp"){let p=l.get(g.slug);return p!==void 0&&p.length>0}return g.type==="engine"?a.has(g.slug):!1};if(t.json){let g=u.map(p=>({...p,isLocal:f(p),installedTo:p.type==="skill"?c.get(p.slug):p.type==="mcp"?l.get(p.slug):void 0}));console.log(JSON.stringify(g,null,2));return}console.log(""),console.log(`Store contains ${u.length} artifact(s):`),console.log("");let d={};for(let g of u)d[g.type]=d[g.type]||[],d[g.type].push(g);for(let g of["pack","skill","mcp","engine"]){let p=d[g]||[];if(p.length!==0){console.log(`${g}s (${p.length}):`);for(let _ of p){let h=_.latestVersion?` v${_.latestVersion}`:"",y=f(_),E=y?wr.local:wr.remote,w=y?` ${wr.installed}`:"";console.log(` ${E} ${_.slug}${h}${w}`)}console.log("")}}console.log(`Legend: ${wr.local} Local ${wr.remote} Remote ${wr.installed} Installed`),console.log("")}function Ru(t){try{return(0,pi.parseStoreUrl)(t)}catch(e){let n=e instanceof Error?e.message:String(e);console.error(`Error: ${n}`),console.log("Expected format: <type>/<slug>[@version]"),console.log("Examples: skill/pdf-tools, pack/code-reviewer@1.0.0, engine/gemini, view/cost-ops"),process.exit(1)}}async function vT(){return new Set((await(0,Xg.listInstalledCustomEngines)()).map(t=>t.id))}async function Zg(){let t=$x();gi.appendLine(`[Store] Fetching index from ${t}`);let e=await fetch(t,{headers:{"User-Agent":"AgentHippo-CLI",Accept:"application/json"}});if(e.ok)return await e.json();if(zg()&&(e.status===403||e.status===404)){gi.appendLine("[Store] GitHub Pages not available, trying API with auth...");let r=na(),s=`https://api.github.com/repos/${r.owner}/${r.repo}/contents/dist/store-index.json`;if(e=await Qg(s,{headers:{Accept:"application/vnd.github.raw+json"}}),e.ok)return await e.json()}throw new Error(`Failed to fetch store index: ${e.status} ${e.statusText}`)}async function Yg(t,e){let n=na(),s=`${(0,pi.getStorePath)(t)}/${e}/v`,i=`https://api.github.com/repos/${n.owner}/${n.repo}/git/refs/tags`;gi.appendLine(`[Store] Listing versions for ${t}/${e}`);let o=await Qg(i);if(!o.ok){if(o.status===404)return[];throw new Error(`Failed to list versions: ${o.statusText}`)}let a=await o.json(),c=[];for(let{ref:l}of a){let u=l.replace("refs/tags/","");if(u.startsWith(s)){let f=u.slice(s.length-1);c.push({version:f.replace(/^v/,""),tagName:u,isPrerelease:/-(alpha|beta|rc|pre)/.test(f)})}}return c.sort((l,u)=>u.version.localeCompare(l.version,void 0,{numeric:!0}))}async function qg(t,e,n){let r=na(),s=(0,pi.getStorePath)(t),i;n==="main"||n==="latest"?i=r.defaultBranch:i=`${s}/${e}/v${n.replace(/^v/,"")}`,gi.appendLine(`[Store] Downloading ${t}/${e} at ${i}`);let o=encodeURIComponent(i),a=`https://api.github.com/repos/${r.owner}/${r.repo}/tarball/${o}`,c=await Qg(a);if(!c.ok)throw new Error(`Failed to download: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer()),u=(0,Rx.gunzipSync)(l),f=Bx(u),d=`${s}/${e}/`,g=[];for(let[p,_]of f){let h=p.indexOf("/");if(h===-1)continue;let y=p.slice(h+1);if(y.startsWith(d)){let E=y.slice(d.length);E&&g.push({path:E,content:_})}}return g}function Bx(t){let e=new Map,n=0;for(;n<t.length-512;){let r=t.subarray(n,n+512);if(r.every(c=>c===0))break;let s=r.subarray(0,100).toString("utf-8").replace(/\0/g,"").trim(),i=r.subarray(124,136).toString("utf-8").replace(/\0/g,"").trim(),o=r[156];if(!s){n+=512;continue}let a=parseInt(i,8)||0;n+=512,(o===0||o===48)&&e.set(s,Buffer.from(t.subarray(n,n+a))),n+=Math.ceil(a/512)*512}return e}});var OT=T(th=>{"use strict";Object.defineProperty(th,"__esModule",{value:!0});th.parsePackInstallRef=Fx;function Fx(t){let e=t.trim(),n=e.lastIndexOf("@");return n>0?{slug:e.slice(0,n),version:e.slice(n+1)||void 0}:{slug:e}}});var PT=T(Vs=>{"use strict";var Vx=Vs&&Vs.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Kx=Vs&&Vs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),IT=Vs&&Vs.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Vx(n,e,r[s]);return Kx(n,e),n}})();Object.defineProperty(Vs,"__esModule",{value:!0});Vs.packCommand=Jx;var ra=IT(require("fs")),ku=IT(require("path")),sa=ji(),Cu=ot(),Wx=si(),Sr=Ho(),qx=eh(),Yx=OT(),nh="-".repeat(62);async function Jx(t){let e=t.workspace;switch(t.action){case"list":await zx(e);break;case"validate":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack validate <name>"),process.exit(1)),await Qx(t.name,e);break;case"info":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack info <name>"),process.exit(1)),await Zx(t.name,e);break;case"sign":await t1(t);break;case"verify":await n1(t);break;case"digest":await r1(t);break;case"keygen":e1(t);break;case"install":await Xx(t);break;case"export":console.log("Pack export is not yet implemented.");break;default:console.error(`Error: Unknown action: ${t.action}`),console.log(""),console.log("Available actions:"),console.log(" list List installed packs"),console.log(" validate Validate a pack"),console.log(" info Show pack details"),console.log(" sign Sign a pack so a fleet can verify it before running"),console.log(" verify Verify a pack against trusted public keys"),console.log(" digest Print the pack content digest (what a signature covers)"),console.log(" keygen Generate an ES256 signing keypair"),console.log(" install Install a pack from the store to a folder"),console.log(" export Export a pack (coming soon)"),process.exit(1)}}async function Xx(t){t.name?.trim()||(console.error("Error: pack slug required."),console.log("Usage: agenthippo pack install <slug>[@version] --to <dir>"),console.log(""),console.log("Examples:"),console.log(" agenthippo pack install joker1 --to ./packs/joker1"),console.log(" agenthippo pack install code-reviewer@1.0.0 --to ./packs/code-reviewer"),process.exit(1));let e=t.to?.trim();e||(console.error("Error: --to <dir> is required."),console.log("Usage: agenthippo pack install <slug>[@version] --to <dir>"),console.log(""),console.log("Same download as `agenthippo store install pack/<slug>`, extracted flat for serve/deploy."),process.exit(1));let{slug:n,version:r}=(0,Yx.parsePackInstallRef)(t.name);await(0,qx.installFromStore)({action:"install",query:`pack/${n}${r?`@${r}`:""}`,workspace:t.workspace,version:r,force:t.force,installDir:ku.resolve(e),verbose:t.verbose})}async function zx(t){let e=(0,sa.listAvailablePacks)(t);if(e.length===0){console.log("No agent packs found."),console.log(""),console.log("Agent packs are stored in:"),t&&console.log(` Workspace: ${t}/${Cu.AGENTIDE_DIR_NAME}/agents/`),console.log(` User library: ~/${Cu.AGENTIDE_DIR_NAME}/agents/`),console.log(""),console.log("Create a pack with:"),console.log(` mkdir -p ~/${Cu.AGENTIDE_DIR_NAME}/agents/my-agent/1.0.0`),console.log(` echo "1.0.0" > ~/${Cu.AGENTIDE_DIR_NAME}/agents/my-agent/current.txt`),console.log(" # Add agent.yaml and AGENTS.md");return}console.log(""),console.log("Installed Agent Packs:"),console.log("");for(let n of e){let r=n.version?` (v${n.version})`:"",s=n.source==="workspace"?" [workspace]":"";console.log(` ${n.name}${r}${s}`),console.log(` ${n.path}`)}console.log("")}async function Qx(t,e){console.log(`Validating pack: ${t}`),console.log("");let n=(0,sa.resolvePackPath)(t,e);n||(console.error(`Error: Pack not found: ${t}`),process.exit(1));let r=[],s=[],i=ku.join(n,"agent.yaml");ra.existsSync(i)?console.log(" OK: agent.yaml exists"):r.push("Missing agent.yaml");try{let o=await(0,sa.loadAgentPack)(t,e);console.log(` OK: metadata.name: ${o.manifest.metadata.name}`),console.log(` OK: metadata.version: ${o.manifest.metadata.version}`),console.log(` OK: spec.engine: ${o.manifest.spec.engine}`),o.manifest.spec.model?console.log(` OK: spec.model: ${o.manifest.spec.model}`):s.push("spec.model not specified, will use default"),o.manifest.spec.cheapModel&&console.log(` OK: spec.cheapModel: ${o.manifest.spec.cheapModel}`),o.manifest.spec.effort&&console.log(` OK: spec.effort: ${o.manifest.spec.effort}`);let a=ku.join(n,"AGENTS.md");if(ra.existsSync(a)){let c=ra.statSync(a);console.log(` OK: AGENTS.md exists (${(c.size/1024).toFixed(1)} KB)`)}else s.push("No AGENTS.md found")}catch(o){r.push(o instanceof Error?o.message:String(o))}if(console.log(""),s.length>0)for(let o of s)console.log(` Warning: ${o}`);if(r.length>0){for(let o of r)console.log(` Error: ${o}`);console.log(""),console.log("Pack is INVALID"),process.exit(1)}console.log(""),console.log("Pack is valid.")}async function Zx(t,e){try{let n=await(0,sa.loadAgentPack)(t,e);if(console.log(""),console.log(nh),console.log(`Agent: ${n.manifest.metadata.name}`),console.log(nh),console.log(`Version: ${n.manifest.metadata.version}`),n.manifest.metadata.description&&console.log(`Description: ${n.manifest.metadata.description}`),n.manifest.metadata.author&&console.log(`Author: ${n.manifest.metadata.author}`),console.log(`Engine: ${n.manifest.spec.engine}`),n.manifest.spec.model&&console.log(`Model: ${n.manifest.spec.model}`),n.manifest.spec.cheapModel&&console.log(`Cheap Model: ${n.manifest.spec.cheapModel}`),n.manifest.spec.effort&&console.log(`Effort: ${n.manifest.spec.effort}`),console.log(`Path: ${n.packPath}`),n.manifest.spec.permissions&&(console.log(""),console.log("Permissions:"),console.log(` File Access: ${n.manifest.spec.permissions.fileAccess||"default"}`)),n.manifest.spec.mcpServers&&n.manifest.spec.mcpServers.length>0){console.log(""),console.log("MCP Servers:");for(let r of n.manifest.spec.mcpServers)console.log(` - ${r.name}`)}console.log(nh),console.log("")}catch(n){console.error(`Error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function rh(t,e){t||(console.error("Error: pack name or path required"),process.exit(1));let n=(0,sa.resolvePackPath)(t,e);n||(console.error(`Error: pack not found: ${t}`),process.exit(1));let r=await(0,sa.loadAgentPack)(n,e);return{packPath:r.packPath,name:r.manifest.metadata.name,version:r.manifest.metadata.version??"0.0.0"}}function e1(t){let e=t.kid||`sign-${new Date().toISOString().slice(0,10)}`,n=(0,Wx.generateWarrantKeypair)(e),r=t.output;r?(ra.writeFileSync(r,n.privateKeyPem,{mode:384}),console.log(`Private key written to ${r} (mode 0600) \u2014 keep it off shared disks.`)):console.log(n.privateKeyPem),console.log(""),console.log(`kid: ${e}`),console.log("Public half \u2014 publish this to the control plane so instances can verify:"),console.log(n.publicKeyPem.trim()),console.log(""),console.log(` curl -X POST "$CONTROL/api/keys" -H 'content-type: application/json' \\`),console.log(` -d '{"kid":"${e}","publicPem":"\u2026"}'`)}async function t1(t){let{packPath:e,name:n,version:r}=await rh(t.name,t.workspace);t.key||(console.error("Error: --key <private-key.pem> required. Generate one with: agenthippo pack keygen -o key.pem"),process.exit(1));let s;try{s=ra.readFileSync(t.key,"utf8")}catch(a){console.error(`Error: cannot read key ${t.key}: ${a instanceof Error?a.message:a}`),process.exit(1);return}let i=t.kid;i||(console.error("Error: --kid <id> required \u2014 it is how a verifier finds the public half in JWKS."),process.exit(1));let{digest:o}=(0,Sr.signPack)({packDir:e,pack:n,packVersion:r,privateKeyPem:s,kid:i});console.log(`Signed ${n}@${r}`),console.log(` digest ${o}`),console.log(` key ${i}`),console.log(` written ${ku.join(e,Sr.PACK_SIGNATURE_FILE)}`),console.log(""),console.log("Commit pack.sig with the pack: it travels WITH the artifact, and a fleet that"),console.log("requires signatures refuses anything whose contents no longer match it.")}async function n1(t){let{packPath:e,name:n,version:r}=await rh(t.name,t.workspace),s=(0,Sr.readPackSignature)(e);s||(console.error(`UNSIGNED: no ${Sr.PACK_SIGNATURE_FILE} at ${e}`),console.error((0,Sr.describePackRefusal)({kind:"unsigned",detail:`no ${Sr.PACK_SIGNATURE_FILE}`,pack:n,packVersion:r,packDir:e})),process.exit(1));let i={};if(t.keys)try{i=JSON.parse(ra.readFileSync(t.keys,"utf8"))}catch(a){console.error(`Error: cannot read keys ${t.keys}: ${a instanceof Error?a.message:a}`),process.exit(1)}else{let a=await(0,Sr.loadPackTrustRoot)({env:t.jwks?{...process.env,[Sr.PACK_JWKS_URL_ENV]:t.jwks}:process.env,leaseUrl:process.env.AGENTHIPPO_LEASE_URL});for(let c of a.warnings)console.error(`Warning: ${c}`);a.status==="unavailable"&&(console.error(`REFUSED: a trust root is configured but could not be loaded \u2014 ${a.reason}`),console.error((0,Sr.describePackRefusal)({kind:"trust-root-unavailable",detail:a.reason??"unavailable",pack:n,packVersion:r,packDir:e,trustRootHint:a.url?`Trust root: ${a.url}`:void 0})),process.exit(1)),i=a.keys}Object.keys(i).length===0&&(console.error("REFUSED: no trusted public keys. Pass --keys <file>, --jwks <url>, or set AGENTHIPPO_PACK_SIGNING_KEYS."),process.exit(1));let o=(0,Sr.verifyPack)(s,i,{packDir:e,pack:n,packVersion:r});o.ok||(console.error(`INVALID: ${o.reason}`),console.error((0,Sr.describePackRefusal)({kind:o.kind,detail:o.reason,pack:n,packVersion:r,packDir:e})),process.exit(1)),console.log(`OK: ${n}@${r} verified`),console.log(` digest ${o.claims.digest}`),console.log(" NOTE: .claude/, .codex/ and .agent-hippo/ ARE covered by this digest \u2014 they carry hooks"),console.log(" and other executable content, and were previously outside the signature.")}async function r1(t){let{packPath:e,name:n,version:r}=await rh(t.name,t.workspace);console.log(`${(0,Sr.computePackDigest)(e)} ${n}@${r}`)}});var RT=T(ic=>{"use strict";Object.defineProperty(ic,"__esModule",{value:!0});ic.parseStrictJsonConfig=NT;ic.collectMissingChannelEnvSecrets=i1;ic.disableChannelsInConfigText=o1;var s1=8;function no(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function NT(t){try{return JSON.parse(t)}catch{return}}function sh(t,e,n){if(!(n>s1)){if(Array.isArray(t)){for(let r of t)sh(r,e,n+1);return}if(no(t)){if(t.source==="env"&&typeof t.id=="string"&&t.id.trim()){e.add(t.id.trim());return}for(let r of Object.values(t))sh(r,e,n+1)}}}function i1(t,e){if(!no(t)||!no(t.channels))return[];let n=[];for(let[r,s]of Object.entries(t.channels)){if(!no(s)||s.enabled===!1)continue;let i=new Set;sh(s,i,0);let o=[...i].filter(a=>!e[a]?.trim()).sort();o.length&&n.push({channel:r,envVars:o})}return n}function o1(t,e){let n=NT(t);if(!(!no(n)||!no(n.channels))){for(let r of e){let s=n.channels[r];no(s)&&(s.enabled=!1)}return`${JSON.stringify(n,null,2)}
674
674
  `}}});var kT=T($u=>{"use strict";Object.defineProperty($u,"__esModule",{value:!0});$u.quoteWindowsCommandLineArg=CT;$u.buildWindowsArgumentLine=a1;function CT(t){return t.length===0?'""':/[ \t"]/u.test(t)?`"${t.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\+)$/g,"$1$1")}"`:t}function a1(t){return t.map(e=>CT(e)).join(" ")}});var $T=T(ih=>{"use strict";Object.defineProperty(ih,"__esModule",{value:!0});ih.isGatewayScopeAuthError=c1;function c1(t){let e=t.toLowerCase();return e.includes("missing scope")||e.includes("operator.admin")}});var DT=T(Ar=>{"use strict";Object.defineProperty(Ar,"__esModule",{value:!0});Ar.ANYWHERE_INSTALL_SOURCE_FORMS=Ar.ANYWHERE_CONFIG_TEMPLATE_ENV=Ar.ANYWHERE_SETUP_SCRIPT_ENV=Ar.ANYWHERE_INSTALL_SOURCE_ENV=void 0;Ar.validateAnywhereInstallSource=g1;Ar.ANYWHERE_INSTALL_SOURCE_ENV="AH_INSTALL_SOURCE";Ar.ANYWHERE_SETUP_SCRIPT_ENV="AH_SETUP_SCRIPT";Ar.ANYWHERE_CONFIG_TEMPLATE_ENV="AH_CONFIG_TEMPLATE";var l1=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:@[a-zA-Z0-9^~*><=][a-zA-Z0-9.^~*+><=|_-]*)?$/,u1=/^github:[A-Za-z0-9][A-Za-z0-9._-]*\/[A-Za-z0-9][A-Za-z0-9._-]*(?:#[A-Za-z0-9._/-]+)?$/,d1=/^https:\/\/[A-Za-z0-9._-]+(?::\d+)?\/[A-Za-z0-9._~!$'()*+,;=:@%/-]*\.(?:tgz|tar\.gz)$/,f1=/^(?:\.{1,2})?\/[^\0<>"'`;|&$\n\r]*$/,p1=/^[A-Za-z]:[\\/][^\0<>"'`;|&$\n\r]*$/;Ar.ANYWHERE_INSTALL_SOURCE_FORMS="accepted forms are: an npm specifier (e.g. @agenthippo-ai/hippoclaw@2026.7.28), github:owner/repo[#ref], an https:// .tgz/.tar.gz URL, or a local path";function g1(t){let e=r=>({ok:!1,reason:`${r} \u2014 ${Ar.ANYWHERE_INSTALL_SOURCE_FORMS}`}),n=t.trim();return n?n!==t?e("it has leading or trailing whitespace"):l1.test(n)||u1.test(n)||d1.test(n)||f1.test(n)||p1.test(n)?{ok:!0}:e("it is not one of the accepted forms"):e("it is empty")}});var eb=T(U=>{"use strict";var h1=U&&U.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),m1=U&&U.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Bu=U&&U.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&h1(n,e,r[s]);return m1(n,e),n}})();Object.defineProperty(U,"__esModule",{value:!0});U.GatewayLifecycleManager=U.validateAnywhereInstallSource=U.ANYWHERE_SETUP_SCRIPT_ENV=U.ANYWHERE_INSTALL_SOURCE_ENV=U.ANYWHERE_CONFIG_TEMPLATE_ENV=U.AGENT_ANYWHERE_LABEL=void 0;U.detectGateway=Gu;var $=Bu(require("vscode")),Uu=require("child_process"),oh=require("crypto"),FT=require("util"),B=Bu(require("fs")),z=Bu(require("path")),_s=Bu(require("os")),De=ba(),ah=yc(),ch=RT(),_1=kT(),E1=$T(),lh=eg(),uh=ot(),Jt=(0,FT.promisify)(Uu.exec),y1=(0,FT.promisify)(Uu.execFile),_e=process.platform==="win32",VT=process.platform==="darwin";function LT(t,e){if(e)for(let n of e.split(z.delimiter)){let r=n.trim();r.length>0&&t.add(r)}}function w1(){let t=new Set,e=_s.homedir();LT(t,"/usr/bin:/bin:/usr/sbin:/sbin"),LT(t,process.env.PATH);let n=[z.join(e,".local","bin"),z.join(e,"Library","pnpm"),z.join(e,".local","share","pnpm"),z.join(e,".npm-global","bin"),z.join(e,".volta","bin"),z.join(e,".fnm"),z.join(e,".asdf","shims"),"/opt/homebrew/bin","/usr/local/bin"];for(let i of n)B.existsSync(i)&&t.add(i);let r=process.env.NVM_DIR||z.join(e,".nvm"),s=z.join(r,"versions","node");if(B.existsSync(s))try{let i=B.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort().reverse().slice(0,8);for(let o of i){let a=z.join(s,o,"bin");B.existsSync(a)&&t.add(a)}}catch{}return Array.from(t).join(z.delimiter)}function Du(){return VT&&B.existsSync("/bin/zsh")?"/bin/zsh":"/bin/bash"}function Lu(t){return VT?["-lic",t]:["-lc",t]}function dh(){if(!_e)return{...process.env,PATH:w1(),npm_config_script_shell:"/bin/sh"}}U.AGENT_ANYWHERE_LABEL="Agent Anywhere";var ia=`${U.AGENT_ANYWHERE_LABEL} Setup`,ro=`${U.AGENT_ANYWHERE_LABEL} Uninstall`,so=18789,fh=z.join(_s.homedir(),".openclaw","gateway.log"),MT="Open Gateway Log";function S1(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}function A1(t){try{if(!B.existsSync(t))return;let n=B.readFileSync(t,"utf8").split(/\r?\n/).filter(r=>r.trim());for(let r=n.length-1;r>=Math.max(0,n.length-50);r--){let s=S1(n[r]).trim();if(!s||/Doctor warnings|force: no listeners/i.test(s))continue;let i=s.match(/Gateway failed to start:\s*(.+)/i);if(i?.[1])return i[1].trim().slice(0,160);if(/SecretRefResolutionError|is missing or empty|required secrets are unavailable/i.test(s))return s.replace(/^\d{4}-\d{2}-\d{2}T[\d:.+-]+\s*/,"").slice(0,160);if(/errorCode=|errorMessage=/i.test(s))return s.slice(0,160)}}catch{}}async function oc(t){let e=A1(t),n=e?`${U.AGENT_ANYWHERE_LABEL}: Gateway failed to start. ${e}`:`${U.AGENT_ANYWHERE_LABEL}: Gateway failed to start.`;if(await $.window.showErrorMessage(n,MT)===MT)try{let s=await $.workspace.openTextDocument($.Uri.file(t));await $.window.showTextDocument(s,{preview:!1})}catch(s){let i=s instanceof Error?s.message:String(s);$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not open gateway log (${i}). Path: ${t}`)}}var T1=3e4,b1=_e?75e3:2e4,v1=3e4,Fu=De.PID_FILES.gateway(),hs="hippoclaw",Ah=["@agenthippo-ai/hippoclaw","openclaw"],Th=z.join(_s.homedir(),".agenthippo","gateway"),Hu=z.join(Th,"install.json"),hh=z.join(Th,"install-status.json"),bh=_e?z.join(process.env.LOCALAPPDATA||z.join(_s.homedir(),"AppData","Local"),"AgentHippo","bin"):z.join(_s.homedir(),".local","bin"),KT=z.join(bh,_e?"hippoclaw.cmd":"hippoclaw"),mh=z.join(bh,_e?"openclaw.cmd":"openclaw"),_h=_e?"REM Managed by Agent Anywhere":"# Managed by Agent Anywhere",bt=DT();Object.defineProperty(U,"ANYWHERE_CONFIG_TEMPLATE_ENV",{enumerable:!0,get:function(){return bt.ANYWHERE_CONFIG_TEMPLATE_ENV}});Object.defineProperty(U,"ANYWHERE_INSTALL_SOURCE_ENV",{enumerable:!0,get:function(){return bt.ANYWHERE_INSTALL_SOURCE_ENV}});Object.defineProperty(U,"ANYWHERE_SETUP_SCRIPT_ENV",{enumerable:!0,get:function(){return bt.ANYWHERE_SETUP_SCRIPT_ENV}});Object.defineProperty(U,"validateAnywhereInstallSource",{enumerable:!0,get:function(){return bt.validateAnywhereInstallSource}});function O1(t){return t?t.startsWith("\\")||t.startsWith("/")||t.startsWith(".")||/^[A-Za-z]:/.test(t)||t.startsWith("github:")||t.startsWith("git+http:")||t.startsWith("git+https:")||/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:#.+)?$/.test(t):!1}var GT=[["npmInstallComplete","npm install complete"],["wrapperExists","wrapper exists"],["configExists","config exists"],["distExists","dist exists"],["webUiExists","web UI exists"],["finalCheckPassed","final check passed"]];function ms(t){return t.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()}function WT(t,e){let n=ms(t),r=ms(e);return n===r||n.startsWith(`${r}/`)}function io(){try{if(!B.existsSync(Hu))return;let t=B.readFileSync(Hu,"utf8").replace(/^/,"");return JSON.parse(t)}catch{return}}function I1(t){B.mkdirSync(Th,{recursive:!0}),B.writeFileSync(Hu,JSON.stringify(t,null,2),"utf8")}function vh(t){let e=t?.packageRoot;if(!(!e||!B.existsSync(e)))try{return B.realpathSync(e)}catch{return e}}function P1(t){if(!t)return;let e=io();return!e?.entryScriptPath&&!e?.cliPath?t:(e.wrapperPath||e.openclawWrapperPath)&&[e.wrapperPath,e.openclawWrapperPath].some(n=>n&&ms(t)===ms(n))&&(e.entryScriptPath&&B.existsSync(e.entryScriptPath)||e.cliPath&&B.existsSync(e.cliPath))?e.entryScriptPath&&B.existsSync(e.entryScriptPath)?e.entryScriptPath:e.cliPath:t}function qT(t){if(!t)return;let e=io();return e?.cliPath&&[e.wrapperPath,e.openclawWrapperPath,e.entryScriptPath].some(n=>n&&ms(t)===ms(n))&&B.existsSync(e.cliPath)?e.cliPath:t}function YT(t){for(let e of[t?.wrapperPath,t?.openclawWrapperPath,t?.cliPath])if(e&&B.existsSync(e))return e}function JT(t){let e=t?.nodePath;if(!(!e||!B.existsSync(e)))return e}function N1(t){let e=t?.entryScriptPath;if(!(!e||!B.existsSync(e)))return e}async function Eh(t,e){let n=e??io(),r=t??YT(n)??await ZT(),s=qT(r)??r;if(!s||!B.existsSync(s))return;let i=vh(n)??Oh(s);if(!i)return;let o=JT(n)??C1(s),a=N1(n)??R1(i);if(!(!o||!a))return{launcherPath:s,packageRoot:i,nodePath:o,entryScriptPath:a}}function XT(t){try{return B.existsSync(t)?B.readFileSync(t,"utf8").includes(_h):!1}catch{return!1}}function UT(t,e,n){B.mkdirSync(z.dirname(n),{recursive:!0});let r=_e?`@echo off\r
675
675
  ${_h}\r
676
676
  "${t}" "${e}" %*\r
677
677
  `:`#!/bin/sh
678
678
  ${_h}
679
679
  exec "${t}" "${e}" "$@"
680
- `;return B.writeFileSync(n,r,_e?"ascii":"utf8"),_e||B.chmodSync(n,493),n}function R1(t){if(t)try{let e=z.join(t,"package.json");if(!B.existsSync(e))return;let n=JSON.parse(B.readFileSync(e,"utf8")),r=n.bin;typeof r=="string"&&(r={[n.name||"openclaw"]:r});let s=[...new Set(["hippoclaw","openclaw",...Object.keys(r||{})])];for(let i of s){let o=r&&typeof r[i]=="string"?r[i]:void 0;if(!o)continue;let a=z.resolve(t,o);if(B.existsSync(a))return a}}catch{}}function C1(t){let e=qT(t)??t;if(e){let n=z.join(z.dirname(e),_e?"node.exe":"node");if(B.existsSync(n))return n}for(let n of(0,De.getCommonBinaryPaths)("node"))if(B.existsSync(n))return n}function HT(){for(let t of[KT,mh])if(XT(t))try{B.rmSync(t,{force:!0})}catch{}try{B.rmSync(Hu,{force:!0})}catch{}}function zT(t,e){if(B.existsSync(e))try{t.add(B.realpathSync(e))}catch{t.add(e)}}function jT(t,e){for(let n of Ah)zT(t,z.join(e,n))}function k1(){let t=_s.homedir(),e=process.env.NVM_DIR||z.join(t,".nvm"),n=z.join(e,"versions","node");if(!B.existsSync(n))return[];let r=[];try{for(let s of B.readdirSync(n,{withFileTypes:!0}))s.isDirectory()&&r.push(...Ah.map(i=>z.join(n,s.name,"lib","node_modules",i)))}catch{}return r}async function ac(){let t=new Set,e=io(),n=vh(e);n&&B.existsSync(n)&&t.add(n);let r=z.join(_s.homedir(),".agenthippo","tools","node");if(B.existsSync(r))try{let s=B.readdirSync(r,{withFileTypes:!0});for(let i of s)if(i.isDirectory())for(let o of Ah){let a=z.join(r,i.name,..._e?["node_modules"]:["lib","node_modules"],o);if(B.existsSync(a))try{t.add(B.realpathSync(a))}catch{t.add(a)}}}catch{}jT(t,z.join(_s.homedir(),".npm-global",..._e?["node_modules"]:["lib","node_modules"]));for(let s of k1())zT(t,s);try{let{stdout:s}=await Jt("npm root -g",{timeout:3e3}),i=s.trim();i&&jT(t,i)}catch{}return Array.from(t)}function Oh(t){try{let e=P1(t)??t,n=B.realpathSync(e),r=z.dirname(n);for(let s=0;s<8;s++){if(B.existsSync(z.join(r,"package.json")))return r;let i=z.dirname(r);if(i===r)break;r=i}}catch{}}async function yh(t,e){let n=e??await ac();if(n.length===0)return!1;let r=Oh(t);return r?n.some(s=>WT(r,s)):!1}async function $1(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(_e)try{let e=`$listenerPids=Get-NetTCPConnection -LocalPort ${t} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -Unique; foreach($listenerProcId in $listenerPids){$proc=Get-CimInstance Win32_Process -Filter \\"ProcessId=$listenerProcId\\" -ErrorAction SilentlyContinue; if($proc -and $proc.CommandLine){$proc.CommandLine}}`,{stdout:n}=await Jt(`powershell.exe -NoProfile -Command "${e}"`,{timeout:1e4});return n.split(/\r?\n/).map(r=>r.trim()).filter(r=>r.length>0)}catch{return[]}try{let{stdout:e}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3}),n=[...new Set(e.trim().split(/\n/).map(s=>s.trim()).filter(s=>/^\d+$/.test(s)))],r=[];for(let s of n)try{let{stdout:i}=await Jt(`ps -p ${s} -o command=`,{timeout:3e3}),o=i.trim();o&&r.push(o)}catch{}return r}catch{return[]}}async function ju(t,e){let n=await ac();if(n.length===0)return!1;let r=!1,s="";if(e&&(r=await yh(e,n),r))try{s=B.realpathSync(e)}catch{s=e}let i=await $1(t);if(i.length===0)return!1;let o=io(),a=JT(o),c=[...i];a&&c.push(a);let l=n.map(d=>ms(d));a&&l.push(ms(z.dirname(a)));let u=s?ms(s):"";for(let d of c){let f=ms(d);if(f.includes(hs)&&r||u&&f.includes(u)||l.some(p=>f.includes(p)))return!0}return!1}async function Gu(t=so){let[e,n]=await Promise.all([(0,De.probePort)(t),ac()]),r=await ZT(n),s;if(r)try{let{stdout:a}=await Jt(`"${r}" --version`,{timeout:3e3});s=a.trim().split(`
681
- `)[0]}catch{}let i=!!r&&!!s,o=e?await ju(t,r):!1;return{installed:i,binaryPath:r,version:s,running:o,port:t}}async function QT(t,e){try{if(_e){let n=await Eh(t);if(n){e("Running gateway stop via managed node runtime..."),await y1(n.nodePath,[n.entryScriptPath,"gateway","stop"],{timeout:2e4,windowsHide:!0});return}}e(`Running ${z.basename(t)} gateway stop (CLI)...`),await Jt(`"${t}" gateway stop`,{timeout:2e4,windowsHide:!0})}catch{}}function D1(){try{if(!B.existsSync(hh))return;let t=B.readFileSync(hh,"utf8").replace(/^\uFEFF/,"");return JSON.parse(t)}catch{return}}function L1(t){return t?.phase==="complete"&&t.steps?.finalCheckPassed===!0}function M1(t){if(!t)return{message:"Waiting for setup status...",percent:0};if(t.phase==="failed")return{message:t.lastError?.trim()||t.message?.trim()||"Install failed.",percent:100};let e=GT.filter(([i])=>t.steps?.[i]).map(([,i])=>i),n=e.length,r=t.message?.trim()||"Installing Agent Anywhere...";return{message:e.length>0?`${r} (done: ${e.join(", ")})`:r,percent:Math.min(95,Math.floor(n/GT.length*100))}}function Mu(t){return t.replace(/'/g,"''")}async function oa(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(_e)try{let{stdout:e}=await Jt(`powershell.exe -NoProfile -Command "Get-NetTCPConnection -LocalPort ${t} -State Listen -ErrorAction SilentlyContinue | ForEach-Object { $_.OwningProcess } | Sort-Object -Unique"`,{timeout:1e4,windowsHide:!0});return[...new Set(e.trim().split(/\r?\n/).map(n=>parseInt(n.trim(),10)).filter(n=>Number.isInteger(n)&&n>0))]}catch{return[]}try{let{stdout:e}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3});return[...new Set(e.trim().split(/\n/).map(n=>parseInt(n.trim(),10)).filter(n=>Number.isInteger(n)&&n>0))]}catch{return[]}}async function xu(t,e,n=8e3){let r=[...new Set(e.filter(o=>Number.isInteger(o)&&o>0))],s=Date.now()+n,i=0;for(;Date.now()<s;){let o=await(0,De.probePort)(t),a=r.filter(c=>(0,De.isProcessRunning)(c));if(!o&&a.length===0){if(i===0&&(i=Date.now()),Date.now()-i>=750)return!0}else i=0;await new Promise(c=>setTimeout(c,250))}return!await(0,De.probePort)(t)&&r.every(o=>!(0,De.isProcessRunning)(o))}function xT(t,e,n){if(e&&e>0)try{process.kill(-e,n);return}catch{}try{t.kill(n)}catch{}}async function wh(t){if(!(!Number.isFinite(t)||t<1||t>65535)){if(_e){try{let{stdout:e}=await Jt(`powershell.exe -NoProfile -Command "Get-NetTCPConnection -LocalPort ${t} -State Listen -ErrorAction SilentlyContinue | ForEach-Object { $_.OwningProcess } | Sort-Object -Unique"`,{timeout:1e4}),n=e.trim().split(/\r?\n/).map(r=>r.trim()).filter(r=>/^\d+$/.test(r));for(let r of n)await Jt(`taskkill /F /T /PID ${r}`,{timeout:5e3}).catch(()=>{})}catch{}return}try{let{stdout:e}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3}),n=[...new Set(e.trim().split(/\n/).map(i=>i.trim()).filter(i=>/^\d+$/.test(i)))];for(let i of n)await Jt(`kill ${i}`,{timeout:3e3}).catch(()=>{});await new Promise(i=>setTimeout(i,800));let{stdout:r}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3}),s=[...new Set(r.trim().split(/\n/).map(i=>i.trim()).filter(i=>/^\d+$/.test(i)))];for(let i of s)await Jt(`kill -9 ${i}`,{timeout:3e3}).catch(()=>{})}catch{}}}async function BT(t,e,n){let r=await oa(t);if(e&&(await QT(e,n),await xu(t,r)))return!0;n(`Stopping listener(s) on port ${t}...`),await wh(t);let s=[...r];return t!==so&&await(0,De.probePort)(so)&&(s.push(...await oa(so)),n(`Stopping listener(s) on port ${so} (default gateway port)...`),await wh(so)),xu(t,s)}async function G1(t,e,n){await(0,De.writePidFile)(Fu,t,e,n)}async function ph(){await(0,De.removePidFile)(Fu)}async function gh(t){let e=await(0,De.checkPidFileWithCleanup)(Fu);if(!e)return null;let n=e.metadata?.[0]?parseInt(e.metadata[0],10):void 0,r=e.metadata?.[1]||void 0,s=n??t;return!await(0,De.probePort)(s)||!await ju(s,r)?null:{installed:!0,binaryPath:r,running:!0,port:s}}async function ZT(t){let e=t??await ac();return U1(e)}async function U1(t){let e=io(),n=vh(e),r=YT(e);if(n&&r&&B.existsSync(r)&&(t.length===0||t.some(a=>WT(n,a))))return r;let s=await(0,De.findBinaryCached)(hs,(0,De.getCommonBinaryPaths)(hs));if(s&&await yh(s,t))return s;let i=_e?`${hs}.cmd`:hs;for(let o of t){let a=_e?z.dirname(z.dirname(o)):z.dirname(z.dirname(z.dirname(o))),c=_e?z.join(a,i):z.join(a,"bin",i);if(B.existsSync(c)&&await yh(c,t))return c}}var Sh=class{outputChannel;process=null;healthCheckTimer=null;_status="not-installed";_bridgeConnected=!1;_lastDetection=null;_bridgeRef=null;_gatewayInstallInProgress=!1;_installProgressMessage;_installSetupTerminal=null;_gatewayUninstallInProgress=!1;_uninstallSetupTerminal=null;_startInFlight=null;_lastStartInProgressNoticeAt=0;_hasConfiguredChannelsCache;disposables=[];statusBarItem;_onStatusChange=new $.EventEmitter;onStatusChange=this._onStatusChange.event;setBridgeRef(e){this._bridgeRef=e}constructor(e,n){this.outputChannel=e,this.statusBarItem=$.window.createStatusBarItem($.StatusBarAlignment.Right,100),this.statusBarItem.command="agentide.anywhere.toggle",this.statusBarItem.name=U.AGENT_ANYWHERE_LABEL,$.commands.executeCommand("setContext","agentide.anywhere.connected",this._bridgeConnected),this.disposables.push($.window.onDidCloseTerminal(r=>{this._installSetupTerminal===r&&(this._installSetupTerminal=null,this._gatewayInstallInProgress&&this.reconcileInstallProgressState()),this._uninstallSetupTerminal===r&&(this._uninstallSetupTerminal=null,this._gatewayUninstallInProgress&&this.reconcileUninstallProgressState())})),this.registerCommands(),this.registerConfigWatcher(),this.initializeLazy()}setInstallProgressFlag(e,n){this._gatewayInstallInProgress!==e&&(this._gatewayInstallInProgress=e,this.log(`Install flag -> ${e?"true":`false (${n})`}`))}get status(){return this._status}get lastDetection(){return this._lastDetection}async initializeLazy(){if(this.getConfig("hidden",!1)){this.statusBarItem.hide();return}if(!this.getConfig("enabled",!1)){this.updateStatusBar("not-installed"),this.statusBarItem.show();return}let r=this.getGatewayPort(),s=await gh(r);s?(this._lastDetection=s,this.setStatus("running")):await this.detect(),this.getConfig("autoStart",!1)&&this._lastDetection?.installed&&!this._lastDetection?.running&&(this.log(`Auto-starting gateway (${(0,uh.toSettingsDisplayKey)("agentide.anywhere.autoStart")} = true)`),await this.start())}registerCommands(){this.disposables.push($.commands.registerCommand("agentide.anywhere.toggle",()=>this.toggle()),$.commands.registerCommand("agentide.anywhere.install",()=>this.install()),$.commands.registerCommand("agentide.anywhere.uninstall",()=>this.uninstall()),$.commands.registerCommand("agentide.anywhere.start",()=>this.start()),$.commands.registerCommand("agentide.anywhere.stop",()=>this.stop()),$.commands.registerCommand("agentide.anywhere.status",()=>this.showStatus()),$.commands.registerCommand("agentide.anywhere.openConfig",()=>this.openConfig()),$.commands.registerCommand("agentide.anywhere.connect",()=>this.connectBridge()),$.commands.registerCommand("agentide.anywhere.disconnect",()=>this.disconnectBridge()),$.commands.registerCommand("agentide.anywhere.openWebUI",()=>this.openWebUI()),$.commands.registerCommand("agentide.anywhere.detect",()=>this.detect()),$.commands.registerCommand("agentide.anywhere.meetAgent",()=>this.showMeetAgentPicker()))}setBridgeConnected(e){this._bridgeConnected=e,$.commands.executeCommand("setContext","agentide.anywhere.connected",e)}registerConfigWatcher(){this.disposables.push($.workspace.onDidChangeConfiguration(e=>{e.affectsConfiguration("agentide.anywhere")&&this.initializeLazy()}))}async toggle(){if(!this.getConfig("hidden",!1)){if(this._gatewayInstallInProgress){await this.showGatewayInstallInProgressPrompt();return}if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting");let n=Date.now();n-this._lastStartInProgressNoticeAt>4e3&&(this._lastStartInProgressNoticeAt=n,$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Starting gateway... please wait.`));return}switch(this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._status){case"error":{this._lastDetection?.installed===!0?await this.showDisconnectedQuickMenu():await this.showNotInstalledQuickMenu();break}case"starting":case"stopping":$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Operation in progress...`);break;case"running":this._bridgeConnected?await this.showConnectedQuickMenu():await this.showDisconnectedQuickMenu();break;case"installed":await this.showDisconnectedQuickMenu();break;case"not-installed":default:{if(this._lastDetection?.installed===!0){await this.showDisconnectedQuickMenu();break}await this.showNotInstalledQuickMenu();break}}}}queueBackgroundDetect(e){this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||setTimeout(()=>{this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||this.detect().catch(n=>{this.log(`Background detect failed after ${e}: ${n instanceof Error?n.message:String(n)}`)})},100)}async showConnectedQuickMenu(){let n=this._hasConfiguredChannelsCache??await this.refreshHasConfiguredChannels()?"Meet at...":"Web UI",r=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL} is running (bridge: connected).`,n,"Disconnect","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening connected menu"),this.refreshHasConfiguredChannels(),await r){case"Meet at...":await this.showMeetAgentPicker();break;case"Web UI":await this.openWebUI();break;case"Disconnect":await this.disconnectBridge();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showDisconnectedQuickMenu(){let e=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Disconnected.`,"Connect","Reinstall","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening disconnected menu"),await e){case"Connect":await this.start(),this._status==="running"&&(await this.connectBridge(),this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._bridgeConnected&&await this.showConnectedQuickMenu());break;case"Reinstall":await this.install();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showGatewayInstallInProgressPrompt(){await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Install in progress. Follow the "${U.AGENT_ANYWHERE_LABEL} Setup" terminal; when it finishes, status updates automatically.`,"Show Setup Terminal","OK")==="Show Setup Terminal"&&(this.revealInstallSetupTerminal()||await this.showMissingInstallSetupTerminalPrompt())}async showMissingInstallSetupTerminalPrompt(){(await this.reconcileInstallProgressState())?.installed?$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Install completed. Status has been refreshed.`):$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Setup terminal is no longer available. Install did not complete; run Install again to relaunch setup.`)}async showGatewayUninstallInProgressPrompt(){await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall in progress. Follow the "${ro}" terminal; when it finishes, status updates automatically.`,"Show Uninstall Terminal","OK")==="Show Uninstall Terminal"&&(this.revealUninstallSetupTerminal()||await this.showMissingUninstallSetupTerminalPrompt())}async showMissingUninstallSetupTerminalPrompt(){let e=await this.reconcileUninstallProgressState();e&&!e.installed&&!e.running?$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall completed. Status has been refreshed.`):$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall terminal is no longer available. Uninstall may still be running or did not complete; run Status to confirm.`)}revealInstallSetupTerminal(){let e=this._installSetupTerminal??$.window.terminals.find(n=>n.name===ia||n.name.startsWith(`${ia} `))??null;return e?(this._installSetupTerminal=e,e.show(),!0):!1}revealUninstallSetupTerminal(){let e=this._uninstallSetupTerminal??$.window.terminals.find(n=>n.name===ro||n.name.startsWith(`${ro} `))??null;return e?(this._uninstallSetupTerminal=e,e.show(),!0):!1}async reconcileInstallProgressState(){if(!this._gatewayInstallInProgress)return this._lastDetection;if(this.revealInstallSetupTerminal())return this._lastDetection;if(await this.sleep(2e3),this.revealInstallSetupTerminal())return this._lastDetection;(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw");let e=await this.detectGatewayState(this.getGatewayPort());return this._lastDetection=e,e.running?this.finishInstallUiState("running","terminal reconciliation"):e.installed?this.finishInstallUiState("installed","terminal reconciliation"):(this.log("Setup terminal closed before gateway install was detected"),this.setInstallProgressFlag(!1,"terminal reconciliation"),this._installProgressMessage=void 0,this.setStatus("not-installed")),e}finishInstallUiState(e,n){this.setInstallProgressFlag(!1,n),this._installProgressMessage=void 0,this.setStatus(e)}readInstallStatusSnapshot(){return D1()}getInstallProgressSummary(e){return M1(e)}async detectGatewayState(e){return Gu(e)}async detectGatewayFastState(e){return gh(e)}async probeGatewayPort(e){return(0,De.probePort)(e)}isStartedGatewayProcessAlive(e){return e!==void 0&&(0,De.isProcessRunning)(e)}getStartupTimeoutMs(){return b1}getStartupCheckIntervalMs(){return 500}getStartupLaunchGraceMs(){return _e?15e3:0}getUninstallInitialDelayMs(){return _e?2e3:3e3}getUninstallVerificationTimeoutMs(){return _e?15e3:9e4}getUninstallCheckIntervalMs(){return _e?1e3:4e3}async sleep(e){await new Promise(n=>setTimeout(n,e))}isWindowsLaunch(){return _e}async stopExistingGatewayBeforeStart(e){await QT(e,n=>this.log(n))}getGatewayLockPathForConfig(){let e=(0,oh.createHash)("sha256").update(this.configPath).digest("hex").slice(0,8);return z.join(_s.tmpdir(),"openclaw",`gateway.${e}.lock`)}async removeStaleGatewayLockBeforeStart(e){if(!_e)return;let n=this.getGatewayLockPathForConfig();if(!B.existsSync(n))return;if(await this.probeGatewayPort(e)){this.log(`Gateway lock present but port ${e} is open; leaving lock in place.`);return}let r=Number.POSITIVE_INFINITY;try{let s=await B.promises.stat(n);r=Date.now()-s.mtimeMs}catch(s){this.log(`Could not stat gateway lock before start: ${s instanceof Error?s.message:String(s)}`);return}if(r<v1){this.log(`Gateway lock is only ${Math.round(r/1e3)}s old; not removing (possible concurrent start still binding).`);return}try{B.rmSync(n,{force:!0}),this.log(`Removed stale gateway lock before start (${Math.round(r/1e3)}s old): ${n}`)}catch(s){this.log(`Could not remove stale gateway lock before start: ${s instanceof Error?s.message:String(s)}`)}}async writeGatewayPidRecord(e,n,r){await G1(e,n,r)}async reconcileUninstallProgressState(){if(!this._gatewayUninstallInProgress)return this._lastDetection;if(this.revealUninstallSetupTerminal())return this._lastDetection;let e=await Gu(this.getGatewayPort());return this._lastDetection=e,this._gatewayUninstallInProgress=!1,e.running?this.setStatus("running"):e.installed?this.setStatus("installed"):this.setStatus("not-installed"),e}async showNotInstalledQuickMenu(){let e=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Reach your AgentHippo IDE or CLI agents from WhatsApp, Telegram, Slack, Discord, and more - right from your phone or any messaging app. This will also install OpenClaw fork on your computer.`,"Install","Ask Agent Hippo");switch(this.queueBackgroundDetect("opening not-installed menu"),await e){case"Install":await this.install();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showMaintenanceQuickMenu(){let e=this._status==="running"||this._status==="installed"||this._lastDetection?.installed===!0,r=[...this._status==="running"&&this._hasConfiguredChannelsCache===!0?["Web UI"]:[],"Config","Reset auth","Reset mappings",...e?["Restart"]:[],"Uninstall"],s=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: More options`,...r);switch(this.queueBackgroundDetect("opening maintenance menu"),await s){case"Web UI":await this.openWebUI();break;case"Config":await this.openConfig();break;case"Reset auth":await this.resetAuth();break;case"Reset mappings":await $.commands.executeCommand("agentide.gateway.resetMappings");break;case"Restart":await this.restartGateway();break;case"Uninstall":await this.uninstall();break}}async refreshHasConfiguredChannels(){let e=this._bridgeRef;if(!e?.request)return this._hasConfiguredChannelsCache??!1;try{let{rows:n}=await(0,lh.fetchMeetAgentChannelContext)(e.request.bind(e));this._hasConfiguredChannelsCache=n.length>0}catch(n){this.log(`channels.status probe failed (non-fatal): ${n instanceof Error?n.message:String(n)}`),this._hasConfiguredChannelsCache??=!1}return this._hasConfiguredChannelsCache}async openAskAgentHippoChat(){await $.commands.executeCommand("workbench.action.chat.newChat",{agentMode:!0}),await $.commands.executeCommand("workbench.action.chat.open",{mode:"agent",query:"use openclaw skill as needed.",isPartialQuery:!0})}async showMeetAgentPicker(e){if(!this._bridgeRef?.request){$.window.showWarningMessage("Not connected to gateway.");return}let n=this._bridgeRef.request.bind(this._bridgeRef),r=!1,s=async(i,o)=>{try{return await n(i,o)}catch(a){let c=a instanceof Error?a.message:String(a);if(!r&&(0,E1.isGatewayScopeAuthError)(c)){if(r=!0,this.log(`Gateway denied RPC (${c}); reconnecting with fresh handshake...`),await this.disconnectBridge(),await this.connectBridge(),!this._bridgeRef?.request)throw a;return await this._bridgeRef.request(i,o)}throw a}};try{this.log("Meet Agent: fetching channels.status...");let{rows:i,statusPayload:o}=await(0,lh.fetchMeetAgentChannelContext)(s);if(this.log(`Meet Agent: got ${i?.length??0} channel(s): ${i?.map(g=>g.id).join(", ")??"none"}`),!i||i.length===0){let g=await $.window.showInformationMessage("No messaging channels (Telegram, WhatsApp, etc.) are configured. You can chat with your agent in the Gateway Web UI, or set up channels in OpenClaw config.","Open Web UI","Open Config");g==="Open Web UI"?await this.openWebUI():g==="Open Config"&&await this.openConfig();return}let a=e??await this.getFirstRegisteredAgentId();if(!a){$.window.showWarningMessage("No agent registered with the gateway.");return}let l=(await s("agents.list")).external?.find(g=>g.id.toLowerCase()===a.toLowerCase()),u=new Set(l?.boundChannels?.map(g=>g.toLowerCase())??[]),d=i.map(g=>({channelId:g.id,label:g.label,description:g.connected?"connected":"offline",detail:g.accounts.length>1?`Accounts: ${g.accounts.join(", ")}`:void 0,picked:u.has(g.id.toLowerCase())})),f=await $.window.showQuickPick(d,{canPickMany:!0,title:`Meet ${a} at...`,placeHolder:"Select channels where people can reach this agent"});if(!f)return;let p=f.map(g=>g.channelId);if(await(0,lh.applyAgentChannelBindingsViaConfigPatch)(s,{agentId:a,selectedChannelIds:p,statusPayload:o}),p.length===0)$.window.showInformationMessage(`${a}: all channel bindings removed.`);else{let g=f.map(_=>_.label).join(", ");$.window.showInformationMessage(`${a} can now be reached at: ${g}`)}}catch(i){this.log(`Meet Agent picker failed: ${i}`),$.window.showErrorMessage(`Failed to configure channels: ${i instanceof Error?i.message:String(i)}`)}}async getFirstRegisteredAgentId(){if(this._bridgeRef?.request)try{return(await this._bridgeRef.request("agents.list")).external?.[0]?.id}catch{return}}async detect(){let e=this.getGatewayPort(),r=await Gu(e);return this._gatewayInstallInProgress||this._gatewayUninstallInProgress?(this._lastDetection=r,r):this._startInFlight&&this._status==="starting"?(this._lastDetection=r,r):(!r.running&&r.installed&&(await this.hasGlobalNpmOpenclawTree()||(r={...r,installed:!1})),this._lastDetection=r,r.running?this.setStatus("running"):r.installed?this.setStatus("installed"):this.setStatus("not-installed"),r)}async install(){let e=this.getConfig("installSource",""),n=this.getGatewayPort();if(!e)return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Install source not configured. Set "${(0,uh.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in settings.`),!1;let r=(0,bt.validateAnywhereInstallSource)(e);if(!r.ok)return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Refusing to install from "${e}" \u2014 ${r.reason}. Fix "${(0,uh.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in your user settings.`),this.log(`Rejected installSource (${r.reason}): ${e}`),!1;if(this._gatewayInstallInProgress)return await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Install is already in progress. Watch the "${U.AGENT_ANYWHERE_LABEL} Setup" terminal.`,"Show Setup Terminal","OK")==="Show Setup Terminal"&&(this.revealInstallSetupTerminal()||await this.showMissingInstallSetupTerminalPrompt()),!1;this.setInstallProgressFlag(!0,"install command started");try{this.log(`Installing gateway from: ${e}`),(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw"),this.setStatus("starting"),this.stopHealthChecks();let s=await this.detectGatewayState(n);this._lastDetection=s,s.running&&(this.log("Stopping gateway before install..."),await this.disconnectBridge(),await this.stop());let i=_e?"setup-gateway.ps1":"setup-gateway.sh",a=[z.join(__dirname,"..","..","scripts","gateway",i),z.join(__dirname,"..","scripts","gateway",i)].find(h=>B.existsSync(h)),l=[z.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5"),z.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5")].find(h=>B.existsSync(h)),u,d={...dh(),[bt.ANYWHERE_INSTALL_SOURCE_ENV]:e,...a?{[bt.ANYWHERE_SETUP_SCRIPT_ENV]:a}:{},...l?{[bt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}};if(a&&_e){let h=[`-Source $env:${bt.ANYWHERE_INSTALL_SOURCE_ENV}`];l&&h.push(`-ConfigTemplate $env:${bt.ANYWHERE_CONFIG_TEMPLATE_ENV}`);let y=`& $env:${bt.ANYWHERE_SETUP_SCRIPT_ENV} ${h.join(" ")}; Write-Host ""; Write-Host "You can close this window."`;u={name:ia,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",y],env:{[bt.ANYWHERE_INSTALL_SOURCE_ENV]:e,[bt.ANYWHERE_SETUP_SCRIPT_ENV]:a,...l?{[bt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}}}}else if(a){let h=[`--source "$${bt.ANYWHERE_INSTALL_SOURCE_ENV}"`];l&&h.push(`--config-template "$${bt.ANYWHERE_CONFIG_TEMPLATE_ENV}"`);let E=`${`bash "$${bt.ANYWHERE_SETUP_SCRIPT_ENV}" ${h.join(" ")}`}; echo ""; echo "Press Enter to close..."; read`;u={name:ia,shellPath:Du(),shellArgs:Lu(E),env:d}}else{this.log("Setup script not found, falling back to npm install");let y=`${`npm install -g "$${bt.ANYWHERE_INSTALL_SOURCE_ENV}"`}; echo ""; echo "Press Enter to close..."; read`;u=_e?{name:ia,shellPath:"cmd.exe",shellArgs:["/c",`npm install -g "%${bt.ANYWHERE_INSTALL_SOURCE_ENV}%" && echo. && echo Setup complete. && pause`],env:{[bt.ANYWHERE_INSTALL_SOURCE_ENV]:e}}:{name:ia,shellPath:Du(),shellArgs:Lu(y),env:d}}try{B.rmSync(hh,{force:!0})}catch{}this._installProgressMessage="Launching setup...",this.updateStatusBar("starting");let f=$.window.createTerminal(u);this._installSetupTerminal=f,f.show();let p=O1(e)?10*6e4:12e4;this.log(`Waiting up to ${Math.round(p/6e4)} minute(s) for gateway install completion...`);let g=_e&&!!a;return await $.window.withProgress({location:$.ProgressLocation.Window,title:`${U.AGENT_ANYWHERE_LABEL}: Installing gateway...`,cancellable:!1},async h=>{let y=Date.now()+p,E=0;for(;Date.now()<y;){if(!this._gatewayInstallInProgress)return this.log("Gateway install wait aborted \u2014 setup terminal closed before completion was detected"),!1;let w=this.readInstallStatusSnapshot(),A=this.getInstallProgressSummary(w);this._installProgressMessage=A.message,this.updateStatusBar("starting");let S=Math.max(0,A.percent-E);if(h.report({message:A.message,increment:S}),E=Math.max(E,A.percent),w?.phase==="failed")return this.log(`Gateway install failed: ${w.lastError||w.message||"unknown error"}`),!1;(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw");let C=await this.detectGatewayState(n);if(this._lastDetection=C,g?L1(w)&&C.installed:C.installed)return this.log("Gateway installed successfully"),await this.ensureManagedGatewayWrapperState(C.binaryPath),await this.ensureWebUIBuilt(C.binaryPath),this.writeStarterConfig(),await $.workspace.getConfiguration("agentide.anywhere").update("enabled",!0,$.ConfigurationTarget.Global),C.running?(this.finishInstallUiState("running","success"),h.report({message:`Install complete. Gateway is running on port ${n}.`,increment:Math.max(0,100-E)})):(this.finishInstallUiState("installed","success"),h.report({message:"Install complete. Gateway is installed. Click Agent Anywhere to start.",increment:Math.max(0,100-E)})),$.window.showInformationMessage(C.running?`${U.AGENT_ANYWHERE_LABEL}: Installed and running. Open the config to add your channels or use the status bar to connect.`:`${U.AGENT_ANYWHERE_LABEL}: Installed. Open the config to add your channels, then click Agent Anywhere to start.`,"Open Config").then(async P=>{P==="Open Config"&&await this.openConfig()}),!0;await new Promise(I=>setTimeout(I,1e3))}return!1})?!0:(this.log("Gateway install timed out or failed"),this.finishInstallUiState("error","failure"),!1)}catch(s){return this.log(`Install failed: ${s instanceof Error?s.message:String(s)}`),this.finishInstallUiState("error","failure"),!1}finally{this._gatewayInstallInProgress&&(this.setInstallProgressFlag(!1,"finally"),this._installProgressMessage=void 0),this.updateStatusBar(this._status)}}async uninstall(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}await this.stop();let e=_e?"setup-gateway.ps1":"setup-gateway.sh",r=[z.join(__dirname,"..","scripts","gateway",e),z.join(__dirname,"..","..","scripts","gateway",e)].find(i=>B.existsSync(i)),s;if(r&&_e){let i=`& "${r}" -Uninstall; Write-Host ""; Write-Host "You can close this window."`;s={name:ro,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",i]}}else if(r){let o=`${`bash "${r}" --uninstall`}; echo ""; echo "Press Enter to close..."; read`;s={name:ro,shellPath:Du(),shellArgs:Lu(o),env:dh()}}else{let i="npm uninstall -g openclaw",o=`${i}; echo ""; echo "Press Enter to close..."; read`;s=_e?{name:ro,shellPath:"cmd.exe",shellArgs:["/c",`${i} && echo. && pause`]}:{name:ro,shellPath:Du(),shellArgs:Lu(o),env:dh()}}this._gatewayUninstallInProgress=!0,this.setStatus("stopping");try{let i=$.window.createTerminal(s);this._uninstallSetupTerminal=i,i.show(),this.log("Gateway uninstall started in terminal"),(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw"),await this.sleep(this.getUninstallInitialDelayMs());let o=Date.now()+this.getUninstallVerificationTimeoutMs(),a,c=!0;for(;Date.now()<o;){(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw");let l=await this.detectGatewayState(this.getGatewayPort());if(a=l,this._lastDetection=l,c=await this.hasGlobalNpmOpenclawTree(),!c&&!l.running){HT(),this.setStatus("not-installed"),l.installed?this.log("Managed OpenClaw npm package removed; another OpenClaw binary remains on PATH (likely external/self-updated)."):this.log("Global OpenClaw package removed (or no longer detected).");return}if(!l.installed){HT(),this.setStatus("not-installed"),this.log("Global OpenClaw package removed (or no longer detected).");return}await this.sleep(this.getUninstallCheckIntervalMs())}!c&&a?.running?$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Managed package was removed, but the gateway listener still appears to be running. Finish the terminal command or run Status.`):$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall is still verifying managed package removal. Finish the terminal command or run Status.`)}finally{this._gatewayUninstallInProgress=!1,this.updateStatusBar(this._status)}}get configPath(){return z.join(_s.homedir(),".openclaw","openclaw.json")}writeStarterConfig(){let e=z.dirname(this.configPath);if(B.existsSync(this.configPath)){this.log("Config already exists, skipping starter config");return}let r=[z.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5"),z.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5")].find(o=>B.existsSync(o));if(!r){this.log("Starter config template not found, skipping");return}B.mkdirSync(e,{recursive:!0,mode:448});let s=B.readFileSync(r,"utf-8"),i=`ah-${(0,oh.randomBytes)(24).toString("hex")}`;s=s.replace("__GENERATED_TOKEN__",i),B.writeFileSync(this.configPath,s,{encoding:"utf-8",mode:_e?void 0:384}),this.log(`Wrote starter config to ${this.configPath}`)}async openConfig(){B.existsSync(this.configPath)||this.writeStarterConfig();let e=await $.workspace.openTextDocument(this.configPath);await $.window.showTextDocument(e)}async preflightChannelSecrets(e){let n;try{n=B.readFileSync(this.configPath,"utf-8")}catch{return"continue"}let r=(0,ch.parseStrictJsonConfig)(n);if(r===void 0)return"continue";let s=(0,ch.collectMissingChannelEnvSecrets)(r,e);if(s.length===0)return"continue";let i=(0,ah.getAgentHomeEnvFilePath)(),o=s.map(d=>d.channel).join(", "),a=[...new Set(s.flatMap(d=>d.envVars))];this.log(`Channel secrets preflight: ${o} missing ${a.join(", ")}`);let c=`Disable ${o} & Start`,l="Add Secrets",u=await $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: The ${o} channel needs ${a.join(", ")}, which ${a.length===1?"is":"are"} not set in ${i} or the IDE environment. Add the secret${a.length===1?"":"s"} or disable the channel to start the gateway.`,c,l);if(u===c){let d=(0,ch.disableChannelsInConfigText)(n,s.map(p=>p.channel));if(!d)return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath}. Set "enabled": false on the ${o} channel manually, then start again.`),"abort";let f=`${this.configPath}.bak-missing-secrets`;try{B.copyFileSync(this.configPath,f),B.writeFileSync(this.configPath,d,{encoding:"utf-8",mode:_e?void 0:384})}catch(p){let g=p instanceof Error?p.message:String(p);return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath} (${g}).`),"abort"}return this.log(`Disabled channels missing secrets: ${o} (backup: ${f})`),$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Disabled the ${o} channel (backup: ${z.basename(f)}). To re-enable: add ${a.join(", ")} to ${i}, set "enabled": true in the config, then restart the gateway.`),"continue"}return u===l&&await this.openEnvFileWithSecretStubs(i,a),"abort"}async openEnvFileWithSecretStubs(e,n){try{let r="";try{r=B.readFileSync(e,"utf-8")}catch{}let s=n.filter(o=>!new RegExp(`^\\s*#?\\s*${o}=`,"m").test(r));if(s.length){let o=r.length&&!r.endsWith(`
680
+ `;return B.writeFileSync(n,r,_e?"ascii":"utf8"),_e||B.chmodSync(n,493),n}function R1(t){if(t)try{let e=z.join(t,"package.json");if(!B.existsSync(e))return;let n=JSON.parse(B.readFileSync(e,"utf8")),r=n.bin;typeof r=="string"&&(r={[n.name||"openclaw"]:r});let s=[...new Set(["hippoclaw","openclaw",...Object.keys(r||{})])];for(let i of s){let o=r&&typeof r[i]=="string"?r[i]:void 0;if(!o)continue;let a=z.resolve(t,o);if(B.existsSync(a))return a}}catch{}}function C1(t){let e=qT(t)??t;if(e){let n=z.join(z.dirname(e),_e?"node.exe":"node");if(B.existsSync(n))return n}for(let n of(0,De.getCommonBinaryPaths)("node"))if(B.existsSync(n))return n}function HT(){for(let t of[KT,mh])if(XT(t))try{B.rmSync(t,{force:!0})}catch{}try{B.rmSync(Hu,{force:!0})}catch{}}function zT(t,e){if(B.existsSync(e))try{t.add(B.realpathSync(e))}catch{t.add(e)}}function jT(t,e){for(let n of Ah)zT(t,z.join(e,n))}function k1(){let t=_s.homedir(),e=process.env.NVM_DIR||z.join(t,".nvm"),n=z.join(e,"versions","node");if(!B.existsSync(n))return[];let r=[];try{for(let s of B.readdirSync(n,{withFileTypes:!0}))s.isDirectory()&&r.push(...Ah.map(i=>z.join(n,s.name,"lib","node_modules",i)))}catch{}return r}async function ac(){let t=new Set,e=io(),n=vh(e);n&&B.existsSync(n)&&t.add(n);let r=z.join(_s.homedir(),".agenthippo","tools","node");if(B.existsSync(r))try{let s=B.readdirSync(r,{withFileTypes:!0});for(let i of s)if(i.isDirectory())for(let o of Ah){let a=z.join(r,i.name,..._e?["node_modules"]:["lib","node_modules"],o);if(B.existsSync(a))try{t.add(B.realpathSync(a))}catch{t.add(a)}}}catch{}jT(t,z.join(_s.homedir(),".npm-global",..._e?["node_modules"]:["lib","node_modules"]));for(let s of k1())zT(t,s);try{let{stdout:s}=await Jt("npm root -g",{timeout:3e3}),i=s.trim();i&&jT(t,i)}catch{}return Array.from(t)}function Oh(t){try{let e=P1(t)??t,n=B.realpathSync(e),r=z.dirname(n);for(let s=0;s<8;s++){if(B.existsSync(z.join(r,"package.json")))return r;let i=z.dirname(r);if(i===r)break;r=i}}catch{}}async function yh(t,e){let n=e??await ac();if(n.length===0)return!1;let r=Oh(t);return r?n.some(s=>WT(r,s)):!1}async function $1(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(_e)try{let e=`$listenerPids=Get-NetTCPConnection -LocalPort ${t} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -Unique; foreach($listenerProcId in $listenerPids){$proc=Get-CimInstance Win32_Process -Filter \\"ProcessId=$listenerProcId\\" -ErrorAction SilentlyContinue; if($proc -and $proc.CommandLine){$proc.CommandLine}}`,{stdout:n}=await Jt(`powershell.exe -NoProfile -Command "${e}"`,{timeout:1e4});return n.split(/\r?\n/).map(r=>r.trim()).filter(r=>r.length>0)}catch{return[]}try{let{stdout:e}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3}),n=[...new Set(e.trim().split(/\n/).map(s=>s.trim()).filter(s=>/^\d+$/.test(s)))],r=[];for(let s of n)try{let{stdout:i}=await Jt(`ps -p ${s} -o command=`,{timeout:3e3}),o=i.trim();o&&r.push(o)}catch{}return r}catch{return[]}}async function ju(t,e){let n=await ac();if(n.length===0)return!1;let r=!1,s="";if(e&&(r=await yh(e,n),r))try{s=B.realpathSync(e)}catch{s=e}let i=await $1(t);if(i.length===0)return!1;let o=io(),a=JT(o),c=[...i];a&&c.push(a);let l=n.map(f=>ms(f));a&&l.push(ms(z.dirname(a)));let u=s?ms(s):"";for(let f of c){let d=ms(f);if(d.includes(hs)&&r||u&&d.includes(u)||l.some(g=>d.includes(g)))return!0}return!1}async function Gu(t=so){let[e,n]=await Promise.all([(0,De.probePort)(t),ac()]),r=await ZT(n),s;if(r)try{let{stdout:a}=await Jt(`"${r}" --version`,{timeout:3e3});s=a.trim().split(`
681
+ `)[0]}catch{}let i=!!r&&!!s,o=e?await ju(t,r):!1;return{installed:i,binaryPath:r,version:s,running:o,port:t}}async function QT(t,e){try{if(_e){let n=await Eh(t);if(n){e("Running gateway stop via managed node runtime..."),await y1(n.nodePath,[n.entryScriptPath,"gateway","stop"],{timeout:2e4,windowsHide:!0});return}}e(`Running ${z.basename(t)} gateway stop (CLI)...`),await Jt(`"${t}" gateway stop`,{timeout:2e4,windowsHide:!0})}catch{}}function D1(){try{if(!B.existsSync(hh))return;let t=B.readFileSync(hh,"utf8").replace(/^\uFEFF/,"");return JSON.parse(t)}catch{return}}function L1(t){return t?.phase==="complete"&&t.steps?.finalCheckPassed===!0}function M1(t){if(!t)return{message:"Waiting for setup status...",percent:0};if(t.phase==="failed")return{message:t.lastError?.trim()||t.message?.trim()||"Install failed.",percent:100};let e=GT.filter(([i])=>t.steps?.[i]).map(([,i])=>i),n=e.length,r=t.message?.trim()||"Installing Agent Anywhere...";return{message:e.length>0?`${r} (done: ${e.join(", ")})`:r,percent:Math.min(95,Math.floor(n/GT.length*100))}}function Mu(t){return t.replace(/'/g,"''")}async function oa(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(_e)try{let{stdout:e}=await Jt(`powershell.exe -NoProfile -Command "Get-NetTCPConnection -LocalPort ${t} -State Listen -ErrorAction SilentlyContinue | ForEach-Object { $_.OwningProcess } | Sort-Object -Unique"`,{timeout:1e4,windowsHide:!0});return[...new Set(e.trim().split(/\r?\n/).map(n=>parseInt(n.trim(),10)).filter(n=>Number.isInteger(n)&&n>0))]}catch{return[]}try{let{stdout:e}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3});return[...new Set(e.trim().split(/\n/).map(n=>parseInt(n.trim(),10)).filter(n=>Number.isInteger(n)&&n>0))]}catch{return[]}}async function xu(t,e,n=8e3){let r=[...new Set(e.filter(o=>Number.isInteger(o)&&o>0))],s=Date.now()+n,i=0;for(;Date.now()<s;){let o=await(0,De.probePort)(t),a=r.filter(c=>(0,De.isProcessRunning)(c));if(!o&&a.length===0){if(i===0&&(i=Date.now()),Date.now()-i>=750)return!0}else i=0;await new Promise(c=>setTimeout(c,250))}return!await(0,De.probePort)(t)&&r.every(o=>!(0,De.isProcessRunning)(o))}function xT(t,e,n){if(e&&e>0)try{process.kill(-e,n);return}catch{}try{t.kill(n)}catch{}}async function wh(t){if(!(!Number.isFinite(t)||t<1||t>65535)){if(_e){try{let{stdout:e}=await Jt(`powershell.exe -NoProfile -Command "Get-NetTCPConnection -LocalPort ${t} -State Listen -ErrorAction SilentlyContinue | ForEach-Object { $_.OwningProcess } | Sort-Object -Unique"`,{timeout:1e4}),n=e.trim().split(/\r?\n/).map(r=>r.trim()).filter(r=>/^\d+$/.test(r));for(let r of n)await Jt(`taskkill /F /T /PID ${r}`,{timeout:5e3}).catch(()=>{})}catch{}return}try{let{stdout:e}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3}),n=[...new Set(e.trim().split(/\n/).map(i=>i.trim()).filter(i=>/^\d+$/.test(i)))];for(let i of n)await Jt(`kill ${i}`,{timeout:3e3}).catch(()=>{});await new Promise(i=>setTimeout(i,800));let{stdout:r}=await Jt(`lsof -nP -iTCP:${t} -sTCP:LISTEN -t 2>/dev/null || true`,{timeout:5e3}),s=[...new Set(r.trim().split(/\n/).map(i=>i.trim()).filter(i=>/^\d+$/.test(i)))];for(let i of s)await Jt(`kill -9 ${i}`,{timeout:3e3}).catch(()=>{})}catch{}}}async function BT(t,e,n){let r=await oa(t);if(e&&(await QT(e,n),await xu(t,r)))return!0;n(`Stopping listener(s) on port ${t}...`),await wh(t);let s=[...r];return t!==so&&await(0,De.probePort)(so)&&(s.push(...await oa(so)),n(`Stopping listener(s) on port ${so} (default gateway port)...`),await wh(so)),xu(t,s)}async function G1(t,e,n){await(0,De.writePidFile)(Fu,t,e,n)}async function ph(){await(0,De.removePidFile)(Fu)}async function gh(t){let e=await(0,De.checkPidFileWithCleanup)(Fu);if(!e)return null;let n=e.metadata?.[0]?parseInt(e.metadata[0],10):void 0,r=e.metadata?.[1]||void 0,s=n??t;return!await(0,De.probePort)(s)||!await ju(s,r)?null:{installed:!0,binaryPath:r,running:!0,port:s}}async function ZT(t){let e=t??await ac();return U1(e)}async function U1(t){let e=io(),n=vh(e),r=YT(e);if(n&&r&&B.existsSync(r)&&(t.length===0||t.some(a=>WT(n,a))))return r;let s=await(0,De.findBinaryCached)(hs,(0,De.getCommonBinaryPaths)(hs));if(s&&await yh(s,t))return s;let i=_e?`${hs}.cmd`:hs;for(let o of t){let a=_e?z.dirname(z.dirname(o)):z.dirname(z.dirname(z.dirname(o))),c=_e?z.join(a,i):z.join(a,"bin",i);if(B.existsSync(c)&&await yh(c,t))return c}}var Sh=class{outputChannel;process=null;healthCheckTimer=null;_status="not-installed";_bridgeConnected=!1;_lastDetection=null;_bridgeRef=null;_gatewayInstallInProgress=!1;_installProgressMessage;_installSetupTerminal=null;_gatewayUninstallInProgress=!1;_uninstallSetupTerminal=null;_startInFlight=null;_lastStartInProgressNoticeAt=0;_hasConfiguredChannelsCache;disposables=[];statusBarItem;_onStatusChange=new $.EventEmitter;onStatusChange=this._onStatusChange.event;setBridgeRef(e){this._bridgeRef=e}constructor(e,n){this.outputChannel=e,this.statusBarItem=$.window.createStatusBarItem($.StatusBarAlignment.Right,100),this.statusBarItem.command="agentide.anywhere.toggle",this.statusBarItem.name=U.AGENT_ANYWHERE_LABEL,$.commands.executeCommand("setContext","agentide.anywhere.connected",this._bridgeConnected),this.disposables.push($.window.onDidCloseTerminal(r=>{this._installSetupTerminal===r&&(this._installSetupTerminal=null,this._gatewayInstallInProgress&&this.reconcileInstallProgressState()),this._uninstallSetupTerminal===r&&(this._uninstallSetupTerminal=null,this._gatewayUninstallInProgress&&this.reconcileUninstallProgressState())})),this.registerCommands(),this.registerConfigWatcher(),this.initializeLazy()}setInstallProgressFlag(e,n){this._gatewayInstallInProgress!==e&&(this._gatewayInstallInProgress=e,this.log(`Install flag -> ${e?"true":`false (${n})`}`))}get status(){return this._status}get lastDetection(){return this._lastDetection}async initializeLazy(){if(this.getConfig("hidden",!1)){this.statusBarItem.hide();return}if(!this.getConfig("enabled",!1)){this.updateStatusBar("not-installed"),this.statusBarItem.show();return}let r=this.getGatewayPort(),s=await gh(r);s?(this._lastDetection=s,this.setStatus("running")):await this.detect(),this.getConfig("autoStart",!1)&&this._lastDetection?.installed&&!this._lastDetection?.running&&(this.log(`Auto-starting gateway (${(0,uh.toSettingsDisplayKey)("agentide.anywhere.autoStart")} = true)`),await this.start())}registerCommands(){this.disposables.push($.commands.registerCommand("agentide.anywhere.toggle",()=>this.toggle()),$.commands.registerCommand("agentide.anywhere.install",()=>this.install()),$.commands.registerCommand("agentide.anywhere.uninstall",()=>this.uninstall()),$.commands.registerCommand("agentide.anywhere.start",()=>this.start()),$.commands.registerCommand("agentide.anywhere.stop",()=>this.stop()),$.commands.registerCommand("agentide.anywhere.status",()=>this.showStatus()),$.commands.registerCommand("agentide.anywhere.openConfig",()=>this.openConfig()),$.commands.registerCommand("agentide.anywhere.connect",()=>this.connectBridge()),$.commands.registerCommand("agentide.anywhere.disconnect",()=>this.disconnectBridge()),$.commands.registerCommand("agentide.anywhere.openWebUI",()=>this.openWebUI()),$.commands.registerCommand("agentide.anywhere.detect",()=>this.detect()),$.commands.registerCommand("agentide.anywhere.meetAgent",()=>this.showMeetAgentPicker()))}setBridgeConnected(e){this._bridgeConnected=e,$.commands.executeCommand("setContext","agentide.anywhere.connected",e)}registerConfigWatcher(){this.disposables.push($.workspace.onDidChangeConfiguration(e=>{e.affectsConfiguration("agentide.anywhere")&&this.initializeLazy()}))}async toggle(){if(!this.getConfig("hidden",!1)){if(this._gatewayInstallInProgress){await this.showGatewayInstallInProgressPrompt();return}if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting");let n=Date.now();n-this._lastStartInProgressNoticeAt>4e3&&(this._lastStartInProgressNoticeAt=n,$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Starting gateway... please wait.`));return}switch(this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._status){case"error":{this._lastDetection?.installed===!0?await this.showDisconnectedQuickMenu():await this.showNotInstalledQuickMenu();break}case"starting":case"stopping":$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Operation in progress...`);break;case"running":this._bridgeConnected?await this.showConnectedQuickMenu():await this.showDisconnectedQuickMenu();break;case"installed":await this.showDisconnectedQuickMenu();break;case"not-installed":default:{if(this._lastDetection?.installed===!0){await this.showDisconnectedQuickMenu();break}await this.showNotInstalledQuickMenu();break}}}}queueBackgroundDetect(e){this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||setTimeout(()=>{this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||this.detect().catch(n=>{this.log(`Background detect failed after ${e}: ${n instanceof Error?n.message:String(n)}`)})},100)}async showConnectedQuickMenu(){let n=this._hasConfiguredChannelsCache??await this.refreshHasConfiguredChannels()?"Meet at...":"Web UI",r=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL} is running (bridge: connected).`,n,"Disconnect","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening connected menu"),this.refreshHasConfiguredChannels(),await r){case"Meet at...":await this.showMeetAgentPicker();break;case"Web UI":await this.openWebUI();break;case"Disconnect":await this.disconnectBridge();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showDisconnectedQuickMenu(){let e=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Disconnected.`,"Connect","Reinstall","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening disconnected menu"),await e){case"Connect":await this.start(),this._status==="running"&&(await this.connectBridge(),this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._bridgeConnected&&await this.showConnectedQuickMenu());break;case"Reinstall":await this.install();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showGatewayInstallInProgressPrompt(){await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Install in progress. Follow the "${U.AGENT_ANYWHERE_LABEL} Setup" terminal; when it finishes, status updates automatically.`,"Show Setup Terminal","OK")==="Show Setup Terminal"&&(this.revealInstallSetupTerminal()||await this.showMissingInstallSetupTerminalPrompt())}async showMissingInstallSetupTerminalPrompt(){(await this.reconcileInstallProgressState())?.installed?$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Install completed. Status has been refreshed.`):$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Setup terminal is no longer available. Install did not complete; run Install again to relaunch setup.`)}async showGatewayUninstallInProgressPrompt(){await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall in progress. Follow the "${ro}" terminal; when it finishes, status updates automatically.`,"Show Uninstall Terminal","OK")==="Show Uninstall Terminal"&&(this.revealUninstallSetupTerminal()||await this.showMissingUninstallSetupTerminalPrompt())}async showMissingUninstallSetupTerminalPrompt(){let e=await this.reconcileUninstallProgressState();e&&!e.installed&&!e.running?$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall completed. Status has been refreshed.`):$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall terminal is no longer available. Uninstall may still be running or did not complete; run Status to confirm.`)}revealInstallSetupTerminal(){let e=this._installSetupTerminal??$.window.terminals.find(n=>n.name===ia||n.name.startsWith(`${ia} `))??null;return e?(this._installSetupTerminal=e,e.show(),!0):!1}revealUninstallSetupTerminal(){let e=this._uninstallSetupTerminal??$.window.terminals.find(n=>n.name===ro||n.name.startsWith(`${ro} `))??null;return e?(this._uninstallSetupTerminal=e,e.show(),!0):!1}async reconcileInstallProgressState(){if(!this._gatewayInstallInProgress)return this._lastDetection;if(this.revealInstallSetupTerminal())return this._lastDetection;if(await this.sleep(2e3),this.revealInstallSetupTerminal())return this._lastDetection;(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw");let e=await this.detectGatewayState(this.getGatewayPort());return this._lastDetection=e,e.running?this.finishInstallUiState("running","terminal reconciliation"):e.installed?this.finishInstallUiState("installed","terminal reconciliation"):(this.log("Setup terminal closed before gateway install was detected"),this.setInstallProgressFlag(!1,"terminal reconciliation"),this._installProgressMessage=void 0,this.setStatus("not-installed")),e}finishInstallUiState(e,n){this.setInstallProgressFlag(!1,n),this._installProgressMessage=void 0,this.setStatus(e)}readInstallStatusSnapshot(){return D1()}getInstallProgressSummary(e){return M1(e)}async detectGatewayState(e){return Gu(e)}async detectGatewayFastState(e){return gh(e)}async probeGatewayPort(e){return(0,De.probePort)(e)}isStartedGatewayProcessAlive(e){return e!==void 0&&(0,De.isProcessRunning)(e)}getStartupTimeoutMs(){return b1}getStartupCheckIntervalMs(){return 500}getStartupLaunchGraceMs(){return _e?15e3:0}getUninstallInitialDelayMs(){return _e?2e3:3e3}getUninstallVerificationTimeoutMs(){return _e?15e3:9e4}getUninstallCheckIntervalMs(){return _e?1e3:4e3}async sleep(e){await new Promise(n=>setTimeout(n,e))}isWindowsLaunch(){return _e}async stopExistingGatewayBeforeStart(e){await QT(e,n=>this.log(n))}getGatewayLockPathForConfig(){let e=(0,oh.createHash)("sha256").update(this.configPath).digest("hex").slice(0,8);return z.join(_s.tmpdir(),"openclaw",`gateway.${e}.lock`)}async removeStaleGatewayLockBeforeStart(e){if(!_e)return;let n=this.getGatewayLockPathForConfig();if(!B.existsSync(n))return;if(await this.probeGatewayPort(e)){this.log(`Gateway lock present but port ${e} is open; leaving lock in place.`);return}let r=Number.POSITIVE_INFINITY;try{let s=await B.promises.stat(n);r=Date.now()-s.mtimeMs}catch(s){this.log(`Could not stat gateway lock before start: ${s instanceof Error?s.message:String(s)}`);return}if(r<v1){this.log(`Gateway lock is only ${Math.round(r/1e3)}s old; not removing (possible concurrent start still binding).`);return}try{B.rmSync(n,{force:!0}),this.log(`Removed stale gateway lock before start (${Math.round(r/1e3)}s old): ${n}`)}catch(s){this.log(`Could not remove stale gateway lock before start: ${s instanceof Error?s.message:String(s)}`)}}async writeGatewayPidRecord(e,n,r){await G1(e,n,r)}async reconcileUninstallProgressState(){if(!this._gatewayUninstallInProgress)return this._lastDetection;if(this.revealUninstallSetupTerminal())return this._lastDetection;let e=await Gu(this.getGatewayPort());return this._lastDetection=e,this._gatewayUninstallInProgress=!1,e.running?this.setStatus("running"):e.installed?this.setStatus("installed"):this.setStatus("not-installed"),e}async showNotInstalledQuickMenu(){let e=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Reach your AgentHippo IDE or CLI agents from WhatsApp, Telegram, Slack, Discord, and more - right from your phone or any messaging app. This will also install OpenClaw fork on your computer.`,"Install","Ask Agent Hippo");switch(this.queueBackgroundDetect("opening not-installed menu"),await e){case"Install":await this.install();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showMaintenanceQuickMenu(){let e=this._status==="running"||this._status==="installed"||this._lastDetection?.installed===!0,r=[...this._status==="running"&&this._hasConfiguredChannelsCache===!0?["Web UI"]:[],"Config","Reset auth","Reset mappings",...e?["Restart"]:[],"Uninstall"],s=$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: More options`,...r);switch(this.queueBackgroundDetect("opening maintenance menu"),await s){case"Web UI":await this.openWebUI();break;case"Config":await this.openConfig();break;case"Reset auth":await this.resetAuth();break;case"Reset mappings":await $.commands.executeCommand("agentide.gateway.resetMappings");break;case"Restart":await this.restartGateway();break;case"Uninstall":await this.uninstall();break}}async refreshHasConfiguredChannels(){let e=this._bridgeRef;if(!e?.request)return this._hasConfiguredChannelsCache??!1;try{let{rows:n}=await(0,lh.fetchMeetAgentChannelContext)(e.request.bind(e));this._hasConfiguredChannelsCache=n.length>0}catch(n){this.log(`channels.status probe failed (non-fatal): ${n instanceof Error?n.message:String(n)}`),this._hasConfiguredChannelsCache??=!1}return this._hasConfiguredChannelsCache}async openAskAgentHippoChat(){await $.commands.executeCommand("workbench.action.chat.newChat",{agentMode:!0}),await $.commands.executeCommand("workbench.action.chat.open",{mode:"agent",query:"use openclaw skill as needed.",isPartialQuery:!0})}async showMeetAgentPicker(e){if(!this._bridgeRef?.request){$.window.showWarningMessage("Not connected to gateway.");return}let n=this._bridgeRef.request.bind(this._bridgeRef),r=!1,s=async(i,o)=>{try{return await n(i,o)}catch(a){let c=a instanceof Error?a.message:String(a);if(!r&&(0,E1.isGatewayScopeAuthError)(c)){if(r=!0,this.log(`Gateway denied RPC (${c}); reconnecting with fresh handshake...`),await this.disconnectBridge(),await this.connectBridge(),!this._bridgeRef?.request)throw a;return await this._bridgeRef.request(i,o)}throw a}};try{this.log("Meet Agent: fetching channels.status...");let{rows:i,statusPayload:o}=await(0,lh.fetchMeetAgentChannelContext)(s);if(this.log(`Meet Agent: got ${i?.length??0} channel(s): ${i?.map(p=>p.id).join(", ")??"none"}`),!i||i.length===0){let p=await $.window.showInformationMessage("No messaging channels (Telegram, WhatsApp, etc.) are configured. You can chat with your agent in the Gateway Web UI, or set up channels in OpenClaw config.","Open Web UI","Open Config");p==="Open Web UI"?await this.openWebUI():p==="Open Config"&&await this.openConfig();return}let a=e??await this.getFirstRegisteredAgentId();if(!a){$.window.showWarningMessage("No agent registered with the gateway.");return}let l=(await s("agents.list")).external?.find(p=>p.id.toLowerCase()===a.toLowerCase()),u=new Set(l?.boundChannels?.map(p=>p.toLowerCase())??[]),f=i.map(p=>({channelId:p.id,label:p.label,description:p.connected?"connected":"offline",detail:p.accounts.length>1?`Accounts: ${p.accounts.join(", ")}`:void 0,picked:u.has(p.id.toLowerCase())})),d=await $.window.showQuickPick(f,{canPickMany:!0,title:`Meet ${a} at...`,placeHolder:"Select channels where people can reach this agent"});if(!d)return;let g=d.map(p=>p.channelId);if(await(0,lh.applyAgentChannelBindingsViaConfigPatch)(s,{agentId:a,selectedChannelIds:g,statusPayload:o}),g.length===0)$.window.showInformationMessage(`${a}: all channel bindings removed.`);else{let p=d.map(_=>_.label).join(", ");$.window.showInformationMessage(`${a} can now be reached at: ${p}`)}}catch(i){this.log(`Meet Agent picker failed: ${i}`),$.window.showErrorMessage(`Failed to configure channels: ${i instanceof Error?i.message:String(i)}`)}}async getFirstRegisteredAgentId(){if(this._bridgeRef?.request)try{return(await this._bridgeRef.request("agents.list")).external?.[0]?.id}catch{return}}async detect(){let e=this.getGatewayPort(),r=await Gu(e);return this._gatewayInstallInProgress||this._gatewayUninstallInProgress?(this._lastDetection=r,r):this._startInFlight&&this._status==="starting"?(this._lastDetection=r,r):(!r.running&&r.installed&&(await this.hasGlobalNpmOpenclawTree()||(r={...r,installed:!1})),this._lastDetection=r,r.running?this.setStatus("running"):r.installed?this.setStatus("installed"):this.setStatus("not-installed"),r)}async install(){let e=this.getConfig("installSource",""),n=this.getGatewayPort();if(!e)return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Install source not configured. Set "${(0,uh.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in settings.`),!1;let r=(0,bt.validateAnywhereInstallSource)(e);if(!r.ok)return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Refusing to install from "${e}" \u2014 ${r.reason}. Fix "${(0,uh.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in your user settings.`),this.log(`Rejected installSource (${r.reason}): ${e}`),!1;if(this._gatewayInstallInProgress)return await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Install is already in progress. Watch the "${U.AGENT_ANYWHERE_LABEL} Setup" terminal.`,"Show Setup Terminal","OK")==="Show Setup Terminal"&&(this.revealInstallSetupTerminal()||await this.showMissingInstallSetupTerminalPrompt()),!1;this.setInstallProgressFlag(!0,"install command started");try{this.log(`Installing gateway from: ${e}`),(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw"),this.setStatus("starting"),this.stopHealthChecks();let s=await this.detectGatewayState(n);this._lastDetection=s,s.running&&(this.log("Stopping gateway before install..."),await this.disconnectBridge(),await this.stop());let i=_e?"setup-gateway.ps1":"setup-gateway.sh",a=[z.join(__dirname,"..","..","scripts","gateway",i),z.join(__dirname,"..","scripts","gateway",i)].find(h=>B.existsSync(h)),l=[z.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5"),z.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5")].find(h=>B.existsSync(h)),u,f={...dh(),[bt.ANYWHERE_INSTALL_SOURCE_ENV]:e,...a?{[bt.ANYWHERE_SETUP_SCRIPT_ENV]:a}:{},...l?{[bt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}};if(a&&_e){let h=[`-Source $env:${bt.ANYWHERE_INSTALL_SOURCE_ENV}`];l&&h.push(`-ConfigTemplate $env:${bt.ANYWHERE_CONFIG_TEMPLATE_ENV}`);let y=`& $env:${bt.ANYWHERE_SETUP_SCRIPT_ENV} ${h.join(" ")}; Write-Host ""; Write-Host "You can close this window."`;u={name:ia,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",y],env:{[bt.ANYWHERE_INSTALL_SOURCE_ENV]:e,[bt.ANYWHERE_SETUP_SCRIPT_ENV]:a,...l?{[bt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}}}}else if(a){let h=[`--source "$${bt.ANYWHERE_INSTALL_SOURCE_ENV}"`];l&&h.push(`--config-template "$${bt.ANYWHERE_CONFIG_TEMPLATE_ENV}"`);let E=`${`bash "$${bt.ANYWHERE_SETUP_SCRIPT_ENV}" ${h.join(" ")}`}; echo ""; echo "Press Enter to close..."; read`;u={name:ia,shellPath:Du(),shellArgs:Lu(E),env:f}}else{this.log("Setup script not found, falling back to npm install");let y=`${`npm install -g "$${bt.ANYWHERE_INSTALL_SOURCE_ENV}"`}; echo ""; echo "Press Enter to close..."; read`;u=_e?{name:ia,shellPath:"cmd.exe",shellArgs:["/c",`npm install -g "%${bt.ANYWHERE_INSTALL_SOURCE_ENV}%" && echo. && echo Setup complete. && pause`],env:{[bt.ANYWHERE_INSTALL_SOURCE_ENV]:e}}:{name:ia,shellPath:Du(),shellArgs:Lu(y),env:f}}try{B.rmSync(hh,{force:!0})}catch{}this._installProgressMessage="Launching setup...",this.updateStatusBar("starting");let d=$.window.createTerminal(u);this._installSetupTerminal=d,d.show();let g=O1(e)?10*6e4:12e4;this.log(`Waiting up to ${Math.round(g/6e4)} minute(s) for gateway install completion...`);let p=_e&&!!a;return await $.window.withProgress({location:$.ProgressLocation.Window,title:`${U.AGENT_ANYWHERE_LABEL}: Installing gateway...`,cancellable:!1},async h=>{let y=Date.now()+g,E=0;for(;Date.now()<y;){if(!this._gatewayInstallInProgress)return this.log("Gateway install wait aborted \u2014 setup terminal closed before completion was detected"),!1;let w=this.readInstallStatusSnapshot(),A=this.getInstallProgressSummary(w);this._installProgressMessage=A.message,this.updateStatusBar("starting");let S=Math.max(0,A.percent-E);if(h.report({message:A.message,increment:S}),E=Math.max(E,A.percent),w?.phase==="failed")return this.log(`Gateway install failed: ${w.lastError||w.message||"unknown error"}`),!1;(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw");let C=await this.detectGatewayState(n);if(this._lastDetection=C,p?L1(w)&&C.installed:C.installed)return this.log("Gateway installed successfully"),await this.ensureManagedGatewayWrapperState(C.binaryPath),await this.ensureWebUIBuilt(C.binaryPath),this.writeStarterConfig(),await $.workspace.getConfiguration("agentide.anywhere").update("enabled",!0,$.ConfigurationTarget.Global),C.running?(this.finishInstallUiState("running","success"),h.report({message:`Install complete. Gateway is running on port ${n}.`,increment:Math.max(0,100-E)})):(this.finishInstallUiState("installed","success"),h.report({message:"Install complete. Gateway is installed. Click Agent Anywhere to start.",increment:Math.max(0,100-E)})),$.window.showInformationMessage(C.running?`${U.AGENT_ANYWHERE_LABEL}: Installed and running. Open the config to add your channels or use the status bar to connect.`:`${U.AGENT_ANYWHERE_LABEL}: Installed. Open the config to add your channels, then click Agent Anywhere to start.`,"Open Config").then(async P=>{P==="Open Config"&&await this.openConfig()}),!0;await new Promise(I=>setTimeout(I,1e3))}return!1})?!0:(this.log("Gateway install timed out or failed"),this.finishInstallUiState("error","failure"),!1)}catch(s){return this.log(`Install failed: ${s instanceof Error?s.message:String(s)}`),this.finishInstallUiState("error","failure"),!1}finally{this._gatewayInstallInProgress&&(this.setInstallProgressFlag(!1,"finally"),this._installProgressMessage=void 0),this.updateStatusBar(this._status)}}async uninstall(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}await this.stop();let e=_e?"setup-gateway.ps1":"setup-gateway.sh",r=[z.join(__dirname,"..","scripts","gateway",e),z.join(__dirname,"..","..","scripts","gateway",e)].find(i=>B.existsSync(i)),s;if(r&&_e){let i=`& "${r}" -Uninstall; Write-Host ""; Write-Host "You can close this window."`;s={name:ro,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",i]}}else if(r){let o=`${`bash "${r}" --uninstall`}; echo ""; echo "Press Enter to close..."; read`;s={name:ro,shellPath:Du(),shellArgs:Lu(o),env:dh()}}else{let i="npm uninstall -g openclaw",o=`${i}; echo ""; echo "Press Enter to close..."; read`;s=_e?{name:ro,shellPath:"cmd.exe",shellArgs:["/c",`${i} && echo. && pause`]}:{name:ro,shellPath:Du(),shellArgs:Lu(o),env:dh()}}this._gatewayUninstallInProgress=!0,this.setStatus("stopping");try{let i=$.window.createTerminal(s);this._uninstallSetupTerminal=i,i.show(),this.log("Gateway uninstall started in terminal"),(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw"),await this.sleep(this.getUninstallInitialDelayMs());let o=Date.now()+this.getUninstallVerificationTimeoutMs(),a,c=!0;for(;Date.now()<o;){(0,De.clearBinaryCache)(hs),(0,De.clearBinaryCache)("openclaw");let l=await this.detectGatewayState(this.getGatewayPort());if(a=l,this._lastDetection=l,c=await this.hasGlobalNpmOpenclawTree(),!c&&!l.running){HT(),this.setStatus("not-installed"),l.installed?this.log("Managed OpenClaw npm package removed; another OpenClaw binary remains on PATH (likely external/self-updated)."):this.log("Global OpenClaw package removed (or no longer detected).");return}if(!l.installed){HT(),this.setStatus("not-installed"),this.log("Global OpenClaw package removed (or no longer detected).");return}await this.sleep(this.getUninstallCheckIntervalMs())}!c&&a?.running?$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Managed package was removed, but the gateway listener still appears to be running. Finish the terminal command or run Status.`):$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Uninstall is still verifying managed package removal. Finish the terminal command or run Status.`)}finally{this._gatewayUninstallInProgress=!1,this.updateStatusBar(this._status)}}get configPath(){return z.join(_s.homedir(),".openclaw","openclaw.json")}writeStarterConfig(){let e=z.dirname(this.configPath);if(B.existsSync(this.configPath)){this.log("Config already exists, skipping starter config");return}let r=[z.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5"),z.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5")].find(o=>B.existsSync(o));if(!r){this.log("Starter config template not found, skipping");return}B.mkdirSync(e,{recursive:!0,mode:448});let s=B.readFileSync(r,"utf-8"),i=`ah-${(0,oh.randomBytes)(24).toString("hex")}`;s=s.replace("__GENERATED_TOKEN__",i),B.writeFileSync(this.configPath,s,{encoding:"utf-8",mode:_e?void 0:384}),this.log(`Wrote starter config to ${this.configPath}`)}async openConfig(){B.existsSync(this.configPath)||this.writeStarterConfig();let e=await $.workspace.openTextDocument(this.configPath);await $.window.showTextDocument(e)}async preflightChannelSecrets(e){let n;try{n=B.readFileSync(this.configPath,"utf-8")}catch{return"continue"}let r=(0,ch.parseStrictJsonConfig)(n);if(r===void 0)return"continue";let s=(0,ch.collectMissingChannelEnvSecrets)(r,e);if(s.length===0)return"continue";let i=(0,ah.getAgentHomeEnvFilePath)(),o=s.map(f=>f.channel).join(", "),a=[...new Set(s.flatMap(f=>f.envVars))];this.log(`Channel secrets preflight: ${o} missing ${a.join(", ")}`);let c=`Disable ${o} & Start`,l="Add Secrets",u=await $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: The ${o} channel needs ${a.join(", ")}, which ${a.length===1?"is":"are"} not set in ${i} or the IDE environment. Add the secret${a.length===1?"":"s"} or disable the channel to start the gateway.`,c,l);if(u===c){let f=(0,ch.disableChannelsInConfigText)(n,s.map(g=>g.channel));if(!f)return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath}. Set "enabled": false on the ${o} channel manually, then start again.`),"abort";let d=`${this.configPath}.bak-missing-secrets`;try{B.copyFileSync(this.configPath,d),B.writeFileSync(this.configPath,f,{encoding:"utf-8",mode:_e?void 0:384})}catch(g){let p=g instanceof Error?g.message:String(g);return $.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath} (${p}).`),"abort"}return this.log(`Disabled channels missing secrets: ${o} (backup: ${d})`),$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Disabled the ${o} channel (backup: ${z.basename(d)}). To re-enable: add ${a.join(", ")} to ${i}, set "enabled": true in the config, then restart the gateway.`),"continue"}return u===l&&await this.openEnvFileWithSecretStubs(i,a),"abort"}async openEnvFileWithSecretStubs(e,n){try{let r="";try{r=B.readFileSync(e,"utf-8")}catch{}let s=n.filter(o=>!new RegExp(`^\\s*#?\\s*${o}=`,"m").test(r));if(s.length){let o=r.length&&!r.endsWith(`
682
682
  `)?`
683
683
  `:"",a=[`# Added by ${U.AGENT_ANYWHERE_LABEL} \u2014 fill in, then start the gateway again.`,...s.map(c=>`${c}=`)].join(`
684
684
  `);B.writeFileSync(e,`${r}${o}${a}
685
- `,{encoding:"utf-8",mode:_e?void 0:384})}let i=await $.workspace.openTextDocument($.Uri.file(e));await $.window.showTextDocument(i,{preview:!1})}catch(r){let s=r instanceof Error?r.message:String(r);$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not open ${e} (${s}).`)}}async startGatewayViaHiddenWindowsProcess(e,n,r,s,i){let o=(0,_1.buildWindowsArgumentLine)(n),a=o.length>0?` -ArgumentList '${Mu(o)}'`:"",c=[`$proc = Start-Process -FilePath '${Mu(e)}' -WindowStyle Hidden${a} -RedirectStandardOutput '${Mu(r)}' -RedirectStandardError '${Mu(s)}' -PassThru`,"Write-Output $proc.Id"].join("; ");return new Promise(l=>{let u="",d="",f=(0,Uu.spawn)("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-Command",c],{windowsHide:!0,env:i});f.stdout.on("data",p=>{u+=p.toString()}),f.stderr.on("data",p=>{d+=p.toString()}),f.once("error",p=>{this.log(`Gateway hidden Windows launcher failed to spawn: ${p}`),l(void 0)}),f.once("exit",p=>{if(p!==0){let _=d.trim()||u.trim();this.log(`Gateway hidden Windows launcher exited with code ${p}${_?`: ${_}`:""}`),l(void 0);return}let g=parseInt(u.trim(),10);if(!Number.isNaN(g)){this.log(`Gateway hidden Windows process started (PID: ${g})`),l(g);return}this.log("Gateway hidden Windows launcher did not return a PID"),l(void 0)})})}async start(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting"),await this._startInFlight;return}this.setStatus("starting");let e=this.doStart();this._startInFlight=e;try{await e}finally{this._startInFlight===e&&(this._startInFlight=null)}}async doStart(){let e=this.getGatewayPort(),n=await this.detectGatewayFastState(e);if(n?.running){this.log("Gateway already running (fast check)"),this._lastDetection=n,this.setStatus("running");return}let r=await this.detect(),s=await this.probeGatewayPort(e);if(!r.installed){if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}await $.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Gateway is not installed.`,"Install Now")==="Install Now"?await this.install():this.setStatus("not-installed");return}if(r.running){this.log("Gateway already running"),this.setStatus("running");return}if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}if(!r.binaryPath){this.setStatus("error"),$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Gateway binary not found. Try reinstalling.`);return}let i=r.binaryPath;if(await this.probeGatewayPort(e)&&await ju(e,i)){this.log("Healthy gateway already listening; attaching instead of starting a new one"),this._lastDetection={...r,running:!0},this.setStatus("running");return}await this.stopExistingGatewayBeforeStart(i),await this.removeStaleGatewayLockBeforeStart(e);let o=["gateway","run","--bind","loopback","--port",String(e)];await this.probeGatewayPort(e)&&o.push("--force");let a=i,c=o,l=!1,u=this.isWindowsLaunch();if(u){let h=await this.resolveWindowsManagedGatewayLaunchRuntime(i);if(!h){this.setStatus("installed"),await $.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Windows background start requires managed gateway runtime metadata. Reinstall Agent Anywhere to refresh the launch configuration.`,"Reinstall")==="Reinstall"&&await this.install();return}a=h.nodePath,c=[h.entryScriptPath,...o]}let d=z.dirname(fh);B.mkdirSync(d,{recursive:!0});let f=fh,p=z.join(d,"gateway.error.log");this.log(`Starting gateway: ${a} ${c.join(" ")}`),this.log(`Gateway log: ${f}`);let g=await(0,ah.readGatewayChildProcessEnv)();g.OPENCLAW_NO_RESPAWN="1";for(let h of ah.GATEWAY_SECRET_ENV_KEYS)g[h]?.trim()&&this.log(`Gateway env: ${h} present for child process`);if(await this.preflightChannelSecrets(g)==="abort"){this.setStatus("installed");return}let _;if(u){if(_=await this.startGatewayViaHiddenWindowsProcess(a,c,f,p,g),this.process=null,!_){this.setStatus("error"),await oc(f);return}}else{let h=B.openSync(f,"a");this.process=(0,Uu.spawn)(a,c,{stdio:["ignore",h,h],detached:!0,env:g,shell:l,windowsHide:!0}),B.closeSync(h),this.process.unref(),this.process.on("exit",y=>{this.log(`Gateway process exited with code ${y}`),this.process=null,ph(),!this._startInFlight&&this.setStatus(y!==0&&y!==null?"error":"installed")})}await $.window.withProgress({location:$.ProgressLocation.Window,title:`${U.AGENT_ANYWHERE_LABEL}: Starting gateway...`},async h=>{try{let y=Date.now(),E=this.getStartupTimeoutMs(),w=this.getStartupLaunchGraceMs(),A=this.getStartupCheckIntervalMs(),S=0,C=0,v=!1,I=!1,P=this.process?.pid??_;for(;;){if(await this.probeGatewayPort(e)){this.setStatus("running"),this.log(`Gateway started and ready (${S}ms)`);let ee=this.process?.pid??_;ee&&(await this.writeGatewayPidRecord(ee,e,i),this.log(`PID file written: ${Fu}`)),this.startHealthChecks(e),h.report({message:"Ready!",increment:100});return}let L=this.isStartedGatewayProcessAlive(P);P&&L&&(v=!0),S=Date.now()-y;let N=S<E,O=P!==void 0&&L&&v&&S<E+w,G=!L&&(v||this.process===null);if(P&&G&&!u){this.setStatus("error"),this.log(`Gateway process exited before opening port ${e}`),await oc(f);return}if(P&&v&&!L&&u&&!I&&(I=!0,this.log(`Gateway launch process exited before opening port ${e}; continuing to wait for port readiness`)),!N&&!O)break;let H=Math.max(E+(O?w:0),1),X=Math.min(90,Math.floor(S/H*100)),J=Math.max(0,X-C);C=X;let W=P!==void 0?L?`Gateway launched (PID ${P}), waiting for port ${e}...`:"Waiting for gateway process to initialize...":`Waiting for port ${e}...`;h.report({message:W,increment:J}),await this.sleep(A)}this.setStatus("error"),this.log(`Gateway failed to start within timeout (pid=${P??"n/a"}, alive=${P!==void 0?this.isStartedGatewayProcessAlive(P):!1})`),await oc(f)}catch{this.setStatus("error"),this.log("Gateway failed to start"),await oc(f)}})}async stop(){if(this.stopHealthChecks(),await this.disconnectBridge(),this.process){this.setStatus("stopping"),this.log("Stopping gateway...");let r=this.getGatewayPort(),s=this.process.pid,i=await oa(r),o=[...new Set([s,...i].filter(l=>typeof l=="number"&&l>0))];_e&&s?await Jt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):xT(this.process,s,"SIGTERM"),!await new Promise(l=>{let u=setTimeout(()=>l(!1),5e3);this.process?.once("exit",()=>{clearTimeout(u),l(!0)})})&&this.process&&(this.log("Forcefully killing gateway..."),_e&&s?await Jt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):xT(this.process,s,"SIGKILL")),this.process=null,await ph();let c=await xu(r,o);c||(this.log("Gateway port still held after process exit; reaping listener(s)..."),await wh(r),c=await xu(r,[...o,...await oa(r)])),c?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not free gateway port after stop"),$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not fully stop the gateway. Try stopping it manually.`));return}let e=await this.detect();if(!e.running){this.log("Gateway is not running");return}this.setStatus("stopping"),this.log("Stopping externally started gateway...");let n=await BT(e.port,e.binaryPath,r=>this.log(r));await ph(),n?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not stop gateway process"),$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not stop the gateway. Try stopping it manually.`))}async restartGateway(){let e=this._bridgeRef?.isConnected??!1;await this.disconnectBridge();let n=this._status==="running";n||(n=await(0,De.probePort)(this.getGatewayPort(),"127.0.0.1",250)),n?await this.stop():this.log("Restart requested while gateway is stopped; skipping stop."),await this.start(),e&&this._status==="running"&&await this.connectBridge()}async showStatus(){this.setBridgeConnected(this._bridgeRef?.isConnected??!1);let e=this.getGatewayPort(),n=this._lastDetection??await this.detect(),r=n.running?"\u{1F7E2} Running":n.installed?"\u26AB Stopped":"\u2B1C Not installed",s=this._bridgeConnected?"\u{1F7E2} Connected":"\u26AB Disconnected",i=n.version?` (${n.version})`:"",o=[`Gateway: ${r}${i}`,`Bridge: ${s}`,`Port: ${e}`].join(`
685
+ `,{encoding:"utf-8",mode:_e?void 0:384})}let i=await $.workspace.openTextDocument($.Uri.file(e));await $.window.showTextDocument(i,{preview:!1})}catch(r){let s=r instanceof Error?r.message:String(r);$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not open ${e} (${s}).`)}}async startGatewayViaHiddenWindowsProcess(e,n,r,s,i){let o=(0,_1.buildWindowsArgumentLine)(n),a=o.length>0?` -ArgumentList '${Mu(o)}'`:"",c=[`$proc = Start-Process -FilePath '${Mu(e)}' -WindowStyle Hidden${a} -RedirectStandardOutput '${Mu(r)}' -RedirectStandardError '${Mu(s)}' -PassThru`,"Write-Output $proc.Id"].join("; ");return new Promise(l=>{let u="",f="",d=(0,Uu.spawn)("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-Command",c],{windowsHide:!0,env:i});d.stdout.on("data",g=>{u+=g.toString()}),d.stderr.on("data",g=>{f+=g.toString()}),d.once("error",g=>{this.log(`Gateway hidden Windows launcher failed to spawn: ${g}`),l(void 0)}),d.once("exit",g=>{if(g!==0){let _=f.trim()||u.trim();this.log(`Gateway hidden Windows launcher exited with code ${g}${_?`: ${_}`:""}`),l(void 0);return}let p=parseInt(u.trim(),10);if(!Number.isNaN(p)){this.log(`Gateway hidden Windows process started (PID: ${p})`),l(p);return}this.log("Gateway hidden Windows launcher did not return a PID"),l(void 0)})})}async start(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting"),await this._startInFlight;return}this.setStatus("starting");let e=this.doStart();this._startInFlight=e;try{await e}finally{this._startInFlight===e&&(this._startInFlight=null)}}async doStart(){let e=this.getGatewayPort(),n=await this.detectGatewayFastState(e);if(n?.running){this.log("Gateway already running (fast check)"),this._lastDetection=n,this.setStatus("running");return}let r=await this.detect(),s=await this.probeGatewayPort(e);if(!r.installed){if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}await $.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Gateway is not installed.`,"Install Now")==="Install Now"?await this.install():this.setStatus("not-installed");return}if(r.running){this.log("Gateway already running"),this.setStatus("running");return}if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}if(!r.binaryPath){this.setStatus("error"),$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Gateway binary not found. Try reinstalling.`);return}let i=r.binaryPath;if(await this.probeGatewayPort(e)&&await ju(e,i)){this.log("Healthy gateway already listening; attaching instead of starting a new one"),this._lastDetection={...r,running:!0},this.setStatus("running");return}await this.stopExistingGatewayBeforeStart(i),await this.removeStaleGatewayLockBeforeStart(e);let o=["gateway","run","--bind","loopback","--port",String(e)];await this.probeGatewayPort(e)&&o.push("--force");let a=i,c=o,l=!1,u=this.isWindowsLaunch();if(u){let h=await this.resolveWindowsManagedGatewayLaunchRuntime(i);if(!h){this.setStatus("installed"),await $.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Windows background start requires managed gateway runtime metadata. Reinstall Agent Anywhere to refresh the launch configuration.`,"Reinstall")==="Reinstall"&&await this.install();return}a=h.nodePath,c=[h.entryScriptPath,...o]}let f=z.dirname(fh);B.mkdirSync(f,{recursive:!0});let d=fh,g=z.join(f,"gateway.error.log");this.log(`Starting gateway: ${a} ${c.join(" ")}`),this.log(`Gateway log: ${d}`);let p=await(0,ah.readGatewayChildProcessEnv)();p.OPENCLAW_NO_RESPAWN="1";for(let h of ah.GATEWAY_SECRET_ENV_KEYS)p[h]?.trim()&&this.log(`Gateway env: ${h} present for child process`);if(await this.preflightChannelSecrets(p)==="abort"){this.setStatus("installed");return}let _;if(u){if(_=await this.startGatewayViaHiddenWindowsProcess(a,c,d,g,p),this.process=null,!_){this.setStatus("error"),await oc(d);return}}else{let h=B.openSync(d,"a");this.process=(0,Uu.spawn)(a,c,{stdio:["ignore",h,h],detached:!0,env:p,shell:l,windowsHide:!0}),B.closeSync(h),this.process.unref(),this.process.on("exit",y=>{this.log(`Gateway process exited with code ${y}`),this.process=null,ph(),!this._startInFlight&&this.setStatus(y!==0&&y!==null?"error":"installed")})}await $.window.withProgress({location:$.ProgressLocation.Window,title:`${U.AGENT_ANYWHERE_LABEL}: Starting gateway...`},async h=>{try{let y=Date.now(),E=this.getStartupTimeoutMs(),w=this.getStartupLaunchGraceMs(),A=this.getStartupCheckIntervalMs(),S=0,C=0,b=!1,I=!1,P=this.process?.pid??_;for(;;){if(await this.probeGatewayPort(e)){this.setStatus("running"),this.log(`Gateway started and ready (${S}ms)`);let ee=this.process?.pid??_;ee&&(await this.writeGatewayPidRecord(ee,e,i),this.log(`PID file written: ${Fu}`)),this.startHealthChecks(e),h.report({message:"Ready!",increment:100});return}let L=this.isStartedGatewayProcessAlive(P);P&&L&&(b=!0),S=Date.now()-y;let N=S<E,O=P!==void 0&&L&&b&&S<E+w,G=!L&&(b||this.process===null);if(P&&G&&!u){this.setStatus("error"),this.log(`Gateway process exited before opening port ${e}`),await oc(d);return}if(P&&b&&!L&&u&&!I&&(I=!0,this.log(`Gateway launch process exited before opening port ${e}; continuing to wait for port readiness`)),!N&&!O)break;let H=Math.max(E+(O?w:0),1),X=Math.min(90,Math.floor(S/H*100)),J=Math.max(0,X-C);C=X;let W=P!==void 0?L?`Gateway launched (PID ${P}), waiting for port ${e}...`:"Waiting for gateway process to initialize...":`Waiting for port ${e}...`;h.report({message:W,increment:J}),await this.sleep(A)}this.setStatus("error"),this.log(`Gateway failed to start within timeout (pid=${P??"n/a"}, alive=${P!==void 0?this.isStartedGatewayProcessAlive(P):!1})`),await oc(d)}catch{this.setStatus("error"),this.log("Gateway failed to start"),await oc(d)}})}async stop(){if(this.stopHealthChecks(),await this.disconnectBridge(),this.process){this.setStatus("stopping"),this.log("Stopping gateway...");let r=this.getGatewayPort(),s=this.process.pid,i=await oa(r),o=[...new Set([s,...i].filter(l=>typeof l=="number"&&l>0))];_e&&s?await Jt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):xT(this.process,s,"SIGTERM"),!await new Promise(l=>{let u=setTimeout(()=>l(!1),5e3);this.process?.once("exit",()=>{clearTimeout(u),l(!0)})})&&this.process&&(this.log("Forcefully killing gateway..."),_e&&s?await Jt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):xT(this.process,s,"SIGKILL")),this.process=null,await ph();let c=await xu(r,o);c||(this.log("Gateway port still held after process exit; reaping listener(s)..."),await wh(r),c=await xu(r,[...o,...await oa(r)])),c?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not free gateway port after stop"),$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not fully stop the gateway. Try stopping it manually.`));return}let e=await this.detect();if(!e.running){this.log("Gateway is not running");return}this.setStatus("stopping"),this.log("Stopping externally started gateway...");let n=await BT(e.port,e.binaryPath,r=>this.log(r));await ph(),n?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not stop gateway process"),$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not stop the gateway. Try stopping it manually.`))}async restartGateway(){let e=this._bridgeRef?.isConnected??!1;await this.disconnectBridge();let n=this._status==="running";n||(n=await(0,De.probePort)(this.getGatewayPort(),"127.0.0.1",250)),n?await this.stop():this.log("Restart requested while gateway is stopped; skipping stop."),await this.start(),e&&this._status==="running"&&await this.connectBridge()}async showStatus(){this.setBridgeConnected(this._bridgeRef?.isConnected??!1);let e=this.getGatewayPort(),n=this._lastDetection??await this.detect(),r=n.running?"\u{1F7E2} Running":n.installed?"\u26AB Stopped":"\u2B1C Not installed",s=this._bridgeConnected?"\u{1F7E2} Connected":"\u26AB Disconnected",i=n.version?` (${n.version})`:"",o=[`Gateway: ${r}${i}`,`Bridge: ${s}`,`Port: ${e}`].join(`
686
686
  `);if(!n.installed){await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}
687
687
  ${o}`,"Set Up")==="Set Up"&&await this.install();return}if(!n.running){switch(await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}
688
688
  ${o}`,"Connect","Config","Uninstall")){case"Connect":await this.start(),this._status==="running"&&await this.connectBridge();break;case"Config":await this.openConfig();break;case"Uninstall":await this.uninstall();break}return}switch(await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}
689
689
  ${o}`,"Web UI","Config","Restart","Reset auth","Uninstall")){case"Web UI":await this.openWebUI();break;case"Config":await this.openConfig();break;case"Restart":await this.restartGateway();break;case"Reset auth":await this.resetAuth();break;case"Uninstall":await this.uninstall();break}}async resetAuth(){try{B.existsSync(this.configPath)||this.writeStarterConfig();let n=B.readFileSync(this.configPath,"utf-8").replace(/^\s*\/\/.*$/gm,"").replace(/,\s*([}\]])/g,"$1"),r=JSON.parse(n);(!r.gateway||typeof r.gateway!="object")&&(r.gateway={}),(!r.gateway.auth||typeof r.gateway.auth!="object")&&(r.gateway.auth={});let s=`ah-${(0,oh.randomBytes)(24).toString("hex")}`;r.gateway.auth.token=s,B.writeFileSync(this.configPath,`${JSON.stringify(r,null,2)}
690
690
  `,{encoding:"utf-8",mode:_e?void 0:384}),await $.workspace.getConfiguration("agentide.gateway").update("token",s,$.ConfigurationTarget.Global),await this.restartGateway(),$.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Auth reset; gateway restarted. If you use the Web UI, paste the new token in Control UI settings.`)}catch(e){this.log(`Failed to reset auth: ${e instanceof Error?e.message:String(e)}`),$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Failed to reset auth. Open Config to update it manually.`)}}async connectBridge(){if(!this._bridgeRef){this.log("Bridge ref not set -- cannot connect");return}if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._bridgeRef.isConnected){this.log("Bridge already connected");return}let e=this.getGatewayPort();if(await(0,De.probePort)(e)&&!await ju(e,this._lastDetection?.binaryPath)&&(!await this.promptNonManagedPortTakeover(e,"connect")||await(0,De.probePort)(e))){this._status==="running"&&this.setStatus("installed");return}let n=this._status==="running";if(!n){let c=await gh(e);c?.running&&(n=!0,this._lastDetection=c,this.setStatus("running"))}if(!n){let c=await this.detect();if(!c.running){if(!c.installed){await $.window.showInformationMessage(`${U.AGENT_ANYWHERE_LABEL}: Reach your AgentHippo IDE or CLI agents from WhatsApp, Telegram, Slack, Discord, and more - right from your phone or any messaging app. This will also install OpenClaw fork on your computer.`,"Set Up Agent Anywhere")==="Set Up Agent Anywhere"&&await this.install();return}if(await this.start(),!(await this.detect()).running){this.log("Gateway failed to start, cannot connect"),await oc(fh);return}}}let r=$.workspace.getConfiguration("agentide.gateway"),s=r.get("url","").trim();s||(s=`ws://127.0.0.1:${e}`,await r.update("url",s,$.ConfigurationTarget.Global));let i=/127\.0\.0\.1|localhost|\[::1\]/i.test(s),o=this.readGatewayToken();o&&i&&(await r.update("token",o,$.ConfigurationTarget.Global),this.log("Gateway token applied from openclaw.json (user scope)")),await this._bridgeRef.connect(),this.setBridgeConnected(this._bridgeRef.isConnected),await(0,De.probePort)(e)?this._status!=="running"&&this.setStatus("running"):this._status!=="installed"&&this.setStatus("installed"),this.updateStatusBar(this._status),this.log("Bridge connected")}async disconnectBridge(){this._bridgeRef&&(await this._bridgeRef.disconnect(),this.setBridgeConnected(!1),this.updateStatusBar(this._status),this.log("Bridge disconnected"))}async openWebUI(){let e=this.getGatewayPort();if(!(this._status==="running"||await(0,De.probePort)(e))){await $.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Gateway is not running. Start it first to use the web UI.`,"Start Now")==="Start Now"&&await this.start();return}let r=($.workspace.getConfiguration("agentide.gateway").get("token")??"").trim(),s=this.readGatewayToken()??(r||void 0),i=s?`#token=${encodeURIComponent(s)}`:"",o=`http://127.0.0.1:${e}/${i}`;await $.env.openExternal($.Uri.parse(o))}startHealthChecks(e){this.stopHealthChecks(),this.healthCheckTimer=setInterval(async()=>{await(0,De.probePort)(e)||(this.log("Health check failed -- gateway is no longer running"),this.stopHealthChecks(),this.process=null,this.setStatus("installed"))},T1)}stopHealthChecks(){this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null)}async ensureWebUIBuilt(e){if(e)try{let n=Oh(e);if(!n)return;let r=z.join(n,"dist","control-ui","index.html");if(B.existsSync(r))return;this.log("Web UI not built - building now..."),await Jt(_e?"pnpm.cmd ui:build":"pnpm ui:build",{cwd:n,timeout:6e4,env:{...process.env},..._e?{shell:"cmd.exe"}:{}}),this.log("Web UI built successfully")}catch(n){this.log(`Web UI build failed (non-fatal): ${n instanceof Error?n.message:String(n)}`)}}async promptNonManagedPortTakeover(e,n){let r=n==="connect"?"connect Agent Anywhere":"start Agent Anywhere";if(await $.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Port ${e} is in use by a non-managed process. Stop that process and ${r}?`,{modal:!0},"Yes","No")!=="Yes")return this.log(`User declined non-managed port takeover on ${e}`),!1;this.log(`User approved non-managed port takeover on ${e}`);let i=new Set(await oa(e));if(!await BT(e,void 0,a=>this.log(a))){let a=await oa(e);return i.size>0&&a.some(l=>!i.has(l))?$.window.showWarningMessage(`${U.AGENT_ANYWHERE_LABEL}: Port ${e} is held by a self-restarting gateway service. Run \`openclaw daemon uninstall\` to remove it, then try again.`):$.window.showErrorMessage(`${U.AGENT_ANYWHERE_LABEL}: Could not free port ${e}. Stop that process manually and try again.`),!1}return!0}async ensureManagedGatewayWrapperState(e,n=!1){try{let r=io(),s=await Eh(e,r);if(!s)return;let{launcherPath:i,packageRoot:o,nodePath:a,entryScriptPath:c}=s,l=UT(a,c,KT),u;return(n||XT(mh))&&(u=UT(a,c,mh)),I1({...r,nodePath:a,cliPath:i,entryScriptPath:c,packageRoot:o,wrapperPath:l,wrapperDir:bh,openclawWrapperPath:u,updatedAt:new Date().toISOString()}),l}catch(r){this.log(`Managed gateway wrapper setup failed: ${r instanceof Error?r.message:String(r)}`);return}}async resolveWindowsManagedGatewayLaunchRuntime(e){if(!_e)return;await this.ensureManagedGatewayWrapperState(e);let n=await Eh(e);if(n)return{nodePath:n.nodePath,entryScriptPath:n.entryScriptPath}}readGatewayToken(){try{if(!B.existsSync(this.configPath))return;let n=B.readFileSync(this.configPath,"utf-8").replace(/^\s*\/\/.*$/gm,"").replace(/,\s*([}\]])/g,"$1"),s=JSON.parse(n)?.gateway?.auth?.token;return typeof s=="string"&&s.trim()?s.trim():void 0}catch(e){this.log(`Could not read gateway token: ${e}`);return}}setStatus(e){this._status=e,this.updateStatusBar(e),this._onStatusChange.fire(e)}updateStatusBar(e){if(this.getConfig("hidden",!1)){this.statusBarItem.hide();return}switch(e){case"not-installed":this.statusBarItem.text=`$(cloud-download) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${U.AGENT_ANYWHERE_LABEL}: Reach your agents from WhatsApp, Telegram, Slack (click to set up)`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"installed":this.statusBarItem.text=`$(debug-disconnect) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${U.AGENT_ANYWHERE_LABEL}: Installed, not running (click to start)`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"starting":this.statusBarItem.text=`$(sync~spin) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayInstallInProgress?`${U.AGENT_ANYWHERE_LABEL}: ${this._installProgressMessage??"Installing... (see Setup terminal)"}`:`${U.AGENT_ANYWHERE_LABEL}: Starting...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"running":this._bridgeConnected?(this.statusBarItem.text=`$(broadcast) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${U.AGENT_ANYWHERE_LABEL}: Connected (click for options)`,this.statusBarItem.color=new $.ThemeColor("testing.iconPassed")):(this.statusBarItem.text=`$(debug-disconnect) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${U.AGENT_ANYWHERE_LABEL}: Disconnected (click to connect)`,this.statusBarItem.color=void 0),this.statusBarItem.backgroundColor=void 0;break;case"stopping":this.statusBarItem.text=`$(sync~spin) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayUninstallInProgress?`${U.AGENT_ANYWHERE_LABEL}: Uninstalling... (see Uninstall terminal)`:`${U.AGENT_ANYWHERE_LABEL}: Stopping...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"error":this.statusBarItem.text=`$(warning) ${U.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${U.AGENT_ANYWHERE_LABEL}: Error (click for details)`,this.statusBarItem.color=new $.ThemeColor("errorForeground"),this.statusBarItem.backgroundColor=void 0;break}this.statusBarItem.show()}getConfig(e,n){return $.workspace.getConfiguration("agentide.anywhere").get(e,n)}async hasGlobalNpmOpenclawTree(){return(await ac()).length>0}readGatewayPortFromOpenclawJson(){try{if(!B.existsSync(this.configPath))return;let n=B.readFileSync(this.configPath,"utf-8").replace(/^\s*\/\/.*$/gm,"").replace(/,\s*([}\]])/g,"$1"),s=JSON.parse(n)?.gateway?.port;if(typeof s=="number"&&Number.isFinite(s)){let i=Math.floor(s);if(i>=1&&i<=65535)return i}if(typeof s=="string"&&/^\d+$/.test(s)){let i=parseInt(s,10);if(i>=1&&i<=65535)return i}return}catch{return}}getGatewayPort(){let e=this.readGatewayPortFromOpenclawJson();return e!==void 0?e:this.getConfig("port",so)}log(e){this.outputChannel.appendLine(`[${U.AGENT_ANYWHERE_LABEL}] ${e}`)}dispose(){this.stopHealthChecks(),this.process=null,this.statusBarItem.dispose(),this._onStatusChange.dispose();for(let e of this.disposables)e.dispose()}};U.GatewayLifecycleManager=Sh});var nb=T(Ih=>{"use strict";Object.defineProperty(Ih,"__esModule",{value:!0});Ih.anywhereCommand=j1;var Vu=eb(),Es=en(),H1=18789;async function j1(t){switch(t.action?.trim().toLowerCase()){case"status":case"detect":await x1(t);return;case"help":case"usage":case"":case void 0:tb();return;default:console.error(`${Es.COLORS.red}Error:${Es.COLORS.reset} Unsupported action "${t.action}".`),tb(),process.exitCode=1;return}}async function x1(t){let e=t.port??H1;try{let n=await(0,Vu.detectGateway)(e),r=n.running?"Running":n.installed?"Installed":"Not installed",s=n.running?Es.COLORS.green:n.installed?Es.COLORS.yellow:Es.COLORS.red;console.log(`${s}${Vu.AGENT_ANYWHERE_LABEL}:${Es.COLORS.reset} ${r}`),console.log(`Port: ${n.port}`),n.binaryPath&&console.log(`Binary: ${n.binaryPath}`),n.version&&console.log(`Version: ${n.version}`),n.installed||console.log(`${Es.COLORS.dim}Install via the Agent Anywhere UI inside ${Vu.AGENT_ANYWHERE_LABEL} in VS Code.${Es.COLORS.reset}`)}catch(n){console.error(`${Es.COLORS.red}Error:${Es.COLORS.reset} ${n instanceof Error?n.message:String(n)}`),process.exitCode=1}}function tb(){console.log([`${Vu.AGENT_ANYWHERE_LABEL} CLI`,"","Usage:"," agenthippo anywhere status"," agenthippo anywhere detect","","Note: install/start/stop is currently managed via the Agent Anywhere UI in VS Code."].join(`
691
- `))}});var ob=T(ys=>{"use strict";var B1=ys&&ys.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),F1=ys&&ys.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),V1=ys&&ys.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&B1(n,e,r[s]);return F1(n,e),n}})();Object.defineProperty(ys,"__esModule",{value:!0});ys.gatewaySendCommand=J1;ys.gatewayListCommand=X1;var K1=require("fs/promises"),W1=V1(require("path")),Ku=jl(),q1=Hp(),mt=en();function sb(t){let e=t.trim();return e||(console.error("Error: --outbound is required"),process.exit(1)),W1.resolve(e)}async function ib(t){try{await(0,K1.access)(t)}catch{console.error(`Error: gateway outbound file not found: ${t}`),process.exit(1)}}async function Y1(t,e,n){let r=n.message.trim();r||(console.error("Error: --message is required"),process.exit(1)),n.dryRun&&(console.log(`${mt.COLORS.dim}Dry run (egress broker):${mt.COLORS.reset} POST ${t} { to: ${n.target??"(reply-to-sender)"} }`),process.exit(0));let s;try{s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({message:r,to:n.target?.trim()||void 0,media:n.media?.trim()||void 0})})}catch(a){console.error(`${mt.COLORS.red}\u2717${mt.COLORS.reset} Egress broker unreachable: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}let i=await s.text(),o={};try{o=JSON.parse(i)}catch{}n.json?console.log(JSON.stringify({via:"egress-broker",status:s.status,result:o},null,2)):s.ok&&o.ok?console.log(`${mt.COLORS.green}\u2713${mt.COLORS.reset} Sent (via egress broker${o.via?`, ${o.via}`:""})`):(console.error(`${mt.COLORS.red}\u2717${mt.COLORS.reset} Egress send rejected (HTTP ${s.status}): ${o.error||i||"unknown error"}`),process.exit(1)),process.exit(s.ok&&o.ok?0:1)}async function J1(t){let e=process.env.AGENTHIPPO_EGRESS_URL?.trim(),n=process.env.AGENTHIPPO_TURN_NONCE?.trim();if(e&&n){await Y1(e,n,t);return}e&&(console.error("Error: egress broker is active but AGENTHIPPO_TURN_NONCE is missing \u2014 refusing direct gateway send"),process.exit(1));let r=sb(t.outbound);await ib(r);let s=t.agent.trim(),i=t.message.trim();s||(console.error("Error: --agent is required"),process.exit(1)),i||(console.error("Error: --message is required"),process.exit(1));let o=await(0,Ku.resolveGatewayOutboundHandle)(r,s,{target:t.target,threadId:t.threadId});o||(console.error(`Error: No gateway outbound handle for agent "${s}" in ${r}.`),t.target&&console.error(`No stored route matching target "${t.target}".`),console.error(`Run \`agenthippo gateway list --outbound "${r}" --agent ${s}\` to see known routes.`),process.exit(1));let a=await(0,q1.sendGatewayOutboundMessage)(o,{message:i,media:t.media,dryRun:t.dryRun});if(t.json)console.log(JSON.stringify({file:r,handle:o,result:a},null,2));else if(t.dryRun)console.log(`${mt.COLORS.dim}Dry run:${mt.COLORS.reset} ${a.command.join(" ")}`);else if(a.ok){let c=a.via==="hippoclaw"?" (via hippoclaw CLI fallback)":"";console.log(`${mt.COLORS.green}\u2713${mt.COLORS.reset} Sent via ${o.channel}:${o.target}${c}`),a.stdout&&console.log(a.stdout)}else console.error(`${mt.COLORS.red}\u2717${mt.COLORS.reset} Gateway send failed (exit ${a.exitCode??"unknown"})`),a.stderr&&console.error(a.stderr),a.stdout&&console.error(a.stdout),process.exit(1);process.exit(0)}function rb(t,e){let n=t.label?` (${t.label})`:"",r=t.threadId?` thread=${t.threadId}`:"",s=t.inboundCount>1?` \xD7${t.inboundCount}`:"";return`${e?`${mt.COLORS.green}*${mt.COLORS.reset} `:" "}${t.agentId}${n}: ${t.channel} \u2192 ${t.target}${r}${s}`}async function X1(t){let e=sb(t.outbound);await ib(e);let n=await(0,Ku.getGatewayOutboundStoreSnapshot)(e);if(t.json){console.log(JSON.stringify({file:e,...n},null,2));return}let r=t.agent?.trim(),s=r?[r]:[...new Set([...Object.keys(n.targetsByAgent),...Object.keys(n.lastByAgent)])];if(s.length===0){console.log(`No gateway outbound routes in ${e}.`);return}console.log(`${mt.COLORS.dim}${e}${mt.COLORS.reset}`);for(let i of s.sort()){let o=n.targetsByAgent[i]??[],a=n.lastByAgent[i],c=a?(0,Ku.buildGatewayOutboundHandleKey)(a.target,a.threadId):void 0;if(o.length===0&&a){console.log(rb(a,!0));continue}console.log(`${mt.COLORS.dim}${i}:${mt.COLORS.reset}`);for(let l of o){let u=(0,Ku.buildGatewayOutboundHandleKey)(l.target,l.threadId);console.log(rb(l,u===c))}o.length>1&&a&&console.log(`${mt.COLORS.dim} * = last inbound (default for gateway send without --target)${mt.COLORS.reset}`)}}});var db=T(et=>{"use strict";var z1=et&&et.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Q1=et&&et.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Z1=et&&et.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&z1(n,e,r[s]);return Q1(n,e),n}})();Object.defineProperty(et,"__esModule",{value:!0});et.ControlCliError=et.CONTROL_KEY_ENV=et.CONTROL_URL_ENV=void 0;et.resolveControlConnection=Wu;et.registerAgent=cb;et.listAgents=lb;et.downloadBundle=Nh;et.controlRegisterCommand=iB;et.controlListCommand=oB;et.controlBundleCommand=aB;var eB=require("child_process"),aa=require("fs/promises"),oo=Z1(require("path")),tB=require("util"),Je=en(),ab=(0,tB.promisify)(eB.execFile);et.CONTROL_URL_ENV="AGENTHIPPO_CONTROL_URL";et.CONTROL_KEY_ENV="AGENTHIPPO_CONTROL_KEY";var nB=3e4,Ht=class extends Error{};et.ControlCliError=Ht;var rB=new Set(["localhost","127.0.0.1","[::1]"]);function Wu(t,e=process.env){let n=(t??e[et.CONTROL_URL_ENV]??"").trim();if(!n)throw new Ht(`no control plane URL: pass --url, or set ${et.CONTROL_URL_ENV} (e.g. in ~/.agent-hippo/.env).`);let r;try{r=new URL(n)}catch{throw new Ht(`'${n}' is not a URL (expected e.g. https://control.example.com).`)}if(r.protocol!=="https:"&&!(r.protocol==="http:"&&rB.has(r.hostname)))throw new Ht(`refusing to send an API key to ${r.origin}: use https (plain http is accepted for localhost only).`);let s=(e[et.CONTROL_KEY_ENV]??"").trim();if(!s)throw new Ht(`no API key: set ${et.CONTROL_KEY_ENV} (e.g. in ~/.agent-hippo/.env). Mint one in the control console \u2014 the "API key" button.`);return{url:r.origin,key:s}}async function Ph(t,e,n,r){let s;try{s=await fetch(`${t.url}${n}`,{method:e,headers:{authorization:`Bearer ${t.key}`,...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),redirect:"manual",signal:AbortSignal.timeout(nB)})}catch(i){throw new Ht(`could not reach ${t.url}: ${i instanceof Error?i.message:String(i)}`)}if(s.status>=300&&s.status<400)throw new Ht(`${t.url} redirected ${n} (HTTP ${s.status}) instead of answering it. That is the plane's edge putting SSO in front of the CLI lane: its reverse proxy needs to route /api/cli/* around SSO (the \`@cli\` block in the control plane's Caddyfile). Ask the plane operator \u2014 nothing on this machine can fix it.`);if(!s.ok){let i=`HTTP ${s.status}`;try{i=String((await s.json()).error??i)}catch{}throw new Ht(i)}return s}async function cb(t,e){return await(await Ph(t,"POST","/api/cli/deployments",{name:e.name,...e.id?{id:e.id}:{},...e.pack?{pack:e.pack}:{}})).json()}async function lb(t){return await(await Ph(t,"GET","/api/cli/deployments")).json()}async function Nh(t,e,n){let r=oo.resolve(n.dir),s=oo.join(r,e),i=oo.join(r,`${e}-bundle.tar.gz`),o=async l=>(0,aa.stat)(l).then(()=>!0,()=>!1),a=n.extract?s:i;if(!n.force&&await o(a))throw new Ht(`${a} already exists \u2014 pass --force to overwrite it, or --dir to unpack somewhere else.`);let c=await Ph(t,"GET",`/api/cli/deployments/${encodeURIComponent(e)}/bundle`);if(await(0,aa.mkdir)(r,{recursive:!0}),await(0,aa.writeFile)(i,Buffer.from(await c.arrayBuffer()),{mode:384}),await(0,aa.chmod)(i,384),!n.extract)return{path:i,extracted:!1};try{let l=oo.basename(i),{stdout:u}=await ab("tar",["-tzf",l],{cwd:r,maxBuffer:8*1024*1024}),d=u.split(`
692
- `).map(f=>f.trim()).filter(Boolean).find(f=>f!==`${e}/`&&(!f.startsWith(`${e}/`)||f.split("/").includes("..")));if(d)throw new Ht(`refusing to unpack the bundle: it contains '${d}', which is outside ${e}/.`);await ab("tar",["-xzf",l,"-C","."],{cwd:r})}catch(l){throw l instanceof Ht?(await(0,aa.rm)(i,{force:!0}),l):new Ht(`downloaded ${i} but could not unpack it (${l instanceof Error?l.message.split(`
691
+ `))}});var ob=T(ys=>{"use strict";var B1=ys&&ys.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),F1=ys&&ys.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),V1=ys&&ys.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&B1(n,e,r[s]);return F1(n,e),n}})();Object.defineProperty(ys,"__esModule",{value:!0});ys.gatewaySendCommand=J1;ys.gatewayListCommand=X1;var K1=require("fs/promises"),W1=V1(require("path")),Ku=jl(),q1=Hp(),mt=en();function sb(t){let e=t.trim();return e||(console.error("Error: --outbound is required"),process.exit(1)),W1.resolve(e)}async function ib(t){try{await(0,K1.access)(t)}catch{console.error(`Error: gateway outbound file not found: ${t}`),process.exit(1)}}async function Y1(t,e,n){let r=n.message.trim();r||(console.error("Error: --message is required"),process.exit(1)),n.dryRun&&(console.log(`${mt.COLORS.dim}Dry run (egress broker):${mt.COLORS.reset} POST ${t} { to: ${n.target??"(reply-to-sender)"} }`),process.exit(0));let s;try{s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({message:r,to:n.target?.trim()||void 0,media:n.media?.trim()||void 0})})}catch(a){console.error(`${mt.COLORS.red}\u2717${mt.COLORS.reset} Egress broker unreachable: ${a instanceof Error?a.message:String(a)}`),process.exit(1)}let i=await s.text(),o={};try{o=JSON.parse(i)}catch{}n.json?console.log(JSON.stringify({via:"egress-broker",status:s.status,result:o},null,2)):s.ok&&o.ok?console.log(`${mt.COLORS.green}\u2713${mt.COLORS.reset} Sent (via egress broker${o.via?`, ${o.via}`:""})`):(console.error(`${mt.COLORS.red}\u2717${mt.COLORS.reset} Egress send rejected (HTTP ${s.status}): ${o.error||i||"unknown error"}`),process.exit(1)),process.exit(s.ok&&o.ok?0:1)}async function J1(t){let e=process.env.AGENTHIPPO_EGRESS_URL?.trim(),n=process.env.AGENTHIPPO_TURN_NONCE?.trim();if(e&&n){await Y1(e,n,t);return}e&&(console.error("Error: egress broker is active but AGENTHIPPO_TURN_NONCE is missing \u2014 refusing direct gateway send"),process.exit(1));let r=sb(t.outbound);await ib(r);let s=t.agent.trim(),i=t.message.trim();s||(console.error("Error: --agent is required"),process.exit(1)),i||(console.error("Error: --message is required"),process.exit(1));let o=await(0,Ku.resolveGatewayOutboundHandle)(r,s,{target:t.target,threadId:t.threadId});o||(console.error(`Error: No gateway outbound handle for agent "${s}" in ${r}.`),t.target&&console.error(`No stored route matching target "${t.target}".`),console.error(`Run \`agenthippo gateway list --outbound "${r}" --agent ${s}\` to see known routes.`),process.exit(1));let a=await(0,q1.sendGatewayOutboundMessage)(o,{message:i,media:t.media,dryRun:t.dryRun});if(t.json)console.log(JSON.stringify({file:r,handle:o,result:a},null,2));else if(t.dryRun)console.log(`${mt.COLORS.dim}Dry run:${mt.COLORS.reset} ${a.command.join(" ")}`);else if(a.ok){let c=a.via==="hippoclaw"?" (via hippoclaw CLI fallback)":"";console.log(`${mt.COLORS.green}\u2713${mt.COLORS.reset} Sent via ${o.channel}:${o.target}${c}`),a.stdout&&console.log(a.stdout)}else console.error(`${mt.COLORS.red}\u2717${mt.COLORS.reset} Gateway send failed (exit ${a.exitCode??"unknown"})`),a.stderr&&console.error(a.stderr),a.stdout&&console.error(a.stdout),process.exit(1);process.exit(0)}function rb(t,e){let n=t.label?` (${t.label})`:"",r=t.threadId?` thread=${t.threadId}`:"",s=t.inboundCount>1?` \xD7${t.inboundCount}`:"";return`${e?`${mt.COLORS.green}*${mt.COLORS.reset} `:" "}${t.agentId}${n}: ${t.channel} \u2192 ${t.target}${r}${s}`}async function X1(t){let e=sb(t.outbound);await ib(e);let n=await(0,Ku.getGatewayOutboundStoreSnapshot)(e);if(t.json){console.log(JSON.stringify({file:e,...n},null,2));return}let r=t.agent?.trim(),s=r?[r]:[...new Set([...Object.keys(n.targetsByAgent),...Object.keys(n.lastByAgent)])];if(s.length===0){console.log(`No gateway outbound routes in ${e}.`);return}console.log(`${mt.COLORS.dim}${e}${mt.COLORS.reset}`);for(let i of s.sort()){let o=n.targetsByAgent[i]??[],a=n.lastByAgent[i],c=a?(0,Ku.buildGatewayOutboundHandleKey)(a.target,a.threadId):void 0;if(o.length===0&&a){console.log(rb(a,!0));continue}console.log(`${mt.COLORS.dim}${i}:${mt.COLORS.reset}`);for(let l of o){let u=(0,Ku.buildGatewayOutboundHandleKey)(l.target,l.threadId);console.log(rb(l,u===c))}o.length>1&&a&&console.log(`${mt.COLORS.dim} * = last inbound (default for gateway send without --target)${mt.COLORS.reset}`)}}});var db=T(et=>{"use strict";var z1=et&&et.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Q1=et&&et.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Z1=et&&et.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&z1(n,e,r[s]);return Q1(n,e),n}})();Object.defineProperty(et,"__esModule",{value:!0});et.ControlCliError=et.CONTROL_KEY_ENV=et.CONTROL_URL_ENV=void 0;et.resolveControlConnection=Wu;et.registerAgent=cb;et.listAgents=lb;et.downloadBundle=Nh;et.controlRegisterCommand=iB;et.controlListCommand=oB;et.controlBundleCommand=aB;var eB=require("child_process"),aa=require("fs/promises"),oo=Z1(require("path")),tB=require("util"),Je=en(),ab=(0,tB.promisify)(eB.execFile);et.CONTROL_URL_ENV="AGENTHIPPO_CONTROL_URL";et.CONTROL_KEY_ENV="AGENTHIPPO_CONTROL_KEY";var nB=3e4,Ht=class extends Error{};et.ControlCliError=Ht;var rB=new Set(["localhost","127.0.0.1","[::1]"]);function Wu(t,e=process.env){let n=(t??e[et.CONTROL_URL_ENV]??"").trim();if(!n)throw new Ht(`no control plane URL: pass --url, or set ${et.CONTROL_URL_ENV} (e.g. in ~/.agent-hippo/.env).`);let r;try{r=new URL(n)}catch{throw new Ht(`'${n}' is not a URL (expected e.g. https://control.example.com).`)}if(r.protocol!=="https:"&&!(r.protocol==="http:"&&rB.has(r.hostname)))throw new Ht(`refusing to send an API key to ${r.origin}: use https (plain http is accepted for localhost only).`);let s=(e[et.CONTROL_KEY_ENV]??"").trim();if(!s)throw new Ht(`no API key: set ${et.CONTROL_KEY_ENV} (e.g. in ~/.agent-hippo/.env). Mint one in the control console \u2014 the "API key" button.`);return{url:r.origin,key:s}}async function Ph(t,e,n,r){let s;try{s=await fetch(`${t.url}${n}`,{method:e,headers:{authorization:`Bearer ${t.key}`,...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),redirect:"manual",signal:AbortSignal.timeout(nB)})}catch(i){throw new Ht(`could not reach ${t.url}: ${i instanceof Error?i.message:String(i)}`)}if(s.status>=300&&s.status<400)throw new Ht(`${t.url} redirected ${n} (HTTP ${s.status}) instead of answering it. That is the plane's edge putting SSO in front of the CLI lane: its reverse proxy needs to route /api/cli/* around SSO (the \`@cli\` block in the control plane's Caddyfile). Ask the plane operator \u2014 nothing on this machine can fix it.`);if(!s.ok){let i=`HTTP ${s.status}`;try{i=String((await s.json()).error??i)}catch{}throw new Ht(i)}return s}async function cb(t,e){return await(await Ph(t,"POST","/api/cli/deployments",{name:e.name,...e.id?{id:e.id}:{},...e.pack?{pack:e.pack}:{}})).json()}async function lb(t){return await(await Ph(t,"GET","/api/cli/deployments")).json()}async function Nh(t,e,n){let r=oo.resolve(n.dir),s=oo.join(r,e),i=oo.join(r,`${e}-bundle.tar.gz`),o=async l=>(0,aa.stat)(l).then(()=>!0,()=>!1),a=n.extract?s:i;if(!n.force&&await o(a))throw new Ht(`${a} already exists \u2014 pass --force to overwrite it, or --dir to unpack somewhere else.`);let c=await Ph(t,"GET",`/api/cli/deployments/${encodeURIComponent(e)}/bundle`);if(await(0,aa.mkdir)(r,{recursive:!0}),await(0,aa.writeFile)(i,Buffer.from(await c.arrayBuffer()),{mode:384}),await(0,aa.chmod)(i,384),!n.extract)return{path:i,extracted:!1};try{let l=oo.basename(i),{stdout:u}=await ab("tar",["-tzf",l],{cwd:r,maxBuffer:8*1024*1024}),f=u.split(`
692
+ `).map(d=>d.trim()).filter(Boolean).find(d=>d!==`${e}/`&&(!d.startsWith(`${e}/`)||d.split("/").includes("..")));if(f)throw new Ht(`refusing to unpack the bundle: it contains '${f}', which is outside ${e}/.`);await ab("tar",["-xzf",l,"-C","."],{cwd:r})}catch(l){throw l instanceof Ht?(await(0,aa.rm)(i,{force:!0}),l):new Ht(`downloaded ${i} but could not unpack it (${l instanceof Error?l.message.split(`
693
693
  `)[0]:String(l)}). Unpack it yourself: tar -xzf ${i}`)}return await(0,aa.rm)(i,{force:!0}),{path:s,extracted:!0}}async function Rh(t,e){try{await e()}catch(n){if(!(n instanceof Ht))throw n;t?console.log(JSON.stringify({ok:!1,error:n.message})):console.error(`${Je.COLORS.red}Error:${Je.COLORS.reset} ${n.message}`),process.exit(1)}}var sB=t=>`${t.agentsOwned} of ${t.maxAgents} allowed agents${t.group?` (group: ${t.group})`:""}`;function ub(t){let e=oo.relative(process.cwd(),t.path),n=e&&!e.startsWith("..")&&!oo.isAbsolute(e)?e:t.path;t.extracted?(console.log(` bundle: ${n}${oo.sep}`),console.log(`
694
694
  ${Je.COLORS.dim}Next, on the agent VM (or from here with AGENT_VM=user@vm):${Je.COLORS.reset}`),console.log(` cd ${n} && ./bootstrap.sh [path-to-your-pack]`)):(console.log(` bundle: ${n}`),console.log(`
695
695
  ${Je.COLORS.dim}It embeds this agent's enroll token \u2014 treat it as a secret. Unpack with:${Je.COLORS.reset} tar -xzf ${n}`))}async function iB(t){await Rh(t.json,async()=>{let e=t.name.trim();if(!e)throw new Ht("--name is required");let n=Wu(t.url),r=await cb(n,{name:e,id:t.id,pack:t.pack}),s;if(t.bundle)try{s=await Nh(n,r.id,{dir:t.dir,extract:t.extract,force:t.force})}catch(i){throw i instanceof Ht?new Ht(`registered '${r.id}', but fetching its bundle failed: ${i.message}
696
696
  Do NOT register again \u2014 fetch it with: agenthippo control bundle ${r.id}`):i}if(t.json){console.log(JSON.stringify({ok:!0,...r,...s?{bundlePath:s.path,extracted:s.extracted}:{}}));return}console.log(`${Je.COLORS.green}\u2713${Je.COLORS.reset} Registered ${Je.COLORS.cyan}${r.name}${Je.COLORS.reset}`),console.log(` id: ${r.id}`),r.owner&&console.log(` owner: ${r.owner}`),s?ub(s):(console.log(` enroll token (set as AGENTHIPPO_ENROLL_TOKEN on the agent): ${r.enrollToken??"(none returned)"}`),console.log(`
697
- ${Je.COLORS.dim}Fetch the setup bundle later with:${Je.COLORS.reset} agenthippo control bundle ${r.id}`))})}async function oB(t){await Rh(t.json,async()=>{let e=await lb(Wu(t.url));if(t.json){console.log(JSON.stringify({ok:!0,...e}));return}if(console.log(`${Je.COLORS.cyan}${e.owner}${Je.COLORS.reset} \u2014 ${sB(e.limit)}`),e.deployments.length===0){console.log(`${Je.COLORS.dim} no agents yet \u2014 register one with: agenthippo control register --name "My Agent"${Je.COLORS.reset}`);return}let n=Math.max(...e.deployments.map(r=>String(r.id).length));for(let r of e.deployments){let s=r.enabled===1?`${Je.COLORS.green}serving${Je.COLORS.reset}`:`${Je.COLORS.yellow}stopped${Je.COLORS.reset}`;console.log(` ${String(r.id).padEnd(n)} ${s} ${Je.COLORS.dim}${String(r.name)}${Je.COLORS.reset}`)}})}async function aB(t){await Rh(t.json,async()=>{let e=Wu(t.url),n=await Nh(e,t.id,{dir:t.dir,extract:t.extract,force:t.force});if(t.json){console.log(JSON.stringify({ok:!0,id:t.id,bundlePath:n.path,extracted:n.extracted}));return}console.log(`${Je.COLORS.green}\u2713${Je.COLORS.reset} Bundle for ${Je.COLORS.cyan}${t.id}${Je.COLORS.reset}`),ub(n)})}});var fb=T(Ks=>{"use strict";var cB=Ks&&Ks.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),lB=Ks&&Ks.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),uB=Ks&&Ks.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&cB(n,e,r[s]);return lB(n,e),n}})();Object.defineProperty(Ks,"__esModule",{value:!0});Ks.probeCustomEngineCommand=mB;var dB=uB(require("node:path")),fB=df(),pB=Qs(),gB=["in-process","node-subprocess"];function hB(t){if(!t?.trim()||t==="all")return"all";let e=t.trim().toLowerCase();if(e==="a"||e==="in-process"||e==="inprocess")return"in-process";if(e==="b"||e==="c"||e==="bun-subprocess"||e==="bun"||e==="node-subprocess"||e==="node")return"node-subprocess";throw new Error(`Unknown strategy "${t}". Use in-process, node-subprocess, or all.`)}async function mB(t){let e=t.engine.trim(),n=dB.resolve(t.workspace),r=(0,pB.resolveCustomEngineManifest)(n,e),s=hB(t.strategy),i=s==="all"?gB:[s];console.log(`Probing custom engine "${r.id}" import (${r.entryPath})`),console.log(`Workspace: ${n}`),console.log("");let o=!1;for(let a of i){let c=await(0,fB.probeCustomEngineImport)(r,a);c.ok?(o=!0,console.log(` [PASS] ${a}`)):(console.log(` [FAIL] ${a}`),console.log(` ${c.error??"unknown error"}`))}console.log(""),o||process.exit(1)}});var pb=T(Ch=>{"use strict";Object.defineProperty(Ch,"__esModule",{value:!0});Ch.conformanceCommand=OB;var _B=require("node:child_process"),EB=require("node:util"),yB=Pp(),qu=jo(),hi=si(),wB=(0,EB.promisify)(_B.execFile);async function Ju(t,e){try{let{stdout:n}=await wB(t,e,{maxBuffer:8388608});return{out:n,code:0}}catch(n){let r=n;return{out:`${r.stdout??""}${r.stderr??""}`,code:typeof r.code=="number"?r.code:1}}}async function SB(t){let e="credential-confinement";if(!t.sandbox)return{name:e,status:"skip",detail:"no --sandbox given; cannot probe inside a running sandbox"};let n=t.runtime??"docker",r=await Ju(n,["exec",t.sandbox,"sh","-c","env"]);if(r.code!==0)return{name:e,status:"skip",detail:`cannot exec in sandbox ${t.sandbox}: ${r.out.trim().slice(0,120)}`};let s=[["provider-key",/sk-[A-Za-z0-9]{16,}/],["api-key-var",/(^|\n)[A-Z_]*API_KEY=\S/],["db-password",/(^|\n)PG(PASSWORD|PASSFILE)=\S/],["aws-secret",/(^|\n)AWS_SECRET_ACCESS_KEY=\S/],["bearer-token-var",/(^|\n)[A-Z_]*_TOKEN=\S/],["generic-secret-var",/(^|\n)[A-Z_]*SECRET[A-Z_]*=\S/]],i=u=>u.replace(/^[A-Z_]*=ahc_\S*$/gm,""),o=u=>s.filter(([,d])=>d.test(i(u))).map(([d])=>d),a=o(r.out),c=await Ju(n,["exec",t.sandbox,"sh","-c",'for p in /proc/[0-9]*; do tr "\\0" "\\n" < $p/environ 2>/dev/null; done']),l=o(c.out);if(a.length===0&&l.length===0){let u=/=ahc_/.test(r.out);return{name:e,status:"pass",detail:u?"only a sandbox-scoped model token is present; no provider key, DB password, or bearer secret in env or any /proc environ":"no credential reachable in the sandbox env or any process environ"}}return{name:e,status:"fail",detail:`credential material reachable inside the sandbox \u2014 env: [${a.join(", ")||"none"}], /proc: [${l.join(", ")||"none"}]`}}async function AB(t){let e="isolation-tier";if(t.tier===void 0)return{name:e,status:"skip",detail:"no --tier declared"};if(t.tier===0)return{name:e,status:"pass",detail:"tier 0 declares no boundary \u2014 nothing to enforce"};if(!t.sandbox)return{name:e,status:"skip",detail:"no --sandbox given; cannot probe the boundary"};let n=t.runtime??"docker",r=await Ju(n,["exec",t.sandbox,"sh","-c","ls -d /proc/[0-9]* | wc -l"]);if(r.code!==0)return{name:e,status:"skip",detail:"cannot probe the sandbox"};let s=parseInt(r.out.trim(),10);if(!Number.isFinite(s))return{name:e,status:"skip",detail:"unreadable process count"};if(s>50)return{name:e,status:"fail",detail:`sandbox sees ${s} processes \u2014 PID namespace is NOT isolated despite tier ${t.tier}`};let i=await Ju(n,["inspect",t.sandbox,"--format","{{json .NetworkSettings.Networks}}"]),o=Object.keys(JSON.parse(i.out.trim()||"{}"));return o.includes("bridge")?{name:e,status:"fail",detail:"sandbox is on the default bridge \u2014 it is not route-confined"}:{name:e,status:"pass",detail:`tier ${t.tier} in force: own PID namespace (${s} procs), routes=${o.join(",")||"none"}`}}function TB(){let t="cost-cap",e="sk-conformance-upstream-key",n=(0,hi.generateWarrantKeypair)("conformance-cost-cap"),r={[n.kid]:n.publicKeyPem},s=(0,yB.mintSandboxInferenceWarrant)(n,{user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2}),i=(0,hi.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-A"}).ok,o=(0,hi.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-B"}).ok,a=s.includes(e);return i&&!o&&!a?{name:t,status:"pass",detail:"model token is a sandbox-bound signed warrant and carries no provider key \u2014 a cap cannot be evaded by replay"}:{name:t,status:"fail",detail:`warrant binding broken (own=${i}, elsewhere=${o}, leaks=${a})`}}function bB(){let t="warrant-integrity",e=(0,hi.generateWarrantKeypair)("conformance"),n={[e.kid]:e.publicKeyPem},r=(0,hi.mintWarrant)({user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2,aud:"data"},e),s=(0,hi.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-A"}),i=(0,hi.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-B"}),o=(0,hi.verifyWarrant)(r,n,{audience:"inference",channelSandboxId:"sandbox-A"});return s.ok&&!i.ok&&!o.ok?{name:t,status:"pass",detail:"warrants are signed, sandbox-bound, and audience-scoped; gateways verify but cannot mint"}:{name:t,status:"fail",detail:`warrant binding broken (own=${s.ok}, lifted=${i.ok}, wrongAud=${o.ok})`}}function vB(){let t="rollback-kill-switch",e=Math.floor(Date.now()/1e3),n={pack:"probe",version:"1.0.0",expiresAt:e+60,enabled:!0},r={pinnedAdmits:Yu(()=>(0,qu.assertAdmitted)(n,{pack:"probe",version:"1.0.0",nowSeconds:e})),otherVersionRefused:!Yu(()=>(0,qu.assertAdmitted)(n,{pack:"probe",version:"1.0.1",nowSeconds:e})),killSwitchRefuses:!Yu(()=>(0,qu.assertAdmitted)({...n,enabled:!1},{pack:"probe",version:"1.0.0",nowSeconds:e})),expiredRefused:!Yu(()=>(0,qu.assertAdmitted)({...n,expiresAt:e-1},{pack:"probe",version:"1.0.0",nowSeconds:e}))},s=Object.values(r).every(Boolean);return{name:t,status:s?"pass":"fail",detail:s?"pinned version admits, other versions refused, kill switch and expiry both fail closed":`admission contract broken: ${JSON.stringify(r)}`}}function Yu(t){try{return t(),!0}catch{return!1}}async function OB(t){let e=a=>c=>({...c,kind:a}),n=[e("deployment")(await SB(t)),e("deployment")(await AB(t)),e("algorithm")(TB()),e("algorithm")(bB()),e("algorithm")(vB())],r=n.filter(a=>a.kind==="deployment"),s=r.filter(a=>a.status!=="skip"),i=n.filter(a=>a.status==="fail"),o=s.length===0;if(t.json)console.log(JSON.stringify({results:n,deployment_probed:!o,summary:o?"no deployment was probed \u2014 algorithm checks verify this binary only":`${s.filter(a=>a.status==="pass").length}/${s.length} deployment checks passed`},null,2));else{console.log(`
697
+ ${Je.COLORS.dim}Fetch the setup bundle later with:${Je.COLORS.reset} agenthippo control bundle ${r.id}`))})}async function oB(t){await Rh(t.json,async()=>{let e=await lb(Wu(t.url));if(t.json){console.log(JSON.stringify({ok:!0,...e}));return}if(console.log(`${Je.COLORS.cyan}${e.owner}${Je.COLORS.reset} \u2014 ${sB(e.limit)}`),e.deployments.length===0){console.log(`${Je.COLORS.dim} no agents yet \u2014 register one with: agenthippo control register --name "My Agent"${Je.COLORS.reset}`);return}let n=Math.max(...e.deployments.map(r=>String(r.id).length));for(let r of e.deployments){let s=r.enabled===1?`${Je.COLORS.green}serving${Je.COLORS.reset}`:`${Je.COLORS.yellow}stopped${Je.COLORS.reset}`;console.log(` ${String(r.id).padEnd(n)} ${s} ${Je.COLORS.dim}${String(r.name)}${Je.COLORS.reset}`)}})}async function aB(t){await Rh(t.json,async()=>{let e=Wu(t.url),n=await Nh(e,t.id,{dir:t.dir,extract:t.extract,force:t.force});if(t.json){console.log(JSON.stringify({ok:!0,id:t.id,bundlePath:n.path,extracted:n.extracted}));return}console.log(`${Je.COLORS.green}\u2713${Je.COLORS.reset} Bundle for ${Je.COLORS.cyan}${t.id}${Je.COLORS.reset}`),ub(n)})}});var fb=T(Ks=>{"use strict";var cB=Ks&&Ks.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),lB=Ks&&Ks.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),uB=Ks&&Ks.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&cB(n,e,r[s]);return lB(n,e),n}})();Object.defineProperty(Ks,"__esModule",{value:!0});Ks.probeCustomEngineCommand=mB;var dB=uB(require("node:path")),fB=df(),pB=Qs(),gB=["in-process","node-subprocess"];function hB(t){if(!t?.trim()||t==="all")return"all";let e=t.trim().toLowerCase();if(e==="a"||e==="in-process"||e==="inprocess")return"in-process";if(e==="b"||e==="c"||e==="bun-subprocess"||e==="bun"||e==="node-subprocess"||e==="node")return"node-subprocess";throw new Error(`Unknown strategy "${t}". Use in-process, node-subprocess, or all.`)}async function mB(t){let e=t.engine.trim(),n=dB.resolve(t.workspace),r=(0,pB.resolveCustomEngineManifest)(n,e),s=hB(t.strategy),i=s==="all"?gB:[s];console.log(`Probing custom engine "${r.id}" import (${r.entryPath})`),console.log(`Workspace: ${n}`),console.log("");let o=!1;for(let a of i){let c=await(0,fB.probeCustomEngineImport)(r,a);c.ok?(o=!0,console.log(` [PASS] ${a}`)):(console.log(` [FAIL] ${a}`),console.log(` ${c.error??"unknown error"}`))}console.log(""),o||process.exit(1)}});var pb=T(Ch=>{"use strict";Object.defineProperty(Ch,"__esModule",{value:!0});Ch.conformanceCommand=OB;var _B=require("node:child_process"),EB=require("node:util"),yB=Pp(),qu=jo(),hi=si(),wB=(0,EB.promisify)(_B.execFile);async function Ju(t,e){try{let{stdout:n}=await wB(t,e,{maxBuffer:8388608});return{out:n,code:0}}catch(n){let r=n;return{out:`${r.stdout??""}${r.stderr??""}`,code:typeof r.code=="number"?r.code:1}}}async function SB(t){let e="credential-confinement";if(!t.sandbox)return{name:e,status:"skip",detail:"no --sandbox given; cannot probe inside a running sandbox"};let n=t.runtime??"docker",r=await Ju(n,["exec",t.sandbox,"sh","-c","env"]);if(r.code!==0)return{name:e,status:"skip",detail:`cannot exec in sandbox ${t.sandbox}: ${r.out.trim().slice(0,120)}`};let s=[["provider-key",/sk-[A-Za-z0-9]{16,}/],["api-key-var",/(^|\n)[A-Z_]*API_KEY=\S/],["db-password",/(^|\n)PG(PASSWORD|PASSFILE)=\S/],["aws-secret",/(^|\n)AWS_SECRET_ACCESS_KEY=\S/],["bearer-token-var",/(^|\n)[A-Z_]*_TOKEN=\S/],["generic-secret-var",/(^|\n)[A-Z_]*SECRET[A-Z_]*=\S/]],i=u=>u.replace(/^[A-Z_]*=ahc_\S*$/gm,""),o=u=>s.filter(([,f])=>f.test(i(u))).map(([f])=>f),a=o(r.out),c=await Ju(n,["exec",t.sandbox,"sh","-c",'for p in /proc/[0-9]*; do tr "\\0" "\\n" < $p/environ 2>/dev/null; done']),l=o(c.out);if(a.length===0&&l.length===0){let u=/=ahc_/.test(r.out);return{name:e,status:"pass",detail:u?"only a sandbox-scoped model token is present; no provider key, DB password, or bearer secret in env or any /proc environ":"no credential reachable in the sandbox env or any process environ"}}return{name:e,status:"fail",detail:`credential material reachable inside the sandbox \u2014 env: [${a.join(", ")||"none"}], /proc: [${l.join(", ")||"none"}]`}}async function AB(t){let e="isolation-tier";if(t.tier===void 0)return{name:e,status:"skip",detail:"no --tier declared"};if(t.tier===0)return{name:e,status:"pass",detail:"tier 0 declares no boundary \u2014 nothing to enforce"};if(!t.sandbox)return{name:e,status:"skip",detail:"no --sandbox given; cannot probe the boundary"};let n=t.runtime??"docker",r=await Ju(n,["exec",t.sandbox,"sh","-c","ls -d /proc/[0-9]* | wc -l"]);if(r.code!==0)return{name:e,status:"skip",detail:"cannot probe the sandbox"};let s=parseInt(r.out.trim(),10);if(!Number.isFinite(s))return{name:e,status:"skip",detail:"unreadable process count"};if(s>50)return{name:e,status:"fail",detail:`sandbox sees ${s} processes \u2014 PID namespace is NOT isolated despite tier ${t.tier}`};let i=await Ju(n,["inspect",t.sandbox,"--format","{{json .NetworkSettings.Networks}}"]),o=Object.keys(JSON.parse(i.out.trim()||"{}"));return o.includes("bridge")?{name:e,status:"fail",detail:"sandbox is on the default bridge \u2014 it is not route-confined"}:{name:e,status:"pass",detail:`tier ${t.tier} in force: own PID namespace (${s} procs), routes=${o.join(",")||"none"}`}}function TB(){let t="cost-cap",e="sk-conformance-upstream-key",n=(0,hi.generateWarrantKeypair)("conformance-cost-cap"),r={[n.kid]:n.publicKeyPem},s=(0,yB.mintSandboxInferenceWarrant)(n,{user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2}),i=(0,hi.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-A"}).ok,o=(0,hi.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-B"}).ok,a=s.includes(e);return i&&!o&&!a?{name:t,status:"pass",detail:"model token is a sandbox-bound signed warrant and carries no provider key \u2014 a cap cannot be evaded by replay"}:{name:t,status:"fail",detail:`warrant binding broken (own=${i}, elsewhere=${o}, leaks=${a})`}}function bB(){let t="warrant-integrity",e=(0,hi.generateWarrantKeypair)("conformance"),n={[e.kid]:e.publicKeyPem},r=(0,hi.mintWarrant)({user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2,aud:"data"},e),s=(0,hi.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-A"}),i=(0,hi.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-B"}),o=(0,hi.verifyWarrant)(r,n,{audience:"inference",channelSandboxId:"sandbox-A"});return s.ok&&!i.ok&&!o.ok?{name:t,status:"pass",detail:"warrants are signed, sandbox-bound, and audience-scoped; gateways verify but cannot mint"}:{name:t,status:"fail",detail:`warrant binding broken (own=${s.ok}, lifted=${i.ok}, wrongAud=${o.ok})`}}function vB(){let t="rollback-kill-switch",e=Math.floor(Date.now()/1e3),n={pack:"probe",version:"1.0.0",expiresAt:e+60,enabled:!0},r={pinnedAdmits:Yu(()=>(0,qu.assertAdmitted)(n,{pack:"probe",version:"1.0.0",nowSeconds:e})),otherVersionRefused:!Yu(()=>(0,qu.assertAdmitted)(n,{pack:"probe",version:"1.0.1",nowSeconds:e})),killSwitchRefuses:!Yu(()=>(0,qu.assertAdmitted)({...n,enabled:!1},{pack:"probe",version:"1.0.0",nowSeconds:e})),expiredRefused:!Yu(()=>(0,qu.assertAdmitted)({...n,expiresAt:e-1},{pack:"probe",version:"1.0.0",nowSeconds:e}))},s=Object.values(r).every(Boolean);return{name:t,status:s?"pass":"fail",detail:s?"pinned version admits, other versions refused, kill switch and expiry both fail closed":`admission contract broken: ${JSON.stringify(r)}`}}function Yu(t){try{return t(),!0}catch{return!1}}async function OB(t){let e=a=>c=>({...c,kind:a}),n=[e("deployment")(await SB(t)),e("deployment")(await AB(t)),e("algorithm")(TB()),e("algorithm")(bB()),e("algorithm")(vB())],r=n.filter(a=>a.kind==="deployment"),s=r.filter(a=>a.status!=="skip"),i=n.filter(a=>a.status==="fail"),o=s.length===0;if(t.json)console.log(JSON.stringify({results:n,deployment_probed:!o,summary:o?"no deployment was probed \u2014 algorithm checks verify this binary only":`${s.filter(a=>a.status==="pass").length}/${s.length} deployment checks passed`},null,2));else{console.log(`
698
698
  AgentHippo conformance
699
699
  `);let a=c=>{let l=c.status==="pass"?"PASS":c.status==="fail"?"FAIL":"SKIP";console.log(` ${l} ${c.name}
700
700
  ${c.detail}`)};if(console.log("THIS DEPLOYMENT (probes a running sandbox)"),r.forEach(a),console.log(`
701
- THIS BINARY (contract checks \u2014 environment-independent, pass with no deployment)`),n.filter(c=>c.kind==="algorithm").forEach(a),console.log(""),o)console.log("NO DEPLOYMENT WAS PROBED. The binary checks above say nothing about a running"),console.log("system \u2014 pass --sandbox <container> --tier <n> to actually test one.");else{let c=s.filter(l=>l.status==="pass").length;console.log(`${c}/${s.length} deployment checks passed`+(r.length-s.length?`, ${r.length-s.length} not probed`:""))}i.length&&console.log(`${i.length} FAILED`)}return i.length?1:o?2:0}});var gb=T(Dh=>{"use strict";Object.defineProperty(Dh,"__esModule",{value:!0});Dh.startRunnerHost=NB;var IB=Li(),kh=pp(),PB={selected:[],freeText:null,declined:!0};function NB(t){let e=u=>{t.output.write((0,kh.encodeRunnerFrame)(u))},n=new Map,r="",s=!1,i=setInterval(()=>{try{t.engine.onMaintenance(t.logger??CB())}catch(u){t.logger?.warn(`[Runner] maintenance failed: ${$h(u)}`)}},t.maintenanceIntervalMs??(0,IB.engineMaintenanceIntervalMs)());typeof i.unref=="function"&&i.unref();let o=()=>{},a=new Promise(u=>{o=()=>{if(!s){s=!0,clearInterval(i);for(let d of n.values())d.abort();n.clear(),u()}},t.input.on("data",d=>{r+=typeof d=="string"?d:d.toString("utf8");let{lines:f,rest:p}=(0,kh.splitFrames)(r);r=p;for(let g of f){let _=(0,kh.parseClientFrame)(g);if(!_){t.logger?.warn("[Runner] dropped malformed client frame");continue}c(_)}}),t.input.on("end",o),t.input.on("close",o),t.input.on("error",d=>{t.logger?.warn(`[Runner] input error: ${$h(d)}`),o()})});async function c(u){if(u.type==="abort"){n.get(u.id)?.abort();return}await l(u.id,u.message,u.options)}async function l(u,d,f){if(n.has(u)){e({type:"failed",id:u,message:`duplicate run id ${u}`});return}let p=new AbortController;n.set(u,p);let g=RB(e,u);try{await t.engine.stream(d,f,g,t.runtime,p.signal);let _=t.nativeSessionId?.();e({type:"result",id:u,..._?{nativeSessionId:_}:{}})}catch(_){let h=p.signal.aborted?"aborted":$h(_);e({type:"failed",id:u,message:h})}finally{n.delete(u)}}return e({type:"ready",demux:!0}),{done:a,close:()=>o()}}function RB(t,e){let n=r=>t({id:e,event:r});return{async thinking(r){n({type:"thinking",delta:r})},async text(r){n({type:"text",delta:r})},async toolStart(r,s,i){n({type:"toolStart",toolName:r,...s!==void 0?{input:s}:{},...i?{toolCallId:i}:{}})},async toolEnd(r,s,i,o){n({type:"toolEnd",toolName:r,toolCallId:s,...i!==void 0?{result:i}:{},...o!==void 0?{isError:o}:{}})},async progress(r){n({type:"progress",message:r})},async question(r){return t({type:"question",payload:r,id:e}),PB},async error(r){n({type:"error",message:r})},async done(){n({type:"done"})}}}function $h(t){return t instanceof Error?t.message:String(t)}function CB(){return{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}});var yb=T(Fr=>{"use strict";var kB=Fr&&Fr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),$B=Fr&&Fr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Gh=Fr&&Fr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&kB(n,e,r[s]);return $B(n,e),n}})();Object.defineProperty(Fr,"__esModule",{value:!0});Fr.resolveSandboxWorkspace=_b;Fr.isForeignWorkspace=Eb;Fr.sandboxCommand=xB;var cc=Gh(require("fs")),DB=Gh(require("net")),Xu=Gh(require("path")),Lh=Ui(),LB=en(),hb=ji(),MB=Cp(),GB=xi(),UB=ur(),HB=Cr(),mb=gb();function _b(t,e){return e}function Eb(t,e){return t?Xu.resolve(t)!==Xu.resolve(e):!1}var Mh=class{defaults;id="sandbox";displayName="Sandbox runner";runner;builtWith;warnedWorkspace=!1;nativeSessionId;constructor(e){this.defaults=e}ensureRunner(e){let n=e.baseUrl??"";return this.runner&&this.builtWith===n?this.runner:(this.runner?.dispose(),this.runner=(0,MB.createPackRunner)({storagePath:this.defaults.storagePath,analyticsSessionsDir:this.defaults.analyticsSessionsDir,packId:this.defaults.packId,packVersion:this.defaults.packVersion,provenance:()=>(0,HB.readProvenanceEnvFromProcess)(),workspaceRoot:this.defaults.workspace,credentials:{baseUrl:e.baseUrl,litellmApiKey:e.modelToken,useLiteLLM:!!e.baseUrl},claudeCheapModel:this.defaults.claudeCheapModel,effort:this.defaults.effort,omitGatewayToken:!0}),this.builtWith=n,this.runner)}async stream(e,n,r,s,i){let o=n,a=o.workspaceRoot,c=_b(a,this.defaults.workspace);Eb(a,c)&&!this.warnedWorkspace&&(this.warnedWorkspace=!0,console.warn(`[sandbox] ignoring workspaceRoot ${a} from the wire \u2014 this sandbox works in ${c}`));try{cc.mkdirSync(c,{recursive:!0}),process.chdir(c)}catch(p){throw new Error(`sandbox cannot use workspace ${c}: ${p instanceof Error?p.message:String(p)}`)}let l=this.ensureRunner(o),u=o,d=u.permissions??(u.fileAccess?{fileAccess:u.fileAccess}:{fileAccess:this.defaults.fileAccess}),f=await l.run({engineId:o.engineId??this.defaults.engineId,modelId:o.modelId??this.defaults.modelId,message:e,workspaceRoot:c,additionalDirectories:o.additionalDirectories,sessionId:o.sessionId,modelToken:o.modelToken,permissions:d,analyticsUserId:o.analyticsUserId,engineHomeUserKey:o.engineHomeUserKey,turnEnv:o.turnEnv,gatewaySessionKey:o.gatewaySessionKey,emitter:r,signal:i});if(!f.success&&f.error)throw new Error(f.error)}onMaintenance(){this.runner?.runMaintenance?.()}dispose(){this.runner?.dispose()}};function jB(){process.on("unhandledRejection",t=>{let e=t instanceof Error?t.message:String(t);console.error(`[sandbox] unhandled rejection (session kept alive): ${e}`)}),process.on("uncaughtException",t=>{console.error(`[sandbox] uncaught exception \u2014 exiting so the driver recreates this sandbox: ${t.message}`),process.exit(1)})}async function xB(t){await(0,GB.ensureDeps)(!1);let e=t.stateDir??"/state",n=t.workspace??Xu.join(e,"workspace");cc.mkdirSync(n,{recursive:!0});let r=await(0,hb.loadAgentPack)(t.agent,n),s={name:r.manifest.metadata.name,version:r.manifest.metadata.version,engine:r.manifest.spec?.engine??"claude"};t.stateDir?process.env.AGENTHIPPO_HOME=e:process.env.AGENTHIPPO_HOME=process.env.AGENTHIPPO_HOME??e,process.env.AGENTHIPPO_SANDBOX="1";let i=Xu.join(e,"home");cc.mkdirSync(i,{recursive:!0}),process.env.HOME=i;let o=n;await(0,Lh.syncPackToWorkspace)(o,r.packPath,s.name,s.engine,console,(0,LB.findBundledBasePromptsDir)()),console.log(`[sandbox] pack ${s.name}@${s.version??"?"} synced into ${o} (engine ${s.engine})`),jB();let a=r.manifest.spec?.cheapModel?.trim(),c=new Mh({storagePath:e,analyticsSessionsDir:(0,UB.resolveAnalyticsSessionsDir)(e,!1),packId:s.name,packVersion:s.version,engineId:s.engine,modelId:(0,Lh.resolveModelAlias)(r.manifest.spec?.model?.trim()||"ah-auto"),claudeCheapModel:a?(0,Lh.resolveModelAlias)(a):void 0,effort:r.manifest.spec?.effort?.trim()||void 0,fileAccess:(0,hb.getFileAccess)(r),workspace:o}),l={logger:console};if(t.stdio){await(0,mb.startRunnerHost)({engine:c,runtime:l,input:process.stdin,output:{write:p=>process.stdout.write(p)},nativeSessionId:()=>c.nativeSessionId}).done;return}let u=t.socket;if(!u)throw new Error("sandbox requires --socket <path> or --stdio");try{cc.unlinkSync(u)}catch{}let d=DB.createServer(f=>{(0,mb.startRunnerHost)({engine:c,runtime:l,input:f,output:{write:p=>f.write(p)},nativeSessionId:()=>c.nativeSessionId})});try{await new Promise((f,p)=>{d.once("error",p),d.listen(u,()=>f())})}catch(f){console.error(`[sandbox] FATAL: cannot listen at ${u}: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}try{cc.chmodSync(u,432)}catch{}console.log(`[sandbox] ${t.sandboxId??"sandbox"} listening on ${u} (pack ${s.name}@${s.version??"?"})`),await new Promise(f=>{let p=()=>{d.close(()=>f()),c.dispose()};process.once("SIGTERM",p),process.once("SIGINT",p),d.once("close",()=>f())})}});Object.defineProperty(exports,"__esModule",{value:!0});var wb=require("module"),BB=wb.prototype.require;wb.prototype.require=function(t){return t==="vscode"?{window:{showInformationMessage:()=>{},showErrorMessage:()=>{},showWarningMessage:()=>Promise.resolve(void 0)},workspace:{getConfiguration:()=>({get:(e,n)=>n,inspect:()=>{}})},commands:{executeCommand:async()=>{}},Memento:class{}}:BB.apply(this,arguments)};var Sb=require("commander"),FB=fw(),Ab=hw(),VB=aA(),KB=ap(),WB=wA(),qB=VA(),YB=YA(),JB=zA(),XB=PT(),zB=eh(),QB=nb(),Tb=ob(),mi=db(),ZB=fb(),lc=xi(),zu=ot(),eF=yc(),bb=nu();function tF(t){let e=parseInt(t.maxConcurrentSandboxes??"",10);if(Number.isFinite(e)&&e>0)return e;let n=parseInt(t.maxConcurrentCells??"",10);if(Number.isFinite(n)&&n>0)return console.warn(`Warning: --max-concurrent-cells is DEPRECATED; use ${bb.DEPRECATED_CAP_SPELLINGS["--max-concurrent-cells"]}. Honouring it for now.`),n}function nF(){try{return Tl().version??"dev"}catch{return"dev"}}var rF=nF(),sF=[`${zu.AGENTIDE_BRAND_NAME} CLI - Run agent packs from the command line`,"","Environment Variables:"," AGENTHIPPO_LITELLM_API_KEY API key for LiteLLM proxy"," AGENTHIPPO_LITELLM_BASE_URL Base URL for LiteLLM proxy"," ANTHROPIC_API_KEY Direct Anthropic API key"," OPENAI_API_KEY Direct OpenAI API key"," AGENTHIPPO_DEFAULT_ENGINE Default engine (claude/codex/<custom-engine-id>)"," AGENTHIPPO_DEFAULT_MODEL Default model ID"," AGENTHIPPO_HOME Override ~/.agent-hippo directory"," AGENTHIPPO_SERVE_HOST Listen address for serve (default 127.0.0.1; use 0.0.0.0 in containers)"," AGENTHIPPO_ENGINE_IDLE_TTL Seconds an engine session or warm worker may sit idle before it is closed (default 1800)"," AGENTHIPPO_STORE_REPO Override store GitHub repo (owner/repo; CLI store commands)"," AGENTHIPPO_CONTROL_URL Control plane URL (control commands)"," AGENTHIPPO_CONTROL_KEY Your control API key, minted in the control console (control commands)","","Quickstart:",` AGENTHIPPO_LITELLM_BASE_URL="http://localhost:4000" AGENTHIPPO_LITELLM_API_KEY="dummy" AGENTHIPPO_DEFAULT_MODEL="litellm/gpt-5.5" AGENTHIPPO_DEFAULT_ENGINE="codex" ${zu.AGENTIDE_CLI_NAME} ask "Reply with exactly: CLI_TEST_OK"`,"","Agent Packs:",` Loaded from ~/${zu.AGENTIDE_DIR_NAME}/agents/<name>/ or absolute/relative paths.`," Pack permissions control filesystem access scope."].join(`
701
+ THIS BINARY (contract checks \u2014 environment-independent, pass with no deployment)`),n.filter(c=>c.kind==="algorithm").forEach(a),console.log(""),o)console.log("NO DEPLOYMENT WAS PROBED. The binary checks above say nothing about a running"),console.log("system \u2014 pass --sandbox <container> --tier <n> to actually test one.");else{let c=s.filter(l=>l.status==="pass").length;console.log(`${c}/${s.length} deployment checks passed`+(r.length-s.length?`, ${r.length-s.length} not probed`:""))}i.length&&console.log(`${i.length} FAILED`)}return i.length?1:o?2:0}});var gb=T(Dh=>{"use strict";Object.defineProperty(Dh,"__esModule",{value:!0});Dh.startRunnerHost=NB;var IB=Li(),kh=pp(),PB={selected:[],freeText:null,declined:!0};function NB(t){let e=u=>{t.output.write((0,kh.encodeRunnerFrame)(u))},n=new Map,r="",s=!1,i=setInterval(()=>{try{t.engine.onMaintenance(t.logger??CB())}catch(u){t.logger?.warn(`[Runner] maintenance failed: ${$h(u)}`)}},t.maintenanceIntervalMs??(0,IB.engineMaintenanceIntervalMs)());typeof i.unref=="function"&&i.unref();let o=()=>{},a=new Promise(u=>{o=()=>{if(!s){s=!0,clearInterval(i);for(let f of n.values())f.abort();n.clear(),u()}},t.input.on("data",f=>{r+=typeof f=="string"?f:f.toString("utf8");let{lines:d,rest:g}=(0,kh.splitFrames)(r);r=g;for(let p of d){let _=(0,kh.parseClientFrame)(p);if(!_){t.logger?.warn("[Runner] dropped malformed client frame");continue}c(_)}}),t.input.on("end",o),t.input.on("close",o),t.input.on("error",f=>{t.logger?.warn(`[Runner] input error: ${$h(f)}`),o()})});async function c(u){if(u.type==="abort"){n.get(u.id)?.abort();return}await l(u.id,u.message,u.options)}async function l(u,f,d){if(n.has(u)){e({type:"failed",id:u,message:`duplicate run id ${u}`});return}let g=new AbortController;n.set(u,g);let p=RB(e,u);try{await t.engine.stream(f,d,p,t.runtime,g.signal);let _=t.nativeSessionId?.();e({type:"result",id:u,..._?{nativeSessionId:_}:{}})}catch(_){let h=g.signal.aborted?"aborted":$h(_);e({type:"failed",id:u,message:h})}finally{n.delete(u)}}return e({type:"ready",demux:!0}),{done:a,close:()=>o()}}function RB(t,e){let n=r=>t({id:e,event:r});return{async thinking(r){n({type:"thinking",delta:r})},async text(r){n({type:"text",delta:r})},async toolStart(r,s,i){n({type:"toolStart",toolName:r,...s!==void 0?{input:s}:{},...i?{toolCallId:i}:{}})},async toolEnd(r,s,i,o){n({type:"toolEnd",toolName:r,toolCallId:s,...i!==void 0?{result:i}:{},...o!==void 0?{isError:o}:{}})},async progress(r){n({type:"progress",message:r})},async question(r){return t({type:"question",payload:r,id:e}),PB},async error(r){n({type:"error",message:r})},async done(){n({type:"done"})}}}function $h(t){return t instanceof Error?t.message:String(t)}function CB(){return{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}});var yb=T(Fr=>{"use strict";var kB=Fr&&Fr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),$B=Fr&&Fr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Gh=Fr&&Fr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&kB(n,e,r[s]);return $B(n,e),n}})();Object.defineProperty(Fr,"__esModule",{value:!0});Fr.resolveSandboxWorkspace=_b;Fr.isForeignWorkspace=Eb;Fr.sandboxCommand=xB;var cc=Gh(require("fs")),DB=Gh(require("net")),Xu=Gh(require("path")),Lh=Ui(),LB=en(),hb=ji(),MB=Cp(),GB=xi(),UB=ur(),HB=Cr(),mb=gb();function _b(t,e){return e}function Eb(t,e){return t?Xu.resolve(t)!==Xu.resolve(e):!1}var Mh=class{defaults;id="sandbox";displayName="Sandbox runner";runner;builtWith;warnedWorkspace=!1;nativeSessionId;constructor(e){this.defaults=e}ensureRunner(e){let n=e.baseUrl??"";return this.runner&&this.builtWith===n?this.runner:(this.runner?.dispose(),this.runner=(0,MB.createPackRunner)({storagePath:this.defaults.storagePath,analyticsSessionsDir:this.defaults.analyticsSessionsDir,packId:this.defaults.packId,packVersion:this.defaults.packVersion,provenance:()=>(0,HB.readProvenanceEnvFromProcess)(),workspaceRoot:this.defaults.workspace,credentials:{baseUrl:e.baseUrl,litellmApiKey:e.modelToken,useLiteLLM:!!e.baseUrl},claudeCheapModel:this.defaults.claudeCheapModel,effort:this.defaults.effort,omitGatewayToken:!0}),this.builtWith=n,this.runner)}async stream(e,n,r,s,i){let o=n,a=o.workspaceRoot,c=_b(a,this.defaults.workspace);Eb(a,c)&&!this.warnedWorkspace&&(this.warnedWorkspace=!0,console.warn(`[sandbox] ignoring workspaceRoot ${a} from the wire \u2014 this sandbox works in ${c}`));try{cc.mkdirSync(c,{recursive:!0}),process.chdir(c)}catch(g){throw new Error(`sandbox cannot use workspace ${c}: ${g instanceof Error?g.message:String(g)}`)}let l=this.ensureRunner(o),u=o,f=u.permissions??(u.fileAccess?{fileAccess:u.fileAccess}:{fileAccess:this.defaults.fileAccess}),d=await l.run({engineId:o.engineId??this.defaults.engineId,modelId:o.modelId??this.defaults.modelId,message:e,workspaceRoot:c,additionalDirectories:o.additionalDirectories,sessionId:o.sessionId,modelToken:o.modelToken,permissions:f,analyticsUserId:o.analyticsUserId,engineHomeUserKey:o.engineHomeUserKey,turnEnv:o.turnEnv,gatewaySessionKey:o.gatewaySessionKey,emitter:r,signal:i});if(!d.success&&d.error)throw new Error(d.error)}onMaintenance(){this.runner?.runMaintenance?.()}dispose(){this.runner?.dispose()}};function jB(){process.on("unhandledRejection",t=>{let e=t instanceof Error?t.message:String(t);console.error(`[sandbox] unhandled rejection (session kept alive): ${e}`)}),process.on("uncaughtException",t=>{console.error(`[sandbox] uncaught exception \u2014 exiting so the driver recreates this sandbox: ${t.message}`),process.exit(1)})}async function xB(t){await(0,GB.ensureDeps)(!1);let e=t.stateDir??"/state",n=t.workspace??Xu.join(e,"workspace");cc.mkdirSync(n,{recursive:!0});let r=await(0,hb.loadAgentPack)(t.agent,n),s={name:r.manifest.metadata.name,version:r.manifest.metadata.version,engine:r.manifest.spec?.engine??"claude"};t.stateDir?process.env.AGENTHIPPO_HOME=e:process.env.AGENTHIPPO_HOME=process.env.AGENTHIPPO_HOME??e,process.env.AGENTHIPPO_SANDBOX="1";let i=Xu.join(e,"home");cc.mkdirSync(i,{recursive:!0}),process.env.HOME=i;let o=n;await(0,Lh.syncPackToWorkspace)(o,r.packPath,s.name,s.engine,console,(0,LB.findBundledBasePromptsDir)()),console.log(`[sandbox] pack ${s.name}@${s.version??"?"} synced into ${o} (engine ${s.engine})`),jB();let a=r.manifest.spec?.cheapModel?.trim(),c=new Mh({storagePath:e,analyticsSessionsDir:(0,UB.resolveAnalyticsSessionsDir)(e,!1),packId:s.name,packVersion:s.version,engineId:s.engine,modelId:(0,Lh.resolveModelAlias)(r.manifest.spec?.model?.trim()||"ah-auto"),claudeCheapModel:a?(0,Lh.resolveModelAlias)(a):void 0,effort:r.manifest.spec?.effort?.trim()||void 0,fileAccess:(0,hb.getFileAccess)(r),workspace:o}),l={logger:console};if(t.stdio){await(0,mb.startRunnerHost)({engine:c,runtime:l,input:process.stdin,output:{write:g=>process.stdout.write(g)},nativeSessionId:()=>c.nativeSessionId}).done;return}let u=t.socket;if(!u)throw new Error("sandbox requires --socket <path> or --stdio");try{cc.unlinkSync(u)}catch{}let f=DB.createServer(d=>{(0,mb.startRunnerHost)({engine:c,runtime:l,input:d,output:{write:g=>d.write(g)},nativeSessionId:()=>c.nativeSessionId})});try{await new Promise((d,g)=>{f.once("error",g),f.listen(u,()=>d())})}catch(d){console.error(`[sandbox] FATAL: cannot listen at ${u}: ${d instanceof Error?d.message:String(d)}`),process.exit(1)}try{cc.chmodSync(u,432)}catch{}console.log(`[sandbox] ${t.sandboxId??"sandbox"} listening on ${u} (pack ${s.name}@${s.version??"?"})`),await new Promise(d=>{let g=()=>{f.close(()=>d()),c.dispose()};process.once("SIGTERM",g),process.once("SIGINT",g),f.once("close",()=>d())})}});Object.defineProperty(exports,"__esModule",{value:!0});var wb=require("module"),BB=wb.prototype.require;wb.prototype.require=function(t){return t==="vscode"?{window:{showInformationMessage:()=>{},showErrorMessage:()=>{},showWarningMessage:()=>Promise.resolve(void 0)},workspace:{getConfiguration:()=>({get:(e,n)=>n,inspect:()=>{}})},commands:{executeCommand:async()=>{}},Memento:class{}}:BB.apply(this,arguments)};var Sb=require("commander"),FB=fw(),Ab=hw(),VB=aA(),KB=ap(),WB=wA(),qB=VA(),YB=YA(),JB=zA(),XB=PT(),zB=eh(),QB=nb(),Tb=ob(),mi=db(),ZB=fb(),lc=xi(),zu=ot(),eF=yc(),bb=nu();function tF(t){let e=parseInt(t.maxConcurrentSandboxes??"",10);if(Number.isFinite(e)&&e>0)return e;let n=parseInt(t.maxConcurrentCells??"",10);if(Number.isFinite(n)&&n>0)return console.warn(`Warning: --max-concurrent-cells is DEPRECATED; use ${bb.DEPRECATED_CAP_SPELLINGS["--max-concurrent-cells"]}. Honouring it for now.`),n}function nF(){try{return Tl().version??"dev"}catch{return"dev"}}var rF=nF(),sF=[`${zu.AGENTIDE_BRAND_NAME} CLI - Run agent packs from the command line`,"","Environment Variables:"," AGENTHIPPO_LITELLM_API_KEY API key for LiteLLM proxy"," AGENTHIPPO_LITELLM_BASE_URL Base URL for LiteLLM proxy"," ANTHROPIC_API_KEY Direct Anthropic API key"," OPENAI_API_KEY Direct OpenAI API key"," AGENTHIPPO_DEFAULT_ENGINE Default engine (claude/codex/<custom-engine-id>)"," AGENTHIPPO_DEFAULT_MODEL Default model ID"," AGENTHIPPO_HOME Override ~/.agent-hippo directory"," AGENTHIPPO_SERVE_HOST Listen address for serve (default 127.0.0.1; use 0.0.0.0 in containers)"," AGENTHIPPO_ENGINE_IDLE_TTL Seconds an engine session or warm worker may sit idle before it is closed (default 1800)"," AGENTHIPPO_STORE_REPO Override store GitHub repo (owner/repo; CLI store commands)"," AGENTHIPPO_CONTROL_URL Control plane URL (control commands)"," AGENTHIPPO_CONTROL_KEY Your control API key, minted in the control console (control commands)","","Quickstart:",` AGENTHIPPO_LITELLM_BASE_URL="http://localhost:4000" AGENTHIPPO_LITELLM_API_KEY="dummy" AGENTHIPPO_DEFAULT_MODEL="litellm/gpt-5.5" AGENTHIPPO_DEFAULT_ENGINE="codex" ${zu.AGENTIDE_CLI_NAME} ask "Reply with exactly: CLI_TEST_OK"`,"","Agent Packs:",` Loaded from ~/${zu.AGENTIDE_DIR_NAME}/agents/<name>/ or absolute/relative paths.`," Pack permissions control filesystem access scope."].join(`
702
702
  `),Ke=new Sb.Command;Ke.hook("preAction",async(t,e)=>{e?.name()!=="sandbox"&&await(0,eF.mergeAgentHomeEnvIntoProcessEnv)()});Ke.name(zu.AGENTIDE_CLI_NAME).description(sF).version(rF);Ke.option("-v, --verbose","Enable verbose logging").option("--config <path>","Path to config file");Ke.command("chat").description("Start interactive chat session").option("-a, --agent <name>","Agent pack to use").option("-e, --engine <id>","Override pack engine: claude|codex|<custom-engine-id>").option("-m, --model <id>","Override pack model (e.g. litellm/gpt-5.6-luna)").option("-w, --workspace <path>","Workspace directory",process.cwd()).action(async t=>{let e=Ke.opts().verbose;await(0,lc.ensureDeps)(e),await(0,FB.chatCommand)({agent:t.agent,engine:t.engine,model:t.model,workspace:t.workspace,verbose:e})});Ke.command("ask <message...>").description("Send a single message and exit").option("-a, --agent <name>","Agent pack to use").option("-e, --engine <id>","Override pack engine: claude|codex|<custom-engine-id>").option("-m, --model <id>","Override pack model (e.g. litellm/gpt-5.6-luna)").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("-f, --file <path>","Include file content in context").option("--json","Output as JSON").option("--session-id <id>","Conversation session id (enables multi-turn resume across ask invocations)").action(async(t,e)=>{let n=Ke.opts().verbose;await(0,lc.ensureDeps)(n);let r=t.join(" ");await(0,Ab.askCommand)({message:r,agent:e.agent,engine:e.engine,model:e.model,workspace:e.workspace,file:e.file,json:e.json,sessionId:e.sessionId,verbose:n})});Ke.command("agent").description("Run agent operations").command("run").description("Run a single prompt and output JSON").requiredOption("--json","Output JSON (required)").requiredOption("--prompt <message>","Prompt text").option("--pack <name>","Agent pack to use").option("-e, --engine <id>","Override pack engine: claude|codex|<custom-engine-id>").option("-m, --model <id>","Override pack model (e.g. litellm/gpt-5.6-luna)").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("--session-id <id>","Optional session id for the caller").option("--system-prompt <text>","Optional system prompt override").option("-f, --file <path>","Include file content in context").action(async t=>{let e=Ke.opts().verbose;await(0,lc.ensureDeps)(e),await(0,Ab.askCommand)({message:t.prompt,agent:t.pack,engine:t.engine,model:t.model,workspace:t.workspace,file:t.file,json:!0,sessionId:t.sessionId,systemPrompt:t.systemPrompt,outputMode:"agent-run",verbose:e})});Ke.command("serve").description("Start HTTP server").requiredOption("-a, --agent <name>","Agent pack to use (required)").option("-e, --engine <id>","Override pack engine: claude|codex|<custom-engine-id>").option("-m, --model <id>","Override pack model (e.g. litellm/gpt-5.6-luna)").option("-p, --port <port>","Port to listen on","3000").option("--host <address>","Address to bind the HTTP server (default 127.0.0.1; use 0.0.0.0 in containers/behind a proxy)").option("-w, --workspace <path>","Default workspace directory",process.cwd()).option("--bind <channels>",'Bind agent to gateway channels (comma-separated, e.g. "telegram,whatsapp" or "*" for all)').option("--gateway-bridge","Keep a WebSocket to OpenClaw and register this pack so `openclaw agent --agent <id>` routes here (needs OPENCLAW_GATEWAY_TOKEN if your gateway requires it)").option("--state-dir <path>","Persist session state here (honors AGENTHIPPO_HOME; replaces the tmpdir default)").option("--max-turns-per-session <n>","Cap turns per session (abuse/runaway guard); 0 = unlimited","0").option("--www-dir <path>","Serve deploy/www/index.html at GET / (static browser chat UI)").option("--sandbox <mode>","Run each session's engine in a sandbox: process (tier 0, no boundary) or container (tier 2, one disposable container per session with only its declared routes). Unset = in-process (default, unchanged)").option("--sandbox-image <ref>","--sandbox container: sandbox image pinned BY DIGEST (image@sha256:...)").option("--sandbox-scope <scope>","--sandbox: what one sandbox holds \u2014 session (default, one per conversation) or user (one per verified user on this instance, so their sessions share a container, workspace, TTL and kill). Unidentified callers get one each either way").option("--pull-packs","Fetch the version the lease pins from the store instead of only refusing others. Always verifies the signature; a fetch or verification failure keeps serving the current version").option("--require-signed-pack","Refuse to start a sandbox unless the pack is signed by a trusted key (the lease may also require this; neither side can waive the other). Now the DEFAULT \u2014 kept so existing invocations still mean something").option("--allow-unsigned-pack","LOCAL DEVELOPMENT ONLY: run a pack this instance cannot verify. Signature checking is required by default; this disables it and warns loudly on every boot. A lease that sets requireSignedPack still overrides it").option("--require-signed-lease","Refuse to act on a lease that is not signed (ES256 compact JWS) by a trusted key. Tighten-only with lease.requireSignedLease, and sticky once a signed lease has been seen").option("--lease-max-staleness <seconds>","Refuse turns after this long with no successful lease refresh, so network denial cannot hold a revoked fleet open (default 86400; 0 disables)").option("--static-lease <path>","Air-gapped deployments: read the lease from a JSON file instead of failing closed when AGENTHIPPO_LEASE_URL has never answered. A URL still overrides it once reachable").option("--sandbox-ttl <seconds>","--sandbox: reap an idle sandbox after N seconds; the next message recreates it and resumes the session","1800").option("--shared-workspace","--sandbox container: mount ONE workspace into every session's sandbox (default: one per session). Sessions can then read and overwrite each other's files \u2014 only for a single trust domain").option("--max-session-seconds <seconds>","--sandbox: cap one session's wall-clock lifetime; a breach revokes or destroys its sandbox").option("--max-concurrent-sandboxes <n>","--sandbox: cap live sandboxes on this instance (blast radius)").addOption(new Sb.Option("--max-concurrent-cells <n>","DEPRECATED alias for --max-concurrent-sandboxes").hideHelp()).option("--cap-on-breach <action>","--sandbox: what a cap breach does \u2014 revoke-inference (default) or destroy-sandbox. An unrecognised value fails CLOSED to destroy-sandbox").option("--lease-poll <seconds>","--sandbox: how often to re-check the lease, so a kill switch stops RUNNING sandboxes. Worst-case kill latency is 2x this (poll + cache); an admin refresh is immediate","30").action(async t=>{let e=Ke.opts().verbose;await(0,lc.ensureDeps)(e),await(0,VB.serveCommand)({sandbox:t.sandbox==="container"?"container":t.sandbox==="process"?"process":void 0,sandboxImage:t.sandboxImage,sandboxScope:t.sandboxScope==="user"?"user":"session",requireSignedPack:!!t.requireSignedPack,allowUnsignedPack:!!t.allowUnsignedPack,requireSignedLease:!!t.requireSignedLease,leaseMaxStalenessSeconds:t.leaseMaxStaleness!==void 0&&Number.isFinite(Number(t.leaseMaxStaleness))?Number(t.leaseMaxStaleness):void 0,staticLeaseFile:t.staticLease,pullPacks:!!t.pullPacks,sandboxTtlSeconds:parseInt(t.sandboxTtl,10)||void 0,sharedWorkspace:!!t.sharedWorkspace,maxSessionSeconds:parseInt(t.maxSessionSeconds,10)||void 0,maxConcurrentSandboxes:tF(t),capOnBreach:(()=>{let n=(0,bb.resolveOnBreach)(t.capOnBreach,"--cap-on-breach");for(let r of n.warnings)console.warn(`Warning: ${r}`);return n.action})(),leasePollSeconds:parseInt(t.leasePoll,10)||void 0,agent:t.agent,engine:t.engine,model:t.model,port:parseInt(t.port,10),host:t.host,workspace:t.workspace,bind:t.bind,gatewayBridge:!!t.gatewayBridge,stateDir:t.stateDir,maxTurnsPerSession:parseInt(t.maxTurnsPerSession,10),wwwDir:t.wwwDir,verbose:e})});Ke.command("conformance").description("Probe a deployment against its own claims: credential confinement, isolation tier, cost-cap binding, warrant integrity, rollback/kill switch. Exit 1 on any failure, 2 when no deployment was probed (--sandbox/--tier omitted) \u2014 only exit 0 means a real deployment was measured.").option("--sandbox <id>","Running sandbox container id/name \u2014 required to probe INSIDE a sandbox").option("--tier <n>","Declared isolation tier (0-3); probed, not trusted").option("--runtime <bin>","Container runtime binary","docker").option("--json","Emit JSON").action(async t=>{let{conformanceCommand:e}=await Promise.resolve().then(()=>$n(pb())),n=await e({sandbox:t.sandbox,tier:t.tier===void 0?void 0:parseInt(t.tier,10),runtime:t.runtime,json:!!t.json});process.exitCode=n});Ke.command("sandbox").description("Run the in-sandbox engine host (sandbox runner). Speaks the frame protocol to serve over a unix socket or stdio; holds no data or model credential.").requiredOption("-a, --agent <path>","Pack directory mounted into the sandbox").option("--socket <path>","Unix socket to listen on (container driver)").option("--stdio","Speak the protocol on stdin/stdout instead (process driver)").option("-w, --workspace <path>","Workspace directory (default: <state-dir>/workspace)").option("--state-dir <path>","State directory","/state").option("--sandbox-id <id>","Sandbox id (joins evidence records)").action(async t=>{let{sandboxCommand:e}=await Promise.resolve().then(()=>$n(yb()));await e({agent:t.agent,socket:t.socket,stdio:!!t.stdio,workspace:t.workspace,stateDir:t.stateDir,sandboxId:t.sandboxId})});Ke.command("data-plane").description("Run the connector as a sidecar (holds the backend base credential; the agent container does not)").requiredOption("-a, --agent <name>","Agent pack (reads spec.dataPlane connector + provider)").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("--gateway-port <port>","Port the engine dials (nonce-auth MCP)","9090").option("--control-port <port>","Port serve dials to register turns (bearer-auth)","9091").option("--connect-port <port>","provider=stored-grant: port for the /connect/* consent pages, proxied by the identity edge").option("--host <address>","Bind address (default 0.0.0.0 for the pod network)").option("--state-dir <path>","Where data-plane audit events are written. Same precedence as serve: --state-dir, then AGENTHIPPO_HOME, then tmpdir").action(async t=>{let e=Ke.opts().verbose;await(0,lc.ensureDeps)(e),await(0,KB.dataPlaneSidecarCommand)({agent:t.agent,workspace:t.workspace,gatewayPort:parseInt(t.gatewayPort,10),controlPort:parseInt(t.controlPort,10),connectPort:t.connectPort!==void 0?parseInt(t.connectPort,10):void 0,host:t.host,stateDir:t.stateDir,verbose:e})});Ke.command("auth-broker").description("Start the AgentHippo auth broker (OAuth + IDE bootstrap API)").action(async()=>{await(0,WB.authBrokerCommand)()});Ke.command("deploy <action> [pack]").description("Generate a self-contained deploy staging dir (init). Targets: vm, compose, cloudrun, databricks-app, spcs, cloudflare, aws-ecs, azure-container-apps, all. Or pick a --blueprint instead of raw --target/--ingress.").option("-t, --target <target>","Deploy target","vm").option("--blueprint <id>","Named preset (sandbox, prospect-demo, team-pilot, regulated-air-gapped, enterprise-fleet) \u2014 resolves --target/--ingress for you; overrides both when set").option("--platform <platform>","Which platform to use within --blueprint's supported set (defaults to the blueprint's first); ignored without --blueprint").option("-o, --out <path>","Staging directory (default: ./deploy-out/<pack>-<target> relative to cwd; run from the pack parent, not from inside the pack)").option("--packdir <path>","Pack directory (defaults to [pack] arg or cwd)").option("--image <ref>","Runtime image ref (default: engine runtime:latest, or :latest-cursor for cursor packs)").option("-p, --port <port>","Container port","8080").option("--gateway <channels>",'Agent Anywhere: bind channels (e.g. "slack") + add OpenClaw gateway service (compose target)').option("--hostname <host>","Public hostname for SSO edge (Caddy, OAuth, tunnel)","auth.agenthippo.ai").option("--ingress <mode>","iap (Cloud Run built-in IAP only), edge (self-issued AgentHippo edge + Google OAuth \u2014 vm/compose/cloudrun/aws-ecs/azure-container-apps), or edge-fed (federated: auth via the central IdP, no per-target OAuth client \u2014 same targets as edge)","iap").option("--idp-url <url>","edge-fed: central IdP base URL browsers redirect to for login (e.g. https://auth.agenthippo.ai)","https://auth.agenthippo.ai").option("--cookie-domain <domain>","edge-fed: parent domain the shared auth cookie is scoped to (e.g. .agenthippo.ai)",".agenthippo.ai").option("--colocate","edge-fed + vm/compose only: ride the org IdP's already-running Caddy + auth-broker instead of shipping this agent's own").option("--edge-turn-connector <addr>","EDGE turn registration (P1 fix): connector sidecar control-API address (e.g. mypack-connector:9091); the generated route registers each chat turn via forward_auth /edge/turn and copies X-Agent-Turn-Nonce \u2014 the agent container never holds the register token").option("--model-routing <mode>","Cloud Run + edge-fed: sidecar (in-pod LiteLLM+OTEL, default) or gateway (agent \u2192 gateway.agenthippo.ai directly, lean)").option("--force","Overwrite existing files").action(async(t,e,n)=>{let r=n.ingress==="edge"?"edge":n.ingress==="edge-fed"?"edge-fed":"iap",s=n.modelRouting==="gateway"?"gateway":n.modelRouting==="sidecar"?"sidecar":void 0;await(0,qB.deployCommand)(t,e,{target:n.target,blueprint:n.blueprint,platform:n.platform,out:n.out,image:n.image,gateway:n.gateway,hostname:n.hostname,port:parseInt(n.port,10),force:!!n.force,packdir:n.packdir,ingress:r,idpUrl:n.idpUrl,cookieDomain:n.cookieDomain,colocate:!!n.colocate,modelRouting:s,edgeTurnConnector:n.edgeTurnConnector})});Ke.command("idp <action>").description("Generate the central IdP stack (init) \u2014 Caddy + oauth2-proxy + auth-broker. One per organization; agents federate against it with `deploy init --ingress edge-fed`.").option("--hostname <host>","Public hostname the IdP is reachable at (e.g. auth.corp.example) \u2014 required").option("--cookie-domain <domain>","Parent domain the shared auth cookie is scoped to (e.g. .corp.example); defaults to the hostname's own domain").option("-o, --out <path>","Output directory (default: ./enterprise-deploy/idp)").option("--force","Overwrite existing files").action(async(t,e)=>{await(0,YB.idpCommand)(t,{hostname:e.hostname,cookieDomain:e.cookieDomain,out:e.out,force:!!e.force})});Ke.command("grants <action>").description("Personal-account grants of a stored-grant data plane: list (who connected what, no tokens) | revoke --user <id> (offboarding)").option("--user <id>","Verified user id to revoke").option("--service <service>","google | bank (default: both)").option("--bank <name>","Only this bank link (name or item_id) with --service bank").action(async(t,e)=>{await(0,JB.grantsCommand)(t,{user:e.user,service:e.service,bank:e.bank})});Ke.command("pack <action>").description("Manage agent packs (list, validate, sign, verify, digest, keygen, install)").argument("[name]","Pack name or path").option("-o, --output <path>","Output path for export, or for a generated signing key").option("--key <path>","pack sign: PEM file holding the ES256 private key").option("--kid <id>","pack sign/keygen: key id published in JWKS so verifiers can find the public half").option("--keys <path>","pack verify: JSON file of kid -> public PEM").option("--jwks <url>","pack verify: JWKS endpoint to fetch public halves from").option("--to <dir>","pack install: destination folder (flat layout for serve/deploy)").option("-f, --force","pack install: overwrite an existing folder").option("-w, --workspace <path>","Workspace directory for local packs",process.cwd()).action(async(t,e,n)=>{await(0,XB.packCommand)({action:t,name:e,output:n.output,to:n.to,force:n.force,workspace:n.workspace,key:n.key,kid:n.kid,keys:n.keys,jwks:n.jwks,verbose:Ke.opts().verbose})});Ke.command("store <action>").description("Search, install, and uninstall store artifacts").argument("[query]","Search query or artifact reference (e.g., skill/pdf-tools)").option("-t, --type <type>","Filter by type: pack, skill, mcp, engine, spotlight view").option("-l, --limit <n>","Max results for search","20").option("--version <ver>","Specific version to install or publish").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("-a, --agent <id>","Target agent ID for skill/mcp install","default").option("-f, --force","Overwrite existing installation").option("--bundle <mode>","Spotlight view publish bundle: scripts-only (default) or full").option("--full","Publish Spotlight view full bundle: scripts, assets, charts, exports, manifest.json (same as --bundle full)").option("--json","Output as JSON").action(async(t,e,n)=>{await(0,zB.storeCommand)({action:t,query:e,type:n.type,limit:parseInt(n.limit,10),version:n.version,workspace:n.workspace,agent:n.agent,force:n.force,bundle:n.bundle,full:n.full,json:n.json,verbose:Ke.opts().verbose})});var vb=Ke.command("gateway").description("Gateway outbound messaging");vb.command("send").description("Send a proactive message via the gateway (WebSocket RPC; hippoclaw CLI fallback)").option("--outbound <path>","Session gateway-outbound.json (see AGENTHIPPO_GATEWAY_OUTBOUND_FILE)").option("-a, --agent <id>","Agent pack id").requiredOption("-m, --message <text>","Message to send").option("--media <path-or-url>","Attach media (image/audio/video/document); local path or URL. Sent via gateway RPC so the bot token resolves from the gateway runtime snapshot.").option("-t, --target <target>","Explicit target (e.g. channel:C01234567); defaults to last inbound route").option("--thread-id <id>","Slack thread ts when sending to a threaded route").option("--dry-run","Print gateway RPC payload without sending").option("--json","Output handle + result as JSON").action(async t=>{await(0,Tb.gatewaySendCommand)({outbound:t.outbound??"",agent:t.agent??"",message:t.message,media:t.media,target:t.target,threadId:t.threadId,dryRun:!!t.dryRun,json:!!t.json})});vb.command("list").description("List stored gateway outbound routes from a session file").requiredOption("--outbound <path>","Session gateway-outbound.json (see AGENTHIPPO_GATEWAY_OUTBOUND_FILE)").option("-a, --agent <id>","Filter to one agent pack id").option("--json","Output as JSON").action(async t=>{await(0,Tb.gatewayListCommand)({outbound:t.outbound,agent:t.agent,json:!!t.json})});var Uh=Ke.command("control").description(`Register agents on a control plane from the terminal (needs ${mi.CONTROL_URL_ENV} and ${mi.CONTROL_KEY_ENV}; mint the key in the control console)`);Uh.command("register").description("Register a new agent, then download and unpack its setup bundle").requiredOption("-n, --name <name>","Agent name (its id is derived from this)").option("--id <id>","Exact agent id instead of one derived from the name").option("--pack <pack>","Pack name, when you already know it (bootstrap.sh reports it otherwise)").option("--url <url>",`Control plane URL (default: ${mi.CONTROL_URL_ENV})`).option("-d, --dir <path>","Where to put the bundle",process.cwd()).option("--no-bundle","Only register; print the enroll token instead of fetching the bundle").option("--no-extract","Keep the bundle as a .tar.gz instead of unpacking it").option("-f, --force","Overwrite an existing bundle directory").option("--json","Output as JSON").action(async t=>{await(0,mi.controlRegisterCommand)({name:t.name,id:t.id,pack:t.pack,url:t.url,dir:t.dir,bundle:t.bundle!==!1,extract:t.extract!==!1,force:!!t.force,json:!!t.json})});Uh.command("list").description("List your agents on the control plane, and how much of your allowance they use").option("--url <url>",`Control plane URL (default: ${mi.CONTROL_URL_ENV})`).option("--json","Output as JSON").action(async t=>{await(0,mi.controlListCommand)({url:t.url,json:!!t.json})});Uh.command("bundle <id>").description("Download (again) the setup bundle of an agent you own").option("--url <url>",`Control plane URL (default: ${mi.CONTROL_URL_ENV})`).option("-d, --dir <path>","Where to put the bundle",process.cwd()).option("--no-extract","Keep the bundle as a .tar.gz instead of unpacking it").option("-f, --force","Overwrite an existing bundle directory").option("--json","Output as JSON").action(async(t,e)=>{await(0,mi.controlBundleCommand)({id:t,url:e.url,dir:e.dir,extract:e.extract!==!1,force:!!e.force,json:!!e.json})});Ke.command("anywhere <action>").description("Manage Agent Anywhere gateway lifecycle").option("-s, --source <source>","Install source (e.g. openclaw@latest, org/repo#branch, /path/to/openclaw)").option("-p, --port <port>","Gateway port","18789").option("-b, --bind <address>","Gateway bind address","127.0.0.1").option("-t, --token <token>","Gateway auth token for starter config").option("--no-start","For setup: install/configure without starting").option("--config-template <path>","Path to openclaw.json template").action(async(t,e)=>{let n=parseInt(e.port,10);await(0,QB.anywhereCommand)({action:t,source:e.source,port:Number.isNaN(n)?void 0:n,bind:e.bind,token:e.token,noStart:e.start===!1,configTemplate:e.configTemplate})});Ke.command("__probe-custom-engine").description("Test custom engine load strategies (import probe)").option("-e, --engine <id>","Custom engine id","cursor").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("-s, --strategy <mode>","in-process|node-subprocess|all|a|c","all").action(async t=>{await(0,ZB.probeCustomEngineCommand)({engine:t.engine,workspace:t.workspace,strategy:t.strategy})});Ke.parseAsync();