@agenthippo-ai/agenthippo 1.110.24 → 1.110.26
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 +56 -56
- package/package.json +2 -2
package/out/cli/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*! Copyright (c) 2026 AgentHippo.ai. All rights reserved. Proprietary; see LICENSE. */
|
|
2
|
-
"use strict";var gA=Object.create;var Gp=Object.defineProperty;var hA=Object.getOwnPropertyDescriptor;var mA=Object.getOwnPropertyNames;var EA=Object.getPrototypeOf,yA=Object.prototype.hasOwnProperty;var T=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var _A=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of mA(e))!yA.call(t,s)&&s!==n&&Gp(t,s,{get:()=>e[s],enumerable:!(r=hA(e,s))||r.enumerable});return t};var Sn=(t,e,n)=>(n=t!=null?gA(EA(t)):{},_A(e||!t||!t.__esModule?Gp(n,"default",{value:t,enumerable:!0}):n,t));var
|
|
2
|
+
"use strict";var gA=Object.create;var Gp=Object.defineProperty;var hA=Object.getOwnPropertyDescriptor;var mA=Object.getOwnPropertyNames;var EA=Object.getPrototypeOf,yA=Object.prototype.hasOwnProperty;var T=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var _A=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of mA(e))!yA.call(t,s)&&s!==n&&Gp(t,s,{get:()=>e[s],enumerable:!(r=hA(e,s))||r.enumerable});return t};var Sn=(t,e,n)=>(n=t!=null?gA(EA(t)):{},_A(e||!t||!t.__esModule?Gp(n,"default",{value:t,enumerable:!0}):n,t));var Ye=T(be=>{"use strict";Object.defineProperty(be,"__esModule",{value:!0});be.SETTINGS_DISPLAY_PREFIX=be.SETTINGS_KEY_PREFIX=be.AGENTIDE_DEPS_PACKAGE_NAME=be.AGENTIDE_DEPS_DIR_NAME=be.AGENTIDE_CLI_NAME=be.AGENTIDE_DIR_NAME=be.AGENTIDE_EXTENSION_NAME=be.AGENTIDE_BRAND_NAME=void 0;be.toSettingsDisplayKey=Up;be.describeSettingKey=wA;be.applyBrandingTokens=Hp;be.brandify=AA;be.AGENTIDE_BRAND_NAME="Agent Hippo";be.AGENTIDE_EXTENSION_NAME=`${be.AGENTIDE_BRAND_NAME} Extension`;be.AGENTIDE_DIR_NAME=".agent-hippo";be.AGENTIDE_CLI_NAME="agenthippo";be.AGENTIDE_DEPS_DIR_NAME=`.${be.AGENTIDE_CLI_NAME}-deps`;be.AGENTIDE_DEPS_PACKAGE_NAME=`${be.AGENTIDE_CLI_NAME}-deps`;be.SETTINGS_KEY_PREFIX="agentide.";be.SETTINGS_DISPLAY_PREFIX="agenthippoai.";function Up(t){return t.startsWith(be.SETTINGS_KEY_PREFIX)?be.SETTINGS_DISPLAY_PREFIX+t.slice(be.SETTINGS_KEY_PREFIX.length):t}function wA(t){let e=Up(t);return e===t?t:`${t} (shown in Settings as ${e})`}function Hp(t){return t.replace(/\{\{AGENT_BRAND\}\}|\{\{AGENTIDE_BRAND\}\}/g,be.AGENTIDE_BRAND_NAME).replace(/\{\{BRAND_FOLDER\}\}/g,be.AGENTIDE_DIR_NAME)}function AA(t){return Hp(t).replace(/\bAgentIDE\b/g,be.AGENTIDE_BRAND_NAME)}});var jn=T(B=>{"use strict";var SA=B&&B.__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]})),bA=B&&B.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Dl=B&&B.__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"&&SA(n,e,r[s]);return bA(n,e),n}})();Object.defineProperty(B,"__esModule",{value:!0});B.AGENT_CONSTANTS=void 0;B.getAgentideHome=ga;B.getUserAgentsDir=jp;B.getUserSkillsDir=xp;B.getUserSkillDir=IA;B.getUserMcpDir=Bp;B.getUserMcpServerDir=PA;B.getUserAgentRoot=Ll;B.getUserAgentVersionDir=NA;B.getUserAgentCurrentPath=RA;B.getAgentideDir=Ml;B.getAgentsDir=Fp;B.getAgentRoot=Ps;B.resolveAgentRuntimePaths=Vp;B.resolveRuntimePaths=CA;B.userScopedEngineHome=kA;B.engineHomeUserKey=Wp;B.userScopedEngineHomeFromKey=Kp;B.isDefaultAgent=$A;B.getAgentManifestPath=DA;B.getAgentAgentsMdPath=LA;B.getAgentContextPath=MA;B.getAgentSkillsDir=GA;B.getAgentRulesDir=UA;B.getAgentMcpDir=HA;B.getSessionsDir=jA;B.parseAgentIdFromPath=xA;B.isValidPackName=BA;B.normalizePackName=FA;B.getPackNameError=VA;B.packNameToTitle=Gl;B.stripModelProviderPrefix=pa;B.generateDefaultAgentYaml=WA;B.generateAgentYaml=KA;B.generateAgentsMd=qA;var Ce=Dl(require("path")),TA=Dl(require("os")),vA=Dl(require("crypto")),OA=Ye();B.AGENT_CONSTANTS={DEFAULT_AGENT_ID:"default",AGENTIDE_DIR_NAME:OA.AGENTIDE_DIR_NAME,AGENTS_DIR:"agents",RULES_DIR:"rules",SKILLS_DIR:"skills",MCP_DIR:"mcp",SESSIONS_DIR:"sessions",MANIFEST_FILE:"agent.yaml",AGENTS_MD:"AGENTS.md",GHOST_TEXT_FILE:"GHOST_TEXT.md",TERMINAL_ASSIST_FILE:"TERMINAL_ASSIST.md",CLAUDE_MD:"CLAUDE.md",CONTEXT_MD:"context.md",SOURCE_FILE:".agentide-source.json",CURRENT_VERSION_FILE:"current.txt"};function ga(){return process.env.AGENTHIPPO_HOME||Ce.join(TA.homedir(),B.AGENT_CONSTANTS.AGENTIDE_DIR_NAME)}function jp(){return process.env.AGENTIDE_USER_AGENTS_DIR||Ce.join(ga(),B.AGENT_CONSTANTS.AGENTS_DIR)}function xp(){return Ce.join(ga(),B.AGENT_CONSTANTS.SKILLS_DIR)}function IA(t){return Ce.join(xp(),t)}function Bp(){return Ce.join(ga(),B.AGENT_CONSTANTS.MCP_DIR)}function PA(t){return Ce.join(Bp(),t)}function Ll(t){return Ce.join(jp(),t)}function NA(t,e){return Ce.join(Ll(t),e)}function RA(t){return Ce.join(Ll(t),B.AGENT_CONSTANTS.CURRENT_VERSION_FILE)}function Ml(t){return Ce.join(t,B.AGENT_CONSTANTS.AGENTIDE_DIR_NAME)}function Fp(t){return Ce.join(Ml(t),B.AGENT_CONSTANTS.AGENTS_DIR)}function Ps(t,e){return Ce.join(Fp(t),e)}function Vp(t,e,n,r="0.0.0"){let s=Ps(t,n);return{agentId:n,agentVersion:r,agentRoot:s,rulesDir:Ce.join(s,B.AGENT_CONSTANTS.RULES_DIR),skillsDir:Ce.join(s,B.AGENT_CONSTANTS.SKILLS_DIR),mcpDir:Ce.join(s,B.AGENT_CONSTANTS.MCP_DIR),codexDerivedDir:Ce.join(t,".codex"),claudeDerivedDir:Ce.join(t,".claude"),codexHome:Ce.join(e,B.AGENT_CONSTANTS.AGENTS_DIR,n,"codex"),claudeConfigDir:Ce.join(e,B.AGENT_CONSTANTS.AGENTS_DIR,n,"claude")}}function CA(t,e,n,r){let s=n??B.AGENT_CONSTANTS.DEFAULT_AGENT_ID;return Vp(t,e,s,r)}function kA(t,e){return Kp(t,Wp(e))}function Wp(t){let e=t?.trim();if(e)return vA.createHash("sha256").update(e).digest("hex").slice(0,16)}function Kp(t,e){return!e||!/^[0-9a-f]{16}$/.test(e)?t:Ce.join(t,"users",e)}function $A(t){return t===B.AGENT_CONSTANTS.DEFAULT_AGENT_ID}function DA(t,e){return Ce.join(Ps(t,e),B.AGENT_CONSTANTS.MANIFEST_FILE)}function LA(t,e){return Ce.join(Ps(t,e),B.AGENT_CONSTANTS.AGENTS_MD)}function MA(t,e){return Ce.join(Ps(t,e),B.AGENT_CONSTANTS.CONTEXT_MD)}function GA(t,e){return Ce.join(Ps(t,e),B.AGENT_CONSTANTS.SKILLS_DIR)}function UA(t,e){return Ce.join(Ps(t,e),B.AGENT_CONSTANTS.RULES_DIR)}function HA(t,e){return Ce.join(Ps(t,e),B.AGENT_CONSTANTS.MCP_DIR)}function jA(t){return Ce.join(Ml(t),B.AGENT_CONSTANTS.SESSIONS_DIR)}function xA(t){let e=t.split(Ce.sep),n=e.lastIndexOf(B.AGENT_CONSTANTS.AGENTS_DIR);if(n!==-1&&e.length>n+1)return e[n+1]}var qp=/[/\\:*?"<>|]/;function BA(t){return!(!t||t.trim().length===0||qp.test(t)||t.startsWith("."))}function FA(t){return t.trim().toLowerCase().replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}function VA(t){if(!t||t.trim().length===0)return"Pack name is required";if(qp.test(t))return'Pack name cannot contain path separators or special characters (/ \\ : * ? " < > |)';if(t.startsWith("."))return"Pack name cannot start with a dot"}function Gl(t){return t.split(/[-_\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function pa(t){let e=t.match(/^[a-z0-9-]+::/i);return e?t.slice(e[0].length):t}function WA(t={}){let{engine:e="claude",model:n,includeHeaderComments:r=!0,includeModelHintComment:s=!1}=t,i=n?pa(n):void 0;return[...r?["# Agent Hippo Pack Configuration","# This is the default agent pack for agenthippo.","# Edit this file to customize the agent's behavior.",""]:[],"apiVersion: agenthippo.ai/v1","kind: Agent","metadata:"," name: default",' version: "1.0.0"',' description: "agent hippo"',"spec:"," # Preferred engine (claude or codex)",` engine: ${e}`,...i?[` model: ${i}`]:s?[" # Model to use (optional - uses engine default if not specified)"," # model: claude-sonnet-4-20250514"]:[]," permissions:"," # File access scope for this agent:"," # - read-only: no file writes"," # - workspace-write: writes limited to workspace folders"," # - full: full filesystem access (yolo)"," fileAccess: full"," visibility: internal",""].join(`
|
|
3
3
|
`)}function KA(t,e={}){let{description:n=`A specialized agent for ${Gl(t).toLowerCase()} tasks`,engine:r="claude",author:s=process.env.USER||"unknown"}=e,i=e.model??(r==="claude"?"claude-sonnet-4":"codex"),o=pa(i),a=e.cheapModel?pa(e.cheapModel):void 0;return[`# ${t} Agent Manifest`,"apiVersion: agenthippo.ai/v1","kind: Agent","metadata:",` name: ${t}`," version: 0.1.0",` author: ${s}`,` description: ${n}`,"","spec:",` engine: ${r}`,` model: ${o}`,...a?[` cheapModel: ${a}`]:[],""," skills: []"," # Uncomment to add skills:"," # - path: ./skills/my-skill",""," # Optional: seed pack data into workspace on first use (target missing/empty)"," # Remove this block if your pack has no data files."," # data:"," # sourcePath: ./data",` # workspacePath: ${B.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/data/${t}`,""," permissions:"," # File access scope for this pack:"," # - read-only: no file writes"," # - workspace-write: writes limited to workspace folders"," # - full: full filesystem access (yolo)"," fileAccess: full",""," visibility: internal",""].join(`
|
|
4
4
|
`)}function qA(t,e={}){let n=Gl(t),r=e.description||`A specialized agent for ${n.toLowerCase()} tasks.`;return`# ${n} Agent
|
|
5
5
|
|
|
@@ -20,15 +20,15 @@ ${r}
|
|
|
20
20
|
## Output Format
|
|
21
21
|
|
|
22
22
|
Provide clear, actionable responses with code examples when relevant.
|
|
23
|
-
`}});var Ns=T(cn=>{"use strict";Object.defineProperty(cn,"__esModule",{value:!0});cn.ON_DENIED_TIMEOUT_MS=cn.WARRANT_DENIED_REASON=void 0;cn.runWithCredential=QA;cn.currentCredential=ZA;cn.resolveEngineHomeUserKey=eS;cn.requireUserId=tS;var YA=require("async_hooks"),JA=jn();cn.WARRANT_DENIED_REASON="token_without_verified_user";cn.ON_DENIED_TIMEOUT_MS=2e3;var ha=new YA.AsyncLocalStorage;async function XA(t,e,n){if(!t)return;let r=Number.isFinite(n)&&n>0?n:cn.ON_DENIED_TIMEOUT_MS,s;try{await Promise.race([Promise.resolve().then(()=>t(e)),new Promise(i=>{s=setTimeout(i,r),s.unref?.()})])}catch{}finally{s&&clearTimeout(s)}}async function zA(t,e){if(t.dataToken?.trim()&&!t.userId?.trim())throw await XA(e?.onDenied,cn.WARRANT_DENIED_REASON,e?.onDeniedTimeoutMs??cn.ON_DENIED_TIMEOUT_MS),new Error(`OBO data token present without a verified user in request scope (fail-closed: ${cn.WARRANT_DENIED_REASON})`)}async function QA(t,e,n){return await zA(t,n),ha.run(t,async()=>e())}function ZA(){return ha.getStore()}function eS(t){return(0,JA.engineHomeUserKey)(ha.getStore()?.userId)??t?.trim()??void 0}function tS(){let t=ha.getStore()?.userId?.trim();if(!t)throw new Error("No authenticated user in request scope (fail-closed)");return t}});var Js=T(zt=>{"use strict";var nS=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]})),rS=zt&&zt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yp=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"&&nS(n,e,r[s]);return rS(n,e),n}})();Object.defineProperty(zt,"__esModule",{value:!0});zt.DIRS=zt.PID_FILES=void 0;zt.getAgentideHome=Jp;zt.getAgentidePath=Ys;zt.getAnalyticsScriptsDir=oS;var ma=Yp(require("path")),sS=Yp(require("os")),iS=
|
|
24
|
-
`).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\\\/g,"\\")),o&&(e[o]=a)}return e}async function Ul(t=Ea()){try{let e=await aS.promises.readFile(t,"utf-8");return Xp(e)}catch{return{}}}function zp(t,e=process.env){let n=[],r=[];for(let[s,i]of Object.entries(t))if(s){if(Object.prototype.hasOwnProperty.call(e,s)){r.push(s);continue}e[s]=i,n.push(s)}return{applied:n,skipped:r}}async function lS(t=Ea()){let e=await Ul(t);return{...zp(e),envFilePath:t}}xn.GATEWAY_SECRET_ENV_KEYS=["SLACK_BOT_TOKEN","SLACK_APP_TOKEN","OPENCLAW_GATEWAY_TOKEN"];function Qp(t,e,n=xn.GATEWAY_SECRET_ENV_KEYS){let r={...t},s=new Set(n);for(let[i,o]of Object.entries(e)){if(!i||!o.trim())continue;let a=r[i];(s.has(i)||a===void 0||a==="")&&(r[i]=o)}return r}async function uS(t=Ea()){let e=await Ul(t);return Qp(process.env,e)}});var go=T(
|
|
23
|
+
`}});var Ns=T(cn=>{"use strict";Object.defineProperty(cn,"__esModule",{value:!0});cn.ON_DENIED_TIMEOUT_MS=cn.WARRANT_DENIED_REASON=void 0;cn.runWithCredential=QA;cn.currentCredential=ZA;cn.resolveEngineHomeUserKey=eS;cn.requireUserId=tS;var YA=require("async_hooks"),JA=jn();cn.WARRANT_DENIED_REASON="token_without_verified_user";cn.ON_DENIED_TIMEOUT_MS=2e3;var ha=new YA.AsyncLocalStorage;async function XA(t,e,n){if(!t)return;let r=Number.isFinite(n)&&n>0?n:cn.ON_DENIED_TIMEOUT_MS,s;try{await Promise.race([Promise.resolve().then(()=>t(e)),new Promise(i=>{s=setTimeout(i,r),s.unref?.()})])}catch{}finally{s&&clearTimeout(s)}}async function zA(t,e){if(t.dataToken?.trim()&&!t.userId?.trim())throw await XA(e?.onDenied,cn.WARRANT_DENIED_REASON,e?.onDeniedTimeoutMs??cn.ON_DENIED_TIMEOUT_MS),new Error(`OBO data token present without a verified user in request scope (fail-closed: ${cn.WARRANT_DENIED_REASON})`)}async function QA(t,e,n){return await zA(t,n),ha.run(t,async()=>e())}function ZA(){return ha.getStore()}function eS(t){return(0,JA.engineHomeUserKey)(ha.getStore()?.userId)??t?.trim()??void 0}function tS(){let t=ha.getStore()?.userId?.trim();if(!t)throw new Error("No authenticated user in request scope (fail-closed)");return t}});var Js=T(zt=>{"use strict";var nS=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]})),rS=zt&&zt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yp=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"&&nS(n,e,r[s]);return rS(n,e),n}})();Object.defineProperty(zt,"__esModule",{value:!0});zt.DIRS=zt.PID_FILES=void 0;zt.getAgentideHome=Jp;zt.getAgentidePath=Ys;zt.getAnalyticsScriptsDir=oS;var ma=Yp(require("path")),sS=Yp(require("os")),iS=Ye();function Jp(){let t=process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME;return t?.trim()?t.trim():ma.join(sS.homedir(),iS.AGENTIDE_DIR_NAME)}function Ys(...t){return ma.join(Jp(),...t)}zt.PID_FILES={gateway:()=>Ys("gateway.pid"),litellm:()=>Ys("litellm.pid"),otelcol:()=>Ys("analytics","otelcol.pid")};zt.DIRS={analytics:()=>Ys("analytics"),credentials:()=>Ys("credentials"),sessions:()=>Ys("sessions")};function oS(t){let e=require("fs"),n=ma.join(t,"out","scripts","analytics"),r=ma.join(t,"scripts","analytics");try{return e.accessSync(n),n}catch{}try{return e.accessSync(r),r}catch{}return n}});var ya=T(xn=>{"use strict";Object.defineProperty(xn,"__esModule",{value:!0});xn.GATEWAY_SECRET_ENV_KEYS=void 0;xn.getAgentHomeEnvFilePath=Ea;xn.parseEnvContent=Xp;xn.readAgentHomeEnvFile=Ul;xn.mergeEnvIntoProcessEnv=zp;xn.mergeAgentHomeEnvIntoProcessEnv=lS;xn.buildGatewayChildProcessEnv=Qp;xn.readGatewayChildProcessEnv=uS;var aS=require("fs"),cS=Js();function Ea(){return(0,cS.getAgentidePath)(".env")}function Xp(t){let e={},n=t.split(/\r?\n/);for(let r of n){let s=r.trim();if(!s||s.startsWith("#"))continue;let i=s.indexOf("=");if(i===-1)continue;let o=s.slice(0,i).trim(),a=s.slice(i+1).trim(),c=a.length>=2&&a.startsWith('"')&&a.endsWith('"'),l=a.length>=2&&a.startsWith("'")&&a.endsWith("'");(c||l)&&(a=a.slice(1,-1)),c&&(a=a.replace(/\\n/g,`
|
|
24
|
+
`).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\\\/g,"\\")),o&&(e[o]=a)}return e}async function Ul(t=Ea()){try{let e=await aS.promises.readFile(t,"utf-8");return Xp(e)}catch{return{}}}function zp(t,e=process.env){let n=[],r=[];for(let[s,i]of Object.entries(t))if(s){if(Object.prototype.hasOwnProperty.call(e,s)){r.push(s);continue}e[s]=i,n.push(s)}return{applied:n,skipped:r}}async function lS(t=Ea()){let e=await Ul(t);return{...zp(e),envFilePath:t}}xn.GATEWAY_SECRET_ENV_KEYS=["SLACK_BOT_TOKEN","SLACK_APP_TOKEN","OPENCLAW_GATEWAY_TOKEN"];function Qp(t,e,n=xn.GATEWAY_SECRET_ENV_KEYS){let r={...t},s=new Set(n);for(let[i,o]of Object.entries(e)){if(!i||!o.trim())continue;let a=r[i];(s.has(i)||a===void 0||a==="")&&(r[i]=o)}return r}async function uS(t=Ea()){let e=await Ul(t);return Qp(process.env,e)}});var go=T(Fe=>{"use strict";var dS=Fe&&Fe.__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]})),fS=Fe&&Fe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pS=Fe&&Fe.__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"&&dS(n,e,r[s]);return fS(n,e),n}})();Object.defineProperty(Fe,"__esModule",{value:!0});Fe.AGENTHIPPO_MCP_SERVERS_ENV=Fe.ALLOW_INLINE_DATA_TOKEN_ENV=void 0;Fe.loadMcpServers=yS;Fe.resolveMcpEnvVar=ng;Fe.resolveMcpServerEnv=TS;Fe.generateCodexMcpConfig=PS;Fe.getDefaultMcpConfig=NS;Fe.loadBundledMcpServers=RS;Fe.resolveHttpMcpHeaders=Vl;Fe.referenceHttpMcpHeaders=kS;Fe.formatInlineMcpServers=$S;Fe.serializeInlineMcpServers=DS;Fe.parseInlineMcpServers=LS;var Pi=require("fs"),$r=pS(require("path")),Hl=Ns(),Zp=jn(),gS=ya(),hS="enable-bundled",mS="disable-bundled",eg=".mcp.json",xl="mcp-servers";Fe.ALLOW_INLINE_DATA_TOKEN_ENV="AGENTHIPPO_ALLOW_INLINE_DATA_TOKEN";function jl(){return/^(1|true)$/i.test(process.env[Fe.ALLOW_INLINE_DATA_TOKEN_ENV]?.trim()??"")}var Bl=/\$\{env:(\w+)\}/g,ES=/\$\{credential:(\w+)\}/g;async function yS(t,e,n){let r=(0,Zp.getAgentMcpDir)(e,t||Zp.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=$r.join(r,eg);if(!await wa(s))return[];let i=n?$r.join(n,xl):"";return _S(s,r,e,i)}async function _S(t,e,n,r){let s;try{let a=await Pi.promises.readFile(t,"utf-8");s=JSON.parse(a)}catch(a){return console.warn(`[AgentIDE] Failed to load MCP config from ${t}:`,a),[]}if(!s.mcpServers)return[];let i=await OS(n,e),o=[];for(let[a,c]of Object.entries(s.mcpServers))try{let l=await wS(a,c,e,r,i);l&&o.push(l)}catch(l){console.warn(`[AgentIDE] Failed to resolve MCP server '${a}':`,l)}return o}async function wS(t,e,n,r,s){if(e.command===mS)return null;if(e.command===hS)return AS(t,e,r,s);if(e.url){let i=e.url.replace(Bl,(o,a)=>rg(a,s)).trim();return i?{name:t,label:e.label??t,description:e.description,command:"",args:[],url:i,headers:vS(e.headers,s),bearerTokenEnv:e.bearerTokenEnv?.trim()||void 0}:null}return{name:t,label:e.label??t,description:e.description,command:e.command??"",args:Fl(e.args,n),env:_a(e.env,s)}}async function AS(t,e,n,r){let s=await tg(t,n);if(!s)return null;let i=$r.join(n,t),o={...s.env??{}};if(e.env)for(let[a,c]of Object.entries(e.env))o[a]=c;return{name:t,label:e.label??s.label??t,description:e.description??s.description,command:s.command,args:Fl(s.args,i),env:_a(o,r)}}async function tg(t,e){if(!e)return console.warn(`[AgentIDE] Bundled MCP directory unavailable; cannot resolve '${t}'`),null;let n=$r.join(e,t,"mcp.json");if(!await wa(n))return console.warn(`[AgentIDE] Bundled server '${t}' not found at ${n}`),null;try{let r=await Pi.promises.readFile(n,"utf-8"),s=JSON.parse(r);return!s.command||typeof s.command!="string"?(console.warn(`[AgentIDE] Invalid bundled server config at ${n}: missing command`),null):s}catch(r){return console.warn(`[AgentIDE] Failed to load bundled server config from ${n}:`,r),null}}function Fl(t,e){return t?t.map(n=>{let r=n;return r=r.replace(/\$\{serverDir\}/g,e),(r.startsWith("./")||r.startsWith("../"))&&(r=$r.resolve(e,r)),r}):[]}function ng(t,e={}){let n=SS();if(t==="dataToken"){let r=(0,Hl.currentCredential)()?.dataToken?.trim();return r&&jl()?r:""}if(n.includes(t)){let r=(0,Hl.currentCredential)()?.dataToken?.trim();if(r&&jl())return r}return process.env[t]??e[t]??""}function SS(){let t=process.env.AGENTHIPPO_DATA_TOKEN_ENV_VARS;return t!==void 0?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function bS(t){return/\$\{credential:dataToken\}/.test(t)}function _a(t,e={}){if(!t)return;let n={};for(let[r,s]of Object.entries(t)){if(ES.lastIndex=0,bS(s)){let i=(0,Hl.currentCredential)()?.dataToken?.trim();if(i)jl()&&(n[r]=i);else{let o=process.env[r]??e[r]??"";o&&(n[r]=o)}continue}n[r]=s.replace(Bl,(i,o)=>ng(o,e))}return n}function TS(t,e={}){return _a(t,e)}function vS(t,e={}){if(!t)return;let n={};for(let[r,s]of Object.entries(t)){let i=s.replace(Bl,(o,a)=>rg(a,e));i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function rg(t,e){return process.env[t]??e[t]??""}async function OS(t,e){let n={},r=[$r.join(e,".env"),$r.join(t,".env")];for(let s of r){let i=await IS(s);Object.assign(n,i)}return n}async function IS(t){try{let e=await Pi.promises.readFile(t,"utf-8");return(0,gS.parseEnvContent)(e)}catch{return{}}}function PS(t,e){if(t.length===0)return"";let n=e?.autoApprove?'default_tools_approval_mode = "approve"':void 0;return`
|
|
25
25
|
# MCP Servers (AgentIDE)
|
|
26
26
|
`+t.map(s=>{if(s.url){let o=[`[mcp_servers.${s.name}]`,`url = ${JSON.stringify(s.url)}`];if(s.bearerTokenEnv&&o.push(`bearer_token_env_var = ${JSON.stringify(s.bearerTokenEnv)}`),s.headers&&Object.keys(s.headers).length>0){let a=Object.entries(s.headers).map(([c,l])=>`${JSON.stringify(c)} = ${JSON.stringify(l)}`).join(", ");o.push(`http_headers = { ${a} }`)}return n&&o.push(n),o.join(`
|
|
27
27
|
`)}let i=[`[mcp_servers.${s.name}]`,`command = ${JSON.stringify(s.command)}`,`args = ${JSON.stringify(s.args)}`];if(n&&i.push(n),s.env&&Object.keys(s.env).length>0){i.push("",`[mcp_servers.${s.name}.env]`);for(let[o,a]of Object.entries(s.env))i.push(`${JSON.stringify(o)} = ${JSON.stringify(a)}`)}return i.join(`
|
|
28
28
|
`)}).join(`
|
|
29
29
|
|
|
30
|
-
`)}async function NS(t){let e=$r.join(t,xl,eg);if(!await wa(e))return null;try{return await Pi.promises.readFile(e,"utf-8")}catch{return null}}async function RS(t){let e=$r.join(t,xl);if(!await wa(e))return[];let n=[],r;try{r=await Pi.promises.readdir(e,{withFileTypes:!0})}catch{return[]}for(let s of r){if(!s.isDirectory())continue;let i=s.name,o=await tg(i,e);if(!o)continue;let a=$r.join(e,i);n.push({name:o.name??i,label:o.label??i,description:o.description,command:o.command,args:Fl(o.args,a),env:_a(o.env)})}return n}
|
|
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"})})})}};Rs.CLIPermissionHandler=Jl});var og=T(Aa=>{"use strict";Object.defineProperty(Aa,"__esModule",{value:!0});Aa.NoOpEditTracker=void 0;var Xl=class{appliesEdits=!1;async startTracking(e,n){}async stopTracking(e,n){}async applyEdit(e,n,r,s){}};Aa.NoOpEditTracker=Xl});var ag=T(ln=>{"use strict";var MS=ln&&ln.__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]})),GS=ln&&ln.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),US=ln&&ln.__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"&&MS(n,e,r[s]);return GS(n,e),n}})();Object.defineProperty(ln,"__esModule",{value:!0});ln.DirectorySessionStore=ln.FileSessionStore=ln.MemorySessionStore=void 0;var Qt=require("fs"),Sa=US(require("path")),HS=require("crypto"),zl=class{store=new Map;get(e){return this.store.get(e)}async set(e,n){this.store.set(e,n)}clear(){this.store.clear()}};ln.MemorySessionStore=zl;var Ql=class{store={};loaded=!1;filePath;constructor(e){this.filePath=e}async load(){if(!this.loaded){try{let e=await Qt.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=Sa.dirname(this.filePath);await Qt.promises.mkdir(e,{recursive:!0});let n=`${this.filePath}.tmp.${Date.now()}`,r=JSON.stringify(this.store,null,2);try{await Qt.promises.writeFile(n,r,"utf-8"),await Qt.promises.rename(n,this.filePath)}catch(s){try{await Qt.promises.unlink(n)}catch{}throw s}}loadSync(){if(!this.loaded){try{let e=(0,Qt.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}}};ln.FileSessionStore=Ql;var Zl=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 Qt.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 Qt.promises.unlink(Sa.join(this.dir,i))}catch{}this.files.delete(s),this.serialized.delete(s)}this.entries={...r}}fileNameFor(e){return(0,HS.createHash)("sha256").update(e).digest("hex").slice(0,40)}async writeAtomic(e,n){let r=Sa.join(this.dir,e),s=`${r}.tmp.${process.pid}.${Date.now()}`;try{await Qt.promises.writeFile(s,n,"utf-8"),await Qt.promises.rename(s,r)}catch(i){try{await Qt.promises.unlink(s)}catch{}throw i}}loadSync(){if(this.loaded)return;this.loaded=!0,this.migrateLegacySingleFileSync();let e;try{e=(0,Qt.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,Qt.readFileSync)(Sa.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,Qt.readdirSync)(this.dir)}catch{e=!1}if(e)return;let n=`${this.dir}.json`,r;try{r=JSON.parse((0,Qt.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}};ln.DirectorySessionStore=Zl});var cg=T(ba=>{"use strict";Object.defineProperty(ba,"__esModule",{value:!0});ba.StaticConfigProvider=void 0;var eu=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}};ba.StaticConfigProvider=eu});var ru=T(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0});ze.StaticConfigProvider=ze.DirectorySessionStore=ze.FileSessionStore=ze.MemorySessionStore=ze.NoOpEditTracker=ze.CLIPermissionHandler=ze.AutoDenyPermissionHandler=ze.AutoApprovePermissionHandler=ze.NoOpLogger=ze.ConsoleLogger=void 0;var lg=sg();Object.defineProperty(ze,"ConsoleLogger",{enumerable:!0,get:function(){return lg.ConsoleLogger}});Object.defineProperty(ze,"NoOpLogger",{enumerable:!0,get:function(){return lg.NoOpLogger}});var tu=ig();Object.defineProperty(ze,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return tu.AutoApprovePermissionHandler}});Object.defineProperty(ze,"AutoDenyPermissionHandler",{enumerable:!0,get:function(){return tu.AutoDenyPermissionHandler}});Object.defineProperty(ze,"CLIPermissionHandler",{enumerable:!0,get:function(){return tu.CLIPermissionHandler}});var jS=og();Object.defineProperty(ze,"NoOpEditTracker",{enumerable:!0,get:function(){return jS.NoOpEditTracker}});var nu=ag();Object.defineProperty(ze,"MemorySessionStore",{enumerable:!0,get:function(){return nu.MemorySessionStore}});Object.defineProperty(ze,"FileSessionStore",{enumerable:!0,get:function(){return nu.FileSessionStore}});Object.defineProperty(ze,"DirectorySessionStore",{enumerable:!0,get:function(){return nu.DirectorySessionStore}});var xS=cg();Object.defineProperty(ze,"StaticConfigProvider",{enumerable:!0,get:function(){return xS.StaticConfigProvider}})});var Ri=T(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.RAW_IDS_ENV=ft.ID_SALT_ENV=ft.CONTENT_CAPTURE_ENV=void 0;ft.isContentCaptureEnabled=fg;ft.resetPrivacyAnnouncementsForTest=VS;ft.hashIdentity=KS;ft.digestContent=pg;ft.describeContent=qS;var ug=require("crypto");ft.CONTENT_CAPTURE_ENV="AGENTHIPPO_EVIDENCE_CONTENT_CAPTURE";ft.ID_SALT_ENV="AGENTHIPPO_EVIDENCE_ID_SALT";ft.RAW_IDS_ENV="AGENTHIPPO_EVIDENCE_RAW_IDS";var BS="agenthippo-evidence-unsalted",FS=new Set(["1","true","yes","on"]);function dg(t){return FS.has((t??"").trim().toLowerCase())}var su=!1,iu=!1;function fg(t=process.env){let e=dg(t[ft.CONTENT_CAPTURE_ENV]);return su||(su=!0,console.warn(e?`[evidence] CONTENT CAPTURE IS ON \u2014 prompts, completions and tool I/O are recorded in evidence (${ft.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 ${ft.CONTENT_CAPTURE_ENV}=1 to restore full previews.`)),e}function VS(){su=!1,iu=!1}function WS(t){let e=t[ft.ID_SALT_ENV]?.trim();return e||(iu||(iu=!0,console.warn(`[evidence] ${ft.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.`)),BS)}function KS(t,e=process.env){let n=t?.trim();return n?dg(e[ft.RAW_IDS_ENV])?n:`anon_${(0,ug.createHash)("sha256").update(`${WS(e)}\0${n}`).digest("hex").slice(0,32)}`:void 0}function pg(t){return{sha256:(0,ug.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function qS(t,e,n=500,r=process.env){if(e===void 0)return{};let s=pg(e),i={[`${t}_sha256`]:s.sha256,[`${t}_length`]:s.length};return fg(r)&&(i[`${t}Preview`]=e.slice(0,n)),i}});var Ta=T(we=>{"use strict";Object.defineProperty(we,"__esModule",{value:!0});we.ANTHROPIC_SETUP_TOKEN_PREFIX=we.PROVIDERS=void 0;we.getProvider=YS;we.requiresApiKey=JS;we.isLocalProvider=XS;we.getAllProviderIds=zS;we.getCloudProviders=QS;we.getLocalProviders=ZS;we.getApiKeyProviders=eb;we.requiresBaseUrl=tb;we.getGatewayProviders=nb;we.isGatewayProvider=rb;we.isAnthropicProviderFamily=sb;we.normalizeAnthropicSetupToken=ib;we.isAnthropicSetupToken=ob;we.providerNotSupportAnthropicApi=ab;we.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 Codex (ChatGPT OAuth)",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 YS(t){return we.PROVIDERS[t]}function JS(t){return we.PROVIDERS[t]?.requiresApiKey??!0}function XS(t){let e=we.PROVIDERS[t];return e?!e.requiresApiKey:!1}function zS(){return Object.keys(we.PROVIDERS)}function QS(){return Object.values(we.PROVIDERS).filter(t=>t.requiresApiKey)}function ZS(){return Object.values(we.PROVIDERS).filter(t=>!t.requiresApiKey)}function eb(){return Object.values(we.PROVIDERS).filter(t=>t.showInAddApiKeyUI===!0)}function tb(t){let e=we.PROVIDERS[t];return e?!!e.endpointSettingKey&&!e.defaultEndpoint:!1}function nb(){return Object.values(we.PROVIDERS).filter(t=>t.isGateway)}function rb(t){return we.PROVIDERS[t]?.isGateway??!1}function sb(t){return t==="anthropic"||t==="anthropic-setup-token"}we.ANTHROPIC_SETUP_TOKEN_PREFIX="sk-ant-oat01-";function ib(t){return t.replace(/\s+/g,"").trim()}function ob(t){return typeof t=="string"&&t.trim().startsWith(we.ANTHROPIC_SETUP_TOKEN_PREFIX)}function ab(t,e){let n=we.PROVIDERS[t];return n?n.notSupportAnthropicApi??!1:e?.[t]?.notSupportAnthropicApi===!0}});var va=T($e=>{"use strict";Object.defineProperty($e,"__esModule",{value:!0});$e.REGISTRY_KEY_SEPARATOR=$e.BUILTIN_MODELS=void 0;$e.getRegistryKey=gg;$e.parseRegistryKey=cb;$e.isCompositeKey=lb;$e.getModel=ub;$e.getModelByRegistryKey=db;$e.getModelsForProvider=fb;$e.getRecommendedModels=pb;$e.getModelsWithCapability=gb;$e.getActiveModels=hb;$e.resolveModelAlias=mb;$e.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}];$e.REGISTRY_KEY_SEPARATOR="::";function gg(t,e){return`${t}${$e.REGISTRY_KEY_SEPARATOR}${e}`}function cb(t){let e=t.indexOf($e.REGISTRY_KEY_SEPARATOR);if(e!==-1)return{providerId:t.substring(0,e),modelId:t.substring(e+$e.REGISTRY_KEY_SEPARATOR.length)}}function lb(t){return t.includes($e.REGISTRY_KEY_SEPARATOR)}function ub(t){return $e.BUILTIN_MODELS.find(e=>e.id===t)}function db(t){return $e.BUILTIN_MODELS.find(e=>gg(e.provider,e.id)===t)}function fb(t){return $e.BUILTIN_MODELS.filter(e=>e.provider===t)}function pb(){return $e.BUILTIN_MODELS.filter(t=>t.recommended===!0)}function gb(t){return $e.BUILTIN_MODELS.filter(e=>e.capabilities.includes(t))}function hb(){return $e.BUILTIN_MODELS.filter(t=>!t.deprecated)}function mb(t){if(!t)return t;let e=t.toLowerCase().trim();return $e.BUILTIN_MODELS.find(r=>r.id.toLowerCase()===e)?.id??t}});var ou=T(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.AGENT_ENGINES=void 0;rt.getAgentEngine=Eb;rt.getAllAgentEngines=yb;rt.getAllAgentEngineIds=_b;rt.getCompatibleProviders=wb;rt.getEnginesCompatibleWithProvider=Ab;rt.isEngineCompatibleWithProvider=Sb;rt.getEngineRulesFile=bb;rt.getEngineWorkspaceDir=Tb;var os=Ta();rt.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 Eb(t){return rt.AGENT_ENGINES[t]}function yb(){return Object.values(rt.AGENT_ENGINES)}function _b(){return Object.keys(rt.AGENT_ENGINES)}function wb(t){let e=rt.AGENT_ENGINES[t];if(!e)return[];let n=[e.nativeProvider];for(let[r,s]of Object.entries(os.PROVIDERS))if(!n.includes(r)){if(s.isGateway){n.push(r);continue}e.nativeProvider==="openai"&&!(0,os.isAnthropicProviderFamily)(r)&&n.push(r),e.nativeProvider==="anthropic"&&(0,os.isAnthropicProviderFamily)(r)&&n.push(r)}return n}function Ab(t){let e=os.PROVIDERS[t];return e?e.isGateway?Object.values(rt.AGENT_ENGINES):Object.values(rt.AGENT_ENGINES).filter(n=>!!(n.nativeProvider===t||n.nativeProvider==="openai"&&!(0,os.isAnthropicProviderFamily)(t)||n.nativeProvider==="anthropic"&&(0,os.isAnthropicProviderFamily)(t))):[]}function Sb(t,e){let n=rt.AGENT_ENGINES[t];return n?!!(n.nativeProvider===e||(0,os.isGatewayProvider)(e)||n.nativeProvider==="openai"&&!(0,os.isAnthropicProviderFamily)(e)||n.nativeProvider==="anthropic"&&(0,os.isAnthropicProviderFamily)(e)):!1}function bb(t){return rt.AGENT_ENGINES[t]?.rulesFile}function Tb(t){return rt.AGENT_ENGINES[t]?.workspaceDir}});var Pa=T(j=>{"use strict";Object.defineProperty(j,"__esModule",{value:!0});j.getEngineWorkspaceDir=j.getEngineRulesFile=j.isEngineCompatibleWithProvider=j.getEnginesCompatibleWithProvider=j.getCompatibleProviders=j.getAllAgentEngineIds=j.getAllAgentEngines=j.getAgentEngine=j.AGENT_ENGINES=j.getActiveModels=j.getModelsWithCapability=j.getRecommendedModels=j.getModelsForProvider=j.getModel=j.getModelByRegistryKey=j.isCompositeKey=j.parseRegistryKey=j.getRegistryKey=j.REGISTRY_KEY_SEPARATOR=j.BUILTIN_MODELS=j.providerNotSupportAnthropicApi=j.isAnthropicSetupToken=j.normalizeAnthropicSetupToken=j.ANTHROPIC_SETUP_TOKEN_PREFIX=j.isAnthropicProviderFamily=j.requiresBaseUrl=j.getApiKeyProviders=j.getLocalProviders=j.getCloudProviders=j.getAllProviderIds=j.isLocalProvider=j.requiresApiKey=j.getProvider=j.PROVIDERS=void 0;j.getProviderForModel=Ob;j.getEngineForModel=Ib;j.getModelsForEngine=Pb;j.isModelFromProvider=Nb;var un=Ta();Object.defineProperty(j,"PROVIDERS",{enumerable:!0,get:function(){return un.PROVIDERS}});Object.defineProperty(j,"getProvider",{enumerable:!0,get:function(){return un.getProvider}});Object.defineProperty(j,"requiresApiKey",{enumerable:!0,get:function(){return un.requiresApiKey}});Object.defineProperty(j,"isLocalProvider",{enumerable:!0,get:function(){return un.isLocalProvider}});Object.defineProperty(j,"getAllProviderIds",{enumerable:!0,get:function(){return un.getAllProviderIds}});Object.defineProperty(j,"getCloudProviders",{enumerable:!0,get:function(){return un.getCloudProviders}});Object.defineProperty(j,"getLocalProviders",{enumerable:!0,get:function(){return un.getLocalProviders}});Object.defineProperty(j,"getApiKeyProviders",{enumerable:!0,get:function(){return un.getApiKeyProviders}});Object.defineProperty(j,"requiresBaseUrl",{enumerable:!0,get:function(){return un.requiresBaseUrl}});Object.defineProperty(j,"isAnthropicProviderFamily",{enumerable:!0,get:function(){return un.isAnthropicProviderFamily}});Object.defineProperty(j,"ANTHROPIC_SETUP_TOKEN_PREFIX",{enumerable:!0,get:function(){return un.ANTHROPIC_SETUP_TOKEN_PREFIX}});Object.defineProperty(j,"normalizeAnthropicSetupToken",{enumerable:!0,get:function(){return un.normalizeAnthropicSetupToken}});Object.defineProperty(j,"isAnthropicSetupToken",{enumerable:!0,get:function(){return un.isAnthropicSetupToken}});Object.defineProperty(j,"providerNotSupportAnthropicApi",{enumerable:!0,get:function(){return un.providerNotSupportAnthropicApi}});var dr=va();Object.defineProperty(j,"BUILTIN_MODELS",{enumerable:!0,get:function(){return dr.BUILTIN_MODELS}});Object.defineProperty(j,"REGISTRY_KEY_SEPARATOR",{enumerable:!0,get:function(){return dr.REGISTRY_KEY_SEPARATOR}});Object.defineProperty(j,"getRegistryKey",{enumerable:!0,get:function(){return dr.getRegistryKey}});Object.defineProperty(j,"parseRegistryKey",{enumerable:!0,get:function(){return dr.parseRegistryKey}});Object.defineProperty(j,"isCompositeKey",{enumerable:!0,get:function(){return dr.isCompositeKey}});Object.defineProperty(j,"getModelByRegistryKey",{enumerable:!0,get:function(){return dr.getModelByRegistryKey}});Object.defineProperty(j,"getModel",{enumerable:!0,get:function(){return dr.getModel}});Object.defineProperty(j,"getModelsForProvider",{enumerable:!0,get:function(){return dr.getModelsForProvider}});Object.defineProperty(j,"getRecommendedModels",{enumerable:!0,get:function(){return dr.getRecommendedModels}});Object.defineProperty(j,"getModelsWithCapability",{enumerable:!0,get:function(){return dr.getModelsWithCapability}});Object.defineProperty(j,"getActiveModels",{enumerable:!0,get:function(){return dr.getActiveModels}});var as=ou();Object.defineProperty(j,"AGENT_ENGINES",{enumerable:!0,get:function(){return as.AGENT_ENGINES}});Object.defineProperty(j,"getAgentEngine",{enumerable:!0,get:function(){return as.getAgentEngine}});Object.defineProperty(j,"getAllAgentEngines",{enumerable:!0,get:function(){return as.getAllAgentEngines}});Object.defineProperty(j,"getAllAgentEngineIds",{enumerable:!0,get:function(){return as.getAllAgentEngineIds}});Object.defineProperty(j,"getCompatibleProviders",{enumerable:!0,get:function(){return as.getCompatibleProviders}});Object.defineProperty(j,"getEnginesCompatibleWithProvider",{enumerable:!0,get:function(){return as.getEnginesCompatibleWithProvider}});Object.defineProperty(j,"isEngineCompatibleWithProvider",{enumerable:!0,get:function(){return as.isEngineCompatibleWithProvider}});Object.defineProperty(j,"getEngineRulesFile",{enumerable:!0,get:function(){return as.getEngineRulesFile}});Object.defineProperty(j,"getEngineWorkspaceDir",{enumerable:!0,get:function(){return as.getEngineWorkspaceDir}});var vb=Ta(),Ia=va(),Oa=ou();function Ob(t){let e=Ia.BUILTIN_MODELS.find(n=>n.id===t);return e?vb.PROVIDERS[e.provider]:void 0}function Ib(t){let e=Ia.BUILTIN_MODELS.find(n=>n.id===t);if(e)return Object.values(Oa.AGENT_ENGINES).find(n=>(0,Oa.isEngineCompatibleWithProvider)(n.id,e.provider))}function Pb(t){let e=Oa.AGENT_ENGINES[t];return e?Ia.BUILTIN_MODELS.filter(n=>(0,Oa.isEngineCompatibleWithProvider)(e.id,n.provider)):[]}function Nb(t,e){return Ia.BUILTIN_MODELS.find(r=>r.id===t)?.provider===e}});var Da=T(Bn=>{"use strict";var Rb=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]})),Cb=Bn&&Bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),hg=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"&&Rb(n,e,r[s]);return Cb(n,e),n}})();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.getDefaultCustomEnginesInstallRoot=$a;Bn.installCustomEngineFromFiles=Fb;Bn.listInstalledCustomEngines=Vb;Bn.uninstallCustomEngine=Wb;var kb=require("child_process"),st=require("fs"),$b=hg(require("os")),Ie=hg(require("path")),Db=require("util"),Lb=qe(),ka=Zt(),Mb=(0,Db.promisify)(kb.execFile),bn="engine.manifest.json";function $a(){return Ie.join(process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME||Ie.join($b.homedir(),Lb.AGENTIDE_DIR_NAME),"engines")}function mg(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 Na(t,e){try{return mg(t).replace(/\//g,Ie.sep)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`${e}: ${r}`)}}function Xs(t,e,n){let r=Ie.resolve(t),s=Ie.resolve(e),i=Ie.relative(r,s);if(i&&(i.startsWith("..")||Ie.isAbsolute(i)))throw new Error(`${n} must stay inside ${t}: ${e}`)}async function Ra(t){try{return await st.promises.access(t),!0}catch{return!1}}function au(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 Ca(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 Eg(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 Gb(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=Ca(n,"dir",`${e} workspaceSync`),s=Ca(n,"rulesFile",`${e} workspaceSync`);Na(r,"workspaceSync.dir"),Na(s,"workspaceSync.rulesFile")}async function Ub(t){let e=Ie.join(t,bn),n;try{n=await st.promises.readFile(e,"utf8")}catch{throw new Error(`Custom engine package is missing ${bn}`)}let r=au(n,bn),s=Ca(r,"id",bn),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:Ca(r,"entry",bn),workspaceSync:r.workspaceSync};if(i.version!==2)throw new Error(`${bn} must declare version 2`);if(i.id!==i.id.toLowerCase()||!/^[a-z0-9][a-z0-9._-]*$/.test(i.id))throw new Error(`${bn} id must contain only lowercase letters, numbers, ".", "_", or "-"`);Gb(i.workspaceSync,bn);let o=Na(i.entry,"entry"),a=Ie.join(t,o);if(Xs(t,a,"Engine entry"),!await Ra(a))throw new Error(`${bn} entry not found: ${i.entry}`);return i}async function Hb(t,e){let n=new Set;for(let r of e){let s=mg(r.path);if(n.has(s))throw new Error(`Duplicate engine package path: ${r.path}`);n.add(s);let i=Ie.join(t,...s.split("/"));Xs(t,i,"Engine package file"),await st.promises.mkdir(Ie.dirname(i),{recursive:!0}),await st.promises.writeFile(i,r.content)}}async function yg(t,e,n){try{await Mb(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 jb(t,e,n){let r=Ie.join(t,"package.json");if(!await Ra(r))return!1;let s=Ie.join(t,"package-lock.json");if(!await Ra(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,ka.logInfo)(n,"[Store] Running npm ci --omit=dev for custom engine"),await yg(i,["ci","--omit=dev"],t),!0}async function xb(t,e,n){let r=Na(e.entry,"entry"),s=Ie.join(t,r);return n&&(0,ka.logInfo)(n,`[Store] Validating custom engine entry: ${e.entry}`),await yg("node",["--check",s],t),s}async function Bb(t,e,n,r){await st.promises.mkdir(e,{recursive:!0});let s=Ie.join(e,n);Xs(e,s,"Custom engine install target");let i=await Ra(s);if(i&&!r)throw new Error(`Custom engine "${n}" already exists at ${s}`);if(!i)return await st.promises.rename(t,s),s;let o=Ie.join(e,".tmp");await st.promises.mkdir(o,{recursive:!0});let a=Ie.join(o,`${n}.previous-${Date.now()}`);Xs(e,a,"Custom engine backup target"),await st.promises.rm(a,{recursive:!0,force:!0}),await st.promises.rename(s,a);try{return await st.promises.rename(t,s),await st.promises.rm(a,{recursive:!0,force:!0}),s}catch(c){throw await st.promises.rm(s,{recursive:!0,force:!0}).catch(()=>{}),await st.promises.rename(a,s).catch(()=>{}),c}}async function Fb(t,e={}){if(t.length===0)throw new Error("Custom engine package is empty");let n=Ie.resolve(e.installRoot??$a()),r=e.runNpmCi!==!1,s=e.overwrite!==!1,i=Ie.join(n,".tmp");await st.promises.mkdir(i,{recursive:!0});let o=await st.promises.mkdtemp(Ie.join(i,`${e.slug||"engine"}-`));Xs(i,o,"Custom engine staging directory");let a=!0;try{await Hb(o,t);let c=await Ub(o),l=await jb(o,r,e.logger),f=await xb(o,c,e.logger),u=await Bb(o,n,c.id,s);a=!1;let d=Ie.join(u,Ie.relative(o,f)),p={id:c.id,displayName:c.displayName||c.id,version:c.version,manifestPath:Ie.join(u,bn),installDir:u,entryPath:d,npmInstalled:l};if(e.logger){let g=e.sourceUrl?` from ${e.sourceUrl}`:"";(0,ka.logInfo)(e.logger,`[Store] Installed custom engine ${p.id}${g} to ${u}`)}return p}finally{a&&await st.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}async function Vb(t={}){let e=Ie.resolve(t.installRoot??$a()),n;try{n=await st.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let s of n){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=Ie.join(e,s.name);Xs(e,i,"Custom engine install target");let o=Ie.join(i,bn),a=s.name,c=s.name;try{let l=au(await st.promises.readFile(o,"utf8"),o);typeof l.id=="string"&&l.id.trim()&&(a=Eg(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 Wb(t,e={}){let n=Eg(t),r=Ie.resolve(e.installRoot??$a()),s=Ie.join(r,n);Xs(r,s,"Custom engine uninstall target");let i;try{let o=await st.promises.lstat(s);if(!o.isDirectory()||o.isSymbolicLink())throw new Error(`Custom engine install target is not a normal directory: ${s}`);try{let a=au(await st.promises.readFile(Ie.join(s,bn),"utf8"),bn);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 st.promises.rm(s,{recursive:!0,force:!0}),e.logger&&(0,ka.logInfo)(e.logger,`[Store] Uninstalled custom engine ${n} from ${s}`),{id:n,displayName:i,installDir:s,removed:!0}}});var Cs=T(vn=>{"use strict";var Kb=vn&&vn.__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]})),qb=vn&&vn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cu=vn&&vn.__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 qb(n,e),n}})();Object.defineProperty(vn,"__esModule",{value:!0});vn.parseCustomEngineSearchPath=Ga;vn.getCustomEngineSearchRoots=Sg;vn.discoverCustomEngineManifests=bg;vn.resolveCustomEngineManifest=Tg;vn.tryResolveCustomEngineManifest=tT;var La=cu(require("fs")),Yb=cu(require("os")),fr=cu(require("path")),Ma=qe(),Jb=Da(),_g="engines",wg="engine.manifest.json";function Ag(t){return t.trim().toLowerCase()}function Tn(t){return typeof t=="string"&&t.trim().length>0}function Ga(t){return Array.isArray(t)?t.flatMap(e=>Ga(e)):t?.trim()?t.split(fr.delimiter).map(e=>e.trim()).filter(Boolean):[]}function Xb(t){let e=new Set,n=[];for(let r of t){let s=fr.resolve(r);e.has(s)||(e.add(s),n.push(s))}return n}function zb(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid model config in ${e}: expected object`);let n=t;if(!Tn(n.defaultModel))throw new Error(`Invalid model config in ${e}: "defaultModel" is required`);return{defaultModel:n.defaultModel.trim(),apiKeyEnvVar:Tn(n.apiKeyEnvVar)?n.apiKeyEnvVar.trim():void 0,baseUrlEnvVar:Tn(n.baseUrlEnvVar)?n.baseUrlEnvVar.trim():void 0,openaiBaseUrlEnvVar:Tn(n.openaiBaseUrlEnvVar)?n.openaiBaseUrlEnvVar.trim():void 0}}function Qb(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=Tn(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 Zb(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(!Tn(n.dir))throw new Error(`Invalid workspaceSync config in ${e}: "dir" is required when enabled`);if(!Tn(n.rulesFile))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" is required when enabled`);let s=n.dir.trim();if(fr.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(fr.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 eT(t,e){let n=La.readFileSync(t,"utf8"),r=JSON.parse(n);if(!Tn(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(!Tn(r.entry))throw new Error(`Invalid custom engine manifest ${t}: "entry" is required`);let s=Ag(r.id),i=fr.dirname(t),o=r.entry.trim(),a=fr.isAbsolute(o)?o:fr.resolve(i,o);return{version:2,id:s,displayName:Tn(r.displayName)?r.displayName.trim():void 0,description:Tn(r.description)?r.description.trim():void 0,entry:o,entryPath:a,engineExport:Tn(r.engineExport)?r.engineExport.trim():void 0,homeEnvVar:Tn(r.homeEnvVar)?r.homeEnvVar.trim():void 0,workspaceSync:Zb(r.workspaceSync,t),promptInjection:Qb(r.promptInjection,t),model:zb(r.model,t),manifestPath:t,manifestDir:i,searchRoot:e}}function Sg(t,e){let n=t?fr.resolve(t):void 0,r=Ga(e),s=Ga(process.env.AGENTHIPPO_CUSTOM_ENGINES_DIR??process.env.AGENTIDE_CUSTOM_ENGINES_DIR);return Xb([...n?[fr.join(n,Ma.AGENTIDE_DIR_NAME,_g)]:[],...r,...s,(0,Jb.getDefaultCustomEnginesInstallRoot)(),fr.join(Yb.homedir(),Ma.AGENTIDE_DIR_NAME,_g)])}function bg(t,e,n){let r=[],s=new Set;for(let i of Sg(t,e)){if(!La.existsSync(i))continue;let o;try{o=La.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory())continue;let c=fr.join(i,a.name,wg);if(!La.existsSync(c))continue;let l;try{l=eT(c,i)}catch(f){n?.(c,f);continue}s.has(l.id)||(s.add(l.id),r.push(l))}}return r}function Tg(t,e,n,r){let s=bg(t,n,r),i=e?Ag(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 ${Ma.AGENTIDE_DIR_NAME}/engines.`)}return o}if(s.length===0)throw new Error(`No custom engines found. Add ${wg} under ${Ma.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 tT(t,e,n,r){try{return Tg(t,e,n,r)}catch{return}}});var Zt=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=Pa(),branding_1=qe(),customRegistry_1=Cs(),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 u=await fs_1.promises.readFile(c,"utf8");await fs_1.promises.writeFile(o,n(u),"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(u,d)=>{let p;try{p=await fs_1.promises.readdir(u,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let m=path.join(u,g.name),h=d?path.join(d,g.name):g.name;if(g.isDirectory())s.add(h),await o(m,h);else if(g.isFile())i.set(h,m);else if(g.isSymbolicLink())try{let E=await fs_1.promises.readlink(m),y=path.isAbsolute(E)?E:path.resolve(path.dirname(m),E);(await fs_1.promises.stat(y)).isDirectory()?(s.add(h),await o(y,h)):i.set(h,y)}catch(E){let y=getErrorCode(E);if(y==="ENOENT"||y==="ELOOP")continue;throw E}}};await o(t,"");let a=Array.from(s).sort((u,d)=>u.split(path.sep).length-d.split(path.sep).length);for(let u of a)await ensureRealDirectory(path.join(e,u));for(let[u,d]of i.entries())await symlinkOrCopyFile(d,path.join(e,u),n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0});let c=new Set(i.keys()),l=async(u,d)=>{let p;try{p=await fs_1.promises.readdir(u,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let m=path.join(u,g.name),h=d?path.join(d,g.name):g.name,E=path.join(t,h);if(g.isDirectory())await l(m,h);else if(g.isFile()&&!g.isSymbolicLink()&&!c.has(h))try{await fs_1.promises.mkdir(path.dirname(E),{recursive:!0}),await fs_1.promises.copyFile(m,E),logInfo(n,`[AgentIDE] Copied new file to source: ${r}/${h}`.replace(/\\/g,"/")),i.set(h,E)}catch(y){logInfo(n,`[AgentIDE] Warning: failed to copy back ${h}: ${y instanceof Error?y.message:String(y)}`)}}};await l(e,"");for(let[u,d]of i.entries()){let p=path.join(e,u);try{let g=await fs_1.promises.lstat(p);g.isFile()&&!g.isSymbolicLink()&&(await fs_1.promises.rm(p,{force:!0}),await symlinkOrCopyFile(d,p,n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0}))}catch{}}let f=async(u,d)=>{let p;try{p=await fs_1.promises.readdir(u,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let m=path.join(u,g.name),h=d?path.join(d,g.name):g.name;g.isDirectory()?await f(m,h):g.isSymbolicLink()&&(c.has(h)||await fs_1.promises.rm(m,{force:!0}))}};await f(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(m){logInfo(e,`[AgentIDE] Note: Could not initialize git in ${t}: ${m instanceof Error?m.message:String(m)}`)}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(m){if(getErrorCode(m)!=="ENOENT"){logInfo(e,`[AgentIDE] Warning: failed to read root .gitignore: ${m instanceof Error?m.message:String(m)}`);return}}let l=c.split(`
|
|
30
|
+
`)}async function NS(t){let e=$r.join(t,xl,eg);if(!await wa(e))return null;try{return await Pi.promises.readFile(e,"utf-8")}catch{return null}}async function RS(t){let e=$r.join(t,xl);if(!await wa(e))return[];let n=[],r;try{r=await Pi.promises.readdir(e,{withFileTypes:!0})}catch{return[]}for(let s of r){if(!s.isDirectory())continue;let i=s.name,o=await tg(i,e);if(!o)continue;let a=$r.join(e,i);n.push({name:o.name??i,label:o.label??i,description:o.description,command:o.command,args:Fl(o.args,a),env:_a(o.env)})}return n}Fe.AGENTHIPPO_MCP_SERVERS_ENV="AGENTHIPPO_MCP_SERVERS";function Vl(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 CS=/^[A-Za-z_][A-Za-z0-9_]*$/;function kS(t,e){let n=t.bearerTokenEnv;if(n&&!CS.test(n))return Vl(t,e);let r={...t.headers??{}};return n&&(r.Authorization=`Bearer \${${n}}`),Object.keys(r).length>0?r:void 0}function $S(t,e){let n={};for(let r of t){if(r.url){let s=Vl(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 DS(t){if(Object.keys(t).length!==0)return JSON.stringify(t)}function LS(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 wa(t){try{return await Pi.promises.access(t),!0}catch{return!1}}});var sg=T(Ni=>{"use strict";Object.defineProperty(Ni,"__esModule",{value:!0});Ni.NoOpLogger=Ni.ConsoleLogger=void 0;var Wl=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}`:""}`)}};Ni.ConsoleLogger=Wl;var Kl=class{debug(e){}info(e){}warn(e){}error(e,n){}};Ni.NoOpLogger=Kl});var ig=T(Rs=>{"use strict";Object.defineProperty(Rs,"__esModule",{value:!0});Rs.CLIPermissionHandler=Rs.AutoDenyPermissionHandler=Rs.AutoApprovePermissionHandler=void 0;var ql=class{async requestPermission(e){return{behavior:"allow"}}};Rs.AutoApprovePermissionHandler=ql;var Yl=class{message;constructor(e="All tool requests are denied"){this.message=e}async requestPermission(e){return{behavior:"deny",message:this.message}}};Rs.AutoDenyPermissionHandler=Yl;var Jl=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"})})})}};Rs.CLIPermissionHandler=Jl});var og=T(Aa=>{"use strict";Object.defineProperty(Aa,"__esModule",{value:!0});Aa.NoOpEditTracker=void 0;var Xl=class{appliesEdits=!1;async startTracking(e,n){}async stopTracking(e,n){}async applyEdit(e,n,r,s){}};Aa.NoOpEditTracker=Xl});var ag=T(ln=>{"use strict";var MS=ln&&ln.__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]})),GS=ln&&ln.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),US=ln&&ln.__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"&&MS(n,e,r[s]);return GS(n,e),n}})();Object.defineProperty(ln,"__esModule",{value:!0});ln.DirectorySessionStore=ln.FileSessionStore=ln.MemorySessionStore=void 0;var Qt=require("fs"),Sa=US(require("path")),HS=require("crypto"),zl=class{store=new Map;get(e){return this.store.get(e)}async set(e,n){this.store.set(e,n)}clear(){this.store.clear()}};ln.MemorySessionStore=zl;var Ql=class{store={};loaded=!1;filePath;constructor(e){this.filePath=e}async load(){if(!this.loaded){try{let e=await Qt.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=Sa.dirname(this.filePath);await Qt.promises.mkdir(e,{recursive:!0});let n=`${this.filePath}.tmp.${Date.now()}`,r=JSON.stringify(this.store,null,2);try{await Qt.promises.writeFile(n,r,"utf-8"),await Qt.promises.rename(n,this.filePath)}catch(s){try{await Qt.promises.unlink(n)}catch{}throw s}}loadSync(){if(!this.loaded){try{let e=(0,Qt.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}}};ln.FileSessionStore=Ql;var Zl=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 Qt.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 Qt.promises.unlink(Sa.join(this.dir,i))}catch{}this.files.delete(s),this.serialized.delete(s)}this.entries={...r}}fileNameFor(e){return(0,HS.createHash)("sha256").update(e).digest("hex").slice(0,40)}async writeAtomic(e,n){let r=Sa.join(this.dir,e),s=`${r}.tmp.${process.pid}.${Date.now()}`;try{await Qt.promises.writeFile(s,n,"utf-8"),await Qt.promises.rename(s,r)}catch(i){try{await Qt.promises.unlink(s)}catch{}throw i}}loadSync(){if(this.loaded)return;this.loaded=!0,this.migrateLegacySingleFileSync();let e;try{e=(0,Qt.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,Qt.readFileSync)(Sa.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,Qt.readdirSync)(this.dir)}catch{e=!1}if(e)return;let n=`${this.dir}.json`,r;try{r=JSON.parse((0,Qt.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}};ln.DirectorySessionStore=Zl});var cg=T(ba=>{"use strict";Object.defineProperty(ba,"__esModule",{value:!0});ba.StaticConfigProvider=void 0;var eu=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}};ba.StaticConfigProvider=eu});var ru=T(Qe=>{"use strict";Object.defineProperty(Qe,"__esModule",{value:!0});Qe.StaticConfigProvider=Qe.DirectorySessionStore=Qe.FileSessionStore=Qe.MemorySessionStore=Qe.NoOpEditTracker=Qe.CLIPermissionHandler=Qe.AutoDenyPermissionHandler=Qe.AutoApprovePermissionHandler=Qe.NoOpLogger=Qe.ConsoleLogger=void 0;var lg=sg();Object.defineProperty(Qe,"ConsoleLogger",{enumerable:!0,get:function(){return lg.ConsoleLogger}});Object.defineProperty(Qe,"NoOpLogger",{enumerable:!0,get:function(){return lg.NoOpLogger}});var tu=ig();Object.defineProperty(Qe,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return tu.AutoApprovePermissionHandler}});Object.defineProperty(Qe,"AutoDenyPermissionHandler",{enumerable:!0,get:function(){return tu.AutoDenyPermissionHandler}});Object.defineProperty(Qe,"CLIPermissionHandler",{enumerable:!0,get:function(){return tu.CLIPermissionHandler}});var jS=og();Object.defineProperty(Qe,"NoOpEditTracker",{enumerable:!0,get:function(){return jS.NoOpEditTracker}});var nu=ag();Object.defineProperty(Qe,"MemorySessionStore",{enumerable:!0,get:function(){return nu.MemorySessionStore}});Object.defineProperty(Qe,"FileSessionStore",{enumerable:!0,get:function(){return nu.FileSessionStore}});Object.defineProperty(Qe,"DirectorySessionStore",{enumerable:!0,get:function(){return nu.DirectorySessionStore}});var xS=cg();Object.defineProperty(Qe,"StaticConfigProvider",{enumerable:!0,get:function(){return xS.StaticConfigProvider}})});var Ri=T(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.RAW_IDS_ENV=ft.ID_SALT_ENV=ft.CONTENT_CAPTURE_ENV=void 0;ft.isContentCaptureEnabled=fg;ft.resetPrivacyAnnouncementsForTest=VS;ft.hashIdentity=KS;ft.digestContent=pg;ft.describeContent=qS;var ug=require("crypto");ft.CONTENT_CAPTURE_ENV="AGENTHIPPO_EVIDENCE_CONTENT_CAPTURE";ft.ID_SALT_ENV="AGENTHIPPO_EVIDENCE_ID_SALT";ft.RAW_IDS_ENV="AGENTHIPPO_EVIDENCE_RAW_IDS";var BS="agenthippo-evidence-unsalted",FS=new Set(["1","true","yes","on"]);function dg(t){return FS.has((t??"").trim().toLowerCase())}var su=!1,iu=!1;function fg(t=process.env){let e=dg(t[ft.CONTENT_CAPTURE_ENV]);return su||(su=!0,console.warn(e?`[evidence] CONTENT CAPTURE IS ON \u2014 prompts, completions and tool I/O are recorded in evidence (${ft.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 ${ft.CONTENT_CAPTURE_ENV}=1 to restore full previews.`)),e}function VS(){su=!1,iu=!1}function WS(t){let e=t[ft.ID_SALT_ENV]?.trim();return e||(iu||(iu=!0,console.warn(`[evidence] ${ft.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.`)),BS)}function KS(t,e=process.env){let n=t?.trim();return n?dg(e[ft.RAW_IDS_ENV])?n:`anon_${(0,ug.createHash)("sha256").update(`${WS(e)}\0${n}`).digest("hex").slice(0,32)}`:void 0}function pg(t){return{sha256:(0,ug.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function qS(t,e,n=500,r=process.env){if(e===void 0)return{};let s=pg(e),i={[`${t}_sha256`]:s.sha256,[`${t}_length`]:s.length};return fg(r)&&(i[`${t}Preview`]=e.slice(0,n)),i}});var Ta=T(we=>{"use strict";Object.defineProperty(we,"__esModule",{value:!0});we.ANTHROPIC_SETUP_TOKEN_PREFIX=we.PROVIDERS=void 0;we.getProvider=YS;we.requiresApiKey=JS;we.isLocalProvider=XS;we.getAllProviderIds=zS;we.getCloudProviders=QS;we.getLocalProviders=ZS;we.getApiKeyProviders=eb;we.requiresBaseUrl=tb;we.getGatewayProviders=nb;we.isGatewayProvider=rb;we.isAnthropicProviderFamily=sb;we.normalizeAnthropicSetupToken=ib;we.isAnthropicSetupToken=ob;we.providerNotSupportAnthropicApi=ab;we.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 Codex (ChatGPT OAuth)",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 YS(t){return we.PROVIDERS[t]}function JS(t){return we.PROVIDERS[t]?.requiresApiKey??!0}function XS(t){let e=we.PROVIDERS[t];return e?!e.requiresApiKey:!1}function zS(){return Object.keys(we.PROVIDERS)}function QS(){return Object.values(we.PROVIDERS).filter(t=>t.requiresApiKey)}function ZS(){return Object.values(we.PROVIDERS).filter(t=>!t.requiresApiKey)}function eb(){return Object.values(we.PROVIDERS).filter(t=>t.showInAddApiKeyUI===!0)}function tb(t){let e=we.PROVIDERS[t];return e?!!e.endpointSettingKey&&!e.defaultEndpoint:!1}function nb(){return Object.values(we.PROVIDERS).filter(t=>t.isGateway)}function rb(t){return we.PROVIDERS[t]?.isGateway??!1}function sb(t){return t==="anthropic"||t==="anthropic-setup-token"}we.ANTHROPIC_SETUP_TOKEN_PREFIX="sk-ant-oat01-";function ib(t){return t.replace(/\s+/g,"").trim()}function ob(t){return typeof t=="string"&&t.trim().startsWith(we.ANTHROPIC_SETUP_TOKEN_PREFIX)}function ab(t,e){let n=we.PROVIDERS[t];return n?n.notSupportAnthropicApi??!1:e?.[t]?.notSupportAnthropicApi===!0}});var va=T(De=>{"use strict";Object.defineProperty(De,"__esModule",{value:!0});De.REGISTRY_KEY_SEPARATOR=De.BUILTIN_MODELS=void 0;De.getRegistryKey=gg;De.parseRegistryKey=cb;De.isCompositeKey=lb;De.getModel=ub;De.getModelByRegistryKey=db;De.getModelsForProvider=fb;De.getRecommendedModels=pb;De.getModelsWithCapability=gb;De.getActiveModels=hb;De.resolveModelAlias=mb;De.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}];De.REGISTRY_KEY_SEPARATOR="::";function gg(t,e){return`${t}${De.REGISTRY_KEY_SEPARATOR}${e}`}function cb(t){let e=t.indexOf(De.REGISTRY_KEY_SEPARATOR);if(e!==-1)return{providerId:t.substring(0,e),modelId:t.substring(e+De.REGISTRY_KEY_SEPARATOR.length)}}function lb(t){return t.includes(De.REGISTRY_KEY_SEPARATOR)}function ub(t){return De.BUILTIN_MODELS.find(e=>e.id===t)}function db(t){return De.BUILTIN_MODELS.find(e=>gg(e.provider,e.id)===t)}function fb(t){return De.BUILTIN_MODELS.filter(e=>e.provider===t)}function pb(){return De.BUILTIN_MODELS.filter(t=>t.recommended===!0)}function gb(t){return De.BUILTIN_MODELS.filter(e=>e.capabilities.includes(t))}function hb(){return De.BUILTIN_MODELS.filter(t=>!t.deprecated)}function mb(t){if(!t)return t;let e=t.toLowerCase().trim();return De.BUILTIN_MODELS.find(r=>r.id.toLowerCase()===e)?.id??t}});var ou=T(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.AGENT_ENGINES=void 0;rt.getAgentEngine=Eb;rt.getAllAgentEngines=yb;rt.getAllAgentEngineIds=_b;rt.getCompatibleProviders=wb;rt.getEnginesCompatibleWithProvider=Ab;rt.isEngineCompatibleWithProvider=Sb;rt.getEngineRulesFile=bb;rt.getEngineWorkspaceDir=Tb;var os=Ta();rt.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 Eb(t){return rt.AGENT_ENGINES[t]}function yb(){return Object.values(rt.AGENT_ENGINES)}function _b(){return Object.keys(rt.AGENT_ENGINES)}function wb(t){let e=rt.AGENT_ENGINES[t];if(!e)return[];let n=[e.nativeProvider];for(let[r,s]of Object.entries(os.PROVIDERS))if(!n.includes(r)){if(s.isGateway){n.push(r);continue}e.nativeProvider==="openai"&&!(0,os.isAnthropicProviderFamily)(r)&&n.push(r),e.nativeProvider==="anthropic"&&(0,os.isAnthropicProviderFamily)(r)&&n.push(r)}return n}function Ab(t){let e=os.PROVIDERS[t];return e?e.isGateway?Object.values(rt.AGENT_ENGINES):Object.values(rt.AGENT_ENGINES).filter(n=>!!(n.nativeProvider===t||n.nativeProvider==="openai"&&!(0,os.isAnthropicProviderFamily)(t)||n.nativeProvider==="anthropic"&&(0,os.isAnthropicProviderFamily)(t))):[]}function Sb(t,e){let n=rt.AGENT_ENGINES[t];return n?!!(n.nativeProvider===e||(0,os.isGatewayProvider)(e)||n.nativeProvider==="openai"&&!(0,os.isAnthropicProviderFamily)(e)||n.nativeProvider==="anthropic"&&(0,os.isAnthropicProviderFamily)(e)):!1}function bb(t){return rt.AGENT_ENGINES[t]?.rulesFile}function Tb(t){return rt.AGENT_ENGINES[t]?.workspaceDir}});var Pa=T(j=>{"use strict";Object.defineProperty(j,"__esModule",{value:!0});j.getEngineWorkspaceDir=j.getEngineRulesFile=j.isEngineCompatibleWithProvider=j.getEnginesCompatibleWithProvider=j.getCompatibleProviders=j.getAllAgentEngineIds=j.getAllAgentEngines=j.getAgentEngine=j.AGENT_ENGINES=j.getActiveModels=j.getModelsWithCapability=j.getRecommendedModels=j.getModelsForProvider=j.getModel=j.getModelByRegistryKey=j.isCompositeKey=j.parseRegistryKey=j.getRegistryKey=j.REGISTRY_KEY_SEPARATOR=j.BUILTIN_MODELS=j.providerNotSupportAnthropicApi=j.isAnthropicSetupToken=j.normalizeAnthropicSetupToken=j.ANTHROPIC_SETUP_TOKEN_PREFIX=j.isAnthropicProviderFamily=j.requiresBaseUrl=j.getApiKeyProviders=j.getLocalProviders=j.getCloudProviders=j.getAllProviderIds=j.isLocalProvider=j.requiresApiKey=j.getProvider=j.PROVIDERS=void 0;j.getProviderForModel=Ob;j.getEngineForModel=Ib;j.getModelsForEngine=Pb;j.isModelFromProvider=Nb;var un=Ta();Object.defineProperty(j,"PROVIDERS",{enumerable:!0,get:function(){return un.PROVIDERS}});Object.defineProperty(j,"getProvider",{enumerable:!0,get:function(){return un.getProvider}});Object.defineProperty(j,"requiresApiKey",{enumerable:!0,get:function(){return un.requiresApiKey}});Object.defineProperty(j,"isLocalProvider",{enumerable:!0,get:function(){return un.isLocalProvider}});Object.defineProperty(j,"getAllProviderIds",{enumerable:!0,get:function(){return un.getAllProviderIds}});Object.defineProperty(j,"getCloudProviders",{enumerable:!0,get:function(){return un.getCloudProviders}});Object.defineProperty(j,"getLocalProviders",{enumerable:!0,get:function(){return un.getLocalProviders}});Object.defineProperty(j,"getApiKeyProviders",{enumerable:!0,get:function(){return un.getApiKeyProviders}});Object.defineProperty(j,"requiresBaseUrl",{enumerable:!0,get:function(){return un.requiresBaseUrl}});Object.defineProperty(j,"isAnthropicProviderFamily",{enumerable:!0,get:function(){return un.isAnthropicProviderFamily}});Object.defineProperty(j,"ANTHROPIC_SETUP_TOKEN_PREFIX",{enumerable:!0,get:function(){return un.ANTHROPIC_SETUP_TOKEN_PREFIX}});Object.defineProperty(j,"normalizeAnthropicSetupToken",{enumerable:!0,get:function(){return un.normalizeAnthropicSetupToken}});Object.defineProperty(j,"isAnthropicSetupToken",{enumerable:!0,get:function(){return un.isAnthropicSetupToken}});Object.defineProperty(j,"providerNotSupportAnthropicApi",{enumerable:!0,get:function(){return un.providerNotSupportAnthropicApi}});var dr=va();Object.defineProperty(j,"BUILTIN_MODELS",{enumerable:!0,get:function(){return dr.BUILTIN_MODELS}});Object.defineProperty(j,"REGISTRY_KEY_SEPARATOR",{enumerable:!0,get:function(){return dr.REGISTRY_KEY_SEPARATOR}});Object.defineProperty(j,"getRegistryKey",{enumerable:!0,get:function(){return dr.getRegistryKey}});Object.defineProperty(j,"parseRegistryKey",{enumerable:!0,get:function(){return dr.parseRegistryKey}});Object.defineProperty(j,"isCompositeKey",{enumerable:!0,get:function(){return dr.isCompositeKey}});Object.defineProperty(j,"getModelByRegistryKey",{enumerable:!0,get:function(){return dr.getModelByRegistryKey}});Object.defineProperty(j,"getModel",{enumerable:!0,get:function(){return dr.getModel}});Object.defineProperty(j,"getModelsForProvider",{enumerable:!0,get:function(){return dr.getModelsForProvider}});Object.defineProperty(j,"getRecommendedModels",{enumerable:!0,get:function(){return dr.getRecommendedModels}});Object.defineProperty(j,"getModelsWithCapability",{enumerable:!0,get:function(){return dr.getModelsWithCapability}});Object.defineProperty(j,"getActiveModels",{enumerable:!0,get:function(){return dr.getActiveModels}});var as=ou();Object.defineProperty(j,"AGENT_ENGINES",{enumerable:!0,get:function(){return as.AGENT_ENGINES}});Object.defineProperty(j,"getAgentEngine",{enumerable:!0,get:function(){return as.getAgentEngine}});Object.defineProperty(j,"getAllAgentEngines",{enumerable:!0,get:function(){return as.getAllAgentEngines}});Object.defineProperty(j,"getAllAgentEngineIds",{enumerable:!0,get:function(){return as.getAllAgentEngineIds}});Object.defineProperty(j,"getCompatibleProviders",{enumerable:!0,get:function(){return as.getCompatibleProviders}});Object.defineProperty(j,"getEnginesCompatibleWithProvider",{enumerable:!0,get:function(){return as.getEnginesCompatibleWithProvider}});Object.defineProperty(j,"isEngineCompatibleWithProvider",{enumerable:!0,get:function(){return as.isEngineCompatibleWithProvider}});Object.defineProperty(j,"getEngineRulesFile",{enumerable:!0,get:function(){return as.getEngineRulesFile}});Object.defineProperty(j,"getEngineWorkspaceDir",{enumerable:!0,get:function(){return as.getEngineWorkspaceDir}});var vb=Ta(),Ia=va(),Oa=ou();function Ob(t){let e=Ia.BUILTIN_MODELS.find(n=>n.id===t);return e?vb.PROVIDERS[e.provider]:void 0}function Ib(t){let e=Ia.BUILTIN_MODELS.find(n=>n.id===t);if(e)return Object.values(Oa.AGENT_ENGINES).find(n=>(0,Oa.isEngineCompatibleWithProvider)(n.id,e.provider))}function Pb(t){let e=Oa.AGENT_ENGINES[t];return e?Ia.BUILTIN_MODELS.filter(n=>(0,Oa.isEngineCompatibleWithProvider)(e.id,n.provider)):[]}function Nb(t,e){return Ia.BUILTIN_MODELS.find(r=>r.id===t)?.provider===e}});var Da=T(Bn=>{"use strict";var Rb=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]})),Cb=Bn&&Bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),hg=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"&&Rb(n,e,r[s]);return Cb(n,e),n}})();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.getDefaultCustomEnginesInstallRoot=$a;Bn.installCustomEngineFromFiles=Fb;Bn.listInstalledCustomEngines=Vb;Bn.uninstallCustomEngine=Wb;var kb=require("child_process"),st=require("fs"),$b=hg(require("os")),Pe=hg(require("path")),Db=require("util"),Lb=Ye(),ka=Zt(),Mb=(0,Db.promisify)(kb.execFile),bn="engine.manifest.json";function $a(){return Pe.join(process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME||Pe.join($b.homedir(),Lb.AGENTIDE_DIR_NAME),"engines")}function mg(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 Na(t,e){try{return mg(t).replace(/\//g,Pe.sep)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`${e}: ${r}`)}}function Xs(t,e,n){let r=Pe.resolve(t),s=Pe.resolve(e),i=Pe.relative(r,s);if(i&&(i.startsWith("..")||Pe.isAbsolute(i)))throw new Error(`${n} must stay inside ${t}: ${e}`)}async function Ra(t){try{return await st.promises.access(t),!0}catch{return!1}}function au(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 Ca(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 Eg(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 Gb(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=Ca(n,"dir",`${e} workspaceSync`),s=Ca(n,"rulesFile",`${e} workspaceSync`);Na(r,"workspaceSync.dir"),Na(s,"workspaceSync.rulesFile")}async function Ub(t){let e=Pe.join(t,bn),n;try{n=await st.promises.readFile(e,"utf8")}catch{throw new Error(`Custom engine package is missing ${bn}`)}let r=au(n,bn),s=Ca(r,"id",bn),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:Ca(r,"entry",bn),workspaceSync:r.workspaceSync};if(i.version!==2)throw new Error(`${bn} must declare version 2`);if(i.id!==i.id.toLowerCase()||!/^[a-z0-9][a-z0-9._-]*$/.test(i.id))throw new Error(`${bn} id must contain only lowercase letters, numbers, ".", "_", or "-"`);Gb(i.workspaceSync,bn);let o=Na(i.entry,"entry"),a=Pe.join(t,o);if(Xs(t,a,"Engine entry"),!await Ra(a))throw new Error(`${bn} entry not found: ${i.entry}`);return i}async function Hb(t,e){let n=new Set;for(let r of e){let s=mg(r.path);if(n.has(s))throw new Error(`Duplicate engine package path: ${r.path}`);n.add(s);let i=Pe.join(t,...s.split("/"));Xs(t,i,"Engine package file"),await st.promises.mkdir(Pe.dirname(i),{recursive:!0}),await st.promises.writeFile(i,r.content)}}async function yg(t,e,n){try{await Mb(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 jb(t,e,n){let r=Pe.join(t,"package.json");if(!await Ra(r))return!1;let s=Pe.join(t,"package-lock.json");if(!await Ra(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,ka.logInfo)(n,"[Store] Running npm ci --omit=dev for custom engine"),await yg(i,["ci","--omit=dev"],t),!0}async function xb(t,e,n){let r=Na(e.entry,"entry"),s=Pe.join(t,r);return n&&(0,ka.logInfo)(n,`[Store] Validating custom engine entry: ${e.entry}`),await yg("node",["--check",s],t),s}async function Bb(t,e,n,r){await st.promises.mkdir(e,{recursive:!0});let s=Pe.join(e,n);Xs(e,s,"Custom engine install target");let i=await Ra(s);if(i&&!r)throw new Error(`Custom engine "${n}" already exists at ${s}`);if(!i)return await st.promises.rename(t,s),s;let o=Pe.join(e,".tmp");await st.promises.mkdir(o,{recursive:!0});let a=Pe.join(o,`${n}.previous-${Date.now()}`);Xs(e,a,"Custom engine backup target"),await st.promises.rm(a,{recursive:!0,force:!0}),await st.promises.rename(s,a);try{return await st.promises.rename(t,s),await st.promises.rm(a,{recursive:!0,force:!0}),s}catch(c){throw await st.promises.rm(s,{recursive:!0,force:!0}).catch(()=>{}),await st.promises.rename(a,s).catch(()=>{}),c}}async function Fb(t,e={}){if(t.length===0)throw new Error("Custom engine package is empty");let n=Pe.resolve(e.installRoot??$a()),r=e.runNpmCi!==!1,s=e.overwrite!==!1,i=Pe.join(n,".tmp");await st.promises.mkdir(i,{recursive:!0});let o=await st.promises.mkdtemp(Pe.join(i,`${e.slug||"engine"}-`));Xs(i,o,"Custom engine staging directory");let a=!0;try{await Hb(o,t);let c=await Ub(o),l=await jb(o,r,e.logger),f=await xb(o,c,e.logger),u=await Bb(o,n,c.id,s);a=!1;let d=Pe.join(u,Pe.relative(o,f)),p={id:c.id,displayName:c.displayName||c.id,version:c.version,manifestPath:Pe.join(u,bn),installDir:u,entryPath:d,npmInstalled:l};if(e.logger){let g=e.sourceUrl?` from ${e.sourceUrl}`:"";(0,ka.logInfo)(e.logger,`[Store] Installed custom engine ${p.id}${g} to ${u}`)}return p}finally{a&&await st.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}async function Vb(t={}){let e=Pe.resolve(t.installRoot??$a()),n;try{n=await st.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let s of n){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=Pe.join(e,s.name);Xs(e,i,"Custom engine install target");let o=Pe.join(i,bn),a=s.name,c=s.name;try{let l=au(await st.promises.readFile(o,"utf8"),o);typeof l.id=="string"&&l.id.trim()&&(a=Eg(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 Wb(t,e={}){let n=Eg(t),r=Pe.resolve(e.installRoot??$a()),s=Pe.join(r,n);Xs(r,s,"Custom engine uninstall target");let i;try{let o=await st.promises.lstat(s);if(!o.isDirectory()||o.isSymbolicLink())throw new Error(`Custom engine install target is not a normal directory: ${s}`);try{let a=au(await st.promises.readFile(Pe.join(s,bn),"utf8"),bn);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 st.promises.rm(s,{recursive:!0,force:!0}),e.logger&&(0,ka.logInfo)(e.logger,`[Store] Uninstalled custom engine ${n} from ${s}`),{id:n,displayName:i,installDir:s,removed:!0}}});var Cs=T(vn=>{"use strict";var Kb=vn&&vn.__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]})),qb=vn&&vn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cu=vn&&vn.__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 qb(n,e),n}})();Object.defineProperty(vn,"__esModule",{value:!0});vn.parseCustomEngineSearchPath=Ga;vn.getCustomEngineSearchRoots=Sg;vn.discoverCustomEngineManifests=bg;vn.resolveCustomEngineManifest=Tg;vn.tryResolveCustomEngineManifest=tT;var La=cu(require("fs")),Yb=cu(require("os")),fr=cu(require("path")),Ma=Ye(),Jb=Da(),_g="engines",wg="engine.manifest.json";function Ag(t){return t.trim().toLowerCase()}function Tn(t){return typeof t=="string"&&t.trim().length>0}function Ga(t){return Array.isArray(t)?t.flatMap(e=>Ga(e)):t?.trim()?t.split(fr.delimiter).map(e=>e.trim()).filter(Boolean):[]}function Xb(t){let e=new Set,n=[];for(let r of t){let s=fr.resolve(r);e.has(s)||(e.add(s),n.push(s))}return n}function zb(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid model config in ${e}: expected object`);let n=t;if(!Tn(n.defaultModel))throw new Error(`Invalid model config in ${e}: "defaultModel" is required`);return{defaultModel:n.defaultModel.trim(),apiKeyEnvVar:Tn(n.apiKeyEnvVar)?n.apiKeyEnvVar.trim():void 0,baseUrlEnvVar:Tn(n.baseUrlEnvVar)?n.baseUrlEnvVar.trim():void 0,openaiBaseUrlEnvVar:Tn(n.openaiBaseUrlEnvVar)?n.openaiBaseUrlEnvVar.trim():void 0}}function Qb(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=Tn(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 Zb(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(!Tn(n.dir))throw new Error(`Invalid workspaceSync config in ${e}: "dir" is required when enabled`);if(!Tn(n.rulesFile))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" is required when enabled`);let s=n.dir.trim();if(fr.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(fr.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 eT(t,e){let n=La.readFileSync(t,"utf8"),r=JSON.parse(n);if(!Tn(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(!Tn(r.entry))throw new Error(`Invalid custom engine manifest ${t}: "entry" is required`);let s=Ag(r.id),i=fr.dirname(t),o=r.entry.trim(),a=fr.isAbsolute(o)?o:fr.resolve(i,o);return{version:2,id:s,displayName:Tn(r.displayName)?r.displayName.trim():void 0,description:Tn(r.description)?r.description.trim():void 0,entry:o,entryPath:a,engineExport:Tn(r.engineExport)?r.engineExport.trim():void 0,homeEnvVar:Tn(r.homeEnvVar)?r.homeEnvVar.trim():void 0,workspaceSync:Zb(r.workspaceSync,t),promptInjection:Qb(r.promptInjection,t),model:zb(r.model,t),manifestPath:t,manifestDir:i,searchRoot:e}}function Sg(t,e){let n=t?fr.resolve(t):void 0,r=Ga(e),s=Ga(process.env.AGENTHIPPO_CUSTOM_ENGINES_DIR??process.env.AGENTIDE_CUSTOM_ENGINES_DIR);return Xb([...n?[fr.join(n,Ma.AGENTIDE_DIR_NAME,_g)]:[],...r,...s,(0,Jb.getDefaultCustomEnginesInstallRoot)(),fr.join(Yb.homedir(),Ma.AGENTIDE_DIR_NAME,_g)])}function bg(t,e,n){let r=[],s=new Set;for(let i of Sg(t,e)){if(!La.existsSync(i))continue;let o;try{o=La.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory())continue;let c=fr.join(i,a.name,wg);if(!La.existsSync(c))continue;let l;try{l=eT(c,i)}catch(f){n?.(c,f);continue}s.has(l.id)||(s.add(l.id),r.push(l))}}return r}function Tg(t,e,n,r){let s=bg(t,n,r),i=e?Ag(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 ${Ma.AGENTIDE_DIR_NAME}/engines.`)}return o}if(s.length===0)throw new Error(`No custom engines found. Add ${wg} under ${Ma.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 tT(t,e,n,r){try{return Tg(t,e,n,r)}catch{return}}});var Zt=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=Pa(),branding_1=Ye(),customRegistry_1=Cs(),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 u=await fs_1.promises.readFile(c,"utf8");await fs_1.promises.writeFile(o,n(u),"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(u,d)=>{let p;try{p=await fs_1.promises.readdir(u,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let m=path.join(u,g.name),h=d?path.join(d,g.name):g.name;if(g.isDirectory())s.add(h),await o(m,h);else if(g.isFile())i.set(h,m);else if(g.isSymbolicLink())try{let E=await fs_1.promises.readlink(m),y=path.isAbsolute(E)?E:path.resolve(path.dirname(m),E);(await fs_1.promises.stat(y)).isDirectory()?(s.add(h),await o(y,h)):i.set(h,y)}catch(E){let y=getErrorCode(E);if(y==="ENOENT"||y==="ELOOP")continue;throw E}}};await o(t,"");let a=Array.from(s).sort((u,d)=>u.split(path.sep).length-d.split(path.sep).length);for(let u of a)await ensureRealDirectory(path.join(e,u));for(let[u,d]of i.entries())await symlinkOrCopyFile(d,path.join(e,u),n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0});let c=new Set(i.keys()),l=async(u,d)=>{let p;try{p=await fs_1.promises.readdir(u,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let m=path.join(u,g.name),h=d?path.join(d,g.name):g.name,E=path.join(t,h);if(g.isDirectory())await l(m,h);else if(g.isFile()&&!g.isSymbolicLink()&&!c.has(h))try{await fs_1.promises.mkdir(path.dirname(E),{recursive:!0}),await fs_1.promises.copyFile(m,E),logInfo(n,`[AgentIDE] Copied new file to source: ${r}/${h}`.replace(/\\/g,"/")),i.set(h,E)}catch(y){logInfo(n,`[AgentIDE] Warning: failed to copy back ${h}: ${y instanceof Error?y.message:String(y)}`)}}};await l(e,"");for(let[u,d]of i.entries()){let p=path.join(e,u);try{let g=await fs_1.promises.lstat(p);g.isFile()&&!g.isSymbolicLink()&&(await fs_1.promises.rm(p,{force:!0}),await symlinkOrCopyFile(d,p,n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0}))}catch{}}let f=async(u,d)=>{let p;try{p=await fs_1.promises.readdir(u,{withFileTypes:!0})}catch(g){if(getErrorCode(g)==="ENOENT")return;throw g}for(let g of p){if(g.name.startsWith("."))continue;let m=path.join(u,g.name),h=d?path.join(d,g.name):g.name;g.isDirectory()?await f(m,h):g.isSymbolicLink()&&(c.has(h)||await fs_1.promises.rm(m,{force:!0}))}};await f(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(m){logInfo(e,`[AgentIDE] Note: Could not initialize git in ${t}: ${m instanceof Error?m.message:String(m)}`)}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(m){if(getErrorCode(m)!=="ENOENT"){logInfo(e,`[AgentIDE] Warning: failed to read root .gitignore: ${m instanceof Error?m.message:String(m)}`);return}}let l=c.split(`
|
|
32
32
|
`).map(m=>m.trim());if(o.filter(m=>!l.includes(m)).length===0)return;let u=`# ${branding_1.AGENTIDE_BRAND_NAME} (managed)`,d="# AgentIDE (managed)",p=c.includes(u)||c.includes(d),g;if(p){let m=c.split(`
|
|
33
33
|
`),h=[],E=!1;for(let y of m){if(y.trim()===u||y.trim()===d){E=!0,h.push(...a);continue}if(E){if(y.trim().startsWith("#")||o.includes(y.trim())||y.trim()==="")continue;E=!1}h.push(y)}g=h.join(`
|
|
34
34
|
`).replace(/\n{3,}/g,`
|
|
@@ -36,59 +36,59 @@ Provide clear, actionable responses with code examples when relevant.
|
|
|
36
36
|
`).trimEnd()+`
|
|
37
37
|
`}else g=[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(m){logInfo(e,`[AgentIDE] Warning: failed to write root .gitignore: ${m instanceof Error?m.message:String(m)}`)}}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=Js();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 vg=T(Ua=>{"use strict";Object.defineProperty(Ua,"__esModule",{value:!0});Ua.VSCodeSessionStore=void 0;var lu=class{globalState;constructor(e){this.globalState=e}get(e){return this.globalState.get(e)}async set(e,n){await this.globalState.update(e,n)}};Ua.VSCodeSessionStore=lu});var zs=T(ct=>{"use strict";var nT=ct&&ct.__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]})),rT=ct&&ct.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sT=ct&&ct.__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"&&nT(n,e,r[s]);return rT(n,e),n}})();Object.defineProperty(ct,"__esModule",{value:!0});ct.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=void 0;ct.initSessionStore=lT;ct.initSessionStoreWithStore=Pg;ct._getSessionStore=uT;ct._resetSessionStore=dT;ct.upsertPersistedSession=fT;ct.touchPersistedSession=pT;ct.getPersistedSession=gT;ct.runSessionMaintenance=hT;ct.buildConversationKey=ET;ct.withConversationLock=yT;var iT=sT(require("crypto")),oT=Zt(),aT=vg(),Ig="agentide.providerSessions.v1",Og=200,cT=1e3*60*60*24*14,Fn={},ho;function lT(t){Pg(new aT.VSCodeSessionStore(t.globalState))}function Pg(t){ho=t,Fn=t.get(Ig)??{},ja(Date.now()),xa()}function uT(){return ho}function dT(){ho=void 0,Fn={}}function ja(t){for(let[n,r]of Object.entries(Fn))t-r.lastUsedAt>cT&&delete Fn[n];let e=Object.keys(Fn);if(!(e.length<=Og)){e.sort((n,r)=>Fn[n].lastUsedAt-Fn[r].lastUsedAt);for(let n=0;n<e.length-Og;n++)delete Fn[e[n]]}}async function xa(){if(ho)try{await ho.set(Ig,Fn)}catch{}}async function fT(t,e){Fn[t]=e,ja(Date.now()),await xa()}async function pT(t){let e=Fn[t];e&&(e.lastUsedAt=Date.now(),ja(e.lastUsedAt),await xa())}function gT(t){return Fn[t]}function hT(){ja(Date.now()),xa()}function mT(t){return JSON.stringify({workspaceRoot:t.workspaceRoot,additionalDirectories:(0,oT.stableAdditionalDirs)(t.additionalDirectories),agentPackId:t.agentPackId??"default"})}function ET(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=mT(e),l=iT.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}}ct.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=1e3*60*60*48;var Ha=new Map;function yT(t,e,n){let r=Ha.get(t)??Promise.resolve(),s,i=new Promise(E=>{s=E}),o=r.then(()=>i);Ha.set(t,o);let a=n?.label?` (${n.label})`:"",c=typeof n?.timeoutMs=="number"?n.timeoutMs:void 0,l=n?.signal,f,u,d=!1,p=l?new Promise((E,y)=>{if(l.aborted){y(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`));return}f=()=>y(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`)),l.addEventListener("abort",f,{once:!0})}):void 0,g=c&&c>0?new Promise((E,y)=>{u=setTimeout(()=>{d=!0,n?.onTimeout?.(),y(new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`))},c)}):void 0,m=[r,p,g].filter(Boolean);return Promise.race(m).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 y=[e(),g].filter(Boolean);return await Promise.race(y)}).finally(()=>{try{u&&clearTimeout(u),l&&f&&l.removeEventListener("abort",f)}finally{s(),Ha.get(t)===o&&Ha.delete(t)}})}});var Qs=T(dn=>{"use strict";var _T=dn&&dn.__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]})),wT=dn&&dn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),AT=dn&&dn.__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"&&_T(n,e,r[s]);return wT(n,e),n}})();Object.defineProperty(dn,"__esModule",{value:!0});dn.buildLiteLLMMetadataHeaders=TT;dn.resolveAnalyticsProjectId=vT;dn.generateRequestId=OT;dn.persistSessionIfNeeded=IT;dn.touchSessionIfNeeded=PT;dn.getPersistedSessionId=NT;var ST=Ri(),Ba=zs(),bT=AT(require("path"));function TT(t,e){if(!t)return[];let n=[],r=(0,ST.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 vT(t,e){let n=t?.trim();if(n)return n;if(!e)return;let r=e.replace(/[\\/]+$/,"").trim();return r&&bT.basename(r).trim()||void 0}function OT(){return`req-${Math.random().toString(16).slice(2,10)}`}async function IT(t,e,n,r){if(e.isEphemeral)return;let s=Date.now(),i=(0,Ba.getPersistedSession)(e.key);await(0,Ba.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 PT(t){t.isEphemeral||(0,Ba.touchPersistedSession)(t.key)}function NT(t,e){let n=(0,Ba.getPersistedSession)(e);return n?.provider===t?n.id:void 0}});var uu=T(pr=>{"use strict";Object.defineProperty(pr,"__esModule",{value:!0});pr.DEFAULT_PERMISSIONS=void 0;pr.getDefaultPermissions=Ng;pr._resetMappingConfigCache=RT;pr.parsePermissions=Rg;pr.parseManifestPermissions=CT;pr.enforcePermissions=kT;pr.toClaudeOptions=$T;pr.toCodexOptions=DT;pr.DEFAULT_PERMISSIONS={fileAccess:"full"};var ks={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 Ng(){return{...ks.defaults}}function RT(){}function Rg(t){let e=t?.spec?.permissions,n=Ng();return{fileAccess:e?.fileAccess??n.fileAccess}}function CT(t){return Rg(t)}function kT(t,e){return{fileAccess:e.fileAccess}}function $T(t,e){return{...t.fileAccess==="read-only"?ks.claude.readOnly:t.fileAccess==="workspace-write"?ks.claude.workspaceWrite:ks.claude.fullAccess,additionalDirectories:t.fileAccess==="full"?void 0:e}}function DT(t,e){let n=t.fileAccess==="read-only"?ks.codex.readOnly:t.fileAccess==="workspace-write"?ks.codex.workspaceWrite:ks.codex.fullAccess;return{approvalPolicy:ks.codex.approvalPolicy,...n,additionalDirectories:e}}});var Zs=T(On=>{"use strict";var LT=On&&On.__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]})),MT=On&&On.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),GT=On&&On.__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"&<(n,e,r[s]);return MT(n,e),n}})();Object.defineProperty(On,"__esModule",{value:!0});On.parseYaml=fu;On.stringifyYaml=kg;On.updateManifestName=HT;On.loadAgentManifest=jT;On.parseAgentManifest=$g;var du=require("fs"),Cg=GT(require("path")),UT=qe();function fu(t){return require("js-yaml").load(t)}function kg(t){return require("js-yaml").dump(t,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}async function HT(t,e){let n=await du.promises.readFile(t,"utf8"),r=fu(n);r&&typeof r=="object"&&r.metadata&&(r.metadata.name=e);let s=kg(r);await du.promises.writeFile(t,s,"utf8")}async function jT(t){let e=await du.promises.readFile(t,"utf8");return $g(e,t)}function $g(t,e){let n=fu(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 xT(n,r),n}function xT(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(Cg.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=Cg.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",`${UT.AGENTIDE_DIR_NAME}/data/${t.metadata.name}`)}});var hu=T(St=>{"use strict";var BT=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]})),FT=St&&St.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),VT=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"&&BT(n,e,r[s]);return FT(n,e),n}})();Object.defineProperty(St,"__esModule",{value:!0});St.listUserLibraryAgents=qT;St.isWorkspaceAgentAvailable=YT;St.isAgentInUserLibrary=JT;St.hydrateFromUserLibrary=Lg;St.promoteToUserLibrary=XT;St.readAgentSource=Mg;St.checkForUpdate=zT;St.updateFromUserLibrary=QT;St.duplicateAgent=ev;St.resetDefaultAgent=tv;var Ye=require("fs"),Fe=VT(require("path")),te=Zt(),ae=jn(),Ci=Zs(),Dg=qe();function WT(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 KT(t){return[...t].sort(WT)}async function pu(t,e){await Ye.promises.mkdir(e,{recursive:!0});let n=await Ye.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=Fe.join(t,r.name),i=Fe.join(e,r.name);if(r.isDirectory()){if(r.name.startsWith("."))continue;await pu(s,i)}else await Ye.promises.copyFile(s,i)}}async function qT(){let t=(0,ae.getUserAgentsDir)();if(!await(0,te.pathExists)(t))return[];let e=await Ye.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=r.name,i=(0,ae.getUserAgentRoot)(s),o=await gu(i);if(o.length===0)continue;let a=await Fa(s),c=a||o[o.length-1],l=(0,ae.getUserAgentVersionDir)(s,c),f=Fe.join(l,ae.AGENT_CONSTANTS.MANIFEST_FILE),u,d;try{let p=await(0,Ci.loadAgentManifest)(f);u=p.metadata.description,d=p.spec.engine}catch{}n.push({id:s,versions:o,currentVersion:a,description:u,preferredEngine:d})}return n}async function gu(t){try{let e=await Ye.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=Fe.join(t,r.name,ae.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,te.pathExists)(s))try{await(0,Ci.loadAgentManifest)(s),n.push(r.name)}catch{}}return KT(n)}catch{return[]}}async function Fa(t){let e=(0,ae.getUserAgentCurrentPath)(t);try{let n=(await Ye.promises.readFile(e,"utf8")).trim();if(!n)return;let r=(0,ae.getUserAgentVersionDir)(t,n),s=Fe.join(r,ae.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,te.pathExists)(s))return;try{return await(0,Ci.loadAgentManifest)(s),n}catch{return}}catch{}}async function YT(t,e){let n=(0,ae.getAgentManifestPath)(t,e);if(!await(0,te.pathExists)(n))return!1;try{return(await(0,Ci.loadAgentManifest)(n)).metadata.name===e}catch{return!1}}async function JT(t){if(await Fa(t))return!0;let n=(0,ae.getUserAgentRoot)(t);return(await gu(n)).length>0}async function Lg(t,e,n,r){let s=n,i=n??"current";if(!s&&(s=await Fa(e),!s)){let d=(0,ae.getUserAgentRoot)(e),p=await gu(d);if(p.length===0){(0,te.logInfo)(r,`[AgentStores] Agent not in User Library: ${e}`);return}s=p[p.length-1],i=s}let o=(0,ae.getUserAgentVersionDir)(e,s);if(!await(0,te.pathExists)(o)){(0,te.logInfo)(r,`[AgentStores] Version not found in User Library: ${e}@${s}`);return}let a=(0,ae.getAgentRoot)(t,e);(0,te.logInfo)(r,`[AgentStores] Hydrating ${e}@${s} from User Library`),await(0,te.pathExists)(a)&&((0,te.logInfo)(r,`[AgentStores] Clearing existing directory: ${a}`),await Ye.promises.rm(a,{recursive:!0,force:!0})),await(0,te.copyDirRecursive)(o,a);let c=Fe.join(a,ae.AGENT_CONSTANTS.MANIFEST_FILE),{sha256:l}=await(0,te.readFileSha256)(c),f={source:"user-library",agentId:e,version:s,resolvedFrom:i,sha256:l,hydratedAt:new Date().toISOString()},u=Fe.join(a,ae.AGENT_CONSTANTS.SOURCE_FILE);return await Ye.promises.writeFile(u,JSON.stringify(f,null,2),"utf8"),(0,te.logInfo)(r,`[AgentStores] Hydrated ${e}@${s} to ${a}`),s}async function XT(t,e,n){if(e===ae.AGENT_CONSTANTS.DEFAULT_AGENT_ID)throw new Error("Cannot promote the default agent to User Library");let r=(0,ae.getAgentRoot)(t,e),s=(0,ae.getAgentManifestPath)(t,e);if(!await(0,te.pathExists)(s))throw new Error(`Agent not found: ${e}`);let o=(await(0,Ci.loadAgentManifest)(s)).metadata.version,a=(0,ae.getUserAgentVersionDir)(e,o),c=Fe.join(a,ae.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,te.pathExists)(c)){let f=await(0,te.readFileSha256)(s),u=await(0,te.readFileSha256)(c);if(f.sha256===u.sha256)return(0,te.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,te.logInfo)(n,`[AgentStores] Promoting ${e}@${o} to User Library`),await Ye.promises.mkdir(a,{recursive:!0}),await pu(r,a);let l=(0,ae.getUserAgentCurrentPath)(e);return await Ye.promises.writeFile(l,o,"utf8"),(0,te.logInfo)(n,`[AgentStores] Promoted ${e}@${o} to ${a}`),o}async function Mg(t,e){let n=Fe.join((0,ae.getAgentRoot)(t,e),ae.AGENT_CONSTANTS.SOURCE_FILE);try{let r=await Ye.promises.readFile(n,"utf8");return JSON.parse(r)}catch{return}}async function zT(t,e){let n=await Mg(t,e);if(!n||n.source!=="user-library")return;let r=await Fa(e);if(r&&r!==n.version)return r}async function QT(t,e,n,r){let s=(0,ae.getAgentRoot)(t,e),i=new Date().toISOString().replace(/[:.]/g,"-"),o=Fe.join(Fe.dirname(s),`.${e}.backup-${i}`);await(0,te.pathExists)(s)&&((0,te.logInfo)(r,`[AgentStores] Backing up ${e} to ${o}`),await(0,te.copyDirRecursive)(s,o),await Ye.promises.rm(s,{recursive:!0,force:!0}));let a=await Lg(t,e,n,r);if(!a)throw await(0,te.pathExists)(o)&&((0,te.logInfo)(r,"[AgentStores] Restoring backup after failed update"),await(0,te.copyDirRecursive)(o,s)),new Error(`Failed to update ${e} from User Library`);return(0,te.logInfo)(r,`[AgentStores] Updated ${e} to ${a}`),a}async function ZT(t,e){let n=`${e}-copy`;if(!await(0,te.pathExists)((0,ae.getAgentRoot)(t,n)))return n;for(let r=2;r<100;r++){let s=`${e}-${r}`;if(!await(0,te.pathExists)((0,ae.getAgentRoot)(t,s)))return s}return`${e}-${Date.now()}`}async function ev(t,e,n){let r=(0,ae.getAgentRoot)(t,e),s=(0,ae.getAgentManifestPath)(t,e);if(!await(0,te.pathExists)(s))throw new Error(`Agent not found: ${e}`);let i=await ZT(t,e),o=(0,ae.getAgentRoot)(t,i);(0,te.logInfo)(n,`[AgentStores] Duplicating ${e} to ${i}`),await pu(r,o);let a=(0,ae.getAgentManifestPath)(t,i);await(0,Ci.updateManifestName)(a,i);let c=Fe.join(o,ae.AGENT_CONSTANTS.SOURCE_FILE);try{await Ye.promises.rm(c,{force:!0})}catch{}return(0,te.logInfo)(n,`[AgentStores] Duplicated ${e} to ${i}`),i}async function tv(t,e,n){let r=(0,ae.getAgentRoot)(t,ae.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=new Date().toISOString().replace(/[:.]/g,"-"),i=Fe.join(Fe.dirname(r),`.default.backup-${s}`);if(await(0,te.pathExists)(r)&&((0,te.logInfo)(n,`[AgentStores] Backing up default agent to ${i}`),await(0,te.copyDirRecursive)(r,i),await Ye.promises.rm(r,{recursive:!0,force:!0})),await Ye.promises.mkdir(r,{recursive:!0}),await Ye.promises.mkdir(Fe.join(r,ae.AGENT_CONSTANTS.RULES_DIR),{recursive:!0}),await Ye.promises.mkdir(Fe.join(r,ae.AGENT_CONSTANTS.SKILLS_DIR),{recursive:!0}),e){let c=Fe.join(e,"rules","AGENTS.md"),l=Fe.join(r,ae.AGENT_CONSTANTS.AGENTS_MD);if(await(0,te.pathExists)(c)){let p=await Ye.promises.readFile(c,"utf8");await Ye.promises.writeFile(l,(0,Dg.applyBrandingTokens)(p),"utf8"),(0,te.logInfo)(n,"[AgentStores] Restored AGENTS.md from bundled templates")}let f=Fe.join(e,ae.AGENT_CONSTANTS.GHOST_TEXT_FILE),u=Fe.join(r,ae.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,te.pathExists)(f)&&!await(0,te.pathExists)(u)){let p=await Ye.promises.readFile(f,"utf8");await Ye.promises.writeFile(u,p,"utf8"),(0,te.logInfo)(n,"[AgentStores] Restored GHOST_TEXT.md from bundled templates")}let d=Fe.join(e,"skills");if(await(0,te.pathExists)(d)){let p=await Ye.promises.readdir(d,{withFileTypes:!0});for(let g of p){if(!g.isDirectory())continue;let m=Fe.join(d,g.name),h=Fe.join(r,ae.AGENT_CONSTANTS.SKILLS_DIR,g.name);await(0,te.copyDirRecursiveWithTransform)(m,h,Dg.applyBrandingTokens),(0,te.logInfo)(n,`[AgentStores] Restored skill: ${g.name}`)}}}let o=(0,ae.generateDefaultAgentYaml)({model:"claude"}),a=Fe.join(r,ae.AGENT_CONSTANTS.MANIFEST_FILE);await Ye.promises.writeFile(a,o,"utf8"),(0,te.logInfo)(n,"[AgentStores] Reset default agent complete")}});var Gg=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=jn(),manifest_1=Zs(),utils_1=Zt(),stores_1=hu(),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 f=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}`),f}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 mo=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(P=>setTimeout(P,500));let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:a});if(!c.ok){let P=await c.text();throw new Error(`Failed to get branch ref for ${n}: ${c.status} - ${P}`)}let f=(await c.json()).object.sha,u=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits/${f}`,{headers:a});if(!u.ok){let P=await u.text();throw new Error(`Failed to get commit ${f}: ${u.status} - ${P}`)}let p=(await u.json()).tree.sha,g=[];for(let P of r){let b=P.encoding??"utf-8",v=await fetch(`https://api.github.com/repos/${t}/${e}/git/blobs`,{method:"POST",headers:a,body:JSON.stringify({content:P.content,encoding:b})});if(!v.ok){let S=await v.text();throw new Error(`Failed to create blob for ${P.path}: ${v.status} - ${S}`)}let A=await v.json();g.push({path:P.path,mode:"100644",type:"blob",sha:A.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 m=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({base_tree:p,tree:g})});if(m.status===404&&(console.log("[AgentHippo] Retrying tree creation without base_tree..."),m=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({tree:g})})),!m.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 m.json(),E=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits`,{method:"POST",headers:a,body:JSON.stringify({message:s,tree:h.sha,parents:[f]})});if(!E.ok)throw new Error(`Failed to create commit: ${E.status}`);let y=await E.json(),w=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{method:"PATCH",headers:a,body:JSON.stringify({sha:y.sha})});if(!w.ok)throw new Error(`Failed to update ref: ${w.status}`);return{sha:y.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}),f=l.ok?(await l.json()).sha:void 0,u=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:f})});if(!u.ok){let p=await u.text();throw new Error(`Failed to create file ${a.path}: ${u.status} - ${p}`)}o=(await u.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 Fg=T(Dr=>{"use strict";var nv=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]})),rv=Dr&&Dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sv=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"&&nv(n,e,r[s]);return rv(n,e),n}})();Object.defineProperty(Dr,"__esModule",{value:!0});Dr.validateForPublish=xg;Dr.publishToGitHub=ov;var mu=require("fs"),Hg=sv(require("path")),fn=Zt(),jg=Zs(),Wa=jn(),ei=mo(),iv=[".","..",".git",".claude",".codex",".agentide","node_modules","*.log","current.txt"],Ug=1024*1024,Va=10*1024*1024;async function xg(t,e){let n=[],r=[],s=(0,Wa.getAgentRoot)(t,e);if(!await(0,fn.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 f=Hg.join(s,l);await(0,fn.pathExists)(f)||n.push(`Missing required file: ${l}`)}let o=(0,Wa.getAgentManifestPath)(t,e);if(await(0,fn.pathExists)(o))try{let l=await(0,jg.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 Bg(s),c=a.reduce((l,f)=>l+f.size,0);c>Va?n.push(`Bundle too large: ${ki(c)} (max ${ki(Va)})`):c>Va*.8&&r.push(`Bundle is ${ki(c)}, approaching limit of ${ki(Va)}`);for(let l of a)l.size>Ug&&n.push(`File too large: ${l.relativePath} (${ki(l.size)}, max ${ki(Ug)})`);return{valid:n.length===0,errors:n,warnings:r}}async function Bg(t){let e=[];async function n(r,s){let i;try{i=await mu.promises.readdir(r)}catch{return}for(let o of i){if(iv.some(f=>o===f||o.startsWith(".")))continue;let a=Hg.join(r,o),c=s?`${s}/${o}`:o,l=await mu.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 ov(t,e,n){let{agentId:r,visibility:s,changelog:i}=e;(0,fn.logInfo)(n,`[Publish] Starting publish for ${r}...`);let o=await xg(t,r);if(!o.valid)throw new Error(`Validation failed:
|
|
39
|
+
`).replace(/^\n+/,"");try{await writeFileIfChanged(i,g)&&logInfo(e,`[AgentIDE] Updated ${i} to ignore ${branding_1.AGENTIDE_BRAND_NAME} directories`)}catch(m){logInfo(e,`[AgentIDE] Warning: failed to write root .gitignore: ${m instanceof Error?m.message:String(m)}`)}}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=Js();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 vg=T(Ua=>{"use strict";Object.defineProperty(Ua,"__esModule",{value:!0});Ua.VSCodeSessionStore=void 0;var lu=class{globalState;constructor(e){this.globalState=e}get(e){return this.globalState.get(e)}async set(e,n){await this.globalState.update(e,n)}};Ua.VSCodeSessionStore=lu});var zs=T(ct=>{"use strict";var nT=ct&&ct.__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]})),rT=ct&&ct.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sT=ct&&ct.__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"&&nT(n,e,r[s]);return rT(n,e),n}})();Object.defineProperty(ct,"__esModule",{value:!0});ct.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=void 0;ct.initSessionStore=lT;ct.initSessionStoreWithStore=Pg;ct._getSessionStore=uT;ct._resetSessionStore=dT;ct.upsertPersistedSession=fT;ct.touchPersistedSession=pT;ct.getPersistedSession=gT;ct.runSessionMaintenance=hT;ct.buildConversationKey=ET;ct.withConversationLock=yT;var iT=sT(require("crypto")),oT=Zt(),aT=vg(),Ig="agentide.providerSessions.v1",Og=200,cT=1e3*60*60*24*14,Fn={},ho;function lT(t){Pg(new aT.VSCodeSessionStore(t.globalState))}function Pg(t){ho=t,Fn=t.get(Ig)??{},ja(Date.now()),xa()}function uT(){return ho}function dT(){ho=void 0,Fn={}}function ja(t){for(let[n,r]of Object.entries(Fn))t-r.lastUsedAt>cT&&delete Fn[n];let e=Object.keys(Fn);if(!(e.length<=Og)){e.sort((n,r)=>Fn[n].lastUsedAt-Fn[r].lastUsedAt);for(let n=0;n<e.length-Og;n++)delete Fn[e[n]]}}async function xa(){if(ho)try{await ho.set(Ig,Fn)}catch{}}async function fT(t,e){Fn[t]=e,ja(Date.now()),await xa()}async function pT(t){let e=Fn[t];e&&(e.lastUsedAt=Date.now(),ja(e.lastUsedAt),await xa())}function gT(t){return Fn[t]}function hT(){ja(Date.now()),xa()}function mT(t){return JSON.stringify({workspaceRoot:t.workspaceRoot,additionalDirectories:(0,oT.stableAdditionalDirs)(t.additionalDirectories),agentPackId:t.agentPackId??"default"})}function ET(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=mT(e),l=iT.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}}ct.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=1e3*60*60*48;var Ha=new Map;function yT(t,e,n){let r=Ha.get(t)??Promise.resolve(),s,i=new Promise(E=>{s=E}),o=r.then(()=>i);Ha.set(t,o);let a=n?.label?` (${n.label})`:"",c=typeof n?.timeoutMs=="number"?n.timeoutMs:void 0,l=n?.signal,f,u,d=!1,p=l?new Promise((E,y)=>{if(l.aborted){y(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`));return}f=()=>y(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`)),l.addEventListener("abort",f,{once:!0})}):void 0,g=c&&c>0?new Promise((E,y)=>{u=setTimeout(()=>{d=!0,n?.onTimeout?.(),y(new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`))},c)}):void 0,m=[r,p,g].filter(Boolean);return Promise.race(m).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 y=[e(),g].filter(Boolean);return await Promise.race(y)}).finally(()=>{try{u&&clearTimeout(u),l&&f&&l.removeEventListener("abort",f)}finally{s(),Ha.get(t)===o&&Ha.delete(t)}})}});var Qs=T(dn=>{"use strict";var _T=dn&&dn.__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]})),wT=dn&&dn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),AT=dn&&dn.__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"&&_T(n,e,r[s]);return wT(n,e),n}})();Object.defineProperty(dn,"__esModule",{value:!0});dn.buildLiteLLMMetadataHeaders=TT;dn.resolveAnalyticsProjectId=vT;dn.generateRequestId=OT;dn.persistSessionIfNeeded=IT;dn.touchSessionIfNeeded=PT;dn.getPersistedSessionId=NT;var ST=Ri(),Ba=zs(),bT=AT(require("path"));function TT(t,e){if(!t)return[];let n=[],r=(0,ST.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 vT(t,e){let n=t?.trim();if(n)return n;if(!e)return;let r=e.replace(/[\\/]+$/,"").trim();return r&&bT.basename(r).trim()||void 0}function OT(){return`req-${Math.random().toString(16).slice(2,10)}`}async function IT(t,e,n,r){if(e.isEphemeral)return;let s=Date.now(),i=(0,Ba.getPersistedSession)(e.key);await(0,Ba.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 PT(t){t.isEphemeral||(0,Ba.touchPersistedSession)(t.key)}function NT(t,e){let n=(0,Ba.getPersistedSession)(e);return n?.provider===t?n.id:void 0}});var uu=T(pr=>{"use strict";Object.defineProperty(pr,"__esModule",{value:!0});pr.DEFAULT_PERMISSIONS=void 0;pr.getDefaultPermissions=Ng;pr._resetMappingConfigCache=RT;pr.parsePermissions=Rg;pr.parseManifestPermissions=CT;pr.enforcePermissions=kT;pr.toClaudeOptions=$T;pr.toCodexOptions=DT;pr.DEFAULT_PERMISSIONS={fileAccess:"full"};var ks={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 Ng(){return{...ks.defaults}}function RT(){}function Rg(t){let e=t?.spec?.permissions,n=Ng();return{fileAccess:e?.fileAccess??n.fileAccess}}function CT(t){return Rg(t)}function kT(t,e){return{fileAccess:e.fileAccess}}function $T(t,e){return{...t.fileAccess==="read-only"?ks.claude.readOnly:t.fileAccess==="workspace-write"?ks.claude.workspaceWrite:ks.claude.fullAccess,additionalDirectories:t.fileAccess==="full"?void 0:e}}function DT(t,e){let n=t.fileAccess==="read-only"?ks.codex.readOnly:t.fileAccess==="workspace-write"?ks.codex.workspaceWrite:ks.codex.fullAccess;return{approvalPolicy:ks.codex.approvalPolicy,...n,additionalDirectories:e}}});var Zs=T(On=>{"use strict";var LT=On&&On.__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]})),MT=On&&On.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),GT=On&&On.__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"&<(n,e,r[s]);return MT(n,e),n}})();Object.defineProperty(On,"__esModule",{value:!0});On.parseYaml=fu;On.stringifyYaml=kg;On.updateManifestName=HT;On.loadAgentManifest=jT;On.parseAgentManifest=$g;var du=require("fs"),Cg=GT(require("path")),UT=Ye();function fu(t){return require("js-yaml").load(t)}function kg(t){return require("js-yaml").dump(t,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}async function HT(t,e){let n=await du.promises.readFile(t,"utf8"),r=fu(n);r&&typeof r=="object"&&r.metadata&&(r.metadata.name=e);let s=kg(r);await du.promises.writeFile(t,s,"utf8")}async function jT(t){let e=await du.promises.readFile(t,"utf8");return $g(e,t)}function $g(t,e){let n=fu(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 xT(n,r),n}function xT(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(Cg.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=Cg.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",`${UT.AGENTIDE_DIR_NAME}/data/${t.metadata.name}`)}});var hu=T(St=>{"use strict";var BT=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]})),FT=St&&St.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),VT=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"&&BT(n,e,r[s]);return FT(n,e),n}})();Object.defineProperty(St,"__esModule",{value:!0});St.listUserLibraryAgents=qT;St.isWorkspaceAgentAvailable=YT;St.isAgentInUserLibrary=JT;St.hydrateFromUserLibrary=Lg;St.promoteToUserLibrary=XT;St.readAgentSource=Mg;St.checkForUpdate=zT;St.updateFromUserLibrary=QT;St.duplicateAgent=ev;St.resetDefaultAgent=tv;var Je=require("fs"),Ve=VT(require("path")),ne=Zt(),ae=jn(),Ci=Zs(),Dg=Ye();function WT(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 KT(t){return[...t].sort(WT)}async function pu(t,e){await Je.promises.mkdir(e,{recursive:!0});let n=await Je.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=Ve.join(t,r.name),i=Ve.join(e,r.name);if(r.isDirectory()){if(r.name.startsWith("."))continue;await pu(s,i)}else await Je.promises.copyFile(s,i)}}async function qT(){let t=(0,ae.getUserAgentsDir)();if(!await(0,ne.pathExists)(t))return[];let e=await Je.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=r.name,i=(0,ae.getUserAgentRoot)(s),o=await gu(i);if(o.length===0)continue;let a=await Fa(s),c=a||o[o.length-1],l=(0,ae.getUserAgentVersionDir)(s,c),f=Ve.join(l,ae.AGENT_CONSTANTS.MANIFEST_FILE),u,d;try{let p=await(0,Ci.loadAgentManifest)(f);u=p.metadata.description,d=p.spec.engine}catch{}n.push({id:s,versions:o,currentVersion:a,description:u,preferredEngine:d})}return n}async function gu(t){try{let e=await Je.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=Ve.join(t,r.name,ae.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ne.pathExists)(s))try{await(0,Ci.loadAgentManifest)(s),n.push(r.name)}catch{}}return KT(n)}catch{return[]}}async function Fa(t){let e=(0,ae.getUserAgentCurrentPath)(t);try{let n=(await Je.promises.readFile(e,"utf8")).trim();if(!n)return;let r=(0,ae.getUserAgentVersionDir)(t,n),s=Ve.join(r,ae.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,ne.pathExists)(s))return;try{return await(0,Ci.loadAgentManifest)(s),n}catch{return}}catch{}}async function YT(t,e){let n=(0,ae.getAgentManifestPath)(t,e);if(!await(0,ne.pathExists)(n))return!1;try{return(await(0,Ci.loadAgentManifest)(n)).metadata.name===e}catch{return!1}}async function JT(t){if(await Fa(t))return!0;let n=(0,ae.getUserAgentRoot)(t);return(await gu(n)).length>0}async function Lg(t,e,n,r){let s=n,i=n??"current";if(!s&&(s=await Fa(e),!s)){let d=(0,ae.getUserAgentRoot)(e),p=await gu(d);if(p.length===0){(0,ne.logInfo)(r,`[AgentStores] Agent not in User Library: ${e}`);return}s=p[p.length-1],i=s}let o=(0,ae.getUserAgentVersionDir)(e,s);if(!await(0,ne.pathExists)(o)){(0,ne.logInfo)(r,`[AgentStores] Version not found in User Library: ${e}@${s}`);return}let a=(0,ae.getAgentRoot)(t,e);(0,ne.logInfo)(r,`[AgentStores] Hydrating ${e}@${s} from User Library`),await(0,ne.pathExists)(a)&&((0,ne.logInfo)(r,`[AgentStores] Clearing existing directory: ${a}`),await Je.promises.rm(a,{recursive:!0,force:!0})),await(0,ne.copyDirRecursive)(o,a);let c=Ve.join(a,ae.AGENT_CONSTANTS.MANIFEST_FILE),{sha256:l}=await(0,ne.readFileSha256)(c),f={source:"user-library",agentId:e,version:s,resolvedFrom:i,sha256:l,hydratedAt:new Date().toISOString()},u=Ve.join(a,ae.AGENT_CONSTANTS.SOURCE_FILE);return await Je.promises.writeFile(u,JSON.stringify(f,null,2),"utf8"),(0,ne.logInfo)(r,`[AgentStores] Hydrated ${e}@${s} to ${a}`),s}async function XT(t,e,n){if(e===ae.AGENT_CONSTANTS.DEFAULT_AGENT_ID)throw new Error("Cannot promote the default agent to User Library");let r=(0,ae.getAgentRoot)(t,e),s=(0,ae.getAgentManifestPath)(t,e);if(!await(0,ne.pathExists)(s))throw new Error(`Agent not found: ${e}`);let o=(await(0,Ci.loadAgentManifest)(s)).metadata.version,a=(0,ae.getUserAgentVersionDir)(e,o),c=Ve.join(a,ae.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ne.pathExists)(c)){let f=await(0,ne.readFileSha256)(s),u=await(0,ne.readFileSha256)(c);if(f.sha256===u.sha256)return(0,ne.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,ne.logInfo)(n,`[AgentStores] Promoting ${e}@${o} to User Library`),await Je.promises.mkdir(a,{recursive:!0}),await pu(r,a);let l=(0,ae.getUserAgentCurrentPath)(e);return await Je.promises.writeFile(l,o,"utf8"),(0,ne.logInfo)(n,`[AgentStores] Promoted ${e}@${o} to ${a}`),o}async function Mg(t,e){let n=Ve.join((0,ae.getAgentRoot)(t,e),ae.AGENT_CONSTANTS.SOURCE_FILE);try{let r=await Je.promises.readFile(n,"utf8");return JSON.parse(r)}catch{return}}async function zT(t,e){let n=await Mg(t,e);if(!n||n.source!=="user-library")return;let r=await Fa(e);if(r&&r!==n.version)return r}async function QT(t,e,n,r){let s=(0,ae.getAgentRoot)(t,e),i=new Date().toISOString().replace(/[:.]/g,"-"),o=Ve.join(Ve.dirname(s),`.${e}.backup-${i}`);await(0,ne.pathExists)(s)&&((0,ne.logInfo)(r,`[AgentStores] Backing up ${e} to ${o}`),await(0,ne.copyDirRecursive)(s,o),await Je.promises.rm(s,{recursive:!0,force:!0}));let a=await Lg(t,e,n,r);if(!a)throw await(0,ne.pathExists)(o)&&((0,ne.logInfo)(r,"[AgentStores] Restoring backup after failed update"),await(0,ne.copyDirRecursive)(o,s)),new Error(`Failed to update ${e} from User Library`);return(0,ne.logInfo)(r,`[AgentStores] Updated ${e} to ${a}`),a}async function ZT(t,e){let n=`${e}-copy`;if(!await(0,ne.pathExists)((0,ae.getAgentRoot)(t,n)))return n;for(let r=2;r<100;r++){let s=`${e}-${r}`;if(!await(0,ne.pathExists)((0,ae.getAgentRoot)(t,s)))return s}return`${e}-${Date.now()}`}async function ev(t,e,n){let r=(0,ae.getAgentRoot)(t,e),s=(0,ae.getAgentManifestPath)(t,e);if(!await(0,ne.pathExists)(s))throw new Error(`Agent not found: ${e}`);let i=await ZT(t,e),o=(0,ae.getAgentRoot)(t,i);(0,ne.logInfo)(n,`[AgentStores] Duplicating ${e} to ${i}`),await pu(r,o);let a=(0,ae.getAgentManifestPath)(t,i);await(0,Ci.updateManifestName)(a,i);let c=Ve.join(o,ae.AGENT_CONSTANTS.SOURCE_FILE);try{await Je.promises.rm(c,{force:!0})}catch{}return(0,ne.logInfo)(n,`[AgentStores] Duplicated ${e} to ${i}`),i}async function tv(t,e,n){let r=(0,ae.getAgentRoot)(t,ae.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=new Date().toISOString().replace(/[:.]/g,"-"),i=Ve.join(Ve.dirname(r),`.default.backup-${s}`);if(await(0,ne.pathExists)(r)&&((0,ne.logInfo)(n,`[AgentStores] Backing up default agent to ${i}`),await(0,ne.copyDirRecursive)(r,i),await Je.promises.rm(r,{recursive:!0,force:!0})),await Je.promises.mkdir(r,{recursive:!0}),await Je.promises.mkdir(Ve.join(r,ae.AGENT_CONSTANTS.RULES_DIR),{recursive:!0}),await Je.promises.mkdir(Ve.join(r,ae.AGENT_CONSTANTS.SKILLS_DIR),{recursive:!0}),e){let c=Ve.join(e,"rules","AGENTS.md"),l=Ve.join(r,ae.AGENT_CONSTANTS.AGENTS_MD);if(await(0,ne.pathExists)(c)){let p=await Je.promises.readFile(c,"utf8");await Je.promises.writeFile(l,(0,Dg.applyBrandingTokens)(p),"utf8"),(0,ne.logInfo)(n,"[AgentStores] Restored AGENTS.md from bundled templates")}let f=Ve.join(e,ae.AGENT_CONSTANTS.GHOST_TEXT_FILE),u=Ve.join(r,ae.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,ne.pathExists)(f)&&!await(0,ne.pathExists)(u)){let p=await Je.promises.readFile(f,"utf8");await Je.promises.writeFile(u,p,"utf8"),(0,ne.logInfo)(n,"[AgentStores] Restored GHOST_TEXT.md from bundled templates")}let d=Ve.join(e,"skills");if(await(0,ne.pathExists)(d)){let p=await Je.promises.readdir(d,{withFileTypes:!0});for(let g of p){if(!g.isDirectory())continue;let m=Ve.join(d,g.name),h=Ve.join(r,ae.AGENT_CONSTANTS.SKILLS_DIR,g.name);await(0,ne.copyDirRecursiveWithTransform)(m,h,Dg.applyBrandingTokens),(0,ne.logInfo)(n,`[AgentStores] Restored skill: ${g.name}`)}}}let o=(0,ae.generateDefaultAgentYaml)({model:"claude"}),a=Ve.join(r,ae.AGENT_CONSTANTS.MANIFEST_FILE);await Je.promises.writeFile(a,o,"utf8"),(0,ne.logInfo)(n,"[AgentStores] Reset default agent complete")}});var Gg=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=jn(),manifest_1=Zs(),utils_1=Zt(),stores_1=hu(),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 f=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}`),f}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 mo=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(P=>setTimeout(P,500));let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:a});if(!c.ok){let P=await c.text();throw new Error(`Failed to get branch ref for ${n}: ${c.status} - ${P}`)}let f=(await c.json()).object.sha,u=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits/${f}`,{headers:a});if(!u.ok){let P=await u.text();throw new Error(`Failed to get commit ${f}: ${u.status} - ${P}`)}let p=(await u.json()).tree.sha,g=[];for(let P of r){let b=P.encoding??"utf-8",v=await fetch(`https://api.github.com/repos/${t}/${e}/git/blobs`,{method:"POST",headers:a,body:JSON.stringify({content:P.content,encoding:b})});if(!v.ok){let S=await v.text();throw new Error(`Failed to create blob for ${P.path}: ${v.status} - ${S}`)}let A=await v.json();g.push({path:P.path,mode:"100644",type:"blob",sha:A.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 m=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({base_tree:p,tree:g})});if(m.status===404&&(console.log("[AgentHippo] Retrying tree creation without base_tree..."),m=await fetch(`https://api.github.com/repos/${t}/${e}/git/trees`,{method:"POST",headers:a,body:JSON.stringify({tree:g})})),!m.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 m.json(),E=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits`,{method:"POST",headers:a,body:JSON.stringify({message:s,tree:h.sha,parents:[f]})});if(!E.ok)throw new Error(`Failed to create commit: ${E.status}`);let y=await E.json(),w=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{method:"PATCH",headers:a,body:JSON.stringify({sha:y.sha})});if(!w.ok)throw new Error(`Failed to update ref: ${w.status}`);return{sha:y.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}),f=l.ok?(await l.json()).sha:void 0,u=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:f})});if(!u.ok){let p=await u.text();throw new Error(`Failed to create file ${a.path}: ${u.status} - ${p}`)}o=(await u.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 Fg=T(Dr=>{"use strict";var nv=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]})),rv=Dr&&Dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sv=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"&&nv(n,e,r[s]);return rv(n,e),n}})();Object.defineProperty(Dr,"__esModule",{value:!0});Dr.validateForPublish=xg;Dr.publishToGitHub=ov;var mu=require("fs"),Hg=sv(require("path")),fn=Zt(),jg=Zs(),Wa=jn(),ei=mo(),iv=[".","..",".git",".claude",".codex",".agentide","node_modules","*.log","current.txt"],Ug=1024*1024,Va=10*1024*1024;async function xg(t,e){let n=[],r=[],s=(0,Wa.getAgentRoot)(t,e);if(!await(0,fn.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 f=Hg.join(s,l);await(0,fn.pathExists)(f)||n.push(`Missing required file: ${l}`)}let o=(0,Wa.getAgentManifestPath)(t,e);if(await(0,fn.pathExists)(o))try{let l=await(0,jg.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 Bg(s),c=a.reduce((l,f)=>l+f.size,0);c>Va?n.push(`Bundle too large: ${ki(c)} (max ${ki(Va)})`):c>Va*.8&&r.push(`Bundle is ${ki(c)}, approaching limit of ${ki(Va)}`);for(let l of a)l.size>Ug&&n.push(`File too large: ${l.relativePath} (${ki(l.size)}, max ${ki(Ug)})`);return{valid:n.length===0,errors:n,warnings:r}}async function Bg(t){let e=[];async function n(r,s){let i;try{i=await mu.promises.readdir(r)}catch{return}for(let o of i){if(iv.some(f=>o===f||o.startsWith(".")))continue;let a=Hg.join(r,o),c=s?`${s}/${o}`:o,l=await mu.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 ov(t,e,n){let{agentId:r,visibility:s,changelog:i}=e;(0,fn.logInfo)(n,`[Publish] Starting publish for ${r}...`);let o=await xg(t,r);if(!o.valid)throw new Error(`Validation failed:
|
|
40
40
|
${o.errors.join(`
|
|
41
41
|
`)}`);o.warnings.length>0&&(0,fn.logInfo)(n,`[Publish] Warnings:
|
|
42
42
|
${o.warnings.join(`
|
|
43
|
-
`)}`);let a=(0,Wa.getAgentManifestPath)(t,r),c=await(0,jg.loadAgentManifest)(a),l=c.metadata.version,f=`v${l}`,u=await(0,ei.getGitHubUser)();(0,fn.logInfo)(n,`[Publish] Authenticated as ${u.login}`);let d=e.repoName||r,p=await(0,ei.getRepo)(u.login,d);if(p?(0,fn.logInfo)(n,`[Publish] Using existing repository: ${p.full_name}`):((0,fn.logInfo)(n,`[Publish] Creating new repository: ${u.login}/${d}`),p=await(0,ei.createRepo)(d,c.metadata.description||`AgentIDE pack: ${r}`,s==="private")),await(0,ei.getReleaseByTag)(u.login,d,f))throw new Error(`Version ${l} already published. Bump version in agent.yaml and try again.`);let m=(0,Wa.getAgentRoot)(t,r),h=await Bg(m);(0,fn.logInfo)(n,`[Publish] Pushing ${h.length} files to ${p.full_name}...`);for(let y of h){let w=await mu.promises.readFile(y.absolutePath,"utf-8"),P=await(0,ei.getFileContent)(u.login,d,y.relativePath);await(0,ei.putFileContent)(u.login,d,y.relativePath,w,`Publish ${r} v${l}`,P?.sha,p.default_branch),(0,fn.logInfo)(n,`[Publish] \u2713 ${y.relativePath}`)}(0,fn.logInfo)(n,`[Publish] Creating release ${f}...`);let E=await(0,ei.createRelease)(u.login,d,f,`${r} v${l}`,i||`Release ${l}`,p.default_branch);return(0,fn.logInfo)(n,`[Publish] OK Published ${r} v${l}`),(0,fn.logInfo)(n,`[Publish] Repo: ${p.html_url}`),(0,fn.logInfo)(n,`[Publish] Release: ${E.html_url}`),{owner:u.login,repo:d,version:l,repoUrl:p.html_url,releaseUrl:E.html_url}}function ki(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var qg=T(gr=>{"use strict";var av=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]})),cv=gr&&gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lv=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"&&av(n,e,r[s]);return cv(n,e),n}})();Object.defineProperty(gr,"__esModule",{value:!0});gr.downloadTarball=Wg;gr.installFromGitHub=gv;gr.checkGitHubUpdate=hv;var Ka=require("fs"),Vg=lv(require("path")),uv=require("zlib"),Ht=Zt(),qa=jn(),dv=Zs(),Ya=mo();async function Wg(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,Ht.logInfo)(r,"[Install] Requires authentication, signing in...");let c=await(0,Ya.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,uv.gunzipSync)(o);return fv(a)}function fv(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 pv(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 gv(t,e,n){let{source:r,force:s=!1}=e;(0,Ht.logInfo)(n,`[Install] Installing from ${r}...`);let i=(0,Ya.parseGitHubSource)(r);(0,Ht.logInfo)(n,`[Install] Repository: ${i.owner}/${i.repo}`);let o;if(i.version)o=i.version;else{(0,Ht.logInfo)(n,"[Install] Resolving latest version...");let d=await Kg(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,Ht.logInfo)(n,`[Install] Latest version: ${o}`)}let a=i.repo,c=(0,qa.getAgentRoot)(t,a);if(await(0,Ht.pathExists)(c)){if(!s)throw new Error(`Agent "${a}" already exists. Use force option to overwrite.`);(0,Ht.logInfo)(n,"[Install] Removing existing installation..."),await Ka.promises.rm(c,{recursive:!0,force:!0})}(0,Ht.logInfo)(n,`[Install] Downloading ${o}...`);let l=await Wg(i.owner,i.repo,o,n),f=pv(l);if((0,Ht.logInfo)(n,`[Install] Found ${f.size} files`),!f.has(qa.AGENT_CONSTANTS.MANIFEST_FILE))throw new Error(`Invalid agent pack: missing ${qa.AGENT_CONSTANTS.MANIFEST_FILE}. Ensure the repository contains a valid agent pack.`);await Ka.promises.mkdir(c,{recursive:!0});let u=0;for(let[d,p]of f){(0,Ht.logInfo)(n,`[Install] \u2193 ${d}`);let g=Vg.join(c,d);await Ka.promises.mkdir(Vg.dirname(g),{recursive:!0}),await Ka.promises.writeFile(g,p),u+=p.length}return(0,Ht.logInfo)(n,`[Install] OK Installed ${a} ${o}`),(0,Ht.logInfo)(n,`[Install] Location: ${c}`),(0,Ht.logInfo)(n,`[Install] Downloaded: ${mv(u)}`),{agentId:a,version:o,source:`github://${i.owner}/${i.repo}@${o}`,installed:!0}}async function Kg(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,Ht.logInfo)(n,"[Install] Requires authentication...");let o=await(0,Ya.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 hv(t,e,n,r){try{let s=(0,qa.getAgentManifestPath)(t,e);if(!await(0,Ht.pathExists)(s))return{hasUpdate:!1};let o=(await(0,dv.loadAgentManifest)(s)).metadata.version,a=(0,Ya.parseGitHubSource)(n),c=await Kg(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,Ht.logInfo)(r,`[Install] Update check failed: ${s}`),{hasUpdate:!1}}}function mv(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var Eu=T(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.checkGitHubUpdate=R.installFromGitHub=R.validateForPublish=R.publishToGitHub=R.getGitHubUser=R.isGitHubAuthenticated=R.getGitHubToken=R.formatGitHubSource=R.parseGitHubSource=R.resetDefaultAgent=R.duplicateAgent=R.updateFromUserLibrary=R.checkForUpdate=R.readAgentSource=R.promoteToUserLibrary=R.hydrateFromUserLibrary=R.isAgentInUserLibrary=R.isWorkspaceAgentAvailable=R.listUserLibraryAgents=R.updateManifestName=R.parseAgentManifest=R.loadAgentManifest=R.stringifyYaml=R.parseYaml=R.AgentPackManager=R.getUserAgentCurrentPath=R.getUserAgentVersionDir=R.getUserAgentRoot=R.getUserAgentsDir=R.getAgentideHome=R.parseAgentIdFromPath=R.getSessionsDir=R.getAgentMcpDir=R.getAgentRulesDir=R.getAgentSkillsDir=R.getAgentContextPath=R.getAgentAgentsMdPath=R.getAgentManifestPath=R.isDefaultAgent=R.engineHomeUserKey=R.userScopedEngineHomeFromKey=R.userScopedEngineHome=R.resolveRuntimePaths=R.resolveAgentRuntimePaths=R.getAgentRoot=R.getAgentsDir=R.getAgentideDir=R.AGENT_CONSTANTS=void 0;var Je=jn();Object.defineProperty(R,"AGENT_CONSTANTS",{enumerable:!0,get:function(){return Je.AGENT_CONSTANTS}});Object.defineProperty(R,"getAgentideDir",{enumerable:!0,get:function(){return Je.getAgentideDir}});Object.defineProperty(R,"getAgentsDir",{enumerable:!0,get:function(){return Je.getAgentsDir}});Object.defineProperty(R,"getAgentRoot",{enumerable:!0,get:function(){return Je.getAgentRoot}});Object.defineProperty(R,"resolveAgentRuntimePaths",{enumerable:!0,get:function(){return Je.resolveAgentRuntimePaths}});Object.defineProperty(R,"resolveRuntimePaths",{enumerable:!0,get:function(){return Je.resolveRuntimePaths}});Object.defineProperty(R,"userScopedEngineHome",{enumerable:!0,get:function(){return Je.userScopedEngineHome}});Object.defineProperty(R,"userScopedEngineHomeFromKey",{enumerable:!0,get:function(){return Je.userScopedEngineHomeFromKey}});Object.defineProperty(R,"engineHomeUserKey",{enumerable:!0,get:function(){return Je.engineHomeUserKey}});Object.defineProperty(R,"isDefaultAgent",{enumerable:!0,get:function(){return Je.isDefaultAgent}});Object.defineProperty(R,"getAgentManifestPath",{enumerable:!0,get:function(){return Je.getAgentManifestPath}});Object.defineProperty(R,"getAgentAgentsMdPath",{enumerable:!0,get:function(){return Je.getAgentAgentsMdPath}});Object.defineProperty(R,"getAgentContextPath",{enumerable:!0,get:function(){return Je.getAgentContextPath}});Object.defineProperty(R,"getAgentSkillsDir",{enumerable:!0,get:function(){return Je.getAgentSkillsDir}});Object.defineProperty(R,"getAgentRulesDir",{enumerable:!0,get:function(){return Je.getAgentRulesDir}});Object.defineProperty(R,"getAgentMcpDir",{enumerable:!0,get:function(){return Je.getAgentMcpDir}});Object.defineProperty(R,"getSessionsDir",{enumerable:!0,get:function(){return Je.getSessionsDir}});Object.defineProperty(R,"parseAgentIdFromPath",{enumerable:!0,get:function(){return Je.parseAgentIdFromPath}});Object.defineProperty(R,"getAgentideHome",{enumerable:!0,get:function(){return Je.getAgentideHome}});Object.defineProperty(R,"getUserAgentsDir",{enumerable:!0,get:function(){return Je.getUserAgentsDir}});Object.defineProperty(R,"getUserAgentRoot",{enumerable:!0,get:function(){return Je.getUserAgentRoot}});Object.defineProperty(R,"getUserAgentVersionDir",{enumerable:!0,get:function(){return Je.getUserAgentVersionDir}});Object.defineProperty(R,"getUserAgentCurrentPath",{enumerable:!0,get:function(){return Je.getUserAgentCurrentPath}});var Ev=Gg();Object.defineProperty(R,"AgentPackManager",{enumerable:!0,get:function(){return Ev.AgentPackManager}});var Eo=Zs();Object.defineProperty(R,"parseYaml",{enumerable:!0,get:function(){return Eo.parseYaml}});Object.defineProperty(R,"stringifyYaml",{enumerable:!0,get:function(){return Eo.stringifyYaml}});Object.defineProperty(R,"loadAgentManifest",{enumerable:!0,get:function(){return Eo.loadAgentManifest}});Object.defineProperty(R,"parseAgentManifest",{enumerable:!0,get:function(){return Eo.parseAgentManifest}});Object.defineProperty(R,"updateManifestName",{enumerable:!0,get:function(){return Eo.updateManifestName}});var Lr=hu();Object.defineProperty(R,"listUserLibraryAgents",{enumerable:!0,get:function(){return Lr.listUserLibraryAgents}});Object.defineProperty(R,"isWorkspaceAgentAvailable",{enumerable:!0,get:function(){return Lr.isWorkspaceAgentAvailable}});Object.defineProperty(R,"isAgentInUserLibrary",{enumerable:!0,get:function(){return Lr.isAgentInUserLibrary}});Object.defineProperty(R,"hydrateFromUserLibrary",{enumerable:!0,get:function(){return Lr.hydrateFromUserLibrary}});Object.defineProperty(R,"promoteToUserLibrary",{enumerable:!0,get:function(){return Lr.promoteToUserLibrary}});Object.defineProperty(R,"readAgentSource",{enumerable:!0,get:function(){return Lr.readAgentSource}});Object.defineProperty(R,"checkForUpdate",{enumerable:!0,get:function(){return Lr.checkForUpdate}});Object.defineProperty(R,"updateFromUserLibrary",{enumerable:!0,get:function(){return Lr.updateFromUserLibrary}});Object.defineProperty(R,"duplicateAgent",{enumerable:!0,get:function(){return Lr.duplicateAgent}});Object.defineProperty(R,"resetDefaultAgent",{enumerable:!0,get:function(){return Lr.resetDefaultAgent}});var yo=mo();Object.defineProperty(R,"parseGitHubSource",{enumerable:!0,get:function(){return yo.parseGitHubSource}});Object.defineProperty(R,"formatGitHubSource",{enumerable:!0,get:function(){return yo.formatGitHubSource}});Object.defineProperty(R,"getGitHubToken",{enumerable:!0,get:function(){return yo.getGitHubToken}});Object.defineProperty(R,"isGitHubAuthenticated",{enumerable:!0,get:function(){return yo.isGitHubAuthenticated}});Object.defineProperty(R,"getGitHubUser",{enumerable:!0,get:function(){return yo.getGitHubUser}});var Yg=Fg();Object.defineProperty(R,"publishToGitHub",{enumerable:!0,get:function(){return Yg.publishToGitHub}});Object.defineProperty(R,"validateForPublish",{enumerable:!0,get:function(){return Yg.validateForPublish}});var Jg=qg();Object.defineProperty(R,"installFromGitHub",{enumerable:!0,get:function(){return Jg.installFromGitHub}});Object.defineProperty(R,"checkGitHubUpdate",{enumerable:!0,get:function(){return Jg.checkGitHubUpdate}})});var Ja=T(Nt=>{"use strict";var yv=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]})),_v=Nt&&Nt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wv=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"&&yv(n,e,r[s]);return _v(n,e),n}})();Object.defineProperty(Nt,"__esModule",{value:!0});Nt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV=Nt.GATEWAY_OUTBOUND_FILENAME=void 0;Nt.safeGatewaySessionDirId=yu;Nt.getGatewayOutboundFilePath=Xg;Nt.resolveGatewaySessionDirId=zg;Nt.resolveGatewayOutboundFilePath=bv;var Av=wv(require("path")),Sv=qe();Nt.GATEWAY_OUTBOUND_FILENAME="gateway-outbound.json";Nt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV="AGENTHIPPO_GATEWAY_OUTBOUND_FILE";function yu(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160).replace(/^\.+$/,n=>"_".repeat(n.length))||"session"}function Xg(t,e){return Av.join(t,Sv.AGENTIDE_DIR_NAME,"sessions",e,Nt.GATEWAY_OUTBOUND_FILENAME)}function zg(t){let e=t.chatSessionId?.trim();if(e)return yu(e);let n=t.gatewaySessionKey?.trim();if(n)return yu(n)}function bv(t){let e=zg(t);if(e)return Xg(t.workspaceRoot,e)}});var eh=T(en=>{"use strict";var Tv=en&&en.__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]})),vv=en&&en.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ov=en&&en.__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"&&Tv(n,e,r[s]);return vv(n,e),n}})();Object.defineProperty(en,"__esModule",{value:!0});en.isProcessRunning=Xa;en.isProcessRunningAsync=Pv;en.isPidFileProcessRunning=Nv;en.readPidFile=Qg;en.writePidFile=Rv;en.removePidFile=Zg;en.checkPidFileWithCleanup=Cv;var _o=require("fs"),Iv=Ov(require("path"));function Xa(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function Pv(t){return Xa(t)}async function Nv(t){try{let e=await _o.promises.readFile(t,"utf8").catch(()=>null);if(!e)return!1;let n=parseInt(e.trim().split(`
|
|
43
|
+
`)}`);let a=(0,Wa.getAgentManifestPath)(t,r),c=await(0,jg.loadAgentManifest)(a),l=c.metadata.version,f=`v${l}`,u=await(0,ei.getGitHubUser)();(0,fn.logInfo)(n,`[Publish] Authenticated as ${u.login}`);let d=e.repoName||r,p=await(0,ei.getRepo)(u.login,d);if(p?(0,fn.logInfo)(n,`[Publish] Using existing repository: ${p.full_name}`):((0,fn.logInfo)(n,`[Publish] Creating new repository: ${u.login}/${d}`),p=await(0,ei.createRepo)(d,c.metadata.description||`AgentIDE pack: ${r}`,s==="private")),await(0,ei.getReleaseByTag)(u.login,d,f))throw new Error(`Version ${l} already published. Bump version in agent.yaml and try again.`);let m=(0,Wa.getAgentRoot)(t,r),h=await Bg(m);(0,fn.logInfo)(n,`[Publish] Pushing ${h.length} files to ${p.full_name}...`);for(let y of h){let w=await mu.promises.readFile(y.absolutePath,"utf-8"),P=await(0,ei.getFileContent)(u.login,d,y.relativePath);await(0,ei.putFileContent)(u.login,d,y.relativePath,w,`Publish ${r} v${l}`,P?.sha,p.default_branch),(0,fn.logInfo)(n,`[Publish] \u2713 ${y.relativePath}`)}(0,fn.logInfo)(n,`[Publish] Creating release ${f}...`);let E=await(0,ei.createRelease)(u.login,d,f,`${r} v${l}`,i||`Release ${l}`,p.default_branch);return(0,fn.logInfo)(n,`[Publish] OK Published ${r} v${l}`),(0,fn.logInfo)(n,`[Publish] Repo: ${p.html_url}`),(0,fn.logInfo)(n,`[Publish] Release: ${E.html_url}`),{owner:u.login,repo:d,version:l,repoUrl:p.html_url,releaseUrl:E.html_url}}function ki(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var qg=T(gr=>{"use strict";var av=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]})),cv=gr&&gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lv=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"&&av(n,e,r[s]);return cv(n,e),n}})();Object.defineProperty(gr,"__esModule",{value:!0});gr.downloadTarball=Wg;gr.installFromGitHub=gv;gr.checkGitHubUpdate=hv;var Ka=require("fs"),Vg=lv(require("path")),uv=require("zlib"),Ht=Zt(),qa=jn(),dv=Zs(),Ya=mo();async function Wg(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,Ht.logInfo)(r,"[Install] Requires authentication, signing in...");let c=await(0,Ya.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,uv.gunzipSync)(o);return fv(a)}function fv(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 pv(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 gv(t,e,n){let{source:r,force:s=!1}=e;(0,Ht.logInfo)(n,`[Install] Installing from ${r}...`);let i=(0,Ya.parseGitHubSource)(r);(0,Ht.logInfo)(n,`[Install] Repository: ${i.owner}/${i.repo}`);let o;if(i.version)o=i.version;else{(0,Ht.logInfo)(n,"[Install] Resolving latest version...");let d=await Kg(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,Ht.logInfo)(n,`[Install] Latest version: ${o}`)}let a=i.repo,c=(0,qa.getAgentRoot)(t,a);if(await(0,Ht.pathExists)(c)){if(!s)throw new Error(`Agent "${a}" already exists. Use force option to overwrite.`);(0,Ht.logInfo)(n,"[Install] Removing existing installation..."),await Ka.promises.rm(c,{recursive:!0,force:!0})}(0,Ht.logInfo)(n,`[Install] Downloading ${o}...`);let l=await Wg(i.owner,i.repo,o,n),f=pv(l);if((0,Ht.logInfo)(n,`[Install] Found ${f.size} files`),!f.has(qa.AGENT_CONSTANTS.MANIFEST_FILE))throw new Error(`Invalid agent pack: missing ${qa.AGENT_CONSTANTS.MANIFEST_FILE}. Ensure the repository contains a valid agent pack.`);await Ka.promises.mkdir(c,{recursive:!0});let u=0;for(let[d,p]of f){(0,Ht.logInfo)(n,`[Install] \u2193 ${d}`);let g=Vg.join(c,d);await Ka.promises.mkdir(Vg.dirname(g),{recursive:!0}),await Ka.promises.writeFile(g,p),u+=p.length}return(0,Ht.logInfo)(n,`[Install] OK Installed ${a} ${o}`),(0,Ht.logInfo)(n,`[Install] Location: ${c}`),(0,Ht.logInfo)(n,`[Install] Downloaded: ${mv(u)}`),{agentId:a,version:o,source:`github://${i.owner}/${i.repo}@${o}`,installed:!0}}async function Kg(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,Ht.logInfo)(n,"[Install] Requires authentication...");let o=await(0,Ya.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 hv(t,e,n,r){try{let s=(0,qa.getAgentManifestPath)(t,e);if(!await(0,Ht.pathExists)(s))return{hasUpdate:!1};let o=(await(0,dv.loadAgentManifest)(s)).metadata.version,a=(0,Ya.parseGitHubSource)(n),c=await Kg(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,Ht.logInfo)(r,`[Install] Update check failed: ${s}`),{hasUpdate:!1}}}function mv(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var Eu=T(C=>{"use strict";Object.defineProperty(C,"__esModule",{value:!0});C.checkGitHubUpdate=C.installFromGitHub=C.validateForPublish=C.publishToGitHub=C.getGitHubUser=C.isGitHubAuthenticated=C.getGitHubToken=C.formatGitHubSource=C.parseGitHubSource=C.resetDefaultAgent=C.duplicateAgent=C.updateFromUserLibrary=C.checkForUpdate=C.readAgentSource=C.promoteToUserLibrary=C.hydrateFromUserLibrary=C.isAgentInUserLibrary=C.isWorkspaceAgentAvailable=C.listUserLibraryAgents=C.updateManifestName=C.parseAgentManifest=C.loadAgentManifest=C.stringifyYaml=C.parseYaml=C.AgentPackManager=C.getUserAgentCurrentPath=C.getUserAgentVersionDir=C.getUserAgentRoot=C.getUserAgentsDir=C.getAgentideHome=C.parseAgentIdFromPath=C.getSessionsDir=C.getAgentMcpDir=C.getAgentRulesDir=C.getAgentSkillsDir=C.getAgentContextPath=C.getAgentAgentsMdPath=C.getAgentManifestPath=C.isDefaultAgent=C.engineHomeUserKey=C.userScopedEngineHomeFromKey=C.userScopedEngineHome=C.resolveRuntimePaths=C.resolveAgentRuntimePaths=C.getAgentRoot=C.getAgentsDir=C.getAgentideDir=C.AGENT_CONSTANTS=void 0;var Xe=jn();Object.defineProperty(C,"AGENT_CONSTANTS",{enumerable:!0,get:function(){return Xe.AGENT_CONSTANTS}});Object.defineProperty(C,"getAgentideDir",{enumerable:!0,get:function(){return Xe.getAgentideDir}});Object.defineProperty(C,"getAgentsDir",{enumerable:!0,get:function(){return Xe.getAgentsDir}});Object.defineProperty(C,"getAgentRoot",{enumerable:!0,get:function(){return Xe.getAgentRoot}});Object.defineProperty(C,"resolveAgentRuntimePaths",{enumerable:!0,get:function(){return Xe.resolveAgentRuntimePaths}});Object.defineProperty(C,"resolveRuntimePaths",{enumerable:!0,get:function(){return Xe.resolveRuntimePaths}});Object.defineProperty(C,"userScopedEngineHome",{enumerable:!0,get:function(){return Xe.userScopedEngineHome}});Object.defineProperty(C,"userScopedEngineHomeFromKey",{enumerable:!0,get:function(){return Xe.userScopedEngineHomeFromKey}});Object.defineProperty(C,"engineHomeUserKey",{enumerable:!0,get:function(){return Xe.engineHomeUserKey}});Object.defineProperty(C,"isDefaultAgent",{enumerable:!0,get:function(){return Xe.isDefaultAgent}});Object.defineProperty(C,"getAgentManifestPath",{enumerable:!0,get:function(){return Xe.getAgentManifestPath}});Object.defineProperty(C,"getAgentAgentsMdPath",{enumerable:!0,get:function(){return Xe.getAgentAgentsMdPath}});Object.defineProperty(C,"getAgentContextPath",{enumerable:!0,get:function(){return Xe.getAgentContextPath}});Object.defineProperty(C,"getAgentSkillsDir",{enumerable:!0,get:function(){return Xe.getAgentSkillsDir}});Object.defineProperty(C,"getAgentRulesDir",{enumerable:!0,get:function(){return Xe.getAgentRulesDir}});Object.defineProperty(C,"getAgentMcpDir",{enumerable:!0,get:function(){return Xe.getAgentMcpDir}});Object.defineProperty(C,"getSessionsDir",{enumerable:!0,get:function(){return Xe.getSessionsDir}});Object.defineProperty(C,"parseAgentIdFromPath",{enumerable:!0,get:function(){return Xe.parseAgentIdFromPath}});Object.defineProperty(C,"getAgentideHome",{enumerable:!0,get:function(){return Xe.getAgentideHome}});Object.defineProperty(C,"getUserAgentsDir",{enumerable:!0,get:function(){return Xe.getUserAgentsDir}});Object.defineProperty(C,"getUserAgentRoot",{enumerable:!0,get:function(){return Xe.getUserAgentRoot}});Object.defineProperty(C,"getUserAgentVersionDir",{enumerable:!0,get:function(){return Xe.getUserAgentVersionDir}});Object.defineProperty(C,"getUserAgentCurrentPath",{enumerable:!0,get:function(){return Xe.getUserAgentCurrentPath}});var Ev=Gg();Object.defineProperty(C,"AgentPackManager",{enumerable:!0,get:function(){return Ev.AgentPackManager}});var Eo=Zs();Object.defineProperty(C,"parseYaml",{enumerable:!0,get:function(){return Eo.parseYaml}});Object.defineProperty(C,"stringifyYaml",{enumerable:!0,get:function(){return Eo.stringifyYaml}});Object.defineProperty(C,"loadAgentManifest",{enumerable:!0,get:function(){return Eo.loadAgentManifest}});Object.defineProperty(C,"parseAgentManifest",{enumerable:!0,get:function(){return Eo.parseAgentManifest}});Object.defineProperty(C,"updateManifestName",{enumerable:!0,get:function(){return Eo.updateManifestName}});var Lr=hu();Object.defineProperty(C,"listUserLibraryAgents",{enumerable:!0,get:function(){return Lr.listUserLibraryAgents}});Object.defineProperty(C,"isWorkspaceAgentAvailable",{enumerable:!0,get:function(){return Lr.isWorkspaceAgentAvailable}});Object.defineProperty(C,"isAgentInUserLibrary",{enumerable:!0,get:function(){return Lr.isAgentInUserLibrary}});Object.defineProperty(C,"hydrateFromUserLibrary",{enumerable:!0,get:function(){return Lr.hydrateFromUserLibrary}});Object.defineProperty(C,"promoteToUserLibrary",{enumerable:!0,get:function(){return Lr.promoteToUserLibrary}});Object.defineProperty(C,"readAgentSource",{enumerable:!0,get:function(){return Lr.readAgentSource}});Object.defineProperty(C,"checkForUpdate",{enumerable:!0,get:function(){return Lr.checkForUpdate}});Object.defineProperty(C,"updateFromUserLibrary",{enumerable:!0,get:function(){return Lr.updateFromUserLibrary}});Object.defineProperty(C,"duplicateAgent",{enumerable:!0,get:function(){return Lr.duplicateAgent}});Object.defineProperty(C,"resetDefaultAgent",{enumerable:!0,get:function(){return Lr.resetDefaultAgent}});var yo=mo();Object.defineProperty(C,"parseGitHubSource",{enumerable:!0,get:function(){return yo.parseGitHubSource}});Object.defineProperty(C,"formatGitHubSource",{enumerable:!0,get:function(){return yo.formatGitHubSource}});Object.defineProperty(C,"getGitHubToken",{enumerable:!0,get:function(){return yo.getGitHubToken}});Object.defineProperty(C,"isGitHubAuthenticated",{enumerable:!0,get:function(){return yo.isGitHubAuthenticated}});Object.defineProperty(C,"getGitHubUser",{enumerable:!0,get:function(){return yo.getGitHubUser}});var Yg=Fg();Object.defineProperty(C,"publishToGitHub",{enumerable:!0,get:function(){return Yg.publishToGitHub}});Object.defineProperty(C,"validateForPublish",{enumerable:!0,get:function(){return Yg.validateForPublish}});var Jg=qg();Object.defineProperty(C,"installFromGitHub",{enumerable:!0,get:function(){return Jg.installFromGitHub}});Object.defineProperty(C,"checkGitHubUpdate",{enumerable:!0,get:function(){return Jg.checkGitHubUpdate}})});var Ja=T(Nt=>{"use strict";var yv=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]})),_v=Nt&&Nt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wv=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"&&yv(n,e,r[s]);return _v(n,e),n}})();Object.defineProperty(Nt,"__esModule",{value:!0});Nt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV=Nt.GATEWAY_OUTBOUND_FILENAME=void 0;Nt.safeGatewaySessionDirId=yu;Nt.getGatewayOutboundFilePath=Xg;Nt.resolveGatewaySessionDirId=zg;Nt.resolveGatewayOutboundFilePath=bv;var Av=wv(require("path")),Sv=Ye();Nt.GATEWAY_OUTBOUND_FILENAME="gateway-outbound.json";Nt.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV="AGENTHIPPO_GATEWAY_OUTBOUND_FILE";function yu(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160).replace(/^\.+$/,n=>"_".repeat(n.length))||"session"}function Xg(t,e){return Av.join(t,Sv.AGENTIDE_DIR_NAME,"sessions",e,Nt.GATEWAY_OUTBOUND_FILENAME)}function zg(t){let e=t.chatSessionId?.trim();if(e)return yu(e);let n=t.gatewaySessionKey?.trim();if(n)return yu(n)}function bv(t){let e=zg(t);if(e)return Xg(t.workspaceRoot,e)}});var eh=T(en=>{"use strict";var Tv=en&&en.__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]})),vv=en&&en.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ov=en&&en.__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"&&Tv(n,e,r[s]);return vv(n,e),n}})();Object.defineProperty(en,"__esModule",{value:!0});en.isProcessRunning=Xa;en.isProcessRunningAsync=Pv;en.isPidFileProcessRunning=Nv;en.readPidFile=Qg;en.writePidFile=Rv;en.removePidFile=Zg;en.checkPidFileWithCleanup=Cv;var _o=require("fs"),Iv=Ov(require("path"));function Xa(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function Pv(t){return Xa(t)}async function Nv(t){try{let e=await _o.promises.readFile(t,"utf8").catch(()=>null);if(!e)return!1;let n=parseInt(e.trim().split(`
|
|
44
44
|
`)[0],10);return isNaN(n)?!1:Xa(n)}catch{return!1}}async function Qg(t){try{let n=(await _o.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 Rv(t,e,...n){try{let r=Iv.dirname(t);await _o.promises.mkdir(r,{recursive:!0});let s=[e,...n].join(`
|
|
46
46
|
`)+`
|
|
47
47
|
`;await _o.promises.writeFile(t,s,"utf8")}catch{}}async function Zg(t){try{await _o.promises.unlink(t)}catch{}}async function Cv(t){let e=await Qg(t);return e?Xa(e.pid)?e:(await Zg(t),null):null}});var th=T(cs=>{"use strict";var kv=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]})),$v=cs&&cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Dv=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"&&kv(n,e,r[s]);return $v(n,e),n}})();Object.defineProperty(cs,"__esModule",{value:!0});cs.probePort=Mv;var Lv=Dv(require("net"));function Mv(t,e="127.0.0.1",n=2e3){return new Promise(r=>{let s=new Lv.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 wu=T(Vn=>{"use strict";var Gv=Vn&&Vn.__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]})),Uv=Vn&&Vn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_u=Vn&&Vn.__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"&&Gv(n,e,r[s]);return Uv(n,e),n}})();Object.defineProperty(Vn,"__esModule",{value:!0});Vn.findBinary=nh;Vn.findBinaryCached=Wv;Vn.getCommonBinaryPaths=Kv;Vn.clearBinaryCache=qv;var Hv=require("child_process"),jv=require("util"),xv=require("fs"),za=_u(require("fs")),In=_u(require("path")),Bv=_u(require("os")),Fv=(0,jv.promisify)(Hv.exec),Qa=process.platform==="win32",Vv=6e4,Za=new Map;async function nh(t,e=5e3){try{let n=Qa?`where ${t}`:`which ${t}`,{stdout:r}=await Fv(n,{timeout:e});return r.trim().split(`
|
|
48
|
-
`)[0]||void 0}catch{return}}async function Wv(t,e=[],n=Vv){let r=Date.now(),s=Za.get(t);if(s&&r-s.timestamp<n)return s.path;let i=await nh(t);if(!i)for(let o of e)try{await xv.promises.access(o,Qa?za.constants.F_OK:za.constants.X_OK),i=o;break}catch{}return Za.set(t,{path:i,timestamp:r}),i}function Kv(t){let e=Bv.homedir(),n=Qa?`${t}.cmd`:t;if(Qa){let o=process.env.LOCALAPPDATA||In.join(e,"AppData","Local");return[In.join(o,"AgentHippo","bin",n),In.join(e,"AppData","Local","Programs",t,`${t}.exe`),In.join(e,"AppData","Roaming","npm",n),In.join(e,"AppData","Local","pnpm",n),In.join(e,".npm-global",n)]}let r=[In.join(e,".local","bin",t),In.join(e,"Library","pnpm",t),In.join(e,".local","share","pnpm",t),In.join(e,".npm-global","bin",t),"/opt/homebrew/bin/"+t,"/usr/local/bin/"+t,"/usr/bin/"+t],s=process.env.NVM_DIR||In.join(e,".nvm"),i=In.join(s,"versions","node");if(za.existsSync(i))try{let o=za.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort().reverse();for(let a of o)r.push(In.join(i,a,"bin",t))}catch{}return r}function qv(t){t?Za.delete(t):Za.clear()}});var ec=T(hr=>{"use strict";var Yv=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]})),Jv=hr&&hr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Au=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"&&Yv(n,e,r[s]);return Jv(n,e),n}})();Object.defineProperty(hr,"__esModule",{value:!0});hr.getNodeBinaryCandidates=lh;hr.resolveNodeBinary=eO;hr.prependPathDir=tO;var ti=Au(require("fs")),oh=Au(require("os")),$i=Au(require("path")),rh=wu(),ah=process.platform==="win32",Xv=ah?"node.exe":"node",sh=$i.join(oh.homedir(),".agenthippo","gateway","install.json"),ih=$i.join(oh.homedir(),".agenthippo","tools","node");function ch(t){try{let e=ah?ti.constants.F_OK:ti.constants.X_OK;return ti.accessSync(t,e),!0}catch{return!1}}function zv(){try{if(!ti.existsSync(sh))return;let t=ti.readFileSync(sh,"utf8").replace(/^\uFEFF/,""),n=JSON.parse(t).nodePath?.trim();return n&&ch(n)?n:void 0}catch{return}}function Qv(){if(!ti.existsSync(ih))return[];let t=[],e=(n,r)=>{if(r>4)return;let s;try{s=ti.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){let o=$i.join(n,i.name);i.isDirectory()?e(o,r+1):i.isFile()&&i.name===Xv&&n.endsWith(`${$i.sep}bin`)&&t.push(o)}};return e(ih,0),t.sort().reverse()}function Zv(t){let e=new Set,n=[];for(let r of t){let s=$i.resolve(r);e.has(s)||!ch(s)||(e.add(s),n.push(s))}return n}function lh(){let t=[];process.env.NODE_BIN?.trim()&&t.push(process.env.NODE_BIN.trim());let e=zv();return e&&t.push(e),t.push(...Qv()),process.env.npm_node_execpath?.trim()&&t.push(process.env.npm_node_execpath.trim()),Zv(t)}async function eO(){let t=lh();if(t.length>0)return t[0];let e=await(0,rh.findBinaryCached)("node",(0,rh.getCommonBinaryPaths)("node"));return e||"node"}function tO(t,e){if(!e?.trim())return;let n=e.trim(),r=t.PATH?.trim();t.PATH=r?`${n}${$i.delimiter}${r}`:n}});var Ao=T(ie=>{"use strict";Object.defineProperty(ie,"__esModule",{value:!0});ie.prependPathDir=ie.getNodeBinaryCandidates=ie.resolveNodeBinary=ie.clearBinaryCache=ie.getCommonBinaryPaths=ie.findBinaryCached=ie.findBinary=ie.probePort=ie.DIRS=ie.PID_FILES=ie.getAnalyticsScriptsDir=ie.getAgentidePath=ie.getAgentideHome=ie.checkPidFileWithCleanup=ie.removePidFile=ie.writePidFile=ie.readPidFile=ie.isPidFileProcessRunning=ie.isProcessRunningAsync=ie.isProcessRunning=void 0;var ni=eh();Object.defineProperty(ie,"isProcessRunning",{enumerable:!0,get:function(){return ni.isProcessRunning}});Object.defineProperty(ie,"isProcessRunningAsync",{enumerable:!0,get:function(){return ni.isProcessRunningAsync}});Object.defineProperty(ie,"isPidFileProcessRunning",{enumerable:!0,get:function(){return ni.isPidFileProcessRunning}});Object.defineProperty(ie,"readPidFile",{enumerable:!0,get:function(){return ni.readPidFile}});Object.defineProperty(ie,"writePidFile",{enumerable:!0,get:function(){return ni.writePidFile}});Object.defineProperty(ie,"removePidFile",{enumerable:!0,get:function(){return ni.removePidFile}});Object.defineProperty(ie,"checkPidFileWithCleanup",{enumerable:!0,get:function(){return ni.checkPidFileWithCleanup}});var wo=Js();Object.defineProperty(ie,"getAgentideHome",{enumerable:!0,get:function(){return wo.getAgentideHome}});Object.defineProperty(ie,"getAgentidePath",{enumerable:!0,get:function(){return wo.getAgentidePath}});Object.defineProperty(ie,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return wo.getAnalyticsScriptsDir}});Object.defineProperty(ie,"PID_FILES",{enumerable:!0,get:function(){return wo.PID_FILES}});Object.defineProperty(ie,"DIRS",{enumerable:!0,get:function(){return wo.DIRS}});var nO=th();Object.defineProperty(ie,"probePort",{enumerable:!0,get:function(){return nO.probePort}});var tc=wu();Object.defineProperty(ie,"findBinary",{enumerable:!0,get:function(){return tc.findBinary}});Object.defineProperty(ie,"findBinaryCached",{enumerable:!0,get:function(){return tc.findBinaryCached}});Object.defineProperty(ie,"getCommonBinaryPaths",{enumerable:!0,get:function(){return tc.getCommonBinaryPaths}});Object.defineProperty(ie,"clearBinaryCache",{enumerable:!0,get:function(){return tc.clearBinaryCache}});var Su=ec();Object.defineProperty(ie,"resolveNodeBinary",{enumerable:!0,get:function(){return Su.resolveNodeBinary}});Object.defineProperty(ie,"getNodeBinaryCandidates",{enumerable:!0,get:function(){return Su.getNodeBinaryCandidates}});Object.defineProperty(ie,"prependPathDir",{enumerable:!0,get:function(){return Su.prependPathDir}})});var Er=T(Ge=>{"use strict";var rO=Ge&&Ge.__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]})),sO=Ge&&Ge.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tu=Ge&&Ge.__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"&&rO(n,e,r[s]);return sO(n,e),n}})();Object.defineProperty(Ge,"__esModule",{value:!0});Ge.OPENCLAW_GATEWAY_TOKEN_ENV=Ge.AGENTHIPPO_CHAT_SESSION_ID_ENV=Ge.AGENTIDE_CHAT_SESSION_ID_ENV=void 0;Ge.readOpenClawGatewayToken=fh;Ge.getBundledToolsHealth=cO;Ge.getCliHealth=gO;Ge.buildSessionEnvPatch=_h;Ge.buildCliEnvPatch=hO;Ge.readProvenanceEnvFromProcess=mO;Ge.buildProvenanceEnv=EO;Ge.runCli=wh;var Mr=Tu(require("fs")),iO=Tu(require("os")),mr=Tu(require("path")),oO=require("child_process"),nc=qe(),uh=Ja(),bu=Ao();Ge.AGENTIDE_CHAT_SESSION_ID_ENV="AGENTIDE_CHAT_SESSION_ID";Ge.AGENTHIPPO_CHAT_SESSION_ID_ENV="AGENTHIPPO_CHAT_SESSION_ID";Ge.OPENCLAW_GATEWAY_TOKEN_ENV="OPENCLAW_GATEWAY_TOKEN";function fh(t){let e=t?.OPENCLAW_GATEWAY_TOKEN?.trim()||process.env.OPENCLAW_GATEWAY_TOKEN?.trim();if(e)return e;try{let n=mr.join(iO.homedir(),".openclaw","openclaw.json"),r=Mr.readFileSync(n,"utf-8"),i=JSON.parse(r).gateway?.auth?.token;return typeof i=="string"?i.trim():void 0}catch{return}}var ph=["rg","sg","tree-sitter"];function gh(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 hh(t){return process.platform!=="win32"?t:`${t}.exe`}function mh(t){for(let e of ph){let n=mr.join(t,hh(e));try{let r=process.platform==="win32"?Mr.constants.F_OK:Mr.constants.X_OK;return Mr.accessSync(n,r),!0}catch{}}return!1}function Eh(t,e){let n=gh();if(!n)return[];let r=[],s=process.env.AGENTHIPPO_TOOLS_DIR||process.env.AGENTIDE_TOOLS_DIR;return s?.trim()&&r.push(yh(s)),t?.trim()&&r.push(mr.join(t,"tools",n)),e?.trim()&&r.push(mr.join(e,"tools",n)),r}function aO(t,e){let n=Eh(t,e);for(let r of n)if(mh(r))return r}function cO(t={}){let e=gh(),n=Eh(t.extensionPath,t.binaryDirHint),r=n.find(o=>mh(o)),s=r??n[0],i=ph.map(o=>{let a=s??"",c=mr.join(a,hh(o)),l=!1;if(s)try{let f=process.platform==="win32"?Mr.constants.F_OK:Mr.constants.X_OK;Mr.accessSync(c,f),l=!0}catch{l=!1}return{name:o,path:c,available:l}});return{platformKey:e,toolsDir:r,tools:i}}function lO(t,e){let n=e.map(o=>o.trim()).filter(Boolean),r=t.split(mr.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(mr.delimiter)}function uO(t){return process.platform!=="win32"?"PATH":t&&Object.prototype.hasOwnProperty.call(t,"Path")?"Path":"PATH"}var dO=3e4,ri;async function dh(t){try{let e=process.platform==="win32"?Mr.constants.F_OK:Mr.constants.X_OK;return await Mr.promises.access(t,e),!0}catch{return!1}}function yh(t){return t.trim().replace(/^"|"$/g,"")}async function fO(t){let e=t.configuredPath?.trim();if(e){let r=yh(e);if(await dh(r))return{path:r,source:"setting"}}if(t.extensionPath){let r=[nc.AGENTIDE_CLI_NAME,"agentide"],s=process.platform==="win32"?[".cmd",".exe",".bat",""]:[""],i=[];for(let o of r)for(let a of s)i.push(mr.join(t.extensionPath,"dist",`${o}${a}`));for(let o of i)if(await dh(o))return{path:o,source:"bundled"}}t.forceRefresh&&(0,bu.clearBinaryCache)(nc.AGENTIDE_CLI_NAME);let n=await(0,bu.findBinaryCached)(nc.AGENTIDE_CLI_NAME,(0,bu.getCommonBinaryPaths)(nc.AGENTIDE_CLI_NAME));return n?{path:n,source:"path"}:{source:"not_found"}}async function pO(t){try{let e=await wh(t,["--version"],{timeoutMs:5e3});return e.code!==0?void 0:e.stdout.trim().split(/\r?\n/)[0]||void 0}catch{return}}async function gO(t={}){let e=Date.now();if(!t.forceRefresh&&ri&&e-ri.lastCheckedAt<dO)return ri;let n=await fO(t);if(!n.path)return ri={installed:!1,source:"not_found",lastCheckedAt:e,error:t.configuredPath?`Configured path not found: ${t.configuredPath}`:void 0},ri;let r=await pO(n.path);return ri={installed:!0,path:n.path,version:r,source:n.source,lastCheckedAt:e},ri}function _h(t){let e=t.chatSessionId?.trim(),n=t.gatewaySessionKey?.trim();if(!e&&!n)return{};let r={};e&&(r[Ge.AGENTIDE_CHAT_SESSION_ID_ENV]=e,r[Ge.AGENTHIPPO_CHAT_SESSION_ID_ENV]=e);let s=(0,uh.resolveGatewayOutboundFilePath)({workspaceRoot:t.workspaceRoot,gatewaySessionKey:n,chatSessionId:n?void 0:e});return s&&(r[uh.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV]=s),r}function hO(t){let e={AGENTHIPPO_WORKSPACE_ROOT:t.workspaceRoot,AGENTHIPPO_ACTIVE_AGENT:t.agentId,..._h({workspaceRoot:t.workspaceRoot,chatSessionId:t.chatSessionId})};if(!t.omitGatewayToken&&!process.env.AGENTHIPPO_EGRESS_URL?.trim()){let i=fh(t.baseEnv);i&&(e[Ge.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(mr.dirname(i.rgPath))}catch{}if(t.cliPath?.trim()){let i=t.cliPath.trim();e.AGENTHIPPO_CLI_PATH=i,n.push(mr.dirname(i))}let r=t.cliPath?.trim()?mr.dirname(t.cliPath.trim()):void 0,s=aO(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=uO(t.baseEnv),o=t.baseEnv?.[i]??t.baseEnv?.PATH??t.baseEnv?.Path??"";e[i]=lO(o,n)}return e}function mO(){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 EO(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 wh(t,e,n){return await new Promise((r,s)=>{let i=(0,oO.spawn)(t,e,{cwd:n?.cwd,env:{...process.env,...n?.env??{}},shell:!1}),o="",a="",c=!1,l=n?.timeoutMs??6e4,f=setTimeout(()=>{c||(i.kill(),s(new Error(`CLI command timed out after ${l}ms`)))},l);i.stdout.on("data",u=>{o+=u.toString()}),i.stderr.on("data",u=>{a+=u.toString()}),i.on("error",u=>{c||(c=!0,clearTimeout(f),s(u))}),i.on("close",u=>{c||(c=!0,clearTimeout(f),r({code:u??1,stdout:o,stderr:a}))})})}});var rc=T(Wn=>{"use strict";Object.defineProperty(Wn,"__esModule",{value:!0});Wn.RevocationUnsupportedError=Wn.SANDBOX_PROVIDER_KEY_ENV=Wn.SANDBOX_TIER_ENV=void 0;Wn.sandboxHoldsProviderKey=yO;Wn.isContainerSandbox=_O;Wn.SANDBOX_TIER_ENV="AGENTHIPPO_SANDBOX_TIER";Wn.SANDBOX_PROVIDER_KEY_ENV="AGENTHIPPO_SANDBOX_PROVIDER_KEY";function yO(t=process.env){return t[Wn.SANDBOX_PROVIDER_KEY_ENV]==="1"}function _O(t=process.env){return Number(t[Wn.SANDBOX_TIER_ENV])>=2}var vu=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"}};Wn.RevocationUnsupportedError=vu});var Gh=T(yr=>{"use strict";var wO=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]})),AO=yr&&yr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),SO=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"&&wO(n,e,r[s]);return AO(n,e),n}})();Object.defineProperty(yr,"__esModule",{value:!0});yr.CodexEngine=void 0;yr.registerNewFilesWithTracker=Mh;var Kn=require("fs"),pn=SO(require("path")),Ah=go(),bO=ru(),sc=Qs(),Qe=Zt(),Sh=uu(),Ou=zs(),si=Eu(),TO=Ns(),vO=Er(),bh=rc(),OO="agentide-litellm",IO="agentide-custom",Iu="AGENTIDE_ANALYTICS_SESSION_ID",Pu="AGENTIDE_ANALYTICS_USER_ID",Th="AGENTIDE_ANALYTICS_PROJECT_ID",vh="AGENTIDE_ANALYTICS_AGENT_ID",Oh="AGENTIDE_ANALYTICS_AGENT_VERSION",Ih="AGENTIDE_ANALYTICS_SOURCE",Ph="AGENTIDE_ANALYTICS_ENGINE",Nh="AGENTIDE_ANALYTICS_REQUEST_ID",Rh="AGENTIDE_ANALYTICS_POLICY_VERSION",Ch="AGENTIDE_ANALYTICS_PACK_DIGEST",kh="AGENTIDE_ANALYTICS_ENGINE_VERSION",$h="AGENTIDE_ANALYTICS_TIER",Dh="AGENTIDE_ANALYTICS_INSTANCE_ID",PO=21,NO="AGENTIDE_CONTEXT_EXPORT_PATH",RO="AGENTIDE_TERMINAL_LOG_PATH";async function Mh(t,e,n){if(e.appliesEdits!==!1)for(let r of t)try{if((0,Qe.isBinaryFile)(r)||!await(0,Qe.pathExists)(r))continue;let s=await Kn.promises.readFile(r,"utf-8");try{await Kn.promises.unlink(r),await e.applyEdit(n,r,s,!0)}finally{await(0,Qe.pathExists)(r)||await Kn.promises.writeFile(r,s,"utf-8")}}catch{}}function Lh(t){return t.type==="item.started"||t.type==="item.updated"||t.type==="item.completed"}var Nu=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,f=(0,Qe.resolveApiRouting)(n,this.config,"openai"),u=f.apiKey,d=f.openaiBaseUrl,p=f.useLiteLLM,g=n.sessionId,m=n.analyticsUserId,h=(0,sc.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),y=d&&d!=="https://api.openai.com/v1",w=p?"LiteLLM proxy":y?"custom provider":"direct OpenAI";o.info(`[AgentIDE] Codex routing: ${w}, baseUrl=${d||"default"}, workspaceRoot=${n.workspaceRoot}`);let P=l.toLowerCase().includes("claude");o.info(`[AgentIDE] Codex wire_api=responses (model=${l})`),P&&(p||y)&&o.info("[AgentIDE] Codex note: selected model appears to be Claude via proxy; reasoning summaries depend on provider support over the Responses API.");let v={...process.env,...s.cliEnvPatch??{},OPENAI_LOG:"debug"};delete v[vO.OPENCLAW_GATEWAY_TOKEN_ENV],delete v.AGENTHIPPO_DATA_PLANE_TOKEN;let A=g?.trim(),S=n.contextSessionId?.trim()||A;S&&(v[NO]=pn.join(n.workspaceRoot,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",S,"context.md"),v[RO]=pn.join(n.workspaceRoot,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",S,"terminal.md"));let I=n.agentPackId??"default",U=(0,si.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,I,n.agentPackVersion),O=(0,si.userScopedEngineHomeFromKey)(U.codexHome,(0,TO.resolveEngineHomeUserKey)(n.engineHomeUserKey));v.CODEX_HOME=O,await Kn.promises.mkdir(O,{recursive:!0}),v.AGENT_ID=I,n.agentPackVersion&&(v.AGENTIDE_AGENT_VERSION=n.agentPackVersion),I!=="default"?o.info(`[AgentIDE] Codex using agent: ${I}, CODEX_HOME=${O} (agent-isolated)`):o.info(`[AgentIDE] Codex using default agent, CODEX_HOME=${O}`);let F=y?d:void 0;await this.ensureCodexConfig(p,F,l,n.workspaceRoot,n.additionalDirectories??[],o,O,I,s.permissionHandler instanceof bO.AutoApprovePermissionHandler),p&&O&&(m?.trim()&&(v[Pu]=m.trim()),g?.trim()&&(v[Iu]=g.trim()),h?.trim()&&(v[Th]=h.trim()),v[vh]=I,v[Oh]=n.agentPackVersion??"workspace",v[Ih]="agenthippo",v[Ph]="codex",n.requestId&&(v[Nh]=n.requestId),n.policyVersion?.trim()&&(v[Rh]=n.policyVersion.trim()),n.packDigest?.trim()&&(v[Ch]=n.packDigest.trim()),n.engineVersion?.trim()&&(v[kh]=n.engineVersion.trim()),n.tier!==void 0&&(v[$h]=String(n.tier)),n.instanceId?.trim()&&(v[Dh]=n.instanceId.trim())),y&&u&&(v.CODEX_API_KEY=u),y&&(v.OPENAI_BASE_URL=d,o.info(`[AgentIDE] Using custom OpenAI base URL: ${d}`),(0,Qe.applyLocalTlsBypass)(v,d)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS (Codex)"));let re=(0,Ou.buildConversationKey)("codex",n);o.info(`[AgentIDE] Codex conversationKey=${re.key} (chatSessionId=${re.chatSessionId}, signature=${re.signatureHash}${re.isEphemeral?", ephemeral":""})`),await(0,Ou.withConversationLock)(re.key,async()=>{await r.progress("Thinking...");let W=n.permissions??Sh.DEFAULT_PERMISSIONS;o.info(`[AgentIDE] Codex permissions: fileAccess=${W.fileAccess}`);let pe=[n.workspaceRoot,...n.additionalDirectories??[]],me=(0,Sh.toCodexOptions)(W,pe);(0,bh.isContainerSandbox)()&&(me.sandboxMode="danger-full-access"),o.info(`[AgentIDE] Codex mapped: sandboxMode=${me.sandboxMode}, approvalPolicy=${me.approvalPolicy}`);let z=n.workspaceRoot,Pe={model:l,sandboxMode:me.sandboxMode,approvalPolicy:me.approvalPolicy,additionalDirectories:me.additionalDirectories,workingDirectory:z,skipGitRepoCheck:!0,modelReasoningEffort:"medium"};o.info(`[AgentIDE] Codex modelReasoningEffort=${Pe.modelReasoningEffort??"default"}`);let Ke=y?void 0:u,Me=new c({apiKey:Ke,env:v,...this.config.codexExecutablePath?{codexPathOverride:this.config.codexExecutablePath}:{}}),on=(0,sc.getPersistedSessionId)("codex",re.key),_e;if(on)try{_e=Me.resumeThread(on,Pe),o.info(`[AgentIDE] Codex resuming thread: ${on} (model: ${l})`)}catch(K){o.warn(`[AgentIDE] Failed to resume Codex thread (${on}): ${K instanceof Error?K.message:String(K)}. Starting new thread.`),_e=Me.startThread(Pe)}else _e=Me.startThread(Pe),o.info(`[AgentIDE] Codex starting new thread (model: ${l})`);if(i?.aborted){o.info("[AgentIDE] Codex stream cancelled before starting turn");return}let lr;try{({events:lr}=await _e.runStreamed(e,{signal:i}))}catch(K){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted while starting turn");return}throw K}let ut=new Map,Wt=new Map,_n=new Map,Gn=0,Et=0,It=0,Pt=!1,Ts=K=>K.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160);try{for await(let K of lr){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted; stopping event loop");return}let Gt=Lh(K)?K.item.type:void 0;if(o.debug(`[AgentIDE] Codex event: ${K.type}${Gt?` (item: ${Gt})`:""}`),K.type==="thread.started"){let Z=K.thread_id;o.info(`[AgentIDE] Codex thread started: ${Z}`),await(0,sc.persistSessionIfNeeded)("codex",re,Z,n);continue}if(K.type==="turn.failed")throw await r.error(K.error?.message||"Codex turn failed"),new Error(K.error?.message||"Codex turn failed");if(K.type==="error")throw await r.error(K.message||"Codex stream error"),new Error(K.message||"Codex stream error");if(K.type==="turn.completed"){o.info(`[AgentIDE] Codex usage: input=${K.usage.input_tokens}, cached=${K.usage.cached_input_tokens}, output=${K.usage.output_tokens}`);continue}if(Lh(K)){let{item:N}=K;if(N.type==="reasoning"){It++;let Z=N.text??"",x=(0,Qe.computeTextDelta)(N.id,N.text??"",ut);x?(Gn++,Et+=x.length,Gn<=3&&o.debug(`[AgentIDE] Codex reasoning delta #${Gn} (${x.length} chars): ${Ts(x)}`),await r.thinking(x)):!Pt&&Z.length===0&&(Pt=!0,o.debug("[AgentIDE] Codex reasoning item observed but text is empty so far."))}else if(N.type==="agent_message"){let Z=(0,Qe.computeTextDelta)(N.id,N.text??"",ut);Z&&await r.text(Z)}else if(N.type==="command_execution"){if(K.type==="item.started"&&(await r.thinking(`**Running command**
|
|
48
|
+
`)[0]||void 0}catch{return}}async function Wv(t,e=[],n=Vv){let r=Date.now(),s=Za.get(t);if(s&&r-s.timestamp<n)return s.path;let i=await nh(t);if(!i)for(let o of e)try{await xv.promises.access(o,Qa?za.constants.F_OK:za.constants.X_OK),i=o;break}catch{}return Za.set(t,{path:i,timestamp:r}),i}function Kv(t){let e=Bv.homedir(),n=Qa?`${t}.cmd`:t;if(Qa){let o=process.env.LOCALAPPDATA||In.join(e,"AppData","Local");return[In.join(o,"AgentHippo","bin",n),In.join(e,"AppData","Local","Programs",t,`${t}.exe`),In.join(e,"AppData","Roaming","npm",n),In.join(e,"AppData","Local","pnpm",n),In.join(e,".npm-global",n)]}let r=[In.join(e,".local","bin",t),In.join(e,"Library","pnpm",t),In.join(e,".local","share","pnpm",t),In.join(e,".npm-global","bin",t),"/opt/homebrew/bin/"+t,"/usr/local/bin/"+t,"/usr/bin/"+t],s=process.env.NVM_DIR||In.join(e,".nvm"),i=In.join(s,"versions","node");if(za.existsSync(i))try{let o=za.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort().reverse();for(let a of o)r.push(In.join(i,a,"bin",t))}catch{}return r}function qv(t){t?Za.delete(t):Za.clear()}});var ec=T(hr=>{"use strict";var Yv=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]})),Jv=hr&&hr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Au=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"&&Yv(n,e,r[s]);return Jv(n,e),n}})();Object.defineProperty(hr,"__esModule",{value:!0});hr.getNodeBinaryCandidates=lh;hr.resolveNodeBinary=eO;hr.prependPathDir=tO;var ti=Au(require("fs")),oh=Au(require("os")),$i=Au(require("path")),rh=wu(),ah=process.platform==="win32",Xv=ah?"node.exe":"node",sh=$i.join(oh.homedir(),".agenthippo","gateway","install.json"),ih=$i.join(oh.homedir(),".agenthippo","tools","node");function ch(t){try{let e=ah?ti.constants.F_OK:ti.constants.X_OK;return ti.accessSync(t,e),!0}catch{return!1}}function zv(){try{if(!ti.existsSync(sh))return;let t=ti.readFileSync(sh,"utf8").replace(/^\uFEFF/,""),n=JSON.parse(t).nodePath?.trim();return n&&ch(n)?n:void 0}catch{return}}function Qv(){if(!ti.existsSync(ih))return[];let t=[],e=(n,r)=>{if(r>4)return;let s;try{s=ti.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){let o=$i.join(n,i.name);i.isDirectory()?e(o,r+1):i.isFile()&&i.name===Xv&&n.endsWith(`${$i.sep}bin`)&&t.push(o)}};return e(ih,0),t.sort().reverse()}function Zv(t){let e=new Set,n=[];for(let r of t){let s=$i.resolve(r);e.has(s)||!ch(s)||(e.add(s),n.push(s))}return n}function lh(){let t=[];process.env.NODE_BIN?.trim()&&t.push(process.env.NODE_BIN.trim());let e=zv();return e&&t.push(e),t.push(...Qv()),process.env.npm_node_execpath?.trim()&&t.push(process.env.npm_node_execpath.trim()),Zv(t)}async function eO(){let t=lh();if(t.length>0)return t[0];let e=await(0,rh.findBinaryCached)("node",(0,rh.getCommonBinaryPaths)("node"));return e||"node"}function tO(t,e){if(!e?.trim())return;let n=e.trim(),r=t.PATH?.trim();t.PATH=r?`${n}${$i.delimiter}${r}`:n}});var Ao=T(ie=>{"use strict";Object.defineProperty(ie,"__esModule",{value:!0});ie.prependPathDir=ie.getNodeBinaryCandidates=ie.resolveNodeBinary=ie.clearBinaryCache=ie.getCommonBinaryPaths=ie.findBinaryCached=ie.findBinary=ie.probePort=ie.DIRS=ie.PID_FILES=ie.getAnalyticsScriptsDir=ie.getAgentidePath=ie.getAgentideHome=ie.checkPidFileWithCleanup=ie.removePidFile=ie.writePidFile=ie.readPidFile=ie.isPidFileProcessRunning=ie.isProcessRunningAsync=ie.isProcessRunning=void 0;var ni=eh();Object.defineProperty(ie,"isProcessRunning",{enumerable:!0,get:function(){return ni.isProcessRunning}});Object.defineProperty(ie,"isProcessRunningAsync",{enumerable:!0,get:function(){return ni.isProcessRunningAsync}});Object.defineProperty(ie,"isPidFileProcessRunning",{enumerable:!0,get:function(){return ni.isPidFileProcessRunning}});Object.defineProperty(ie,"readPidFile",{enumerable:!0,get:function(){return ni.readPidFile}});Object.defineProperty(ie,"writePidFile",{enumerable:!0,get:function(){return ni.writePidFile}});Object.defineProperty(ie,"removePidFile",{enumerable:!0,get:function(){return ni.removePidFile}});Object.defineProperty(ie,"checkPidFileWithCleanup",{enumerable:!0,get:function(){return ni.checkPidFileWithCleanup}});var wo=Js();Object.defineProperty(ie,"getAgentideHome",{enumerable:!0,get:function(){return wo.getAgentideHome}});Object.defineProperty(ie,"getAgentidePath",{enumerable:!0,get:function(){return wo.getAgentidePath}});Object.defineProperty(ie,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return wo.getAnalyticsScriptsDir}});Object.defineProperty(ie,"PID_FILES",{enumerable:!0,get:function(){return wo.PID_FILES}});Object.defineProperty(ie,"DIRS",{enumerable:!0,get:function(){return wo.DIRS}});var nO=th();Object.defineProperty(ie,"probePort",{enumerable:!0,get:function(){return nO.probePort}});var tc=wu();Object.defineProperty(ie,"findBinary",{enumerable:!0,get:function(){return tc.findBinary}});Object.defineProperty(ie,"findBinaryCached",{enumerable:!0,get:function(){return tc.findBinaryCached}});Object.defineProperty(ie,"getCommonBinaryPaths",{enumerable:!0,get:function(){return tc.getCommonBinaryPaths}});Object.defineProperty(ie,"clearBinaryCache",{enumerable:!0,get:function(){return tc.clearBinaryCache}});var Su=ec();Object.defineProperty(ie,"resolveNodeBinary",{enumerable:!0,get:function(){return Su.resolveNodeBinary}});Object.defineProperty(ie,"getNodeBinaryCandidates",{enumerable:!0,get:function(){return Su.getNodeBinaryCandidates}});Object.defineProperty(ie,"prependPathDir",{enumerable:!0,get:function(){return Su.prependPathDir}})});var Er=T(Ge=>{"use strict";var rO=Ge&&Ge.__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]})),sO=Ge&&Ge.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tu=Ge&&Ge.__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"&&rO(n,e,r[s]);return sO(n,e),n}})();Object.defineProperty(Ge,"__esModule",{value:!0});Ge.OPENCLAW_GATEWAY_TOKEN_ENV=Ge.AGENTHIPPO_CHAT_SESSION_ID_ENV=Ge.AGENTIDE_CHAT_SESSION_ID_ENV=void 0;Ge.readOpenClawGatewayToken=fh;Ge.getBundledToolsHealth=cO;Ge.getCliHealth=gO;Ge.buildSessionEnvPatch=_h;Ge.buildCliEnvPatch=hO;Ge.readProvenanceEnvFromProcess=mO;Ge.buildProvenanceEnv=EO;Ge.runCli=wh;var Mr=Tu(require("fs")),iO=Tu(require("os")),mr=Tu(require("path")),oO=require("child_process"),nc=Ye(),uh=Ja(),bu=Ao();Ge.AGENTIDE_CHAT_SESSION_ID_ENV="AGENTIDE_CHAT_SESSION_ID";Ge.AGENTHIPPO_CHAT_SESSION_ID_ENV="AGENTHIPPO_CHAT_SESSION_ID";Ge.OPENCLAW_GATEWAY_TOKEN_ENV="OPENCLAW_GATEWAY_TOKEN";function fh(t){let e=t?.OPENCLAW_GATEWAY_TOKEN?.trim()||process.env.OPENCLAW_GATEWAY_TOKEN?.trim();if(e)return e;try{let n=mr.join(iO.homedir(),".openclaw","openclaw.json"),r=Mr.readFileSync(n,"utf-8"),i=JSON.parse(r).gateway?.auth?.token;return typeof i=="string"?i.trim():void 0}catch{return}}var ph=["rg","sg","tree-sitter"];function gh(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 hh(t){return process.platform!=="win32"?t:`${t}.exe`}function mh(t){for(let e of ph){let n=mr.join(t,hh(e));try{let r=process.platform==="win32"?Mr.constants.F_OK:Mr.constants.X_OK;return Mr.accessSync(n,r),!0}catch{}}return!1}function Eh(t,e){let n=gh();if(!n)return[];let r=[],s=process.env.AGENTHIPPO_TOOLS_DIR||process.env.AGENTIDE_TOOLS_DIR;return s?.trim()&&r.push(yh(s)),t?.trim()&&r.push(mr.join(t,"tools",n)),e?.trim()&&r.push(mr.join(e,"tools",n)),r}function aO(t,e){let n=Eh(t,e);for(let r of n)if(mh(r))return r}function cO(t={}){let e=gh(),n=Eh(t.extensionPath,t.binaryDirHint),r=n.find(o=>mh(o)),s=r??n[0],i=ph.map(o=>{let a=s??"",c=mr.join(a,hh(o)),l=!1;if(s)try{let f=process.platform==="win32"?Mr.constants.F_OK:Mr.constants.X_OK;Mr.accessSync(c,f),l=!0}catch{l=!1}return{name:o,path:c,available:l}});return{platformKey:e,toolsDir:r,tools:i}}function lO(t,e){let n=e.map(o=>o.trim()).filter(Boolean),r=t.split(mr.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(mr.delimiter)}function uO(t){return process.platform!=="win32"?"PATH":t&&Object.prototype.hasOwnProperty.call(t,"Path")?"Path":"PATH"}var dO=3e4,ri;async function dh(t){try{let e=process.platform==="win32"?Mr.constants.F_OK:Mr.constants.X_OK;return await Mr.promises.access(t,e),!0}catch{return!1}}function yh(t){return t.trim().replace(/^"|"$/g,"")}async function fO(t){let e=t.configuredPath?.trim();if(e){let r=yh(e);if(await dh(r))return{path:r,source:"setting"}}if(t.extensionPath){let r=[nc.AGENTIDE_CLI_NAME,"agentide"],s=process.platform==="win32"?[".cmd",".exe",".bat",""]:[""],i=[];for(let o of r)for(let a of s)i.push(mr.join(t.extensionPath,"dist",`${o}${a}`));for(let o of i)if(await dh(o))return{path:o,source:"bundled"}}t.forceRefresh&&(0,bu.clearBinaryCache)(nc.AGENTIDE_CLI_NAME);let n=await(0,bu.findBinaryCached)(nc.AGENTIDE_CLI_NAME,(0,bu.getCommonBinaryPaths)(nc.AGENTIDE_CLI_NAME));return n?{path:n,source:"path"}:{source:"not_found"}}async function pO(t){try{let e=await wh(t,["--version"],{timeoutMs:5e3});return e.code!==0?void 0:e.stdout.trim().split(/\r?\n/)[0]||void 0}catch{return}}async function gO(t={}){let e=Date.now();if(!t.forceRefresh&&ri&&e-ri.lastCheckedAt<dO)return ri;let n=await fO(t);if(!n.path)return ri={installed:!1,source:"not_found",lastCheckedAt:e,error:t.configuredPath?`Configured path not found: ${t.configuredPath}`:void 0},ri;let r=await pO(n.path);return ri={installed:!0,path:n.path,version:r,source:n.source,lastCheckedAt:e},ri}function _h(t){let e=t.chatSessionId?.trim(),n=t.gatewaySessionKey?.trim();if(!e&&!n)return{};let r={};e&&(r[Ge.AGENTIDE_CHAT_SESSION_ID_ENV]=e,r[Ge.AGENTHIPPO_CHAT_SESSION_ID_ENV]=e);let s=(0,uh.resolveGatewayOutboundFilePath)({workspaceRoot:t.workspaceRoot,gatewaySessionKey:n,chatSessionId:n?void 0:e});return s&&(r[uh.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV]=s),r}function hO(t){let e={AGENTHIPPO_WORKSPACE_ROOT:t.workspaceRoot,AGENTHIPPO_ACTIVE_AGENT:t.agentId,..._h({workspaceRoot:t.workspaceRoot,chatSessionId:t.chatSessionId})};if(!t.omitGatewayToken&&!process.env.AGENTHIPPO_EGRESS_URL?.trim()){let i=fh(t.baseEnv);i&&(e[Ge.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(mr.dirname(i.rgPath))}catch{}if(t.cliPath?.trim()){let i=t.cliPath.trim();e.AGENTHIPPO_CLI_PATH=i,n.push(mr.dirname(i))}let r=t.cliPath?.trim()?mr.dirname(t.cliPath.trim()):void 0,s=aO(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=uO(t.baseEnv),o=t.baseEnv?.[i]??t.baseEnv?.PATH??t.baseEnv?.Path??"";e[i]=lO(o,n)}return e}function mO(){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 EO(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 wh(t,e,n){return await new Promise((r,s)=>{let i=(0,oO.spawn)(t,e,{cwd:n?.cwd,env:{...process.env,...n?.env??{}},shell:!1}),o="",a="",c=!1,l=n?.timeoutMs??6e4,f=setTimeout(()=>{c||(i.kill(),s(new Error(`CLI command timed out after ${l}ms`)))},l);i.stdout.on("data",u=>{o+=u.toString()}),i.stderr.on("data",u=>{a+=u.toString()}),i.on("error",u=>{c||(c=!0,clearTimeout(f),s(u))}),i.on("close",u=>{c||(c=!0,clearTimeout(f),r({code:u??1,stdout:o,stderr:a}))})})}});var rc=T(Wn=>{"use strict";Object.defineProperty(Wn,"__esModule",{value:!0});Wn.RevocationUnsupportedError=Wn.SANDBOX_PROVIDER_KEY_ENV=Wn.SANDBOX_TIER_ENV=void 0;Wn.sandboxHoldsProviderKey=yO;Wn.isContainerSandbox=_O;Wn.SANDBOX_TIER_ENV="AGENTHIPPO_SANDBOX_TIER";Wn.SANDBOX_PROVIDER_KEY_ENV="AGENTHIPPO_SANDBOX_PROVIDER_KEY";function yO(t=process.env){return t[Wn.SANDBOX_PROVIDER_KEY_ENV]==="1"}function _O(t=process.env){return Number(t[Wn.SANDBOX_TIER_ENV])>=2}var vu=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"}};Wn.RevocationUnsupportedError=vu});var Gh=T(yr=>{"use strict";var wO=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]})),AO=yr&&yr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),SO=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"&&wO(n,e,r[s]);return AO(n,e),n}})();Object.defineProperty(yr,"__esModule",{value:!0});yr.CodexEngine=void 0;yr.registerNewFilesWithTracker=Mh;var Kn=require("fs"),pn=SO(require("path")),Ah=go(),bO=ru(),sc=Qs(),Ze=Zt(),Sh=uu(),Ou=zs(),si=Eu(),TO=Ns(),vO=Er(),bh=rc(),OO="agentide-litellm",IO="agentide-custom",Iu="AGENTIDE_ANALYTICS_SESSION_ID",Pu="AGENTIDE_ANALYTICS_USER_ID",Th="AGENTIDE_ANALYTICS_PROJECT_ID",vh="AGENTIDE_ANALYTICS_AGENT_ID",Oh="AGENTIDE_ANALYTICS_AGENT_VERSION",Ih="AGENTIDE_ANALYTICS_SOURCE",Ph="AGENTIDE_ANALYTICS_ENGINE",Nh="AGENTIDE_ANALYTICS_REQUEST_ID",Rh="AGENTIDE_ANALYTICS_POLICY_VERSION",Ch="AGENTIDE_ANALYTICS_PACK_DIGEST",kh="AGENTIDE_ANALYTICS_ENGINE_VERSION",$h="AGENTIDE_ANALYTICS_TIER",Dh="AGENTIDE_ANALYTICS_INSTANCE_ID",PO=21,NO="AGENTIDE_CONTEXT_EXPORT_PATH",RO="AGENTIDE_TERMINAL_LOG_PATH";async function Mh(t,e,n){if(e.appliesEdits!==!1)for(let r of t)try{if((0,Ze.isBinaryFile)(r)||!await(0,Ze.pathExists)(r))continue;let s=await Kn.promises.readFile(r,"utf-8");try{await Kn.promises.unlink(r),await e.applyEdit(n,r,s,!0)}finally{await(0,Ze.pathExists)(r)||await Kn.promises.writeFile(r,s,"utf-8")}}catch{}}function Lh(t){return t.type==="item.started"||t.type==="item.updated"||t.type==="item.completed"}var Nu=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,f=(0,Ze.resolveApiRouting)(n,this.config,"openai"),u=f.apiKey,d=f.openaiBaseUrl,p=f.useLiteLLM,g=n.sessionId,m=n.analyticsUserId,h=(0,sc.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),y=d&&d!=="https://api.openai.com/v1",w=p?"LiteLLM proxy":y?"custom provider":"direct OpenAI";o.info(`[AgentIDE] Codex routing: ${w}, baseUrl=${d||"default"}, workspaceRoot=${n.workspaceRoot}`);let P=l.toLowerCase().includes("claude");o.info(`[AgentIDE] Codex wire_api=responses (model=${l})`),P&&(p||y)&&o.info("[AgentIDE] Codex note: selected model appears to be Claude via proxy; reasoning summaries depend on provider support over the Responses API.");let v={...process.env,...s.cliEnvPatch??{},OPENAI_LOG:"debug"};delete v[vO.OPENCLAW_GATEWAY_TOKEN_ENV],delete v.AGENTHIPPO_DATA_PLANE_TOKEN;let A=g?.trim(),S=n.contextSessionId?.trim()||A;S&&(v[NO]=pn.join(n.workspaceRoot,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",S,"context.md"),v[RO]=pn.join(n.workspaceRoot,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",S,"terminal.md"));let I=n.agentPackId??"default",U=(0,si.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,I,n.agentPackVersion),O=(0,si.userScopedEngineHomeFromKey)(U.codexHome,(0,TO.resolveEngineHomeUserKey)(n.engineHomeUserKey));v.CODEX_HOME=O,await Kn.promises.mkdir(O,{recursive:!0}),v.AGENT_ID=I,n.agentPackVersion&&(v.AGENTIDE_AGENT_VERSION=n.agentPackVersion),I!=="default"?o.info(`[AgentIDE] Codex using agent: ${I}, CODEX_HOME=${O} (agent-isolated)`):o.info(`[AgentIDE] Codex using default agent, CODEX_HOME=${O}`);let F=y?d:void 0;await this.ensureCodexConfig(p,F,l,n.workspaceRoot,n.additionalDirectories??[],o,O,I,s.permissionHandler instanceof bO.AutoApprovePermissionHandler),p&&O&&(m?.trim()&&(v[Pu]=m.trim()),g?.trim()&&(v[Iu]=g.trim()),h?.trim()&&(v[Th]=h.trim()),v[vh]=I,v[Oh]=n.agentPackVersion??"workspace",v[Ih]="agenthippo",v[Ph]="codex",n.requestId&&(v[Nh]=n.requestId),n.policyVersion?.trim()&&(v[Rh]=n.policyVersion.trim()),n.packDigest?.trim()&&(v[Ch]=n.packDigest.trim()),n.engineVersion?.trim()&&(v[kh]=n.engineVersion.trim()),n.tier!==void 0&&(v[$h]=String(n.tier)),n.instanceId?.trim()&&(v[Dh]=n.instanceId.trim())),y&&u&&(v.CODEX_API_KEY=u),y&&(v.OPENAI_BASE_URL=d,o.info(`[AgentIDE] Using custom OpenAI base URL: ${d}`),(0,Ze.applyLocalTlsBypass)(v,d)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS (Codex)"));let se=(0,Ou.buildConversationKey)("codex",n);o.info(`[AgentIDE] Codex conversationKey=${se.key} (chatSessionId=${se.chatSessionId}, signature=${se.signatureHash}${se.isEphemeral?", ephemeral":""})`),await(0,Ou.withConversationLock)(se.key,async()=>{await r.progress("Thinking...");let W=n.permissions??Sh.DEFAULT_PERMISSIONS;o.info(`[AgentIDE] Codex permissions: fileAccess=${W.fileAccess}`);let pe=[n.workspaceRoot,...n.additionalDirectories??[]],me=(0,Sh.toCodexOptions)(W,pe);(0,bh.isContainerSandbox)()&&(me.sandboxMode="danger-full-access"),o.info(`[AgentIDE] Codex mapped: sandboxMode=${me.sandboxMode}, approvalPolicy=${me.approvalPolicy}`);let z=n.workspaceRoot,Ne={model:l,sandboxMode:me.sandboxMode,approvalPolicy:me.approvalPolicy,additionalDirectories:me.additionalDirectories,workingDirectory:z,skipGitRepoCheck:!0,modelReasoningEffort:"medium"};o.info(`[AgentIDE] Codex modelReasoningEffort=${Ne.modelReasoningEffort??"default"}`);let qe=y?void 0:u,Me=new c({apiKey:qe,env:v,...this.config.codexExecutablePath?{codexPathOverride:this.config.codexExecutablePath}:{}}),on=(0,sc.getPersistedSessionId)("codex",se.key),_e;if(on)try{_e=Me.resumeThread(on,Ne),o.info(`[AgentIDE] Codex resuming thread: ${on} (model: ${l})`)}catch(q){o.warn(`[AgentIDE] Failed to resume Codex thread (${on}): ${q instanceof Error?q.message:String(q)}. Starting new thread.`),_e=Me.startThread(Ne)}else _e=Me.startThread(Ne),o.info(`[AgentIDE] Codex starting new thread (model: ${l})`);if(i?.aborted){o.info("[AgentIDE] Codex stream cancelled before starting turn");return}let lr;try{({events:lr}=await _e.runStreamed(e,{signal:i}))}catch(q){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted while starting turn");return}throw q}let ut=new Map,Wt=new Map,_n=new Map,Gn=0,Et=0,It=0,Pt=!1,Ts=q=>q.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160);try{for await(let q of lr){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted; stopping event loop");return}let Gt=Lh(q)?q.item.type:void 0;if(o.debug(`[AgentIDE] Codex event: ${q.type}${Gt?` (item: ${Gt})`:""}`),q.type==="thread.started"){let Z=q.thread_id;o.info(`[AgentIDE] Codex thread started: ${Z}`),await(0,sc.persistSessionIfNeeded)("codex",se,Z,n);continue}if(q.type==="turn.failed")throw await r.error(q.error?.message||"Codex turn failed"),new Error(q.error?.message||"Codex turn failed");if(q.type==="error")throw await r.error(q.message||"Codex stream error"),new Error(q.message||"Codex stream error");if(q.type==="turn.completed"){o.info(`[AgentIDE] Codex usage: input=${q.usage.input_tokens}, cached=${q.usage.cached_input_tokens}, output=${q.usage.output_tokens}`);continue}if(Lh(q)){let{item:N}=q;if(N.type==="reasoning"){It++;let Z=N.text??"",x=(0,Ze.computeTextDelta)(N.id,N.text??"",ut);x?(Gn++,Et+=x.length,Gn<=3&&o.debug(`[AgentIDE] Codex reasoning delta #${Gn} (${x.length} chars): ${Ts(x)}`),await r.thinking(x)):!Pt&&Z.length===0&&(Pt=!0,o.debug("[AgentIDE] Codex reasoning item observed but text is empty so far."))}else if(N.type==="agent_message"){let Z=(0,Ze.computeTextDelta)(N.id,N.text??"",ut);Z&&await r.text(Z)}else if(N.type==="command_execution"){if(q.type==="item.started"&&(await r.thinking(`**Running command**
|
|
49
49
|
\`\`\`bash
|
|
50
50
|
${N.command}
|
|
51
51
|
\`\`\`
|
|
52
|
-
`),await r.toolStart("terminal",N.command,N.id,{kind:"terminal",language:"bash"}),A&&N.command&&a)){let Z=(0,
|
|
52
|
+
`),await r.toolStart("terminal",N.command,N.id,{kind:"terminal",language:"bash"}),A&&N.command&&a)){let Z=(0,Ze.extractFilePaths)(N.command,n.workspaceRoot).filter(x=>!(0,Ze.isBinaryFile)(x));if(Z.length>0)if((0,Ze.isCreateCommand)(N.command))_n.set(N.id,Z);else{let x=await Promise.all(Z.map(async oe=>[oe,await(0,Ze.pathExists)(oe)])),ge=x.filter(([,oe])=>oe).map(([oe])=>oe),dt=x.filter(([,oe])=>!oe).map(([oe])=>oe);if(dt.length>0&&_n.set(N.id,dt),ge.length>0)try{let oe=await a.startTracking(A,ge);oe?.operationId!==void 0&&Wt.set(N.id,oe.operationId)}catch{}}}if(q.type==="item.updated"||q.type==="item.completed"){let Z=(0,Ze.computeTextDelta)(`${N.id}-output`,N.aggregated_output??"",ut);Z&&await r.thinking(Z)}if(q.type==="item.completed"){let Z=N.exit_code!==void 0?N.exit_code===0?"\u2713 Command completed":`\u2717 Exited with code ${N.exit_code}`:"\u2713 Command completed";if(await r.thinking(`
|
|
53
53
|
${Z}
|
|
54
|
-
`),await r.toolEnd("terminal",N.id,N.exit_code!==void 0?`Exited with code ${N.exit_code}`:"Completed",N.exit_code!==void 0?N.exit_code!==0:!1,{exitCode:N.exit_code}),A&&a){let x=Wt.get(N.id);if(x!==void 0){try{await a.stopTracking(A,x)}catch{}Wt.delete(N.id)}await Mh(_n.get(N.id)??[],a,A),_n.delete(N.id)}}}else if(N.type==="mcp_tool_call"){if(
|
|
54
|
+
`),await r.toolEnd("terminal",N.id,N.exit_code!==void 0?`Exited with code ${N.exit_code}`:"Completed",N.exit_code!==void 0?N.exit_code!==0:!1,{exitCode:N.exit_code}),A&&a){let x=Wt.get(N.id);if(x!==void 0){try{await a.stopTracking(A,x)}catch{}Wt.delete(N.id)}await Mh(_n.get(N.id)??[],a,A),_n.delete(N.id)}}}else if(N.type==="mcp_tool_call"){if(q.type==="item.started"){let Z=N.arguments?`
|
|
55
55
|
\`\`\`json
|
|
56
56
|
${JSON.stringify(N.arguments,null,2)}
|
|
57
57
|
\`\`\``:"";await r.thinking(`**Calling MCP tool** \`${N.server}.${N.tool}\`${Z}
|
|
58
|
-
`);let x=N.arguments?JSON.stringify(N.arguments,null,2).slice(0,400):"";await r.toolStart(`${N.server}.${N.tool}`,x,N.id,{arguments:N.arguments})}if(
|
|
58
|
+
`);let x=N.arguments?JSON.stringify(N.arguments,null,2).slice(0,400):"";await r.toolStart(`${N.server}.${N.tool}`,x,N.id,{arguments:N.arguments})}if(q.type==="item.completed")if(N.error?.message)await r.thinking(`
|
|
59
59
|
\u2717 MCP error: ${N.error.message}
|
|
60
60
|
`),await r.toolEnd(`${N.server}.${N.tool}`,N.id,N.error.message,!0,{error:N.error});else if(N.result){let Z=JSON.stringify(N.result.structured_content??N.result.content,null,2),x=Z.length>500?Z.slice(0,500)+"...":Z;await r.thinking(`
|
|
61
61
|
\u2713 MCP result:
|
|
62
62
|
\`\`\`json
|
|
63
63
|
${x}
|
|
64
64
|
\`\`\`
|
|
65
|
-
`),await r.toolEnd(`${N.server}.${N.tool}`,N.id,"MCP call completed",!1,{result:N.result})}else await r.toolEnd(`${N.server}.${N.tool}`,N.id,"MCP call completed",!1)}else if(N.type==="file_change"){if(
|
|
66
|
-
`),await r.progress(`[Files] ${Z}`),A?a||o.warn("[AgentIDE] Codex file_change: skipping edit tracking (no editTracker)"):o.debug("[AgentIDE] Codex file_change: skipping edit tracking (no session ID)"),A&&a){let x=N.changes.filter(ge=>{let dt=(0,
|
|
67
|
-
`);let x=Wt.get(N.id);if(A&&x!==void 0&&a)try{await a.stopTracking(A,x),o.debug(`[AgentIDE] Stopped edit tracking (op=${x})`)}catch(ge){o.warn(`[AgentIDE] Failed to stop edit tracking: ${ge}`)}finally{Wt.delete(N.id)}}}else if(N.type==="web_search")
|
|
68
|
-
`),await r.toolStart("web_search",N.query,N.id,{query:N.query})),
|
|
65
|
+
`),await r.toolEnd(`${N.server}.${N.tool}`,N.id,"MCP call completed",!1,{result:N.result})}else await r.toolEnd(`${N.server}.${N.tool}`,N.id,"MCP call completed",!1)}else if(N.type==="file_change"){if(q.type==="item.started"){let Z=N.changes.map(x=>`${x.kind} ${x.path}`).join(", ");if(await r.thinking(`**File changes:** ${Z}
|
|
66
|
+
`),await r.progress(`[Files] ${Z}`),A?a||o.warn("[AgentIDE] Codex file_change: skipping edit tracking (no editTracker)"):o.debug("[AgentIDE] Codex file_change: skipping edit tracking (no session ID)"),A&&a){let x=N.changes.filter(ge=>{let dt=(0,Ze.normalizeFileChangeKind)(String(ge.kind));return(dt==="create"||dt==="modify")&&!(0,Ze.isBinaryFile)(ge.path)}).map(ge=>pn.isAbsolute(ge.path)?ge.path:pn.join(n.workspaceRoot,ge.path));if(x.length>0){o.info(`[AgentIDE] Codex file_change: starting edit tracking for ${x.length} files: ${x.join(", ")}`);try{let ge=await a.startTracking(A,x);ge?.operationId!==void 0?(Wt.set(N.id,ge.operationId),o.info(`[AgentIDE] Codex file_change: edit tracking started (op=${ge.operationId})`)):o.warn("[AgentIDE] Codex file_change: startTracking returned no operationId")}catch(ge){o.warn(`[AgentIDE] Codex file_change: failed to start edit tracking: ${ge}`)}}else o.debug("[AgentIDE] Codex file_change: no trackable files (all filtered out)")}}if(q.type==="item.completed"){let Z=N.status==="completed"?"\u2713":"\u2717";await r.thinking(`${Z} File changes ${N.status}
|
|
67
|
+
`);let x=Wt.get(N.id);if(A&&x!==void 0&&a)try{await a.stopTracking(A,x),o.debug(`[AgentIDE] Stopped edit tracking (op=${x})`)}catch(ge){o.warn(`[AgentIDE] Failed to stop edit tracking: ${ge}`)}finally{Wt.delete(N.id)}}}else if(N.type==="web_search")q.type==="item.started"&&(await r.thinking(`**Web search:** ${N.query}
|
|
68
|
+
`),await r.toolStart("web_search",N.query,N.id,{query:N.query})),q.type==="item.completed"&&await r.toolEnd("web_search",N.id,"Search completed",!1,{query:N.query});else if(N.type==="todo_list"){if(q.type==="item.started"){let Z=N.items.map(x=>`- [${x.completed?"x":" "}] ${x.text}`);await r.thinking(`**Plan**
|
|
69
69
|
${Z.join(`
|
|
70
70
|
`)}
|
|
71
|
-
`)}if(
|
|
71
|
+
`)}if(q.type==="item.updated"){let Z=N.items.map(x=>`- [${x.completed?"x":" "}] ${x.text}`);await r.thinking(`**Plan update**
|
|
72
72
|
${Z.join(`
|
|
73
73
|
`)}
|
|
74
|
-
`)}if(
|
|
75
|
-
`)}}}}catch(
|
|
76
|
-
`)+y;await Kn.promises.writeFile(pn.join(f,"config.toml"),w,"utf8"),this.lastWrittenConfigSignature=g,o.info(`[AgentIDE] Codex configured (${p}) at ${f}${n?`, baseUrl=${n}, wire_api=${d}`:""}, model=${r??"unknown"}`)}async updateCodexRuntimeInstructionsFile(e,n,r,s,i){let o=pn.join(n,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"AGENTS.md"),a="";if(await(0,
|
|
74
|
+
`)}if(q.type==="item.started"||q.type==="item.completed"){let Z=N.items.filter(x=>x.completed).length;await r.progress(`[Plan] ${Z}/${N.items.length} steps complete`)}}else if(N.type==="error"){let Z=N.message||"Codex warning";o.warn(`[AgentIDE] Codex warning: ${Z}`),await r.thinking(`**Warning:** ${Z}
|
|
75
|
+
`)}}}}catch(q){if(i?.aborted){o.info(`[AgentIDE] Codex stream aborted: ${q instanceof Error?q.message:String(q)}`);return}throw q}o.info(`[AgentIDE] Codex reasoning summary: items=${It}, deltas=${Gn}, chars=${Et}`),It===0&&o.debug("[AgentIDE] Codex emitted no reasoning items. This SDK only exposes a reasoning *summary* when available; many runs may have none."),(0,sc.touchSessionIfNeeded)(se)},{signal:i,timeoutMs:Ou.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 f=a??this.config.codexHome;if(!f)return;try{let P=this.getSkillsSignature(s);await this.syncCodexSkillsToCodexHome(f,s,c,o,P)}catch(P){o.warn(`[AgentIDE] Warning: failed to sync skills into $CODEX_HOME: ${P instanceof Error?P.message:String(P)}`)}let u=await this.updateCodexRuntimeInstructionsFile(f,s,i,c,o),d="responses",p=e?"litellm":n?"custom":"openai",g=`${PO}:${p}:${n??""}:${d}:${c}:${u??""}`;if(this.lastWrittenConfigSignature===g)return;await Kn.promises.mkdir(f,{recursive:!0});let m=[`# AgentIDE Codex config (generated) - ${p} mode`,'model_reasoning_summary = "detailed"',"hide_agent_reasoning = false",u?`model_instructions_file = ${JSON.stringify(u)}`:void 0,...(0,bh.isContainerSandbox)()?['sandbox_mode = "danger-full-access"']:[]];if(n){let P=e?OO:IO,b=e?"AgentIDE LiteLLM":"AgentIDE Custom Provider";m.push("",`model_provider = "${P}"`,"",`[model_providers.${P}]`,`name = "${b}"`,`base_url = ${JSON.stringify(n)}`,'env_key = "CODEX_API_KEY"',`wire_api = "${d}"`,"query_params = {}"),e&&m.push(`env_http_headers = { "x-litellm-metadata-session-id" = "${Iu}", "x-litellm-metadata-user-id" = "${Pu}", "x-litellm-metadata-project-id" = "${Th}", "langfuse_session_id" = "${Iu}", "langfuse_trace_user_id" = "${Pu}", "x-litellm-metadata-agent-id" = "${vh}", "x-litellm-metadata-agent-version" = "${Oh}", "x-litellm-metadata-source" = "${Ih}", "x-litellm-metadata-engine" = "${Ph}", "x-litellm-metadata-request-id" = "${Nh}", "x-litellm-metadata-policy-version" = "${Rh}", "x-litellm-metadata-pack-digest" = "${Ch}", "x-litellm-metadata-engine-version" = "${kh}", "x-litellm-metadata-tier" = "${$h}", "x-litellm-metadata-instance-id" = "${Dh}" }`)}let h=this.getBundledBasePromptsDir(),E=await(0,Ah.loadMcpServers)(c,s,h),y=(0,Ah.generateCodexMcpConfig)(E,{autoApprove:l});if(E.length>0){let P=c==="default"?"bundled":`pack:${c}`;o.debug(`[AgentIDE] Codex MCP config (${P}): ${E.length} server(s)`)}let w=m.filter(Boolean).join(`
|
|
76
|
+
`)+y;await Kn.promises.writeFile(pn.join(f,"config.toml"),w,"utf8"),this.lastWrittenConfigSignature=g,o.info(`[AgentIDE] Codex configured (${p}) at ${f}${n?`, baseUrl=${n}, wire_api=${d}`:""}, model=${r??"unknown"}`)}async updateCodexRuntimeInstructionsFile(e,n,r,s,i){let o=pn.join(n,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"AGENTS.md"),a="";if(await(0,Ze.pathExists)(o))a=await Kn.promises.readFile(o,"utf8"),i.debug(`[AgentIDE] Codex instructions from pack: ${s}/AGENTS.md`);else{let h=this.getBundledBasePromptsDir();if(h){let E=pn.join(h,"rules","AGENTS.md");await(0,Ze.pathExists)(E)&&(a=await Kn.promises.readFile(E,"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=pn.join(n,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"context.md"),l="";await(0,Ze.pathExists)(c)&&(l=await Kn.promises.readFile(c,"utf8"));let f=r.slice().filter(Boolean).sort(),d=["## AgentIDE Runtime Context (managed)","","### Workspace Information","","```json",JSON.stringify({workspaceRoot:n,additionalDirectories:f},null,2),"```"].join(`
|
|
77
77
|
`),p=[a.trimEnd()];l.trim()&&p.push(l.trimEnd()),p.push(d.trimEnd());let g=p.filter(Boolean).join(`
|
|
78
78
|
|
|
79
79
|
---
|
|
80
80
|
|
|
81
81
|
`).trimEnd().concat(`
|
|
82
|
-
`),m=pn.join(e,"agentide.runtime.md");return await(0,
|
|
83
|
-
`)),l&&l!=="https://api.anthropic.com/v1"){let I=l.endsWith("/v1")?l.slice(0,-3):l;d.ANTHROPIC_BASE_URL=I,o.info(`[AgentIDE] Using custom Anthropic base URL: ${I}`),(0,ii.applyLocalTlsBypass)(d,I)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS")}let b=n.modelId;if(!b)throw new Error("Claude modelId not provided for streaming request");o.info(`[AgentIDE] Using Claude model: ${b}`);let v="",A=async I=>{if(!I)return;let U=v.length,O=I.length;if(U===0){v=I,await r.text(I);return}if(O===U){if(I===v){o.debug("[AgentIDE] Claude: exact duplicate, skipping");return}}else if(O>U){if(I.startsWith(v)){let F=I.slice(U);v=I,o.debug(`[AgentIDE] Claude: emitting remainder (${F.length} chars)`),await r.text(F);return}}else if(v.endsWith(I)){o.debug("[AgentIDE] Claude: suffix already streamed, skipping");return}v=I,await r.text(I)},S=(0,oc.buildConversationKey)("claude",n);o.info(`[AgentIDE] Claude conversationKey=${S.key} (chatSessionId=${S.chatSessionId}, signature=${S.signatureHash}${S.isEphemeral?", ephemeral":""})`),await(0,oc.withConversationLock)(S.key,async()=>{let I=(0,ii.getAgentideEngineSettings)(s?.configProvider),U=typeof I.claudeMaxThinkingTokens=="number"&&I.claudeMaxThinkingTokens>0?Math.floor(I.claudeMaxThinkingTokens):null;o.debug(`[AgentIDE] Claude maxThinkingTokens=${U??"default/disabled"}`);let O=(I.claudeCheapModel||"").trim();O&&(d.ANTHROPIC_DEFAULT_HAIKU_MODEL=O,d.CLAUDE_CODE_SUBAGENT_MODEL=O,o.debug(`[AgentIDE] Claude cheapModel=${O}`));let F=n.permissions??Uh.DEFAULT_PERMISSIONS;o.debug(`[AgentIDE] Claude permissions: fileAccess=${F.fileAccess}`);let
|
|
84
|
-
`).trim()||void 0}if(Q&&typeof Q=="object"){let M=Q;if(typeof M.text=="string")return M.text}return is(Q)},Ks=Q=>{if(!Q||typeof Q!="object")return;let M=Q,ve=M.type;if(ve!=="tool_result"&&ve!=="server_tool_result"&&ve!=="mcp_tool_result")return;let
|
|
85
|
-
`)||M.subtype)}let je=M.message?.content;if(M.type!=="assistant"&&Array.isArray(je))for(let ue of je){let xe=Ks(ue);xe&&await Oi(xe.toolUseId,xe.resultText,xe.isError)}}for(let[Q,M]of Array.from(ur.entries()))await Oi(Q,"Completed",!1,M);o.info(`[AgentIDE] Claude thinking summary: startBlocks=${dt}, redactedBlocks=${oe}, deltas=${x}, chars=${ge}`),o.info(`[AgentIDE] Claude tool summary: toolBlocks=${yt}, toolEmits=${Kt}, toolProgressMsgs=${qt}, inputJsonDeltas=${Yt}`),dt===0&&x===0&&oe===0&&o.debug(`[AgentIDE] Claude emitted no thinking blocks/deltas. Ensure model supports extended thinking and set ${(0,LO.toSettingsDisplayKey)("agentide.claude.maxThinkingTokens")} >= 1024.`),yt===0&&qt===0&&o.debug("[AgentIDE] Claude emitted no tool usage events. If tools were used, ensure includePartialMessages=true and parse tool_use blocks."),(0,So.touchSessionIfNeeded)(S)}catch(x){if(!N)throw x;o.info(`[AgentIDE] Claude stream aborted: ${x instanceof Error?x.message:String(x)}`)}finally{i?.removeEventListener("abort",Z)}},{signal:i,timeoutMs:oc.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)}sweepIdleSessions(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())if(n-s.lastUsedAt>HO){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.agentideSignature===e.agentideSignature)return n.lastUsedAt=Date.now(),n.editTrackingState.aborted=!1,n.editTrackingState.pendingOperations.clear(),(0,oc.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);try{n.session.close()}catch{}this.activeSessions.delete(e.conversationKey)}!r&&!e.isEphemeral&&(r=(0,So.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 import("@anthropic-ai/claude-agent-sdk"),o={session:VO({resumeSessionId:r,queryFn:s.query,options:e.queryOptions}),chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,agentideSignature:e.agentideSignature,modelId:e.modelId,cheapModel:e.cheapModel,lastUsedAt:Date.now(),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,Hh.loadMcpServers)(r,n,i);if(o.length===0)return{};let a={};for(let l of o){if(l.url){let f=(0,Hh.referenceHttpMcpHeaders)(l,s??process.env);a[l.name]={type:"http",url:l.url,...f?{headers:f}:{}};continue}a[l.name]={command:l.command,args:l.args,...l.env&&Object.keys(l.env).length>0?{env:l.env}:{}}}let c=r==="default"?"bundled":`pack:${r}`;return e.debug(`[AgentIDE] Claude MCP servers loaded (${c}): ${o.map(l=>l.name).join(", ")}`),a}};Gr.ClaudeEngine=Ru});var ku=T(gn=>{"use strict";var WO=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]})),KO=gn&&gn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qO=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"&&WO(n,e,r[s]);return KO(n,e),n}})();Object.defineProperty(gn,"__esModule",{value:!0});gn.syncPackMcpToWorkspace=Wh;gn.syncPackToWorkspace=tI;gn.computeSkillsSignature=Kh;gn.createSkillsSignatureGetter=nI;gn.createSessionDir=rI;gn.getSessionDir=sI;var
|
|
86
|
-
`),Rt(r,`[AgentIDE] Synced pack MCP config: ${l}`))}function Bh(t){return!(!t||!t.trim()||
|
|
82
|
+
`),m=pn.join(e,"agentide.runtime.md");return await(0,Ze.writeFileIfChanged)(m,g),m}async syncCodexSkillsToCodexHome(e,n,r,s,i){let o=pn.join(n,si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",r,"skills"),a=pn.join(e,"skills");if(i){let f=this.lastCodexSkillsSignatureByWorkspaceRoot.get(n),u=await(0,Ze.pathExists)(a);if(f===i&&u){s.debug(`[AgentIDE] Codex skills unchanged (sig=${i}), skipping $CODEX_HOME sync`);return}}try{await Kn.promises.rm(a,{recursive:!0,force:!0})}catch{}if(!await(0,Ze.pathExists)(o))return;await Kn.promises.mkdir(a,{recursive:!0});let c=0,l=await Kn.promises.readdir(o,{withFileTypes:!0});for(let f of l){if(!f.isDirectory()||f.name.startsWith("."))continue;let u=pn.join(o,f.name),d=pn.join(u,"SKILL.md");await(0,Ze.pathExists)(d)&&(await(0,Ze.copyDirRecursive)(u,pn.join(a,f.name)),c++)}i&&this.lastCodexSkillsSignatureByWorkspaceRoot.set(n,i),s.info(`[AgentIDE] Codex skills synced to $CODEX_HOME: ${c} skill(s)`)}};yr.CodexEngine=Nu});var xh=T(Gr=>{"use strict";var CO=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]})),kO=Gr&&Gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$O=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"&&CO(n,e,r[s]);return kO(n,e),n}})();Object.defineProperty(Gr,"__esModule",{value:!0});Gr.ClaudeEngine=void 0;var DO=require("fs"),ic=$O(require("path")),LO=Ye(),So=Qs(),ii=Zt(),Uh=uu(),Hh=go(),MO=Er(),oc=zs(),ac=Eu(),GO=Ns(),jh=Pa(),UO=new Set(["Write","Edit","FileEdit","FileWrite","MultiEdit","str_replace_editor","Str_replace_editor","TextEditor","text_editor","Bash","bash","shell","Shell"]),HO=1e3*60*30;function jO(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(u=>({label:u.label,description:u.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 f=l.freeText??l.selected.join(", ");o[a.question]=f}return{behavior:"allow",updatedInput:{questions:s.questions,answers:o}}}return{behavior:"allow",updatedInput:r}}}var xO="AGENTIDE_CONTEXT_EXPORT_PATH",BO="AGENTIDE_TERMINAL_LOG_PATH";function FO(){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 VO(t){let e=FO(),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 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())}}}var Ru=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:f}=(0,ii.resolveApiRouting)(n,this.config,"anthropic");if(!c)throw new Error("Claude API key not provided");o.info(`[AgentIDE] Claude using ${f?"LiteLLM proxy":"direct Anthropic"}, baseUrl: ${l||"default"}, workspaceRoot=${n.workspaceRoot}, additionalDirs=${n.additionalDirectories?.length??0}`),await r.progress("Thinking...");let u=(0,So.buildLiteLLMMetadataHeaders)(f,{sessionId:n.sessionId,analyticsUserId:n.analyticsUserId,analyticsProjectId:(0,So.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}),d={...process.env,...s.cliEnvPatch??{},DEBUG_CLAUDE_AGENT_SDK:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1"};if(delete d[MO.OPENCLAW_GATEWAY_TOKEN_ENV],delete d.AGENTHIPPO_DATA_PLANE_TOKEN,(0,jh.isAnthropicSetupToken)(c)){let I=(0,jh.normalizeAnthropicSetupToken)(c);d.CLAUDE_CODE_OAUTH_TOKEN=I,delete d.ANTHROPIC_AUTH_TOKEN,delete d.ANTHROPIC_API_KEY,o.info("[AgentIDE] Claude using setup-token auth (CLAUDE_CODE_OAUTH_TOKEN)")}else d.ANTHROPIC_API_KEY=c,d.ANTHROPIC_AUTH_TOKEN=c,delete d.CLAUDE_CODE_OAUTH_TOKEN;let g=n.sessionId?.trim(),m=n.contextSessionId?.trim()||g;m&&(d[xO]=ic.join(n.workspaceRoot,ac.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",m,"context.md"),d[BO]=ic.join(n.workspaceRoot,ac.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",m,"terminal.md"));let h=n.agentPackId??"default",E=(0,ac.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,h,n.agentPackVersion),y=(0,ac.userScopedEngineHomeFromKey)(E.claudeConfigDir,(0,GO.resolveEngineHomeUserKey)(n.engineHomeUserKey));if(d.CLAUDE_CONFIG_DIR=y,await DO.promises.mkdir(y,{recursive:!0}),d.AGENT_ID=h,n.agentPackVersion&&(d.AGENTIDE_AGENT_VERSION=n.agentPackVersion),h!=="default"?o.info(`[AgentIDE] Claude using agent: ${h}, CLAUDE_CONFIG_DIR=${y} (agent-isolated)`):o.info(`[AgentIDE] Claude using default agent, CLAUDE_CONFIG_DIR=${y}`),u.length>0&&(d.ANTHROPIC_CUSTOM_HEADERS=u.join(`
|
|
83
|
+
`)),l&&l!=="https://api.anthropic.com/v1"){let I=l.endsWith("/v1")?l.slice(0,-3):l;d.ANTHROPIC_BASE_URL=I,o.info(`[AgentIDE] Using custom Anthropic base URL: ${I}`),(0,ii.applyLocalTlsBypass)(d,I)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS")}let b=n.modelId;if(!b)throw new Error("Claude modelId not provided for streaming request");o.info(`[AgentIDE] Using Claude model: ${b}`);let v="",A=async I=>{if(!I)return;let U=v.length,O=I.length;if(U===0){v=I,await r.text(I);return}if(O===U){if(I===v){o.debug("[AgentIDE] Claude: exact duplicate, skipping");return}}else if(O>U){if(I.startsWith(v)){let F=I.slice(U);v=I,o.debug(`[AgentIDE] Claude: emitting remainder (${F.length} chars)`),await r.text(F);return}}else if(v.endsWith(I)){o.debug("[AgentIDE] Claude: suffix already streamed, skipping");return}v=I,await r.text(I)},S=(0,oc.buildConversationKey)("claude",n);o.info(`[AgentIDE] Claude conversationKey=${S.key} (chatSessionId=${S.chatSessionId}, signature=${S.signatureHash}${S.isEphemeral?", ephemeral":""})`),await(0,oc.withConversationLock)(S.key,async()=>{let I=(0,ii.getAgentideEngineSettings)(s?.configProvider),U=typeof I.claudeMaxThinkingTokens=="number"&&I.claudeMaxThinkingTokens>0?Math.floor(I.claudeMaxThinkingTokens):null;o.debug(`[AgentIDE] Claude maxThinkingTokens=${U??"default/disabled"}`);let O=(I.claudeCheapModel||"").trim();O&&(d.ANTHROPIC_DEFAULT_HAIKU_MODEL=O,d.CLAUDE_CODE_SUBAGENT_MODEL=O,o.debug(`[AgentIDE] Claude cheapModel=${O}`));let F=n.permissions??Uh.DEFAULT_PERMISSIONS;o.debug(`[AgentIDE] Claude permissions: fileAccess=${F.fileAccess}`);let se=(0,ii.stableAdditionalDirs)([n.workspaceRoot,...n.additionalDirectories??[]]),W=(0,Uh.toClaudeOptions)(F,se);o.debug(`[AgentIDE] Claude mapped: permissionMode=${W.permissionMode}, allowDangerouslySkipPermissions=${W.allowDangerouslySkipPermissions}, dirs=${W.additionalDirectories?.length??"undefined"}`);let pe=(0,ii.stableAdditionalDirs)([...W.additionalDirectories??[],y]),me=await this.computeAgentideSignature(n.workspaceRoot,n.additionalDirectories),z=n.sessionId,Ne=n.workspaceRoot,qe={current:null},Me=x=>{let ge=x.trim();return/(?:^|&&|\||;)\s*git\s+/.test(ge)},on=(x,ge)=>{let dt=ge;if(!dt)return[];if(x==="Bash"){let Kt=dt.command;return Kt?Me(Kt)?[]:(0,ii.extractFilePaths)(Kt,Ne):[]}let oe=dt.file_path??dt.path;return oe?[ic.isAbsolute(oe)?oe:ic.join(Ne,oe)]:[]},_e={continue:!0},lr=async(x,ge,dt)=>{try{o.debug(`[AgentIDE] PreToolUse hook called: toolUseID=${ge}, event=${x.hook_event_name}`);let oe=qe.current;if(!oe)return o.debug("[AgentIDE] PreToolUse: no edit state"),_e;if(oe.aborted)return o.debug("[AgentIDE] PreToolUse: aborted"),_e;if(x.hook_event_name!=="PreToolUse")return o.debug(`[AgentIDE] PreToolUse: wrong event ${x.hook_event_name}`),_e;if(!z)return o.debug("[AgentIDE] PreToolUse: no rawChatSessionId"),_e;if(!a)return o.debug("[AgentIDE] PreToolUse: no edit tracker available"),_e;let yt=x.tool_name;if(!UO.has(yt))return o.debug(`[AgentIDE] PreToolUse: tool ${yt} not tracked (not in FILE_TOOLS)`),_e;let Kt=x.tool_use_id,qt=on(yt,x.tool_input).filter(Yt=>!(0,ii.isBinaryFile)(Yt));if(o.debug(`[AgentIDE] PreToolUse: ${yt} files=${qt.length}: ${qt.join(", ")}`),qt.length===0)return _e;o.debug(`[AgentIDE] PreToolUse: calling startTracking for ${qt.length} files`);try{let Yt=await a.startTracking(z,qt);Yt?.operationId!==void 0&&oe&&!oe.aborted&&(o.debug(`[AgentIDE] PreToolUse: startTracking returned opId=${Yt.operationId}`),oe.pendingOperations.set(Kt,Yt.operationId))}catch(Yt){o.warn(`[AgentIDE] PreToolUse: startTracking failed: ${Yt}`)}return _e}catch(oe){return o.error("[AgentIDE] PreToolUse hook EXCEPTION",oe instanceof Error?oe:void 0),_e}},ut=async(x,ge,dt)=>{try{o.debug(`[AgentIDE] PostToolUse hook called: toolUseID=${ge}, event=${x.hook_event_name}`);let oe=qe.current;if(!oe||oe.aborted||x.hook_event_name!=="PostToolUse"||!z||!a)return _e;let yt=x.tool_use_id;if(!yt)return _e;let Kt=oe.pendingOperations.get(yt);if(o.debug(`[AgentIDE] PostToolUse: toolUseId=${yt} opId=${Kt}`),Kt!==void 0){oe.pendingOperations.delete(yt);try{await a.stopTracking(z,Kt),o.debug("[AgentIDE] PostToolUse: stopTracking done")}catch(qt){o.warn(`[AgentIDE] PostToolUse: stopTracking failed: ${qt}`)}}return _e}catch(oe){return o.error("[AgentIDE] PostToolUse hook EXCEPTION",oe instanceof Error?oe:void 0),_e}};o.debug(`[AgentIDE] Setting up Claude hooks for session ${z}`);let Wt=async(x,ge,dt)=>(o.debug(`[AgentIDE] SessionStart hook called! event=${x.hook_event_name}`),_e),_n=await this.loadMcpServersForClaude(o,n.workspaceRoot,h,d),Gn=n.workspaceRoot,Et=h!=="default"?["project"]:["user","project"],It=W.allowDangerouslySkipPermissions===!0?!0:void 0,Pt={model:b,cwd:Gn,additionalDirectories:pe,settingSources:Et,env:d,permissionMode:W.permissionMode,allowDangerouslySkipPermissions:It,includePartialMessages:!0,persistSession:!0,...U?{maxThinkingTokens:U}:{},...Object.keys(_n).length>0?{mcpServers:_n}:{},...this.config.claudeCodeExecutablePath?{pathToClaudeCodeExecutable:this.config.claudeCodeExecutablePath}:{},canUseTool:jO(r,o),hooks:{SessionStart:[{hooks:[Wt]}],PreToolUse:[{hooks:[lr]}],PostToolUse:[{hooks:[ut]}]},stderr:x=>{o.debug(`[AgentIDE] Claude CLI stderr: ${x}`)}},Ts=await this.getOrCreateSession({conversationKey:S.key,chatSessionId:S.chatSessionId,signatureHash:S.signatureHash,signatureRaw:S.signatureRaw,agentideSignature:me,isEphemeral:S.isEphemeral,modelId:b,cheapModel:O||void 0,queryOptions:Pt,logger:o}),q=Ts.session,Gt=Ts.editTrackingState;qe.current=Gt;let N=!1,Z=()=>{N=!0,Gt.aborted=!0;let x=Array.from(Gt.pendingOperations.values());if(Gt.pendingOperations.clear(),z&&x.length>0&&a)for(let ge of x)a.stopTracking(z,ge).catch(()=>{});o.info("[AgentIDE] Claude cancel requested; interrupting session..."),q.interrupt().catch(()=>{try{q.close()}catch{}})};if(i?.aborted){Z();return}i?.addEventListener("abort",Z,{once:!0});try{try{await q.setMaxThinkingTokens(U),o.debug(`[AgentIDE] Claude setMaxThinkingTokens(${U??"null"}) ok`)}catch(Q){o.warn(`[AgentIDE] Claude setMaxThinkingTokens(${U??"null"}) failed: ${Q instanceof Error?Q.message:String(Q)}`)}await q.send(e);let x=0,ge=0,dt=0,oe=0,yt=0,Kt=0,qt=0,Yt=0,ss=new Set,vi=new Set,oo=new Set,ur=new Map,ca=new Map,ao=new Map,la=new Map,co=Q=>Q.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160),kr=(Q,M)=>{if(typeof M=="string")return M.trim()?M:void 0;if(!M||typeof M!="object")return;let ve=M,Re=ve.command;if(typeof Re=="string"&&Re.trim())return Re.trim();let je=ve.args;if(Array.isArray(je)&&je.every(Oe=>typeof Oe=="string"))return je.join(" ");let ue=ve.location,xe=ue&&typeof ue=="object"?ue.path:void 0,Ut=ve.path??ve.file_path??ve.file??ve.filename??xe,_t=[];typeof Ut=="string"&&Ut.trim()&&_t.push(Ut.trim());let nt=ve.content;typeof nt=="string"&&_t.push(`contentBytes=${Buffer.byteLength(nt,"utf8")}`);let de=ve.patch??ve.diff;if(typeof de=="string"&&_t.push(`patchBytes=${Buffer.byteLength(de,"utf8")}`),_t.length>0)return _t.join(" ");let $e=300,Jt=30,Ii=4,Is=(Oe,Xt)=>{if(typeof Oe=="string")return Oe.length>$e?`${Oe.slice(0,$e)}\u2026 (${Oe.length} chars)`:Oe;if(typeof Oe=="number"||typeof Oe=="boolean"||Oe===null)return Oe;if(Array.isArray(Oe)){if(Xt>=Ii)return`[Array(${Oe.length})]`;let wn=Oe.slice(0,Jt).map(an=>Is(an,Xt+1));return Oe.length>Jt?[...wn,`\u2026 (${Oe.length-Jt} more)`]:wn}if(typeof Oe=="object"&&Oe){if(Xt>=Ii)return"[Object]";let wn={};for(let[an,An]of Object.entries(Oe)){if(typeof An=="string"&&/content|text|data|body|patch|diff/i.test(an)&&An.length>$e){wn[an]=`<${Buffer.byteLength(An,"utf8")} bytes>`;continue}wn[an]=Is(An,Xt+1)}return wn}};try{let Oe=JSON.stringify(Is(M,0),null,2),Xt=Oe.trim();return Xt==="{}"||Xt==="[]"?void 0:Oe}catch{return}},lo=Q=>{if(!Q||typeof Q!="object")return;let M=Q,ve=M.type;if(ve==="tool_use"||ve==="server_tool_use"){let Re=M.id,je=M.name,ue=M.input;return typeof Re=="string"&&typeof je=="string"?{id:Re,name:je,input:ue}:void 0}if(ve==="mcp_tool_use"){let Re=M.id,je=M.name,ue=M.server_name,xe=M.input;if(typeof Re=="string"&&typeof je=="string"&&typeof ue=="string")return{id:Re,name:`${ue}.${je}`,input:xe}}},is=Q=>{if(typeof Q=="string")return Q;if(Q!=null)try{return JSON.stringify(Q,null,2)}catch{return String(Q)}},Un=Q=>{if(typeof Q=="string")return Q;if(Array.isArray(Q)){let M=[];for(let Re of Q){if(typeof Re=="string"){M.push(Re);continue}if(!Re||typeof Re!="object")continue;let je=Re;if(typeof je.text=="string"){M.push(je.text);continue}let ue=is(Re);ue&&M.push(ue)}return M.join(`
|
|
84
|
+
`).trim()||void 0}if(Q&&typeof Q=="object"){let M=Q;if(typeof M.text=="string")return M.text}return is(Q)},Ks=Q=>{if(!Q||typeof Q!="object")return;let M=Q,ve=M.type;if(ve!=="tool_result"&&ve!=="server_tool_result"&&ve!=="mcp_tool_result")return;let Re=M.tool_use_id;if(typeof Re!="string"||!Re)return;let je=Un(M.content??M.result??M.output??M.data??M.text),ue=typeof M.is_error=="boolean"?M.is_error:typeof M.isError=="boolean"?M.isError:void 0;return{toolUseId:Re,resultText:je,isError:ue}},vs=async(Q,M,ve)=>{if(!(!ss.has(M)||!!ve&&!vi.has(M))){ur.set(M,Q);return}Kt++,ss.add(M),ve&&vi.add(M),ur.set(M,Q),N||await r.toolStart(Q,ve,M)},Oi=async(Q,M,ve,Re)=>{if(oo.has(Q))return;let je=ur.get(Q)??Re??"tool";ss.has(Q)||await vs(je,Q),oo.add(Q),ur.delete(Q),N||await r.toolEnd(je,Q,M,ve)},ua=!1,Os=0;for await(let Q of q.receive()){Os++;let M=Q,ve=M.session_id;!ua&&ve&&(ua=!0,await(0,So.persistSessionIfNeeded)("claude",S,ve,n));let Re=M.type==="result"||M.type==="system"?M.subtype:void 0;if(o.debug(`[AgentIDE] Claude msg #${Os}: type=${M.type}, subtype=${Re||"none"}`),N&&M.type!=="result")continue;if(M.type==="stream_event"){let ue=M.event,xe=ue.type;if(xe==="content_block_start"){let Ut=ue.content_block,_t=Ut?.type,nt=ue.index;if(_t==="thinking"){let de=Ut?.thinking;dt++,typeof de=="string"&&de?(ge+=de.length,o.debug(`[AgentIDE] Claude thinking block start (${de.length} chars): ${co(de)}`),N||await r.thinking(de)):o.debug("[AgentIDE] Claude thinking block start (no initial thinking text)")}else if(_t==="redacted_thinking"){oe++;let de=Ut?.data;o.debug(`[AgentIDE] Claude redacted_thinking block start (dataType=${typeof de})`)}else{let de=Ks(ue.content_block);if(de){await Oi(de.toolUseId,de.resultText,de.isError);continue}let $e=lo(ue.content_block);if($e&&(yt++,typeof nt=="number"&&(ca.set(nt,$e.id),ao.set(nt,$e.name)),!ss.has($e.id))){let Jt=kr($e.name,$e.input);o.debug(`[AgentIDE] Claude tool_use start: ${$e.name} (id=${$e.id}, input=${Jt?"yes":"no"})`),await vs($e.name,$e.id,Jt)}}}else if(xe==="content_block_delta"){let Ut=ue.delta,_t=Ut.type,nt=Ut.thinking,de=Ut.text;if(_t==="thinking_delta"&&typeof nt=="string"&&nt)x++,ge+=nt.length,x<=3&&o.debug(`[AgentIDE] Claude thinking delta #${x} (${nt.length} chars): ${co(nt)}`),N||await r.thinking(nt);else if(_t==="input_json_delta"){let $e=ue.index,Jt=Ut.partial_json;if(typeof $e=="number"&&typeof Jt=="string"&&Jt){Yt++;let Is=(la.get($e)??"")+Jt;la.set($e,Is);let Oe=ca.get($e);if(Oe&&!vi.has(Oe))try{let Xt=JSON.parse(Is),wn=ao.get($e)??"tool",an=kr(wn,Xt);an&&(o.debug(`[AgentIDE] Claude tool_use input_json parsed: ${wn} (id=${Oe})`),await vs(wn,Oe,an))}catch{}}}else _t==="text_delta"&&typeof de=="string"&&de&&(v+=de,N||await r.text(de))}}else if(M.type==="assistant"){let ue=M.message.content;if(Array.isArray(ue))for(let xe of ue){let Ut=xe.type,_t=xe.text,nt=Ks(xe);if(nt){await Oi(nt.toolUseId,nt.resultText,nt.isError);continue}let de=lo(xe);if(de&&!ss.has(de.id)){yt++;let $e=kr(de.name,de.input);o.debug(`[AgentIDE] Claude tool_use (assistant msg): ${de.name} (id=${de.id}, input=${$e?"yes":"no"})`),await vs(de.name,de.id,$e);continue}Ut==="text"&&typeof _t=="string"&&_t&&(N||await A(_t))}}else if(M.type==="tool_progress"){qt++;let ue=M.tool_use_id,xe=M.tool_name||"tool";ue&&!ss.has(ue)&&(o.debug(`[AgentIDE] Claude tool_progress: ${xe} (tool_use_id=${ue})`),await vs(xe,ue))}else if(M.type==="system")M.subtype==="status"&&M.status==="compacting"&&(N||await r.progress("Compacting context\u2026"));else if(M.type==="result"){if(M.subtype==="success")N||await A(M.result);else if(!N)throw new Error(M.errors?.join(`
|
|
85
|
+
`)||M.subtype)}let je=M.message?.content;if(M.type!=="assistant"&&Array.isArray(je))for(let ue of je){let xe=Ks(ue);xe&&await Oi(xe.toolUseId,xe.resultText,xe.isError)}}for(let[Q,M]of Array.from(ur.entries()))await Oi(Q,"Completed",!1,M);o.info(`[AgentIDE] Claude thinking summary: startBlocks=${dt}, redactedBlocks=${oe}, deltas=${x}, chars=${ge}`),o.info(`[AgentIDE] Claude tool summary: toolBlocks=${yt}, toolEmits=${Kt}, toolProgressMsgs=${qt}, inputJsonDeltas=${Yt}`),dt===0&&x===0&&oe===0&&o.debug(`[AgentIDE] Claude emitted no thinking blocks/deltas. Ensure model supports extended thinking and set ${(0,LO.toSettingsDisplayKey)("agentide.claude.maxThinkingTokens")} >= 1024.`),yt===0&&qt===0&&o.debug("[AgentIDE] Claude emitted no tool usage events. If tools were used, ensure includePartialMessages=true and parse tool_use blocks."),(0,So.touchSessionIfNeeded)(S)}catch(x){if(!N)throw x;o.info(`[AgentIDE] Claude stream aborted: ${x instanceof Error?x.message:String(x)}`)}finally{i?.removeEventListener("abort",Z)}},{signal:i,timeoutMs:oc.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)}sweepIdleSessions(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())if(n-s.lastUsedAt>HO){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.agentideSignature===e.agentideSignature)return n.lastUsedAt=Date.now(),n.editTrackingState.aborted=!1,n.editTrackingState.pendingOperations.clear(),(0,oc.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);try{n.session.close()}catch{}this.activeSessions.delete(e.conversationKey)}!r&&!e.isEphemeral&&(r=(0,So.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 import("@anthropic-ai/claude-agent-sdk"),o={session:VO({resumeSessionId:r,queryFn:s.query,options:e.queryOptions}),chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,agentideSignature:e.agentideSignature,modelId:e.modelId,cheapModel:e.cheapModel,lastUsedAt:Date.now(),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,Hh.loadMcpServers)(r,n,i);if(o.length===0)return{};let a={};for(let l of o){if(l.url){let f=(0,Hh.referenceHttpMcpHeaders)(l,s??process.env);a[l.name]={type:"http",url:l.url,...f?{headers:f}:{}};continue}a[l.name]={command:l.command,args:l.args,...l.env&&Object.keys(l.env).length>0?{env:l.env}:{}}}let c=r==="default"?"bundled":`pack:${r}`;return e.debug(`[AgentIDE] Claude MCP servers loaded (${c}): ${o.map(l=>l.name).join(", ")}`),a}};Gr.ClaudeEngine=Ru});var ku=T(gn=>{"use strict";var WO=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]})),KO=gn&&gn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qO=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"&&WO(n,e,r[s]);return KO(n,e),n}})();Object.defineProperty(gn,"__esModule",{value:!0});gn.syncPackMcpToWorkspace=Wh;gn.syncPackToWorkspace=tI;gn.computeSkillsSignature=Kh;gn.createSkillsSignatureGetter=nI;gn.createSessionDir=rI;gn.getSessionDir=sI;var We=require("fs"),J=qO(require("path")),Fh=require("crypto"),Ee=Zt(),YO=Pa(),ke=jn(),Vh=Zs(),JO=go(),XO=Cs();async function Wh(t,e,n,r){let s=J.join(t,ke.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,Ee.pathExists)(s))return;let i;try{i=await(0,Vh.loadAgentManifest)(s)}catch(u){Rt(r,`[AgentIDE] Skipping pack MCP sync for ${n}: ${u instanceof Error?u.message:String(u)}`);return}let o=i.spec?.mcp;if(!o?.length)return;let a=J.join(e,ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ke.AGENT_CONSTANTS.AGENTS_DIR,n,ke.AGENT_CONSTANTS.MCP_DIR);await We.promises.mkdir(a,{recursive:!0});let c={mcpServers:{}},l=J.join(a,".mcp.json");for(let u of o){let d=u.config?.trim();if(!d)continue;let p=J.resolve(t,d);if(!Cu(t,p)){Rt(r,`[AgentIDE] Skipping MCP config ${d}: path escapes pack root`);continue}if(!await(0,Ee.pathExists)(p)){Rt(r,`[AgentIDE] Skipping MCP config ${d}: file not found`);continue}try{let m=JSON.parse(await We.promises.readFile(p,"utf8")).mcpServers;m&&typeof m=="object"&&Object.assign(c.mcpServers,m)}catch(g){Rt(r,`[AgentIDE] Skipping MCP config ${d}: ${g instanceof Error?g.message:String(g)}`)}}let f=J.join(t,ke.AGENT_CONSTANTS.MCP_DIR);if(await(0,Ee.pathExists)(f)){let u=await We.promises.readdir(f,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||d.name.startsWith("."))continue;let p=J.join(f,d.name),g=J.join(a,d.name);await(0,Ee.pathExists)(g)||await(0,Ee.copyDirRecursive)(p,g)}}!c.mcpServers||Object.keys(c.mcpServers).length===0||(await(0,Ee.writeFileIfChanged)(l,`${JSON.stringify(c,null,2)}
|
|
86
|
+
`),Rt(r,`[AgentIDE] Synced pack MCP config: ${l}`))}function Bh(t){return!(!t||!t.trim()||J.isAbsolute(t)||/^(https?:\/\/|git@|ssh:\/\/)/i.test(t))}function Cu(t,e){let n=J.relative(t,e);return n!==".."&&!n.startsWith(`..${J.sep}`)&&!J.isAbsolute(n)}async function zO(t){return(await We.promises.readdir(t)).length===0}async function QO(t,e,n,r){let s=J.join(e,ke.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,Ee.pathExists)(s))try{let o=(await(0,Vh.loadAgentManifest)(s)).spec?.data;if(!o)return;let a=o.sourcePath?.trim()||"./data",c=(o.workspacePath?.trim()||`.${J.sep}${ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}${J.sep}data${J.sep}${n}`).replace(/^(?:\.\/|\.\\)/,"");if(!Bh(a)||!Bh(c)){Rt(r,`[AgentIDE] Skipping data sync for ${n}: invalid spec.data paths`);return}let l=J.resolve(e,a),f=J.resolve(t,c);if(!Cu(e,l)||!Cu(t,f)){Rt(r,`[AgentIDE] Skipping data sync for ${n}: path escapes allowed root`);return}if(!await(0,Ee.pathExists)(l))return;if(!await(0,Ee.pathExists)(f)){await(0,Ee.copyDirRecursive)(l,f),Rt(r,`[AgentIDE] Seeded pack data for ${n}: ${f}`);return}(await We.promises.stat(f)).isDirectory()&&await zO(f)&&(await(0,Ee.copyDirRecursive)(l,f),Rt(r,`[AgentIDE] Seeded pack data for ${n}: ${f}`))}catch(i){Rt(r,`[AgentIDE] Skipping data sync for ${n}: ${i instanceof Error?i.message:String(i)}`)}}async function ZO(t){let e=J.join(t,"SKILL.md");try{if((await We.promises.lstat(e)).isSymbolicLink()){let r=await We.promises.readlink(e),s=J.isAbsolute(r)?r:J.resolve(J.dirname(e),r);if(J.resolve(s)===J.resolve(e))return!1}return await We.promises.access(e),!0}catch{return!1}}async function eI(t,e,n){let r=J.join(t,"skills");if(!await(0,Ee.pathExists)(r))return;await We.promises.mkdir(e,{recursive:!0});let s=await We.promises.readdir(r,{withFileTypes:!0});for(let i of s){if(!i.isDirectory())continue;let o=J.join(e,i.name);await(0,Ee.pathExists)(o)&&await ZO(o)||(await(0,Ee.pathExists)(o)&&await We.promises.rm(o,{recursive:!0,force:!0}),await(0,Ee.copyDirRecursive)(J.join(r,i.name),o),Rt(n,`[AgentIDE] Bootstrapped bundled skill: ${i.name}`))}}async function tI(t,e,n,r,s,i){let o=YO.AGENT_ENGINES[r],a=o?{workspaceDir:o.workspaceDir,rulesFile:o.rulesFile,includeSkills:!0,includeRules:!0}:(()=>{let A=(0,XO.tryResolveCustomEngineManifest)(t,r);if(!A)throw new Error(`Unknown engine: ${r}`);if(A.workspaceSync?.enabled)return{workspaceDir:A.workspaceSync.dir,rulesFile:A.workspaceSync.rulesFile,includeSkills:A.workspaceSync.includeSkills,includeRules:A.workspaceSync.includeRules}})(),c=J.join(e,"AGENTS.md"),l=J.join(e,"context.md"),f=J.join(e,"skills"),u=J.join(e,"rules");await(0,Ee.ensureWorkspaceGitAndGitignore)(t,s);let d=J.join(t,ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ke.AGENT_CONSTANTS.AGENTS_DIR,n);if(await We.promises.mkdir(d,{recursive:!0}),await(0,Ee.pathExists)(c)){let A=await We.promises.readFile(c,"utf8");await(0,Ee.writeFileIfChanged)(J.join(d,ke.AGENT_CONSTANTS.AGENTS_MD),A)}if(await(0,Ee.pathExists)(l)){let A=await We.promises.readFile(l,"utf8");await(0,Ee.writeFileIfChanged)(J.join(d,ke.AGENT_CONSTANTS.CONTEXT_MD),A)}let p=J.join(e,ke.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,Ee.pathExists)(p)){let A=await We.promises.readFile(p,"utf8");await(0,Ee.writeFileIfChanged)(J.join(d,ke.AGENT_CONSTANTS.GHOST_TEXT_FILE),A),Rt(s,`[AgentIDE] Synced GHOST_TEXT.md to ${ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}`)}let g=J.join(d,ke.AGENT_CONSTANTS.SKILLS_DIR),m=J.resolve(f),h=J.resolve(g);await(0,Ee.pathExists)(f)&&(m===h?Rt(s,`[AgentIDE] Skipping skills self-sync (pack already under ${ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n})`):(await(0,Ee.syncDirByFileLinks)(f,g,s,`${ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n}/skills`),Rt(s,`[AgentIDE] Synced skills to ${ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}: ${g}`))),i&&await eI(i,g,s);let E=J.join(d,ke.AGENT_CONSTANTS.RULES_DIR);if(await(0,Ee.pathExists)(u)){await We.promises.mkdir(E,{recursive:!0});let A=await We.promises.readdir(u,{withFileTypes:!0});for(let S of A){if(!S.isFile()||!S.name.toLowerCase().endsWith(".md"))continue;let I=J.join(u,S.name),U=J.join(E,S.name);await(0,Ee.symlinkOrCopyFile)(I,U,s,`rules/${S.name}`,{force:!0})}}if(n===ke.AGENT_CONSTANTS.DEFAULT_AGENT_ID&&i){let A=await(0,JO.getDefaultMcpConfig)(i);if(A){let S=J.join(d,ke.AGENT_CONSTANTS.MCP_DIR);await We.promises.mkdir(S,{recursive:!0});let I=J.join(S,".mcp.json");await(0,Ee.writeFileIfChanged)(I,A),Rt(s,`[AgentIDE] Synced MCP config: ${I}`)}}if(await Wh(e,t,n,s),await QO(t,e,n,s),!a)return;let y=J.join(t,a.workspaceDir);await We.promises.mkdir(y,{recursive:!0});let w="";if(await(0,Ee.pathExists)(c)&&(w=await We.promises.readFile(c,"utf8")),await(0,Ee.pathExists)(l)){let A=await We.promises.readFile(l,"utf8");w=w.trimEnd()+`
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
90
90
|
`+A.trimEnd()+`
|
|
91
|
-
`}let P=
|
|
91
|
+
`}let P=J.join(y,a.rulesFile);w&&(await(0,Ee.writeFileIfChanged)(P,w),Rt(s,`[AgentIDE] Synced rules: ${P}`));let b=J.join(y,"skills");a.includeSkills&&await(0,Ee.pathExists)(g)&&await(0,Ee.syncDirByFileLinks)(g,b,s,`${a.workspaceDir}/skills`);let v=J.join(y,"rules");if(a.includeRules&&await(0,Ee.pathExists)(u)){await We.promises.mkdir(v,{recursive:!0});let A=await We.promises.readdir(u,{withFileTypes:!0});for(let S of A){if(!S.isFile()||!S.name.toLowerCase().endsWith(".md"))continue;let I=J.join(u,S.name),U=J.join(v,S.name);await(0,Ee.symlinkOrCopyFile)(I,U,s,`rules/${S.name}`,{force:!0})}}Rt(s,`[AgentIDE] Pack '${n}' synced to workspace: ${t}`)}function Kh(t,e){let n=J.join(t,ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ke.AGENT_CONSTANTS.AGENTS_DIR,e,ke.AGENT_CONSTANTS.SKILLS_DIR);try{let r=require("fs");if(!r.existsSync(n))return;let s=(0,Fh.createHash)("sha256"),i=r.readdirSync(n,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||o.name.startsWith("."))continue;let a=J.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 nI(t){return e=>Kh(e,t)}async function rI(t){let e=(0,Fh.randomUUID)(),n=J.join(t,ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ke.AGENT_CONSTANTS.SESSIONS_DIR,e);return await We.promises.mkdir(n,{recursive:!0}),e}function sI(t,e){return J.join(t,ke.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ke.AGENT_CONSTANTS.SESSIONS_DIR,e)}function Rt(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}});var bo=T(pt=>{"use strict";var iI=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]})),oI=pt&&pt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Jh=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"&&iI(n,e,r[s]);return oI(n,e),n}})();Object.defineProperty(pt,"__esModule",{value:!0});pt.ObservableStreamEmitter=pt.SessionEventWriter=pt.EVIDENCE_REQUIRED_ENV=void 0;pt.getSessionEventWriterStats=lI;pt.resetSessionEventWriterStatsForTest=uI;pt.evidenceRequired=Xh;pt.wrapEmitterWithObservability=dI;var qh=Jh(require("path")),Yh=require("fs"),aI=Ye(),cI=Jh(require("os")),$u=Ri(),Ur={written:0,failed:0};function lI(){return{written:Ur.written,failed:Ur.failed,lastError:Ur.lastError}}function uI(){Ur.written=0,Ur.failed=0,Ur.lastError=void 0}pt.EVIDENCE_REQUIRED_ENV="AGENTHIPPO_EVIDENCE_REQUIRED";function Xh(t=process.env){let e=(t[pt.EVIDENCE_REQUIRED_ENV]??"").trim().toLowerCase();return e==="1"||e==="true"||e==="yes"||e==="on"}var Du=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??qh.join(cI.homedir(),aI.AGENTIDE_DIR_NAME,"analytics","sessions")}async append(e,n,r,s){try{let i=this.sanitizeSessionId(e);this.ensuredDirs.has(i)||(await Yh.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=qh.join(this.baseDir,`${i}.jsonl`),c=JSON.stringify(o)+`
|
|
92
92
|
`;await Yh.promises.appendFile(a,c),this.written++,Ur.written++}catch(i){let o=i instanceof Error?i.message:String(i);this.failed++,Ur.failed++;let a={at:Date.now(),message:o,eventType:r};if(this.lastError=a,Ur.lastError=a,console.error(`[evidence] LOST session event ${r} (session=${e} request=${n}): ${o} \u2014 ${Ur.failed} evidence write(s) lost since start`),Xh())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=Du;var cc=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,$u.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,$u.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,$u.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=cc;function dI(t,e,n,r,s,i){return new cc(t,e,n,r,s,i)}});var lc=T(oi=>{"use strict";Object.defineProperty(oi,"__esModule",{value:!0});oi.encodeRunnerEvent=fI;oi.encodeWorkerRequest=pI;oi.parseWorkerOutbound=gI;oi.applyRunnerEvent=hI;oi.applyParsedRunnerEvent=zh;function fI(t){return`${JSON.stringify(t)}
|
|
93
93
|
`}function pI(t){return`${JSON.stringify(t)}
|
|
94
94
|
`}function gI(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 hI(t,e){let n;try{n=JSON.parse(e)}catch{return}return zh(t,n)}async function zh(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 Qh=T(uc=>{"use strict";Object.defineProperty(uc,"__esModule",{value:!0});uc.PersistentEngineWorkerPool=void 0;var mI=require("node:child_process"),EI=require("node:readline"),Lu=lc(),yI=1e3*60*30,_I=1e3*60,wI=1e3*30,AI=1e3*10,Mu=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,mI.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??wI;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,EI.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,Lu.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,Lu.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(),_I),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,Lu.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??AI),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??yI)}},Gu=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 Mu(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}};uc.PersistentEngineWorkerPool=Gu});var Zh=T(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=Di.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH=void 0;Di.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH="fe3840b3a767b36e";Di.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=`"use strict";
|
|
@@ -410,13 +410,13 @@ else {
|
|
|
410
410
|
});
|
|
411
411
|
}
|
|
412
412
|
`});var Uu=T(jt=>{"use strict";var SI=jt&&jt.__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]})),bI=jt&&jt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),TI=jt&&jt.__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"&&SI(n,e,r[s]);return bI(n,e),n}})();Object.defineProperty(jt,"__esModule",{value:!0});jt.NODE_RUNNER_FILENAME=void 0;jt.ensureNodeRunnerScriptPath=II;jt.embeddedRunnerContentHash=PI;var vI=require("node:crypto"),Li=require("node:fs"),$s=TI(require("node:path")),OI=Js();jt.NODE_RUNNER_FILENAME="run-custom-engine-runner.js";async function em(){return Promise.resolve().then(()=>Sn(Zh()))}async function II(){let t=[],e=process.argv[1];e&&t.push($s.join($s.dirname(e),jt.NODE_RUNNER_FILENAME)),t.push($s.join($s.dirname(process.execPath),jt.NODE_RUNNER_FILENAME));for(let o of t)try{return await Li.promises.access(o),o}catch{}let{EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH:n,EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:r}=await em(),s=$s.join((0,OI.getAgentideHome)(),"cache","cli"),i=$s.join(s,`${jt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-${n}.js`);try{if(await Li.promises.readFile(i,"utf8")===r)return i}catch{}await Li.promises.mkdir(s,{recursive:!0}),await Li.promises.writeFile(i,r,"utf8");try{let o=`${jt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-`;for(let a of await Li.promises.readdir(s))a.startsWith(o)&&a.endsWith(".js")&&$s.join(s,a)!==i&&await Li.promises.unlink($s.join(s,a)).catch(()=>{})}catch{}return i}async function PI(){let{EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:t}=await em();return(0,vI.createHash)("sha256").update(t).digest("hex")}});var Bu=T(hn=>{"use strict";var NI=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]})),RI=hn&&hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),CI=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"&&NI(n,e,r[s]);return RI(n,e),n}})();Object.defineProperty(hn,"__esModule",{value:!0});hn.CustomEngine=void 0;hn.resolveCustomEngineLoadStrategy=tm;hn.deliverModelRoutingEnv=nm;hn.buildRunnerChildEnv=xu;hn.probeCustomEngineImport=FI;var kI=require("node:child_process"),$I=require("node:readline"),vo=require("fs"),bt=CI(require("path")),DI=require("url"),To=Qs(),LI=Er(),MI=Cs(),ls=jn(),GI=Ns(),dc=Zt(),fc=ec(),UI=lc(),HI=Qh(),Hu=zs(),pc=go(),jI=1e3*60*30;function tm(){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 xI(t){let e=t.engineId?.trim();if(e&&e!=="claude"&&e!=="codex")return e}function BI(t){return t.configProvider?.get("agentide","additionalEngineDir")}function gc(t,e){let n=bt.join(e,"node_modules"),r=t.NODE_PATH?.trim();t.NODE_PATH=r?`${n}${bt.delimiter}${r}`:n}function nm(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 xu(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"};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,pc.serializeInlineMcpServers)(e.mcpServers):void 0;return s&&(r[pc.AGENTHIPPO_MCP_SERVERS_ENV]=s),gc(r,t.manifestDir),r}async function rm(t,e,n,r,s){let i;try{let{ensureNodeRunnerScriptPath:c}=await Promise.resolve().then(()=>Sn(Uu()));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,fc.resolveNodeBinary)();e.runtime.logger.info(`[AgentIDE] Custom engine Node runner: ${o}`);let a=xu(t,e,r);return process.platform==="win32"&&o===process.execPath&&!o.toLowerCase().endsWith("\\node.exe")&&(a.ELECTRON_RUN_AS_NODE="1"),(0,fc.prependPathDir)(a,bt.dirname(o)),new Promise((c,l)=>{let f=(0,kI.spawn)(o,[i],{cwd:t.manifestDir,env:a,stdio:["ignore","pipe","pipe"]}),u="",d,p=Promise.resolve(),g=(0,$I.createInterface)({input:f.stdout});g.on("line",h=>{p=p.then(async()=>{let E=await(0,UI.applyRunnerEvent)(n,h);E&&(d=E)}).catch(E=>{g.close(),f.kill(),l(E)})}),f.stderr?.on("data",h=>{u+=String(h)});let m=()=>{f.kill("SIGTERM")};s?.addEventListener("abort",m,{once:!0}),f.on("error",l),f.on("close",h=>{s?.removeEventListener("abort",m),g.close(),p.finally(()=>{if(h===0)c(d?{nativeSessionId:d}:void 0);else{let E=u.trim()||`Custom engine Node runner exited with code ${h}`;l(new Error(E))}})})})}async function FI(t,e){try{if(e==="in-process")return await sm(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 rm(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 sm(t){let{entryPath:e,id:n,engineExport:r}=t;try{await vo.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),gc(process.env,t.manifestDir);let o=await vo.promises.stat(e).catch(()=>{}),a=`${(0,DI.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 u=r?`"${r}"`:"default export";throw new Error(`Custom engine "${n}": ${u} not found in ${e}. Export a class or object with a run(turn) method.`)}let f=typeof l=="function"?new l:l;return VI(n,f),f}finally{process.chdir(s),i===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=i}}function VI(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 WI(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160)||"session"}function KI(t){let e=[];t.session.contextFilePath&&e.push(`context_file: ${bt.relative(t.workspaceRoot,t.session.contextFilePath)}`),t.session.terminalLogPath&&e.push(`terminal_log: ${bt.relative(t.workspaceRoot,t.session.terminalLogPath)}`),t.session.attachmentsDir&&e.push(`attachments_dir: ${bt.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(`
|
|
413
|
-
`)}var qI=5e3,ju=class{config;getBundledBasePromptsDir;id="custom";displayName="Custom Engine";instances=new Map;activeSessions=new Map;mtimeCache=new Map;workerPool=new HI.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<qI)return r.mtime;let s=(await vo.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=xI(n),a=(0,MI.resolveCustomEngineManifest)(n.workspaceRoot,o,BI(s),(f,u)=>s.logger.warn(`[AgentIDE] Skipping malformed custom engine manifest ${f}: ${u instanceof Error?u.message:String(u)}`)),c=`custom:${a.id}`,l=(0,Hu.buildConversationKey)(c,n);await(0,Hu.withConversationLock)(l.key,async()=>{let f=tm(),u=await this.buildTurn(a,e,n,r,s,l.key,l.chatSessionId,l.isEphemeral,i);s.logger.info(`[AgentIDE] Custom engine "${a.id}" strategy=${f} entry=${a.entryPath}`);let d;if(f==="in-process"){let{engine:m}=await this.getOrLoadInstance(a,s),h=process.cwd(),E=process.env.NODE_PATH;try{process.chdir(a.manifestDir),gc(process.env,a.manifestDir),d=await m.run(u)}finally{process.chdir(h),E===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=E}}else f==="persistent-worker"?d=await this.runViaPersistentWorker(a,u,r,i):d=await rm(a,u,r,!1,i);let p=d?.nativeSessionId?.trim(),g=p||u.session.nativeSessionId;this.activeSessions.set(l.key,{nativeSessionId:g,lastUsedAt:Date.now()}),p?await(0,To.persistSessionIfNeeded)(c,l,p,n):(0,To.touchSessionIfNeeded)(l)},{signal:i,timeoutMs:Hu.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 sm(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(()=>Sn(Uu())),o=await i(),a=await(0,fc.resolveNodeBinary)();n.runtime.logger.info(`[AgentIDE] Custom engine persistent worker: ${a}`);let c=xu(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,fc.prependPathDir)(l,bt.dirname(a));let f=await this.buildCacheKey(e);return this.workerPool.run({cacheKey:f,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 f=r.modelId?.trim()||e.model?.defaultModel?.trim();if(!f)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 u=r.agentPackId??ls.AGENT_CONSTANTS.DEFAULT_AGENT_ID,d=r.contextSessionId?.trim()||r.sessionId?.trim()||a,p=WI(d),g=this.config.customEnginesStoragePath??bt.join(this.config.storagePath,ls.AGENT_CONSTANTS.AGENTS_DIR,u,"custom"),m=bt.join(g,e.id),h=(0,ls.userScopedEngineHomeFromKey)(bt.join(m,"home"),(0,GI.resolveEngineHomeUserKey)(r.engineHomeUserKey)),E=bt.join(m,ls.AGENT_CONSTANTS.SESSIONS_DIR,p);await vo.promises.mkdir(h,{recursive:!0}),await vo.promises.mkdir(E,{recursive:!0});let y=bt.join(r.workspaceRoot,ls.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ls.AGENT_CONSTANTS.SESSIONS_DIR,d),w=bt.join(y,ls.AGENT_CONSTANTS.CONTEXT_MD),P=bt.join(y,"terminal.md"),b=bt.join(y,"attachments"),v=this.activeSessions.get(o)?.nativeSessionId??(0,To.getPersistedSessionId)(`custom:${e.id}`,o),A=(0,dc.resolveApiRouting)(r,this.config,(0,dc.inferModelProvider)(r.modelId),i.configProvider),S=A.apiKey?.trim()||void 0,I=A.baseUrl?.trim()||void 0,U=A.openaiBaseUrl?.trim()||void 0,O=e.workspaceSync?.enabled?bt.join(r.workspaceRoot,e.workspaceSync.dir,e.workspaceSync.rulesFile):void 0,F=e.workspaceSync?.enabled&&e.workspaceSync.includeSkills?bt.join(r.workspaceRoot,e.workspaceSync.dir,ls.AGENT_CONSTANTS.SKILLS_DIR):void 0,
|
|
414
|
-
`))}r.agentPackVersion&&(W.AGENTHIPPO_AGENT_VERSION=r.agentPackVersion,W.AGENTIDE_AGENT_VERSION=r.agentPackVersion),e.homeEnvVar&&(W[e.homeEnvVar]=h),nm(W,e,{apiKey:S,baseUrl:I,openaiBaseUrl:U},process.env,i.logger),(I&&(0,dc.applyLocalTlsBypass)(W,I)||U&&U!==I&&(0,dc.applyLocalTlsBypass)(W,U))&&i.logger.info(`[AgentIDE] Disabling TLS verification for local HTTPS (${e.id})`);let pe=A.useLiteLLM?"LiteLLM proxy":I?"custom provider":"native provider";i.logger.info(`[AgentIDE] Custom engine "${e.id}" routing: ${pe}, baseUrl=${I||"default"}, model=${f}`);let me=await(0,pc.loadMcpServers)(u,r.workspaceRoot,this.getBundledBasePromptsDir()),z=(0,pc.formatInlineMcpServers)(me,W);me.length>0&&i.logger.debug(`[AgentIDE] Custom engine "${e.id}" MCP (${u}): ${me.map(Me=>Me.name).join(", ")}`);let
|
|
413
|
+
`)}var qI=5e3,ju=class{config;getBundledBasePromptsDir;id="custom";displayName="Custom Engine";instances=new Map;activeSessions=new Map;mtimeCache=new Map;workerPool=new HI.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<qI)return r.mtime;let s=(await vo.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=xI(n),a=(0,MI.resolveCustomEngineManifest)(n.workspaceRoot,o,BI(s),(f,u)=>s.logger.warn(`[AgentIDE] Skipping malformed custom engine manifest ${f}: ${u instanceof Error?u.message:String(u)}`)),c=`custom:${a.id}`,l=(0,Hu.buildConversationKey)(c,n);await(0,Hu.withConversationLock)(l.key,async()=>{let f=tm(),u=await this.buildTurn(a,e,n,r,s,l.key,l.chatSessionId,l.isEphemeral,i);s.logger.info(`[AgentIDE] Custom engine "${a.id}" strategy=${f} entry=${a.entryPath}`);let d;if(f==="in-process"){let{engine:m}=await this.getOrLoadInstance(a,s),h=process.cwd(),E=process.env.NODE_PATH;try{process.chdir(a.manifestDir),gc(process.env,a.manifestDir),d=await m.run(u)}finally{process.chdir(h),E===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=E}}else f==="persistent-worker"?d=await this.runViaPersistentWorker(a,u,r,i):d=await rm(a,u,r,!1,i);let p=d?.nativeSessionId?.trim(),g=p||u.session.nativeSessionId;this.activeSessions.set(l.key,{nativeSessionId:g,lastUsedAt:Date.now()}),p?await(0,To.persistSessionIfNeeded)(c,l,p,n):(0,To.touchSessionIfNeeded)(l)},{signal:i,timeoutMs:Hu.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 sm(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(()=>Sn(Uu())),o=await i(),a=await(0,fc.resolveNodeBinary)();n.runtime.logger.info(`[AgentIDE] Custom engine persistent worker: ${a}`);let c=xu(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,fc.prependPathDir)(l,bt.dirname(a));let f=await this.buildCacheKey(e);return this.workerPool.run({cacheKey:f,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 f=r.modelId?.trim()||e.model?.defaultModel?.trim();if(!f)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 u=r.agentPackId??ls.AGENT_CONSTANTS.DEFAULT_AGENT_ID,d=r.contextSessionId?.trim()||r.sessionId?.trim()||a,p=WI(d),g=this.config.customEnginesStoragePath??bt.join(this.config.storagePath,ls.AGENT_CONSTANTS.AGENTS_DIR,u,"custom"),m=bt.join(g,e.id),h=(0,ls.userScopedEngineHomeFromKey)(bt.join(m,"home"),(0,GI.resolveEngineHomeUserKey)(r.engineHomeUserKey)),E=bt.join(m,ls.AGENT_CONSTANTS.SESSIONS_DIR,p);await vo.promises.mkdir(h,{recursive:!0}),await vo.promises.mkdir(E,{recursive:!0});let y=bt.join(r.workspaceRoot,ls.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,ls.AGENT_CONSTANTS.SESSIONS_DIR,d),w=bt.join(y,ls.AGENT_CONSTANTS.CONTEXT_MD),P=bt.join(y,"terminal.md"),b=bt.join(y,"attachments"),v=this.activeSessions.get(o)?.nativeSessionId??(0,To.getPersistedSessionId)(`custom:${e.id}`,o),A=(0,dc.resolveApiRouting)(r,this.config,(0,dc.inferModelProvider)(r.modelId),i.configProvider),S=A.apiKey?.trim()||void 0,I=A.baseUrl?.trim()||void 0,U=A.openaiBaseUrl?.trim()||void 0,O=e.workspaceSync?.enabled?bt.join(r.workspaceRoot,e.workspaceSync.dir,e.workspaceSync.rulesFile):void 0,F=e.workspaceSync?.enabled&&e.workspaceSync.includeSkills?bt.join(r.workspaceRoot,e.workspaceSync.dir,ls.AGENT_CONSTANTS.SKILLS_DIR):void 0,se=e.workspaceSync?.enabled&&e.workspaceSync.includeRules?bt.join(r.workspaceRoot,e.workspaceSync.dir,ls.AGENT_CONSTANTS.RULES_DIR):void 0,W={...process.env,...i.cliEnvPatch??{},AGENTHIPPO_ENGINE_ID:e.id,AGENTHIPPO_ENGINE_HOME:h,AGENTHIPPO_ENGINE_SESSION_DIR:E,AGENTHIPPO_CONTEXT_SESSION_ID:d,AGENTHIPPO_CONTEXT_EXPORT_PATH:w,AGENTHIPPO_TERMINAL_LOG_PATH:P,AGENTHIPPO_ATTACHMENTS_DIR:b,AGENTHIPPO_ACTIVE_AGENT:u,AGENT_ID:u,AGENTHIPPO_MODEL_ID:f,AGENTHIPPO_USE_LITELLM:A.useLiteLLM?"true":"false"};if(delete W[LI.OPENCLAW_GATEWAY_TOKEN_ENV],delete W.AGENTHIPPO_DATA_PLANE_TOKEN,gc(W,e.manifestDir),S&&(W.AGENTHIPPO_API_KEY=S),I&&(W.AGENTHIPPO_BASE_URL=I),U&&(W.AGENTHIPPO_OPENAI_BASE_URL=U),A.useLiteLLM){W.AGENTHIPPO_LITELLM_API_KEY=S??"sk-dummy",W.AGENTIDE_LITELLM_API_KEY=S??"sk-dummy",I&&(W.AGENTHIPPO_LITELLM_BASE_URL=I,W.AGENTIDE_LITELLM_BASE_URL=I);let Me=(0,To.buildLiteLLMMetadataHeaders)(!0,{sessionId:r.sessionId,analyticsUserId:r.analyticsUserId,analyticsProjectId:(0,To.resolveAnalyticsProjectId)(r.analyticsProjectId,r.workspaceRoot),agentId:u,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});Me.length>0&&(W.AGENTHIPPO_LITELLM_METADATA_HEADERS=Me.join(`
|
|
414
|
+
`))}r.agentPackVersion&&(W.AGENTHIPPO_AGENT_VERSION=r.agentPackVersion,W.AGENTIDE_AGENT_VERSION=r.agentPackVersion),e.homeEnvVar&&(W[e.homeEnvVar]=h),nm(W,e,{apiKey:S,baseUrl:I,openaiBaseUrl:U},process.env,i.logger),(I&&(0,dc.applyLocalTlsBypass)(W,I)||U&&U!==I&&(0,dc.applyLocalTlsBypass)(W,U))&&i.logger.info(`[AgentIDE] Disabling TLS verification for local HTTPS (${e.id})`);let pe=A.useLiteLLM?"LiteLLM proxy":I?"custom provider":"native provider";i.logger.info(`[AgentIDE] Custom engine "${e.id}" routing: ${pe}, baseUrl=${I||"default"}, model=${f}`);let me=await(0,pc.loadMcpServers)(u,r.workspaceRoot,this.getBundledBasePromptsDir()),z=(0,pc.formatInlineMcpServers)(me,W);me.length>0&&i.logger.debug(`[AgentIDE] Custom engine "${e.id}" MCP (${u}): ${me.map(Me=>Me.name).join(", ")}`);let Ne=n,qe={message:Ne,modelId:f,workspaceRoot:r.workspaceRoot,additionalDirectories:r.additionalDirectories??[],permissions:r.permissions??{fileAccess:"workspace-write"},env:W,routing:{useLiteLLM:A.useLiteLLM,...S?{apiKey:S}:{},...I?{baseUrl:I}:{},...U?{openaiBaseUrl:U}:{}},session:{key:o,chatSessionId:a,contextSessionId:d,isEphemeral:c,engineHomeDir:h,engineSessionDir:E,nativeSessionId:v,contextFilePath:w,terminalLogPath:P,attachmentsDir:b},agent:{id:u,version:r.agentPackVersion,rulesFilePath:O,skillsDir:F,rulesDir:se},...Object.keys(z).length>0?{mcpServers:z}:{},emitter:s,runtime:{...i,invalidateEngineInstance:()=>this.clearInstances(e.id)},signal:l};if(e.promptInjection.mode==="message-suffix"){let Me=KI(qe);Me&&(Ne=`${n}
|
|
415
415
|
|
|
416
|
-
${Me}`,Ke.message=Pe)}return Ke}onMaintenance(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())n-s.lastUsedAt>jI&&(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()}};hn.CustomEngine=ju});var ai=T(ce=>{"use strict";var YI=ce&&ce.__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]})),JI=ce&&ce.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),XI=ce&&ce.__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"&&YI(n,e,r[s]);return JI(n,e),n}})();Object.defineProperty(ce,"__esModule",{value:!0});ce.resolveModelAlias=ce.getSessionDir=ce.createSessionDir=ce.computeSkillsSignature=ce.syncPackToWorkspace=ce.initSessionStoreWithStore=ce.CLIPermissionHandler=ce.AutoApprovePermissionHandler=ce.DirectorySessionStore=ce.FileSessionStore=ce.MemorySessionStore=ce.StaticConfigProvider=ce.NoOpEditTracker=ce.NoOpLogger=ce.ConsoleLogger=void 0;ce.createHeadlessRunner=Fu;ce.createEvalRunner=aP;ce.createCLIRunner=cP;var im=XI(require("path")),zI=Gh(),QI=xh(),ZI=Qs(),Ct=ru();Object.defineProperty(ce,"ConsoleLogger",{enumerable:!0,get:function(){return Ct.ConsoleLogger}});Object.defineProperty(ce,"NoOpLogger",{enumerable:!0,get:function(){return Ct.NoOpLogger}});Object.defineProperty(ce,"NoOpEditTracker",{enumerable:!0,get:function(){return Ct.NoOpEditTracker}});Object.defineProperty(ce,"StaticConfigProvider",{enumerable:!0,get:function(){return Ct.StaticConfigProvider}});Object.defineProperty(ce,"MemorySessionStore",{enumerable:!0,get:function(){return Ct.MemorySessionStore}});Object.defineProperty(ce,"FileSessionStore",{enumerable:!0,get:function(){return Ct.FileSessionStore}});Object.defineProperty(ce,"DirectorySessionStore",{enumerable:!0,get:function(){return Ct.DirectorySessionStore}});Object.defineProperty(ce,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return Ct.AutoApprovePermissionHandler}});Object.defineProperty(ce,"CLIPermissionHandler",{enumerable:!0,get:function(){return Ct.CLIPermissionHandler}});var om=zs(),eP=ku(),am=bo(),tP=Er(),nP=Ns(),rP=Js();function sP(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 Fu(t){if(t.freshState){let y=new Ct.MemorySessionStore;(0,om.initSessionStoreWithStore)(y)}else(0,om.initSessionStoreWithStore)(new Ct.DirectorySessionStore(im.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 Ct.ConsoleLogger("[AgentIDE]"),s=t.editTracker??new Ct.NoOpEditTracker,i=new Ct.StaticConfigProvider({},t.customProviders??{},t.engineSettings??{}),o=t.permissionHandler??new Ct.AutoApprovePermissionHandler,a={logger:r,editTracker:s,configProvider:i,permissionHandler:o,cliEnvPatch:t.cliEnvPatch},c=t.packId??"default",l=y=>(0,eP.computeSkillsSignature)(y,c),f=()=>t.bundledPromptsDir,u,d,p,g=()=>(u||(u=new QI.ClaudeEngine(n,async(y,w)=>l(y)??`headless-${c}`,f)),u),m=()=>(d||(d=new zI.CodexEngine(n,l,f)),d),h=async()=>{if(!p){let{CustomEngine:y}=await Promise.resolve().then(()=>Sn(Bu()));p=new y(n,f)}return p},E=new am.SessionEventWriter(t.analyticsSessionsDir??im.join((0,rP.getAgentideHome)(),"analytics","sessions"));return{async run(y){let w={success:!1,text:"",thinking:"",toolCalls:[]},P=y.emitter??{async thinking(O){w.thinking+=O},async text(O){w.text+=O},async toolStart(O,F,re){w.toolCalls.push({name:O,input:F})},async toolEnd(O,F,re,W){let pe=w.toolCalls.find(me=>me.name===O&&!me.result);pe&&(pe.result=re,pe.isError=W)},async progress(O){r.debug(`[Progress] ${O}`)},async question(O){return r.debug(`[Question] ${O.prompt}`),{selected:[],freeText:null,declined:!0}},async error(O){w.error=O},async done(){w.error||(w.success=!0)}},b=(0,ZI.generateRequestId)(),v=y.sessionId??`headless-${Date.now()}`,A=t.provenance?.(),S=(0,am.wrapEmitterWithObservability)(P,E,v,b,(0,nP.currentCredential)()?.userId,A&&{policy_version:A.policyVersion,pack_digest:A.packDigest,engine_version:A.engineVersion,tier:A.tier,instance_id:A.instanceId}),I={modelId:y.modelId,engineId:y.engineId,workspaceRoot:y.workspaceRoot,additionalDirectories:y.additionalDirectories,sessionId:v,analyticsUserId:sP(y.analyticsUserId,t.analyticsUserId),apiKey:y.modelToken??(e?void 0:t.apiKey),baseUrl:t.baseUrl,useLiteLLM:t.useLiteLLM,agentPackId:c,agentPackVersion:t.packVersion,policyVersion:A?.policyVersion,packDigest:A?.packDigest,engineVersion:A?.engineVersion,tier:A?.tier,instanceId:A?.instanceId,permissions:y.permissions,engineHomeUserKey:y.engineHomeUserKey,requestId:b};await S.emitTurnStart();let U={...a,cliEnvPatch:{...a.cliEnvPatch??{},...(0,tP.buildSessionEnvPatch)({workspaceRoot:y.workspaceRoot,chatSessionId:v,gatewaySessionKey:y.gatewaySessionKey}),...y.turnEnv??{}}};try{let O=y.engineId.trim().toLowerCase();O==="claude"?await g().stream(y.message,I,S,U,y.signal):O==="codex"?await m().stream(y.message,I,S,U,y.signal):await(await h()).stream(y.message,I,S,U,y.signal)}catch(O){w.error=O instanceof Error?O.message:String(O),w.success=!1,await S.error(w.error)}return await S.emitTurnEnd(w.success),w},dispose(){u?.dispose(),d?.dispose(),p?.dispose()}}}var iP=zs();Object.defineProperty(ce,"initSessionStoreWithStore",{enumerable:!0,get:function(){return iP.initSessionStoreWithStore}});var hc=ku();Object.defineProperty(ce,"syncPackToWorkspace",{enumerable:!0,get:function(){return hc.syncPackToWorkspace}});Object.defineProperty(ce,"computeSkillsSignature",{enumerable:!0,get:function(){return hc.computeSkillsSignature}});Object.defineProperty(ce,"createSessionDir",{enumerable:!0,get:function(){return hc.createSessionDir}});Object.defineProperty(ce,"getSessionDir",{enumerable:!0,get:function(){return hc.getSessionDir}});var oP=va();Object.defineProperty(ce,"resolveModelAlias",{enumerable:!0,get:function(){return oP.resolveModelAlias}});function aP(t,e,n){return Fu({storagePath:t,apiKey:e,baseUrl:n,freshState:!0,logger:new Ct.NoOpLogger})}function cP(t,e,n){return Fu({storagePath:t,apiKey:e,baseUrl:n,logger:new Ct.ConsoleLogger("[Agent]")})}});var ci=T(xt=>{"use strict";var lP=xt&&xt.__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]})),uP=xt&&xt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),mc=xt&&xt.__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"&&lP(n,e,r[s]);return uP(n,e),n}})();Object.defineProperty(xt,"__esModule",{value:!0});xt.resolvePackPath=lm;xt.listAvailablePacks=gP;xt.loadAgentPack=hP;xt.getDefaultConfig=yP;xt.getEnvDefaultModel=_P;xt.getApiConfig=um;xt.hasCredentialForEngine=wP;xt.getFileAccess=AP;var tn=mc(require("fs")),it=mc(require("path")),dP=mc(require("os")),fP=mc(require("js-yaml")),Ec=qe();function Oo(t,e){return process.env[t]??(e?process.env[e]:void 0)}var pP=process.env.AGENTHIPPO_HOME||it.join(dP.homedir(),Ec.AGENTIDE_DIR_NAME),Wu=it.join(pP,"agents"),Vu="agents";function Mi(t){if(!tn.existsSync(t))return;let e=it.join(t,"current.txt");if(tn.existsSync(e)){let r=tn.readFileSync(e,"utf-8").trim(),s=it.join(t,r);if(tn.existsSync(s))return s}let n=it.join(t,"agent.yaml");if(tn.existsSync(n))return t;try{let s=tn.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),[f,u,d]=o.split(".").map(p=>parseInt(p,10)||0);return f!==a?f-a:u!==c?u-c:d-l});for(let i of s){let o=it.join(t,i),a=it.join(o,"agent.yaml");if(tn.existsSync(a))return o}}catch{}}function lm(t,e){if(it.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")){let c=it.isAbsolute(t)?t:it.resolve(process.cwd(),t);if(tn.existsSync(c)){try{if(tn.statSync(c).isDirectory())return Mi(c)??c}catch{}return c}return}let n=it.join(process.cwd(),t),r=Mi(n);if(r)return r;let s=it.join(process.cwd(),Vu,t),i=Mi(s);if(i)return i;if(e){let c=it.join(e,Ec.AGENTIDE_DIR_NAME,Vu,t),l=Mi(c);if(l)return l}let o=it.join(Wu,t),a=Mi(o);if(a)return a}function cm(t,e){let n=[];if(!tn.existsSync(t))return n;let r=tn.readdirSync(t,{withFileTypes:!0});for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=it.join(t,s.name),o=Mi(i);if(!o)continue;let a;o!==i&&(a=it.basename(o)),n.push({name:s.name,path:o,version:a,source:e})}return n}function gP(t){let e=[],n=new Set;if(t){let s=it.join(t,Ec.AGENTIDE_DIR_NAME,Vu),i=cm(s,"workspace");for(let o of i)e.push(o),n.add(o.name)}let r=cm(Wu,"user-library");for(let s of r)n.has(s.name)||e.push(s);return e}async function hP(t,e){let n=lm(t,e);if(!n){let u=it.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")?[it.resolve(process.cwd(),t)]:[`${process.cwd()}/${t}`,`${process.cwd()}/agents/${t}`,e?`${e}/${Ec.AGENTIDE_DIR_NAME}/agents/${t}`:null,`${Wu}/${t}`].filter(Boolean);throw new Error(`Agent pack not found: ${t}
|
|
416
|
+
${Me}`,qe.message=Ne)}return qe}onMaintenance(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())n-s.lastUsedAt>jI&&(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()}};hn.CustomEngine=ju});var ai=T(ce=>{"use strict";var YI=ce&&ce.__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]})),JI=ce&&ce.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),XI=ce&&ce.__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"&&YI(n,e,r[s]);return JI(n,e),n}})();Object.defineProperty(ce,"__esModule",{value:!0});ce.resolveModelAlias=ce.getSessionDir=ce.createSessionDir=ce.computeSkillsSignature=ce.syncPackToWorkspace=ce.initSessionStoreWithStore=ce.CLIPermissionHandler=ce.AutoApprovePermissionHandler=ce.DirectorySessionStore=ce.FileSessionStore=ce.MemorySessionStore=ce.StaticConfigProvider=ce.NoOpEditTracker=ce.NoOpLogger=ce.ConsoleLogger=void 0;ce.createHeadlessRunner=Fu;ce.createEvalRunner=aP;ce.createCLIRunner=cP;var im=XI(require("path")),zI=Gh(),QI=xh(),ZI=Qs(),Ct=ru();Object.defineProperty(ce,"ConsoleLogger",{enumerable:!0,get:function(){return Ct.ConsoleLogger}});Object.defineProperty(ce,"NoOpLogger",{enumerable:!0,get:function(){return Ct.NoOpLogger}});Object.defineProperty(ce,"NoOpEditTracker",{enumerable:!0,get:function(){return Ct.NoOpEditTracker}});Object.defineProperty(ce,"StaticConfigProvider",{enumerable:!0,get:function(){return Ct.StaticConfigProvider}});Object.defineProperty(ce,"MemorySessionStore",{enumerable:!0,get:function(){return Ct.MemorySessionStore}});Object.defineProperty(ce,"FileSessionStore",{enumerable:!0,get:function(){return Ct.FileSessionStore}});Object.defineProperty(ce,"DirectorySessionStore",{enumerable:!0,get:function(){return Ct.DirectorySessionStore}});Object.defineProperty(ce,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return Ct.AutoApprovePermissionHandler}});Object.defineProperty(ce,"CLIPermissionHandler",{enumerable:!0,get:function(){return Ct.CLIPermissionHandler}});var om=zs(),eP=ku(),am=bo(),tP=Er(),nP=Ns(),rP=Js();function sP(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 Fu(t){if(t.freshState){let y=new Ct.MemorySessionStore;(0,om.initSessionStoreWithStore)(y)}else(0,om.initSessionStoreWithStore)(new Ct.DirectorySessionStore(im.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 Ct.ConsoleLogger("[AgentIDE]"),s=t.editTracker??new Ct.NoOpEditTracker,i=new Ct.StaticConfigProvider({},t.customProviders??{},t.engineSettings??{}),o=t.permissionHandler??new Ct.AutoApprovePermissionHandler,a={logger:r,editTracker:s,configProvider:i,permissionHandler:o,cliEnvPatch:t.cliEnvPatch},c=t.packId??"default",l=y=>(0,eP.computeSkillsSignature)(y,c),f=()=>t.bundledPromptsDir,u,d,p,g=()=>(u||(u=new QI.ClaudeEngine(n,async(y,w)=>l(y)??`headless-${c}`,f)),u),m=()=>(d||(d=new zI.CodexEngine(n,l,f)),d),h=async()=>{if(!p){let{CustomEngine:y}=await Promise.resolve().then(()=>Sn(Bu()));p=new y(n,f)}return p},E=new am.SessionEventWriter(t.analyticsSessionsDir??im.join((0,rP.getAgentideHome)(),"analytics","sessions"));return{async run(y){let w={success:!1,text:"",thinking:"",toolCalls:[]},P=y.emitter??{async thinking(O){w.thinking+=O},async text(O){w.text+=O},async toolStart(O,F,se){w.toolCalls.push({name:O,input:F})},async toolEnd(O,F,se,W){let pe=w.toolCalls.find(me=>me.name===O&&!me.result);pe&&(pe.result=se,pe.isError=W)},async progress(O){r.debug(`[Progress] ${O}`)},async question(O){return r.debug(`[Question] ${O.prompt}`),{selected:[],freeText:null,declined:!0}},async error(O){w.error=O},async done(){w.error||(w.success=!0)}},b=(0,ZI.generateRequestId)(),v=y.sessionId??`headless-${Date.now()}`,A=t.provenance?.(),S=(0,am.wrapEmitterWithObservability)(P,E,v,b,(0,nP.currentCredential)()?.userId,A&&{policy_version:A.policyVersion,pack_digest:A.packDigest,engine_version:A.engineVersion,tier:A.tier,instance_id:A.instanceId}),I={modelId:y.modelId,engineId:y.engineId,workspaceRoot:y.workspaceRoot,additionalDirectories:y.additionalDirectories,sessionId:v,analyticsUserId:sP(y.analyticsUserId,t.analyticsUserId),apiKey:y.modelToken??(e?void 0:t.apiKey),baseUrl:t.baseUrl,useLiteLLM:t.useLiteLLM,agentPackId:c,agentPackVersion:t.packVersion,policyVersion:A?.policyVersion,packDigest:A?.packDigest,engineVersion:A?.engineVersion,tier:A?.tier,instanceId:A?.instanceId,permissions:y.permissions,engineHomeUserKey:y.engineHomeUserKey,requestId:b};await S.emitTurnStart();let U={...a,cliEnvPatch:{...a.cliEnvPatch??{},...(0,tP.buildSessionEnvPatch)({workspaceRoot:y.workspaceRoot,chatSessionId:v,gatewaySessionKey:y.gatewaySessionKey}),...y.turnEnv??{}}};try{let O=y.engineId.trim().toLowerCase();O==="claude"?await g().stream(y.message,I,S,U,y.signal):O==="codex"?await m().stream(y.message,I,S,U,y.signal):await(await h()).stream(y.message,I,S,U,y.signal)}catch(O){w.error=O instanceof Error?O.message:String(O),w.success=!1,await S.error(w.error)}return await S.emitTurnEnd(w.success),w},dispose(){u?.dispose(),d?.dispose(),p?.dispose()}}}var iP=zs();Object.defineProperty(ce,"initSessionStoreWithStore",{enumerable:!0,get:function(){return iP.initSessionStoreWithStore}});var hc=ku();Object.defineProperty(ce,"syncPackToWorkspace",{enumerable:!0,get:function(){return hc.syncPackToWorkspace}});Object.defineProperty(ce,"computeSkillsSignature",{enumerable:!0,get:function(){return hc.computeSkillsSignature}});Object.defineProperty(ce,"createSessionDir",{enumerable:!0,get:function(){return hc.createSessionDir}});Object.defineProperty(ce,"getSessionDir",{enumerable:!0,get:function(){return hc.getSessionDir}});var oP=va();Object.defineProperty(ce,"resolveModelAlias",{enumerable:!0,get:function(){return oP.resolveModelAlias}});function aP(t,e,n){return Fu({storagePath:t,apiKey:e,baseUrl:n,freshState:!0,logger:new Ct.NoOpLogger})}function cP(t,e,n){return Fu({storagePath:t,apiKey:e,baseUrl:n,logger:new Ct.ConsoleLogger("[Agent]")})}});var ci=T(xt=>{"use strict";var lP=xt&&xt.__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]})),uP=xt&&xt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),mc=xt&&xt.__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"&&lP(n,e,r[s]);return uP(n,e),n}})();Object.defineProperty(xt,"__esModule",{value:!0});xt.resolvePackPath=lm;xt.listAvailablePacks=gP;xt.loadAgentPack=hP;xt.getDefaultConfig=yP;xt.getEnvDefaultModel=_P;xt.getApiConfig=um;xt.hasCredentialForEngine=wP;xt.getFileAccess=AP;var tn=mc(require("fs")),it=mc(require("path")),dP=mc(require("os")),fP=mc(require("js-yaml")),Ec=Ye();function Oo(t,e){return process.env[t]??(e?process.env[e]:void 0)}var pP=process.env.AGENTHIPPO_HOME||it.join(dP.homedir(),Ec.AGENTIDE_DIR_NAME),Wu=it.join(pP,"agents"),Vu="agents";function Mi(t){if(!tn.existsSync(t))return;let e=it.join(t,"current.txt");if(tn.existsSync(e)){let r=tn.readFileSync(e,"utf-8").trim(),s=it.join(t,r);if(tn.existsSync(s))return s}let n=it.join(t,"agent.yaml");if(tn.existsSync(n))return t;try{let s=tn.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),[f,u,d]=o.split(".").map(p=>parseInt(p,10)||0);return f!==a?f-a:u!==c?u-c:d-l});for(let i of s){let o=it.join(t,i),a=it.join(o,"agent.yaml");if(tn.existsSync(a))return o}}catch{}}function lm(t,e){if(it.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")){let c=it.isAbsolute(t)?t:it.resolve(process.cwd(),t);if(tn.existsSync(c)){try{if(tn.statSync(c).isDirectory())return Mi(c)??c}catch{}return c}return}let n=it.join(process.cwd(),t),r=Mi(n);if(r)return r;let s=it.join(process.cwd(),Vu,t),i=Mi(s);if(i)return i;if(e){let c=it.join(e,Ec.AGENTIDE_DIR_NAME,Vu,t),l=Mi(c);if(l)return l}let o=it.join(Wu,t),a=Mi(o);if(a)return a}function cm(t,e){let n=[];if(!tn.existsSync(t))return n;let r=tn.readdirSync(t,{withFileTypes:!0});for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=it.join(t,s.name),o=Mi(i);if(!o)continue;let a;o!==i&&(a=it.basename(o)),n.push({name:s.name,path:o,version:a,source:e})}return n}function gP(t){let e=[],n=new Set;if(t){let s=it.join(t,Ec.AGENTIDE_DIR_NAME,Vu),i=cm(s,"workspace");for(let o of i)e.push(o),n.add(o.name)}let r=cm(Wu,"user-library");for(let s of r)n.has(s.name)||e.push(s);return e}async function hP(t,e){let n=lm(t,e);if(!n){let u=it.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")?[it.resolve(process.cwd(),t)]:[`${process.cwd()}/${t}`,`${process.cwd()}/agents/${t}`,e?`${e}/${Ec.AGENTIDE_DIR_NAME}/agents/${t}`:null,`${Wu}/${t}`].filter(Boolean);throw new Error(`Agent pack not found: ${t}
|
|
417
417
|
Searched: ${u.join(", ")}`)}let r=it.join(n,"agent.yaml");if(!tn.existsSync(r))throw new Error(`Missing agent.yaml in pack: ${n}`);let s=tn.readFileSync(r,"utf-8"),i=fP.load(s);EP(i,r);let o=mP(i),a="",c=it.join(n,"AGENTS.md");return tn.existsSync(c)&&(a=tn.readFileSync(c,"utf-8")),{manifest:o,packPath:n,systemPrompt:a,rules:[]}}function mP(t){let e=t.spec.engine?.trim()??"",n=e.toLowerCase();return e!==n?{...t,spec:{...t.spec,engine:n}}:t}function EP(t,e){let n=[];if(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"),t.spec?.engine?.trim().toLowerCase()==="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"),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.length>0)throw new Error(`Invalid agent manifest at ${e}:
|
|
418
418
|
- ${n.join(`
|
|
419
|
-
- `)}`)}function yP(){return{engine:(Oo("AGENTHIPPO_DEFAULT_ENGINE","AGENTIDE_DEFAULT_ENGINE")||"claude").trim().toLowerCase(),model:Oo("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")||"claude-sonnet-4-5-20250929"}}function _P(){return Oo("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")?.trim()||void 0}function um(){let t=Oo("AGENTHIPPO_LITELLM_API_KEY","AGENTIDE_LITELLM_API_KEY"),e=Oo("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 wP(t,e=um()){if(e.useLiteLLM)return!0;let n=t.trim().toLowerCase();return n==="claude"?!!e.anthropicApiKey:n==="codex"?!!e.openaiApiKey:!0}function AP(t){return t?.manifest.spec.permissions?.fileAccess??"workspace-write"}});var yc=T((NH,SP)=>{SP.exports={name:"agenthippo",displayName:"Agent Hippo",description:"Agent Hippo - The easiest way to build and test your AI agents",version:"1.110.24",agenthippo:{litellmImageTag:"0.2.9",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).
|
|
419
|
+
- `)}`)}function yP(){return{engine:(Oo("AGENTHIPPO_DEFAULT_ENGINE","AGENTIDE_DEFAULT_ENGINE")||"claude").trim().toLowerCase(),model:Oo("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")||"claude-sonnet-4-5-20250929"}}function _P(){return Oo("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")?.trim()||void 0}function um(){let t=Oo("AGENTHIPPO_LITELLM_API_KEY","AGENTIDE_LITELLM_API_KEY"),e=Oo("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 wP(t,e=um()){if(e.useLiteLLM)return!0;let n=t.trim().toLowerCase();return n==="claude"?!!e.anthropicApiKey:n==="codex"?!!e.openaiApiKey:!0}function AP(t){return t?.manifest.spec.permissions?.fileAccess??"workspace-write"}});var yc=T((NH,SP)=>{SP.exports={name:"agenthippo",displayName:"Agent Hippo",description:"Agent Hippo - The easiest way to build and test your AI agents",version:"1.110.26",agenthippo:{litellmImageTag:"0.2.14",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).
|
|
420
420
|
|
|
421
421
|
Default: \`https://agenthippoai.github.io/agenthippo-store\`
|
|
422
422
|
|
|
@@ -450,10 +450,10 @@ When enabled, JSONL trace files are incrementally converted to an indexed DuckDB
|
|
|
450
450
|
|
|
451
451
|
**Application-scoped on purpose**: this host receives your Anthropic key and your prompts.`},"agentide.AgentHippoModelGateway.url":{type:"string",scope:"application",default:"",markdownDescription:"AgentHippo managed model gateway base URL (default `https://gateway.agenthippo.ai/v1`).\n\n**Application-scoped on purpose**: this host receives your AgentHippo sign-in JWT and your prompts."},"agentide.skills.remote.enabled":{type:"boolean",scope:"application",default:!1,description:"Sync skills from a remote skill registry into the default agent."},"agentide.skills.remote.registryUrl":{type:"string",scope:"application",default:"",markdownDescription:`Remote skill registry base URL.
|
|
452
452
|
|
|
453
|
-
**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.227","@anthropic-ai/sdk":"0.116.0","@cfworker/json-schema":"^4.1.1","@mariozechner/pi-ai":"0.54.0","@modelcontextprotocol/sdk":"^1.30.0","@openai/codex":"0.147.0","@openai/codex-sdk":"0.147.0","@orama/orama":"^3.1.6",commander:"^14.0.2",hono:"^4.11.5","js-yaml":"^4.1.1",zod:"^4.3.6"},devDependencies:{"@types/js-yaml":"^4.0.9","@types/mocha":"^10.0.10","@types/node":"^25.x"},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 li=T(ot=>{"use strict";var bP=ot&&ot.__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=ot&&ot.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qu=ot&&ot.__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"&&bP(n,e,r[s]);return TP(n,e),n}})();Object.defineProperty(ot,"__esModule",{value:!0});ot.getDepsDir=Ui;ot.resolveFromOwnDeps=pm;ot.getClaudeAgentSdkPlatformPackageName=NP;ot.resolveClaudeCodeExecutablePath=Ac;ot.resolveClaudeCodeFromOwnDeps=hm;ot.getUnsupportedClaudePlatformHint=CP;ot.areDepsInstalled=mm;ot.installDeps=Em;ot.isAutoInstallDisabled=ym;ot.ensureDeps=kP;ot.getClaudeSdkCliPath=$P;ot.getCodexSdkBinaryPath=DP;ot.installedEngineVersion=MP;var nn=qu(require("fs")),vP=qu(require("os")),
|
|
454
|
-
`);try{let r=process.platform==="win32"?"npm.cmd":"npm";(0,dm.execSync)(`${r} install --production --no-audit --no-fund`,{cwd:e,stdio:t?"inherit":"pipe"}),console.log(`${Hr.COLORS.green}Dependencies installed${Hr.COLORS.reset}`)}catch(r){throw console.error(`${Hr.COLORS.red}Error: Failed to install dependencies${Hr.COLORS.reset}`),r instanceof Error&&console.error(` ${r.message}`),r}}function ym(){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 kP(t=!1){if(!mm()){if(hm()&&pm("@openai/codex","bin/codex.js")){t&&console.error(`${Hr.COLORS.dim}Engine SDKs resolved from the CLI's own node_modules \u2014 skipping install.${Hr.COLORS.reset}`);return}if(ym()){t&&console.error(`${Hr.COLORS.dim}AGENTHIPPO_NO_AUTO_INSTALL set \u2014 skipping engine dependency install (expecting a self-contained image).${Hr.COLORS.reset}`);return}await Em(t)}}function $P(){return Ac(
|
|
453
|
+
**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.227","@anthropic-ai/sdk":"0.116.0","@cfworker/json-schema":"^4.1.1","@mariozechner/pi-ai":"0.54.0","@modelcontextprotocol/sdk":"^1.30.0","@openai/codex":"0.147.0","@openai/codex-sdk":"0.147.0","@orama/orama":"^3.1.6",commander:"^14.0.2",hono:"^4.11.5","js-yaml":"^4.1.1",zod:"^4.3.6"},devDependencies:{"@types/js-yaml":"^4.0.9","@types/mocha":"^10.0.10","@types/node":"^25.x"},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 li=T(ot=>{"use strict";var bP=ot&&ot.__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=ot&&ot.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qu=ot&&ot.__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"&&bP(n,e,r[s]);return TP(n,e),n}})();Object.defineProperty(ot,"__esModule",{value:!0});ot.getDepsDir=Ui;ot.resolveFromOwnDeps=pm;ot.getClaudeAgentSdkPlatformPackageName=NP;ot.resolveClaudeCodeExecutablePath=Ac;ot.resolveClaudeCodeFromOwnDeps=hm;ot.getUnsupportedClaudePlatformHint=CP;ot.areDepsInstalled=mm;ot.installDeps=Em;ot.isAutoInstallDisabled=ym;ot.ensureDeps=kP;ot.getClaudeSdkCliPath=$P;ot.getCodexSdkBinaryPath=DP;ot.installedEngineVersion=MP;var nn=qu(require("fs")),vP=qu(require("os")),ze=qu(require("path")),dm=require("child_process"),Hr=qn(),wc=Ye();function OP(){let e=(()=>{try{return yc()}catch{return}})()?.dependencies??{};return{"@anthropic-ai/claude-agent-sdk":e["@anthropic-ai/claude-agent-sdk"]??"0.3.227","@openai/codex":e["@openai/codex"]??"0.147.0","@openai/codex-sdk":e["@openai/codex-sdk"]??"0.147.0"}}var fm=OP();function Ui(){let t=ze.dirname(process.execPath),e=ze.join(t,wc.AGENTIDE_DEPS_DIR_NAME);if(nn.existsSync(e))return e;try{return nn.accessSync(t,nn.constants.W_OK),e}catch{return ze.join(vP.homedir(),wc.AGENTIDE_DIR_NAME,wc.AGENTIDE_DEPS_DIR_NAME)}}function pm(t,e){let n=__dirname;for(let r=0;r<8;r++){let s=ze.join(n,"node_modules",...t.split("/"),...e.split("/"));try{if(nn.existsSync(s))return s}catch{}let i=ze.dirname(n);if(i===n)break;n=i}}function Gi(t){try{return nn.existsSync(t)}catch{return!1}}function Ku(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 gm(t,e){return t===process.platform&&e===process.arch}var _c;function IP(){return _c||(_c=(()=>{try{let s=process.report?.getReport?.();if((typeof s=="object"&&s?s.header:void 0)?.glibcVersionRuntime)return"glibc"}catch{}let t=Ku("glibc",process.arch),e=Ku("musl",process.arch),n=t?Gi(t):!1,r=e?Gi(e):!1;if(r&&!n)return"musl";if(n&&!r)return"glibc";if(Gi("/etc/alpine-release"))return"musl";try{if(/musl/i.test((0,dm.execSync)("ldd --version 2>&1 || true",{encoding:"utf8"})))return"musl"}catch{}return"glibc"})(),_c)}function PP(t,e){return gm(t,e)?n=>{let r=Ku(n,e);return r?Gi(r):!1}:()=>!0}function Yu(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??(gm(e,n)?IP():"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 NP(t={}){return Yu(t)[0]?.name}function RP(t=process.platform){return t==="win32"?"claude.exe":"claude"}function Ac(t,e={}){let n=e.platform??process.platform,r=e.arch??process.arch,s=e.hasLoader??PP(n,r),i=RP(n),o;for(let{name:c,libc:l}of Yu(e)){let f=ze.join(t,...c.split("/"),i);if(Gi(f)){if(l&&!s(l)){o??=f;continue}return f}}let a=ze.join(t,"@anthropic-ai","claude-agent-sdk","cli.js");return Gi(a)?a:o}function hm(){let t=__dirname;for(let e=0;e<8;e++){let n=ze.join(t,"node_modules"),r=Ac(n);if(r)return r;let s=ze.dirname(t);if(s===t)break;t=s}}function CP(t={}){if(Yu(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 mm(){let t=Ui(),e=ze.join(t,"node_modules"),n=ze.join(t,"package.json");try{if(!nn.existsSync(n))return!1;let o=nn.readFileSync(n,"utf8"),c=JSON.parse(o).dependencies??{};for(let[l,f]of Object.entries(fm))if(c[l]!==f)return!1}catch{return!1}let r=Ac(e),s=ze.join(e,"@openai","codex","bin","codex.js"),i=ze.join(e,"@openai","codex-sdk","package.json");return!!r&&nn.existsSync(s)&&nn.existsSync(i)}async function Em(t=!1){let e=Ui();console.log(`${Hr.COLORS.cyan}Installing engine dependencies...${Hr.COLORS.reset}`),t&&console.log(` Directory: ${e}`),nn.mkdirSync(e,{recursive:!0});let n={name:wc.AGENTIDE_DEPS_PACKAGE_NAME,version:"1.0.0",private:!0,dependencies:fm};nn.writeFileSync(ze.join(e,"package.json"),JSON.stringify(n,null,2)+`
|
|
454
|
+
`);try{let r=process.platform==="win32"?"npm.cmd":"npm";(0,dm.execSync)(`${r} install --production --no-audit --no-fund`,{cwd:e,stdio:t?"inherit":"pipe"}),console.log(`${Hr.COLORS.green}Dependencies installed${Hr.COLORS.reset}`)}catch(r){throw console.error(`${Hr.COLORS.red}Error: Failed to install dependencies${Hr.COLORS.reset}`),r instanceof Error&&console.error(` ${r.message}`),r}}function ym(){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 kP(t=!1){if(!mm()){if(hm()&&pm("@openai/codex","bin/codex.js")){t&&console.error(`${Hr.COLORS.dim}Engine SDKs resolved from the CLI's own node_modules \u2014 skipping install.${Hr.COLORS.reset}`);return}if(ym()){t&&console.error(`${Hr.COLORS.dim}AGENTHIPPO_NO_AUTO_INSTALL set \u2014 skipping engine dependency install (expecting a self-contained image).${Hr.COLORS.reset}`);return}await Em(t)}}function $P(){return Ac(ze.join(Ui(),"node_modules"))}function DP(){let t=Ui(),e=ze.join(t,"node_modules","@openai","codex","bin","codex.js");if(nn.existsSync(e))return e;let n=ze.join(t,"node_modules","@openai","codex-sdk"),r=LP();if(!r)return;let s=process.platform==="win32"?"codex.exe":"codex",i=ze.join(n,"vendor",r,"codex",s);return nn.existsSync(i)?i:void 0}function LP(){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 MP(t){let e=t==="codex"?ze.join("@openai","codex"):t==="claude"?ze.join("@anthropic-ai","claude-agent-sdk"):void 0;if(!e)return;let n=[ze.join(Ui(),"node_modules",e,"package.json"),ze.join("/usr/local/lib/node_modules",e,"package.json"),ze.join("/usr/lib/node_modules",e,"package.json")];for(let r of n)try{if(!nn.existsSync(r))continue;let s=JSON.parse(nn.readFileSync(r,"utf8"));if(s.version)return s.version}catch{}}});var qn=T(Tt=>{"use strict";var GP=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]})),UP=Tt&&Tt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ju=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"&&GP(n,e,r[s]);return UP(n,e),n}})();Object.defineProperty(Tt,"__esModule",{value:!0});Tt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND=Tt.COLORS=void 0;Tt.getBinaryDir=bc;Tt.findClaudeCodePath=jP;Tt.findCodexPath=xP;Tt.findBundledBasePromptsDir=BP;Tt.getLiteLLMQuickstartHintLines=FP;var HP=Ju(require("os")),ui=Ju(require("path")),Yn=Ju(require("fs")),_m=require("child_process"),Sc=li();function bc(){return ui.dirname(process.execPath)}function jP(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;let t=(0,Sc.getClaudeSdkCliPath)();if(t)return t;let e=(0,Sc.resolveClaudeCodeFromOwnDeps)();if(e)return e;let n=bc(),r=ui.join(n,"claude-sdk","cli.js");try{return Yn.accessSync(r,Yn.constants.R_OK),r}catch{}try{let o=process.platform==="win32"?"where claude":"which claude",a=(0,_m.execSync)(o,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(a)return a.split(`
|
|
455
455
|
`)[0]}catch{}let s=HP.homedir(),i=[ui.join(s,".npm-global","bin","claude"),ui.join(s,".local","bin","claude"),"/usr/local/bin/claude","/opt/homebrew/bin/claude"];for(let o of i)try{return Yn.accessSync(o,Yn.constants.X_OK),o}catch{}}function xP(){if(process.env.CODEX_PATH)return process.env.CODEX_PATH;let t=(0,Sc.resolveFromOwnDeps)("@openai/codex","bin/codex.js");if(t)return t;let e=(0,Sc.getCodexSdkBinaryPath)();if(e)return e;let n=bc(),r=process.platform==="win32"?"codex.exe":"codex",s=ui.join(n,"codex-sdk",r);try{return Yn.accessSync(s,Yn.constants.X_OK),s}catch{}try{let i=process.platform==="win32"?"where codex":"which codex",o=(0,_m.execSync)(i,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(o)return o.split(`
|
|
456
|
-
`)[0]}catch{}}function BP(){let t=process.env.AGENTHIPPO_BASE_PROMPTS_DIR||process.env.AGENTIDE_BASE_PROMPTS_DIR;if(t)try{return Yn.accessSync(t,Yn.constants.R_OK),t}catch{}let e=bc(),n=ui.join(e,"base-prompts");try{return Yn.accessSync(n,Yn.constants.R_OK),n}catch{}let r=ui.resolve(__dirname,"..","base-prompts");try{return Yn.accessSync(r,Yn.constants.R_OK),r}catch{}}Tt.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"};Tt.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 FP(){return["Try local LiteLLM quickstart:",` ${Tt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND}`]}});var Sm=T(us=>{"use strict";var VP=us&&us.__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]})),WP=us&&us.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),zu=us&&us.__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"&&VP(n,e,r[s]);return WP(n,e),n}})();Object.defineProperty(us,"__esModule",{value:!0});us.chatCommand=zP;var KP=zu(require("readline")),qP=zu(require("path")),YP=zu(require("os")),_r=ai(),di=ci(),fe=qn(),JP=li(),wm=
|
|
456
|
+
`)[0]}catch{}}function BP(){let t=process.env.AGENTHIPPO_BASE_PROMPTS_DIR||process.env.AGENTIDE_BASE_PROMPTS_DIR;if(t)try{return Yn.accessSync(t,Yn.constants.R_OK),t}catch{}let e=bc(),n=ui.join(e,"base-prompts");try{return Yn.accessSync(n,Yn.constants.R_OK),n}catch{}let r=ui.resolve(__dirname,"..","base-prompts");try{return Yn.accessSync(r,Yn.constants.R_OK),r}catch{}}Tt.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"};Tt.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 FP(){return["Try local LiteLLM quickstart:",` ${Tt.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND}`]}});var Sm=T(us=>{"use strict";var VP=us&&us.__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]})),WP=us&&us.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),zu=us&&us.__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"&&VP(n,e,r[s]);return WP(n,e),n}})();Object.defineProperty(us,"__esModule",{value:!0});us.chatCommand=zP;var KP=zu(require("readline")),qP=zu(require("path")),YP=zu(require("os")),_r=ai(),di=ci(),fe=qn(),JP=li(),wm=Ye(),XP=Er(),Am=Cs(),Xu="-".repeat(62);async function zP(t){let e=(0,di.getApiConfig)(),n,r="default",s,i,o,a=t.verbose?new _r.ConsoleLogger("[Sync]"):new _r.NoOpLogger;if(t.agent)try{n=await(0,di.loadAgentPack)(t.agent,t.workspace),r=n.manifest.metadata.name,s=t.engine||n.manifest.spec.engine;let v=["claude","codex"].includes(s)?void 0:(0,Am.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,A=t.model||n.manifest.spec.model||v||(0,di.getEnvDefaultModel)()||(0,di.getDefaultConfig)().model;i=(0,_r.resolveModelAlias)(A);let S=n.manifest.spec.cheapModel?.trim();o=S?(0,_r.resolveModelAlias)(S):void 0,await(0,_r.syncPackToWorkspace)(t.workspace,n.packPath,r,s,a,(0,fe.findBundledBasePromptsDir)()),console.log(`${fe.COLORS.green}OK:${fe.COLORS.reset} Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),A!==i&&console.log(`${fe.COLORS.dim} Model: ${A} -> ${i}${fe.COLORS.reset}`),S&&S!==o&&console.log(`${fe.COLORS.dim} Cheap model: ${S} -> ${o}${fe.COLORS.reset}`)}catch(b){console.error(`${fe.COLORS.red}Error: ${b instanceof Error?b.message:b}${fe.COLORS.reset}`),process.exit(1)}else{let b=(0,di.getDefaultConfig)();s=t.engine||b.engine;let v=["claude","codex"].includes(s)?void 0:(0,Am.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,A=t.model||v||(0,di.getEnvDefaultModel)()||b.model;i=(0,_r.resolveModelAlias)(A),A!==i&&console.log(`${fe.COLORS.dim}Model: ${A} -> ${i}${fe.COLORS.reset}`)}if(!e.apiKey&&(s==="claude"||s==="codex")){let b=(0,fe.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(`
|
|
457
457
|
`)),process.exit(1)}let c=qP.join(YP.tmpdir(),`${wm.AGENTIDE_CLI_NAME}-cli`),l=t.verbose?new _r.ConsoleLogger("[Agent]"):new _r.NoOpLogger,f=(0,fe.findClaudeCodePath)(),u=(0,fe.findCodexPath)(),d=(0,fe.findBundledBasePromptsDir)();if(s==="claude"&&!f){console.error(`${fe.COLORS.red}Error: Claude Code CLI not found.${fe.COLORS.reset}`);let b=(0,JP.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"&&!u&&(console.error(`${fe.COLORS.red}Error: Codex CLI not found.${fe.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 _r.AutoApprovePermissionHandler,g={fileAccess:(0,di.getFileAccess)(n)},m=`cli-${Date.now()}`,h=()=>(0,_r.createHeadlessRunner)({storagePath:c,packId:r,packVersion:n?.manifest.metadata.version,bundledPromptsDir:d,apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey,logger:l,freshState:!1,claudeCodeExecutablePath:f,codexExecutablePath:u,permissionHandler:p,cliEnvPatch:(0,XP.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:m,baseEnv:process.env}),...o?{engineSettings:{claudeCheapModel:o}}:{}}),E={runner:h(),sessionId:m,engine:s,model:i},y=()=>({async thinking(b){process.stdout.write(`${fe.COLORS.gray}${b}${fe.COLORS.reset}`)},async text(b){process.stdout.write(b)},async toolStart(b,v){console.log(`
|
|
458
458
|
${fe.COLORS.blue}Tool: ${b}${fe.COLORS.reset}`),v&&v.length<200&&t.verbose&&console.log(` ${fe.COLORS.gray}${v}${fe.COLORS.reset}`)},async toolEnd(b,v,A,S){console.log(S?` ${fe.COLORS.red}Error: ${A?.slice(0,100)}${fe.COLORS.reset}`:` ${fe.COLORS.green}OK${fe.COLORS.reset}`)},async progress(b){t.verbose&&console.log(`${fe.COLORS.yellow}Progress: ${b}${fe.COLORS.reset}`)},async error(b){console.error(`${fe.COLORS.red}Error: ${b}${fe.COLORS.reset}`)},async question(b){return{selected:[],freeText:null,declined:!0}},async done(){console.log(`
|
|
459
459
|
`)}});console.log(""),console.log(Xu),console.log(`${wm.AGENTIDE_BRAND_NAME} Chat`),console.log(Xu),console.log(`Engine: ${E.engine}`),console.log(`Model: ${E.model}`),o&&console.log(`Cheap: ${o}`),console.log(`Workspace: ${t.workspace}`),n&&console.log(`Agent: ${n.manifest.metadata.name}`),console.log(Xu),console.log("Type a message to chat. Commands: /help"),console.log("");let w=KP.createInterface({input:process.stdin,output:process.stdout}),P=()=>{w.question(`${fe.COLORS.cyan}> ${fe.COLORS.reset}`,async b=>{let v=b.trim();if(!v){P();return}if(v.startsWith("/")){if(!await QP(v,E,w,{createRunner:h,claudeCodePath:f,codexPath:u}))return;P();return}try{let A=await E.runner.run({engineId:E.engine,modelId:E.model,message:v,workspaceRoot:t.workspace,sessionId:E.sessionId,emitter:y(),permissions:g});!A.success&&A.error&&console.error(`
|
|
@@ -475,13 +475,13 @@ ${y}
|
|
|
475
475
|
\`\`\``}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 l=bm.join(nN.tmpdir(),"agenthippo-cli"),f=t.verbose?new jr.ConsoleLogger("[Agent]"):new jr.NoOpLogger,u=(0,xr.findClaudeCodePath)(),d=(0,xr.findCodexPath)(),p=(0,xr.findBundledBasePromptsDir)();if(s==="claude"&&!u){let E=(0,rN.getUnsupportedClaudePlatformHint)();t.json?console.log(JSON.stringify({error:"Claude Code CLI not found. Install: npm install -g @anthropic-ai/claude-code",...E?{reason:E}:{}})):(console.error(`${xr.COLORS.red}Error: Claude Code CLI not found.${xr.COLORS.reset}`),E&&console.error(` ${E}`),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"&&!d&&(t.json?console.log(JSON.stringify({error:"Codex CLI not found. Install: npm install -g @openai/codex"})):(console.error(`${xr.COLORS.red}Error: Codex CLI not found.${xr.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH, or use --engine claude")),process.exit(1));let g=new jr.AutoApprovePermissionHandler,m={fileAccess:(0,fi.getFileAccess)(n)},h=(0,jr.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:f,freshState:!t.sessionId?.trim(),permissionHandler:g,claudeCodeExecutablePath:u,codexExecutablePath:d,cliEnvPatch:(0,sN.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:t.sessionId,baseEnv:process.env}),...o?{engineSettings:{claudeCheapModel:o}}:{}});try{let E=await h.run({engineId:s,modelId:i,message:c,workspaceRoot:t.workspace,sessionId:t.sessionId,permissions:m});t.json?(t.outputMode==="agent-run"?console.log(JSON.stringify({text:E.text,media:[],session_id:t.sessionId||null,error:E.error||void 0})):console.log(JSON.stringify({success:E.success,text:E.text,thinking:E.thinking||void 0,toolCalls:E.toolCalls,error:E.error})),E.success||process.exit(1)):E.success?console.log(E.text):(console.error(`Error: ${E.error}`),process.exit(1))}catch(E){t.json?console.log(JSON.stringify({error:E instanceof Error?E.message:String(E)})):console.error(`Error: ${E instanceof Error?E.message:E}`),process.exit(1)}finally{h.dispose()}}});var Zu=T(Br=>{"use strict";Object.defineProperty(Br,"__esModule",{value:!0});Br.isTerminalFrame=oN;Br.isTaggedEvent=aN;Br.encodeRunnerFrame=cN;Br.encodeClientFrame=lN;Br.parseRunnerFrame=uN;Br.parseClientFrame=dN;Br.splitFrames=fN;Br.toWireOptions=pN;function oN(t){return"type"in t&&(t.type==="result"||t.type==="failed")}function aN(t){return"event"in t}function cN(t){return`${JSON.stringify(t)}
|
|
476
476
|
`}function lN(t){return`${JSON.stringify(t)}
|
|
477
477
|
`}function uN(t){let e=Im(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"&&Om.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"&&Om.has(n))return e}function dN(t){let e=Im(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 Om=new Set(["text","thinking","toolStart","toolEnd","progress","error","done","nativeSessionId","probe"]);function Im(t){let e;try{e=JSON.parse(t)}catch{return}if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function fN(t){let e=t.split(`
|
|
478
|
-
`),n=e.pop()??"";return{lines:e.filter(r=>r.trim().length>0),rest:n}}function pN(t,e){let{apiKey:n,...r}=t;return{...r,...e.baseUrl?{baseUrl:e.baseUrl}:{},...e.modelToken?{modelToken:e.modelToken}:{}}}});var Nm=T(Tc=>{"use strict";Object.defineProperty(Tc,"__esModule",{value:!0});Tc.RemoteEngine=void 0;var Pm=lc(),Io=Zu(),ed=class{id;displayName;channel;model;logger;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}async stream(e,n,r,s,i){this.wire();let o=`r${++this.seq}`,a=new Promise((l,f)=>{this.pending.set(o,{emitter:r,resolve:l,reject:f,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.send({type:"run",id:o,message:e,options:(0,Io.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,Io.splitFrames)(this.buffer);this.buffer=r;for(let s of n){let i=(0,Io.parseRunnerFrame)(s);if(!i){this.logger?.warn("[RemoteEngine] dropped malformed runner frame");continue}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,Io.isTaggedEvent)(e)){this.enqueue(this.pending.get(e.id),n=>(0,Pm.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,Pm.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,Io.encodeClientFrame)(e))}};Tc.RemoteEngine=ed});var km=T(td=>{"use strict";Object.defineProperty(td,"__esModule",{value:!0});td.createSandboxRunner=EN;var gN=Nm(),hN=jn(),mN=Ns();function EN(t){let e=new Map,n=new Map,r=new Map,s=1e4,i=(u,d)=>{if(r.size>=s&&!r.has(u)){let p=r.keys().next();p.done||r.delete(p.value)}r.set(u,d)},o=u=>r.get(u)??u,a=async(u,d)=>{await t.admit?.({sandboxKey:u,sessionKey:d});let p=await t.driver.create({sandboxKey:u,image:t.image,tier:t.tier,routes:t.routes,fs:await t.fsFor?.(u)??t.fs??{readonly:[],writable:[]},...t.stateDirFor?{stateDir:await t.stateDirFor(u)}:{},limits:t.limits??{ttlSeconds:1800},env:{...t.env??{},...t.provenanceEnv?.()??{}}}),g=await t.mintModelToken?.(p.id,u),m=p.connect(),h=new gN.RemoteEngine({id:"sandbox",displayName:`Sandbox ${p.id}`,channel:m,model:{baseUrl:t.inferenceBaseUrl,modelToken:g,...t.mintModelToken?{mintToken:async()=>t.mintModelToken(p.id,u)}:{}},logger:t.logger}),E={handle:p,engine:h,dead:!1,sessionKeys:new Set([d]),queue:Promise.resolve()},y=w=>{E.dead=!0;let P=e.get(u)===E;P&&e.delete(u);let b=w instanceof Error?`: ${w.message}`:"";t.logger?.info(`[Sandbox] ${p.id} closed${b}; ${u} will rehydrate on next message`),P&&t.driver.destroy(p).catch(()=>{})};return m.closed?.then(()=>y(),y),e.set(u,E),t.logger?.info(`[Sandbox] created ${p.id} for ${u} (tier ${p.tier})`),E},c=(u,d)=>{let p=e.get(u);if(p&&!p.dead)return Promise.resolve(p);p?.dead&&e.delete(u);let g=n.get(u);if(g)return g;let m=a(u,d).finally(()=>{n.delete(u)});return n.set(u,m),m},l=async(u,d)=>{if(u.engine.supportsDemux())return d(u);let p=u.queue,g;if(u.queue=new Promise(m=>{g=m}),await p,u.dead)throw g(),new Error("sandbox channel closed");try{return await d(u)}finally{g()}};return{run:async u=>{let d=u.sessionId??"default",p=u.sandboxKey??d,g=w=>(w.sessionKeys.add(d),i(d,p),w),m={text:"",thinking:"",toolCalls:[]},h=yN(u.emitter,m),E=()=>m.text===""&&m.thinking===""&&m.toolCalls.length===0,y=async w=>{await w.engine.stream(u.message,{engineId:u.engineId,modelId:u.modelId,workspaceRoot:u.workspaceRoot,additionalDirectories:u.additionalDirectories,sessionId:u.sessionId,permissions:u.permissions,analyticsUserId:u.analyticsUserId,engineHomeUserKey:(0,hN.engineHomeUserKey)((0,mN.currentCredential)()?.userId),turnEnv:u.turnEnv,gatewaySessionKey:u.gatewaySessionKey},h,t.runtime,u.signal)};try{let w=g(await c(p,d));try{await l(w,y)}catch(P){let b=Rm(P);if(!/channel closed/i.test(b)||!E())throw P;e.get(p)===w&&e.delete(p),t.logger?.info(`[Sandbox] session ${d} lost its sandbox mid-turn; recreating and retrying once`),await l(g(await c(p,d)),y)}return{success:!0,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls}}catch(w){return{success:!1,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls,error:Rm(w)}}},dispose(){for(let[u,d]of e)t.driver.destroy(d.handle).catch(()=>{}),e.delete(u)},sandboxes:()=>[...e.entries()].map(([u,d])=>({sandboxKey:u,sandboxId:d.handle.id,tier:d.handle.tier,sessionKeys:[...d.sessionKeys]})),async destroySession(u){let d=o(u),p=e.get(d);p&&(e.delete(d),await t.driver.destroy(p.handle),t.logger?.info(`[Sandbox] destroyed ${p.handle.id} (${d}${Cm(p,u)})`))},async revokeRoute(u,d){let p=o(u),g=e.get(p);g&&(await t.driver.revoke(g.handle,d),d==="all"&&e.delete(p),t.logger?.info(`[Sandbox] revoked ${d} on ${g.handle.id} (${p}${Cm(g,u)})`))}}}function yN(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 Rm(t){return t instanceof Error?t.message:String(t)}function Cm(t,e){let n=[...t.sessionKeys].filter(r=>r!==e);return n.length===0?"":`, also ending ${n.length}: ${n.join(", ")}`}});var Hi=T(Bt=>{"use strict";var _N=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]})),wN=Bt&&Bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),AN=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"&&_N(n,e,r[s]);return wN(n,e),n}})();Object.defineProperty(Bt,"__esModule",{value:!0});Bt.b64urlEncode=nd;Bt.signCompactJws=$m;Bt.verifyCompactJws=Dm;Bt.timingSafeEqualString=SN;Bt.generateWarrantKeypair=bN;Bt.mintWarrant=vN;Bt.verifyWarrant=ON;Bt.jwks=IN;var fs=AN(require("node:crypto"));function nd(t){return Buffer.from(t,"utf8").toString("base64url")}function $m(t,e,n){let r={alg:"ES256",typ:t.typ??"JWT",kid:t.kid},s=`${nd(JSON.stringify(r))}.${nd(JSON.stringify(e))}`,i=fs.sign("sha256",Buffer.from(s),{key:fs.createPrivateKey(n),dsaEncoding:"ieee-p1363"});return`${s}.${i.toString("base64url")}`}function Dm(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 f=!1;try{f=fs.verify("sha256",Buffer.from(`${s}.${i}`),{key:fs.createPublicKey(l),dsaEncoding:"ieee-p1363"},Buffer.from(o,"base64url"))}catch{return{ok:!1,reason:"bad signature"}}return f?{ok:!0,header:a,payload:c,signingInput:`${s}.${i}`}:{ok:!1,reason:"bad signature"}}function SN(t,e){let n=Buffer.from(t,"utf8"),r=Buffer.from(e,"utf8");return n.length!==r.length?!1:fs.timingSafeEqual(n,r)}function bN(t){let{privateKey:e,publicKey:n}=fs.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??fs.createHash("sha256").update(r).digest("hex").slice(0,16)}}var TN=300;function vN(t,e){let n=t.nowSeconds??Math.floor(Date.now()/1e3),r=Math.min(t.ttlSeconds??120,TN),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:fs.randomUUID()};return $m({typ:"JWT",kid:e.kid},s,e.privateKeyPem)}function ON(t,e,n){let r=Dm(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 IN(t){return{keys:t.map(e=>({...fs.createPublicKey(e.publicKeyPem).export({format:"jwk"}),kid:e.kid,alg:"ES256",use:"sig"}))}}});var No=T(H=>{"use strict";var PN=H&&H.__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]})),NN=H&&H.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sd=H&&H.__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"&&PN(n,e,r[s]);return NN(n,e),n}})();Object.defineProperty(H,"__esModule",{value:!0});H.PACK_FULL_REVERIFY_INTERVAL_MS=H.PACK_PROBE_INTERVAL_MS=H.LEASE_JWKS_PINS_ENV=H.LEASE_JWKS_URL_ENV=H.LEASE_SIGNING_KEYS_ENV=H.ALLOW_INSECURE_TRUST_ROOT_ENV=H.PACK_JWKS_PINS_ENV=H.PACK_JWKS_URL_ENV_LEGACY=H.PACK_JWKS_URL_ENV=H.ALLOW_UNSIGNED_PACK_ENV=H.DIGEST_EXCLUDED_SEGMENTS=H.PACK_SIGNATURE_FILE=void 0;H.isDigestExcluded=Oc;H.computePackDigestFromFiles=Mm;H.computePackDigest=id;H.packTreeProbe=rd;H.signPack=RN;H.readPackSignature=Gm;H.verifyPack=Um;H.verifyPackFromFiles=CN;H.requireSignedPack=jm;H.resolveRequireSignedPack=$N;H.allowUnsignedPackFromEnv=DN;H.describePackRefusal=LN;H.publicKeyThumbprints=xm;H.parseJwksPins=Bm;H.assertSecureTrustUrl=Fm;H.loadPackTrustRoot=Wm;H.loadLeaseTrustRoot=HN;H.selectLeaseSigningKeys=jN;H.checkTrustRootSeparation=xN;H.loadPackSigningKeys=FN;H.createPackVerifier=VN;var ji=sd(require("node:crypto")),Ds=sd(require("node:fs")),vc=sd(require("node:path")),Po=Hi();H.PACK_SIGNATURE_FILE="pack.sig";H.DIGEST_EXCLUDED_SEGMENTS=new Set([".git","node_modules"]);function Oc(t){return t===H.PACK_SIGNATURE_FILE?!0:t.split("/").some(e=>H.DIGEST_EXCLUDED_SEGMENTS.has(e))}function Lm(t){let e=ji.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 Mm(t){let e=[];for(let n of t){let r=n.path.replace(/\\/g,"/");Oc(r)||e.push({rel:r,body:n.content,link:n.link})}return Lm(e)}function id(t){let e=[],n=(r,s)=>{for(let i of Ds.readdirSync(r)){let o=s?`${s}/${i}`:i;if(Oc(o))continue;let a=vc.join(r,i),c=Ds.lstatSync(a);c.isSymbolicLink()?e.push({rel:o,body:Buffer.from(Ds.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({rel:o,body:Ds.readFileSync(a)})}};return n(t,""),Lm(e)}function rd(t){let e=[],n=(r,s)=>{let i;try{i=Ds.readdirSync(r).sort()}catch{e.push(`${s}/?unreadable`);return}for(let o of i){let a=s?`${s}/${o}`:o;if(Oc(a))continue;let c=vc.join(r,o),l;try{l=Ds.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 ji.createHash("sha256").update(e.join(`
|
|
478
|
+
`),n=e.pop()??"";return{lines:e.filter(r=>r.trim().length>0),rest:n}}function pN(t,e){let{apiKey:n,...r}=t;return{...r,...e.baseUrl?{baseUrl:e.baseUrl}:{},...e.modelToken?{modelToken:e.modelToken}:{}}}});var Nm=T(Tc=>{"use strict";Object.defineProperty(Tc,"__esModule",{value:!0});Tc.RemoteEngine=void 0;var Pm=lc(),Io=Zu(),ed=class{id;displayName;channel;model;logger;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}async stream(e,n,r,s,i){this.wire();let o=`r${++this.seq}`,a=new Promise((l,f)=>{this.pending.set(o,{emitter:r,resolve:l,reject:f,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.send({type:"run",id:o,message:e,options:(0,Io.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,Io.splitFrames)(this.buffer);this.buffer=r;for(let s of n){let i=(0,Io.parseRunnerFrame)(s);if(!i){this.logger?.warn("[RemoteEngine] dropped malformed runner frame");continue}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,Io.isTaggedEvent)(e)){this.enqueue(this.pending.get(e.id),n=>(0,Pm.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,Pm.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,Io.encodeClientFrame)(e))}};Tc.RemoteEngine=ed});var km=T(td=>{"use strict";Object.defineProperty(td,"__esModule",{value:!0});td.createSandboxRunner=EN;var gN=Nm(),hN=jn(),mN=Ns();function EN(t){let e=new Map,n=new Map,r=new Map,s=1e4,i=(u,d)=>{if(r.size>=s&&!r.has(u)){let p=r.keys().next();p.done||r.delete(p.value)}r.set(u,d)},o=u=>r.get(u)??u,a=async(u,d)=>{await t.admit?.({sandboxKey:u,sessionKey:d});let p=await t.driver.create({sandboxKey:u,image:t.image,tier:t.tier,routes:t.routes,fs:await t.fsFor?.(u)??t.fs??{readonly:[],writable:[]},...t.stateDirFor?{stateDir:await t.stateDirFor(u)}:{},limits:t.limits??{ttlSeconds:1800},env:{...t.env??{},...t.provenanceEnv?.()??{}}}),g=await t.mintModelToken?.(p.id,u),m=p.connect(),h=new gN.RemoteEngine({id:"sandbox",displayName:`Sandbox ${p.id}`,channel:m,model:{baseUrl:t.inferenceBaseUrl,modelToken:g,...t.mintModelToken?{mintToken:async()=>t.mintModelToken(p.id,u)}:{}},logger:t.logger}),E={handle:p,engine:h,dead:!1,sessionKeys:new Set([d]),queue:Promise.resolve()},y=w=>{E.dead=!0;let P=e.get(u)===E;P&&e.delete(u);let b=w instanceof Error?`: ${w.message}`:"";t.logger?.info(`[Sandbox] ${p.id} closed${b}; ${u} will rehydrate on next message`),P&&t.driver.destroy(p).catch(()=>{})};return m.closed?.then(()=>y(),y),e.set(u,E),t.logger?.info(`[Sandbox] created ${p.id} for ${u} (tier ${p.tier})`),E},c=(u,d)=>{let p=e.get(u);if(p&&!p.dead)return Promise.resolve(p);p?.dead&&e.delete(u);let g=n.get(u);if(g)return g;let m=a(u,d).finally(()=>{n.delete(u)});return n.set(u,m),m},l=async(u,d)=>{if(u.engine.supportsDemux())return d(u);let p=u.queue,g;if(u.queue=new Promise(m=>{g=m}),await p,u.dead)throw g(),new Error("sandbox channel closed");try{return await d(u)}finally{g()}};return{run:async u=>{let d=u.sessionId??"default",p=u.sandboxKey??d,g=w=>(w.sessionKeys.add(d),i(d,p),w),m={text:"",thinking:"",toolCalls:[]},h=yN(u.emitter,m),E=()=>m.text===""&&m.thinking===""&&m.toolCalls.length===0,y=async w=>{await w.engine.stream(u.message,{engineId:u.engineId,modelId:u.modelId,workspaceRoot:u.workspaceRoot,additionalDirectories:u.additionalDirectories,sessionId:u.sessionId,permissions:u.permissions,analyticsUserId:u.analyticsUserId,engineHomeUserKey:(0,hN.engineHomeUserKey)((0,mN.currentCredential)()?.userId),turnEnv:u.turnEnv,gatewaySessionKey:u.gatewaySessionKey},h,t.runtime,u.signal)};try{let w=g(await c(p,d));try{await l(w,y)}catch(P){let b=Rm(P);if(!/channel closed/i.test(b)||!E())throw P;e.get(p)===w&&e.delete(p),t.logger?.info(`[Sandbox] session ${d} lost its sandbox mid-turn; recreating and retrying once`),await l(g(await c(p,d)),y)}return{success:!0,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls}}catch(w){return{success:!1,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls,error:Rm(w)}}},dispose(){for(let[u,d]of e)t.driver.destroy(d.handle).catch(()=>{}),e.delete(u)},sandboxes:()=>[...e.entries()].map(([u,d])=>({sandboxKey:u,sandboxId:d.handle.id,tier:d.handle.tier,sessionKeys:[...d.sessionKeys]})),async destroySession(u){let d=o(u),p=e.get(d);p&&(e.delete(d),await t.driver.destroy(p.handle),t.logger?.info(`[Sandbox] destroyed ${p.handle.id} (${d}${Cm(p,u)})`))},async revokeRoute(u,d){let p=o(u),g=e.get(p);g&&(await t.driver.revoke(g.handle,d),d==="all"&&e.delete(p),t.logger?.info(`[Sandbox] revoked ${d} on ${g.handle.id} (${p}${Cm(g,u)})`))}}}function yN(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 Rm(t){return t instanceof Error?t.message:String(t)}function Cm(t,e){let n=[...t.sessionKeys].filter(r=>r!==e);return n.length===0?"":`, also ending ${n.length}: ${n.join(", ")}`}});var Hi=T(Bt=>{"use strict";var _N=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]})),wN=Bt&&Bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),AN=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"&&_N(n,e,r[s]);return wN(n,e),n}})();Object.defineProperty(Bt,"__esModule",{value:!0});Bt.b64urlEncode=nd;Bt.signCompactJws=$m;Bt.verifyCompactJws=Dm;Bt.timingSafeEqualString=SN;Bt.generateWarrantKeypair=bN;Bt.mintWarrant=vN;Bt.verifyWarrant=ON;Bt.jwks=IN;var fs=AN(require("node:crypto"));function nd(t){return Buffer.from(t,"utf8").toString("base64url")}function $m(t,e,n){let r={alg:"ES256",typ:t.typ??"JWT",kid:t.kid},s=`${nd(JSON.stringify(r))}.${nd(JSON.stringify(e))}`,i=fs.sign("sha256",Buffer.from(s),{key:fs.createPrivateKey(n),dsaEncoding:"ieee-p1363"});return`${s}.${i.toString("base64url")}`}function Dm(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 f=!1;try{f=fs.verify("sha256",Buffer.from(`${s}.${i}`),{key:fs.createPublicKey(l),dsaEncoding:"ieee-p1363"},Buffer.from(o,"base64url"))}catch{return{ok:!1,reason:"bad signature"}}return f?{ok:!0,header:a,payload:c,signingInput:`${s}.${i}`}:{ok:!1,reason:"bad signature"}}function SN(t,e){let n=Buffer.from(t,"utf8"),r=Buffer.from(e,"utf8");return n.length!==r.length?!1:fs.timingSafeEqual(n,r)}function bN(t){let{privateKey:e,publicKey:n}=fs.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??fs.createHash("sha256").update(r).digest("hex").slice(0,16)}}var TN=300;function vN(t,e){let n=t.nowSeconds??Math.floor(Date.now()/1e3),r=Math.min(t.ttlSeconds??120,TN),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:fs.randomUUID(),...t.billing==="user"?{billing:"user"}:{},...t.budgetKey?{budgetKey:t.budgetKey}:{},...t.budgetWindowSeconds!==void 0&&t.budgetWindowSeconds>0?{budgetWindowSeconds:t.budgetWindowSeconds}:{}};return $m({typ:"JWT",kid:e.kid},s,e.privateKeyPem)}function ON(t,e,n){let r=Dm(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 IN(t){return{keys:t.map(e=>({...fs.createPublicKey(e.publicKeyPem).export({format:"jwk"}),kid:e.kid,alg:"ES256",use:"sig"}))}}});var No=T(H=>{"use strict";var PN=H&&H.__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]})),NN=H&&H.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sd=H&&H.__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"&&PN(n,e,r[s]);return NN(n,e),n}})();Object.defineProperty(H,"__esModule",{value:!0});H.PACK_FULL_REVERIFY_INTERVAL_MS=H.PACK_PROBE_INTERVAL_MS=H.LEASE_JWKS_PINS_ENV=H.LEASE_JWKS_URL_ENV=H.LEASE_SIGNING_KEYS_ENV=H.ALLOW_INSECURE_TRUST_ROOT_ENV=H.PACK_JWKS_PINS_ENV=H.PACK_JWKS_URL_ENV_LEGACY=H.PACK_JWKS_URL_ENV=H.ALLOW_UNSIGNED_PACK_ENV=H.DIGEST_EXCLUDED_SEGMENTS=H.PACK_SIGNATURE_FILE=void 0;H.isDigestExcluded=Oc;H.computePackDigestFromFiles=Mm;H.computePackDigest=id;H.packTreeProbe=rd;H.signPack=RN;H.readPackSignature=Gm;H.verifyPack=Um;H.verifyPackFromFiles=CN;H.requireSignedPack=jm;H.resolveRequireSignedPack=$N;H.allowUnsignedPackFromEnv=DN;H.describePackRefusal=LN;H.publicKeyThumbprints=xm;H.parseJwksPins=Bm;H.assertSecureTrustUrl=Fm;H.loadPackTrustRoot=Wm;H.loadLeaseTrustRoot=HN;H.selectLeaseSigningKeys=jN;H.checkTrustRootSeparation=xN;H.loadPackSigningKeys=FN;H.createPackVerifier=VN;var ji=sd(require("node:crypto")),Ds=sd(require("node:fs")),vc=sd(require("node:path")),Po=Hi();H.PACK_SIGNATURE_FILE="pack.sig";H.DIGEST_EXCLUDED_SEGMENTS=new Set([".git","node_modules"]);function Oc(t){return t===H.PACK_SIGNATURE_FILE?!0:t.split("/").some(e=>H.DIGEST_EXCLUDED_SEGMENTS.has(e))}function Lm(t){let e=ji.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 Mm(t){let e=[];for(let n of t){let r=n.path.replace(/\\/g,"/");Oc(r)||e.push({rel:r,body:n.content,link:n.link})}return Lm(e)}function id(t){let e=[],n=(r,s)=>{for(let i of Ds.readdirSync(r)){let o=s?`${s}/${i}`:i;if(Oc(o))continue;let a=vc.join(r,i),c=Ds.lstatSync(a);c.isSymbolicLink()?e.push({rel:o,body:Buffer.from(Ds.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({rel:o,body:Ds.readFileSync(a)})}};return n(t,""),Lm(e)}function rd(t){let e=[],n=(r,s)=>{let i;try{i=Ds.readdirSync(r).sort()}catch{e.push(`${s}/?unreadable`);return}for(let o of i){let a=s?`${s}/${o}`:o;if(Oc(a))continue;let c=vc.join(r,o),l;try{l=Ds.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 ji.createHash("sha256").update(e.join(`
|
|
479
479
|
`)).digest("hex")}function RN(t){let e=id(t.packDir),n={pack:t.pack,packVersion:t.packVersion,digest:e,iat:t.nowSeconds??Math.floor(Date.now()/1e3)},r=(0,Po.signCompactJws)({typ:"JWT",kid:t.kid},n,t.privateKeyPem);return Ds.writeFileSync(vc.join(t.packDir,H.PACK_SIGNATURE_FILE),`${r}
|
|
480
480
|
`),{signature:r,digest:e}}function Gm(t){try{return Ds.readFileSync(vc.join(t,H.PACK_SIGNATURE_FILE),"utf8").trim()||void 0}catch{return}}function Um(t,e,n){return Hm(t,e,n.pack,n.packVersion,()=>id(n.packDir))}function CN(t,e,n,r,s){return Hm(t,e,n,r,()=>Mm(s))}function Hm(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,Po.verifyCompactJws)(t,e);if(!i.ok)return i.reason==="unknown kid"?{ok:!1,kind:"unknown-key",reason:`unknown signing key ${kN(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,Po.timingSafeEqualString)(s(),o.digest)?{ok:!0,claims:o}:{ok:!1,kind:"digest-mismatch",reason:"pack contents changed after signing"}}function kN(t){try{return JSON.parse(Buffer.from(t.split(".")[0],"base64url").toString("utf8")).kid}catch{return}}function jm(t,e){return!!t||!!e}H.ALLOW_UNSIGNED_PACK_ENV="AGENTHIPPO_ALLOW_UNSIGNED_PACK";function $N(t){return jm(t.lease,t.localRequire)?!0:!t.localAllowUnsigned}function DN(t=process.env){let e=t[H.ALLOW_UNSIGNED_PACK_ENV]?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function LN(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 ${H.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)',` ${H.PACK_JWKS_URL_ENV} https URL of the JWKS document publishing your signing keys`,` ${H.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(` ${H.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 ${H.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(`
|
|
481
481
|
`)}H.PACK_JWKS_URL_ENV="AGENTHIPPO_PACK_JWKS_URL";H.PACK_JWKS_URL_ENV_LEGACY="AGENTHIPPO_PACK_SIGNING_JWKS_URL";H.PACK_JWKS_PINS_ENV="AGENTHIPPO_PACK_JWKS_PINS";H.ALLOW_INSECURE_TRUST_ROOT_ENV="AGENTHIPPO_ALLOW_INSECURE_TRUST_ROOT";H.LEASE_SIGNING_KEYS_ENV="AGENTHIPPO_LEASE_SIGNING_KEYS";H.LEASE_JWKS_URL_ENV="AGENTHIPPO_LEASE_JWKS_URL";H.LEASE_JWKS_PINS_ENV="AGENTHIPPO_LEASE_JWKS_PINS";function xm(t){let e=ji.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:ji.createHash("sha256").update(JSON.stringify(r)).digest("base64url"),spki:ji.createHash("sha256").update(e.export({type:"spki",format:"der"})).digest("hex")}}var MN=t=>t.trim().replace(/^sha256:/i,"").toLowerCase();function Bm(t){return(t??"").split(",").map(MN).filter(e=>e.length>0)}function Fm(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[H.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 ${H.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 ${H.ALLOW_INSECURE_TRUST_ROOT_ENV}=1 to allow plaintext for LOCAL DEVELOPMENT ONLY.`}}var GN={label:"pack",purpose:"pack-signing",inlineEnv:"AGENTHIPPO_PACK_SIGNING_KEYS",urlEnvs:[H.PACK_JWKS_URL_ENV,H.PACK_JWKS_URL_ENV_LEGACY],pinsEnv:H.PACK_JWKS_PINS_ENV,derivedRisk:"chooses which packs this instance will run"},UN={label:"lease",purpose:"lease-signing",inlineEnv:H.LEASE_SIGNING_KEYS_ENV,urlEnvs:[H.LEASE_JWKS_URL_ENV],pinsEnv:H.LEASE_JWKS_PINS_ENV,derivedRisk:"chooses whether this instance's kill switch is ever honoured"};async function Vm(t,e){let n=e.env??process.env,r=[],s=Bm(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,p,g)=>{if(s.length===0)return Object.keys(d).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:d,source:p,url:g,warnings:r,explicitlyConfigured:a};let m={};for(let[h,E]of Object.entries(d)){let y;try{y=xm(E)}catch{r.push(`${t.label} trust root: key ${h} is unreadable and was dropped`);continue}s.some(P=>(0,Po.timingSafeEqualString)(P,y.jwk.toLowerCase())||(0,Po.timingSafeEqualString)(P,y.spki))?m[h]=E:r.push(`${t.label} trust root: key ${h} does not match any pin in ${t.pinsEnv} and was REFUSED (its thumbprints are jwk=${y.jwk} spki=${y.spki})`)}return Object.keys(m).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:m,source:p,url:g,warnings:r,explicitlyConfigured:a}};if(i){let d;try{d=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(d,"inline")}let l=o,f=!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}`}}f=!0}if(!l)return{status:"unconfigured",keys:{},warnings:r,explicitlyConfigured:a};let u=Fm(l,`the ${t.purpose} JWKS URL`,n);if(!u.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:u.reason,derivedFromLease:f,explicitlyConfigured:a};r.push(...u.warnings),f&&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:f,explicitlyConfigured:a};let p=await d.json(),g=BN(p);return g.ok?{...c(g.pems,"jwks",l),derivedFromLease:f}:{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:g.reason,derivedFromLease:f,explicitlyConfigured:a}}catch(d){return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,derivedFromLease:f,explicitlyConfigured:a,reason:`JWKS fetch failed: ${d instanceof Error?d.message:String(d)}`}}}async function Wm(t){return Vm(GN,t)}async function HN(t){return Vm(UN,t)}function jN(t,e){return t.explicitlyConfigured?{keys:t.keys,packFallback:!1}:{keys:{...e.keys,...t.keys},packFallback:!0}}function xN(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:`${H.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 ${H.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 BN(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]=ji.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 FN(t){return(await Wm(t)).keys}H.PACK_PROBE_INTERVAL_MS=1e3;H.PACK_FULL_REVERIFY_INTERVAL_MS=3e4;function VN(t={}){let e=t.probeIntervalMs??H.PACK_PROBE_INTERVAL_MS,n=t.fullReverifyIntervalMs??H.PACK_FULL_REVERIFY_INTERVAL_MS,r,s="",i="",o=0,a=0,c=0,l=u=>`${u.packDir}\0${u.pack}\0${u.packVersion}\0${Object.keys(u.keys).sort().join(",")}`,f=(u,d)=>{c+=1,s=l(u),i=rd(u.packDir),o=d,a=d;let p=Gm(u.packDir);return r=p?Um(p,u.keys,{packDir:u.packDir,pack:u.pack,packVersion:u.packVersion}):{ok:!1,kind:"unsigned",reason:`${u.pack} is not signed (no ${H.PACK_SIGNATURE_FILE} at the pack root)`},r};return{fullVerifications:()=>c,refresh(u,d=Date.now()){return f(u,d)},verify(u,d=Date.now()){return!r||s!==l(u)||d-a>=n?f(u,d):d-o<e||(o=d,rd(u.packDir)===i)?r:f(u,d)}}}});var cd=T(rn=>{"use strict";var WN=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]})),KN=rn&&rn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Km=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"&&WN(n,e,r[s]);return KN(n,e),n}})();Object.defineProperty(rn,"__esModule",{value:!0});rn.CURRENT_LINK=void 0;rn.safeJoin=qm;rn.promoteCurrent=ad;rn.reconcilePinnedPack=qN;rn.readDirAsFiles=Ym;var kt=Km(require("node:fs")),ps=Km(require("node:path")),od=No();rn.CURRENT_LINK="current";function qm(t,e){if(ps.isAbsolute(e))return;let n=ps.resolve(t,e),r=t.endsWith(ps.sep)?t:t+ps.sep;return n.startsWith(r)?n:void 0}function ad(t,e){let n=ps.join(t,rn.CURRENT_LINK),r=`${n}.swap-${process.pid}-${Date.now()}`;return kt.symlinkSync(e,r),kt.renameSync(r,n),n}async function qN(t){let{pack:e,pinnedVersion:n,packsRoot:r,logger:s}=t,i=ps.join(r,n);if(kt.mkdirSync(r,{recursive:!0}),kt.existsSync(i)){let c=YN(i,e,n,t.publicKeysByKid);if(c.ok)return ad(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=ps.join(r,`.staging-${n}-${process.pid}-${Date.now()}`);try{kt.mkdirSync(a,{recursive:!0});for(let l of o){let f=qm(a,l.path);if(!f)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(ps.dirname(f),{recursive:!0}),kt.writeFileSync(f,l.content)}let c=Jm(o,e,n,t.publicKeysByKid);return c.ok?(kt.renameSync(a,i),ad(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 Ym(t){let e=[],n=(r,s)=>{for(let i of kt.readdirSync(r)){let o=s?`${s}/${i}`:i;if(od.DIGEST_EXCLUDED_SEGMENTS.has(i))continue;let a=ps.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 Jm(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,"/")===od.PACK_SIGNATURE_FILE);if(!s)return{ok:!1,reason:`${e}@${n} is not signed`};let i=s.content.toString("utf8").trim(),o=(0,od.verifyPackFromFiles)(i,r,e,n,t);return o.ok?{ok:!0}:{ok:!1,reason:o.reason}}function YN(t,e,n,r){return Jm(Ym(t),e,n,r)}});var Ic=T(ye=>{"use strict";Object.defineProperty(ye,"__esModule",{value:!0});ye.STORE_ICONS=ye.STORE_PATHS=ye.DEFAULT_STORE_BRANCH=ye.DEFAULT_STORE_REPO=ye.DEFAULT_STORE_OWNER=void 0;ye.parseGitHubUrl=Xm;ye.parseStoreUrl=JN;ye.formatStoreUrl=XN;ye.isStoreUrl=zN;ye.getStorePath=zm;ye.getStoreIndexUrl=QN;ye.getTagsApiUrl=ZN;ye.isForkOfStoreRepo=eR;ye.formatStorePullRequestError=tR;ye.DEFAULT_STORE_OWNER="agenthippoai";ye.DEFAULT_STORE_REPO="agenthippo-store";ye.DEFAULT_STORE_BRANCH="main";ye.STORE_PATHS={packs:"agent-packs",skills:"skills",mcp:"mcp",engines:"engines",spotlightViews:"spotlight"};ye.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 Xm(t,e=ye.DEFAULT_STORE_OWNER,n=ye.DEFAULT_STORE_REPO){let r=t.trim(),s=r.match(/github\.com\/([^/]+)\/([^/]+)(?:\/tree\/([^/]+)(?:\/(.+))?)?/);if(s){let[,o,a,c,l]=s,f=o===e&&a===n;return{owner:o,repo:a.replace(/\.git$/,""),ref:c,path:l,isStore:f}}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 JN(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 XN(t){let n=`store://${zm(t.type)}/${t.slug}`;return t.version&&(n+=`@v${t.version}`),n}function zN(t,e=ye.DEFAULT_STORE_OWNER,n=ye.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=Xm(t,e,n);if(s.isStore&&s.path)return/^(agent-packs|skills|mcp|engines|spotlight|spotlight-views)\//.test(s.path)}catch{}return!1}function zm(t){switch(t){case"pack":return ye.STORE_PATHS.packs;case"skill":return ye.STORE_PATHS.skills;case"mcp":return ye.STORE_PATHS.mcp;case"engine":return ye.STORE_PATHS.engines;case"view":return ye.STORE_PATHS.spotlightViews}}function QN(t=ye.DEFAULT_STORE_OWNER,e=ye.DEFAULT_STORE_REPO){return`https://${t}.github.io/${e}/store-index.json`}function ZN(t=ye.DEFAULT_STORE_OWNER,e=ye.DEFAULT_STORE_REPO){return`https://api.github.com/repos/${t}/${e}/git/refs/tags`}function eR(t,e,n){if(!t.fork)return!1;let r=`${e}/${n}`.toLowerCase();return(t.parentFullName??"").toLowerCase()===r}function tR(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}.
|
|
482
482
|
|
|
483
483
|
Open ${o} on GitHub, use "Sync fork" \u2192 "Update branch", then publish again.
|
|
484
|
-
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 dd=T(wr=>{"use strict";var nR=wr&&wr.__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]})),rR=wr&&wr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ud=wr&&wr.__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"&&nR(n,e,r[s]);return rR(n,e),n}})();Object.defineProperty(wr,"__esModule",{value:!0});wr.LocalRegistry=void 0;wr.getRegistry=iR;var Ro=ud(require("fs")),Qm=ud(require("path")),sR=ud(require("os"));function Zm(){return{packs:{},skills:{},mcp:{}}}var Pc=class{data=null;registryPath;constructor(e,n){this.registryPath=e||Qm.join(sR.homedir(),".agentide","registry.json")}ensureDir(){let e=Qm.dirname(this.registryPath);Ro.existsSync(e)||Ro.mkdirSync(e,{recursive:!0})}load(){if(this.data)return this.data;if(Ro.existsSync(this.registryPath))try{let e=Ro.readFileSync(this.registryPath,"utf-8");this.data=JSON.parse(e)}catch{this.data=Zm()}else this.data=Zm();return this.data}save(){this.data&&(this.ensureDir(),Ro.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,f)=>{let u=`${l.slug} ${l.displayName} ${l.description||""} ${l.tags.join(" ")}`.toLowerCase(),d=0;for(let p of a)u.includes(p)&&(d+=10);return d===0?0:d+f/100};if(r.includes("pack")){let l=await this.listPacks();for(let f of l){let u=c(f,f.installs);u>0&&i.push({type:"pack",slug:f.slug,displayName:f.displayName,description:f.description,score:u,data:f})}}if(r.includes("skill")){let l=await this.listSkills();for(let f of l){let u=c(f,f.installs);u>0&&i.push({type:"skill",slug:f.slug,displayName:f.displayName,description:f.description,score:u,data:f})}}if(r.includes("mcp")){let l=await this.listMcp();for(let f of l){let u=c(f,f.installs);u>0&&i.push({type:"mcp",slug:f.slug,displayName:f.displayName,description:f.description,score:u,data:f})}}return i.sort((l,f)=>f.score-l.score).slice(0,s)}};wr.LocalRegistry=Pc;var ld=null;function iR(t){return ld||(ld=new Pc(void 0,t)),ld}});var fd=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=Zt(),branding_1=qe(),github_1=mo(),shared_1=Ic(),shared_2=Ic();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=dd();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],f=parseInt(c,8)||0,u=t.subarray(n+512,n+512+f),d=512+Math.ceil(f/512)*512;if(l===120||l===103){let g=u.toString("utf-8").match(/\d+ path=([^\n]+)\n/);g&&(r=g[1]),n+=d;continue}if(l===76){r=s(u),n+=d;continue}let p=r??(a?`${a}/${o}`:o);r=void 0,p&&(l===0||l===48)&&e.set(p,Buffer.from(u)),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}`,f=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!f.ok){if(f.status===401||f.status===403||f.status===404||f.status===429){e&&(0,utils_1.logInfo)(e,"[Store] Requires authentication, signing in...");let h=await(0,github_1.getGitHubToken)();f=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${h}`},redirect:"follow"})}if(!f.ok)throw new Error(`Version ${s||"latest"} not found for ${n} "${r}"`)}let u=Buffer.from(await f.arrayBuffer()),d=(0,zlib_1.gunzipSync)(u),p=parseTar(d),g=`${o}/${r}/`,m=[];for(let[h,E]of p){let y=h.indexOf("/");if(y===-1)continue;let w=h.slice(y+1);if(w.startsWith(g)){let P=w.slice(g.length);P&&(m.push({path:P,content:E}),e&&(0,utils_1.logInfo)(e,`[Store] \u2193 ${P}`))}}return m}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 m=await(0,github_1.getGitHubToken)();c=await fetch(a,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${m}`},redirect:"follow"})}if(!c.ok)throw new Error(`Failed to download from ${n}/${r}@${s}: ${c.statusText}`)}let l=Buffer.from(await c.arrayBuffer()),f=(0,zlib_1.gunzipSync)(l),u=parseTar(f),d="";for(let m of u.keys())if(m.includes("/")){d=m.split("/")[0]+"/";break}let p=i?`${d}${i}/`:d,g=[];for(let[m,h]of u)if(m.startsWith(p)){let E=m.slice(p.length);E&&!E.endsWith("/")&&g.push({path:E,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}.
|
|
484
|
+
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 dd=T(wr=>{"use strict";var nR=wr&&wr.__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]})),rR=wr&&wr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ud=wr&&wr.__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"&&nR(n,e,r[s]);return rR(n,e),n}})();Object.defineProperty(wr,"__esModule",{value:!0});wr.LocalRegistry=void 0;wr.getRegistry=iR;var Ro=ud(require("fs")),Qm=ud(require("path")),sR=ud(require("os"));function Zm(){return{packs:{},skills:{},mcp:{}}}var Pc=class{data=null;registryPath;constructor(e,n){this.registryPath=e||Qm.join(sR.homedir(),".agentide","registry.json")}ensureDir(){let e=Qm.dirname(this.registryPath);Ro.existsSync(e)||Ro.mkdirSync(e,{recursive:!0})}load(){if(this.data)return this.data;if(Ro.existsSync(this.registryPath))try{let e=Ro.readFileSync(this.registryPath,"utf-8");this.data=JSON.parse(e)}catch{this.data=Zm()}else this.data=Zm();return this.data}save(){this.data&&(this.ensureDir(),Ro.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,f)=>{let u=`${l.slug} ${l.displayName} ${l.description||""} ${l.tags.join(" ")}`.toLowerCase(),d=0;for(let p of a)u.includes(p)&&(d+=10);return d===0?0:d+f/100};if(r.includes("pack")){let l=await this.listPacks();for(let f of l){let u=c(f,f.installs);u>0&&i.push({type:"pack",slug:f.slug,displayName:f.displayName,description:f.description,score:u,data:f})}}if(r.includes("skill")){let l=await this.listSkills();for(let f of l){let u=c(f,f.installs);u>0&&i.push({type:"skill",slug:f.slug,displayName:f.displayName,description:f.description,score:u,data:f})}}if(r.includes("mcp")){let l=await this.listMcp();for(let f of l){let u=c(f,f.installs);u>0&&i.push({type:"mcp",slug:f.slug,displayName:f.displayName,description:f.description,score:u,data:f})}}return i.sort((l,f)=>f.score-l.score).slice(0,s)}};wr.LocalRegistry=Pc;var ld=null;function iR(t){return ld||(ld=new Pc(void 0,t)),ld}});var fd=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=Zt(),branding_1=Ye(),github_1=mo(),shared_1=Ic(),shared_2=Ic();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=dd();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],f=parseInt(c,8)||0,u=t.subarray(n+512,n+512+f),d=512+Math.ceil(f/512)*512;if(l===120||l===103){let g=u.toString("utf-8").match(/\d+ path=([^\n]+)\n/);g&&(r=g[1]),n+=d;continue}if(l===76){r=s(u),n+=d;continue}let p=r??(a?`${a}/${o}`:o);r=void 0,p&&(l===0||l===48)&&e.set(p,Buffer.from(u)),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}`,f=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!f.ok){if(f.status===401||f.status===403||f.status===404||f.status===429){e&&(0,utils_1.logInfo)(e,"[Store] Requires authentication, signing in...");let h=await(0,github_1.getGitHubToken)();f=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${h}`},redirect:"follow"})}if(!f.ok)throw new Error(`Version ${s||"latest"} not found for ${n} "${r}"`)}let u=Buffer.from(await f.arrayBuffer()),d=(0,zlib_1.gunzipSync)(u),p=parseTar(d),g=`${o}/${r}/`,m=[];for(let[h,E]of p){let y=h.indexOf("/");if(y===-1)continue;let w=h.slice(y+1);if(w.startsWith(g)){let P=w.slice(g.length);P&&(m.push({path:P,content:E}),e&&(0,utils_1.logInfo)(e,`[Store] \u2193 ${P}`))}}return m}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 m=await(0,github_1.getGitHubToken)();c=await fetch(a,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${m}`},redirect:"follow"})}if(!c.ok)throw new Error(`Failed to download from ${n}/${r}@${s}: ${c.statusText}`)}let l=Buffer.from(await c.arrayBuffer()),f=(0,zlib_1.gunzipSync)(l),u=parseTar(f),d="";for(let m of u.keys())if(m.includes("/")){d=m.split("/")[0]+"/";break}let p=i?`${d}${i}/`:d,g=[];for(let[m,h]of u)if(m.startsWith(p)){let E=m.slice(p.length);E&&!E.endsWith("/")&&g.push({path:E,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}.
|
|
485
485
|
|
|
486
486
|
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}
|
|
487
487
|
|
|
@@ -501,7 +501,7 @@ ${o||"No changelog provided."}
|
|
|
501
501
|
|
|
502
502
|
---
|
|
503
503
|
*Submitted via AgentIDE*
|
|
504
|
-
`,E=await createPullRequest(p,`[${n}] Add ${r} v${s}`,h,g);return e&&(0,utils_1.logInfo)(e,`[Store] OK Created PR: ${E.url}`),{prUrl:E.url,prNumber:E.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 Co=T(ne=>{"use strict";Object.defineProperty(ne,"__esModule",{value:!0});ne.DENY_SCOPE_ALIASES=ne.DENY_MODE_ALIASES=ne.STRICTEST_DENY_MODE=ne.DENY_MODES=ne.DENY_SCOPES=ne.STRICTEST_ON_BREACH=ne.ON_BREACH_ALIASES=ne.ON_BREACH_ACTIONS=ne.DEPRECATED_CAP_SPELLINGS=ne.LEASE_CAP_ALIASES=ne.LEASE_CAP_FIELDS=void 0;ne.parseCapPolicy=eE;ne.parseLease=cR;ne.LEASE_CAP_FIELDS={maxTurnsPerSession:{kind:"positive-int"},maxSessionSeconds:{kind:"positive-int"},maxConcurrentSandboxes:{kind:"positive-int"}};ne.LEASE_CAP_ALIASES={maxConcurrentCells:"maxConcurrentSandboxes"};ne.DEPRECATED_CAP_SPELLINGS={maxConcurrentCells:"maxConcurrentSandboxes",AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES","destroy-cell":"destroy-sandbox","--max-concurrent-cells":"--max-concurrent-sandboxes"};ne.ON_BREACH_ACTIONS={"revoke-inference":{strictness:1},"destroy-sandbox":{strictness:2}};ne.ON_BREACH_ALIASES={"destroy-cell":"destroy-sandbox"};ne.STRICTEST_ON_BREACH=Object.keys(ne.ON_BREACH_ACTIONS).reduce((t,e)=>ne.ON_BREACH_ACTIONS[t].strictness>=ne.ON_BREACH_ACTIONS[e].strictness?t:e);ne.DENY_SCOPES=["session","user","pack"];ne.DENY_MODES={drain:{strictness:1},kill:{strictness:2}};ne.STRICTEST_DENY_MODE="kill";ne.DENY_MODE_ALIASES={};ne.DENY_SCOPE_ALIASES={};var pd=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function oR(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 eE(t,e="caps"){if(t==null)return{ok:!0,caps:{},warnings:[]};if(!pd(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 ne.LEASE_CAP_FIELDS?i:ne.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=oR(`${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 ne.ON_BREACH_ACTIONS?s:ne.ON_BREACH_ALIASES[s];i?r.onBreach=i:(r.onBreach=ne.STRICTEST_ON_BREACH,n.push(`${e}.onBreach="${s}" is not an action this build understands. Failing CLOSED to "${ne.STRICTEST_ON_BREACH}" (the strictest known action). Known actions: ${Object.keys(ne.ON_BREACH_ACTIONS).join(", ")}.`))}return{ok:!0,caps:r,warnings:n}}function aR(t,e){if(!pd(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=ne.DENY_SCOPES.includes(r)?r:ne.DENY_SCOPE_ALIASES[r];if(!s)return{ok:!1,reason:`deny[${e}].scope "${r}" is not a scope this build understands (known: ${ne.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 ne.DENY_MODES?i:ne.DENY_MODE_ALIASES[i];o||(o=ne.STRICTEST_DENY_MODE,n.push(`deny[${e}].mode="${i}" is not a mode this build understands. Failing CLOSED to "${ne.STRICTEST_DENY_MODE}". Known modes: ${Object.keys(ne.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 cR(t){if(!pd(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"]){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.caps!==void 0&&t.caps!==null){let r=eE(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=aR(t.deny[s],s);if(!i.ok)return{ok:!1,reason:i.reason};r.push(i.rule),e.push(...i.warnings)}n.deny=r}return{ok:!0,lease:n,warnings:e}}});var ko=T(ee=>{"use strict";Object.defineProperty(ee,"__esModule",{value:!0});ee.MAX_LEASE_ENVELOPE_TTL_SECONDS=ee.LEASE_JWS_TYP=ee.LeaseDeniedError=ee.LEASE_MAX_STALENESS_ENV=ee.DEFAULT_LEASE_MAX_STALENESS_SECONDS=ee.MIN_LEASE_POLL_SECONDS=ee.DEFAULT_LEASE_POLL_SECONDS=void 0;ee.resolveLeasePollSeconds=gd;ee.leaseCacheSecondsFor=hd;ee.effectiveKillLatencySeconds=dR;ee.leaseMaxStalenessFromEnv=sE;ee.resolveAllowServiceTurns=fR;ee.describeServiceTurnGate=pR;ee.denyVerdict=iE;ee.resolveFollowedUsers=hR;ee.leaseIsDead=mR;ee.policyVersion=ER;ee.assertAdmitted=yR;ee.signLease=_R;ee.verifySignedLease=aE;ee.requireSignedLease=cE;ee.createLeaseSource=wR;var lR=require("crypto"),nE=Hi(),rE=Co(),uR=No();ee.DEFAULT_LEASE_POLL_SECONDS=30;ee.MIN_LEASE_POLL_SECONDS=5;function gd(t){let e=typeof t=="number"&&Number.isFinite(t)?t:ee.DEFAULT_LEASE_POLL_SECONDS;return Math.max(ee.MIN_LEASE_POLL_SECONDS,Math.floor(e))}function hd(t){return gd(t)}function dR(t){let e=gd(t);return e+hd(e)}ee.DEFAULT_LEASE_MAX_STALENESS_SECONDS=1440*60;ee.LEASE_MAX_STALENESS_ENV="AGENTHIPPO_LEASE_MAX_STALENESS_SECONDS";function sE(t=process.env){let e=t[ee.LEASE_MAX_STALENESS_ENV]?.trim();if(e===void 0||e==="")return ee.DEFAULT_LEASE_MAX_STALENESS_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<0?ee.DEFAULT_LEASE_MAX_STALENESS_SECONDS:Math.floor(n)}function fR(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 pR(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 iE(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&&gR(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 oE=t=>`${t.scope}:${t.match}`;function gR(t,e,n){return n?.get(oE(t))?.has(e)??!1}function hR(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("--"),f=l>=0?a.slice(l+2):a;i.match!==a&&i.match!==f||i.user!==void 0&&i.user!==c||o.add(c)}o.size>0&&r.set(oE(i),o)}return r}function mR(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 ER(t){if(!t)return;let{expiresAt:e,...n}=t,r=s=>Array.isArray(s)?s.map(r):s&&typeof s=="object"?Object.fromEntries(Object.keys(s).sort().map(i=>[i,r(s[i])])):s;return(0,lR.createHash)("sha256").update(JSON.stringify(r(n))).digest("hex")}var gs=class extends Error{constructor(e){super(e),this.name="LeaseDeniedError"}};ee.LeaseDeniedError=gs;function yR(t,e){if(!t)return;let n=e.nowSeconds??Math.floor(Date.now()/1e3);if(!t.enabled)throw new gs(`kill switch active for pack ${e.pack}${t.reason?`: ${t.reason}`:""}`);if(t.pack!==e.pack)throw new gs(`lease is for pack ${t.pack}, not ${e.pack}`);if(t.expiresAt<=n)throw new gs(`lease for ${e.pack} expired at ${new Date(t.expiresAt*1e3).toISOString()}`);if(t.version&&t.version!==e.version)throw new gs(`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 gs(`image for ${e.pack} does not match the leased digest ${t.imageDigest}`);if(e.sessionKey){let r=iE(t,{sessionKey:e.sessionKey,pack:e.pack,userHash:e.userHash,userId:e.userId,followedUsers:e.followedUsers},n);if(r.denied)throw new gs(r.reason??"stopped by the control plane")}}ee.LEASE_JWS_TYP="agenthippo-lease+jws";ee.MAX_LEASE_ENVELOPE_TTL_SECONDS=3600;function _R(t,e,n){let r=n.nowSeconds??Math.floor(Date.now()/1e3),s=Math.min(n.ttlSeconds??300,ee.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,nE.signCompactJws)({typ:ee.LEASE_JWS_TYP,kid:e.kid},i,e.privateKeyPem)}function aE(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,nE.verifyCompactJws)(t,e,{typ:ee.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>ee.MAX_LEASE_ENVELOPE_TTL_SECONDS)return{ok:!1,reason:`lease envelope lifetime ${s.exp-s.iat}s exceeds the ${ee.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,rE.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 cE(t,e){return!!t||!!e}var tE=t=>/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(t);function wR(t){let e=t.staticLease,n=0,r,s,i=!1,o=!1,a,c=!1,l=!1,f=!1,u=!1,d=t.cacheSeconds??hd(ee.DEFAULT_LEASE_POLL_SECONDS),p=t.maxStalenessSeconds??sE(t.env),g=t.fetchImpl??fetch,m=()=>cE(o,t.requireSignedLease),h=b=>({...e??{pack:"",expiresAt:0},enabled:!1,reason:`the control plane has not been reachable for ${b}s, past the ${p}s staleness ceiling (${ee.LEASE_MAX_STALENESS_ENV}). Refusing work rather than running on a lease that can no longer be revoked. Set ${ee.LEASE_MAX_STALENESS_ENV}=0 to accept unbounded staleness.`}),E=()=>({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."}),y=!1,w=b=>{if(y=!0,!t.persistence)return;let v;try{v=t.persistence.load()}catch(S){t.logger?.warn(`[Lease] persisted lease unreadable: ${S instanceof Error?S.message:String(S)}`);return}if(!v||typeof v.body!="string")return;typeof v.lastGoodAt=="number"&&Number.isFinite(v.lastGoodAt)&&(r=Math.min(v.lastGoodAt,b));let A=P(v.body,b);if(!A.ok){t.logger?.warn(`[Lease] persisted lease not reinstalled: ${A.reason}`);return}A.signed&&(i=!0,A.lease.requireSignedLease&&(o=!0)),e=A.lease},P=(b,v)=>{let A=b.trim(),S,I;if(tE(A))S=A;else{try{I=JSON.parse(A)}catch(O){return{ok:!1,reason:`lease body is not JSON: ${O instanceof Error?O.message:String(O)}`}}typeof I=="string"&&tE(I.trim())?S=I.trim():I&&typeof I=="object"&&typeof I.lease=="string"&&(S=I.lease.trim())}if(S){let O=aE(S,t.signingKeys?.()??{},{instanceId:t.instanceId,minIat:a,nowSeconds:v});return O.ok?(a=O.claims.iat,{ok:!0,lease:O.lease,signed:!0}):{ok:!1,reason:O.reason}}if(m())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 U=(0,rE.parseLease)(I);if(!U.ok)return{ok:!1,reason:U.reason};for(let O of U.warnings)t.logger?.warn(`[Lease] ${O}`);return{ok:!0,lease:U.lease,signed:!1}};return{status(b){let v=b??Math.floor(Date.now()/1e3),A=r===void 0?void 0:v-r,S=!!t.url&&e===void 0&&s!==void 0;return{signed:i,requireSignedLease:m(),lastGoodAt:r,stalenessSeconds:A,maxStalenessSeconds:p,failClosed:S||p>0&&A!==void 0&&A>p,lastError:s}},async get(b){let v=b??Math.floor(Date.now()/1e3);if(!t.url)return e;if(!u){u=!0;let A=(0,uR.assertSecureTrustUrl)(t.url,"AGENTHIPPO_LEASE_URL",t.env??process.env);if(A.ok)for(let S of A.warnings)t.logger?.warn(`[Lease] ${S}`);else m()?t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${A.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 ${ee.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 ${A.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&&!y&&w(v),e&&v-n<d)return e;try{let A={accept:"application/json, text/plain"};for(let[O,F]of Object.entries(t.identity?.()??{}))F!==void 0&&F!==""&&(A[`x-agenthippo-${O}`]=String(F));let S=await g(t.url,{headers:A});if(!S.ok)throw new Error(S.status===404?`lease fetch 404 \u2014 the control plane has no deployment at ${t.url}; check AGENTHIPPO_LEASE_URL`:`lease fetch ${S.status}`);let I=typeof S.text=="function"?await S.text():JSON.stringify(await S.json()),U=P(I,v);if(!U.ok)throw new Error(U.reason);U.signed?(i=!0,U.lease.requireSignedLease&&(o=!0)):f||(f=!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=U.lease,n=v,r=v,s=void 0,c=!1,l=!1;try{t.persistence?.save({body:I,lastGoodAt:v})}catch(O){t.logger?.warn(`[Lease] could not persist lease: ${O instanceof Error?O.message:String(O)}`)}return e}catch(A){if(s=A instanceof Error?A.message:String(A),e===void 0)return l||(l=!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.`)),E();t.logger?.warn(`[Lease] fetch failed, using cached lease: ${s}`),r===void 0&&(r=v);let S=v-r;return p>0&&S>p?(c||(c=!0,t.logger?.warn(`[Lease] STALENESS CEILING PASSED \u2014 no successful lease refresh for ${S}s (ceiling ${p}s). Failing closed: turns are refused until the control plane is reachable.`)),h(S)):e}}}}});var Nc=T(Ue=>{"use strict";Object.defineProperty(Ue,"__esModule",{value:!0});Ue.CapMeter=Ue.CAP_ENV_ALIASES=Ue.parseCapPolicy=Ue.STRICTEST_ON_BREACH=Ue.ON_BREACH_ALIASES=Ue.ON_BREACH_ACTIONS=Ue.LEASE_CAP_FIELDS=Ue.LEASE_CAP_ALIASES=Ue.DEPRECATED_CAP_SPELLINGS=void 0;Ue.resolveOnBreach=lE;Ue.mergeCaps=SR;Ue.capsAreUnbounded=bR;Ue.capsFromEnv=TR;var xi=Co(),pi=Co();Object.defineProperty(Ue,"DEPRECATED_CAP_SPELLINGS",{enumerable:!0,get:function(){return pi.DEPRECATED_CAP_SPELLINGS}});Object.defineProperty(Ue,"LEASE_CAP_ALIASES",{enumerable:!0,get:function(){return pi.LEASE_CAP_ALIASES}});Object.defineProperty(Ue,"LEASE_CAP_FIELDS",{enumerable:!0,get:function(){return pi.LEASE_CAP_FIELDS}});Object.defineProperty(Ue,"ON_BREACH_ACTIONS",{enumerable:!0,get:function(){return pi.ON_BREACH_ACTIONS}});Object.defineProperty(Ue,"ON_BREACH_ALIASES",{enumerable:!0,get:function(){return pi.ON_BREACH_ALIASES}});Object.defineProperty(Ue,"STRICTEST_ON_BREACH",{enumerable:!0,get:function(){return pi.STRICTEST_ON_BREACH}});Object.defineProperty(Ue,"parseCapPolicy",{enumerable:!0,get:function(){return pi.parseCapPolicy}});Ue.CAP_ENV_ALIASES={AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"};function lE(t,e){let n=t?.trim();if(!n)return{action:void 0,warnings:[]};if(n in xi.ON_BREACH_ACTIONS)return{action:n,warnings:[]};let r=xi.ON_BREACH_ALIASES[n];return r?{action:r,warnings:[`${e}="${n}" is DEPRECATED; use "${xi.DEPRECATED_CAP_SPELLINGS[n]??r}". Treating it as "${r}". The old spelling will stop being accepted.`]}:{action:xi.STRICTEST_ON_BREACH,warnings:[`${e}="${n}" is not a breach action this build understands. FAILING CLOSED to "${xi.STRICTEST_ON_BREACH}" \u2014 an unreadable enforcement setting must never weaken enforcement. Known actions: ${Object.keys(xi.ON_BREACH_ACTIONS).join(", ")}.`]}}var AR=1e4;function SR(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 bR(t){return t.maxTurnsPerSession===void 0&&t.maxSessionSeconds===void 0&&t.maxConcurrentSandboxes===void 0}var md=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>=AR){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)}}};Ue.CapMeter=md;function TR(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(Ue.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=lE(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 dE=T($o=>{"use strict";Object.defineProperty($o,"__esModule",{value:!0});$o.effectiveDenyMode=uE;$o.createGovernor=vR;$o.withGovernor=OR;var Rc=Nc(),Bi=ko();function uE(t,e){return t==="kill"&&!e?"drain":t}function vR(t){let e=new Rc.CapMeter(t.caps),n=(0,Rc.capsAreUnbounded)(t.caps),r,s,i,o=new Map,a=t.sandboxes.supportsInFlightTermination!==!1,c=new Map,l=new Set,f=(h,E)=>{try{t.audit?.(h,E)}catch{}},u=1e4,d=(h,E)=>{if(o.size>=u&&!o.has(h)){let y=o.keys().next();y.done||o.delete(y.value)}o.set(h,E)},p=async(h,E)=>{let y=e.policy().onBreach??"revoke-inference";try{y==="destroy-sandbox"?await t.sandboxes.destroySession(h):await t.sandboxes.revokeRoute(h,"inference")}catch(w){t.logger?.warn(`[Governor] ${y} 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}: ${E.reason} \u2014 ${y}`),f("cap_breach",{sessionKey:h,cap:E.cap,reason:E.reason,action:y})},g=async h=>{let E=t.sandboxes.sandboxes();for(let y of E)await t.sandboxes.destroySession(y.sandboxKey).catch(()=>{});return E.length>0?t.logger?.warn(`[Governor] kill switch: destroyed ${E.length} live sandbox(s) \u2014 ${h}`):a||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.`),f("kill_switch",{reason:h,destroyed:E.length,inFlightTerminated:a}),E.length},m=async()=>{if(t.getLease)try{let h=await t.getLease(),E=(0,Rc.mergeCaps)(h?.caps,t.caps);if(e.setCaps(E),n=(0,Rc.capsAreUnbounded)(E),i=h,c=(0,Bi.resolveFollowedUsers)(h,o),!a)for(let w of h?.deny??[]){if(w.mode!=="kill")continue;let P=`${w.scope}:${w.match}`;l.has(P)||(l.add(P),t.logger?.warn(`[Governor] deny(kill) on ${P} 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.`),f("deny_kill_degraded",{scope:w.scope,match:w.match,effectiveMode:"drain"}))}for(let w of t.sandboxes.sandboxes()){let P=w.sessionKeys.map(b=>({sessionKey:b,v:(0,Bi.denyVerdict)(h,{sessionKey:b,pack:t.pack??"",userHash:t.userHash,userId:o.get(b),followedUsers:c})})).find(({v:b})=>b.denied&&uE(b.mode,a)==="kill");if(P){await t.sandboxes.destroySession(w.sandboxKey).catch(()=>{});for(let b of w.sessionKeys)o.delete(b);t.logger?.warn(`[Governor] deny(kill) destroyed ${w.sandboxId} \u2014 ${P.v.reason}`),f("session_killed",{sessionKey:P.sessionKey,sandboxId:w.sandboxId,reason:P.v.reason,collateralSessions:w.sessionKeys.filter(b=>b!==P.sessionKey)})}}let y=(0,Bi.leaseIsDead)(h);y.dead?(s=y.reason??"lease revoked",await g(s)):s&&(t.logger?.info("[Governor] lease restored \u2014 accepting turns again"),f("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,E){if(s)return{allowed:!1,reason:`stopped by the control plane: ${s}`};E&&d(h,E);let y=(0,Bi.denyVerdict)(i,{sessionKey:h,pack:t.pack??"",userHash:t.userHash,userId:E??o.get(h),followedUsers:(0,Bi.resolveFollowedUsers)(i,o)});if(y.denied)return{allowed:!1,reason:y.reason};if(t.admitPack){let P=t.admitPack(h,i);if(!P.allowed)return{allowed:!1,reason:P.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},recordTurn(h){e.record(h)},killAll:g,refresh:m,start(){if(!t.getLease||r)return;let h=(0,Bi.resolveLeasePollSeconds)(t.pollSeconds)*1e3;r=setInterval(()=>{m()},h),r.unref?.(),m()},stop(){r&&(clearInterval(r),r=void 0)},policy:()=>e.policy()}}function OR(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"}},dispose(){e.stop(),t.dispose()}}}});var yE=T(We=>{"use strict";var IR=We&&We.__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=We&&We.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Lo=We&&We.__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"&&IR(n,e,r[s]);return PR(n,e),n}})();Object.defineProperty(We,"__esModule",{value:!0});We.ContainerSandboxDriver=We.SANDBOX_PACK_DIR=We.SANDBOX_WORKSPACE_DIR=We.SANDBOX_STATE_DIR=We.SANDBOX_SOCKET_DIR_IN_SANDBOX=void 0;We.strictEgressFromEnv=hE;We.prepareSocketDir=mE;We.assertOwnSocket=EE;var NR=Lo(require("node:crypto")),Ar=Lo(require("node:fs")),RR=Lo(require("node:net")),CR=Lo(require("node:os")),Do=Lo(require("node:path")),fE=rc();function hE(t=process.env){return t.AGENTHIPPO_SANDBOX_STRICT_EGRESS==="1"}function kR(){let t=[process.env.AGENTHIPPO_SANDBOX_SOCKET_DIR,"/run/agenthippo/sandboxes",process.env.XDG_RUNTIME_DIR?Do.join(process.env.XDG_RUNTIME_DIR,"agenthippo-sandboxes"):void 0,Do.join(CR.tmpdir(),"agenthippo-sandboxes")].filter(e=>!!e);for(let e of t)try{if(Ar.mkdirSync(e,{recursive:!0}),Ar.accessSync(e,Ar.constants.W_OK),e.length>60)continue;return e}catch{}return"/run/agenthippo/sandboxes"}var $R=kR(),DR=9e4,LR=150;We.SANDBOX_SOCKET_DIR_IN_SANDBOX="/run/sandbox";We.SANDBOX_STATE_DIR="/state";We.SANDBOX_WORKSPACE_DIR="/state/workspace";We.SANDBOX_PACK_DIR="/app/pack";var Ed=class{opts;kind="container";tier=2;sandboxes=new Map;seq=0;instance=NR.randomBytes(2).toString("hex");constructor(e){this.opts=e}async create(e){MR(e.image);let n=`sandbox-${this.instance}-${++this.seq}-${jR(e.sandboxKey)}`,r=this.opts.socketDir??$R,s=Do.join(r,n),i=Do.join(s,"sandbox.sock");Ar.rmSync(s,{recursive:!0,force:!0}),mE(s,this.opts.socketOwner);let o=e.routes.map(h=>({kind:h.kind,network:UR(h.target)})),c=await this.assertRouteNetworks(o)?this.tier:1,l=o[0],f=["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}:${We.SANDBOX_STATE_DIR}`]:["--tmpfs",`${We.SANDBOX_STATE_DIR}:rw,exec,nosuid,size=512m,mode=1777`],"--volume",`${s}:${We.SANDBOX_SOCKET_DIR_IN_SANDBOX}`,"--label",`ai.agenthippo.sandbox=${n}`,"--label",`ai.agenthippo.session=${e.sandboxKey}`,"--label",`ai.agenthippo.tier=${e.tier}`];for(let h of e.fs.readonly)f.push("--volume",pE(h,!0));for(let h of e.fs.writable)f.push("--volume",pE(h,!1));e.limits.memMiB&&f.push("--memory",`${e.limits.memMiB}m`),e.limits.cpu&&f.push("--cpus",e.limits.cpu);for(let[h,E]of Object.entries(e.env??{}))f.push("--env",`${h}=${E}`);f.push("--env",`${fE.SANDBOX_TIER_ENV}=${c}`),f.push(e.image);let u=await this.opts.exec(f);if(u.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to create sandbox ${n}: ${u.stdout.trim()||`exit ${u.code}`}`);let d=u.stdout.trim(),p=new Map;l&&p.set(l.kind,l.network);for(let h of o.slice(1)){let E=await this.opts.exec(["network","connect",h.network,n]);if(E.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to attach ${h.kind} route for sandbox ${n}: ${E.stdout.trim()}`);p.set(h.kind,h.network)}await this.waitForSocket(n,i);let g={containerId:d,socketPath:i,networks:p};e.limits.ttlSeconds>0&&(g.ttl=setTimeout(()=>{this.destroyById(n)},e.limits.ttlSeconds*1e3),g.ttl.unref?.()),this.sandboxes.set(n,g);let m=this.opts.connectFn??HR;return{id:n,tier:c,endpoint:i,connect:()=>m(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??hE())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??DR;if(r<=0)return;let s=Date.now()+r;for(;Date.now()<s;){if(Ar.existsSync(n)){try{EE(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: ${gE(a)}`)}await new Promise(a=>setTimeout(a,LR))}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: ${gE(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 fE.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)}async destroy(e){await this.destroyById(e.id)}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{Ar.rmSync(Do.dirname(n.socketPath),{recursive:!0,force:!0})}catch{}}}};We.ContainerSandboxDriver=Ed;function mE(t,e){if(Ar.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Ar.chownSync(t,e.uid,e.gid),Ar.chmodSync(t,448);return}catch{}Ar.chmodSync(t,987)}function EE(t,e,n=typeof process.getuid=="function"?process.getuid():void 0){let r=Ar.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 pE(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 MR(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 gE(t){return`${t.stdout??""}${t.stderr??""}`.trim()||"(no output)"}var GR=new Set(["localhost","127.0.0.1","::1","0.0.0.0","[::1]"]);function UR(t){let e=t.replace(/^\w+:\/\//,"").split(/[:/]/)[0];if(GR.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 HR(t){let e=RR.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 jR(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var TE=T(Ze=>{"use strict";Object.defineProperty(Ze,"__esModule",{value:!0});Ze.ProcessSandboxDriver=Ze.PROVIDER_KEY_PASSTHROUGH_VARS=Ze.NS_PROBE_ARGS=Ze.UNSHARE_WRAP_ARGS=void 0;Ze.namespaceIsolationFromEnv=xR;Ze.probeNamespaceIsolation=wE;Ze.providerKeyPassthroughFromEnv=AE;Ze.sandboxEnvCarriesProviderKey=SE;Ze.baseSandboxEnv=bE;var _E=require("node:child_process"),yd=rc();function xR(t=process.env){let e=t.AGENTHIPPO_SANDBOX_NS_ISOLATION?.trim().toLowerCase();return e==="off"||e==="0"?"off":e==="require"?"require":"auto"}Ze.UNSHARE_WRAP_ARGS=["--user","--map-current-user","--pid","--fork","--kill-child=SIGTERM","--mount-proc"];Ze.NS_PROBE_ARGS=[...Ze.UNSHARE_WRAP_ARGS,"unshare","--user","true"];async function wE(t=_E.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",[...Ze.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))})}Ze.PROVIDER_KEY_PASSTHROUGH_VARS=["CURSOR_API_KEY"];function AE(t=process.env){return t.AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY==="1"}function SE(t){return Ze.PROVIDER_KEY_PASSTHROUGH_VARS.some(e=>!!t[e])}var _d=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??(()=>wE());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 ${Ze.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}-${BR(e.sandboxKey)}`,r=this.opts.spawnFn??_E.spawn,s=await this.namespaceWrap(),i=s?"unshare":this.opts.command,o=s?[...Ze.UNSHARE_WRAP_ARGS,this.opts.command,...this.opts.args??[]]:this.opts.args??[],c={...bE({...this.opts.allowProviderKeyPassthrough!==void 0?{allowProviderKeyPassthrough:this.opts.allowProviderKeyPassthrough}:{},logger:{warn:g=>console.warn(g)}}),...this.opts.env,...e.env},l=SE(c),f=r(i,o,{cwd:this.opts.cwd,stdio:["pipe","pipe","inherit"],env:{...c,[yd.SANDBOX_TIER_ENV]:String(this.tier),...l?{[yd.SANDBOX_PROVIDER_KEY_ENV]:"1"}:{}}});l&&console.warn(`[Sandbox] ${n} runs WITH a raw provider key in its environment (${Ze.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 u=new Promise(g=>{f.once("exit",()=>g()),f.once("error",()=>g())}),d={input:f.stdout,output:{write:g=>f.stdin?.write(g)??!1},closed:u},p={child:f,channel:d};return e.limits.ttlSeconds>0&&(p.ttl=setTimeout(()=>{this.kill(n)},e.limits.ttlSeconds*1e3),p.ttl.unref?.()),this.sandboxes.set(n,p),{id:n,tier:this.tier,endpoint:"stdio",connect:()=>d}}async revoke(e,n){if(n!=="all")throw new yd.RevocationUnsupportedError("process",n);await this.kill(e.id)}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"))}};Ze.ProcessSandboxDriver=_d;function bE(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"],r={};for(let i of n){let o=e[i];o&&(r[i]=o)}let s=t.allowProviderKeyPassthrough??AE(e);for(let i of Ze.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 BR(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var wd=T(gt=>{"use strict";var FR=gt&>.__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=gt&>.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),OE=gt&>.__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(gt,"__esModule",{value:!0});gt.DEPRECATED_SANDBOX_ENV_ALIASES=void 0;gt.dockerExec=qR;gt.alignSandboxWorkspaceOwnership=YR;gt.resolveSandboxImageUser=PE;gt.ensureSandboxStateDir=JR;gt.sandboxScriptArg=QR;gt.applyDeprecatedSandboxEnvAliases=RE;gt.loadWarrantKeypair=eC;gt.mintSandboxInferenceWarrant=tC;var WR=require("node:child_process"),Mo=OE(require("node:fs")),KR=OE(require("node:path")),IE=Hi();function qR(t){return new Promise(e=>{(0,WR.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 YR(t){let e=t.writable.map(i=>i.includes(":")?i.slice(0,i.indexOf(":")):i);if(e.length===0)return;let n=await PE(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=NE(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 PE(t,e){let n=await vE(t,e,"-u");if(n!==void 0)return{uid:n,gid:await vE(t,e,"-g")??n}}function JR(t,e){if(Mo.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{NE(t,e.uid,e.gid)}catch{}return t}async function vE(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 NE(t,e,n){let r=0,s=i=>{let o=Mo.lstatSync(i);if((o.uid!==e||o.gid!==n)&&(Mo.lchownSync(i,e,n),r++),o.isDirectory())for(let a of Mo.readdirSync(i))s(KR.join(i,a))};return Mo.existsSync(t)?(s(t),r):0}var XR=["/$bunfs","/snapshot"];function zR(t){return t.replace(/\\/g,"/").replace(/^[A-Za-z]:/,"")}function QR(t=process.argv,e=process.execPath){let n=t[1];if(!n||n===e)return[];let r=zR(n);return XR.some(s=>r.startsWith(s))?[]:[n]}gt.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 ZR=new Set;function RE(t=process.env,e=r=>console.warn(r),n=ZR){let r=[];for(let[s,i]of gt.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}RE();function eC(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,IE.generateWarrantKeypair)(n);return t?.info(`[Warrant] no AGENTHIPPO_WARRANT_PRIVATE_KEY \u2014 generated an ephemeral key (kid=${r.kid}). Configure gateways with:
|
|
504
|
+
`,E=await createPullRequest(p,`[${n}] Add ${r} v${s}`,h,g);return e&&(0,utils_1.logInfo)(e,`[Store] OK Created PR: ${E.url}`),{prUrl:E.url,prNumber:E.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 Co=T(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.DENY_SCOPE_ALIASES=re.DENY_MODE_ALIASES=re.STRICTEST_DENY_MODE=re.DENY_MODES=re.DENY_SCOPES=re.STRICTEST_ON_BREACH=re.ON_BREACH_ALIASES=re.ON_BREACH_ACTIONS=re.DEPRECATED_CAP_SPELLINGS=re.LEASE_CAP_ALIASES=re.LEASE_CAP_FIELDS=void 0;re.parseCapPolicy=eE;re.parseLease=cR;re.LEASE_CAP_FIELDS={maxTurnsPerSession:{kind:"positive-int"},maxSessionSeconds:{kind:"positive-int"},maxConcurrentSandboxes:{kind:"positive-int"}};re.LEASE_CAP_ALIASES={maxConcurrentCells:"maxConcurrentSandboxes"};re.DEPRECATED_CAP_SPELLINGS={maxConcurrentCells:"maxConcurrentSandboxes",AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES","destroy-cell":"destroy-sandbox","--max-concurrent-cells":"--max-concurrent-sandboxes"};re.ON_BREACH_ACTIONS={"revoke-inference":{strictness:1},"destroy-sandbox":{strictness:2}};re.ON_BREACH_ALIASES={"destroy-cell":"destroy-sandbox"};re.STRICTEST_ON_BREACH=Object.keys(re.ON_BREACH_ACTIONS).reduce((t,e)=>re.ON_BREACH_ACTIONS[t].strictness>=re.ON_BREACH_ACTIONS[e].strictness?t:e);re.DENY_SCOPES=["session","user","pack"];re.DENY_MODES={drain:{strictness:1},kill:{strictness:2}};re.STRICTEST_DENY_MODE="kill";re.DENY_MODE_ALIASES={};re.DENY_SCOPE_ALIASES={};var pd=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function oR(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 eE(t,e="caps"){if(t==null)return{ok:!0,caps:{},warnings:[]};if(!pd(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 re.LEASE_CAP_FIELDS?i:re.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=oR(`${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 re.ON_BREACH_ACTIONS?s:re.ON_BREACH_ALIASES[s];i?r.onBreach=i:(r.onBreach=re.STRICTEST_ON_BREACH,n.push(`${e}.onBreach="${s}" is not an action this build understands. Failing CLOSED to "${re.STRICTEST_ON_BREACH}" (the strictest known action). Known actions: ${Object.keys(re.ON_BREACH_ACTIONS).join(", ")}.`))}return{ok:!0,caps:r,warnings:n}}function aR(t,e){if(!pd(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=re.DENY_SCOPES.includes(r)?r:re.DENY_SCOPE_ALIASES[r];if(!s)return{ok:!1,reason:`deny[${e}].scope "${r}" is not a scope this build understands (known: ${re.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 re.DENY_MODES?i:re.DENY_MODE_ALIASES[i];o||(o=re.STRICTEST_DENY_MODE,n.push(`deny[${e}].mode="${i}" is not a mode this build understands. Failing CLOSED to "${re.STRICTEST_DENY_MODE}". Known modes: ${Object.keys(re.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 cR(t){if(!pd(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=eE(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=aR(t.deny[s],s);if(!i.ok)return{ok:!1,reason:i.reason};r.push(i.rule),e.push(...i.warnings)}n.deny=r}return{ok:!0,lease:n,warnings:e}}});var ko=T(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.MAX_LEASE_ENVELOPE_TTL_SECONDS=te.LEASE_JWS_TYP=te.LeaseDeniedError=te.LEASE_MAX_STALENESS_ENV=te.DEFAULT_LEASE_MAX_STALENESS_SECONDS=te.MIN_LEASE_POLL_SECONDS=te.DEFAULT_LEASE_POLL_SECONDS=void 0;te.resolveLeasePollSeconds=gd;te.leaseCacheSecondsFor=hd;te.effectiveKillLatencySeconds=dR;te.leaseMaxStalenessFromEnv=sE;te.resolveAllowServiceTurns=fR;te.describeServiceTurnGate=pR;te.denyVerdict=iE;te.resolveFollowedUsers=hR;te.leaseIsDead=mR;te.policyVersion=ER;te.assertAdmitted=yR;te.signLease=_R;te.verifySignedLease=aE;te.requireSignedLease=cE;te.createLeaseSource=wR;var lR=require("crypto"),nE=Hi(),rE=Co(),uR=No();te.DEFAULT_LEASE_POLL_SECONDS=30;te.MIN_LEASE_POLL_SECONDS=5;function gd(t){let e=typeof t=="number"&&Number.isFinite(t)?t:te.DEFAULT_LEASE_POLL_SECONDS;return Math.max(te.MIN_LEASE_POLL_SECONDS,Math.floor(e))}function hd(t){return gd(t)}function dR(t){let e=gd(t);return e+hd(e)}te.DEFAULT_LEASE_MAX_STALENESS_SECONDS=1440*60;te.LEASE_MAX_STALENESS_ENV="AGENTHIPPO_LEASE_MAX_STALENESS_SECONDS";function sE(t=process.env){let e=t[te.LEASE_MAX_STALENESS_ENV]?.trim();if(e===void 0||e==="")return te.DEFAULT_LEASE_MAX_STALENESS_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<0?te.DEFAULT_LEASE_MAX_STALENESS_SECONDS:Math.floor(n)}function fR(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 pR(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 iE(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&&gR(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 oE=t=>`${t.scope}:${t.match}`;function gR(t,e,n){return n?.get(oE(t))?.has(e)??!1}function hR(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("--"),f=l>=0?a.slice(l+2):a;i.match!==a&&i.match!==f||i.user!==void 0&&i.user!==c||o.add(c)}o.size>0&&r.set(oE(i),o)}return r}function mR(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 ER(t){if(!t)return;let{expiresAt:e,...n}=t,r=s=>Array.isArray(s)?s.map(r):s&&typeof s=="object"?Object.fromEntries(Object.keys(s).sort().map(i=>[i,r(s[i])])):s;return(0,lR.createHash)("sha256").update(JSON.stringify(r(n))).digest("hex")}var gs=class extends Error{constructor(e){super(e),this.name="LeaseDeniedError"}};te.LeaseDeniedError=gs;function yR(t,e){if(!t)return;let n=e.nowSeconds??Math.floor(Date.now()/1e3);if(!t.enabled)throw new gs(`kill switch active for pack ${e.pack}${t.reason?`: ${t.reason}`:""}`);if(t.pack!==e.pack)throw new gs(`lease is for pack ${t.pack}, not ${e.pack}`);if(t.expiresAt<=n)throw new gs(`lease for ${e.pack} expired at ${new Date(t.expiresAt*1e3).toISOString()}`);if(t.version&&t.version!==e.version)throw new gs(`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 gs(`image for ${e.pack} does not match the leased digest ${t.imageDigest}`);if(e.sessionKey){let r=iE(t,{sessionKey:e.sessionKey,pack:e.pack,userHash:e.userHash,userId:e.userId,followedUsers:e.followedUsers},n);if(r.denied)throw new gs(r.reason??"stopped by the control plane")}}te.LEASE_JWS_TYP="agenthippo-lease+jws";te.MAX_LEASE_ENVELOPE_TTL_SECONDS=3600;function _R(t,e,n){let r=n.nowSeconds??Math.floor(Date.now()/1e3),s=Math.min(n.ttlSeconds??300,te.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,nE.signCompactJws)({typ:te.LEASE_JWS_TYP,kid:e.kid},i,e.privateKeyPem)}function aE(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,nE.verifyCompactJws)(t,e,{typ:te.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>te.MAX_LEASE_ENVELOPE_TTL_SECONDS)return{ok:!1,reason:`lease envelope lifetime ${s.exp-s.iat}s exceeds the ${te.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,rE.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 cE(t,e){return!!t||!!e}var tE=t=>/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(t);function wR(t){let e=t.staticLease,n=0,r,s,i=!1,o=!1,a,c=!1,l=!1,f=!1,u=!1,d=t.cacheSeconds??hd(te.DEFAULT_LEASE_POLL_SECONDS),p=t.maxStalenessSeconds??sE(t.env),g=t.fetchImpl??fetch,m=()=>cE(o,t.requireSignedLease),h=b=>({...e??{pack:"",expiresAt:0},enabled:!1,reason:`the control plane has not been reachable for ${b}s, past the ${p}s staleness ceiling (${te.LEASE_MAX_STALENESS_ENV}). Refusing work rather than running on a lease that can no longer be revoked. Set ${te.LEASE_MAX_STALENESS_ENV}=0 to accept unbounded staleness.`}),E=()=>({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."}),y=!1,w=b=>{if(y=!0,!t.persistence)return;let v;try{v=t.persistence.load()}catch(S){t.logger?.warn(`[Lease] persisted lease unreadable: ${S instanceof Error?S.message:String(S)}`);return}if(!v||typeof v.body!="string")return;typeof v.lastGoodAt=="number"&&Number.isFinite(v.lastGoodAt)&&(r=Math.min(v.lastGoodAt,b));let A=P(v.body,b);if(!A.ok){t.logger?.warn(`[Lease] persisted lease not reinstalled: ${A.reason}`);return}A.signed&&(i=!0,A.lease.requireSignedLease&&(o=!0)),e=A.lease},P=(b,v)=>{let A=b.trim(),S,I;if(tE(A))S=A;else{try{I=JSON.parse(A)}catch(O){return{ok:!1,reason:`lease body is not JSON: ${O instanceof Error?O.message:String(O)}`}}typeof I=="string"&&tE(I.trim())?S=I.trim():I&&typeof I=="object"&&typeof I.lease=="string"&&(S=I.lease.trim())}if(S){let O=aE(S,t.signingKeys?.()??{},{instanceId:t.instanceId,minIat:a,nowSeconds:v});return O.ok?(a=O.claims.iat,{ok:!0,lease:O.lease,signed:!0}):{ok:!1,reason:O.reason}}if(m())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 U=(0,rE.parseLease)(I);if(!U.ok)return{ok:!1,reason:U.reason};for(let O of U.warnings)t.logger?.warn(`[Lease] ${O}`);return{ok:!0,lease:U.lease,signed:!1}};return{status(b){let v=b??Math.floor(Date.now()/1e3),A=r===void 0?void 0:v-r,S=!!t.url&&e===void 0&&s!==void 0;return{signed:i,requireSignedLease:m(),lastGoodAt:r,stalenessSeconds:A,maxStalenessSeconds:p,failClosed:S||p>0&&A!==void 0&&A>p,lastError:s}},async get(b){let v=b??Math.floor(Date.now()/1e3);if(!t.url)return e;if(!u){u=!0;let A=(0,uR.assertSecureTrustUrl)(t.url,"AGENTHIPPO_LEASE_URL",t.env??process.env);if(A.ok)for(let S of A.warnings)t.logger?.warn(`[Lease] ${S}`);else m()?t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${A.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 ${te.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 ${A.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&&!y&&w(v),e&&v-n<d)return e;try{let A={accept:"application/json, text/plain"};for(let[O,F]of Object.entries(t.identity?.()??{}))F!==void 0&&F!==""&&(A[`x-agenthippo-${O}`]=String(F));let S=await g(t.url,{headers:A});if(!S.ok)throw new Error(S.status===404?`lease fetch 404 \u2014 the control plane has no deployment at ${t.url}; check AGENTHIPPO_LEASE_URL`:`lease fetch ${S.status}`);let I=typeof S.text=="function"?await S.text():JSON.stringify(await S.json()),U=P(I,v);if(!U.ok)throw new Error(U.reason);U.signed?(i=!0,U.lease.requireSignedLease&&(o=!0)):f||(f=!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=U.lease,n=v,r=v,s=void 0,c=!1,l=!1;try{t.persistence?.save({body:I,lastGoodAt:v})}catch(O){t.logger?.warn(`[Lease] could not persist lease: ${O instanceof Error?O.message:String(O)}`)}return e}catch(A){if(s=A instanceof Error?A.message:String(A),e===void 0)return l||(l=!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.`)),E();t.logger?.warn(`[Lease] fetch failed, using cached lease: ${s}`),r===void 0&&(r=v);let S=v-r;return p>0&&S>p?(c||(c=!0,t.logger?.warn(`[Lease] STALENESS CEILING PASSED \u2014 no successful lease refresh for ${S}s (ceiling ${p}s). Failing closed: turns are refused until the control plane is reachable.`)),h(S)):e}}}}});var Nc=T(Ue=>{"use strict";Object.defineProperty(Ue,"__esModule",{value:!0});Ue.CapMeter=Ue.CAP_ENV_ALIASES=Ue.parseCapPolicy=Ue.STRICTEST_ON_BREACH=Ue.ON_BREACH_ALIASES=Ue.ON_BREACH_ACTIONS=Ue.LEASE_CAP_FIELDS=Ue.LEASE_CAP_ALIASES=Ue.DEPRECATED_CAP_SPELLINGS=void 0;Ue.resolveOnBreach=lE;Ue.mergeCaps=SR;Ue.capsAreUnbounded=bR;Ue.capsFromEnv=TR;var xi=Co(),pi=Co();Object.defineProperty(Ue,"DEPRECATED_CAP_SPELLINGS",{enumerable:!0,get:function(){return pi.DEPRECATED_CAP_SPELLINGS}});Object.defineProperty(Ue,"LEASE_CAP_ALIASES",{enumerable:!0,get:function(){return pi.LEASE_CAP_ALIASES}});Object.defineProperty(Ue,"LEASE_CAP_FIELDS",{enumerable:!0,get:function(){return pi.LEASE_CAP_FIELDS}});Object.defineProperty(Ue,"ON_BREACH_ACTIONS",{enumerable:!0,get:function(){return pi.ON_BREACH_ACTIONS}});Object.defineProperty(Ue,"ON_BREACH_ALIASES",{enumerable:!0,get:function(){return pi.ON_BREACH_ALIASES}});Object.defineProperty(Ue,"STRICTEST_ON_BREACH",{enumerable:!0,get:function(){return pi.STRICTEST_ON_BREACH}});Object.defineProperty(Ue,"parseCapPolicy",{enumerable:!0,get:function(){return pi.parseCapPolicy}});Ue.CAP_ENV_ALIASES={AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"};function lE(t,e){let n=t?.trim();if(!n)return{action:void 0,warnings:[]};if(n in xi.ON_BREACH_ACTIONS)return{action:n,warnings:[]};let r=xi.ON_BREACH_ALIASES[n];return r?{action:r,warnings:[`${e}="${n}" is DEPRECATED; use "${xi.DEPRECATED_CAP_SPELLINGS[n]??r}". Treating it as "${r}". The old spelling will stop being accepted.`]}:{action:xi.STRICTEST_ON_BREACH,warnings:[`${e}="${n}" is not a breach action this build understands. FAILING CLOSED to "${xi.STRICTEST_ON_BREACH}" \u2014 an unreadable enforcement setting must never weaken enforcement. Known actions: ${Object.keys(xi.ON_BREACH_ACTIONS).join(", ")}.`]}}var AR=1e4;function SR(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 bR(t){return t.maxTurnsPerSession===void 0&&t.maxSessionSeconds===void 0&&t.maxConcurrentSandboxes===void 0}var md=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>=AR){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)}}};Ue.CapMeter=md;function TR(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(Ue.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=lE(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 dE=T($o=>{"use strict";Object.defineProperty($o,"__esModule",{value:!0});$o.effectiveDenyMode=uE;$o.createGovernor=vR;$o.withGovernor=OR;var Rc=Nc(),Bi=ko();function uE(t,e){return t==="kill"&&!e?"drain":t}function vR(t){let e=new Rc.CapMeter(t.caps),n=(0,Rc.capsAreUnbounded)(t.caps),r,s,i,o=new Map,a=t.sandboxes.supportsInFlightTermination!==!1,c=new Map,l=new Set,f=(h,E)=>{try{t.audit?.(h,E)}catch{}},u=1e4,d=(h,E)=>{if(o.size>=u&&!o.has(h)){let y=o.keys().next();y.done||o.delete(y.value)}o.set(h,E)},p=async(h,E)=>{let y=e.policy().onBreach??"revoke-inference";try{y==="destroy-sandbox"?await t.sandboxes.destroySession(h):await t.sandboxes.revokeRoute(h,"inference")}catch(w){t.logger?.warn(`[Governor] ${y} 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}: ${E.reason} \u2014 ${y}`),f("cap_breach",{sessionKey:h,cap:E.cap,reason:E.reason,action:y})},g=async h=>{let E=t.sandboxes.sandboxes();for(let y of E)await t.sandboxes.destroySession(y.sandboxKey).catch(()=>{});return E.length>0?t.logger?.warn(`[Governor] kill switch: destroyed ${E.length} live sandbox(s) \u2014 ${h}`):a||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.`),f("kill_switch",{reason:h,destroyed:E.length,inFlightTerminated:a}),E.length},m=async()=>{if(t.getLease)try{let h=await t.getLease(),E=(0,Rc.mergeCaps)(h?.caps,t.caps);if(e.setCaps(E),n=(0,Rc.capsAreUnbounded)(E),i=h,c=(0,Bi.resolveFollowedUsers)(h,o),!a)for(let w of h?.deny??[]){if(w.mode!=="kill")continue;let P=`${w.scope}:${w.match}`;l.has(P)||(l.add(P),t.logger?.warn(`[Governor] deny(kill) on ${P} 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.`),f("deny_kill_degraded",{scope:w.scope,match:w.match,effectiveMode:"drain"}))}for(let w of t.sandboxes.sandboxes()){let P=w.sessionKeys.map(b=>({sessionKey:b,v:(0,Bi.denyVerdict)(h,{sessionKey:b,pack:t.pack??"",userHash:t.userHash,userId:o.get(b),followedUsers:c})})).find(({v:b})=>b.denied&&uE(b.mode,a)==="kill");if(P){await t.sandboxes.destroySession(w.sandboxKey).catch(()=>{});for(let b of w.sessionKeys)o.delete(b);t.logger?.warn(`[Governor] deny(kill) destroyed ${w.sandboxId} \u2014 ${P.v.reason}`),f("session_killed",{sessionKey:P.sessionKey,sandboxId:w.sandboxId,reason:P.v.reason,collateralSessions:w.sessionKeys.filter(b=>b!==P.sessionKey)})}}let y=(0,Bi.leaseIsDead)(h);y.dead?(s=y.reason??"lease revoked",await g(s)):s&&(t.logger?.info("[Governor] lease restored \u2014 accepting turns again"),f("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,E){if(s)return{allowed:!1,reason:`stopped by the control plane: ${s}`};E&&d(h,E);let y=(0,Bi.denyVerdict)(i,{sessionKey:h,pack:t.pack??"",userHash:t.userHash,userId:E??o.get(h),followedUsers:(0,Bi.resolveFollowedUsers)(i,o)});if(y.denied)return{allowed:!1,reason:y.reason};if(t.admitPack){let P=t.admitPack(h,i);if(!P.allowed)return{allowed:!1,reason:P.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},recordTurn(h){e.record(h)},killAll:g,refresh:m,start(){if(!t.getLease||r)return;let h=(0,Bi.resolveLeasePollSeconds)(t.pollSeconds)*1e3;r=setInterval(()=>{m()},h),r.unref?.(),m()},stop(){r&&(clearInterval(r),r=void 0)},policy:()=>e.policy()}}function OR(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"}},dispose(){e.stop(),t.dispose()}}}});var yE=T(Ke=>{"use strict";var IR=Ke&&Ke.__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=Ke&&Ke.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Lo=Ke&&Ke.__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"&&IR(n,e,r[s]);return PR(n,e),n}})();Object.defineProperty(Ke,"__esModule",{value:!0});Ke.ContainerSandboxDriver=Ke.SANDBOX_PACK_DIR=Ke.SANDBOX_WORKSPACE_DIR=Ke.SANDBOX_STATE_DIR=Ke.SANDBOX_SOCKET_DIR_IN_SANDBOX=void 0;Ke.strictEgressFromEnv=hE;Ke.prepareSocketDir=mE;Ke.assertOwnSocket=EE;var NR=Lo(require("node:crypto")),Ar=Lo(require("node:fs")),RR=Lo(require("node:net")),CR=Lo(require("node:os")),Do=Lo(require("node:path")),fE=rc();function hE(t=process.env){return t.AGENTHIPPO_SANDBOX_STRICT_EGRESS==="1"}function kR(){let t=[process.env.AGENTHIPPO_SANDBOX_SOCKET_DIR,"/run/agenthippo/sandboxes",process.env.XDG_RUNTIME_DIR?Do.join(process.env.XDG_RUNTIME_DIR,"agenthippo-sandboxes"):void 0,Do.join(CR.tmpdir(),"agenthippo-sandboxes")].filter(e=>!!e);for(let e of t)try{if(Ar.mkdirSync(e,{recursive:!0}),Ar.accessSync(e,Ar.constants.W_OK),e.length>60)continue;return e}catch{}return"/run/agenthippo/sandboxes"}var $R=kR(),DR=9e4,LR=150;Ke.SANDBOX_SOCKET_DIR_IN_SANDBOX="/run/sandbox";Ke.SANDBOX_STATE_DIR="/state";Ke.SANDBOX_WORKSPACE_DIR="/state/workspace";Ke.SANDBOX_PACK_DIR="/app/pack";var Ed=class{opts;kind="container";tier=2;sandboxes=new Map;seq=0;instance=NR.randomBytes(2).toString("hex");constructor(e){this.opts=e}async create(e){MR(e.image);let n=`sandbox-${this.instance}-${++this.seq}-${jR(e.sandboxKey)}`,r=this.opts.socketDir??$R,s=Do.join(r,n),i=Do.join(s,"sandbox.sock");Ar.rmSync(s,{recursive:!0,force:!0}),mE(s,this.opts.socketOwner);let o=e.routes.map(h=>({kind:h.kind,network:UR(h.target)})),c=await this.assertRouteNetworks(o)?this.tier:1,l=o[0],f=["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}:${Ke.SANDBOX_STATE_DIR}`]:["--tmpfs",`${Ke.SANDBOX_STATE_DIR}:rw,exec,nosuid,size=512m,mode=1777`],"--volume",`${s}:${Ke.SANDBOX_SOCKET_DIR_IN_SANDBOX}`,"--label",`ai.agenthippo.sandbox=${n}`,"--label",`ai.agenthippo.session=${e.sandboxKey}`,"--label",`ai.agenthippo.tier=${e.tier}`];for(let h of e.fs.readonly)f.push("--volume",pE(h,!0));for(let h of e.fs.writable)f.push("--volume",pE(h,!1));e.limits.memMiB&&f.push("--memory",`${e.limits.memMiB}m`),e.limits.cpu&&f.push("--cpus",e.limits.cpu);for(let[h,E]of Object.entries(e.env??{}))f.push("--env",`${h}=${E}`);f.push("--env",`${fE.SANDBOX_TIER_ENV}=${c}`),f.push(e.image);let u=await this.opts.exec(f);if(u.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to create sandbox ${n}: ${u.stdout.trim()||`exit ${u.code}`}`);let d=u.stdout.trim(),p=new Map;l&&p.set(l.kind,l.network);for(let h of o.slice(1)){let E=await this.opts.exec(["network","connect",h.network,n]);if(E.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to attach ${h.kind} route for sandbox ${n}: ${E.stdout.trim()}`);p.set(h.kind,h.network)}await this.waitForSocket(n,i);let g={containerId:d,socketPath:i,networks:p};e.limits.ttlSeconds>0&&(g.ttl=setTimeout(()=>{this.destroyById(n)},e.limits.ttlSeconds*1e3),g.ttl.unref?.()),this.sandboxes.set(n,g);let m=this.opts.connectFn??HR;return{id:n,tier:c,endpoint:i,connect:()=>m(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??hE())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??DR;if(r<=0)return;let s=Date.now()+r;for(;Date.now()<s;){if(Ar.existsSync(n)){try{EE(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: ${gE(a)}`)}await new Promise(a=>setTimeout(a,LR))}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: ${gE(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 fE.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)}async destroy(e){await this.destroyById(e.id)}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{Ar.rmSync(Do.dirname(n.socketPath),{recursive:!0,force:!0})}catch{}}}};Ke.ContainerSandboxDriver=Ed;function mE(t,e){if(Ar.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Ar.chownSync(t,e.uid,e.gid),Ar.chmodSync(t,448);return}catch{}Ar.chmodSync(t,987)}function EE(t,e,n=typeof process.getuid=="function"?process.getuid():void 0){let r=Ar.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 pE(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 MR(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 gE(t){return`${t.stdout??""}${t.stderr??""}`.trim()||"(no output)"}var GR=new Set(["localhost","127.0.0.1","::1","0.0.0.0","[::1]"]);function UR(t){let e=t.replace(/^\w+:\/\//,"").split(/[:/]/)[0];if(GR.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 HR(t){let e=RR.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 jR(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var TE=T(et=>{"use strict";Object.defineProperty(et,"__esModule",{value:!0});et.ProcessSandboxDriver=et.PROVIDER_KEY_PASSTHROUGH_VARS=et.NS_PROBE_ARGS=et.UNSHARE_WRAP_ARGS=void 0;et.namespaceIsolationFromEnv=xR;et.probeNamespaceIsolation=wE;et.providerKeyPassthroughFromEnv=AE;et.sandboxEnvCarriesProviderKey=SE;et.baseSandboxEnv=bE;var _E=require("node:child_process"),yd=rc();function xR(t=process.env){let e=t.AGENTHIPPO_SANDBOX_NS_ISOLATION?.trim().toLowerCase();return e==="off"||e==="0"?"off":e==="require"?"require":"auto"}et.UNSHARE_WRAP_ARGS=["--user","--map-current-user","--pid","--fork","--kill-child=SIGTERM","--mount-proc"];et.NS_PROBE_ARGS=[...et.UNSHARE_WRAP_ARGS,"unshare","--user","true"];async function wE(t=_E.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",[...et.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))})}et.PROVIDER_KEY_PASSTHROUGH_VARS=["CURSOR_API_KEY"];function AE(t=process.env){return t.AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY==="1"}function SE(t){return et.PROVIDER_KEY_PASSTHROUGH_VARS.some(e=>!!t[e])}var _d=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??(()=>wE());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 ${et.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}-${BR(e.sandboxKey)}`,r=this.opts.spawnFn??_E.spawn,s=await this.namespaceWrap(),i=s?"unshare":this.opts.command,o=s?[...et.UNSHARE_WRAP_ARGS,this.opts.command,...this.opts.args??[]]:this.opts.args??[],c={...bE({...this.opts.allowProviderKeyPassthrough!==void 0?{allowProviderKeyPassthrough:this.opts.allowProviderKeyPassthrough}:{},logger:{warn:g=>console.warn(g)}}),...this.opts.env,...e.env},l=SE(c),f=r(i,o,{cwd:this.opts.cwd,stdio:["pipe","pipe","inherit"],env:{...c,[yd.SANDBOX_TIER_ENV]:String(this.tier),...l?{[yd.SANDBOX_PROVIDER_KEY_ENV]:"1"}:{}}});l&&console.warn(`[Sandbox] ${n} runs WITH a raw provider key in its environment (${et.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 u=new Promise(g=>{f.once("exit",()=>g()),f.once("error",()=>g())}),d={input:f.stdout,output:{write:g=>f.stdin?.write(g)??!1},closed:u},p={child:f,channel:d};return e.limits.ttlSeconds>0&&(p.ttl=setTimeout(()=>{this.kill(n)},e.limits.ttlSeconds*1e3),p.ttl.unref?.()),this.sandboxes.set(n,p),{id:n,tier:this.tier,endpoint:"stdio",connect:()=>d}}async revoke(e,n){if(n!=="all")throw new yd.RevocationUnsupportedError("process",n);await this.kill(e.id)}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"))}};et.ProcessSandboxDriver=_d;function bE(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"],r={};for(let i of n){let o=e[i];o&&(r[i]=o)}let s=t.allowProviderKeyPassthrough??AE(e);for(let i of et.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 BR(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var wd=T(gt=>{"use strict";var FR=gt&>.__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=gt&>.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),OE=gt&>.__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(gt,"__esModule",{value:!0});gt.DEPRECATED_SANDBOX_ENV_ALIASES=void 0;gt.dockerExec=qR;gt.alignSandboxWorkspaceOwnership=YR;gt.resolveSandboxImageUser=PE;gt.ensureSandboxStateDir=JR;gt.sandboxScriptArg=QR;gt.applyDeprecatedSandboxEnvAliases=RE;gt.loadWarrantKeypair=eC;gt.mintSandboxInferenceWarrant=tC;var WR=require("node:child_process"),Mo=OE(require("node:fs")),KR=OE(require("node:path")),IE=Hi();function qR(t){return new Promise(e=>{(0,WR.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 YR(t){let e=t.writable.map(i=>i.includes(":")?i.slice(0,i.indexOf(":")):i);if(e.length===0)return;let n=await PE(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=NE(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 PE(t,e){let n=await vE(t,e,"-u");if(n!==void 0)return{uid:n,gid:await vE(t,e,"-g")??n}}function JR(t,e){if(Mo.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{NE(t,e.uid,e.gid)}catch{}return t}async function vE(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 NE(t,e,n){let r=0,s=i=>{let o=Mo.lstatSync(i);if((o.uid!==e||o.gid!==n)&&(Mo.lchownSync(i,e,n),r++),o.isDirectory())for(let a of Mo.readdirSync(i))s(KR.join(i,a))};return Mo.existsSync(t)?(s(t),r):0}var XR=["/$bunfs","/snapshot"];function zR(t){return t.replace(/\\/g,"/").replace(/^[A-Za-z]:/,"")}function QR(t=process.argv,e=process.execPath){let n=t[1];if(!n||n===e)return[];let r=zR(n);return XR.some(s=>r.startsWith(s))?[]:[n]}gt.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 ZR=new Set;function RE(t=process.env,e=r=>console.warn(r),n=ZR){let r=[];for(let[s,i]of gt.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}RE();function eC(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,IE.generateWarrantKeypair)(n);return t?.info(`[Warrant] no AGENTHIPPO_WARRANT_PRIVATE_KEY \u2014 generated an ephemeral key (kid=${r.kid}). Configure gateways with:
|
|
505
505
|
GATEWAY_SANDBOX_WARRANT_KEYS=${JSON.stringify({[r.kid]:r.publicKeyPem})}`),r}function tC(t,e){return(0,IE.mintWarrant)({...e,aud:"inference"},t)}});var bd=T(Sd=>{"use strict";Object.defineProperty(Sd,"__esModule",{value:!0});Sd.createPackRunner=sC;var nC=ai(),rC=Er(),Ad=qn();function sC(t){return(0,nC.createHeadlessRunner)({storagePath:t.storagePath,analyticsSessionsDir:t.analyticsSessionsDir,packId:t.packId,packVersion:t.packVersion,provenance:t.provenance,bundledPromptsDir:(0,Ad.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,Ad.findClaudeCodePath)(),codexExecutablePath:(0,Ad.findCodexPath)(),permissionHandler:t.permissionHandler,cliEnvPatch:(0,rC.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspaceRoot,agentId:t.packId,chatSessionId:t.chatSessionId,baseEnv:process.env,omitGatewayToken:t.omitGatewayToken}),...t.claudeCheapModel?{engineSettings:{claudeCheapModel:t.claudeCheapModel}}:{}})}});var BE=T(Pn=>{"use strict";var iC=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]})),oC=Pn&&Pn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),aC=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"&&iC(n,e,r[s]);return oC(n,e),n}})();Object.defineProperty(Pn,"__esModule",{value:!0});Pn.getEvidenceShipStatus=UE;Pn.validateEvidenceUrl=jE;Pn.resolveSessionShipConfig=pC;Pn.redactSessionLine=xE;Pn.startSessionShipper=hC;var gi=aC(require("path")),Jn=require("fs"),DE=require("crypto"),cC=require("zlib"),lC=Ri(),LE=bo(),Cc="AGENTHIPPO_EVIDENCE_SHIP",Go="AGENTHIPPO_EVIDENCE_URL",CE="AGENTHIPPO_EVIDENCE_SHIP_TOKEN",uC="AGENTHIPPO_EVIDENCE_SHIP_INTERVAL_SEC",ME="AGENTHIPPO_EVIDENCE_SHIP_SINCE_DAYS",GE="AGENTHIPPO_EVIDENCE_SHIP_DRAIN_TIMEOUT_SEC",kc="AGENTHIPPO_EVIDENCE_ALLOW_INSECURE_URL",Td=30,vd=30,dC=/(^|_)(input|output|result|prompt|completion|content|text|messages?)(_|$)|preview$/i,Od={enabled:!1,disabledReason:"not-configured",consecutiveFailures:0,recordsStaged:0,recordsShipped:0,recordsSkippedTooOld:0,filesSkippedTooOld:0,writeFailures:0,contentCapture:!1};function UE(){return{...Od,writeFailures:(0,LE.getSessionEventWriterStats)().failed}}function Fi(t){Od={...Od,...t}}function Id(t){return["1","true","yes","on"].includes((t??"").trim().toLowerCase())}function HE(t){return Id(t[kc])||Id(t.EVIDENCE_ALLOW_INSECURE_URL)}var fC=new Set(["localhost","127.0.0.1","::1","[::1]","0.0.0.0"]);function jE(t,e=process.env){let n;try{n=new URL(t)}catch{return{error:`${Go} is not a valid URL: ${JSON.stringify(t)}`}}if(n.protocol==="https:")return{url:n.toString().replace(/\/$/,"")};if(n.protocol!=="http:")return{error:`${Go} must be https (got ${n.protocol.replace(":","")})`};if(fC.has(n.hostname))return{url:n.toString().replace(/\/$/,"")};if(HE(e)){let r=Id(e[kc])?kc:"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:`${Go} 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 ${kc}=1 (or EVIDENCE_ALLOW_INSECURE_URL=1) if the network is genuinely private.`}}function pC(t,e,n,r=process.env){if(r[Cc]==="0"||r[Cc]?.toLowerCase()==="false"){console.warn(`
|
|
506
506
|
############################################################
|
|
507
507
|
## EVIDENCE SHIPPING IS DISABLED ##
|
|
@@ -510,20 +510,20 @@ GATEWAY_SANDBOX_WARRANT_KEYS=${JSON.stringify({[r.kid]:r.publicKeyPem})}`),r}fun
|
|
|
510
510
|
## this instance goes away. Unset to re-enable. ##
|
|
511
511
|
############################################################
|
|
512
512
|
`),Fi({enabled:!1,disabledReason:"disabled-by-env"});return}let s=r[Go]?.trim(),i=r[CE]?.trim();if(!s||!i){(s||i)&&console.warn(`[evidence-ship] disabled \u2014 ${s?CE:Go} is not set (the other half of the pair is)`),Fi({enabled:!1,disabledReason:"not-configured"});return}let o=jE(s,r);if("error"in o){console.error(`[evidence-ship] DISABLED \u2014 ${o.error}`),Fi({enabled:!1,disabledReason:"invalid-url"});return}let a=Math.max(15,Number(r[uC]??60)||60),c=Math.max(1,Number(r[ME]??Td)||Td),l=Math.max(1,Number(r[GE]??vd)||vd);return{evidenceUrl:o.url,shipToken:i,instanceId:t,sessionsDir:e,stateDir:n,intervalSec:a,sinceDays:c,drainTimeoutSec:l,allowInsecure:HE(r)}}function gC(t){return{sha256:(0,DE.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function xE(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(!dC.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=gC(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 kE(){return{version:1,files:{},pending:{staged:0,shipped:0,skippedRecords:0,skippedFiles:0}}}function $E(t){let e=0;for(let n of t.split(`
|
|
513
|
-
`))n.trim()&&e++;return e}function hC(t){let e=gi.join(t.stateDir,".evidence-ship-cursor.json"),n=gi.join(t.stateDir,".evidence-stage-cursor.json"),r=gi.join(t.stateDir,"evidence-staging","sessions"),s=t.logger?.info??(()=>{}),i=t.logger?.warn??(()=>{}),o=t.sinceDays??Td,a=t.intervalSec??60,c=(t.drainTimeoutSec??vd)*1e3,l=(0,lC.isContentCaptureEnabled)(),f=t.allowInsecure===!0,u=!1,d=!1,p,g=0,m,h,E,y=0,w={staged:0,shipped:0,skippedRecords:0,skippedFiles:0};Fi({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 P=()=>(h||(h=import("@agenthippo-ai/evidence-ship").then(({createShipper:O})=>O({serverUrl:t.evidenceUrl,token:t.shipToken,instanceId:t.instanceId,source:"serve",sinceDays:o,cursorFile:e,captureContent:l,allowInsecure:f,heartbeat:!1,log:F=>s(F),error:F=>i(F)}))),h),b=async()=>{if(E)return E;try{let O=await Jn.promises.readFile(n,"utf8"),F=JSON.parse(O);E={version:1,files:F.files??{},windowFrom:F.windowFrom,pending:F.pending??kE().pending}}catch{E=kE()}return E},v=async()=>{if(E)try{await Jn.promises.mkdir(gi.dirname(n),{recursive:!0}),await Jn.promises.writeFile(n,JSON.stringify(E,null,1))}catch(O){i(`[evidence-ship] could not persist stage cursor: ${O instanceof Error?O.message:String(O)}`)}},A=async()=>{let O=await b(),F=Date.now(),
|
|
513
|
+
`))n.trim()&&e++;return e}function hC(t){let e=gi.join(t.stateDir,".evidence-ship-cursor.json"),n=gi.join(t.stateDir,".evidence-stage-cursor.json"),r=gi.join(t.stateDir,"evidence-staging","sessions"),s=t.logger?.info??(()=>{}),i=t.logger?.warn??(()=>{}),o=t.sinceDays??Td,a=t.intervalSec??60,c=(t.drainTimeoutSec??vd)*1e3,l=(0,lC.isContentCaptureEnabled)(),f=t.allowInsecure===!0,u=!1,d=!1,p,g=0,m,h,E,y=0,w={staged:0,shipped:0,skippedRecords:0,skippedFiles:0};Fi({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 P=()=>(h||(h=import("@agenthippo-ai/evidence-ship").then(({createShipper:O})=>O({serverUrl:t.evidenceUrl,token:t.shipToken,instanceId:t.instanceId,source:"serve",sinceDays:o,cursorFile:e,captureContent:l,allowInsecure:f,heartbeat:!1,log:F=>s(F),error:F=>i(F)}))),h),b=async()=>{if(E)return E;try{let O=await Jn.promises.readFile(n,"utf8"),F=JSON.parse(O);E={version:1,files:F.files??{},windowFrom:F.windowFrom,pending:F.pending??kE().pending}}catch{E=kE()}return E},v=async()=>{if(E)try{await Jn.promises.mkdir(gi.dirname(n),{recursive:!0}),await Jn.promises.writeFile(n,JSON.stringify(E,null,1))}catch(O){i(`[evidence-ship] could not persist stage cursor: ${O instanceof Error?O.message:String(O)}`)}},A=async()=>{let O=await b(),F=Date.now(),se=F-o*864e5,W=0,pe;try{pe=(await Jn.promises.readdir(t.sessionsDir)).filter(z=>z.endsWith(".jsonl"))}catch{return 0}await Jn.promises.mkdir(r,{recursive:!0});let me=[];for(let z of pe){if(z.startsWith("_evidence-loss"))continue;let Ne=gi.join(t.sessionsDir,z),qe;try{qe=await Jn.promises.stat(Ne)}catch{continue}if(qe.mtimeMs<se){let Et=O.files[z];if(!Et?.lostReported){let It=0;try{It=$E(await Jn.promises.readFile(Ne,"utf8"))}catch{}w.skippedFiles++,w.skippedRecords+=It,O.pending.skippedFiles++,O.pending.skippedRecords+=It,O.files[z]={size:qe.size,sha256:"",stagedAt:0,stagedMtimeMs:Et?.stagedMtimeMs??0,lostReported:!0},i(`[evidence-ship] EVIDENCE PERMANENTLY SKIPPED: ${z} last changed ${new Date(qe.mtimeMs).toISOString()}, older than the ${o}-day ship window \u2014 ${It} record(s) will never be shipped. Raise ${ME} before the next restart to recover a backlog this old.`),me.push(JSON.stringify({session_id:"_evidence-loss",request_id:z,timestamp:F,event_type:"evidence_skipped",payload:{reason:"older_than_ship_window",file:z,file_mtime_ms:qe.mtimeMs,file_bytes:qe.size,records:It,since_days:o,instance_id:t.instanceId,permanent:!0}}))}continue}let Me;try{Me=await Jn.promises.readFile(Ne,"utf8")}catch(Et){i(`[evidence-ship] cannot read ${z}: ${Et instanceof Error?Et.message:String(Et)}`);continue}let on=(0,DE.createHash)("sha256").update(Me,"utf8").digest("hex"),_e=O.files[z];if(_e&&_e.sha256===on&&_e.size===Me.length)continue;let lr=Me.split(`
|
|
514
514
|
`).map(Et=>Et.trim()?xE(Et,l):Et).join(`
|
|
515
515
|
`),ut=gi.join(r,z);await Jn.promises.writeFile(ut,lr);let Wt=Math.max(Date.now(),(_e?.stagedMtimeMs??0)+1e3),_n=Wt/1e3;await Jn.promises.utimes(ut,_n,_n);let Gn=$E(lr);W+=Gn,O.files[z]={size:Me.length,sha256:on,stagedAt:F,stagedMtimeMs:Wt}}if(me.length>0){let z=gi.join(r,"evidence-loss.jsonl");await Jn.promises.appendFile(z,`${me.join(`
|
|
516
516
|
`)}
|
|
517
|
-
`);let
|
|
517
|
+
`);let Ne=Date.now()/1e3;await Jn.promises.utimes(z,Ne,Ne),W+=me.length}return w.staged+=W,O.pending.staged+=W,O.windowFrom===void 0&&(O.windowFrom=F),await v(),W},S=async()=>{let O=await b(),F=Date.now(),se=(0,LE.getSessionEventWriterStats)(),W={kind:"session_ship_heartbeat",instance_id:t.instanceId,wire:"agenthippo/session-ship/1",window_from_ms:O.windowFrom??F,window_to_ms:F,interval_sec:a,since_days:o,records_staged:O.pending.staged,records_shipped:O.pending.shipped,records_skipped_too_old:O.pending.skippedRecords,files_skipped_too_old:O.pending.skippedFiles,evidence_write_failures:se.failed,evidence_writes:se.written,consecutive_ship_failures:g,content_capture:l,totals:{...w}},pe=1;try{({INGEST_WIRE_VERSION:pe}=await import("@agenthippo-ai/evidence-ship"))}catch{}let me=JSON.stringify(W),z=await fetch(`${t.evidenceUrl.replace(/\/$/,"")}/ingest/batch`,{method:"POST",headers:{authorization:`Bearer ${t.shipToken}`,"content-type":"application/json","X-Evidence-Ingest-Version":String(pe)},body:JSON.stringify({instance_id:t.instanceId,kind:"heartbeat",name:"heartbeat.json",content_gzip_b64:(0,cC.gzipSync)(Buffer.from(me)).toString("base64")})});if(!z.ok)throw new Error(`heartbeat HTTP ${z.status}`);return O.windowFrom=F,O.pending={staged:0,shipped:0,skippedRecords:0,skippedFiles:0},Fi({lastHeartbeatAt:F}),await v(),!0},I=async()=>{if(!(u||d)){d=!0;try{let O=await A();y+=O;try{if(await(await P()).drain({sessions:r,heartbeat:!1})){let W=await b();W.pending.shipped+=y,w.shipped+=y,y=0,p=Date.now(),g=0}else g++,i(`[evidence-ship] drain failed (${g} in a row); ${y} record(s) still unshipped`)}catch(F){g++,i(`[evidence-ship] ${F instanceof Error?F.message:String(F)}`)}}catch(O){g++,i(`[evidence-ship] ${O instanceof Error?O.message:String(O)}`)}finally{try{await S()}catch(O){i(`[evidence-ship] heartbeat failed: ${O instanceof Error?O.message:String(O)}`)}d=!1,Fi({lastOkAt:p,consecutiveFailures:g,recordsStaged:w.staged,recordsShipped:w.shipped,recordsSkippedTooOld:w.skippedRecords,filesSkippedTooOld:w.skippedFiles})}}};I(),m=setInterval(()=>void I(),a*1e3),m.unref?.(),s(`[evidence-ship] enabled \u2192 ${t.evidenceUrl} (every ${a}s, ${o}-day window, content capture ${l?"ON":"off"})`);let U=()=>{u=!0,m&&clearInterval(m)};return{stop:U,async flush(){U();let O=Date.now()+c;for(;d&&Date.now()<O;)await new Promise(F=>setTimeout(F,50));if(d){i(`[evidence-ship] FINAL DRAIN ABANDONED after ${Math.round(c/1e3)}s \u2014 a ship was still in flight. ${y} staged record(s) plus anything written since are lost if this state dir is ephemeral. Raise ${GE} if this recurs.`);return}u=!1;try{await I()}finally{u=!0}y>0&&i(`[evidence-ship] final drain finished with ${y} record(s) still unshipped`)},lastOkAt:()=>p,status:()=>UE()}}});var Uo=T(Nn=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});Nn.DEFAULT_AUTH_BIND=Nn.AUTH_PROXY_SECRET_HEADER=Nn.DEFAULT_JWT_SECRET=void 0;Nn.resolveAuthBrokerBind=yC;Nn.loadAuthBrokerConfig=_C;Nn.emailDomainAllowed=wC;function mC(t){return t?.trim()?t.split(",").map(e=>e.trim().toLowerCase()).filter(Boolean):[]}Nn.DEFAULT_JWT_SECRET="dev-agenthippo-auth-secret-change-me";Nn.AUTH_PROXY_SECRET_HEADER="x-agenthippo-proxy-secret";Nn.DEFAULT_AUTH_BIND="127.0.0.1";var EC=new Set(["127.0.0.1","localhost","::1","[::1]"]);function yC(t=process.env){let e=t.AGENTHIPPO_AUTH_BIND?.trim()||Nn.DEFAULT_AUTH_BIND;if(!!EC.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.
|
|
518
518
|
- Same-host proxy (recommended): bind 127.0.0.1 and run Caddy/oauth2-proxy alongside it.
|
|
519
519
|
- SEPARATE CONTAINER for the proxy (the compose/Cloud Run layout, where Caddy dials
|
|
520
520
|
"auth-broker:9780"): the broker must listen on the container's network interface, so set
|
|
521
521
|
BOTH AGENTHIPPO_AUTH_BIND=${e} AND AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND=1,
|
|
522
522
|
and make sure the port is not published outside the private network.
|
|
523
|
-
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 _C(t=process.env){let e=t.AGENTHIPPO_AUTH_JWT_SECRET?.trim()||Nn.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:mC(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",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 wC(t,e){if(e.length===0)return!0;let n=t.split("@")[1]?.toLowerCase();return!!n&&e.includes(n)}});var Fr=T($=>{"use strict";var AC=$&&$.__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]})),SC=$&&$.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Cd=$&&$.__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"&&AC(n,e,r[s]);return SC(n,e),n}})();Object.defineProperty($,"__esModule",{value:!0});$.TurnGate=$.TURN_LIMIT_BUSY_MESSAGE=$.RATE_LIMIT_BUSY_MESSAGE=$.TURN_GATE_BUSY_MESSAGE=$.TURN_GATE_RETRY_AFTER_SECONDS=$.TURN_QUEUE_ENV=$.MAX_CONCURRENT_TURNS_ENV=$.TurnLimiter=$.SESSION_WITHOUT_USER_REASON=$.REQUIRE_TENANT_ISOLATION_ENV=$.IDENTITY_PROXY_SECRET_ENV=$.IDENTITY_HEADER_ENV=$.PIN_ONLY_IDENTITY_HEADERS=$.RateLimiter=$.XFF_TRUSTED_HOPS_ENV=$.CONTAINER_SERVE_HOST=$.SERVE_HOST_ENV=$.DEFAULT_BIND_HOST=$.SERVICE_USER_ENV=$.DEFAULT_MAX_BODY_BYTES=void 0;$.resolveStateDir=OC;$.resolveAnalyticsSessionsDir=IC;$.resolveServiceIdentity=PC;$.isLoopbackHost=WE;$.resolveBindHost=NC;$.clientIp=RC;$.hasTrustedProxyProof=qE;$.identityHeaderAdvice=CC;$.tenantIsolationAdvice=kC;$.resolveUserId=$C;$.resolveDataToken=LC;$.peerToUserId=MC;$.userNamespaceHash=Nd;$.resolveServeSessionKey=GC;$.corsHeaders=UC;$.createTurnGateFromEnv=HC;$.createRejectionWarner=jC;$.readBodyWithCap=xC;var bC=Cd(require("os")),hs=Cd(require("path")),$c=Cd(require("crypto")),TC=Js(),vC=Uo();$.DEFAULT_MAX_BODY_BYTES=1024*1024;function OC(t,e=process.env){let n=t?.trim();if(n)return{dir:hs.resolve(n),ephemeral:!1};let r=e.AGENTHIPPO_HOME?.trim()||e.AGENTIDE_HOME?.trim();return r?{dir:hs.join(hs.resolve(r),"serve-state"),ephemeral:!1}:{dir:hs.join(bC.tmpdir(),"agenthippo-server"),ephemeral:!0}}function IC(t,e,n=process.env){return!(n.AGENT_HOME_DIR?.trim()||n.AGENTHIPPO_HOME?.trim())&&!e?hs.join(t,"analytics","sessions"):hs.join((0,TC.getAgentideHome)(),"analytics","sessions")}$.SERVICE_USER_ENV="AGENTHIPPO_SERVICE_USER";var FE=256;function PC(t=process.env){let e=t[$.SERVICE_USER_ENV];if(e===void 0)return{};let n=e.trim();return n?/\s/.test(n)?{error:`${$.SERVICE_USER_ENV} must not contain whitespace, got ${JSON.stringify(e)}.`}:n.length>FE?{error:`${$.SERVICE_USER_ENV} is ${n.length} chars; the maximum is ${FE}.`}:/^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:`${$.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:`${$.SERVICE_USER_ENV} is set but empty. Unset it, or give it the identity unattended runs should act as.`}}$.DEFAULT_BIND_HOST="127.0.0.1";function WE(t){let e=t.trim().toLowerCase().replace(/^\[|\]$/g,"");return e==="localhost"||e==="::1"||/^127\./.test(e)}$.SERVE_HOST_ENV="AGENTHIPPO_SERVE_HOST";$.CONTAINER_SERVE_HOST="0.0.0.0";function NC(t,e=process.env){return t?.trim()||e.AGENTHIPPO_SERVE_HOST?.trim()||$.DEFAULT_BIND_HOST}$.XFF_TRUSTED_HOPS_ENV="AGENTHIPPO_XFF_TRUSTED_HOPS";function RC(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[$.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 Pd=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()}};$.RateLimiter=Pd;var KE=["x-forwarded-email","x-forwarded-preferred-username","x-goog-authenticated-user-email","cf-access-authenticated-user-email"];$.PIN_ONLY_IDENTITY_HEADERS=["x-agent-user"];$.IDENTITY_HEADER_ENV="AGENTHIPPO_IDENTITY_HEADER";$.IDENTITY_PROXY_SECRET_ENV="AGENTHIPPO_IDENTITY_PROXY_SECRET";function qE(t,e){if(!e)return!1;let n=t[vC.AUTH_PROXY_SECRET_HEADER],r=typeof n=="string"?n:Array.isArray(n)?String(n[0]??""):"";if(!r)return!1;let s=$c.createHash("sha256").update(r).digest(),i=$c.createHash("sha256").update(e).digest();return $c.timingSafeEqual(s,i)}function CC(t=process.env,e){if(t[$.IDENTITY_HEADER_ENV]?.trim())return[];let r=e?.trim();return r&&WE(r)?[`${$.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 ${$.IDENTITY_HEADER_ENV} pinned. Anyone who can reach this port is trusted to state who they are.`]:[],`${$.IDENTITY_HEADER_ENV} is not set, so identity falls back to the platform header aliases (${KE.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. ${$.IDENTITY_HEADER_ENV}=x-goog-authenticated-user-email.`,`NOTE: ${$.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: ${$.IDENTITY_HEADER_ENV}=x-agent-user.`]}$.REQUIRE_TENANT_ISOLATION_ENV="AGENTHIPPO_REQUIRE_TENANT_ISOLATION";function VE(t,e){let n=hs.resolve(t),r=hs.resolve(e);return n===r||n.startsWith(r+hs.sep)}function kC(t,e=process.env){if(!e[$.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=[`${$.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&&VE(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&&VE(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[$.REQUIRE_TENANT_ISOLATION_ENV]?.trim()??"")?"refuse":"warn",lines:s}}function $C(t,e,n=process.env){let r=n[$.IDENTITY_PROXY_SECRET_ENV]?.trim();if(r&&!qE(t,r))return;let s=n[$.IDENTITY_HEADER_ENV]?.trim().toLowerCase(),i=s?[s]:KE;for(let a of i){let c=t[a],l=(Array.isArray(c)?c[0]:c)?.trim();if(l){let f=l.lastIndexOf(":");return f>=0&&l.slice(f+1).includes("@")?l.slice(f+1):l}}return s||n.AGENTHIPPO_ALLOW_BODY_IDENTITY?.trim()!=="1"?void 0:e?.user_id?.trim()||void 0}var DC=["x-forwarded-access-token","x-agent-data-token"];function LC(t){for(let e of DC){let n=t[e],r=(Array.isArray(n)?n[0]:n)?.trim();if(r)return r}}function MC(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}$.SESSION_WITHOUT_USER_REASON="session_without_verified_user";function Nd(t){return $c.createHash("sha256").update(t).digest("hex").slice(0,16)}function GC(t,e,n="session",r=process.env){let s=t?.trim(),i=e?.trim();if(i){let a=`u${Nd(i)}--${s||"default"}`;return{sessionKey:a,sandboxKey:n==="user"?`u${Nd(i)}`:a}}if(r[$.IDENTITY_HEADER_ENV]?.trim())return{sessionKey:"",sandboxKey:"",rejected:$.SESSION_WITHOUT_USER_REASON};let o=s||"anon-unknown";return{sessionKey:o,sandboxKey:o}}function UC(){return{"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Agent-User","Access-Control-Allow-Origin":"*"}}var Rd=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)}};$.TurnLimiter=Rd;$.MAX_CONCURRENT_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_TURNS";$.TURN_QUEUE_ENV="AGENTHIPPO_TURN_QUEUE";$.TURN_GATE_RETRY_AFTER_SECONDS=15;$.TURN_GATE_BUSY_MESSAGE="At capacity \u2014 please retry in a moment";$.RATE_LIMIT_BUSY_MESSAGE="Rate limit exceeded \u2014 please retry in a moment";$.TURN_LIMIT_BUSY_MESSAGE="Per-session turn limit reached";var Dc=class{maxInflight;maxQueue;queueTimeoutMs;inflightCount=0;waiters=[];constructor(e,n,r=$.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}};$.TurnGate=Dc;function HC(t=process.env){let e=Number(t[$.MAX_CONCURRENT_TURNS_ENV]??10),n=Number(t[$.TURN_QUEUE_ENV]??20),r=Number.isFinite(e)?e:10,s=Number.isFinite(n)&&n>=0?n:20;return new Dc(r,s)}function jC(t=5e3){let e=0;return n=>{let r=Date.now();r-e<t||(e=r,console.warn(n))}}function xC(t,e=$.DEFAULT_MAX_BODY_BYTES){return new Promise((n,r)=>{let s=0,i=[],o=f=>{if(s+=f.length,s>e){l();let u=new Error(`Request body exceeds ${e} bytes`);u.tooLarge=!0,r(u);return}i.push(f)},a=()=>{l(),n(Buffer.concat(i).toString("utf8"))},c=f=>{l(),r(f)},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 jo=T(Ls=>{"use strict";Object.defineProperty(Ls,"__esModule",{value:!0});Ls.TurnRegistry=Ls.DEFAULT_TURN_DEADLINE_MS=void 0;Ls.hashNonce=Ho;var YE=require("crypto");Ls.DEFAULT_TURN_DEADLINE_MS=30*6e4;function Ho(t){return(0,YE.createHash)("sha256").update(t).digest("hex")}var kd=class{entries=new Map;register(e){this.prune();let n=(0,YE.randomBytes)(16).toString("hex"),r=Ho(n);this.entries.set(r,{userId:e.userId,sessionKey:e.sessionKey,inboundToken:e.inboundToken,egressStoreKey:e.egressStoreKey,deadline:e.deadline??Date.now()+Ls.DEFAULT_TURN_DEADLINE_MS});let s=!1;return{nonce:n,release:()=>{s||(s=!0,this.entries.delete(r))}}}releaseByNonce(e){return this.entries.delete(Ho(e))}resolve(e,n=Date.now()){let r=this.entries.get(Ho(e));if(r){if(n>r.deadline){this.entries.delete(Ho(e));return}return r}}prune(e=Date.now()){for(let[n,r]of this.entries)e>r.deadline&&this.entries.delete(n)}get size(){return this.entries.size}};Ls.TurnRegistry=kd});var Dd=T(Sr=>{"use strict";Object.defineProperty(Sr,"__esModule",{value:!0});Sr.CredentialBroker=Sr.identityProvider=Sr.passthroughProvider=void 0;Sr.resolveProvider=BC;Sr.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}}};Sr.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 BC(t){let e=(t??"passthrough").trim().toLowerCase();if(e==="passthrough")return Sr.passthroughProvider;if(e==="identity")return Sr.identityProvider;throw new Error(`Unknown data credential provider "${t}" (supported: passthrough, identity)`)}var $d=class{provider;cache=new Map;constructor(e){this.provider=e}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)}};Sr.CredentialBroker=$d});var Md=T(Rn=>{"use strict";var FC=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]})),VC=Rn&&Rn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),WC=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"&&FC(n,e,r[s]);return VC(n,e),n}})();Object.defineProperty(Rn,"__esModule",{value:!0});Rn.ConnectorHost=Rn.TURN_META_KEY=void 0;var JE=WC(require("path")),KC=require("fs"),qC=require("@modelcontextprotocol/sdk/client/index.js"),YC=require("@modelcontextprotocol/sdk/client/stdio.js"),JC=require("@modelcontextprotocol/sdk/types.js"),XC=ec();Rn.TURN_META_KEY="ai.agenthippo/turn";var Ld=class t{client;logger;connectorPath;constructor(e,n,r){this.client=e,this.logger=n,this.connectorPath=r}static async spawn(e){let n=JE.resolve(e.connectorPath);await KC.promises.access(n);let r=await(0,XC.resolveNodeBinary)(),s=new YC.StdioClientTransport({command:r,args:[n],cwd:JE.dirname(n),env:{...process.env,AGENTHIPPO_DATA_CONNECTOR:"1"},stderr:"pipe"}),i=new qC.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:{[Rn.TURN_META_KEY]:{userId:r.userId,credential:r.credential}}}},JC.CallToolResultSchema)}async close(){try{await this.client.close()}catch(e){this.logger?.warn(`[DataPlane] connector close: ${e instanceof Error?e.message:String(e)}`)}}};Rn.ConnectorHost=Ld});var xo=T(sn=>{"use strict";var zC=sn&&sn.__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=sn&&sn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ZC=sn&&sn.__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(sn,"__esModule",{value:!0});sn.TURN_NONCE_HEADER=sn.TURN_NONCE_ENV=sn.DATA_MCP_URL_ENV=void 0;sn.startDataGateway=ik;var ek=ZC(require("http")),tk=require("@modelcontextprotocol/sdk/server/index.js"),nk=require("@modelcontextprotocol/sdk/server/streamableHttp.js"),XE=require("@modelcontextprotocol/sdk/types.js"),rk=Fr(),sk=jo();sn.DATA_MCP_URL_ENV="AGENTHIPPO_DATA_MCP_URL";sn.TURN_NONCE_ENV="AGENTHIPPO_TURN_NONCE";sn.TURN_NONCE_HEADER="x-agent-turn-nonce";function zE(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function QE(t){return t?(0,sk.hashNonce)(t).slice(0,12):"none"}async function ik(t){let e=ek.createServer(async(i,o)=>{try{let a=i.url?.split("?")[0]??"";if(a==="/turn"&&i.method==="DELETE"){let p=zE(i.headers.authorization);if(p){let g=t.registry.releaseByNonce(p);t.audit?.("edge","turn_release",{released:g,nonce_sha256_prefix:QE(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=zE(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:QE(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 f;try{f=JSON.parse(await(0,rk.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 u=ok(t,l),d=new nk.StreamableHTTPServerTransport({sessionIdGenerator:void 0,enableJsonResponse:!0});o.on("close",()=>{d.close(),u.close()}),await u.connect(d),await d.handleRequest(i,o,f)}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 ok(t,e){let n=new tk.Server({name:"agenthippo-data-gateway",version:"1.0.0"},{capabilities:{tools:{}}});return n.setRequestHandler(XE.ListToolsRequestSchema,async()=>({tools:await t.connector.listTools()})),n.setRequestHandler(XE.CallToolRequestSchema,async r=>{let s=r.params.name,i;try{i=(await t.broker.acquire(e.userId,e.inboundToken)).secretRef,t.audit?.(e.sessionKey,"tool_authorize",{tool:s,userId:e.userId,provider:t.broker.provider.name})}catch(o){let a=o instanceof Error?o.message:String(o);return t.audit?.(e.sessionKey,"tool_deny",{tool:s,userId:e.userId,reason:"acquire_failed",error:a}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:`credential acquire failed (fail-closed): ${a}`})}],isError:!0}}try{return await t.connector.callTool(s,r.params.arguments??{},{userId:e.userId,credential:i})}catch(o){let a=o instanceof Error?o.message:String(o);if(/401|unauthoriz|expired/i.test(a)){t.broker.invalidate(e.userId);try{let c=await t.broker.acquire(e.userId,e.inboundToken);return await t.connector.callTool(s,r.params.arguments??{},{userId:e.userId,credential:c.secretRef})}catch{}}return t.audit?.(e.sessionKey,"tool_deny",{tool:s,userId:e.userId,reason:"call_failed",error:a}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:a})}],isError:!0}}}),n}});var ey=T(br=>{"use strict";var ak=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]})),ck=br&&br.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lk=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"&&ak(n,e,r[s]);return ck(n,e),n}})();Object.defineProperty(br,"__esModule",{value:!0});br.backupTimestamp=dk;br.backupPathFor=ZE;br.renameToBackup=fk;var uk=require("fs"),Gd=lk(require("path"));function dk(t=new Date){return t.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function ZE(t,e){let n=Gd.dirname(t),r=Gd.basename(t).replace(/\.json$/i,"");return Gd.join(n,`${r}.${e}.bk`)}async function fk(t,e){let n=ZE(t,e);try{return await uk.promises.rename(t,n),n}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code):"")==="ENOENT")return;throw r}}});var Uc=T(vt=>{"use strict";var pk=vt&&vt.__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]})),gk=vt&&vt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),hk=vt&&vt.__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"&&pk(n,e,r[s]);return gk(n,e),n}})();Object.defineProperty(vt,"__esModule",{value:!0});vt._resetOutboundHandleStoreLockForTest=Ek;vt._setOutboundHandleStorePathForTest=yk;vt.buildGatewayOutboundHandleKey=sy;vt.upsertGatewayOutboundHandle=Tk;vt.getLastGatewayOutboundHandle=vk;vt.listGatewayOutboundTargets=Ok;vt.mergeGatewayOutboundHandles=Ik;vt.resolveGatewayOutboundHandle=Pk;vt.backupAndClearOutboundHandlesForAgent=Nk;vt.getGatewayOutboundStoreSnapshot=Rk;var Lc=require("fs"),mk=hk(require("path")),ty=ey(),Hd=1,ry={value:void 0},Vi=new Map,Ud=new Map;function jd(t,e){let r=(Ud.get(t)??Promise.resolve()).then(()=>e());return Ud.set(t,r.catch(()=>{})),r}function Ek(){Ud.clear(),Vi.clear()}function yk(t){ry.value=t,Vi.clear()}function Bo(t){return ry.value??t}function sy(t,e){let n=e?.trim();return n?`${t}::thread:${n}`:`${t}::`}function _k(){return{version:Hd,lastByAgent:{},targetsByAgent:{}}}async function Gs(t){let e=Bo(t),n=Vi.get(e);if(n)return n;try{let s=await Lc.promises.readFile(e,"utf-8"),i=JSON.parse(s);if(i.targetsByAgent&&typeof i.targetsByAgent=="object"){let o={version:i.version??Hd,lastByAgent:i.lastByAgent??{},targetsByAgent:i.targetsByAgent};return Vi.set(e,o),o}}catch{}let r=_k();return Vi.set(e,r),r}async function xd(t,e){let n=Bo(t);await Lc.promises.mkdir(mk.dirname(n),{recursive:!0});let r={version:Hd,lastByAgent:e.lastByAgent,targetsByAgent:e.targetsByAgent},s=`${n}.tmp`;await Lc.promises.writeFile(s,JSON.stringify(r,null,2),"utf-8"),await Lc.promises.rename(s,n),Vi.set(n,e)}function Ms(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 ny(t,e,n){let r=Ms(t,n),s=Ms(e,n);return r.toLowerCase()===s.toLowerCase()}function wk(t,e,n){if(n)return t.find(i=>ny(i.target,e,i.channel)&&i.threadId?.trim()===n);let r=t.filter(i=>ny(i.target,e,i.channel));return r.length===0?void 0:r.find(i=>!i.threadId?.trim())??Mc(r)[0]}function Ak(t,e){let n=t.match(/:thread:([^:]+)$/),r=n?t.slice(0,-n[0].length):t,s=r.match(/:direct:([^:]+)$/);if(s)return Ms(`user:${s[1]}`,e);let i=r.match(/:dm:([^:]+)$/);if(i)return Ms(`user:${i[1]}`,e);let o=r.match(/:channel:([^:]+)$/);if(o)return Ms(`channel:${o[1]}`,e);let a=r.match(/:group:([^:]+)$/);if(a)return Ms(`channel:${a[1]}`,e)}function Sk(t){let e=t.target?.trim();if(e)return Ms(e,t.channel);let n=t.sessionKey?.trim().toLowerCase();if(n){let s=Ak(n,t.channel);if(s)return s}let r=t.senderId?.trim();if(r&&t.channel)return Ms(`user:${r}`,t.channel)}function bk(t){return t.senderName?.trim()?t.senderName.trim():t.senderUsername?.trim()?t.senderUsername.trim():t.target?.trim()||t.senderId?.trim()}function Mc(t){return[...t].sort((e,n)=>n.lastSeenAt-e.lastSeenAt)}function Gc(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 Tk(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 f=c.match(/^agent:[^:]+:([a-z0-9_-]+):/);f&&(a=f[1])}let l=Sk(n);if(!(!a||!l))return jd(Bo(t),async()=>{let f=Date.now(),u=await Gs(t);u.targetsByAgent[i]||(u.targetsByAgent[i]={});let d=sy(l,n.threadId?.trim()),p=u.targetsByAgent[i][d],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:bk(n),firstSeenAt:p?.firstSeenAt??f,lastSeenAt:f,lastInboundRunId:r,inboundCount:(p?.inboundCount??0)+1};return u.targetsByAgent[i][d]=g,u.lastByAgent[i]=g,await xd(t,u),g})}async function vk(t,e){let n=await Gs(t),r=Gc(n,e);return n.lastByAgent[r]}async function Ok(t,e){let n=await Gs(t);if(e?.trim()){let s=Gc(n,e.trim());return Mc(Object.values(n.targetsByAgent[s]??{}))}let r=[];for(let s of Object.values(n.targetsByAgent))r.push(...Object.values(s));return Mc(r)}async function Ik(t,e,n){let r=await Gs(t),s=n?.trim()?[n.trim()]:[...new Set([...Object.keys(r.targetsByAgent),...Object.keys(r.lastByAgent)])];return s.length===0?0:jd(Bo(e),async()=>{let i=await Gs(e),o=0,a=!1;for(let c of s){let l=r.targetsByAgent[c]??{},f=Object.entries(l);f.length>0&&!i.targetsByAgent[c]&&(i.targetsByAgent[c]={});for(let[d,p]of f){let g=i.targetsByAgent[c]?.[d];(!g||p.lastSeenAt>=g.lastSeenAt)&&(i.targetsByAgent[c][d]=p,o++,a=!0)}let u=r.lastByAgent[c];if(u){let d=i.lastByAgent[c];(!d||u.lastSeenAt>=d.lastSeenAt)&&(i.lastByAgent[c]=u,a=!0)}}return a&&await xd(e,i),o})}async function Pk(t,e,n){let r=await Gs(t),s=Gc(r,e),i=n?.target?.trim();if(i){let o=Object.values(r.targetsByAgent[s]??{});return wk(o,i,n?.threadId?.trim())}return r.lastByAgent[s]}async function Nk(t,e,n=(0,ty.backupTimestamp)()){let r=Bo(t);return jd(r,async()=>{let s=await Gs(t),i=Gc(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,ty.renameToBackup)(r,n);return delete s.targetsByAgent[i],delete s.lastByAgent[i],await xd(t,s),{removed:c,backupPath:l}})}async function Rk(t){let e=await Gs(t),n={};for(let[r,s]of Object.entries(e.targetsByAgent))n[r]=Mc(Object.values(s));return{lastByAgent:e.lastByAgent,targetsByAgent:n}}});var oy=T(Tr=>{"use strict";var Ck=Tr&&Tr.__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]})),kk=Tr&&Tr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$k=Tr&&Tr.__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"&&Ck(n,e,r[s]);return kk(n,e),n}})();Object.defineProperty(Tr,"__esModule",{value:!0});Tr.EGRESS_URL_ENV=void 0;Tr.startEgressBroker=xk;var Dk=$k(require("http")),Lk=Fr(),Mk=jo(),Gk=Uc(),iy=Ja();Tr.EGRESS_URL_ENV="AGENTHIPPO_EGRESS_URL";function Uk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function Hk(t){return t?(0,Mk.hashNonce)(t).slice(0,12):"none"}function jk(t,e){return(0,iy.getGatewayOutboundFilePath)(t,(0,iy.safeGatewaySessionDirId)(e))}async function xk(t){let e=Dk.createServer(async(s,i)=>{let o=(a,c,l,f)=>{l&&t.audit?.("unauthorized",l,f??{}),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=Uk(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:Hk(c)});return}let f=l.egressStoreKey?.trim();if(!f){o(403,"no outbound route for this turn (not a channel-originated session)","egress_deny",{userId:l.userId,reason:"no_store_key"});return}let u;try{u=JSON.parse(await(0,Lk.readBodyWithCap)(s))}catch{o(400,"invalid JSON body");return}let d=typeof u.message=="string"?u.message:"";if(!d.trim()){o(400,"message is required");return}let p=typeof u.to=="string"?u.to.trim():void 0,g=typeof u.media=="string"&&u.media.trim()||void 0,m=jk(t.workspaceRoot,f),h;try{h=await(0,Gk.resolveGatewayOutboundHandle)(m,t.agentId,p?{target:p}:void 0)}catch(y){t.logger?.warn(`[Egress] store read failed: ${y instanceof Error?y.message:String(y)}`)}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 E=await t.send(h,d,g);i.writeHead(E.ok?200:502,{"Content-Type":"application/json"}),i.end(JSON.stringify(E))}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 cy=T(Cn=>{"use strict";var Bk=Cn&&Cn.__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=Cn&&Cn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Vk=Cn&&Cn.__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(Cn,"__esModule",{value:!0});Cn.ASSERTION_HEADER=void 0;Cn.startDataPlaneSidecar=Zk;var Wk=Vk(require("http")),ay=require("crypto"),Kk=Hc(),qk=Fr(),Yk=xo();Cn.ASSERTION_HEADER="x-agent-user-assertion";function Jk(t,e){let n=t.headers[e];return(Array.isArray(n)?n[0]:n)?.trim()||void 0}function Xk(t){return(0,ay.createHash)("sha256").update(t).digest("hex").slice(0,12)}function zk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function Qk(t,e){let n=Buffer.from(t),r=Buffer.from(e);return n.length===r.length&&(0,ay.timingSafeEqual)(n,r)}async function Zk(t){let e=t.bindHost??"0.0.0.0",n=await Kk.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=Wk.createServer(async(a,c)=>{let l=(f,u)=>{c.writeHead(f,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:u}))};try{let f=zk(a.headers.authorization);if(!f||!Qk(f,t.registerToken))return t.audit?.("unauthorized","sidecar_register_reject",{reason:f?"bad_token":"missing_token"}),l(401,"unauthorized");let u=a.url?.split("?")[0]??"";if((a.method==="GET"||a.method==="POST")&&u==="/edge/turn"){let d=(Array.isArray(a.headers["x-agent-user"])?a.headers["x-agent-user"][0]:a.headers["x-agent-user"])?.trim();if(!d)return t.audit?.("unauthorized","sidecar_edge_reject",{reason:"missing_user"}),l(400,"X-Agent-User required");let p=Jk(a,Cn.ASSERTION_HEADER)?.replace(/^Bearer\s+/i,"").trim()||void 0,{nonce:g}=n.registerTurnRaw({userId:d,sessionKey:d,inboundToken:p});return t.audit?.(d,"sidecar_edge_register",{userId:d,assertion:p?`sha256:${Xk(p)}`:"none"}),c.writeHead(200,{"Content-Type":"application/json",[Yk.TURN_NONCE_HEADER]:g}),c.end(JSON.stringify({ok:!0}))}if(a.method==="POST"&&u==="/turns"){let d;try{d=JSON.parse(await(0,qk.readBodyWithCap)(a))}catch{return l(400,"bad json")}let p=(d.userId??"").trim();if(!p)return l(400,"userId required");let g=d.agent?.pack?.trim(),m=!!(g&&t.agent?.pack&&g!==t.agent.pack);m&&console.warn(`Warning: turn registration claims agent "${g}" 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.`),t.audit?.((d.sessionKey??"").trim()||p,"sidecar_register",{userId:p,claimedAgent:g??"none",binding:"asserted",...m?{agentMismatch:!0,loadedAgent:t.agent?.pack}:{}});let{nonce:h,release:E}=n.registerTurnRaw({userId:p,sessionKey:(d.sessionKey??"").trim()||p,inboundToken:d.inboundToken,egressStoreKey:d.egressStoreKey});return r.set(h,E),c.writeHead(200,{"Content-Type":"application/json"}),c.end(JSON.stringify({nonce:h}))}if(a.method==="DELETE"&&u.startsWith("/turns/")){let d=decodeURIComponent(u.slice(7));return r.get(d)?.(),r.delete(d),c.writeHead(204),c.end()}l(404,"not found")}catch(f){t.logger?.warn(`[Sidecar] control error: ${f instanceof Error?f.message:String(f)}`),c.headersSent||c.writeHead(500,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"internal"}))}});await new Promise((a,c)=>{s.once("error",c),s.listen(t.controlPort,e,()=>a())});let i=s.address(),o=i&&typeof i!="string"?i.port:t.controlPort;return 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 ${Cn.ASSERTION_HEADER} header \u2014 if your edge does not forward it, every tool call will fail closed.`),{gatewayUrl:n.url,controlPort:o,close:async()=>{await new Promise(a=>s.close(()=>a())),await n.close()}}}});var ly=T(Us=>{"use strict";Object.defineProperty(Us,"__esModule",{value:!0});Us.RemoteDataPlane=Us.EdgeDataPlane=void 0;Us.resolveEdgeDataPlane=e$;Us.resolveRemoteDataPlane=t$;var jc=xo();function e$(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 Bd=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}adoptTurn(e){return{nonce:e,env:{[jc.TURN_NONCE_ENV]:e,[jc.DATA_MCP_URL_ENV]:this.cfg.gatewayUrl},release:async()=>{try{await fetch(new URL("/turn",this.cfg.gatewayUrl),{method:"DELETE",headers:{Authorization:`Bearer ${e}`}})}catch{}}}}};Us.EdgeDataPlane=Bd;function t$(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 Fd=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:{[jc.TURN_NONCE_ENV]:r,[jc.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}`}})}catch{}}}}};Us.RemoteDataPlane=Fd});var Hc=T(J=>{"use strict";var n$=J&&J.__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]})),r$=J&&J.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),s$=J&&J.__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"&&n$(n,e,r[s]);return r$(n,e),n}})();Object.defineProperty(J,"__esModule",{value:!0});J.DataPlane=J.resolveEdgeDataPlane=J.EdgeDataPlane=J.resolveRemoteDataPlane=J.RemoteDataPlane=J.ASSERTION_HEADER=J.startDataPlaneSidecar=J.EGRESS_URL_ENV=J.startEgressBroker=J.TURN_NONCE_HEADER=J.TURN_NONCE_ENV=J.DATA_MCP_URL_ENV=J.startDataGateway=J.TURN_META_KEY=J.ConnectorHost=J.identityProvider=J.passthroughProvider=J.resolveProvider=J.CredentialBroker=J.DEFAULT_TURN_DEADLINE_MS=J.hashNonce=J.TurnRegistry=void 0;J.resolveDataPlaneConfig=a$;var uy=s$(require("path")),i$=jo(),dy=Dd(),o$=Md(),Vd=xo(),Kd=jo();Object.defineProperty(J,"TurnRegistry",{enumerable:!0,get:function(){return Kd.TurnRegistry}});Object.defineProperty(J,"hashNonce",{enumerable:!0,get:function(){return Kd.hashNonce}});Object.defineProperty(J,"DEFAULT_TURN_DEADLINE_MS",{enumerable:!0,get:function(){return Kd.DEFAULT_TURN_DEADLINE_MS}});var xc=Dd();Object.defineProperty(J,"CredentialBroker",{enumerable:!0,get:function(){return xc.CredentialBroker}});Object.defineProperty(J,"resolveProvider",{enumerable:!0,get:function(){return xc.resolveProvider}});Object.defineProperty(J,"passthroughProvider",{enumerable:!0,get:function(){return xc.passthroughProvider}});Object.defineProperty(J,"identityProvider",{enumerable:!0,get:function(){return xc.identityProvider}});var fy=Md();Object.defineProperty(J,"ConnectorHost",{enumerable:!0,get:function(){return fy.ConnectorHost}});Object.defineProperty(J,"TURN_META_KEY",{enumerable:!0,get:function(){return fy.TURN_META_KEY}});var Bc=xo();Object.defineProperty(J,"startDataGateway",{enumerable:!0,get:function(){return Bc.startDataGateway}});Object.defineProperty(J,"DATA_MCP_URL_ENV",{enumerable:!0,get:function(){return Bc.DATA_MCP_URL_ENV}});Object.defineProperty(J,"TURN_NONCE_ENV",{enumerable:!0,get:function(){return Bc.TURN_NONCE_ENV}});Object.defineProperty(J,"TURN_NONCE_HEADER",{enumerable:!0,get:function(){return Bc.TURN_NONCE_HEADER}});var py=oy();Object.defineProperty(J,"startEgressBroker",{enumerable:!0,get:function(){return py.startEgressBroker}});Object.defineProperty(J,"EGRESS_URL_ENV",{enumerable:!0,get:function(){return py.EGRESS_URL_ENV}});var gy=cy();Object.defineProperty(J,"startDataPlaneSidecar",{enumerable:!0,get:function(){return gy.startDataPlaneSidecar}});Object.defineProperty(J,"ASSERTION_HEADER",{enumerable:!0,get:function(){return gy.ASSERTION_HEADER}});var Fc=ly();Object.defineProperty(J,"RemoteDataPlane",{enumerable:!0,get:function(){return Fc.RemoteDataPlane}});Object.defineProperty(J,"resolveRemoteDataPlane",{enumerable:!0,get:function(){return Fc.resolveRemoteDataPlane}});Object.defineProperty(J,"EdgeDataPlane",{enumerable:!0,get:function(){return Fc.EdgeDataPlane}});Object.defineProperty(J,"resolveEdgeDataPlane",{enumerable:!0,get:function(){return Fc.resolveEdgeDataPlane}});function a$(t,e){let n=t?.dataPlane,r=n?.connector?.trim();if(r)return{connectorPath:uy.isAbsolute(r)?r:uy.join(e,r),provider:n?.provider?.trim()||void 0}}var Wd=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 i$.TurnRegistry,s=new dy.CredentialBroker((0,dy.resolveProvider)(e.provider)),i=await o$.ConnectorHost.spawn({connectorPath:e.connectorPath,logger:n?.logger});try{let o=await(0,Vd.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){return this.registry.register(e)}registerTurn(e){let{nonce:n,release:r}=this.registry.register(e);return{nonce:n,env:{[Vd.TURN_NONCE_ENV]:n,[Vd.DATA_MCP_URL_ENV]:this.url},release:r}}async close(){await this.gateway.close(),await this.connector.close()}};J.DataPlane=Wd});var hy=T(Xn=>{"use strict";Object.defineProperty(Xn,"__esModule",{value:!0});Xn.PROTOCOL_VERSION=Xn.DEFAULT_GATEWAY_OPERATOR_SCOPES=Xn.GATEWAY_CLIENT_CAPS=Xn.GATEWAY_CLIENT_MODES=Xn.GATEWAY_CLIENT_IDS=void 0;Xn.GATEWAY_CLIENT_IDS={GATEWAY_CLIENT:"gateway-client"};Xn.GATEWAY_CLIENT_MODES={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",AGENT_BACKEND:"agent-backend",NODE:"node",PROBE:"probe",TEST:"test"};Xn.GATEWAY_CLIENT_CAPS={TOOL_EVENTS:"tool-events"};Xn.DEFAULT_GATEWAY_OPERATOR_SCOPES=["operator.admin","operator.read","operator.write","operator.approvals","operator.pairing"];Xn.PROTOCOL_VERSION=3});var Vc=T(zn=>{"use strict";Object.defineProperty(zn,"__esModule",{value:!0});zn.GatewayClient=zn.MAX_GATEWAY_MESSAGE_CHARS=zn.MAX_GATEWAY_FRAME_BYTES=void 0;zn.createAgentIDEGatewayClient=d$;zn.createEphemeralGatewayClient=f$;var c$=require("events"),Hs=hy();zn.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})();zn.MAX_GATEWAY_MESSAGE_CHARS=256*1024;function l$(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 u$(t){let e=typeof t?.code=="number"?t.code:void 0;return e!==void 0&&e!==1e3&&e!==1001}var Fo=class extends c$.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:Hs.PROTOCOL_VERSION,maxProtocol:Hs.PROTOCOL_VERSION,client:e,caps:[Hs.GATEWAY_CLIENT_CAPS.TOOL_EVENTS],role:"operator",scopes:[...Hs.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,u$(s)&&this.emit("error",new Error(l$(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>zn.MAX_GATEWAY_FRAME_BYTES){this.emit("error",new Error(`Gateway frame of ${n} bytes exceeds the ${zn.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}};zn.GatewayClient=Fo;function d$(t,e,n="1.0.0"){let r=new Fo({url:t,token:e,reconnectInterval:5e3,maxReconnectAttempts:10}),s={id:Hs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo IDE",version:n,platform:process.platform,mode:Hs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}function f$(t,e,n="1.0.0"){let r=new Fo({url:t,token:e}),s={id:Hs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo CLI",version:n,platform:process.platform,mode:Hs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}});var Xd=T($t=>{"use strict";var p$=$t&&$t.__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]})),g$=$t&&$t.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yd=$t&&$t.__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 g$(n,e),n}})();Object.defineProperty($t,"__esModule",{value:!0});$t.GATEWAY_OUTBOUND_RPC_METHOD=void 0;$t.stageLocalMediaIfNeeded=my;$t.buildGatewayOutboundSendArgs=Ey;$t.buildGatewaySendParams=Jd;$t.buildGatewayRpcCommand=qd;$t.sendGatewayOutboundMessage=P$;var h$=require("child_process"),m$=require("crypto"),Wi=Yd(require("fs")),E$=Yd(require("os")),vr=Yd(require("path")),y$=Er(),_$=Vc(),w$=18789;$t.GATEWAY_OUTBOUND_RPC_METHOD="send";function A$(t){return t?.trim()||process.env.AGENTHIPPO_GATEWAY_CLI?.trim()||"hippoclaw"}var S$=".openclaw",b$=[".clawdbot",".moldbot",".moltbot"];function T$(){let t=E$.homedir(),e=process.env.OPENCLAW_STATE_DIR?.trim()||process.env.CLAWDBOT_STATE_DIR?.trim();if(e)return e==="~"||e.startsWith("~/")||e.startsWith("~\\")?vr.join(t,e.slice(1)):vr.resolve(e);let n=vr.join(t,S$);if(Wi.existsSync(n))return n;for(let r of b$){let s=vr.join(t,r);if(Wi.existsSync(s))return s}return n}function v$(t){return/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||t.startsWith("data:")}function my(t){let e=t?.trim();if(!e||v$(e))return t;let n;try{n=Wi.realpathSync(e)}catch{return e}let r=vr.join(T$(),"media"),s=vr.resolve(r);try{s=Wi.realpathSync(r)}catch{}let i=vr.relative(s,n);if(i&&!i.startsWith("..")&&!vr.isAbsolute(i))return n;let o=vr.extname(n),a=vr.basename(n,o),c=(0,m$.createHash)("sha256").update(n).digest("hex").slice(0,8),l=vr.join(r,`${a}-${c}${o}`);return Wi.mkdirSync(r,{recursive:!0}),Wi.copyFileSync(n,l),l}function Ey(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 Jd(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 qd(t,e,n){return[$t.GATEWAY_OUTBOUND_RPC_METHOD,JSON.stringify(Jd(t,e,n))]}async function O$(t,e,n,r){let s=process.env.OPENCLAW_GATEWAY_URL?.trim()||`ws://127.0.0.1:${w$}`,i=r?.trim()||(0,y$.readOpenClawGatewayToken)(),{client:o,clientInfo:a}=(0,_$.createEphemeralGatewayClient)(s,i);await o.connect(a);try{let c=await o.request($t.GATEWAY_OUTBOUND_RPC_METHOD,Jd(t,e,n),6e4);return{stdout:JSON.stringify(c),stderr:""}}finally{o.close()}}function I$(t,e){let n=(0,h$.spawnSync)(t,e,{encoding:"utf-8",env:process.env});return{stdout:(n.stdout??"").trim(),stderr:(n.stderr??"").trim(),exitCode:n.status}}async function P$(t,e){let n=A$(e.cli);if(e.dryRun)return{ok:!0,via:"dry-run",command:qd(t,e.message,e.media),stdout:"",stderr:"",exitCode:0};let r=my(e.media),s=Ey(t,e.message,r),i=[n,...s],o=qd(t,e.message,r);try{let a=await O$(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=I$(n,s);if(l.exitCode===0)return{ok:!0,via:"hippoclaw",command:i,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode};let f=l.stderr||l.stdout||"unknown error";return{ok:!1,via:"gateway-rpc",command:o,stdout:l.stdout,stderr:`Gateway RPC failed: ${c}
|
|
523
|
+
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 _C(t=process.env){let e=t.AGENTHIPPO_AUTH_JWT_SECRET?.trim()||Nn.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:mC(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",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 wC(t,e){if(e.length===0)return!0;let n=t.split("@")[1]?.toLowerCase();return!!n&&e.includes(n)}});var Fr=T($=>{"use strict";var AC=$&&$.__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]})),SC=$&&$.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Cd=$&&$.__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"&&AC(n,e,r[s]);return SC(n,e),n}})();Object.defineProperty($,"__esModule",{value:!0});$.TurnGate=$.TURN_LIMIT_BUSY_MESSAGE=$.RATE_LIMIT_BUSY_MESSAGE=$.TURN_GATE_BUSY_MESSAGE=$.TURN_GATE_RETRY_AFTER_SECONDS=$.TURN_QUEUE_ENV=$.MAX_CONCURRENT_TURNS_ENV=$.TurnLimiter=$.SESSION_WITHOUT_USER_REASON=$.REQUIRE_TENANT_ISOLATION_ENV=$.IDENTITY_PROXY_SECRET_ENV=$.IDENTITY_HEADER_ENV=$.PIN_ONLY_IDENTITY_HEADERS=$.RateLimiter=$.XFF_TRUSTED_HOPS_ENV=$.CONTAINER_SERVE_HOST=$.SERVE_HOST_ENV=$.DEFAULT_BIND_HOST=$.SERVICE_USER_ENV=$.DEFAULT_MAX_BODY_BYTES=void 0;$.resolveStateDir=OC;$.resolveAnalyticsSessionsDir=IC;$.resolveServiceIdentity=PC;$.isLoopbackHost=WE;$.resolveBindHost=NC;$.clientIp=RC;$.hasTrustedProxyProof=qE;$.identityHeaderAdvice=CC;$.tenantIsolationAdvice=kC;$.resolveUserId=$C;$.resolveDataToken=LC;$.peerToUserId=MC;$.userNamespaceHash=Nd;$.resolveServeSessionKey=GC;$.corsHeaders=UC;$.createTurnGateFromEnv=HC;$.createRejectionWarner=jC;$.readBodyWithCap=xC;var bC=Cd(require("os")),hs=Cd(require("path")),$c=Cd(require("crypto")),TC=Js(),vC=Uo();$.DEFAULT_MAX_BODY_BYTES=1024*1024;function OC(t,e=process.env){let n=t?.trim();if(n)return{dir:hs.resolve(n),ephemeral:!1};let r=e.AGENTHIPPO_HOME?.trim()||e.AGENTIDE_HOME?.trim();return r?{dir:hs.join(hs.resolve(r),"serve-state"),ephemeral:!1}:{dir:hs.join(bC.tmpdir(),"agenthippo-server"),ephemeral:!0}}function IC(t,e,n=process.env){return!(n.AGENT_HOME_DIR?.trim()||n.AGENTHIPPO_HOME?.trim())&&!e?hs.join(t,"analytics","sessions"):hs.join((0,TC.getAgentideHome)(),"analytics","sessions")}$.SERVICE_USER_ENV="AGENTHIPPO_SERVICE_USER";var FE=256;function PC(t=process.env){let e=t[$.SERVICE_USER_ENV];if(e===void 0)return{};let n=e.trim();return n?/\s/.test(n)?{error:`${$.SERVICE_USER_ENV} must not contain whitespace, got ${JSON.stringify(e)}.`}:n.length>FE?{error:`${$.SERVICE_USER_ENV} is ${n.length} chars; the maximum is ${FE}.`}:/^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:`${$.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:`${$.SERVICE_USER_ENV} is set but empty. Unset it, or give it the identity unattended runs should act as.`}}$.DEFAULT_BIND_HOST="127.0.0.1";function WE(t){let e=t.trim().toLowerCase().replace(/^\[|\]$/g,"");return e==="localhost"||e==="::1"||/^127\./.test(e)}$.SERVE_HOST_ENV="AGENTHIPPO_SERVE_HOST";$.CONTAINER_SERVE_HOST="0.0.0.0";function NC(t,e=process.env){return t?.trim()||e.AGENTHIPPO_SERVE_HOST?.trim()||$.DEFAULT_BIND_HOST}$.XFF_TRUSTED_HOPS_ENV="AGENTHIPPO_XFF_TRUSTED_HOPS";function RC(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[$.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 Pd=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()}};$.RateLimiter=Pd;var KE=["x-forwarded-email","x-forwarded-preferred-username","x-goog-authenticated-user-email","cf-access-authenticated-user-email"];$.PIN_ONLY_IDENTITY_HEADERS=["x-agent-user"];$.IDENTITY_HEADER_ENV="AGENTHIPPO_IDENTITY_HEADER";$.IDENTITY_PROXY_SECRET_ENV="AGENTHIPPO_IDENTITY_PROXY_SECRET";function qE(t,e){if(!e)return!1;let n=t[vC.AUTH_PROXY_SECRET_HEADER],r=typeof n=="string"?n:Array.isArray(n)?String(n[0]??""):"";if(!r)return!1;let s=$c.createHash("sha256").update(r).digest(),i=$c.createHash("sha256").update(e).digest();return $c.timingSafeEqual(s,i)}function CC(t=process.env,e){if(t[$.IDENTITY_HEADER_ENV]?.trim())return[];let r=e?.trim();return r&&WE(r)?[`${$.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 ${$.IDENTITY_HEADER_ENV} pinned. Anyone who can reach this port is trusted to state who they are.`]:[],`${$.IDENTITY_HEADER_ENV} is not set, so identity falls back to the platform header aliases (${KE.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. ${$.IDENTITY_HEADER_ENV}=x-goog-authenticated-user-email.`,`NOTE: ${$.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: ${$.IDENTITY_HEADER_ENV}=x-agent-user.`]}$.REQUIRE_TENANT_ISOLATION_ENV="AGENTHIPPO_REQUIRE_TENANT_ISOLATION";function VE(t,e){let n=hs.resolve(t),r=hs.resolve(e);return n===r||n.startsWith(r+hs.sep)}function kC(t,e=process.env){if(!e[$.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=[`${$.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&&VE(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&&VE(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[$.REQUIRE_TENANT_ISOLATION_ENV]?.trim()??"")?"refuse":"warn",lines:s}}function $C(t,e,n=process.env){let r=n[$.IDENTITY_PROXY_SECRET_ENV]?.trim();if(r&&!qE(t,r))return;let s=n[$.IDENTITY_HEADER_ENV]?.trim().toLowerCase(),i=s?[s]:KE;for(let a of i){let c=t[a],l=(Array.isArray(c)?c[0]:c)?.trim();if(l){let f=l.lastIndexOf(":");return f>=0&&l.slice(f+1).includes("@")?l.slice(f+1):l}}return s||n.AGENTHIPPO_ALLOW_BODY_IDENTITY?.trim()!=="1"?void 0:e?.user_id?.trim()||void 0}var DC=["x-forwarded-access-token","x-agent-data-token"];function LC(t){for(let e of DC){let n=t[e],r=(Array.isArray(n)?n[0]:n)?.trim();if(r)return r}}function MC(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}$.SESSION_WITHOUT_USER_REASON="session_without_verified_user";function Nd(t){return $c.createHash("sha256").update(t).digest("hex").slice(0,16)}function GC(t,e,n="session",r=process.env){let s=t?.trim(),i=e?.trim();if(i){let a=`u${Nd(i)}--${s||"default"}`;return{sessionKey:a,sandboxKey:n==="user"?`u${Nd(i)}`:a}}if(r[$.IDENTITY_HEADER_ENV]?.trim())return{sessionKey:"",sandboxKey:"",rejected:$.SESSION_WITHOUT_USER_REASON};let o=s||"anon-unknown";return{sessionKey:o,sandboxKey:o}}function UC(){return{"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Agent-User","Access-Control-Allow-Origin":"*"}}var Rd=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)}};$.TurnLimiter=Rd;$.MAX_CONCURRENT_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_TURNS";$.TURN_QUEUE_ENV="AGENTHIPPO_TURN_QUEUE";$.TURN_GATE_RETRY_AFTER_SECONDS=15;$.TURN_GATE_BUSY_MESSAGE="At capacity \u2014 please retry in a moment";$.RATE_LIMIT_BUSY_MESSAGE="Rate limit exceeded \u2014 please retry in a moment";$.TURN_LIMIT_BUSY_MESSAGE="Per-session turn limit reached";var Dc=class{maxInflight;maxQueue;queueTimeoutMs;inflightCount=0;waiters=[];constructor(e,n,r=$.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}};$.TurnGate=Dc;function HC(t=process.env){let e=Number(t[$.MAX_CONCURRENT_TURNS_ENV]??10),n=Number(t[$.TURN_QUEUE_ENV]??20),r=Number.isFinite(e)?e:10,s=Number.isFinite(n)&&n>=0?n:20;return new Dc(r,s)}function jC(t=5e3){let e=0;return n=>{let r=Date.now();r-e<t||(e=r,console.warn(n))}}function xC(t,e=$.DEFAULT_MAX_BODY_BYTES){return new Promise((n,r)=>{let s=0,i=[],o=f=>{if(s+=f.length,s>e){l();let u=new Error(`Request body exceeds ${e} bytes`);u.tooLarge=!0,r(u);return}i.push(f)},a=()=>{l(),n(Buffer.concat(i).toString("utf8"))},c=f=>{l(),r(f)},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 jo=T(Ls=>{"use strict";Object.defineProperty(Ls,"__esModule",{value:!0});Ls.TurnRegistry=Ls.DEFAULT_TURN_DEADLINE_MS=void 0;Ls.hashNonce=Ho;var YE=require("crypto");Ls.DEFAULT_TURN_DEADLINE_MS=30*6e4;function Ho(t){return(0,YE.createHash)("sha256").update(t).digest("hex")}var kd=class{entries=new Map;register(e){this.prune();let n=(0,YE.randomBytes)(16).toString("hex"),r=Ho(n);this.entries.set(r,{userId:e.userId,sessionKey:e.sessionKey,inboundToken:e.inboundToken,egressStoreKey:e.egressStoreKey,deadline:e.deadline??Date.now()+Ls.DEFAULT_TURN_DEADLINE_MS});let s=!1;return{nonce:n,release:()=>{s||(s=!0,this.entries.delete(r))}}}releaseByNonce(e){return this.entries.delete(Ho(e))}resolve(e,n=Date.now()){let r=this.entries.get(Ho(e));if(r){if(n>r.deadline){this.entries.delete(Ho(e));return}return r}}prune(e=Date.now()){for(let[n,r]of this.entries)e>r.deadline&&this.entries.delete(n)}get size(){return this.entries.size}};Ls.TurnRegistry=kd});var Dd=T(Sr=>{"use strict";Object.defineProperty(Sr,"__esModule",{value:!0});Sr.CredentialBroker=Sr.identityProvider=Sr.passthroughProvider=void 0;Sr.resolveProvider=BC;Sr.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}}};Sr.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 BC(t){let e=(t??"passthrough").trim().toLowerCase();if(e==="passthrough")return Sr.passthroughProvider;if(e==="identity")return Sr.identityProvider;throw new Error(`Unknown data credential provider "${t}" (supported: passthrough, identity)`)}var $d=class{provider;cache=new Map;constructor(e){this.provider=e}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)}};Sr.CredentialBroker=$d});var Md=T(Rn=>{"use strict";var FC=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]})),VC=Rn&&Rn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),WC=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"&&FC(n,e,r[s]);return VC(n,e),n}})();Object.defineProperty(Rn,"__esModule",{value:!0});Rn.ConnectorHost=Rn.TURN_META_KEY=void 0;var JE=WC(require("path")),KC=require("fs"),qC=require("@modelcontextprotocol/sdk/client/index.js"),YC=require("@modelcontextprotocol/sdk/client/stdio.js"),JC=require("@modelcontextprotocol/sdk/types.js"),XC=ec();Rn.TURN_META_KEY="ai.agenthippo/turn";var Ld=class t{client;logger;connectorPath;constructor(e,n,r){this.client=e,this.logger=n,this.connectorPath=r}static async spawn(e){let n=JE.resolve(e.connectorPath);await KC.promises.access(n);let r=await(0,XC.resolveNodeBinary)(),s=new YC.StdioClientTransport({command:r,args:[n],cwd:JE.dirname(n),env:{...process.env,AGENTHIPPO_DATA_CONNECTOR:"1"},stderr:"pipe"}),i=new qC.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:{[Rn.TURN_META_KEY]:{userId:r.userId,credential:r.credential}}}},JC.CallToolResultSchema)}async close(){try{await this.client.close()}catch(e){this.logger?.warn(`[DataPlane] connector close: ${e instanceof Error?e.message:String(e)}`)}}};Rn.ConnectorHost=Ld});var xo=T(sn=>{"use strict";var zC=sn&&sn.__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=sn&&sn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ZC=sn&&sn.__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(sn,"__esModule",{value:!0});sn.TURN_NONCE_HEADER=sn.TURN_NONCE_ENV=sn.DATA_MCP_URL_ENV=void 0;sn.startDataGateway=ik;var ek=ZC(require("http")),tk=require("@modelcontextprotocol/sdk/server/index.js"),nk=require("@modelcontextprotocol/sdk/server/streamableHttp.js"),XE=require("@modelcontextprotocol/sdk/types.js"),rk=Fr(),sk=jo();sn.DATA_MCP_URL_ENV="AGENTHIPPO_DATA_MCP_URL";sn.TURN_NONCE_ENV="AGENTHIPPO_TURN_NONCE";sn.TURN_NONCE_HEADER="x-agent-turn-nonce";function zE(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function QE(t){return t?(0,sk.hashNonce)(t).slice(0,12):"none"}async function ik(t){let e=ek.createServer(async(i,o)=>{try{let a=i.url?.split("?")[0]??"";if(a==="/turn"&&i.method==="DELETE"){let p=zE(i.headers.authorization);if(p){let g=t.registry.releaseByNonce(p);t.audit?.("edge","turn_release",{released:g,nonce_sha256_prefix:QE(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=zE(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:QE(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 f;try{f=JSON.parse(await(0,rk.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 u=ok(t,l),d=new nk.StreamableHTTPServerTransport({sessionIdGenerator:void 0,enableJsonResponse:!0});o.on("close",()=>{d.close(),u.close()}),await u.connect(d),await d.handleRequest(i,o,f)}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 ok(t,e){let n=new tk.Server({name:"agenthippo-data-gateway",version:"1.0.0"},{capabilities:{tools:{}}});return n.setRequestHandler(XE.ListToolsRequestSchema,async()=>({tools:await t.connector.listTools()})),n.setRequestHandler(XE.CallToolRequestSchema,async r=>{let s=r.params.name,i;try{i=(await t.broker.acquire(e.userId,e.inboundToken)).secretRef,t.audit?.(e.sessionKey,"tool_authorize",{tool:s,userId:e.userId,provider:t.broker.provider.name})}catch(o){let a=o instanceof Error?o.message:String(o);return t.audit?.(e.sessionKey,"tool_deny",{tool:s,userId:e.userId,reason:"acquire_failed",error:a}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:`credential acquire failed (fail-closed): ${a}`})}],isError:!0}}try{return await t.connector.callTool(s,r.params.arguments??{},{userId:e.userId,credential:i})}catch(o){let a=o instanceof Error?o.message:String(o);if(/401|unauthoriz|expired/i.test(a)){t.broker.invalidate(e.userId);try{let c=await t.broker.acquire(e.userId,e.inboundToken);return await t.connector.callTool(s,r.params.arguments??{},{userId:e.userId,credential:c.secretRef})}catch{}}return t.audit?.(e.sessionKey,"tool_deny",{tool:s,userId:e.userId,reason:"call_failed",error:a}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:a})}],isError:!0}}}),n}});var ey=T(br=>{"use strict";var ak=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]})),ck=br&&br.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lk=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"&&ak(n,e,r[s]);return ck(n,e),n}})();Object.defineProperty(br,"__esModule",{value:!0});br.backupTimestamp=dk;br.backupPathFor=ZE;br.renameToBackup=fk;var uk=require("fs"),Gd=lk(require("path"));function dk(t=new Date){return t.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function ZE(t,e){let n=Gd.dirname(t),r=Gd.basename(t).replace(/\.json$/i,"");return Gd.join(n,`${r}.${e}.bk`)}async function fk(t,e){let n=ZE(t,e);try{return await uk.promises.rename(t,n),n}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code):"")==="ENOENT")return;throw r}}});var Uc=T(vt=>{"use strict";var pk=vt&&vt.__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]})),gk=vt&&vt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),hk=vt&&vt.__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"&&pk(n,e,r[s]);return gk(n,e),n}})();Object.defineProperty(vt,"__esModule",{value:!0});vt._resetOutboundHandleStoreLockForTest=Ek;vt._setOutboundHandleStorePathForTest=yk;vt.buildGatewayOutboundHandleKey=sy;vt.upsertGatewayOutboundHandle=Tk;vt.getLastGatewayOutboundHandle=vk;vt.listGatewayOutboundTargets=Ok;vt.mergeGatewayOutboundHandles=Ik;vt.resolveGatewayOutboundHandle=Pk;vt.backupAndClearOutboundHandlesForAgent=Nk;vt.getGatewayOutboundStoreSnapshot=Rk;var Lc=require("fs"),mk=hk(require("path")),ty=ey(),Hd=1,ry={value:void 0},Vi=new Map,Ud=new Map;function jd(t,e){let r=(Ud.get(t)??Promise.resolve()).then(()=>e());return Ud.set(t,r.catch(()=>{})),r}function Ek(){Ud.clear(),Vi.clear()}function yk(t){ry.value=t,Vi.clear()}function Bo(t){return ry.value??t}function sy(t,e){let n=e?.trim();return n?`${t}::thread:${n}`:`${t}::`}function _k(){return{version:Hd,lastByAgent:{},targetsByAgent:{}}}async function Gs(t){let e=Bo(t),n=Vi.get(e);if(n)return n;try{let s=await Lc.promises.readFile(e,"utf-8"),i=JSON.parse(s);if(i.targetsByAgent&&typeof i.targetsByAgent=="object"){let o={version:i.version??Hd,lastByAgent:i.lastByAgent??{},targetsByAgent:i.targetsByAgent};return Vi.set(e,o),o}}catch{}let r=_k();return Vi.set(e,r),r}async function xd(t,e){let n=Bo(t);await Lc.promises.mkdir(mk.dirname(n),{recursive:!0});let r={version:Hd,lastByAgent:e.lastByAgent,targetsByAgent:e.targetsByAgent},s=`${n}.tmp`;await Lc.promises.writeFile(s,JSON.stringify(r,null,2),"utf-8"),await Lc.promises.rename(s,n),Vi.set(n,e)}function Ms(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 ny(t,e,n){let r=Ms(t,n),s=Ms(e,n);return r.toLowerCase()===s.toLowerCase()}function wk(t,e,n){if(n)return t.find(i=>ny(i.target,e,i.channel)&&i.threadId?.trim()===n);let r=t.filter(i=>ny(i.target,e,i.channel));return r.length===0?void 0:r.find(i=>!i.threadId?.trim())??Mc(r)[0]}function Ak(t,e){let n=t.match(/:thread:([^:]+)$/),r=n?t.slice(0,-n[0].length):t,s=r.match(/:direct:([^:]+)$/);if(s)return Ms(`user:${s[1]}`,e);let i=r.match(/:dm:([^:]+)$/);if(i)return Ms(`user:${i[1]}`,e);let o=r.match(/:channel:([^:]+)$/);if(o)return Ms(`channel:${o[1]}`,e);let a=r.match(/:group:([^:]+)$/);if(a)return Ms(`channel:${a[1]}`,e)}function Sk(t){let e=t.target?.trim();if(e)return Ms(e,t.channel);let n=t.sessionKey?.trim().toLowerCase();if(n){let s=Ak(n,t.channel);if(s)return s}let r=t.senderId?.trim();if(r&&t.channel)return Ms(`user:${r}`,t.channel)}function bk(t){return t.senderName?.trim()?t.senderName.trim():t.senderUsername?.trim()?t.senderUsername.trim():t.target?.trim()||t.senderId?.trim()}function Mc(t){return[...t].sort((e,n)=>n.lastSeenAt-e.lastSeenAt)}function Gc(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 Tk(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 f=c.match(/^agent:[^:]+:([a-z0-9_-]+):/);f&&(a=f[1])}let l=Sk(n);if(!(!a||!l))return jd(Bo(t),async()=>{let f=Date.now(),u=await Gs(t);u.targetsByAgent[i]||(u.targetsByAgent[i]={});let d=sy(l,n.threadId?.trim()),p=u.targetsByAgent[i][d],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:bk(n),firstSeenAt:p?.firstSeenAt??f,lastSeenAt:f,lastInboundRunId:r,inboundCount:(p?.inboundCount??0)+1};return u.targetsByAgent[i][d]=g,u.lastByAgent[i]=g,await xd(t,u),g})}async function vk(t,e){let n=await Gs(t),r=Gc(n,e);return n.lastByAgent[r]}async function Ok(t,e){let n=await Gs(t);if(e?.trim()){let s=Gc(n,e.trim());return Mc(Object.values(n.targetsByAgent[s]??{}))}let r=[];for(let s of Object.values(n.targetsByAgent))r.push(...Object.values(s));return Mc(r)}async function Ik(t,e,n){let r=await Gs(t),s=n?.trim()?[n.trim()]:[...new Set([...Object.keys(r.targetsByAgent),...Object.keys(r.lastByAgent)])];return s.length===0?0:jd(Bo(e),async()=>{let i=await Gs(e),o=0,a=!1;for(let c of s){let l=r.targetsByAgent[c]??{},f=Object.entries(l);f.length>0&&!i.targetsByAgent[c]&&(i.targetsByAgent[c]={});for(let[d,p]of f){let g=i.targetsByAgent[c]?.[d];(!g||p.lastSeenAt>=g.lastSeenAt)&&(i.targetsByAgent[c][d]=p,o++,a=!0)}let u=r.lastByAgent[c];if(u){let d=i.lastByAgent[c];(!d||u.lastSeenAt>=d.lastSeenAt)&&(i.lastByAgent[c]=u,a=!0)}}return a&&await xd(e,i),o})}async function Pk(t,e,n){let r=await Gs(t),s=Gc(r,e),i=n?.target?.trim();if(i){let o=Object.values(r.targetsByAgent[s]??{});return wk(o,i,n?.threadId?.trim())}return r.lastByAgent[s]}async function Nk(t,e,n=(0,ty.backupTimestamp)()){let r=Bo(t);return jd(r,async()=>{let s=await Gs(t),i=Gc(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,ty.renameToBackup)(r,n);return delete s.targetsByAgent[i],delete s.lastByAgent[i],await xd(t,s),{removed:c,backupPath:l}})}async function Rk(t){let e=await Gs(t),n={};for(let[r,s]of Object.entries(e.targetsByAgent))n[r]=Mc(Object.values(s));return{lastByAgent:e.lastByAgent,targetsByAgent:n}}});var oy=T(Tr=>{"use strict";var Ck=Tr&&Tr.__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]})),kk=Tr&&Tr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$k=Tr&&Tr.__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"&&Ck(n,e,r[s]);return kk(n,e),n}})();Object.defineProperty(Tr,"__esModule",{value:!0});Tr.EGRESS_URL_ENV=void 0;Tr.startEgressBroker=xk;var Dk=$k(require("http")),Lk=Fr(),Mk=jo(),Gk=Uc(),iy=Ja();Tr.EGRESS_URL_ENV="AGENTHIPPO_EGRESS_URL";function Uk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function Hk(t){return t?(0,Mk.hashNonce)(t).slice(0,12):"none"}function jk(t,e){return(0,iy.getGatewayOutboundFilePath)(t,(0,iy.safeGatewaySessionDirId)(e))}async function xk(t){let e=Dk.createServer(async(s,i)=>{let o=(a,c,l,f)=>{l&&t.audit?.("unauthorized",l,f??{}),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=Uk(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:Hk(c)});return}let f=l.egressStoreKey?.trim();if(!f){o(403,"no outbound route for this turn (not a channel-originated session)","egress_deny",{userId:l.userId,reason:"no_store_key"});return}let u;try{u=JSON.parse(await(0,Lk.readBodyWithCap)(s))}catch{o(400,"invalid JSON body");return}let d=typeof u.message=="string"?u.message:"";if(!d.trim()){o(400,"message is required");return}let p=typeof u.to=="string"?u.to.trim():void 0,g=typeof u.media=="string"&&u.media.trim()||void 0,m=jk(t.workspaceRoot,f),h;try{h=await(0,Gk.resolveGatewayOutboundHandle)(m,t.agentId,p?{target:p}:void 0)}catch(y){t.logger?.warn(`[Egress] store read failed: ${y instanceof Error?y.message:String(y)}`)}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 E=await t.send(h,d,g);i.writeHead(E.ok?200:502,{"Content-Type":"application/json"}),i.end(JSON.stringify(E))}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 cy=T(Cn=>{"use strict";var Bk=Cn&&Cn.__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=Cn&&Cn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Vk=Cn&&Cn.__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(Cn,"__esModule",{value:!0});Cn.ASSERTION_HEADER=void 0;Cn.startDataPlaneSidecar=Zk;var Wk=Vk(require("http")),ay=require("crypto"),Kk=Hc(),qk=Fr(),Yk=xo();Cn.ASSERTION_HEADER="x-agent-user-assertion";function Jk(t,e){let n=t.headers[e];return(Array.isArray(n)?n[0]:n)?.trim()||void 0}function Xk(t){return(0,ay.createHash)("sha256").update(t).digest("hex").slice(0,12)}function zk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function Qk(t,e){let n=Buffer.from(t),r=Buffer.from(e);return n.length===r.length&&(0,ay.timingSafeEqual)(n,r)}async function Zk(t){let e=t.bindHost??"0.0.0.0",n=await Kk.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=Wk.createServer(async(a,c)=>{let l=(f,u)=>{c.writeHead(f,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:u}))};try{let f=zk(a.headers.authorization);if(!f||!Qk(f,t.registerToken))return t.audit?.("unauthorized","sidecar_register_reject",{reason:f?"bad_token":"missing_token"}),l(401,"unauthorized");let u=a.url?.split("?")[0]??"";if((a.method==="GET"||a.method==="POST")&&u==="/edge/turn"){let d=(Array.isArray(a.headers["x-agent-user"])?a.headers["x-agent-user"][0]:a.headers["x-agent-user"])?.trim();if(!d)return t.audit?.("unauthorized","sidecar_edge_reject",{reason:"missing_user"}),l(400,"X-Agent-User required");let p=Jk(a,Cn.ASSERTION_HEADER)?.replace(/^Bearer\s+/i,"").trim()||void 0,{nonce:g}=n.registerTurnRaw({userId:d,sessionKey:d,inboundToken:p});return t.audit?.(d,"sidecar_edge_register",{userId:d,assertion:p?`sha256:${Xk(p)}`:"none"}),c.writeHead(200,{"Content-Type":"application/json",[Yk.TURN_NONCE_HEADER]:g}),c.end(JSON.stringify({ok:!0}))}if(a.method==="POST"&&u==="/turns"){let d;try{d=JSON.parse(await(0,qk.readBodyWithCap)(a))}catch{return l(400,"bad json")}let p=(d.userId??"").trim();if(!p)return l(400,"userId required");let g=d.agent?.pack?.trim(),m=!!(g&&t.agent?.pack&&g!==t.agent.pack);m&&console.warn(`Warning: turn registration claims agent "${g}" 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.`),t.audit?.((d.sessionKey??"").trim()||p,"sidecar_register",{userId:p,claimedAgent:g??"none",binding:"asserted",...m?{agentMismatch:!0,loadedAgent:t.agent?.pack}:{}});let{nonce:h,release:E}=n.registerTurnRaw({userId:p,sessionKey:(d.sessionKey??"").trim()||p,inboundToken:d.inboundToken,egressStoreKey:d.egressStoreKey});return r.set(h,E),c.writeHead(200,{"Content-Type":"application/json"}),c.end(JSON.stringify({nonce:h}))}if(a.method==="DELETE"&&u.startsWith("/turns/")){let d=decodeURIComponent(u.slice(7));return r.get(d)?.(),r.delete(d),c.writeHead(204),c.end()}l(404,"not found")}catch(f){t.logger?.warn(`[Sidecar] control error: ${f instanceof Error?f.message:String(f)}`),c.headersSent||c.writeHead(500,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:"internal"}))}});await new Promise((a,c)=>{s.once("error",c),s.listen(t.controlPort,e,()=>a())});let i=s.address(),o=i&&typeof i!="string"?i.port:t.controlPort;return 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 ${Cn.ASSERTION_HEADER} header \u2014 if your edge does not forward it, every tool call will fail closed.`),{gatewayUrl:n.url,controlPort:o,close:async()=>{await new Promise(a=>s.close(()=>a())),await n.close()}}}});var ly=T(Us=>{"use strict";Object.defineProperty(Us,"__esModule",{value:!0});Us.RemoteDataPlane=Us.EdgeDataPlane=void 0;Us.resolveEdgeDataPlane=e$;Us.resolveRemoteDataPlane=t$;var jc=xo();function e$(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 Bd=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}adoptTurn(e){return{nonce:e,env:{[jc.TURN_NONCE_ENV]:e,[jc.DATA_MCP_URL_ENV]:this.cfg.gatewayUrl},release:async()=>{try{await fetch(new URL("/turn",this.cfg.gatewayUrl),{method:"DELETE",headers:{Authorization:`Bearer ${e}`}})}catch{}}}}};Us.EdgeDataPlane=Bd;function t$(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 Fd=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:{[jc.TURN_NONCE_ENV]:r,[jc.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}`}})}catch{}}}}};Us.RemoteDataPlane=Fd});var Hc=T(X=>{"use strict";var n$=X&&X.__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]})),r$=X&&X.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),s$=X&&X.__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"&&n$(n,e,r[s]);return r$(n,e),n}})();Object.defineProperty(X,"__esModule",{value:!0});X.DataPlane=X.resolveEdgeDataPlane=X.EdgeDataPlane=X.resolveRemoteDataPlane=X.RemoteDataPlane=X.ASSERTION_HEADER=X.startDataPlaneSidecar=X.EGRESS_URL_ENV=X.startEgressBroker=X.TURN_NONCE_HEADER=X.TURN_NONCE_ENV=X.DATA_MCP_URL_ENV=X.startDataGateway=X.TURN_META_KEY=X.ConnectorHost=X.identityProvider=X.passthroughProvider=X.resolveProvider=X.CredentialBroker=X.DEFAULT_TURN_DEADLINE_MS=X.hashNonce=X.TurnRegistry=void 0;X.resolveDataPlaneConfig=a$;var uy=s$(require("path")),i$=jo(),dy=Dd(),o$=Md(),Vd=xo(),Kd=jo();Object.defineProperty(X,"TurnRegistry",{enumerable:!0,get:function(){return Kd.TurnRegistry}});Object.defineProperty(X,"hashNonce",{enumerable:!0,get:function(){return Kd.hashNonce}});Object.defineProperty(X,"DEFAULT_TURN_DEADLINE_MS",{enumerable:!0,get:function(){return Kd.DEFAULT_TURN_DEADLINE_MS}});var xc=Dd();Object.defineProperty(X,"CredentialBroker",{enumerable:!0,get:function(){return xc.CredentialBroker}});Object.defineProperty(X,"resolveProvider",{enumerable:!0,get:function(){return xc.resolveProvider}});Object.defineProperty(X,"passthroughProvider",{enumerable:!0,get:function(){return xc.passthroughProvider}});Object.defineProperty(X,"identityProvider",{enumerable:!0,get:function(){return xc.identityProvider}});var fy=Md();Object.defineProperty(X,"ConnectorHost",{enumerable:!0,get:function(){return fy.ConnectorHost}});Object.defineProperty(X,"TURN_META_KEY",{enumerable:!0,get:function(){return fy.TURN_META_KEY}});var Bc=xo();Object.defineProperty(X,"startDataGateway",{enumerable:!0,get:function(){return Bc.startDataGateway}});Object.defineProperty(X,"DATA_MCP_URL_ENV",{enumerable:!0,get:function(){return Bc.DATA_MCP_URL_ENV}});Object.defineProperty(X,"TURN_NONCE_ENV",{enumerable:!0,get:function(){return Bc.TURN_NONCE_ENV}});Object.defineProperty(X,"TURN_NONCE_HEADER",{enumerable:!0,get:function(){return Bc.TURN_NONCE_HEADER}});var py=oy();Object.defineProperty(X,"startEgressBroker",{enumerable:!0,get:function(){return py.startEgressBroker}});Object.defineProperty(X,"EGRESS_URL_ENV",{enumerable:!0,get:function(){return py.EGRESS_URL_ENV}});var gy=cy();Object.defineProperty(X,"startDataPlaneSidecar",{enumerable:!0,get:function(){return gy.startDataPlaneSidecar}});Object.defineProperty(X,"ASSERTION_HEADER",{enumerable:!0,get:function(){return gy.ASSERTION_HEADER}});var Fc=ly();Object.defineProperty(X,"RemoteDataPlane",{enumerable:!0,get:function(){return Fc.RemoteDataPlane}});Object.defineProperty(X,"resolveRemoteDataPlane",{enumerable:!0,get:function(){return Fc.resolveRemoteDataPlane}});Object.defineProperty(X,"EdgeDataPlane",{enumerable:!0,get:function(){return Fc.EdgeDataPlane}});Object.defineProperty(X,"resolveEdgeDataPlane",{enumerable:!0,get:function(){return Fc.resolveEdgeDataPlane}});function a$(t,e){let n=t?.dataPlane,r=n?.connector?.trim();if(r)return{connectorPath:uy.isAbsolute(r)?r:uy.join(e,r),provider:n?.provider?.trim()||void 0}}var Wd=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 i$.TurnRegistry,s=new dy.CredentialBroker((0,dy.resolveProvider)(e.provider)),i=await o$.ConnectorHost.spawn({connectorPath:e.connectorPath,logger:n?.logger});try{let o=await(0,Vd.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){return this.registry.register(e)}registerTurn(e){let{nonce:n,release:r}=this.registry.register(e);return{nonce:n,env:{[Vd.TURN_NONCE_ENV]:n,[Vd.DATA_MCP_URL_ENV]:this.url},release:r}}async close(){await this.gateway.close(),await this.connector.close()}};X.DataPlane=Wd});var hy=T(Xn=>{"use strict";Object.defineProperty(Xn,"__esModule",{value:!0});Xn.PROTOCOL_VERSION=Xn.DEFAULT_GATEWAY_OPERATOR_SCOPES=Xn.GATEWAY_CLIENT_CAPS=Xn.GATEWAY_CLIENT_MODES=Xn.GATEWAY_CLIENT_IDS=void 0;Xn.GATEWAY_CLIENT_IDS={GATEWAY_CLIENT:"gateway-client"};Xn.GATEWAY_CLIENT_MODES={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",AGENT_BACKEND:"agent-backend",NODE:"node",PROBE:"probe",TEST:"test"};Xn.GATEWAY_CLIENT_CAPS={TOOL_EVENTS:"tool-events"};Xn.DEFAULT_GATEWAY_OPERATOR_SCOPES=["operator.admin","operator.read","operator.write","operator.approvals","operator.pairing"];Xn.PROTOCOL_VERSION=3});var Vc=T(zn=>{"use strict";Object.defineProperty(zn,"__esModule",{value:!0});zn.GatewayClient=zn.MAX_GATEWAY_MESSAGE_CHARS=zn.MAX_GATEWAY_FRAME_BYTES=void 0;zn.createAgentIDEGatewayClient=d$;zn.createEphemeralGatewayClient=f$;var c$=require("events"),Hs=hy();zn.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})();zn.MAX_GATEWAY_MESSAGE_CHARS=256*1024;function l$(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 u$(t){let e=typeof t?.code=="number"?t.code:void 0;return e!==void 0&&e!==1e3&&e!==1001}var Fo=class extends c$.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:Hs.PROTOCOL_VERSION,maxProtocol:Hs.PROTOCOL_VERSION,client:e,caps:[Hs.GATEWAY_CLIENT_CAPS.TOOL_EVENTS],role:"operator",scopes:[...Hs.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,u$(s)&&this.emit("error",new Error(l$(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>zn.MAX_GATEWAY_FRAME_BYTES){this.emit("error",new Error(`Gateway frame of ${n} bytes exceeds the ${zn.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}};zn.GatewayClient=Fo;function d$(t,e,n="1.0.0"){let r=new Fo({url:t,token:e,reconnectInterval:5e3,maxReconnectAttempts:10}),s={id:Hs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo IDE",version:n,platform:process.platform,mode:Hs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}function f$(t,e,n="1.0.0"){let r=new Fo({url:t,token:e}),s={id:Hs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo CLI",version:n,platform:process.platform,mode:Hs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}});var Xd=T($t=>{"use strict";var p$=$t&&$t.__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]})),g$=$t&&$t.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yd=$t&&$t.__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 g$(n,e),n}})();Object.defineProperty($t,"__esModule",{value:!0});$t.GATEWAY_OUTBOUND_RPC_METHOD=void 0;$t.stageLocalMediaIfNeeded=my;$t.buildGatewayOutboundSendArgs=Ey;$t.buildGatewaySendParams=Jd;$t.buildGatewayRpcCommand=qd;$t.sendGatewayOutboundMessage=P$;var h$=require("child_process"),m$=require("crypto"),Wi=Yd(require("fs")),E$=Yd(require("os")),vr=Yd(require("path")),y$=Er(),_$=Vc(),w$=18789;$t.GATEWAY_OUTBOUND_RPC_METHOD="send";function A$(t){return t?.trim()||process.env.AGENTHIPPO_GATEWAY_CLI?.trim()||"hippoclaw"}var S$=".openclaw",b$=[".clawdbot",".moldbot",".moltbot"];function T$(){let t=E$.homedir(),e=process.env.OPENCLAW_STATE_DIR?.trim()||process.env.CLAWDBOT_STATE_DIR?.trim();if(e)return e==="~"||e.startsWith("~/")||e.startsWith("~\\")?vr.join(t,e.slice(1)):vr.resolve(e);let n=vr.join(t,S$);if(Wi.existsSync(n))return n;for(let r of b$){let s=vr.join(t,r);if(Wi.existsSync(s))return s}return n}function v$(t){return/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||t.startsWith("data:")}function my(t){let e=t?.trim();if(!e||v$(e))return t;let n;try{n=Wi.realpathSync(e)}catch{return e}let r=vr.join(T$(),"media"),s=vr.resolve(r);try{s=Wi.realpathSync(r)}catch{}let i=vr.relative(s,n);if(i&&!i.startsWith("..")&&!vr.isAbsolute(i))return n;let o=vr.extname(n),a=vr.basename(n,o),c=(0,m$.createHash)("sha256").update(n).digest("hex").slice(0,8),l=vr.join(r,`${a}-${c}${o}`);return Wi.mkdirSync(r,{recursive:!0}),Wi.copyFileSync(n,l),l}function Ey(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 Jd(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 qd(t,e,n){return[$t.GATEWAY_OUTBOUND_RPC_METHOD,JSON.stringify(Jd(t,e,n))]}async function O$(t,e,n,r){let s=process.env.OPENCLAW_GATEWAY_URL?.trim()||`ws://127.0.0.1:${w$}`,i=r?.trim()||(0,y$.readOpenClawGatewayToken)(),{client:o,clientInfo:a}=(0,_$.createEphemeralGatewayClient)(s,i);await o.connect(a);try{let c=await o.request($t.GATEWAY_OUTBOUND_RPC_METHOD,Jd(t,e,n),6e4);return{stdout:JSON.stringify(c),stderr:""}}finally{o.close()}}function I$(t,e){let n=(0,h$.spawnSync)(t,e,{encoding:"utf-8",env:process.env});return{stdout:(n.stdout??"").trim(),stderr:(n.stderr??"").trim(),exitCode:n.status}}async function P$(t,e){let n=A$(e.cli);if(e.dryRun)return{ok:!0,via:"dry-run",command:qd(t,e.message,e.media),stdout:"",stderr:"",exitCode:0};let r=my(e.media),s=Ey(t,e.message,r),i=[n,...s],o=qd(t,e.message,r);try{let a=await O$(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=I$(n,s);if(l.exitCode===0)return{ok:!0,via:"hippoclaw",command:i,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode};let f=l.stderr||l.stdout||"unknown error";return{ok:!1,via:"gateway-rpc",command:o,stdout:l.stdout,stderr:`Gateway RPC failed: ${c}
|
|
524
524
|
HippoClaw CLI fallback failed (exit ${l.exitCode??"unknown"}): ${f}`.trim(),exitCode:l.exitCode}}}});var vy=T(He=>{"use strict";var N$=He&&He.__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]})),R$=He&&He.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yy=He&&He.__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"&&N$(n,e,r[s]);return R$(n,e),n}})();Object.defineProperty(He,"__esModule",{value:!0});He.isAwsCliAvailable=D$;He.resolveS3StateConfig=L$;He.resolveRestoreBootMode=M$;He.safeSessionId=Kc;He.sessionRemoteUri=zd;He.shardBelongsToSession=Qd;He.hasLocalSessionState=_y;He.listSessionShardFiles=wy;He.stageSessionPushDir=Ay;He.mergeSessionStagingIntoState=Sy;He.restoreState=H$;He.pushState=by;He.pushSessionState=Ty;He.ensureSessionLocal=j$;He.clearRestoreAttemptCache=x$;He.makeStatePusher=B$;He.providerSessionShardName=F$;var C$=require("crypto"),k$=require("child_process"),Ft=yy(require("fs/promises")),mn=yy(require("path")),$$=require("util"),Vo=(0,$$.promisify)(k$.execFile),Wc=new Set;async function D$(){try{return await Vo("aws",["--version"]),!0}catch{return!1}}function L$(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 M$(t=process.env){return t.AGENTHIPPO_STATE_RESTORE_BOOT?.trim().toLowerCase()==="none"?"none":"all"}function Kc(t){return t.trim().replace(/[<>:"/\\|?*\x00-\x1F]+/g,"_").replace(/\.\./g,"_").slice(0,160)||"session"}function zd(t,e){return`${t.uri}/sessions/${Kc(e)}`}function qc(t,e,n){let r=["s3","sync",e,n,"--no-progress"];return t.endpoint&&r.push("--endpoint-url",t.endpoint),r}function G$(t,e){return`${mn.resolve(t)}\0${e}`}function Qd(t,e,n){if(n?.chatSessionId&&n.chatSessionId===e)return!0;let r=t.split(":");return r.length>=2&&r[1]===e}async function _y(t,e){let n=mn.join(t,"provider-sessions"),r;try{r=await Ft.readdir(n)}catch{return!1}for(let s of r)if(s.endsWith(".json"))try{let i=await Ft.readFile(mn.join(n,s),"utf8"),o=JSON.parse(i);if(typeof o.key=="string"&&Qd(o.key,e,o.value))return!0}catch{}return!1}async function wy(t,e){let n=mn.join(t,"provider-sessions"),r;try{r=await Ft.readdir(n)}catch{return[]}let s=[];for(let i of r)if(i.endsWith(".json"))try{let o=await Ft.readFile(mn.join(n,i),"utf8"),a=JSON.parse(o);typeof a.key=="string"&&Qd(a.key,e,a.value)&&s.push(i)}catch{}return s}async function U$(t){try{return await Ft.access(t),!0}catch{return!1}}async function Ay(t,e,n){await Ft.rm(n,{recursive:!0,force:!0}),await Ft.mkdir(n,{recursive:!0});let r=await wy(t,e),s=mn.join(n,"provider-sessions");if(r.length>0){await Ft.mkdir(s,{recursive:!0});for(let i of r)await Ft.copyFile(mn.join(t,"provider-sessions",i),mn.join(s,i))}return r.length>0}async function Sy(t,e){let n=mn.join(t,"provider-sessions");if(await U$(n)){let r=mn.join(e,"provider-sessions");await Ft.mkdir(r,{recursive:!0});for(let s of await Ft.readdir(n))s.endsWith(".json")&&await Ft.copyFile(mn.join(n,s),mn.join(r,s))}}async function H$(t,e,n){try{await Vo("aws",qc(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 by(t,e,n){try{await Vo("aws",qc(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 Ty(t,e,n,r){let s=Kc(n),i=mn.join(e,".push-staging",s);try{if(!await Ay(e,n,i)){r?.(`State push skipped for session ${s}: nothing local`);return}let a=zd(t,n);await Vo("aws",qc(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 Ft.rm(i,{recursive:!0,force:!0}).catch(()=>{})}}async function j$(t,e,n,r){let s=G$(e,n);if(Wc.has(s))return;if(await _y(e,n)){Wc.add(s);return}let i=Kc(n),o=mn.join(e,".restore-staging",i);try{await Ft.rm(o,{recursive:!0,force:!0}),await Ft.mkdir(o,{recursive:!0});let a=zd(t,n);await Vo("aws",qc(t,a,o)),await Sy(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{Wc.add(s),await Ft.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}function x$(){Wc.clear()}function B$(t,e,n,r=1e3){let s=null,i=!1,o=null,a=new Set,c=!1,l=()=>{i=!0;let d=[...a],p=c;return a.clear(),c=!1,o=(async()=>{p&&await by(t,e,n);for(let g of d)await Ty(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: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 F$(t){return`${(0,C$.createHash)("sha256").update(t).digest("hex").slice(0,40)}.json`}});var Oy=T(Vr=>{"use strict";Object.defineProperty(Vr,"__esModule",{value:!0});Vr.CLI_GATEWAY_AGENT_PREFIX=void 0;Vr.resolveCliGatewayAgentId=K$;Vr.isCliGatewayAgentId=q$;var V$=jn();Vr.CLI_GATEWAY_AGENT_PREFIX="agenthippo-cli";function W$(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,32)||"unnamed"}function K$(t){let e=(t??"").trim().toLowerCase();return!e||e===V$.AGENT_CONSTANTS.DEFAULT_AGENT_ID?Vr.CLI_GATEWAY_AGENT_PREFIX:`${Vr.CLI_GATEWAY_AGENT_PREFIX}-${W$(e)}`}function q$(t){let e=(t??"").trim().toLowerCase();return e===Vr.CLI_GATEWAY_AGENT_PREFIX||e.startsWith(`${Vr.CLI_GATEWAY_AGENT_PREFIX}-`)}});var tf=T(ms=>{"use strict";Object.defineProperty(ms,"__esModule",{value:!0});ms.fetchMeetAgentChannelContext=Iy;ms.mapChannelsStatusToMeetAgentRows=ef;ms.parseChannelBindSpecs=z$;ms.applyAgentChannelBindingsViaConfigPatch=nD;ms.fetchMeetAgentChannelRows=rD;ms.waitForChannelsLive=iD;ms.resolvePublishedGatewayChannelIds=oD;var Zd={probe:!1,timeoutMs:1e4};async function Iy(t){let e=await t("channels.status",Zd);return{rows:ef(e),statusPayload:e}}function js(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function ef(t){let e=js(t);if(!e)return[];let n=Array.isArray(e.channelOrder)?e.channelOrder:null,r=js(e.channelLabels)??{},s=js(e.channels)??{},i=js(e.channelAccounts)??{},o=js(e.channelDefaultAccountId)??{},a=n&&n.length>0?n:[...Object.keys(s)].sort((l,f)=>l.localeCompare(f)),c=[];for(let l of a){let f=typeof r[l]=="string"?r[l]:l,u=i[l],d=Array.isArray(u)?u:[],p=d.length>0?d.map(w=>typeof w.accountId=="string"?w.accountId:"default"):[typeof o[l]=="string"?o[l]:"default"],g=js(s[l]),m=g&&typeof g.connected=="boolean"?g.connected:g?.running===!0,h=d.some(w=>typeof w.connected=="boolean"&&w.connected||w.running===!0),E=m||h,y=g?.configured===!0||d.some(w=>w.configured===!0&&w.enabled!==!1)||E;c.push({id:l,label:f,connected:E,enabled:y,accounts:p})}return c}function Y$(t){let e=js(t);if(!e)return{};let n=js(e.channelDefaultAccountId)??{},r={};for(let[s,i]of Object.entries(n))typeof i=="string"&&i.trim()&&(r[s]=i.trim());return r}function J$(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 X$(t){return typeof t!="string"||!t.trim()?"default":t.trim().toLowerCase()}function z$(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 Q$(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 Z$(t){let e=Q$(t);return!!(e&&e.includes(":"))}function eD(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=X$(i.accountId);return o===e.trim().toLowerCase()&&a===n.trim().toLowerCase()}function tD(t){let e=t.agentId.trim().toLowerCase(),n=i=>t.channelAccountOverrides?.[i]??t.channelDefaultAccountId[i]??"default",r=t.existingBindings.filter(i=>{if(Z$(i)||J$(i,e))return!1;for(let o of t.selectedChannelIds){let a=n(o);if(eD(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 nD(t,e){let n=e.statusPayload??await t("channels.status",Zd),r=Y$(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=tD({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 rD(t){let{rows:e}=await Iy(t);return e}var sD=t=>new Promise(e=>setTimeout(e,t));async function iD(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??sD,a=n.now??Date.now,c=a(),l=0,f=[],u=[...r];for(;;){l++;let d;try{let g=await t("channels.status",Zd);d=ef(g)}catch{d=[]}let p=new Set(d.filter(g=>g.connected).map(g=>g.id.trim().toLowerCase()));if(f=r.filter(g=>p.has(g)),u=r.filter(g=>!p.has(g)),u.length===0)return{ready:!0,live:f,pending:u,polls:l,timedOut:!1};if(a()-c>=s)return{ready:!1,live:f,pending:u,polls:l,timedOut:!0};await o(i)}}function oD(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 Dy=T(Vt=>{"use strict";var Ny=Vt&&Vt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Vt,"__esModule",{value:!0});Vt.GatewayBridge=Vt.MAX_GATEWAY_ID_CHARS=void 0;Vt.isIdeThreadCompositeRouteKey=Ry;Vt.parseIdeThreadIdFromCompositeRouteKey=uD;Vt.findOversizedRunField=Cy;Vt.buildIdeSessionRouteKey=ky;Vt.extractRouteLabelFromGatewaySessionKey=$y;Vt.looksLikeGatewayChannelRouteKey=fD;Vt.createGatewayBridge=pD;var aD=require("events"),nf=Vc(),cD=Ny(require("node:os")),rf=Ny(require("node:path")),lD=Uc(),Py=Ja(),Ki="::sid:";function Ry(t){return!!t?.includes(Ki)}function uD(t){if(!t||!Ry(t))return;let e=t.lastIndexOf(Ki),n=t.slice(e+Ki.length).trim();return n.length>0?n:void 0}Vt.MAX_GATEWAY_ID_CHARS=512;var dD=["agentId","sessionKey","sessionId","channel","accountId","target","threadId","groupId","senderUsername","senderName","senderId"];function Cy(t){let e=t;for(let n of dD){let r=e[n];if(r!=null&&(typeof r!="string"||r.length>Vt.MAX_GATEWAY_ID_CHARS))return n}}function ky(t,e){let n=t?.trim(),r=e?.trim();return n&&r?`${n}${Ki}${r}`:n||r}function $y(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 fD(t){let e=t&&t.includes(Ki)?t.slice(0,t.lastIndexOf(Ki)):t,r=(e?$y(e)??e:void 0)?.split(":").filter(Boolean)??[];return r.length<2?!1:["channel","chat","dm","group","thread","user"].includes(r[1].trim().toLowerCase())}var Yc=class extends aD.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,nf.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=rf.default.join(cD.default.homedir(),".openclaw");return e==="main"?rf.default.join(n,"workspace"):rf.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,Py.resolveGatewaySessionDirId)({gatewaySessionKey:a});if(!c)return;let l=(0,Py.getGatewayOutboundFilePath)(o,c),f=e.agentId?.trim()||n;(0,lD.upsertGatewayOutboundHandle)(l,f,r,s,{gatewayAgentId:n}).then(u=>{u&&this.log(`Gateway outbound routes: ${l}`)}).catch(u=>{this.log(`Failed to persist outbound handle: ${u instanceof Error?u.message:String(u)}`)})}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>nf.MAX_GATEWAY_MESSAGE_CHARS){this.client.respond(e.id,void 0,!1,{code:"MESSAGE_TOO_LARGE",message:`message exceeds ${nf.MAX_GATEWAY_MESSAGE_CHARS} characters`});return}let r=Cy(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=ky(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 f=this.client,u="",d="",p=0,g=!1,m=150,h=o,E=()=>{u!==d&&(d=u,p=Date.now(),f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"delta",text:u}))},y={async thinking(){g||(E(),g=!0,f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"thinking"}))},async text(b){g=!1,u+=b,Date.now()-p>=m&&E()},async toolStart(b){E(),f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:b,toolState:"start"})},async toolEnd(b){f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:b,toolState:"end"})},async progress(b){f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:b})},async question(b){return f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:`Question: ${b.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(b){u+=`
|
|
525
525
|
[Error: ${b}]`,f.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"error",message:b})},async done(){}},w=await i.messageHandler(n.message,{engineId:l,sessionId:o,gatewaySessionKey:n.sessionKey,workspaceRoot:i.workspace,emitter:y,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=${u?.length||0}`),u||this.log(`WARNING: Agent ${s} produced empty response!`),E();let P={text:u,runId:n.idempotencyKey};this.client.respond(e.id,P,!0),this.log(`Agent ${s} completed successfully, response length=${u.length}`),this.emit("agent.response",{agentId:s,message:n.message,response:u})}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,f={async thinking(){l||(l=!0,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"thinking"}))},async text(u){l=!1,c+=u,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"delta",text:c})},async toolStart(u){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"tool",toolName:u,toolState:"start"})},async toolEnd(u){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"tool",toolName:u,toolState:"end"})},async progress(u){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"progress",message:u})},async question(u){return a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"progress",message:`Question: ${u.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(u){c+=`
|
|
526
|
-
[Error: ${u}]`,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"error",message:u})},async done(){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"done"})}};try{let u=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,u,f,{params:r,runId:s,agentId:o}),p=c||d;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(u){this.client.respond(e.id,void 0,!1,{code:"CHAT_UI_ERROR",message:u instanceof Error?u.message:String(u)}),this.log(`Agent ${o} (Chat UI) failed: ${u}`)}}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)}};Vt.GatewayBridge=Yc;function pD(t){return new Yc(t)}});var Yy=T(Zn=>{"use strict";var gD=Zn&&Zn.__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]})),hD=Zn&&Zn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yo=Zn&&Zn.__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"&&gD(n,e,r[s]);return hD(n,e),n}})();Object.defineProperty(Zn,"__esModule",{value:!0});Zn.serveCommand=vD;Zn.resolveGatewaySessionKey=Vy;Zn.runGatewayTurn=Wy;Zn.runBridgeTurn=Ky;var Ly=Yo(require("crypto")),En=Yo(require("fs")),My=Yo(require("os")),mD=Yo(require("http")),Or=Yo(require("path")),Gy=require("node:crypto"),ED=km(),Wo=li(),kn=No(),sf=cd(),yD=fd(),hi=ko(),_D=Co(),Uy=Nc(),Hy=dE(),Jc=yE(),jy=TE(),Wr=wd(),Qn=ai(),mi=ci(),L=qn(),wD=bd(),of=BE(),he=Fr(),zc=Ns(),Xc=ko(),AD=Ri(),ht=Hc(),xy=Er(),SD=Xd(),By=bo(),Ko=Qs(),xs=vy(),bD=Oy(),af=tf(),TD=Cs(),qo="-".repeat(62);async function vD(t){let e=(0,mi.getApiConfig)();e.useLiteLLM&&!e.litellmApiKey&&console.warn(`${L.COLORS.yellow}Warning:${L.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 Qn.ConsoleLogger("[Sync]"):new Qn.NoOpLogger;try{n=await(0,mi.loadAgentPack)(t.agent,t.workspace)}catch(_){console.error(`Error: ${_ instanceof Error?_.message:_}`),process.exit(1)}let s=n.manifest.metadata.name,i=(0,bD.resolveCliGatewayAgentId)(s),o=(t.engine||n.manifest.spec.engine||(0,mi.getDefaultConfig)().engine).trim().toLowerCase(),a=["claude","codex"].includes(o)?void 0:(0,TD.tryResolveCustomEngineManifest)(t.workspace,o)?.model?.defaultModel,c=t.model||n.manifest.spec.model||a||(0,mi.getEnvDefaultModel)()||(0,mi.getDefaultConfig)().model,l=(0,Qn.resolveModelAlias)(c),f=n.manifest.spec.cheapModel?.trim(),u=f?(0,Qn.resolveModelAlias)(f):void 0;if(!(0,mi.hasCredentialForEngine)(o,e)){console.error(`Error: No usable API key for engine "${o}". Set ${o==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}, or configure the LiteLLM proxy (AGENTHIPPO_LITELLM_API_KEY + AGENTHIPPO_LITELLM_BASE_URL).`);for(let k of(0,L.getLiteLLMQuickstartHintLines)())console.error(k);process.exit(1)}let d=t.verbose?new Qn.ConsoleLogger("[Server]"):new Qn.NoOpLogger,p=n.packPath,g=n.manifest.metadata.version??"0.0.0",m,h=await(0,kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL}),E=(_,k="pack")=>{for(let se of _.warnings)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${se}`);_.status==="unavailable"&&console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${k} trust root is configured but unusable: ${_.reason}`)};E(h);let y=(0,kn.createPackVerifier)(),w={ok:!1,kind:"no-pack",reason:"not verified"},P=(_,k)=>(w=y.refresh({packDir:_,pack:s,packVersion:k,keys:h.keys}),m=w.ok?w.claims.digest:void 0,d.info(w.ok?`[Pack] signature verified for ${s}`:`[Pack] unverified \u2014 ${w.reason}`),w),b=_=>{if(_.ok)return"";let k=h.status==="unavailable"&&_.kind==="no-trust-root"?"trust-root-unavailable":_.kind;return(0,kn.describePackRefusal)({kind:k,detail:k==="trust-root-unavailable"?h.reason??_.reason:_.reason,pack:s,packVersion:g,packDir:p,trustRootHint:h.url?`Trust root: ${h.url} (${h.reason??"unavailable"})`:h.reason})};P(p,g);let v=!!t.allowUnsignedPack||(0,kn.allowUnsignedPackFromEnv)();w.ok||(v||(console.error(`${L.COLORS.red}Error: ${b(w)}${L.COLORS.reset}`),process.exit(1)),console.warn(qo),console.warn(`${L.COLORS.yellow}!! RUNNING AN UNVERIFIED PACK \u2014 signature checking is DISABLED on this instance.${L.COLORS.reset}`),console.warn(`${L.COLORS.yellow}!! ${w.reason}${L.COLORS.reset}`),console.warn(`${L.COLORS.yellow}!! Whatever is in ${p} will be executed, verified by nobody.${L.COLORS.reset}`),console.warn(`${L.COLORS.yellow}!! This is a LOCAL DEVELOPMENT setting (AGENTHIPPO_ALLOW_UNSIGNED_PACK). Do not ship it.${L.COLORS.reset}`),console.warn(qo));let A=(0,L.findBundledBasePromptsDir)();await(0,Qn.syncPackToWorkspace)(t.workspace,n.packPath,s,o,r,A),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=${o}`);let{dir:S,ephemeral:I}=(0,he.resolveStateDir)(t.stateDir),U=(0,he.resolveBindHost)(t.host);for(let _ of(0,he.identityHeaderAdvice)(process.env,U))console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`);let O=(0,he.tenantIsolationAdvice)({sandbox:t.sandbox,sharedWorkspace:!!t.sharedWorkspace,workspace:t.workspace,stateDir:S});if(O.level==="refuse"){for(let _ of O.lines)console.error(`${L.COLORS.red}Error:${L.COLORS.reset} ${_}`);console.error(`Refusing to start because ${he.REQUIRE_TENANT_ISOLATION_ENV} is set. Unset it to downgrade this to a warning.`),process.exit(1)}for(let _ of O.lines)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`);let F=(0,he.resolveAnalyticsSessionsDir)(S,I),re=new By.SessionEventWriter(F),W=_=>k=>re.append(_,(0,Ko.generateRequestId)(),"warrant_denied",{reason:k}),pe=(0,ht.resolveDataPlaneConfig)(n.manifest.spec,n.packPath),me=(0,ht.resolveEdgeDataPlane)(),z=me?new ht.EdgeDataPlane(me):null,Pe=z?null:(0,ht.resolveRemoteDataPlane)(),Ke=Pe?new ht.RemoteDataPlane(Pe):null,Me=pe&&!Ke&&!z||t.gatewayBridge?new ht.TurnRegistry:null,on=(_,k,se)=>re.append(_,(0,Ko.generateRequestId)(),k,{...se,agent:{pack:s,version:g,digest:m??null}}),_e=null;if(z)process.env[ht.DATA_MCP_URL_ENV]=z.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 ${z.url}; turn nonces are minted at the edge, serve holds no registration credential`);else if(Ke)process.env[ht.DATA_MCP_URL_ENV]=Ke.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,console.log(`OK: Data plane SIDECAR \u2014 gateway ${Ke.url}; base credentials stay in the connector container, not here`);else if(pe)try{_e=await ht.DataPlane.start(pe,{logger:t.verbose?new Qn.ConsoleLogger("[DataPlane]"):new Qn.NoOpLogger,audit:on,registry:Me??void 0}),process.env[ht.DATA_MCP_URL_ENV]=_e.url,console.log(`OK: Data gateway (provider=${_e.broker.provider.name}) on loopback \u2014 connector: ${pe.connectorPath}`)}catch(_){console.error(`${L.COLORS.red}Error: failed to start the data-plane gateway:${L.COLORS.reset} ${_ instanceof Error?_.message:_}`),process.exit(1)}let lr=(0,xy.readOpenClawGatewayToken)();delete process.env.OPENCLAW_GATEWAY_TOKEN;let ut=null,Wt=async _=>{if(z){let X=_.edgeNonce?.trim();if(!X)return console.warn(`${L.COLORS.yellow}Warning:${L.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 De=z.adoptTurn(X),wt={...De.env};return ut&&(wt[ht.EGRESS_URL_ENV]=ut.url),{nonce:De.nonce,env:wt,release:De.release}}if(Ke){let X=await Ke.registerTurn({..._,agent:{pack:s,version:g,digest:m}}),De={...X.env};return ut&&(De[ht.EGRESS_URL_ENV]=ut.url),{nonce:X.nonce,env:De,release:X.release}}if(!Me)return null;let{nonce:k,release:se}=Me.register(_),nt={[ht.TURN_NONCE_ENV]:k};return _e&&(nt[ht.DATA_MCP_URL_ENV]=_e.url),ut&&(nt[ht.EGRESS_URL_ENV]=ut.url),{nonce:k,env:nt,release:se}},_n=_=>{if(!z)return;let k=_[ht.TURN_NONCE_HEADER];return Array.isArray(k)?k[0]:k},Gn=new he.TurnLimiter(t.maxTurnsPerSession??0),Et=Number(process.env.AGENTHIPPO_SERVE_RATE_LIMIT??120),It=new he.RateLimiter(Number.isFinite(Et)?Et:120),Pt=(0,he.createTurnGateFromEnv)(),Ts=(0,he.createRejectionWarner)(),K;if(t.wwwDir?.trim()){let _=Or.join(Or.resolve(t.wwwDir.trim()),"index.html");try{K=En.readFileSync(_,"utf8")}catch{console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} --www-dir set but unreadable: ${_}`)}}I&&console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} Session state is in a tmpdir (ephemeral). Pass --state-dir or set AGENTHIPPO_HOME to persist sessions across restarts.`);let Gt=(0,xs.resolveS3StateConfig)(),N=(0,xs.resolveRestoreBootMode)();Gt&&(await(0,xs.isAwsCliAvailable)()||(console.error(`${L.COLORS.red}Error: AGENTHIPPO_STATE_S3_URI is set but the \`aws\` CLI was not found.${L.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)),N==="all"?(console.log(`State sync: boot-restore from ${Gt.uri} \u2026`),await(0,xs.restoreState)(Gt,S,_=>console.log(` ${_}`))):console.log(`State sync: restore-on-miss from ${Gt.uri} (boot restore disabled)`));let Z=Gt?(0,xs.makeStatePusher)(Gt,S,t.verbose?_=>console.error(_):void 0):null,x=t.verbose?_=>console.error(_):void 0,ge=async _=>{Gt&&await(0,xs.ensureSessionLocal)(Gt,S,_,x)},dt=(0,L.findClaudeCodePath)(),oe=(0,L.findCodexPath)(),yt=t.sandbox==="container";if(!yt&&o==="claude"&&!dt){console.error(`${L.COLORS.red}Error: Claude Code CLI not found.${L.COLORS.reset}`);let _=(0,Wo.getUnsupportedClaudePlatformHint)();_&&console.error(` ${_}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),process.exit(1)}!yt&&o==="codex"&&!oe&&(console.error(`${L.COLORS.red}Error: Codex CLI not found.${L.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),process.exit(1));let Kt=new Qn.AutoApprovePermissionHandler,qt={fileAccess:(0,mi.getFileAccess)(n)},Yt,ss=!1,vi=_=>{let k=(0,hi.policyVersion)(_);ss&&k===Yt||(ss=!0,Yt=k,re.append("serve",(0,Ko.generateRequestId)(),"policy_applied",{instance_id:kr,policy_version:k??null,pack_digest:m??null,engine_version:(0,Wo.installedEngineVersion)(o)??null,tier:t.sandbox==="container"?2:t.sandbox?0:null,enabled:_?.enabled??null,pinned_version:_?.version??null,caps:_?.caps??null,deny_count:_?.deny?.length??0}))},oo,ur=Or.join(S,"packs"),ca=async(_,k)=>(await(0,yD.downloadFromStore)({type:"pack",slug:_,version:k})).map(nt=>({path:nt.path,content:nt.content})),ao=async _=>{if(!t.pullPacks||!_||_===g)return;let k=await(0,sf.reconcilePinnedPack)({pack:s,currentVersion:g,pinnedVersion:_,packsRoot:ur,download:ca,publicKeysByKid:h.keys,logger:{info:se=>d.info(se),warn:se=>d.info(se)}});if(k.ok){g=k.version,p=k.packDir,P(p,g),d.info(`[Pack] now serving ${s}@${g} from ${k.packDir}`);return}console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} cannot converge to ${s}@${_}: ${k.reason}. Still serving @${g}.`)},la=(0,Wr.loadWarrantKeypair)(d),co,kr=(()=>{try{let _=Or.join((0,he.resolveStateDir)(t.stateDir).dir,"instance-id");if(En.existsSync(_))return En.readFileSync(_,"utf-8").trim();let k=`${My.hostname()}-${Ly.randomBytes(4).toString("hex")}`;return En.mkdirSync(Or.dirname(_),{recursive:!0}),En.writeFileSync(_,k),k}catch{return`${My.hostname()}-${Ly.randomBytes(4).toString("hex")}`}})(),lo={get:()=>n?.manifest.metadata.version},is=(0,hi.resolveLeasePollSeconds)(t.leasePollSeconds),Un=await(0,kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});Un.explicitlyConfigured&&E(Un,"lease");let Ks=(0,kn.checkTrustRootSeparation)(Un,h);for(let _ of Ks.warnings)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} [TrustRoot] ${_}`);Ks.fatal&&(console.error(`Error: [TrustRoot] ${Ks.fatal}`),process.exit(1));let vs=!1,Oi=()=>{let _=(0,kn.selectLeaseSigningKeys)(Un,h);return _.packFallback&&!vs&&(vs=!0,console.warn(`${L.COLORS.yellow}Warning:${L.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).`+(Un.reason?` The derived lease trust root is unusable: ${Un.reason}`:""))),_.keys},ua=(()=>{if(t.staticLeaseFile)try{let _=(0,_D.parseLease)(JSON.parse(En.readFileSync(t.staticLeaseFile,"utf-8")));if(!_.ok)throw new Error(_.reason);for(let k of _.warnings)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} [Lease] --static-lease: ${k}`);return _.lease}catch(_){console.error(`Error: --static-lease ${t.staticLeaseFile} is not a usable lease: ${_ instanceof Error?_.message:_}`),process.exit(1)}})(),Os=Or.join(S,"lease.json"),Q={load:()=>{if(!En.existsSync(Os))return;let _=JSON.parse(En.readFileSync(Os,"utf-8"));if(_&&typeof _=="object"&&typeof _.body=="string"&&typeof _.lastGoodAt=="number")return _},save:_=>{En.mkdirSync(Or.dirname(Os),{recursive:!0});let k=`${Os}.tmp`;En.writeFileSync(k,JSON.stringify(_)),En.renameSync(k,Os)}},M=(0,hi.createLeaseSource)({url:process.env.AGENTHIPPO_LEASE_URL,staticLease:ua,persistence:Q,identity:()=>({instance:kr,pack:s,version:lo.get(),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,sandboxes:co?.sandboxes().length,engine:o,engineversion:(0,Wo.installedEngineVersion)(o),...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,hi.leaseCacheSecondsFor)(is),signingKeys:()=>Oi(),requireSignedLease:t.requireSignedLease,instanceId:kr,...t.leaseMaxStalenessSeconds!==void 0?{maxStalenessSeconds:t.leaseMaxStalenessSeconds}:{},logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}),ve=async()=>{if(h.status!=="configured"){let _=await(0,kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});_.status==="configured"&&(h=_,E(_),d.info(`[Pack] signing keys now available (${Object.keys(_.keys).length}); re-verifying`),P(p,g))}if(Un.status!=="configured"){let _=await(0,kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});_.status==="configured"&&(Un=_,_.explicitlyConfigured&&E(_,"lease"),d.info(`[Lease] lease-signing keys now available (${Object.keys(_.keys).length})`))}};M.get().then(vi).catch(()=>{});{let _=is*1e3;setInterval(()=>{M.get().then(vi).catch(()=>{}),ve().catch(()=>{})},_).unref?.()}if(t.pullPacks){En.mkdirSync(ur,{recursive:!0});let _=Or.join(ur,g);En.existsSync(_)||En.cpSync(n.packPath,_,{recursive:!0}),(0,sf.promoteCurrent)(ur,_),p=Or.join(ur,sf.CURRENT_LINK),await ao((await M.get())?.version),P(p,g)}if(lo.get=()=>g,oo=(0,wD.createPackRunner)({storagePath:S,analyticsSessionsDir:F,packId:s,packVersion:g,provenance:()=>({policyVersion:Yt,packDigest:m,engineVersion:(0,Wo.installedEngineVersion)(o),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:kr}),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:Kt,claudeCheapModel:u,omitGatewayToken:!0}),t.pullPacks){let _=is*1e3;setInterval(()=>{M.get().then(se=>ao(se?.version)).catch(()=>{})},_).unref?.()}let Ne=!!t.sharedWorkspace,je=t.sandboxScope==="user"?"user":"session",ue=t.sandbox==="container"?{readonly:[`${p}:${Jc.SANDBOX_PACK_DIR}`],writable:[`${t.workspace}:${Jc.SANDBOX_WORKSPACE_DIR}`]}:void 0;ue&&Ne&&console.warn(`${L.COLORS.yellow}Warning:${L.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 xe;ue&&t.sandboxImage&&(await(0,Wr.alignSandboxWorkspaceOwnership)({exec:Wr.dockerExec,image:t.sandboxImage,writable:ue.writable,logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}),xe=await(0,Wr.resolveSandboxImageUser)(Wr.dockerExec,t.sandboxImage));let Ut=_=>(0,Wr.ensureSandboxStateDir)(Or.join(S,"sandbox-state",(0,xs.safeSessionId)(_)),xe),_t=async _=>{if(!ue)return{readonly:[],writable:[]};if(Ne)return ue;let k=(0,Wr.ensureSandboxStateDir)(Or.join(S,"sandbox-workspace",(0,xs.safeSessionId)(_)),xe);return{readonly:ue.readonly,writable:[`${k}:${Jc.SANDBOX_WORKSPACE_DIR}`]}},tt=(_,k,se)=>{if((0,kn.resolveRequireSignedPack)({lease:_?.requireSignedPack,localRequire:t.requireSignedPack,localAllowUnsigned:v})){let X=y.verify({packDir:p,pack:s,packVersion:g,keys:h.keys});if(X!==w&&(w=X,m=X.ok?X.claims.digest:void 0),!X.ok)throw new hi.LeaseDeniedError(b(X))}(0,hi.assertAdmitted)(_,{pack:s,version:g,image:t.sandboxImage,sessionKey:k,userHash:he.userNamespaceHash,userId:se})},de=t.sandbox?(0,ED.createSandboxRunner)({driver:t.sandbox==="container"?new Jc.ContainerSandboxDriver({exec:Wr.dockerExec,socketOwner:xe,logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}):new jy.ProcessSandboxDriver({command:process.execPath,args:[...(0,Wr.sandboxScriptArg)(),"sandbox","--agent",p,"--stdio","--state-dir",S,"--workspace",t.workspace],namespaceIsolation:(0,jy.namespaceIsolationFromEnv)(),logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}),image:t.sandboxImage??"",tier:t.sandbox==="container"?2:0,...ue?{fs:ue,fsFor:_t,stateDirFor:Ut}:{},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},provenanceEnv:()=>(0,xy.buildProvenanceEnv)({policyVersion:Yt,packDigest:m,engineVersion:(0,Wo.installedEngineVersion)(o),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:kr}),admit:async({sessionKey:_})=>{let k=await M.get();tt(k,_)},inferenceBaseUrl:e.baseUrl,mintModelToken:(_,k)=>(0,Wr.mintSandboxInferenceWarrant)(la,{user:(0,zc.currentCredential)()?.userId?.trim()||`anon:${k}`,pack:s,packVersion:g,sandboxId:_,tier:t.sandbox==="container"?2:0,ttlSeconds:300}),logger:d,runtime:{logger:d,editTracker:void 0,configProvider:void 0,permissionHandler:Kt}}):void 0;co=de??void 0;let ke=_=>typeof _=="number"&&Number.isFinite(_)&&_>0?_:void 0,Jt={...(0,Uy.capsFromEnv)(),...ke(t.maxTurnsPerSession)!==void 0?{maxTurnsPerSession:t.maxTurnsPerSession}:{},...ke(t.maxSessionSeconds)!==void 0?{maxSessionSeconds:t.maxSessionSeconds}:{},...ke(t.maxConcurrentSandboxes)!==void 0?{maxConcurrentSandboxes:t.maxConcurrentSandboxes}:{},...t.capOnBreach?{onBreach:t.capOnBreach}:{}},Ii=Jt.maxTurnsPerSession!==void 0||Jt.maxSessionSeconds!==void 0||Jt.maxConcurrentSandboxes!==void 0,Is={sandboxes:()=>[],destroySession:async()=>{},revokeRoute:async()=>{},supportsInFlightTermination:!1},Xt=!!(de||process.env.AGENTHIPPO_LEASE_URL||Ii)?(0,Hy.createGovernor)({caps:(0,Uy.mergeCaps)((await M.get())?.caps,Jt),sandboxes:de??Is,getLease:()=>M.get(),pollSeconds:is,pack:s,userHash:he.userNamespaceHash,...de?{}:{admitPack:(_,k)=>{try{return tt(k,_),{allowed:!0}}catch(se){return{allowed:!1,reason:se instanceof Error?se.message:String(se)}}}},logger:d,audit:(_,k)=>on(String(k.sessionKey??"instance"),_,k)}):void 0;Ii&&!de&&console.warn(`${L.COLORS.yellow}Warning:${L.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.`);let wn=de??oo,an=Xt?(0,Hy.withGovernor)(wn,Xt):wn;if(Xt){Xt.start();let _=Xt.policy(),k=(0,hi.effectiveKillLatencySeconds)(is);d.info(`[Serve] control plane: caps turns=${_.maxTurnsPerSession??"\u221E"} session=${_.maxSessionSeconds??"\u221E"}s sandboxes=${_.maxConcurrentSandboxes??"\u221E"} onBreach=${_.onBreach??"revoke-inference"}; lease poll ${is}s (worst-case kill latency ${k}s; an admin refresh is immediate)`),de||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 se=M.status();process.env.AGENTHIPPO_LEASE_URL&&!se.requireSignedLease&&d.info("[Serve] lease signature is NOT required \u2014 set --require-signed-lease (or lease.requireSignedLease) once the control plane signs leases.")}let An=(0,he.resolveServiceIdentity)();An.error&&(console.error(`${L.COLORS.red}Error:${L.COLORS.reset} ${An.error}`),process.exit(1)),An.warning&&console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${An.warning}`);let kl=!!process.env.AGENTHIPPO_LEASE_URL,fA=async()=>{if(!An.identity)return;let _=(0,Xc.resolveAllowServiceTurns)({lease:(await M.get())?.allowServiceTurns,managed:kl});if(!_.allowed){on("service-turn","service_turn_denied",{identity:(0,AD.hashIdentity)(An.identity),gate:_.gate,detail:(0,Xc.describeServiceTurnGate)(_.gate)});return}return An.identity};if(An.identity){let _=(0,Xc.resolveAllowServiceTurns)({lease:void 0,managed:kl});d.info(`[Serve] unattended runs: identity configured (${he.SERVICE_USER_ENV}); `+(kl?"the control plane decides per turn via lease.allowServiceTurns \u2014 absent means deny":(0,Xc.describeServiceTurnGate)(_.gate)))}de&&(d.info(`[Serve] sandbox mode: ${t.sandbox} (tier ${t.sandbox==="container"?2:0}) \u2014 engines run in per-session sandboxes`),e.baseUrl||console.warn(`${L.COLORS.yellow}Warning:${L.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 da=null,fa=!1,uo,Dp=mD.createServer(async(_,k)=>{let se=(0,he.corsHeaders)();for(let[nt,X]of Object.entries(se))k.setHeader(nt,X);if(_.method==="OPTIONS"){k.writeHead(204),k.end();return}try{if(_.method==="GET"&&_.url==="/health"){let X={status:"ok"};X.evidence_ship_enabled=!!uo;let De=uo?.lastOkAt();De!==void 0&&(X.evidence_ship_last_ok_at=new Date(De).toISOString());let wt=(0,of.getEvidenceShipStatus)();X.evidence_ship_disabled_reason=wt.disabledReason??null,X.evidence_ship_consecutive_failures=wt.consecutiveFailures,X.evidence_records_staged=wt.recordsStaged,X.evidence_records_shipped=wt.recordsShipped,X.evidence_records_skipped_too_old=wt.recordsSkippedTooOld,X.evidence_files_skipped_too_old=wt.filesSkippedTooOld,X.evidence_content_capture=wt.contentCapture,wt.lastHeartbeatAt!==void 0&&(X.evidence_ship_last_heartbeat_at=new Date(wt.lastHeartbeatAt).toISOString());let Hn=(0,By.getSessionEventWriterStats)();X.evidence_writes_ok=Hn.written,X.evidence_writes_failed=Hn.failed,Hn.lastError&&(X.evidence_write_last_error={at:new Date(Hn.lastError.at).toISOString(),event_type:Hn.lastError.eventType,message:Hn.lastError.message});let At=M.status();X.lease_configured=!!process.env.AGENTHIPPO_LEASE_URL,X.lease_signed=At.signed,X.lease_signature_required=At.requireSignedLease,X.lease_staleness_seconds=At.stalenessSeconds??null,X.lease_fail_closed=At.failClosed,X.pack_signature_ok=w.ok,X.pack_signature_required=(0,kn.resolveRequireSignedPack)({localRequire:t.requireSignedPack,localAllowUnsigned:v}),X.pack_trust_root=h.status,X.lease_trust_root=Un.status,X.lease_trust_root_source=Un.explicitlyConfigured?"lease":"pack-fallback",X.kill_in_flight_supported=!!de,k.writeHead(200,{"Content-Type":"application/json"}),k.end(JSON.stringify(X));return}if(_.method==="GET"&&_.url==="/ready"){k.writeHead(fa?200:503,{"Content-Type":"application/json"}),k.end(JSON.stringify({ready:fa,inflight:Pt.inflight,queued:Pt.queued,max:Pt.max}));return}let nt=_.url?.split("?")[0]??"";if(_.method==="GET"&&K&&(nt==="/"||nt==="/index.html")){k.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),k.end(K);return}if(_.method==="POST"&&nt==="/v1/chat"){let X=await Fy(_),De=(0,he.resolveUserId)(_.headers,X),wt=(0,he.resolveDataToken)(_.headers),Hn=(0,he.resolveUserId)(_.headers,void 0)??(0,he.clientIp)(_);if(!It.tryConsume(Hn)){k.writeHead(429,{"Content-Type":"application/json","Retry-After":String(It.retryAfterSeconds(Hn))}),k.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:At,sandboxKey:$l,rejected:fo}=(0,he.resolveServeSessionKey)(X.session_id,De,je);if(fo){re.append("unverified",(0,Ko.generateRequestId)(),"warrant_denied",{reason:fo}),k.writeHead(403,{"Content-Type":"application/json"}),k.end(JSON.stringify({error:"verified user identity required"}));return}let po=await Pt.acquire();if(!po){Ts(`TurnGate: rejecting /v1/chat (inflight=${Pt.inflight} queued=${Pt.queued} max=${Pt.max})`),k.writeHead(429,{"Content-Type":"application/json","Retry-After":String(he.TURN_GATE_RETRY_AFTER_SECONDS)}),k.end(JSON.stringify({error:"At capacity"}));return}let qs=null;try{if(!Gn.tryConsume(At)){k.writeHead(429,{"Content-Type":"application/json"}),k.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await ge(At),De?.trim()&&(qs=await Wt({userId:De.trim(),sessionKey:At,inboundToken:wt,edgeNonce:_n(_.headers)}));let pA=await(0,zc.runWithCredential)({userId:De,dataToken:wt},()=>OD(an,X,At,$l,o,l,t.workspace,qt,De,qs?.env),{onDenied:W(At)});k.writeHead(200,{"Content-Type":"application/json"}),k.end(JSON.stringify(pA)),Z?.schedule(At)}finally{await qs?.release(),po()}return}if(_.method==="POST"&&nt==="/v1/chat/stream"){let X=await Fy(_),De=(0,he.resolveUserId)(_.headers,X),wt=(0,he.resolveDataToken)(_.headers),Hn=(0,he.resolveUserId)(_.headers,void 0)??(0,he.clientIp)(_);if(!It.tryConsume(Hn)){k.writeHead(429,{"Content-Type":"application/json","Retry-After":String(It.retryAfterSeconds(Hn))}),k.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:At,sandboxKey:$l,rejected:fo}=(0,he.resolveServeSessionKey)(X.session_id,De,je);if(fo){re.append("unverified",(0,Ko.generateRequestId)(),"warrant_denied",{reason:fo}),k.writeHead(403,{"Content-Type":"application/json"}),k.end(JSON.stringify({error:"verified user identity required"}));return}let po=await Pt.acquire();if(!po){Ts(`TurnGate: rejecting /v1/chat/stream (inflight=${Pt.inflight} queued=${Pt.queued} max=${Pt.max})`),k.writeHead(429,{"Content-Type":"application/json","Retry-After":String(he.TURN_GATE_RETRY_AFTER_SECONDS)}),k.end(JSON.stringify({error:"At capacity"}));return}let qs=null;try{if(!Gn.tryConsume(At)){k.writeHead(429,{"Content-Type":"application/json"}),k.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await ge(At),De?.trim()&&(qs=await Wt({userId:De.trim(),sessionKey:At,inboundToken:wt,edgeNonce:_n(_.headers)})),await(0,zc.runWithCredential)({userId:De,dataToken:wt},async()=>{k.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),await ND(an,X,At,$l,o,l,t.workspace,qt,k,De,qs?.env)},{onDenied:W(At)}),Z?.schedule(At)}finally{await qs?.release(),po()}return}k.writeHead(404,{"Content-Type":"application/json"}),k.end(JSON.stringify({error:"Not found"}))}catch(nt){if(nt?.tooLarge===!0){k.headersSent||k.writeHead(413,{"Content-Type":"application/json",Connection:"close"}),k.end(JSON.stringify({error:"Payload too large"}));return}console.error("Request error:",nt),k.headersSent||k.writeHead(500,{"Content-Type":"application/json"}),k.end(JSON.stringify({error:nt instanceof Error?nt.message:"Internal error"}))}});Dp.listen(t.port,U,()=>{(async()=>{console.log(""),console.log(qo),console.log("Agent Hippo Server"),console.log(qo),console.log(`Host: ${U}`),console.log(`Port: ${t.port}`),console.log(`Engine: ${o}`),console.log(`Model: ${l}`),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(qo),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`),console.log(""),console.log("Press Ctrl+C to stop."),console.log("");let _=(0,of.resolveSessionShipConfig)(kr,F,S);_&&(uo=(0,of.startSessionShipper)({..._,logger:{info:se=>d.info(se),warn:se=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${se}`)}}));let k=t.bind?.trim();if(k)try{await PD(i,k,lr)}catch(se){console.error(`${L.COLORS.yellow}Warning:${L.COLORS.reset} Failed to bind channels: ${se instanceof Error?se.message:String(se)}`)}if(t.gatewayBridge){if(Me)try{ut=await(0,ht.startEgressBroker)({registry:Me,workspaceRoot:t.workspace,agentId:n.manifest.metadata.name,send:async(se,nt,X)=>{let De=await(0,SD.sendGatewayOutboundMessage)(se,{message:nt,media:X,token:lr});return{ok:De.ok,via:De.via,stdout:De.stdout,stderr:De.stderr}},logger:t.verbose?new Qn.ConsoleLogger("[Egress]"):new Qn.NoOpLogger,audit:on}),process.env[ht.EGRESS_URL_ENV]=ut.url,console.log("OK: Egress broker on loopback \u2014 gateway token stays broker-side; agent sends via turn nonce")}catch(se){console.error(`${L.COLORS.red}Error:${L.COLORS.reset} Egress broker failed to start: ${se instanceof Error?se.message:String(se)}`),process.exit(1)}try{da=await ID({gatewayAgentId:i,packName:n.manifest.metadata.name,workspace:t.workspace,registerTurn:Wt,brokerGatewayToken:lr,engine:o,defaultModel:l,runner:an,permissions:qt,turnGate:Pt,rateLimiter:It,turnLimiter:Gn,warnGateReject:Ts,prepareSession:ge,sandboxScope:je,onTurnComplete:se=>Z?.schedule(se),logWarrantDenied:W,serviceUserIfPermitted:fA})}catch(se){console.error(`${L.COLORS.yellow}Warning:${L.COLORS.reset} Gateway bridge failed: ${se instanceof Error?se.message:String(se)}`)}}fa=!0})()});let Lp=!1,Mp=()=>{Lp||(Lp=!0,fa=!1,console.log(`
|
|
526
|
+
[Error: ${u}]`,a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"error",message:u})},async done(){a.sendEvent("agent.stream",{runId:s,agentId:o,sessionKey:i,state:"done"})}};try{let u=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,u,f,{params:r,runId:s,agentId:o}),p=c||d;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(u){this.client.respond(e.id,void 0,!1,{code:"CHAT_UI_ERROR",message:u instanceof Error?u.message:String(u)}),this.log(`Agent ${o} (Chat UI) failed: ${u}`)}}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)}};Vt.GatewayBridge=Yc;function pD(t){return new Yc(t)}});var Yy=T(Zn=>{"use strict";var gD=Zn&&Zn.__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]})),hD=Zn&&Zn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yo=Zn&&Zn.__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"&&gD(n,e,r[s]);return hD(n,e),n}})();Object.defineProperty(Zn,"__esModule",{value:!0});Zn.serveCommand=vD;Zn.resolveGatewaySessionKey=Vy;Zn.runGatewayTurn=Wy;Zn.runBridgeTurn=Ky;var Ly=Yo(require("crypto")),En=Yo(require("fs")),My=Yo(require("os")),mD=Yo(require("http")),Or=Yo(require("path")),Gy=require("node:crypto"),ED=km(),Wo=li(),kn=No(),sf=cd(),yD=fd(),hi=ko(),_D=Co(),Uy=Nc(),Hy=dE(),Jc=yE(),jy=TE(),Wr=wd(),Qn=ai(),mi=ci(),L=qn(),wD=bd(),of=BE(),he=Fr(),zc=Ns(),Xc=ko(),AD=Ri(),ht=Hc(),xy=Er(),SD=Xd(),By=bo(),Ko=Qs(),xs=vy(),bD=Oy(),af=tf(),TD=Cs(),qo="-".repeat(62);async function vD(t){let e=(0,mi.getApiConfig)();e.useLiteLLM&&!e.litellmApiKey&&console.warn(`${L.COLORS.yellow}Warning:${L.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 Qn.ConsoleLogger("[Sync]"):new Qn.NoOpLogger;try{n=await(0,mi.loadAgentPack)(t.agent,t.workspace)}catch(_){console.error(`Error: ${_ instanceof Error?_.message:_}`),process.exit(1)}let s=n.manifest.metadata.name,i=(0,bD.resolveCliGatewayAgentId)(s),o=(t.engine||n.manifest.spec.engine||(0,mi.getDefaultConfig)().engine).trim().toLowerCase(),a=["claude","codex"].includes(o)?void 0:(0,TD.tryResolveCustomEngineManifest)(t.workspace,o)?.model?.defaultModel,c=t.model||n.manifest.spec.model||a||(0,mi.getEnvDefaultModel)()||(0,mi.getDefaultConfig)().model,l=(0,Qn.resolveModelAlias)(c),f=n.manifest.spec.cheapModel?.trim(),u=f?(0,Qn.resolveModelAlias)(f):void 0;if(!(0,mi.hasCredentialForEngine)(o,e)){console.error(`Error: No usable API key for engine "${o}". Set ${o==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}, or configure the LiteLLM proxy (AGENTHIPPO_LITELLM_API_KEY + AGENTHIPPO_LITELLM_BASE_URL).`);for(let R of(0,L.getLiteLLMQuickstartHintLines)())console.error(R);process.exit(1)}let d=t.verbose?new Qn.ConsoleLogger("[Server]"):new Qn.NoOpLogger,p=n.packPath,g=n.manifest.metadata.version??"0.0.0",m,h=await(0,kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL}),E=(_,R="pack")=>{for(let ee of _.warnings)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${ee}`);_.status==="unavailable"&&console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${R} trust root is configured but unusable: ${_.reason}`)};E(h);let y=(0,kn.createPackVerifier)(),w={ok:!1,kind:"no-pack",reason:"not verified"},P=(_,R)=>(w=y.refresh({packDir:_,pack:s,packVersion:R,keys:h.keys}),m=w.ok?w.claims.digest:void 0,d.info(w.ok?`[Pack] signature verified for ${s}`:`[Pack] unverified \u2014 ${w.reason}`),w),b=_=>{if(_.ok)return"";let R=h.status==="unavailable"&&_.kind==="no-trust-root"?"trust-root-unavailable":_.kind;return(0,kn.describePackRefusal)({kind:R,detail:R==="trust-root-unavailable"?h.reason??_.reason:_.reason,pack:s,packVersion:g,packDir:p,trustRootHint:h.url?`Trust root: ${h.url} (${h.reason??"unavailable"})`:h.reason})};P(p,g);let v=!!t.allowUnsignedPack||(0,kn.allowUnsignedPackFromEnv)();w.ok||(v||(console.error(`${L.COLORS.red}Error: ${b(w)}${L.COLORS.reset}`),process.exit(1)),console.warn(qo),console.warn(`${L.COLORS.yellow}!! RUNNING AN UNVERIFIED PACK \u2014 signature checking is DISABLED on this instance.${L.COLORS.reset}`),console.warn(`${L.COLORS.yellow}!! ${w.reason}${L.COLORS.reset}`),console.warn(`${L.COLORS.yellow}!! Whatever is in ${p} will be executed, verified by nobody.${L.COLORS.reset}`),console.warn(`${L.COLORS.yellow}!! This is a LOCAL DEVELOPMENT setting (AGENTHIPPO_ALLOW_UNSIGNED_PACK). Do not ship it.${L.COLORS.reset}`),console.warn(qo));let A=(0,L.findBundledBasePromptsDir)();await(0,Qn.syncPackToWorkspace)(t.workspace,n.packPath,s,o,r,A),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=${o}`);let{dir:S,ephemeral:I}=(0,he.resolveStateDir)(t.stateDir),U=(0,he.resolveBindHost)(t.host);for(let _ of(0,he.identityHeaderAdvice)(process.env,U))console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`);let O=(0,he.tenantIsolationAdvice)({sandbox:t.sandbox,sharedWorkspace:!!t.sharedWorkspace,workspace:t.workspace,stateDir:S});if(O.level==="refuse"){for(let _ of O.lines)console.error(`${L.COLORS.red}Error:${L.COLORS.reset} ${_}`);console.error(`Refusing to start because ${he.REQUIRE_TENANT_ISOLATION_ENV} is set. Unset it to downgrade this to a warning.`),process.exit(1)}for(let _ of O.lines)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`);let F=(0,he.resolveAnalyticsSessionsDir)(S,I),se=new By.SessionEventWriter(F),W=_=>R=>se.append(_,(0,Ko.generateRequestId)(),"warrant_denied",{reason:R}),pe=(0,ht.resolveDataPlaneConfig)(n.manifest.spec,n.packPath),me=(0,ht.resolveEdgeDataPlane)(),z=me?new ht.EdgeDataPlane(me):null,Ne=z?null:(0,ht.resolveRemoteDataPlane)(),qe=Ne?new ht.RemoteDataPlane(Ne):null,Me=pe&&!qe&&!z||t.gatewayBridge?new ht.TurnRegistry:null,on=(_,R,ee)=>se.append(_,(0,Ko.generateRequestId)(),R,{...ee,agent:{pack:s,version:g,digest:m??null}}),_e=null;if(z)process.env[ht.DATA_MCP_URL_ENV]=z.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 ${z.url}; turn nonces are minted at the edge, serve holds no registration credential`);else if(qe)process.env[ht.DATA_MCP_URL_ENV]=qe.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,console.log(`OK: Data plane SIDECAR \u2014 gateway ${qe.url}; base credentials stay in the connector container, not here`);else if(pe)try{_e=await ht.DataPlane.start(pe,{logger:t.verbose?new Qn.ConsoleLogger("[DataPlane]"):new Qn.NoOpLogger,audit:on,registry:Me??void 0}),process.env[ht.DATA_MCP_URL_ENV]=_e.url,console.log(`OK: Data gateway (provider=${_e.broker.provider.name}) on loopback \u2014 connector: ${pe.connectorPath}`)}catch(_){console.error(`${L.COLORS.red}Error: failed to start the data-plane gateway:${L.COLORS.reset} ${_ instanceof Error?_.message:_}`),process.exit(1)}let lr=(0,xy.readOpenClawGatewayToken)();delete process.env.OPENCLAW_GATEWAY_TOKEN;let ut=null,Wt=async _=>{if(z){let K=_.edgeNonce?.trim();if(!K)return console.warn(`${L.COLORS.yellow}Warning:${L.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 Ie=z.adoptTurn(K),wt={...Ie.env};return ut&&(wt[ht.EGRESS_URL_ENV]=ut.url),{nonce:Ie.nonce,env:wt,release:Ie.release}}if(qe){let K=await qe.registerTurn({..._,agent:{pack:s,version:g,digest:m}}),Ie={...K.env};return ut&&(Ie[ht.EGRESS_URL_ENV]=ut.url),{nonce:K.nonce,env:Ie,release:K.release}}if(!Me)return null;let{nonce:R,release:ee}=Me.register(_),Be={[ht.TURN_NONCE_ENV]:R};return _e&&(Be[ht.DATA_MCP_URL_ENV]=_e.url),ut&&(Be[ht.EGRESS_URL_ENV]=ut.url),{nonce:R,env:Be,release:ee}},_n=_=>{if(!z)return;let R=_[ht.TURN_NONCE_HEADER];return Array.isArray(R)?R[0]:R},Gn=new he.TurnLimiter(t.maxTurnsPerSession??0),Et=Number(process.env.AGENTHIPPO_SERVE_RATE_LIMIT??120),It=new he.RateLimiter(Number.isFinite(Et)?Et:120),Pt=(0,he.createTurnGateFromEnv)(),Ts=(0,he.createRejectionWarner)(),q;if(t.wwwDir?.trim()){let _=Or.join(Or.resolve(t.wwwDir.trim()),"index.html");try{q=En.readFileSync(_,"utf8")}catch{console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} --www-dir set but unreadable: ${_}`)}}I&&console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} Session state is in a tmpdir (ephemeral). Pass --state-dir or set AGENTHIPPO_HOME to persist sessions across restarts.`);let Gt=(0,xs.resolveS3StateConfig)(),N=(0,xs.resolveRestoreBootMode)();Gt&&(await(0,xs.isAwsCliAvailable)()||(console.error(`${L.COLORS.red}Error: AGENTHIPPO_STATE_S3_URI is set but the \`aws\` CLI was not found.${L.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)),N==="all"?(console.log(`State sync: boot-restore from ${Gt.uri} \u2026`),await(0,xs.restoreState)(Gt,S,_=>console.log(` ${_}`))):console.log(`State sync: restore-on-miss from ${Gt.uri} (boot restore disabled)`));let Z=Gt?(0,xs.makeStatePusher)(Gt,S,t.verbose?_=>console.error(_):void 0):null,x=t.verbose?_=>console.error(_):void 0,ge=async _=>{Gt&&await(0,xs.ensureSessionLocal)(Gt,S,_,x)},dt=(0,L.findClaudeCodePath)(),oe=(0,L.findCodexPath)(),yt=t.sandbox==="container";if(!yt&&o==="claude"&&!dt){console.error(`${L.COLORS.red}Error: Claude Code CLI not found.${L.COLORS.reset}`);let _=(0,Wo.getUnsupportedClaudePlatformHint)();_&&console.error(` ${_}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),process.exit(1)}!yt&&o==="codex"&&!oe&&(console.error(`${L.COLORS.red}Error: Codex CLI not found.${L.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),process.exit(1));let Kt=new Qn.AutoApprovePermissionHandler,qt={fileAccess:(0,mi.getFileAccess)(n)},Yt,ss=!1,vi=_=>{let R=(0,hi.policyVersion)(_);ss&&R===Yt||(ss=!0,Yt=R,se.append("serve",(0,Ko.generateRequestId)(),"policy_applied",{instance_id:kr,policy_version:R??null,pack_digest:m??null,engine_version:(0,Wo.installedEngineVersion)(o)??null,tier:t.sandbox==="container"?2:t.sandbox?0:null,enabled:_?.enabled??null,pinned_version:_?.version??null,caps:_?.caps??null,deny_count:_?.deny?.length??0}))},oo,ur=Or.join(S,"packs"),ca=async(_,R)=>(await(0,yD.downloadFromStore)({type:"pack",slug:_,version:R})).map(Be=>({path:Be.path,content:Be.content})),ao=async _=>{if(!t.pullPacks||!_||_===g)return;let R=await(0,sf.reconcilePinnedPack)({pack:s,currentVersion:g,pinnedVersion:_,packsRoot:ur,download:ca,publicKeysByKid:h.keys,logger:{info:ee=>d.info(ee),warn:ee=>d.info(ee)}});if(R.ok){g=R.version,p=R.packDir,P(p,g),d.info(`[Pack] now serving ${s}@${g} from ${R.packDir}`);return}console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} cannot converge to ${s}@${_}: ${R.reason}. Still serving @${g}.`)},la=(0,Wr.loadWarrantKeypair)(d),co,kr=(()=>{try{let _=Or.join((0,he.resolveStateDir)(t.stateDir).dir,"instance-id");if(En.existsSync(_))return En.readFileSync(_,"utf-8").trim();let R=`${My.hostname()}-${Ly.randomBytes(4).toString("hex")}`;return En.mkdirSync(Or.dirname(_),{recursive:!0}),En.writeFileSync(_,R),R}catch{return`${My.hostname()}-${Ly.randomBytes(4).toString("hex")}`}})(),lo={get:()=>n?.manifest.metadata.version},is=(0,hi.resolveLeasePollSeconds)(t.leasePollSeconds),Un=await(0,kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});Un.explicitlyConfigured&&E(Un,"lease");let Ks=(0,kn.checkTrustRootSeparation)(Un,h);for(let _ of Ks.warnings)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} [TrustRoot] ${_}`);Ks.fatal&&(console.error(`Error: [TrustRoot] ${Ks.fatal}`),process.exit(1));let vs=!1,Oi=()=>{let _=(0,kn.selectLeaseSigningKeys)(Un,h);return _.packFallback&&!vs&&(vs=!0,console.warn(`${L.COLORS.yellow}Warning:${L.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).`+(Un.reason?` The derived lease trust root is unusable: ${Un.reason}`:""))),_.keys},ua=(()=>{if(t.staticLeaseFile)try{let _=(0,_D.parseLease)(JSON.parse(En.readFileSync(t.staticLeaseFile,"utf-8")));if(!_.ok)throw new Error(_.reason);for(let R of _.warnings)console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} [Lease] --static-lease: ${R}`);return _.lease}catch(_){console.error(`Error: --static-lease ${t.staticLeaseFile} is not a usable lease: ${_ instanceof Error?_.message:_}`),process.exit(1)}})(),Os=Or.join(S,"lease.json"),Q={load:()=>{if(!En.existsSync(Os))return;let _=JSON.parse(En.readFileSync(Os,"utf-8"));if(_&&typeof _=="object"&&typeof _.body=="string"&&typeof _.lastGoodAt=="number")return _},save:_=>{En.mkdirSync(Or.dirname(Os),{recursive:!0});let R=`${Os}.tmp`;En.writeFileSync(R,JSON.stringify(_)),En.renameSync(R,Os)}},M=(0,hi.createLeaseSource)({url:process.env.AGENTHIPPO_LEASE_URL,staticLease:ua,persistence:Q,identity:()=>({instance:kr,pack:s,version:lo.get(),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,sandboxes:co?.sandboxes().length,engine:o,engineversion:(0,Wo.installedEngineVersion)(o),...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,hi.leaseCacheSecondsFor)(is),signingKeys:()=>Oi(),requireSignedLease:t.requireSignedLease,instanceId:kr,...t.leaseMaxStalenessSeconds!==void 0?{maxStalenessSeconds:t.leaseMaxStalenessSeconds}:{},logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}),ve=async()=>{if(h.status!=="configured"){let _=await(0,kn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});_.status==="configured"&&(h=_,E(_),d.info(`[Pack] signing keys now available (${Object.keys(_.keys).length}); re-verifying`),P(p,g))}if(Un.status!=="configured"){let _=await(0,kn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});_.status==="configured"&&(Un=_,_.explicitlyConfigured&&E(_,"lease"),d.info(`[Lease] lease-signing keys now available (${Object.keys(_.keys).length})`))}};M.get().then(vi).catch(()=>{});{let _=is*1e3;setInterval(()=>{M.get().then(vi).catch(()=>{}),ve().catch(()=>{})},_).unref?.()}if(t.pullPacks){En.mkdirSync(ur,{recursive:!0});let _=Or.join(ur,g);En.existsSync(_)||En.cpSync(n.packPath,_,{recursive:!0}),(0,sf.promoteCurrent)(ur,_),p=Or.join(ur,sf.CURRENT_LINK),await ao((await M.get())?.version),P(p,g)}if(lo.get=()=>g,oo=(0,wD.createPackRunner)({storagePath:S,analyticsSessionsDir:F,packId:s,packVersion:g,provenance:()=>({policyVersion:Yt,packDigest:m,engineVersion:(0,Wo.installedEngineVersion)(o),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:kr}),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:Kt,claudeCheapModel:u,omitGatewayToken:!0}),t.pullPacks){let _=is*1e3;setInterval(()=>{M.get().then(ee=>ao(ee?.version)).catch(()=>{})},_).unref?.()}let Re=!!t.sharedWorkspace,je=t.sandboxScope==="user"?"user":"session",ue=t.sandbox==="container"?{readonly:[`${p}:${Jc.SANDBOX_PACK_DIR}`],writable:[`${t.workspace}:${Jc.SANDBOX_WORKSPACE_DIR}`]}:void 0;ue&&Re&&console.warn(`${L.COLORS.yellow}Warning:${L.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 xe;ue&&t.sandboxImage&&(await(0,Wr.alignSandboxWorkspaceOwnership)({exec:Wr.dockerExec,image:t.sandboxImage,writable:ue.writable,logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}),xe=await(0,Wr.resolveSandboxImageUser)(Wr.dockerExec,t.sandboxImage));let Ut=_=>(0,Wr.ensureSandboxStateDir)(Or.join(S,"sandbox-state",(0,xs.safeSessionId)(_)),xe),_t=async _=>{if(!ue)return{readonly:[],writable:[]};if(Re)return ue;let R=(0,Wr.ensureSandboxStateDir)(Or.join(S,"sandbox-workspace",(0,xs.safeSessionId)(_)),xe);return{readonly:ue.readonly,writable:[`${R}:${Jc.SANDBOX_WORKSPACE_DIR}`]}},nt=(_,R,ee)=>{if((0,kn.resolveRequireSignedPack)({lease:_?.requireSignedPack,localRequire:t.requireSignedPack,localAllowUnsigned:v})){let K=y.verify({packDir:p,pack:s,packVersion:g,keys:h.keys});if(K!==w&&(w=K,m=K.ok?K.claims.digest:void 0),!K.ok)throw new hi.LeaseDeniedError(b(K))}(0,hi.assertAdmitted)(_,{pack:s,version:g,image:t.sandboxImage,sessionKey:R,userHash:he.userNamespaceHash,userId:ee})},de=t.sandbox?(0,ED.createSandboxRunner)({driver:t.sandbox==="container"?new Jc.ContainerSandboxDriver({exec:Wr.dockerExec,socketOwner:xe,logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}):new jy.ProcessSandboxDriver({command:process.execPath,args:[...(0,Wr.sandboxScriptArg)(),"sandbox","--agent",p,"--stdio","--state-dir",S,"--workspace",t.workspace],namespaceIsolation:(0,jy.namespaceIsolationFromEnv)(),logger:{info:_=>d.info(_),warn:_=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${_}`)}}),image:t.sandboxImage??"",tier:t.sandbox==="container"?2:0,...ue?{fs:ue,fsFor:_t,stateDirFor:Ut}:{},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},provenanceEnv:()=>(0,xy.buildProvenanceEnv)({policyVersion:Yt,packDigest:m,engineVersion:(0,Wo.installedEngineVersion)(o),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:kr}),admit:async({sessionKey:_})=>{let R=await M.get();nt(R,_)},inferenceBaseUrl:e.baseUrl,mintModelToken:async(_,R)=>{let ee=(0,zc.currentCredential)()?.userId?.trim()||`anon:${R}`,Be=await M.get(),K=Be?.budget,Ie=K===void 0?void 0:K.scope==="user"?`user:${ee}`:`session:${R}`;return(0,Wr.mintSandboxInferenceWarrant)(la,{user:ee,pack:s,packVersion:g,sandboxId:_,tier:t.sandbox==="container"?2:0,ttlSeconds:300,...Be?.billUsers===!0?{billing:"user"}:{},...Ie?{budgetKey:Ie}:{},...K?.windowSeconds?{budgetWindowSeconds:K.windowSeconds}:{}})},logger:d,runtime:{logger:d,editTracker:void 0,configProvider:void 0,permissionHandler:Kt}}):void 0;co=de??void 0;let $e=_=>typeof _=="number"&&Number.isFinite(_)&&_>0?_:void 0,Jt={...(0,Uy.capsFromEnv)(),...$e(t.maxTurnsPerSession)!==void 0?{maxTurnsPerSession:t.maxTurnsPerSession}:{},...$e(t.maxSessionSeconds)!==void 0?{maxSessionSeconds:t.maxSessionSeconds}:{},...$e(t.maxConcurrentSandboxes)!==void 0?{maxConcurrentSandboxes:t.maxConcurrentSandboxes}:{},...t.capOnBreach?{onBreach:t.capOnBreach}:{}},Ii=Jt.maxTurnsPerSession!==void 0||Jt.maxSessionSeconds!==void 0||Jt.maxConcurrentSandboxes!==void 0,Is={sandboxes:()=>[],destroySession:async()=>{},revokeRoute:async()=>{},supportsInFlightTermination:!1},Xt=!!(de||process.env.AGENTHIPPO_LEASE_URL||Ii)?(0,Hy.createGovernor)({caps:(0,Uy.mergeCaps)((await M.get())?.caps,Jt),sandboxes:de??Is,getLease:()=>M.get(),pollSeconds:is,pack:s,userHash:he.userNamespaceHash,...de?{}:{admitPack:(_,R)=>{try{return nt(R,_),{allowed:!0}}catch(ee){return{allowed:!1,reason:ee instanceof Error?ee.message:String(ee)}}}},logger:d,audit:(_,R)=>on(String(R.sessionKey??"instance"),_,R)}):void 0;Ii&&!de&&console.warn(`${L.COLORS.yellow}Warning:${L.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.`);let wn=de??oo,an=Xt?(0,Hy.withGovernor)(wn,Xt):wn;if(Xt){Xt.start();let _=Xt.policy(),R=(0,hi.effectiveKillLatencySeconds)(is);d.info(`[Serve] control plane: caps turns=${_.maxTurnsPerSession??"\u221E"} session=${_.maxSessionSeconds??"\u221E"}s sandboxes=${_.maxConcurrentSandboxes??"\u221E"} onBreach=${_.onBreach??"revoke-inference"}; lease poll ${is}s (worst-case kill latency ${R}s; an admin refresh is immediate)`),de||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 ee=M.status();process.env.AGENTHIPPO_LEASE_URL&&!ee.requireSignedLease&&d.info("[Serve] lease signature is NOT required \u2014 set --require-signed-lease (or lease.requireSignedLease) once the control plane signs leases.")}let An=(0,he.resolveServiceIdentity)();An.error&&(console.error(`${L.COLORS.red}Error:${L.COLORS.reset} ${An.error}`),process.exit(1)),An.warning&&console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${An.warning}`);let kl=!!process.env.AGENTHIPPO_LEASE_URL,fA=async()=>{if(!An.identity)return;let _=(0,Xc.resolveAllowServiceTurns)({lease:(await M.get())?.allowServiceTurns,managed:kl});if(!_.allowed){on("service-turn","service_turn_denied",{identity:(0,AD.hashIdentity)(An.identity),gate:_.gate,detail:(0,Xc.describeServiceTurnGate)(_.gate)});return}return An.identity};if(An.identity){let _=(0,Xc.resolveAllowServiceTurns)({lease:void 0,managed:kl});d.info(`[Serve] unattended runs: identity configured (${he.SERVICE_USER_ENV}); `+(kl?"the control plane decides per turn via lease.allowServiceTurns \u2014 absent means deny":(0,Xc.describeServiceTurnGate)(_.gate)))}de&&(d.info(`[Serve] sandbox mode: ${t.sandbox} (tier ${t.sandbox==="container"?2:0}) \u2014 engines run in per-session sandboxes`),e.baseUrl||console.warn(`${L.COLORS.yellow}Warning:${L.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 da=null,fa=!1,uo,Dp=mD.createServer(async(_,R)=>{let ee=(0,he.corsHeaders)();for(let[Be,K]of Object.entries(ee))R.setHeader(Be,K);if(_.method==="OPTIONS"){R.writeHead(204),R.end();return}try{if(_.method==="GET"&&_.url==="/health"){let K={status:"ok"};K.evidence_ship_enabled=!!uo;let Ie=uo?.lastOkAt();Ie!==void 0&&(K.evidence_ship_last_ok_at=new Date(Ie).toISOString());let wt=(0,of.getEvidenceShipStatus)();K.evidence_ship_disabled_reason=wt.disabledReason??null,K.evidence_ship_consecutive_failures=wt.consecutiveFailures,K.evidence_records_staged=wt.recordsStaged,K.evidence_records_shipped=wt.recordsShipped,K.evidence_records_skipped_too_old=wt.recordsSkippedTooOld,K.evidence_files_skipped_too_old=wt.filesSkippedTooOld,K.evidence_content_capture=wt.contentCapture,wt.lastHeartbeatAt!==void 0&&(K.evidence_ship_last_heartbeat_at=new Date(wt.lastHeartbeatAt).toISOString());let Hn=(0,By.getSessionEventWriterStats)();K.evidence_writes_ok=Hn.written,K.evidence_writes_failed=Hn.failed,Hn.lastError&&(K.evidence_write_last_error={at:new Date(Hn.lastError.at).toISOString(),event_type:Hn.lastError.eventType,message:Hn.lastError.message});let At=M.status();K.lease_configured=!!process.env.AGENTHIPPO_LEASE_URL,K.lease_signed=At.signed,K.lease_signature_required=At.requireSignedLease,K.lease_staleness_seconds=At.stalenessSeconds??null,K.lease_fail_closed=At.failClosed,K.pack_signature_ok=w.ok,K.pack_signature_required=(0,kn.resolveRequireSignedPack)({localRequire:t.requireSignedPack,localAllowUnsigned:v}),K.pack_trust_root=h.status,K.lease_trust_root=Un.status,K.lease_trust_root_source=Un.explicitlyConfigured?"lease":"pack-fallback",K.kill_in_flight_supported=!!de,R.writeHead(200,{"Content-Type":"application/json"}),R.end(JSON.stringify(K));return}if(_.method==="GET"&&_.url==="/ready"){R.writeHead(fa?200:503,{"Content-Type":"application/json"}),R.end(JSON.stringify({ready:fa,inflight:Pt.inflight,queued:Pt.queued,max:Pt.max}));return}let Be=_.url?.split("?")[0]??"";if(_.method==="GET"&&q&&(Be==="/"||Be==="/index.html")){R.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),R.end(q);return}if(_.method==="POST"&&Be==="/v1/chat"){let K=await Fy(_),Ie=(0,he.resolveUserId)(_.headers,K),wt=(0,he.resolveDataToken)(_.headers),Hn=(0,he.resolveUserId)(_.headers,void 0)??(0,he.clientIp)(_);if(!It.tryConsume(Hn)){R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(It.retryAfterSeconds(Hn))}),R.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:At,sandboxKey:$l,rejected:fo}=(0,he.resolveServeSessionKey)(K.session_id,Ie,je);if(fo){se.append("unverified",(0,Ko.generateRequestId)(),"warrant_denied",{reason:fo}),R.writeHead(403,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"verified user identity required"}));return}let po=await Pt.acquire();if(!po){Ts(`TurnGate: rejecting /v1/chat (inflight=${Pt.inflight} queued=${Pt.queued} max=${Pt.max})`),R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(he.TURN_GATE_RETRY_AFTER_SECONDS)}),R.end(JSON.stringify({error:"At capacity"}));return}let qs=null;try{if(!Gn.tryConsume(At)){R.writeHead(429,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await ge(At),Ie?.trim()&&(qs=await Wt({userId:Ie.trim(),sessionKey:At,inboundToken:wt,edgeNonce:_n(_.headers)}));let pA=await(0,zc.runWithCredential)({userId:Ie,dataToken:wt},()=>OD(an,K,At,$l,o,l,t.workspace,qt,Ie,qs?.env),{onDenied:W(At)});R.writeHead(200,{"Content-Type":"application/json"}),R.end(JSON.stringify(pA)),Z?.schedule(At)}finally{await qs?.release(),po()}return}if(_.method==="POST"&&Be==="/v1/chat/stream"){let K=await Fy(_),Ie=(0,he.resolveUserId)(_.headers,K),wt=(0,he.resolveDataToken)(_.headers),Hn=(0,he.resolveUserId)(_.headers,void 0)??(0,he.clientIp)(_);if(!It.tryConsume(Hn)){R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(It.retryAfterSeconds(Hn))}),R.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:At,sandboxKey:$l,rejected:fo}=(0,he.resolveServeSessionKey)(K.session_id,Ie,je);if(fo){se.append("unverified",(0,Ko.generateRequestId)(),"warrant_denied",{reason:fo}),R.writeHead(403,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"verified user identity required"}));return}let po=await Pt.acquire();if(!po){Ts(`TurnGate: rejecting /v1/chat/stream (inflight=${Pt.inflight} queued=${Pt.queued} max=${Pt.max})`),R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(he.TURN_GATE_RETRY_AFTER_SECONDS)}),R.end(JSON.stringify({error:"At capacity"}));return}let qs=null;try{if(!Gn.tryConsume(At)){R.writeHead(429,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await ge(At),Ie?.trim()&&(qs=await Wt({userId:Ie.trim(),sessionKey:At,inboundToken:wt,edgeNonce:_n(_.headers)})),await(0,zc.runWithCredential)({userId:Ie,dataToken:wt},async()=>{R.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),await ND(an,K,At,$l,o,l,t.workspace,qt,R,Ie,qs?.env)},{onDenied:W(At)}),Z?.schedule(At)}finally{await qs?.release(),po()}return}R.writeHead(404,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Not found"}))}catch(Be){if(Be?.tooLarge===!0){R.headersSent||R.writeHead(413,{"Content-Type":"application/json",Connection:"close"}),R.end(JSON.stringify({error:"Payload too large"}));return}console.error("Request error:",Be),R.headersSent||R.writeHead(500,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:Be instanceof Error?Be.message:"Internal error"}))}});Dp.listen(t.port,U,()=>{(async()=>{console.log(""),console.log(qo),console.log("Agent Hippo Server"),console.log(qo),console.log(`Host: ${U}`),console.log(`Port: ${t.port}`),console.log(`Engine: ${o}`),console.log(`Model: ${l}`),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(qo),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`),console.log(""),console.log("Press Ctrl+C to stop."),console.log("");let _=(0,of.resolveSessionShipConfig)(kr,F,S);_&&(uo=(0,of.startSessionShipper)({..._,logger:{info:ee=>d.info(ee),warn:ee=>console.warn(`${L.COLORS.yellow}Warning:${L.COLORS.reset} ${ee}`)}}));let R=t.bind?.trim();if(R)try{await PD(i,R,lr)}catch(ee){console.error(`${L.COLORS.yellow}Warning:${L.COLORS.reset} Failed to bind channels: ${ee instanceof Error?ee.message:String(ee)}`)}if(t.gatewayBridge){if(Me)try{ut=await(0,ht.startEgressBroker)({registry:Me,workspaceRoot:t.workspace,agentId:n.manifest.metadata.name,send:async(ee,Be,K)=>{let Ie=await(0,SD.sendGatewayOutboundMessage)(ee,{message:Be,media:K,token:lr});return{ok:Ie.ok,via:Ie.via,stdout:Ie.stdout,stderr:Ie.stderr}},logger:t.verbose?new Qn.ConsoleLogger("[Egress]"):new Qn.NoOpLogger,audit:on}),process.env[ht.EGRESS_URL_ENV]=ut.url,console.log("OK: Egress broker on loopback \u2014 gateway token stays broker-side; agent sends via turn nonce")}catch(ee){console.error(`${L.COLORS.red}Error:${L.COLORS.reset} Egress broker failed to start: ${ee instanceof Error?ee.message:String(ee)}`),process.exit(1)}try{da=await ID({gatewayAgentId:i,packName:n.manifest.metadata.name,workspace:t.workspace,registerTurn:Wt,brokerGatewayToken:lr,engine:o,defaultModel:l,runner:an,permissions:qt,turnGate:Pt,rateLimiter:It,turnLimiter:Gn,warnGateReject:Ts,prepareSession:ge,sandboxScope:je,onTurnComplete:ee=>Z?.schedule(ee),logWarrantDenied:W,serviceUserIfPermitted:fA})}catch(ee){console.error(`${L.COLORS.yellow}Warning:${L.COLORS.reset} Gateway bridge failed: ${ee instanceof Error?ee.message:String(ee)}`)}}fa=!0})()});let Lp=!1,Mp=()=>{Lp||(Lp=!0,fa=!1,console.log(`
|
|
527
527
|
Shutting down...`),(async()=>{if(Z)try{await Z.flush()}catch{}if(da){try{await da.unregisterAgent(i)}catch{}da=null}if(_e)try{await _e.close()}catch{}if(ut)try{await ut.close()}catch{}if(uo)try{await uo.flush()}catch{}Dp.close(()=>{an.dispose(),process.exit(0)}),setTimeout(()=>{an.dispose(),process.exit(0)},1e4).unref()})())};process.on("SIGINT",Mp),process.on("SIGTERM",Mp)}async function Fy(t){let e=await(0,he.readBodyWithCap)(t);try{return JSON.parse(e)}catch{throw new Error("Invalid JSON")}}async function OD(t,e,n,r,s,i,o,a,c,l){let f=await t.run({engineId:qy(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:c,permissions:a,turnEnv:l});return{success:f.success,text:f.text,thinking:f.thinking||void 0,tool_calls:f.toolCalls,error:f.error}}function Vy(t,e,n="session",r=!1){if(r&&e){let a=`gateway-${e}`;return{sessionKey:`${a}--${(0,Gy.randomUUID)()}`,sandboxKey:a,outboundKey:t.sessionId?.trim()||t.gatewaySessionKey?.trim()||a,durable:!1}}let s=e?`u${(0,he.userNamespaceHash)(e)}`:void 0,i=t.sessionId?.trim()||t.gatewaySessionKey?.trim();if(i){let a=e?`u${(0,he.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,Gy.randomUUID)()}`;return{sessionKey:o,sandboxKey:o,outboundKey:o,durable:!1}}async function Wy(t){let e=async r=>{try{await t.emitter?.text(r),await t.emitter?.done()}catch{}};if(!t.rateLimiter.tryConsume(t.rlKey))return await e(he.RATE_LIMIT_BUSY_MESSAGE),{success:!1,error:"rate_limited"};let n=await t.turnGate.acquire();if(!n)return t.warnGateReject(`TurnGate: rejecting gateway turn (inflight=${t.turnGate.inflight} queued=${t.turnGate.queued} max=${t.turnGate.max})`),await e(he.TURN_GATE_BUSY_MESSAGE),{success:!1,error:"busy"};try{return t.trackSession!==!1&&!t.turnLimiter.tryConsume(t.sessionKey)?(await e(he.TURN_LIMIT_BUSY_MESSAGE),{success:!1,error:"turn_limit"}):await t.run()}finally{n()}}async function ID(t){let{GatewayBridge:e}=await Promise.resolve().then(()=>Sn(Dy())),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)=>Ky(t,o,a)}),console.log(`${L.COLORS.green}\u2713${L.COLORS.reset} Gateway bridge: registered "${t.gatewayAgentId}" at ${r}`),console.log(`${L.COLORS.dim} Gateway outbound routes: ${t.workspace}/.agent-hippo/sessions/<sessionKey>/gateway-outbound.json${L.COLORS.reset}`),console.log(`${L.COLORS.dim} openclaw agent --agent ${t.gatewayAgentId} --message "\u2026"${L.COLORS.reset}`),i}async function Ky(t,e,n){let r=n.engineId?.trim().toLowerCase(),s=r==="custom"?t.engine:r||t.engine,i=(0,he.peerToUserId)(n.peerInfo),o=i?void 0:await t.serviceUserIfPermitted?.(),a=i??o,{sessionKey:c,sandboxKey:l,outboundKey:f,durable:u}=Vy(n,a,t.sandboxScope,!!o);return Wy({rateLimiter:t.rateLimiter,turnLimiter:t.turnLimiter,turnGate:t.turnGate,warnGateReject:t.warnGateReject,rlKey:a??"gateway",sessionKey:c,trackSession:u,emitter:n.emitter,run:async()=>{u&&await t.prepareSession(c);let d=a?.trim()?await t.registerTurn({userId:a.trim(),sessionKey:c,egressStoreKey:f}):null;try{let p=await(0,zc.runWithCredential)({userId:a},()=>t.runner.run({engineId:s,modelId:t.defaultModel,message:e,workspaceRoot:t.workspace,sessionId:c,sandboxKey:l,gatewaySessionKey:f,analyticsUserId:a,emitter:n.emitter,permissions:t.permissions,turnEnv:d?.env}),{onDenied:t.logWarrantDenied(c)});return u&&t.onTurnComplete?.(c),{success:p.success,error:p.error}}finally{await d?.release()}}})}async function PD(t,e,n){let{createAgentIDEGatewayClient:r}=await Promise.resolve().then(()=>Sn(Vc())),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,f;if(e.trim()==="*"){let d=await(0,af.fetchMeetAgentChannelContext)(o.request.bind(o));c=d.rows.map(p=>p.id),f=d.statusPayload}else{let d=(0,af.parseChannelBindSpecs)(e);c=d.map(p=>p.channelId),l=Object.fromEntries(d.filter(p=>p.accountId).map(p=>[p.channelId,p.accountId])),Object.keys(l).length===0&&(l=void 0)}if(c.length===0){console.log(`${L.COLORS.yellow}Warning:${L.COLORS.reset} No channels to bind.`);return}let u=await(0,af.applyAgentChannelBindingsViaConfigPatch)(o.request.bind(o),{agentId:t,selectedChannelIds:c,channelAccountOverrides:l,statusPayload:f});console.log(u?`${L.COLORS.green}\u2713${L.COLORS.reset} Bound ${t} to: ${c.join(", ")}`:`${L.COLORS.dim}Slack already bound to ${t}; skipped config.patch${L.COLORS.reset}`)}finally{o.close()}}async function ND(t,e,n,r,s,i,o,a,c,l,f){let u=!1,d=(m,h)=>{u||c.writableEnded||c.write(`data: ${JSON.stringify({type:m,...h})}
|
|
528
528
|
|
|
529
529
|
`)},p=()=>{u||(u=!0,c.end())},g={async thinking(m){d("thinking",{delta:m})},async text(m){d("text",{delta:m})},async toolStart(m,h,E){d("tool_start",{name:m,input:h,tool_call_id:E})},async toolEnd(m,h,E,y){d("tool_end",{name:m,tool_call_id:h,result:E,is_error:y})},async progress(m){d("progress",{message:m})},async question(m){return d("question",{payload:m}),{selected:[],freeText:null,declined:!0}},async error(m){d("error",{message:m})},async done(){d("done",{}),p()}};try{let m=await t.run({engineId:qy(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:l,emitter:g,permissions:a,turnEnv:f});!m.success&&!u&&d("error",{message:m.error??"refused by policy"}),u||(d("done",{}),p())}catch(m){d("error",{message:m instanceof Error?m.message:"Unknown error"}),p()}}function qy(t,e){let n=t?.trim().toLowerCase();return!n||n==="custom"?e:n}});var t_=T(Qc=>{"use strict";Object.defineProperty(Qc,"__esModule",{value:!0});Qc.createDataPlaneAuditSink=e_;Qc.dataPlaneSidecarCommand=$D;var Jy=require("fs"),RD=ci(),Xy=Hc(),zy=Fr(),Zy=bo(),CD=Ri(),kD=Qs(),Qy=ai(),qi=qn();async function e_(t,e){let{dir:n,ephemeral:r}=(0,zy.resolveStateDir)(t),s=(0,zy.resolveAnalyticsSessionsDir)(n,r),i=!0,o;try{await Jy.promises.mkdir(s,{recursive:!0}),await Jy.promises.access(s)}catch(l){i=!1,o=l instanceof Error?l.message:String(l)}let a=new Zy.SessionEventWriter(s);return{audit:(l,f,u)=>{let d=typeof u.userId=="string"?u.userId:void 0,p=(0,CD.hashIdentity)(d),g=p?{...u,userId:p}:u,m=p&&l===d?p:l;a.append(m,(0,kD.generateRequestId)(),f,e?{...g,agent:{...e,digest:null}}:g)},auditDir:s,ephemeral:r,ok:i,error:o}}async function $D(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,RD.loadAgentPack)(t.agent,t.workspace)}catch(d){console.error(`Error: ${d instanceof Error?d.message:d}`),process.exit(1);return}let r=(0,Xy.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 Qy.ConsoleLogger("[Sidecar]"):new Qy.NoOpLogger,{audit:i,auditDir:o,ephemeral:a,ok:c,error:l}=await e_(t.stateDir,{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"});if(!c){let d=`${o}: ${l}`;if((0,Zy.evidenceRequired)()){console.error(`${qi.COLORS.red}Error: data-plane audit directory is not writable${qi.COLORS.reset} \u2014 ${d}`),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(`${qi.COLORS.yellow}Warning:${qi.COLORS.reset} data-plane audit directory is not writable \u2014 ${d}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set --state-dir or AGENTHIPPO_HOME to a writable path.")}let f;try{f=await(0,Xy.startDataPlaneSidecar)({config:r,registerToken:e,gatewayPort:t.gatewayPort,controlPort:t.controlPort,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(d){console.error(`${qi.COLORS.red}Error: failed to start the data-plane sidecar:${qi.COLORS.reset} ${d instanceof Error?d.message:d}`),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): ${f.gatewayUrl}`),console.log(` control (edge/serve registers, bearer): :${f.controlPort}`),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 u=()=>{f.close().finally(()=>process.exit(0))};process.on("SIGINT",u),process.on("SIGTERM",u),await new Promise(()=>{})}});var cf=T(er=>{"use strict";var DD=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]})),LD=er&&er.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),MD=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"&&DD(n,e,r[s]);return LD(n,e),n}})();Object.defineProperty(er,"__esModule",{value:!0});er.signJwt=GD;er.verifyJwt=UD;er.extractBearerToken=HD;er.looksLikeJwt=jD;var r_=MD(require("crypto"));function n_(t){return(typeof t=="string"?Buffer.from(t,"utf8"):t).toString("base64url")}function GD(t,e,n){let r={alg:"HS256",typ:"JWT"},s=Math.floor(Date.now()/1e3),i={...t,iat:s,exp:s+n},o=n_(JSON.stringify(r)),a=n_(JSON.stringify(i)),c=r_.createHmac("sha256",e).update(`${o}.${a}`).digest("base64url");return`${o}.${a}.${c}`}function UD(t,e){let n=t.split(".");if(n.length!==3)return;let[r,s,i]=n,o=r_.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 HD(t){return t?.trim()&&/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||void 0}function jD(t){return t.split(".").length===3}});var s_=T(Kr=>{"use strict";var xD=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]})),BD=Kr&&Kr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),df=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"&&xD(n,e,r[s]);return BD(n,e),n}})();Object.defineProperty(Kr,"__esModule",{value:!0});Kr.AuthBrokerStore=void 0;var lf=df(require("crypto")),Yi=df(require("fs")),FD=df(require("path")),VD=Uo(),WD=cf(),uf=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(!Yi.existsSync(e))return;let n=Yi.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=FD.dirname(this.persistPath);Yi.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{Yi.writeFileSync(i,JSON.stringify(s,null,2),"utf8"),Yi.renameSync(i,this.persistPath)}catch(o){try{Yi.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,VD.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_${lf.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=lf.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=lf.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,WD.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"}}:{}}}};Kr.AuthBrokerStore=uf});var a_=T(Ir=>{"use strict";var KD=Ir&&Ir.__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]})),qD=Ir&&Ir.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),YD=Ir&&Ir.__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 qD(n,e),n}})();Object.defineProperty(Ir,"__esModule",{value:!0});Ir.generateCodeVerifier=JD;Ir.codeChallengeFromVerifier=o_;Ir.verifyPkceChallenge=XD;var ff=YD(require("crypto")),i_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";function JD(t=64){let e=ff.randomBytes(t),n="";for(let r=0;r<t;r++)n+=i_[e[r]%i_.length];return n}function o_(t){return ff.createHash("sha256").update(t).digest("base64url")}function XD(t,e){let n=Buffer.from(o_(t)),r=Buffer.from(e);return n.length===r.length&&ff.timingSafeEqual(n,r)}});var pf=T(tr=>{"use strict";Object.defineProperty(tr,"__esModule",{value:!0});tr.AUTH_CALLBACK_PATH=tr.AUTH_EXTENSION_AUTHORITY=tr.AUTH_SCOPES=tr.AUTH_CLIENT_ID=tr.AUTH_PROVIDER_ID=void 0;tr.AUTH_PROVIDER_ID="agenthippo";tr.AUTH_CLIENT_ID="agenthippo-ide";tr.AUTH_SCOPES=["openid","profile","email","agenthippo:ide"];tr.AUTH_EXTENSION_AUTHORITY="agenthippo.agenthippo";tr.AUTH_CALLBACK_PATH="/auth/callback"});var l_=T(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.parseAuthCallback=c_;Ji.parseAuthCallbackFromText=zD;Ji.isAuthCallbackParts=QD;Ji.parseAuthCallbackFromLoopbackUrl=ZD;var Zc=pf();function c_(t,e){if(t.authority!==Zc.AUTH_EXTENSION_AUTHORITY||t.path!==Zc.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 zD(t,e){let n=t.trim();if(n)try{let r=new URL(n);return c_({authority:r.host,path:r.pathname,query:r.search.replace(/^\?/,"")},e)}catch{return}}function QD(t,e){return t===Zc.AUTH_EXTENSION_AUTHORITY&&e===Zc.AUTH_CALLBACK_PATH}function ZD(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 p_=T($n=>{"use strict";var eL=$n&&$n.__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]})),tL=$n&&$n.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ef=$n&&$n.__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"&&eL(n,e,r[s]);return tL(n,e),n}})();Object.defineProperty($n,"__esModule",{value:!0});$n.hasTrustedProxyProof=void 0;$n.isAllowedRedirectUri=d_;$n.createAuthBrokerServer=f_;$n.startAuthBrokerServer=fL;var nL=Ef(require("http")),rL=Ef(require("crypto")),Xo=require("url"),sL=Ef(require("path")),Jo=Uo(),iL=s_(),oL=a_(),el=cf(),tl=pf(),aL=l_(),gf=Fr();function d_(t){let e;try{e=new Xo.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,aL.isAuthCallbackParts)(e.host,e.pathname)}var cL=Fr();Object.defineProperty($n,"hasTrustedProxyProof",{enumerable:!0,get:function(){return cL.hasTrustedProxyProof}});function Ae(t,e,n){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(n))}function lL(t){let e=t.indexOf("@");return e<=0?t:`${t[0]}***@${t.slice(e+1)}`}var uL=64*1024;async function hf(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>uL){let i=new Error("Request body too large");throw i.status=413,i}e.push(s)}return Buffer.concat(e).toString("utf8")}function mf(t){let e=new URLSearchParams(t),n={};for(let[r,s]of e.entries())n[r]=s;return n}function u_(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 dL(t,e,n){try{let r=new Xo.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 f_(t){let e=t??(0,Jo.loadAuthBrokerConfig)();if(!e.devMode&&e.jwtSecret===Jo.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.
|
|
@@ -531,21 +531,21 @@ Shutting down...`),(async()=>{if(Z)try{await Z.flush()}catch{}if(da){try{await d
|
|
|
531
531
|
2. Set it here: AGENTHIPPO_AUTH_PROXY_SECRET=<secret>
|
|
532
532
|
3. Have the proxy send it, e.g. in the Caddyfile:
|
|
533
533
|
header_up ${Jo.AUTH_PROXY_SECRET_HEADER} {env.AGENTHIPPO_AUTH_PROXY_SECRET}
|
|
534
|
-
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?sL.join(e.dataDir,"auth-store.json"):void 0,r=new iL.AuthBrokerStore(e,n),s=new gf.RateLimiter(e.rateLimitPerMin),i=(m,h={})=>{let E=Object.entries(h).filter(([,y])=>y!==void 0&&y!=="").map(([y,w])=>{let P=!e.logPii&&typeof w=="string"&&w.includes("@")?lL(w):w;return`${y}=${P}`}).join(" ");console.log(`[auth-broker] ${m}${E?" "+E:""}`)},o=1e4,a=2048,c=new Map,l=5e3,f=0;function u(m){let h=(0,el.extractBearerToken)(m.headers.authorization)||u_(m.headers.cookie,e.cookieName);if(!h)return;let E=rL.createHash("sha256").update(h).digest("hex"),y=c.get(E);if(y){if(y.exp>Date.now())return y.user;c.delete(E)}let w=(0,el.verifyJwt)(h,e.jwtSecret);if(!w?.sub||!w.email)return;let P=r.getUser(String(w.sub));if(!P){let b=typeof w.team_id=="string"&&w.team_id?w.team_id:void 0;P={id:String(w.sub),email:String(w.email),displayName:typeof w.name=="string"&&w.name?w.name:String(w.email),teamId:b??(e.teamConfigured?e.team.id:void 0)}}if(w.exp){let b=Math.min(w.exp*1e3,Date.now()+o);if(c.size>=a){let v=Date.now();for(let[A,S]of c)S.exp<v&&c.delete(A);c.size>=a&&c.clear()}c.set(E,{user:P,exp:b})}return P}let d=m=>{let h=(m.headers["x-auth-request-email"]||"").trim().toLowerCase();if(h)return e.devMode||!e.proxySecret&&e.trustProxyHeadersUnverified||(0,gf.hasTrustedProxyProof)(m.headers,e.proxySecret)?h:null},p=(m,h,E)=>{i("proxy_header.unverified",{ip:h,path:E}),Ae(m,401,{error:"unauthorized",error_description:`X-Auth-Request-Email was present without a valid ${Jo.AUTH_PROXY_SECRET_HEADER} header. Only the trusted reverse proxy may assert an identity to this broker.`})},g=nL.createServer(async(m,h)=>{try{let E=m.headers.host||`127.0.0.1:${e.port}`,y=new Xo.URL(m.url||"/",`http://${E}`),w=y.pathname,P=(0,gf.clientIp)(m),b=()=>s.tryConsume(P)?!1:(i("rate_limited",{ip:P,path:w}),h.writeHead(429,{"Content-Type":"application/json","Retry-After":String(s.retryAfterSeconds(P))}),h.end(JSON.stringify({error:"rate_limited"})),!0);if(m.method==="GET"&&(w==="/health"||w==="/api/ide/health")){Ae(h,200,{status:"ok",service:"auth-broker"});return}if(m.method==="GET"&&w==="/oauth/authorize"){if(b())return;let A=y.searchParams.get("client_id")||"",S=y.searchParams.get("redirect_uri")||"",I=y.searchParams.get("code_challenge")||"",U=y.searchParams.get("state")||"",O=y.searchParams.get("login_hint")||y.searchParams.get("email")||"";if(A!==tl.AUTH_CLIENT_ID||!S||!I){i("authorize.invalid_request",{client_id:A}),Ae(h,400,{error:"invalid_request"});return}if(!d_(S)){i("authorize.invalid_redirect_uri",{client_id:A}),Ae(h,400,{error:"invalid_request",error_description:"redirect_uri not allowed"});return}if(e.devMode&&O){let me=r.upsertUser(O),z=r.createAuthCode({userId:me.id,clientId:A,redirectUri:S,codeChallenge:I});i("authorize.dev",{user:me.email});let Pe=new Xo.URL(S);Pe.searchParams.set("code",z),U&&Pe.searchParams.set("state",U),h.writeHead(302,{Location:Pe.toString()}),h.end();return}let F=d(m);if(F===null){p(h,P,w);return}if(!F){Ae(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let re=r.upsertUser(F),W=r.createAuthCode({userId:re.id,clientId:A,redirectUri:S,codeChallenge:I});i("authorize.signin",{user:re.email});let pe=new Xo.URL(S);pe.searchParams.set("code",W),U&&pe.searchParams.set("state",U),h.writeHead(302,{Location:pe.toString()}),h.end();return}if(m.method==="GET"&&w==="/oauth/browser-login"){if(b())return;let A=d(m);if(A===null){p(h,P,w);return}if(!A){Ae(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let S=r.upsertUser(A),I=r.issueTokens(S,tl.AUTH_CLIENT_ID,"openid profile email agenthippo:ide");i("browser.login",{user:S.email});let U=e.publicBaseUrl.startsWith("https"),O=[`${e.cookieName}=${I.accessToken}`,"Path=/","HttpOnly","SameSite=Lax",...U?["Secure"]:[],...e.cookieDomain?[`Domain=${e.cookieDomain}`]:[],`Max-Age=${I.expiresIn}`],F=dL(y.searchParams.get("return_to")||"",e.cookieDomain,e.publicBaseUrl||"/");h.writeHead(302,{"Set-Cookie":O.join("; "),Location:F}),h.end();return}if(m.method==="POST"&&w==="/oauth/dev/login"){if(b())return;if(!e.devMode){Ae(h,404,{error:"not_found"});return}let A=await hf(m),S=A.trim().startsWith("{")?JSON.parse(A):mf(A),I=S.email?.trim(),U=S.code_challenge?.trim(),O=S.redirect_uri?.trim(),F=S.client_id?.trim()||tl.AUTH_CLIENT_ID;if(!I||!U||!O){Ae(h,400,{error:"invalid_request"});return}let re=r.upsertUser(I),W=r.createAuthCode({userId:re.id,clientId:F,redirectUri:O,codeChallenge:U});i("dev.login",{user:re.email}),Ae(h,200,{code:W});return}if(m.method==="POST"&&w==="/oauth/token"){if(b())return;let A=await hf(m),S=mf(A),I=S.grant_type,U=S.client_id||tl.AUTH_CLIENT_ID,O=S.scope||"openid profile email agenthippo:ide";if(I==="authorization_code"){let F=S.code,re=S.code_verifier,W=S.redirect_uri;if(!F||!re||!W){Ae(h,400,{error:"invalid_request"});return}let pe=r.consumeAuthCode(F);if(!pe||pe.clientId!==U||pe.redirectUri!==W){Ae(h,400,{error:"invalid_grant"});return}if(!(0,oL.verifyPkceChallenge)(re,pe.codeChallenge)){Ae(h,400,{error:"invalid_grant",error_description:"PKCE verification failed"});return}let me=r.getUser(pe.userId);if(!me){Ae(h,400,{error:"invalid_grant"});return}let z=r.issueTokens(me,U,O);i("token.signin",{user:me.email,client_id:U}),Ae(h,200,{access_token:z.accessToken,refresh_token:z.refreshToken,token_type:"Bearer",expires_in:z.expiresIn,scope:O});return}if(I==="refresh_token"){let F=S.refresh_token;if(!F){Ae(h,400,{error:"invalid_request"});return}let re=r.consumeRefreshToken(F);if(!re||re.clientId!==U){i("token.refresh.invalid_grant"),Ae(h,400,{error:"invalid_grant"});return}let W=r.getUser(re.userId);if(!W){Ae(h,400,{error:"invalid_grant"});return}let pe=r.issueTokens(W,U,O);i("token.refresh",{user:W.email}),Ae(h,200,{access_token:pe.accessToken,refresh_token:pe.refreshToken,token_type:"Bearer",expires_in:pe.expiresIn,scope:O});return}Ae(h,400,{error:"unsupported_grant_type"});return}if(m.method==="POST"&&w==="/oauth/introspect"){if(!u(m)){i("introspect.unauthorized"),Ae(h,401,{error:"unauthorized"});return}let A=await hf(m),I=mf(A).token;if(!I){Ae(h,400,{error:"invalid_request"});return}let U=(0,el.verifyJwt)(I,e.jwtSecret);if(!U?.sub){Ae(h,200,{active:!1});return}Ae(h,200,{active:!0,sub:U.sub,email:U.email,team_id:U.team_id,scope:U.scope,exp:U.exp});return}let v=u(m);if(m.method==="GET"&&w==="/api/ide/me"){if(!v){let S=Date.now();S-f>l&&(f=S,i("me.unauthorized")),Ae(h,401,{error:"unauthorized"});return}h.setHeader("X-Agent-User",v.email||v.id);let A=(0,el.extractBearerToken)(m.headers.authorization)||u_(m.headers.cookie,e.cookieName);A&&h.setHeader("X-Agent-User-Assertion",A),Ae(h,200,r.buildMe(v));return}if(m.method==="GET"&&w==="/api/ide/bootstrap"){if(!v){Ae(h,401,{error:"unauthorized"});return}Ae(h,200,r.buildBootstrap(v));return}if(m.method==="POST"&&w==="/api/ide/signout"){v&&(r.revokeRefreshTokensForUser(v.id),i("signout",{user:v.email})),Ae(h,200,{ok:!0});return}Ae(h,404,{error:"not_found"})}catch(E){let y=E.status;if(y===413){Ae(h,413,{error:"request_entity_too_large"});return}if(y===403){i("forbidden",{reason:"email_domain"}),Ae(h,403,{error:"forbidden",error_description:"email domain not allowed"});return}console.error("[auth-broker] internal error",E),Ae(h,500,{error:"server_error"})}});return{server:g,baseUrl:e.publicBaseUrl,store:r,config:e,close:()=>new Promise((m,h)=>{g.close(E=>E?h(E):m())})}}async function fL(t){let e=f_(t),n=(0,Jo.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 g_=T(yf=>{"use strict";Object.defineProperty(yf,"__esModule",{value:!0});yf.authBrokerCommand=hL;var pL=Uo(),gL=p_();async function hL(){let t=(0,pL.loadAuthBrokerConfig)(),e=await(0,gL.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 wf=T(Pr=>{"use strict";Object.defineProperty(Pr,"__esModule",{value:!0});Pr.EDGE_AGENT_PORT=void 0;Pr.renderIdentityLayer=_f;Pr.renderSidecarEdgeCaddyfile=mL;Pr.renderSidecarFedCaddyfile=EL;var h_=[" # 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 _f(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(p=>p.trim()?` ${p}`:p),f=(d,p)=>a?[" route {",...l(d),...c,...l(p)," }"]:[...d,...p],u=[];if(a&&u.push(" # Hygiene: never let a client-supplied nonce header through (copy_headers overwrites it"," # on chat paths anyway, and a forged nonce fails closed at the gateway \u2014 belt-and-braces)."," request_header -X-Agent-Turn-Nonce"," # Same for the user assertion: it is set from the verified /api/ide/me response below,"," # never from the client. A forged one would become the turn's inboundToken."," request_header -X-Agent-User-Assertion"),e==="self-issued"&&u.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={http.request.uri}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...h_," }"," }"," # 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={http.request.uri}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...h_," }"," }"," # 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}"," }"," }"),u.push(" handle /api/ide/* {",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),e==="self-issued"&&u.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}"," }"," }"),u.push(" @health path /health /ready"," handle @health {",...r," }"),a&&u.push(" # Chat-turn matcher for edge turn registration (P1 fix): only POST chat turns register."," @turnStart {"," method POST"," path /v1/chat /v1/chat/stream"," }"),u.push(" # API clients (IDE) with a Bearer token: validate via auth-broker, copy identity header."," @apiWithAuth {"," path /v1/*"," header Authorization *"," }"," handle @apiWithAuth {",...f([` 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")u.push(" # Browser clients: SSO via oauth2-proxy, identity injected as X-Agent-User."," handle {",...f([` 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={http.request.uri}"'," }"," }"],o)," }");else{let d=t.idpUrl?.trim()||"",p=d?` redir * "${d}/oauth/browser-login?return_to=https://{http.request.host}{http.request.uri}" 302`:' respond "Unauthorized" 401';u.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 {",...f([` 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 u}Pr.EDGE_AGENT_PORT=8090;function mL(){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} {",..._f({mode:"self-issued",oauth2ProxyAddr:"localhost:4180",authBrokerAddr:"localhost:9780",healthProxy:[` reverse_proxy localhost:${Pr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${Pr.EDGE_AGENT_PORT}`]}),"}",""].join(`
|
|
534
|
+
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?sL.join(e.dataDir,"auth-store.json"):void 0,r=new iL.AuthBrokerStore(e,n),s=new gf.RateLimiter(e.rateLimitPerMin),i=(m,h={})=>{let E=Object.entries(h).filter(([,y])=>y!==void 0&&y!=="").map(([y,w])=>{let P=!e.logPii&&typeof w=="string"&&w.includes("@")?lL(w):w;return`${y}=${P}`}).join(" ");console.log(`[auth-broker] ${m}${E?" "+E:""}`)},o=1e4,a=2048,c=new Map,l=5e3,f=0;function u(m){let h=(0,el.extractBearerToken)(m.headers.authorization)||u_(m.headers.cookie,e.cookieName);if(!h)return;let E=rL.createHash("sha256").update(h).digest("hex"),y=c.get(E);if(y){if(y.exp>Date.now())return y.user;c.delete(E)}let w=(0,el.verifyJwt)(h,e.jwtSecret);if(!w?.sub||!w.email)return;let P=r.getUser(String(w.sub));if(!P){let b=typeof w.team_id=="string"&&w.team_id?w.team_id:void 0;P={id:String(w.sub),email:String(w.email),displayName:typeof w.name=="string"&&w.name?w.name:String(w.email),teamId:b??(e.teamConfigured?e.team.id:void 0)}}if(w.exp){let b=Math.min(w.exp*1e3,Date.now()+o);if(c.size>=a){let v=Date.now();for(let[A,S]of c)S.exp<v&&c.delete(A);c.size>=a&&c.clear()}c.set(E,{user:P,exp:b})}return P}let d=m=>{let h=(m.headers["x-auth-request-email"]||"").trim().toLowerCase();if(h)return e.devMode||!e.proxySecret&&e.trustProxyHeadersUnverified||(0,gf.hasTrustedProxyProof)(m.headers,e.proxySecret)?h:null},p=(m,h,E)=>{i("proxy_header.unverified",{ip:h,path:E}),Ae(m,401,{error:"unauthorized",error_description:`X-Auth-Request-Email was present without a valid ${Jo.AUTH_PROXY_SECRET_HEADER} header. Only the trusted reverse proxy may assert an identity to this broker.`})},g=nL.createServer(async(m,h)=>{try{let E=m.headers.host||`127.0.0.1:${e.port}`,y=new Xo.URL(m.url||"/",`http://${E}`),w=y.pathname,P=(0,gf.clientIp)(m),b=()=>s.tryConsume(P)?!1:(i("rate_limited",{ip:P,path:w}),h.writeHead(429,{"Content-Type":"application/json","Retry-After":String(s.retryAfterSeconds(P))}),h.end(JSON.stringify({error:"rate_limited"})),!0);if(m.method==="GET"&&(w==="/health"||w==="/api/ide/health")){Ae(h,200,{status:"ok",service:"auth-broker"});return}if(m.method==="GET"&&w==="/oauth/authorize"){if(b())return;let A=y.searchParams.get("client_id")||"",S=y.searchParams.get("redirect_uri")||"",I=y.searchParams.get("code_challenge")||"",U=y.searchParams.get("state")||"",O=y.searchParams.get("login_hint")||y.searchParams.get("email")||"";if(A!==tl.AUTH_CLIENT_ID||!S||!I){i("authorize.invalid_request",{client_id:A}),Ae(h,400,{error:"invalid_request"});return}if(!d_(S)){i("authorize.invalid_redirect_uri",{client_id:A}),Ae(h,400,{error:"invalid_request",error_description:"redirect_uri not allowed"});return}if(e.devMode&&O){let me=r.upsertUser(O),z=r.createAuthCode({userId:me.id,clientId:A,redirectUri:S,codeChallenge:I});i("authorize.dev",{user:me.email});let Ne=new Xo.URL(S);Ne.searchParams.set("code",z),U&&Ne.searchParams.set("state",U),h.writeHead(302,{Location:Ne.toString()}),h.end();return}let F=d(m);if(F===null){p(h,P,w);return}if(!F){Ae(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let se=r.upsertUser(F),W=r.createAuthCode({userId:se.id,clientId:A,redirectUri:S,codeChallenge:I});i("authorize.signin",{user:se.email});let pe=new Xo.URL(S);pe.searchParams.set("code",W),U&&pe.searchParams.set("state",U),h.writeHead(302,{Location:pe.toString()}),h.end();return}if(m.method==="GET"&&w==="/oauth/browser-login"){if(b())return;let A=d(m);if(A===null){p(h,P,w);return}if(!A){Ae(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let S=r.upsertUser(A),I=r.issueTokens(S,tl.AUTH_CLIENT_ID,"openid profile email agenthippo:ide");i("browser.login",{user:S.email});let U=e.publicBaseUrl.startsWith("https"),O=[`${e.cookieName}=${I.accessToken}`,"Path=/","HttpOnly","SameSite=Lax",...U?["Secure"]:[],...e.cookieDomain?[`Domain=${e.cookieDomain}`]:[],`Max-Age=${I.expiresIn}`],F=dL(y.searchParams.get("return_to")||"",e.cookieDomain,e.publicBaseUrl||"/");h.writeHead(302,{"Set-Cookie":O.join("; "),Location:F}),h.end();return}if(m.method==="POST"&&w==="/oauth/dev/login"){if(b())return;if(!e.devMode){Ae(h,404,{error:"not_found"});return}let A=await hf(m),S=A.trim().startsWith("{")?JSON.parse(A):mf(A),I=S.email?.trim(),U=S.code_challenge?.trim(),O=S.redirect_uri?.trim(),F=S.client_id?.trim()||tl.AUTH_CLIENT_ID;if(!I||!U||!O){Ae(h,400,{error:"invalid_request"});return}let se=r.upsertUser(I),W=r.createAuthCode({userId:se.id,clientId:F,redirectUri:O,codeChallenge:U});i("dev.login",{user:se.email}),Ae(h,200,{code:W});return}if(m.method==="POST"&&w==="/oauth/token"){if(b())return;let A=await hf(m),S=mf(A),I=S.grant_type,U=S.client_id||tl.AUTH_CLIENT_ID,O=S.scope||"openid profile email agenthippo:ide";if(I==="authorization_code"){let F=S.code,se=S.code_verifier,W=S.redirect_uri;if(!F||!se||!W){Ae(h,400,{error:"invalid_request"});return}let pe=r.consumeAuthCode(F);if(!pe||pe.clientId!==U||pe.redirectUri!==W){Ae(h,400,{error:"invalid_grant"});return}if(!(0,oL.verifyPkceChallenge)(se,pe.codeChallenge)){Ae(h,400,{error:"invalid_grant",error_description:"PKCE verification failed"});return}let me=r.getUser(pe.userId);if(!me){Ae(h,400,{error:"invalid_grant"});return}let z=r.issueTokens(me,U,O);i("token.signin",{user:me.email,client_id:U}),Ae(h,200,{access_token:z.accessToken,refresh_token:z.refreshToken,token_type:"Bearer",expires_in:z.expiresIn,scope:O});return}if(I==="refresh_token"){let F=S.refresh_token;if(!F){Ae(h,400,{error:"invalid_request"});return}let se=r.consumeRefreshToken(F);if(!se||se.clientId!==U){i("token.refresh.invalid_grant"),Ae(h,400,{error:"invalid_grant"});return}let W=r.getUser(se.userId);if(!W){Ae(h,400,{error:"invalid_grant"});return}let pe=r.issueTokens(W,U,O);i("token.refresh",{user:W.email}),Ae(h,200,{access_token:pe.accessToken,refresh_token:pe.refreshToken,token_type:"Bearer",expires_in:pe.expiresIn,scope:O});return}Ae(h,400,{error:"unsupported_grant_type"});return}if(m.method==="POST"&&w==="/oauth/introspect"){if(!u(m)){i("introspect.unauthorized"),Ae(h,401,{error:"unauthorized"});return}let A=await hf(m),I=mf(A).token;if(!I){Ae(h,400,{error:"invalid_request"});return}let U=(0,el.verifyJwt)(I,e.jwtSecret);if(!U?.sub){Ae(h,200,{active:!1});return}Ae(h,200,{active:!0,sub:U.sub,email:U.email,team_id:U.team_id,scope:U.scope,exp:U.exp});return}let v=u(m);if(m.method==="GET"&&w==="/api/ide/me"){if(!v){let S=Date.now();S-f>l&&(f=S,i("me.unauthorized")),Ae(h,401,{error:"unauthorized"});return}h.setHeader("X-Agent-User",v.email||v.id);let A=(0,el.extractBearerToken)(m.headers.authorization)||u_(m.headers.cookie,e.cookieName);A&&h.setHeader("X-Agent-User-Assertion",A),Ae(h,200,r.buildMe(v));return}if(m.method==="GET"&&w==="/api/ide/bootstrap"){if(!v){Ae(h,401,{error:"unauthorized"});return}Ae(h,200,r.buildBootstrap(v));return}if(m.method==="POST"&&w==="/api/ide/signout"){v&&(r.revokeRefreshTokensForUser(v.id),i("signout",{user:v.email})),Ae(h,200,{ok:!0});return}Ae(h,404,{error:"not_found"})}catch(E){let y=E.status;if(y===413){Ae(h,413,{error:"request_entity_too_large"});return}if(y===403){i("forbidden",{reason:"email_domain"}),Ae(h,403,{error:"forbidden",error_description:"email domain not allowed"});return}console.error("[auth-broker] internal error",E),Ae(h,500,{error:"server_error"})}});return{server:g,baseUrl:e.publicBaseUrl,store:r,config:e,close:()=>new Promise((m,h)=>{g.close(E=>E?h(E):m())})}}async function fL(t){let e=f_(t),n=(0,Jo.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 g_=T(yf=>{"use strict";Object.defineProperty(yf,"__esModule",{value:!0});yf.authBrokerCommand=hL;var pL=Uo(),gL=p_();async function hL(){let t=(0,pL.loadAuthBrokerConfig)(),e=await(0,gL.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 wf=T(Pr=>{"use strict";Object.defineProperty(Pr,"__esModule",{value:!0});Pr.EDGE_AGENT_PORT=void 0;Pr.renderIdentityLayer=_f;Pr.renderSidecarEdgeCaddyfile=mL;Pr.renderSidecarFedCaddyfile=EL;var h_=[" # 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 _f(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(p=>p.trim()?` ${p}`:p),f=(d,p)=>a?[" route {",...l(d),...c,...l(p)," }"]:[...d,...p],u=[];if(a&&u.push(" # Hygiene: never let a client-supplied nonce header through (copy_headers overwrites it"," # on chat paths anyway, and a forged nonce fails closed at the gateway \u2014 belt-and-braces)."," request_header -X-Agent-Turn-Nonce"," # Same for the user assertion: it is set from the verified /api/ide/me response below,"," # never from the client. A forged one would become the turn's inboundToken."," request_header -X-Agent-User-Assertion"),e==="self-issued"&&u.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={http.request.uri}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...h_," }"," }"," # 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={http.request.uri}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...h_," }"," }"," # 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}"," }"," }"),u.push(" handle /api/ide/* {",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," }"," }"),e==="self-issued"&&u.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}"," }"," }"),u.push(" @health path /health /ready"," handle @health {",...r," }"),a&&u.push(" # Chat-turn matcher for edge turn registration (P1 fix): only POST chat turns register."," @turnStart {"," method POST"," path /v1/chat /v1/chat/stream"," }"),u.push(" # API clients (IDE) with a Bearer token: validate via auth-broker, copy identity header."," @apiWithAuth {"," path /v1/*"," header Authorization *"," }"," handle @apiWithAuth {",...f([` 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")u.push(" # Browser clients: SSO via oauth2-proxy, identity injected as X-Agent-User."," handle {",...f([` 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={http.request.uri}"'," }"," }"],o)," }");else{let d=t.idpUrl?.trim()||"",p=d?` redir * "${d}/oauth/browser-login?return_to=https://{http.request.host}{http.request.uri}" 302`:' respond "Unauthorized" 401';u.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 {",...f([` 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 u}Pr.EDGE_AGENT_PORT=8090;function mL(){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} {",..._f({mode:"self-issued",oauth2ProxyAddr:"localhost:4180",authBrokerAddr:"localhost:9780",healthProxy:[` reverse_proxy localhost:${Pr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${Pr.EDGE_AGENT_PORT}`]}),"}",""].join(`
|
|
535
535
|
`)}function EL(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} {",..._f({mode:"federated",authBrokerAddr:"localhost:9780",idpUrl:e,healthProxy:[` reverse_proxy localhost:${Pr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${Pr.EDGE_AGENT_PORT}`]}),"}",""].join(`
|
|
536
|
-
`)}});var Of=T(
|
|
536
|
+
`)}});var Of=T(Y=>{"use strict";var yL=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]})),_L=Y&&Y.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),m_=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"&&yL(n,e,r[s]);return _L(n,e),n}})();Object.defineProperty(Y,"__esModule",{value:!0});Y.DEPLOY_PUBLIC_HOSTNAME=Y.DEFAULT_DEPLOY_PUBLIC_HOSTNAME=Y.AGENTHIPPO_HIPPOCLAW_NPM=Y.AGENTHIPPO_LITELLM_IMAGE_TAG=Y.AGENTHIPPO_RUNTIME_IMAGE_TAG=Y.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK=Y.AGENTHIPPO_CLI_NPM_PACKAGE=Y.AGENTHIPPO_IMAGE_REGISTRY=Y.DEPLOY_TARGETS=void 0;Y.isDeployTarget=wL;Y.resolveCliReleaseVersion=Af;Y.resolveAgentHippoCliNpmVersion=__;Y.agenthippoImage=ys;Y.defaultRuntimeImage=AL;Y.packAttributionBody=w_;Y.packAttributionComment=Sf;Y.withPackAttribution=A_;Y.serveCmdArgs=Ei;Y.resolveDeployPublicHostname=bf;Y.scanEnvRefs=TL;Y.renderEnvExample=S_;Y.renderAuthEnvExample=b_;Y.renderAuthBrokerDockerfile=Tf;Y.renderChannelsDockerfile=T_;Y.isSecretLikeBasename=vL;Y.dataPlaneTokenEnvVar=C_;Y.renderTarget=YL;var Xi=m_(require("fs")),zi=m_(require("path")),nl=Fr(),at=wf();Y.DEPLOY_TARGETS=["vm","compose","cloudrun","databricks-app","spcs","cloudflare","aws-ecs","azure-container-apps"];function wL(t){return Y.DEPLOY_TARGETS.includes(t)}Y.AGENTHIPPO_IMAGE_REGISTRY="ghcr.io/agenthippoai";Y.AGENTHIPPO_CLI_NPM_PACKAGE="@agenthippo-ai/agenthippo";Y.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK="latest";function E_(){try{return yc()}catch{try{let t=zi.join(__dirname,"..","..","package.json");if(Xi.existsSync(t))return JSON.parse(Xi.readFileSync(t,"utf8"))}catch{}return}}function y_(t){let e=E_()?.agenthippo?.[t]?.trim();if(!e)throw new Error(`extensions/agentide/package.json agenthippo.${t} is missing`);return e}function Af(){let t=E_()?.version?.trim();if(t&&t!=="0.0.0"&&t!=="dev")return t;try{let e=zi.join(__dirname,"..","..","..","..","package.json");if(Xi.existsSync(e)){let n=JSON.parse(Xi.readFileSync(e,"utf8")).version?.trim();if(n&&n!=="0.0.0"&&n!=="dev")return n}}catch{}}function __(){return Af()??Y.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK}Y.AGENTHIPPO_RUNTIME_IMAGE_TAG=Af()??"dev";Y.AGENTHIPPO_LITELLM_IMAGE_TAG=y_("litellmImageTag");Y.AGENTHIPPO_HIPPOCLAW_NPM=y_("hippoclawNpm");function ys(t,e){let n=t==="runtime"?Y.AGENTHIPPO_RUNTIME_IMAGE_TAG:Y.AGENTHIPPO_LITELLM_IMAGE_TAG;return`${Y.AGENTHIPPO_IMAGE_REGISTRY}/${t}:${n}${e?`-${e}`:""}`}function AL(t){return t.trim().toLowerCase()==="cursor"?ys("runtime","cursor"):ys("runtime")}function w_(t){return`Generated from Agent Pack ${t.packName}@${t.packVersion} \u2014 packs.agenthippo.ai`}function Sf(t,e="hash"){let n=w_(t);return e==="html"?`<!-- ${n} -->`:e==="sql"?`-- ${n}`:`# ${n}`}function A_(t,e,n){if(n.slice(0,400).includes("packs.agenthippo.ai"))return n;let s=zi.basename(e),i=zi.extname(s).toLowerCase();if(i===".json"||i===".jsonc"||s==="wrangler.toml"||s==="package.json")return n;let a=Sf(t,i===".html"||i===".md"?"html":i===".sql"?"sql":"hash");if(n.startsWith("#!")){let c=n.indexOf(`
|
|
537
537
|
`);return c===-1?`${n}
|
|
538
538
|
${a}
|
|
539
539
|
`:`${n.slice(0,c+1)}${a}
|
|
540
540
|
${n.slice(c+1)}`}return`${a}
|
|
541
|
-
${n}`}function Ei(t,e){let n=["serve","--agent","/app/pack","--workspace","/state/workspace","--state-dir","/state","--port",String(e?.port??t.port)],r=t.engine?.trim().toLowerCase();r&&!["claude","codex"].includes(r)&&n.push("--engine",r);let s=t.model?.trim();return s&&n.push("--model",s),e?.wwwDir&&n.push("--www-dir",e.wwwDir),n}var SL=new Set([".json",".yaml",".yml",".md",".env",".example",".txt",".mcp"]),bL=new Set(["node_modules",".git","deploy",".agent-hippo","dist","out"]);
|
|
541
|
+
${n}`}function Ei(t,e){let n=["serve","--agent","/app/pack","--workspace","/state/workspace","--state-dir","/state","--port",String(e?.port??t.port)],r=t.engine?.trim().toLowerCase();r&&!["claude","codex"].includes(r)&&n.push("--engine",r);let s=t.model?.trim();return s&&n.push("--model",s),e?.wwwDir&&n.push("--www-dir",e.wwwDir),n}var SL=new Set([".json",".yaml",".yml",".md",".env",".example",".txt",".mcp"]),bL=new Set(["node_modules",".git","deploy",".agent-hippo","dist","out"]);Y.DEFAULT_DEPLOY_PUBLIC_HOSTNAME="auth.agenthippo.ai";Y.DEPLOY_PUBLIC_HOSTNAME=Y.DEFAULT_DEPLOY_PUBLIC_HOSTNAME;function bf(t){return t?.trim()||Y.DEFAULT_DEPLOY_PUBLIC_HOSTNAME}function TL(t){let e=new Set,n=/\$\{env:([A-Za-z_][A-Za-z0-9_]*)\}/g,r=s=>{let i;try{i=Xi.readdirSync(s,{withFileTypes:!0})}catch{return}for(let o of i){let a=zi.join(s,o.name);if(o.isDirectory()){bL.has(o.name)||r(a);continue}let c=zi.extname(o.name).toLowerCase();if(!SL.has(c))continue;let l;try{l=Xi.readFileSync(a,"utf8")}catch{continue}for(let f of l.matchAll(n))e.add(f[1])}};return r(t),[...e].sort()}function S_(t,e){let n=e?.engine?.trim().toLowerCase()==="cursor",r=bf(e?.hostname),s=["# Generated by `agenthippo deploy init`. Copy to .env and fill in."];if(n?s.push("# Cursor engine (pack default model: auto):","CURSOR_API_KEY= # https://cursor.com/settings \u2192 API keys"):e?.gatewayDirect?s.push("# Gateway-direct routing (agent \u2192 gateway.agenthippo.ai \u2014 no in-pod LiteLLM sidecar):","AGENTHIPPO_LITELLM_BASE_URL=https://gateway.agenthippo.ai/v1","AGENTHIPPO_LITELLM_API_KEY= # ahgw_\u2026 from create-gateway-key on the gateway host"):s.push("# Model credential \u2014 pick ONE path (serve-v3 \xA710.2):","# AgentHippo hosted gateway (colocated agents / CI \u2014 long-lived service key):","# AGENTHIPPO_LITELLM_BASE_URL=https://gateway.agenthippo.ai/v1","# AGENTHIPPO_LITELLM_API_KEY=ahgw_\u2026 # bun run create-gateway-key on gateway host","# Direct Anthropic:","ANTHROPIC_API_KEY=","# CLAUDE_CODE_USE_BEDROCK=1 # existing AWS Bedrock entitlement (no new key)","# CLAUDE_CODE_USE_VERTEX=1 # existing GCP Vertex entitlement (no new key)"),t.length>0){s.push("","# Pack-referenced secrets (scanned from ${env:...}):");for(let i of t)s.push(`${i}=`)}return e?.edge&&s.push("","# Public hostname \u2014 set once; Caddyfile reads {$AGENTHIPPO_PUBLIC_HOSTNAME}.",`AGENTHIPPO_PUBLIC_HOSTNAME=${r}`,"","# Multi-replica (serve-v4 P1): sticky by X-Agent-User in Caddyfile.","# docker compose up --scale agent=N","# AGENTHIPPO_STATE_S3_URI=s3://bucket/prefix # S3-compatible (MinIO/R2/GCS/AWS)","# AGENTHIPPO_STATE_S3_ENDPOINT= # optional, e.g. http://minio:9000","# AGENTHIPPO_STATE_RESTORE_BOOT=none # restore-on-miss (required when N>1)","# Scale-down: drain (/ready inflight=0) then remove replica \u2014 see serve-v3-RUNBOOK.","","# Edge auth secrets (JWT signing key, Google OAuth client/cookie) live in .env.auth,","# which is loaded ONLY by the auth-broker and oauth2-proxy services \u2014 never the agent.","# Keeping the token-signing key out of the agent container limits blast radius if the","# agent (which runs model-driven tool calls) is compromised. Copy .env.auth.example.","","# Cloudflare Tunnel (free \u2014 no Access seats), config-file mode in compose:","# cloudflared tunnel create <name> \u2192 save the JSON as deploy/tunnel-credentials.json (gitignored)","# set the tunnel id in deploy/cloudflared.yml; cloudflared tunnel route dns <name> <hostname>","# No token/env needed \u2014 the credentials JSON is mounted into the cloudflared container."),s.join(`
|
|
542
542
|
`)+`
|
|
543
543
|
`}function b_(t){let e=bf(t?.hostname);if(t?.fed){let r=(t.idpUrl||"https://auth.agenthippo.ai").replace(/\/+$/,""),s=t.cookieDomain||".agenthippo.ai";return["# Generated by `agenthippo deploy init --ingress edge-fed`. Copy to .env.auth and fill in.","# Federated edge (A\u2032): NO Google OAuth client here. Google login happens once at the",`# central IdP (${r}); this agent only VERIFIES the shared ${s} AgentHippo JWT.`,"# Loaded only by auth-broker. Never given to the agent (limits token-forgery blast radius).","","# AgentHippo JWT signing key \u2014 MUST match the central IdP (auth.agenthippo.ai).","# Copy it from there (or the GCP secret it stores) so tokens issued by the IdP verify here.","AGENTHIPPO_AUTH_JWT_SECRET= # copy from auth.agenthippo.ai (openssl rand -hex 32 to generate one)",`AGENTHIPPO_AUTH_PUBLIC_URL=https://${e}`,"AGENTHIPPO_AUTH_ALLOWED_DOMAINS=agenthippo.ai","AGENTHIPPO_AUTH_DEV=0 # 1 enables /oauth/dev/login (tests only; never in production)",`AGENTHIPPO_AUTH_COOKIE_DOMAIN=${s} # scope the shared cookie to all subdomains`,`AGENTHIPPO_AUTH_IDP_URL=${r} # where browsers are sent to log in`,"AGENTHIPPO_AUTH_COOKIE_NAME=ah_token","","# Team bootstrap (store + gateway routing) \u2014 same as the IdP if you want parity.","AGENTHIPPO_TEAM_ID=team_default","AGENTHIPPO_TEAM_NAME=Default Team","AGENTHIPPO_TEAM_STORE_REPO=agenthippoai/agenthippo-store","AGENTHIPPO_TEAM_STORE_INDEX_URL=https://agenthippoai.github.io/agenthippo-store","AGENTHIPPO_TEAM_GITHUB_ORG=agenthippoai","# An agenthippo-gateway deployment (JWT lane) \u2014 NOT bare LiteLLM. No key: the account","# JWT is the routing credential.","AGENTHIPPO_TEAM_GATEWAY_URL=https://gateway.agenthippo.ai/v1","","# No OAUTH2_PROXY_* here \u2014 this agent does not talk to Google. The one oauth2-proxy +","# one Google OAuth client live only at the IdP."].join(`
|
|
544
544
|
`)+`
|
|
545
545
|
`}let n=t?.cookieDomain||".agenthippo.ai";return["# Generated by `agenthippo deploy init`. Copy to .env.auth and fill in.","# Loaded only by auth-broker + oauth2-proxy (docker-compose.yml). Never given to the agent.","","# Google SSO (oauth2-proxy). GCP \u2192 OAuth client (Web):",`# Authorized origins: https://${e}`,`# Redirect URI: https://${e}/oauth2/callback`,"OAUTH2_PROXY_CLIENT_ID=","OAUTH2_PROXY_CLIENT_SECRET=","OAUTH2_PROXY_COOKIE_SECRET= # openssl rand -base64 32 | head -c 32","OAUTH2_PROXY_PROVIDER=google","OAUTH2_PROXY_EMAIL_DOMAINS=example.com","OAUTH2_PROXY_REVERSE_PROXY=true",`OAUTH2_PROXY_REDIRECT_URL=https://${e}/oauth2/callback`,"# Federated SSO (A\u2032) \u2014 set when this edge is the central IdP for a fleet of agents:",`OAUTH2_PROXY_COOKIE_DOMAINS=${n} # scope the oauth2-proxy session cookie to all subdomains`,"","# IDE auth broker (team bootstrap for store + LiteLLM routing)","AGENTHIPPO_AUTH_JWT_SECRET= # openssl rand -hex 32","AGENTHIPPO_AUTH_PUBLIC_URL=https://"+e,"AGENTHIPPO_AUTH_ALLOWED_DOMAINS=example.com","AGENTHIPPO_AUTH_DEV=0 # 1 enables /oauth/dev/login (tests only; never in production)","AGENTHIPPO_AUTH_COOKIE_NAME=ah_token # federated cookie holding the AgentHippo JWT",`AGENTHIPPO_AUTH_COOKIE_DOMAIN=${n} # set so /oauth/browser-login stamps a cross-subdomain cookie`,"AGENTHIPPO_TEAM_ID=team_default","AGENTHIPPO_TEAM_NAME=Default Team","AGENTHIPPO_TEAM_STORE_REPO=agenthippoai/agenthippo-store","AGENTHIPPO_TEAM_STORE_INDEX_URL=https://agenthippoai.github.io/agenthippo-store","AGENTHIPPO_TEAM_GITHUB_ORG=agenthippoai","# An agenthippo-gateway deployment (JWT lane) \u2014 NOT bare LiteLLM. No key: the account","# JWT is the routing credential.","AGENTHIPPO_TEAM_GATEWAY_URL=https://gateway.agenthippo.ai/v1"].join(`
|
|
546
546
|
`)+`
|
|
547
547
|
`}function Tf(){return["# Auth broker for IDE sign-in + team bootstrap API.","# Build context = pack root: docker build -f deploy/Dockerfile.auth-broker -t <pack>-auth-broker:local .",`FROM ${ys("runtime")}`,"ENV AGENTHIPPO_AUTH_PORT=9780","ENV AGENTHIPPO_AUTH_DATA_DIR=/data","EXPOSE 9780",'VOLUME ["/data"]','CMD ["auth-broker"]',""].join(`
|
|
548
|
-
`)}function T_(){return["# Agent Anywhere channels gateway \u2014 built from this pack, not pulled from GHCR.",`# Pins ${
|
|
548
|
+
`)}function T_(){return["# Agent Anywhere channels gateway \u2014 built from this pack, not pulled from GHCR.",`# Pins ${Y.AGENTHIPPO_HIPPOCLAW_NPM} (same pin as the IDE installSource default).`,"# node:22-alpine: HippoClaw requires Node 22+; apk git is needed for the npm install.","# Avoid Debian slim+apt-get (GPG failures on some Docker Desktop hosts) and full node:22 (huge).","FROM node:22-alpine","RUN apk add --no-cache git",`RUN npm i -g ${Y.AGENTHIPPO_HIPPOCLAW_NPM}`,"EXPOSE 18789",'ENTRYPOINT ["openclaw"]','CMD ["gateway"]',""].join(`
|
|
549
549
|
`)}function vL(t){return!!(/credentials/i.test(t)||/\.(pem|key|p12|pfx|jks|gpg|pgp)$/i.test(t)||/^id_(rsa|dsa|ecdsa|ed25519)$/i.test(t))}function OL(){return["# Generated by `agenthippo deploy init`. Keeps skills/, references/, scripts/","# (needed at runtime) and drops only VCS/cache/build cruft. node_modules is","# excluded so the Dockerfile reinstalls fresh linux/amd64 deps for skills.",".git",".gitignore",".gitattributes","**/node_modules","**/__pycache__","**/.pytest_cache","**/.mypy_cache","**/.ruff_cache","**/.venv","**/venv","**/*.log","**/dist","**/build","**/.next","**/.turbo","**/.cache",".DS_Store","**/.DS_Store",".idea",".vscode","*.swp","# Secrets anywhere in the pack (defensive; deploy/ secrets are also covered below).","# Keep in sync with isSecretLikeBasename() above.","**/.env","**/.env.*","**/*credentials*","**/*.pem","**/*.key","**/*.p12","**/*.pfx","**/*.jks","**/*.gpg","**/*.pgp","**/id_rsa","**/id_dsa","**/id_ecdsa","**/id_ed25519","# \u2026but *.example templates are safe and are what the README tells customers to copy.","!**/.env.example","!**/.env.*.example","# deploy/ holds build/deploy artifacts + secrets; only deploy/www/ ships at runtime.","deploy/*","!deploy/www","!deploy/www/**",""].join(`
|
|
550
550
|
`)}function IL(){return["# Skill dependencies \u2014 installed at BUILD time so skills that ship their own","# requirements.txt / package.json have their libs present at runtime","# (AGENTHIPPO_NO_AUTO_INSTALL=1 skips runtime installs). No-op when none exist.","USER root","RUN set -e; \\",' py_reqs=$(find /app/pack/skills /app/pack/scripts -type f -name requirements.txt -not -path "*/node_modules/*" 2>/dev/null || true); \\',' if [ -n "$py_reqs" ]; then \\'," pip3 --version 2>/dev/null || (apt-get update && apt-get install -y --no-install-recommends python3-pip && rm -rf /var/lib/apt/lists/*); \\",' echo "$py_reqs" | while IFS= read -r f; do [ -n "$f" ] && pip3 install --no-cache-dir --break-system-packages -r "$f" || true; done; \\'," fi; \\",' pkg_json=$(find /app/pack/skills /app/pack/scripts -type f -name package.json -not -path "*/node_modules/*" 2>/dev/null || true); \\',' if [ -n "$pkg_json" ]; then \\',' echo "$pkg_json" | while IFS= read -r f; do [ -n "$f" ] && (cd "$(dirname "$f")" && npm install --omit=dev --no-audit --no-fund || true) || true; done; \\'," fi","USER agent"]}function rl(t=" "){return`${t}- { name: ${nl.SERVE_HOST_ENV}, value: ${nl.CONTAINER_SERVE_HOST} }`}function Dn(t,e){let n=Ei(t,e).map(r=>`"${r}"`).join(",");return[`${Sf(t)}. Build context = pack root:`,`# docker build -f deploy/Dockerfile -t ${t.packName}:local .`,`FROM ${t.image}`,`LABEL ai.agenthippo.pack.name="${t.packName}"`,`LABEL ai.agenthippo.pack.version="${t.packVersion}"`,`LABEL ai.agenthippo.pack.engine="${t.engine}"`,"COPY . /app/pack/",...IL(),"ENV AGENTHIPPO_NO_AUTO_INSTALL=1",`ENV ${nl.SERVE_HOST_ENV}=${nl.CONTAINER_SERVE_HOST}`,...Object.entries(e?.extraEnv??{}).map(([r,s])=>`ENV ${r}=${s}`),`EXPOSE ${t.port}`,`CMD [${n}]`,""].join(`
|
|
551
551
|
`)}function _s(t){return["<!DOCTYPE html>",'<html lang="en">',"<head>",' <meta charset="utf-8" />',' <meta name="viewport" content="width=device-width, initial-scale=1" />',` <title>${t}</title>`," <style>"," :root { color-scheme: light dark; font-family: system-ui, sans-serif; }"," body { max-width: 720px; margin: 2rem auto; padding: 0 1rem; line-height: 1.5; }"," h1 { font-size: 1.4rem; margin-bottom: 0.25rem; }"," .sub { opacity: 0.7; font-size: 0.9rem; margin-bottom: 1.5rem; }"," #log { border: 1px solid #8884; border-radius: 8px; min-height: 200px; padding: 1rem; white-space: pre-wrap; margin-bottom: 1rem; }"," form { display: flex; gap: 0.5rem; }"," input[type=text] { flex: 1; padding: 0.6rem 0.75rem; border-radius: 6px; border: 1px solid #8886; font: inherit; }"," button { padding: 0.6rem 1rem; border-radius: 6px; border: 0; background: #2563eb; color: #fff; font: inherit; cursor: pointer; }"," button:disabled { opacity: 0.6; cursor: wait; }"," </style>","</head>","<body>",` <h1>${t}</h1>`,' <p class="sub">Signed in via Google SSO. Chat uses the agent API behind this page.</p>',' <div id="log">Ready. Send a message below.</div>',' <form id="chat">',' <input id="msg" type="text" placeholder="Ask the agent\u2026" autocomplete="off" required />',' <button type="submit">Send</button>'," </form>"," <script>",' const log = document.getElementById("log");',' const form = document.getElementById("chat");',' const input = document.getElementById("msg");'," // Stable per-browser session id so turns resume the same conversation (multi-turn).",' const sessionId = (self.crypto && crypto.randomUUID) ? crypto.randomUUID() : ("web-" + Date.now().toString(36) + Math.random().toString(36).slice(2));'," function append(text) {",' log.textContent += (log.textContent.endsWith("\\n") || log.textContent === "Ready. Send a message below." ? "" : "\\n") + text;'," }",' form.addEventListener("submit", async (e) => {'," e.preventDefault();"," const message = input.value.trim();"," if (!message) return;",' input.value = "";',' form.querySelector("button").disabled = true;',' append("\\nYou: " + message + "\\nAgent: ");'," try {"," const body = { message, session_id: sessionId };",' const res = await fetch("/v1/chat", {',' method: "POST",',' headers: { "Content-Type": "application/json" },'," body: JSON.stringify(body),"," });"," const data = await res.json();"," if (!res.ok) throw new Error(data.error || res.statusText);"," append(data.text || data.response || JSON.stringify(data));"," } catch (err) {",' append("[error] " + (err.message || err));'," } finally {",' form.querySelector("button").disabled = false;'," input.focus();"," }"," });"," input.focus();"," </script>","</body>","</html>",""].join(`
|
|
@@ -578,7 +578,7 @@ ${n}`}function Ei(t,e){let n=["serve","--agent","/app/pack","--workspace","/stat
|
|
|
578
578
|
`)}function jL(t){let e=t.engine.trim().toLowerCase()==="cursor",n=t.model?.trim()?`, model ${t.model.trim()}`:"",r=["#!/usr/bin/env bash","# Cloud Run + AgentHippo federated edge (A\u2032): Caddy + auth-broker front the agent.",`# Engine: ${t.engine}${n}. No oauth2-proxy, no per-service Google OAuth client \u2014`,"# Google login happens once at the central IdP (auth.agenthippo.ai); this agent verifies","# the shared .agenthippo.ai AgentHippo JWT (Bearer for IDE, cookie for browser). No IAP.","# The IDE points spec.remote.url straight at https://$PUBLIC_HOSTNAME (same flow as remote-vm).","set -euo pipefail",...qr(),`SERVICE="${t.packName}"`,'REGION="${REGION:-us-central1}"','PROJECT_ID="${PROJECT_ID:-$(gcloud config get-value project)}"','REPO="${ARTIFACT_REPO:-agenthippo}"','IMAGE="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO}/${SERVICE}:latest"',`LITELLM_IMAGE="\${LITELLM_IMAGE:-${ys("agenthippo-litellm")}}"`,"# Public hostname = a *.agenthippo.ai subdomain mapped to this service (one-time wildcard DNS).",'PUBLIC_HOSTNAME="${PUBLIC_HOSTNAME:?set PUBLIC_HOSTNAME=<subdomain>.agenthippo.ai}"','ALLOWED_DOMAINS="${ALLOWED_DOMAINS:-agenthippo.ai}"',"# Shared AgentHippo JWT signing key \u2014 MUST match the central IdP (auth.agenthippo.ai).","# Copy it from the IdP (or the GCP secret it stores) so tokens issued there verify here.",'AUTH_JWT_SECRET="${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET=<copy from auth.agenthippo.ai>}"',...e?['PROVIDER_KEY="${PROVIDER_KEY:?set PROVIDER_KEY=<cursor api key>}"']:Qo(t.model)?["# LiteLLM proxy key + AgentHippo gateway service key (ahgw_\u2026) for ah-auto routing.",'LITELLM_KEY="${LITELLM_KEY:?set LITELLM_KEY=<litellm proxy key>}"','PROVIDER_KEY="${PROVIDER_KEY:?set PROVIDER_KEY=<ahgw_\u2026 from create-gateway-key on gateway host>}"']:["# LiteLLM proxy key + the upstream provider key the gateway uses for the model.",'LITELLM_KEY="${LITELLM_KEY:?set LITELLM_KEY=<litellm proxy key>}"','PROVIDER_KEY="${PROVIDER_KEY:?set PROVIDER_KEY=<upstream provider key>}"'],"",'gcloud artifacts repositories describe "$REPO" --location="$REGION" 2>/dev/null \\',' || gcloud artifacts repositories create "$REPO" --repository-format=docker --location="$REGION"','gcloud auth configure-docker "${REGION}-docker.pkg.dev" --quiet',"","# One agent image serves both the agent and the auth-broker containers (CLI ships `auth-broker`).","# Rewrite the runtime base to this project Artifact Registry. Customer artifacts pin a","# dated ghcr.io/agenthippoai/runtime tag; mirror that exact tag into AR. No-op if already AR.",'DF_TMP="$(mktemp)"','sed "s|FROM ghcr.io/agenthippoai/runtime:|FROM ${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO}/runtime:|" deploy/Dockerfile > "$DF_TMP"','docker build --pull --platform linux/amd64 -f "$DF_TMP" -t "$IMAGE" .','docker push "$IMAGE"',"","# Secrets: caddyfile + shared JWT secret + provider/litellm keys. NO OAuth client secrets.",'ensure_secret() { gcloud secrets describe "$1" >/dev/null 2>&1 || gcloud secrets create "$1" --replication-policy=automatic; }','ensure_secret "${SERVICE}-caddyfile"; gcloud secrets versions add "${SERVICE}-caddyfile" --data-file=deploy/Caddyfile','ensure_secret "${SERVICE}-auth-jwt-secret"; printf %s "$AUTH_JWT_SECRET" | gcloud secrets versions add "${SERVICE}-auth-jwt-secret" --data-file=-','ensure_secret "${SERVICE}-provider-key"; printf %s "$PROVIDER_KEY" | gcloud secrets versions add "${SERVICE}-provider-key" --data-file=-'];return e||r.push('ensure_secret "${SERVICE}-otel-config"; gcloud secrets versions add "${SERVICE}-otel-config" --data-file=deploy/otel-collector.yaml','ensure_secret "${SERVICE}-litellm-key"; printf %s "$LITELLM_KEY" | gcloud secrets versions add "${SERVICE}-litellm-key" --data-file=-'),r.push("","# Render the multi-container template (sed \u2014 no gettext) and deploy.",'RENDERED="$(mktemp)"','sed -e "s|\\${SERVICE}|${SERVICE}|g" -e "s|\\${IMAGE}|${IMAGE}|g" \\',' -e "s|\\${LITELLM_IMAGE}|${LITELLM_IMAGE}|g" \\',' -e "s|\\${PUBLIC_HOSTNAME}|${PUBLIC_HOSTNAME}|g" -e "s|\\${ALLOWED_DOMAINS}|${ALLOWED_DOMAINS}|g" \\',' deploy/service.yaml > "$RENDERED"','gcloud run services replace "$RENDERED" --region "$REGION"',"","# No IAP: Caddy is the gate, so Cloud Run must allow public ingress (allUsers invoker).",'gcloud run services add-iam-policy-binding "$SERVICE" --region "$REGION" \\'," --member=allUsers --role=roles/run.invoker >/dev/null 2>&1 || true","","# Map the *.agenthippo.ai subdomain (idempotent). Requires one-time wildcard DNS","# *.agenthippo.ai \u2192 Cloud Run (gctrl.run.app). No per-subdomain DNS, no Google OAuth edit.","# Skip for *.run.app default URLs (no custom mapping needed there).",'if [[ "$PUBLIC_HOSTNAME" != *.run.app ]]; then \\',' gcloud beta run domain-mappings describe "$PUBLIC_HOSTNAME" --region "$REGION" >/dev/null 2>&1 \\',' || gcloud beta run domain-mappings create --service "$SERVICE" --region "$REGION" --domain "$PUBLIC_HOSTNAME"; \\',"fi","","# Grant the runtime SA access to the secrets if needed:",`# SA="$(gcloud run services describe "$SERVICE" --region "$REGION" --format='value(spec.template.spec.serviceAccountName)')"`,"# for s in caddyfile auth-jwt-secret provider-key; do",'# gcloud secrets add-iam-policy-binding "${SERVICE}-$s" --member="serviceAccount:$SA" --role=roles/secretmanager.secretAccessor',"# done",""),r.join(`
|
|
579
579
|
`)}function xL(t,e,n){let r=vf(t)&&!n,s=n?"Caddy (ingress) + auth-broker + agent.":r?"Caddy (ingress) + auth-broker + agent (gateway-direct \u2014 no LiteLLM/OTEL sidecars).":"Caddy (ingress) + auth-broker + agent + LiteLLM + OTEL collector (Spotlight).",i=(t.idpUrl||"https://auth.agenthippo.ai").trim().replace(/\/+$/,""),o={Dockerfile:Dn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":_s(t.packName),Caddyfile:(0,at.renderSidecarFedCaddyfile)(t.idpUrl),"service.yaml":r?UL(t):GL(t),"cloudrun-deploy.sh":r?HL(t):jL(t)};return!n&&!r&&(o["otel-collector.yaml"]=sl),o["README.md"]=[`# Deploy: ${t.packName} \u2014 Cloud Run + AgentHippo federated edge (A\u2032${r?", gateway-direct":""})`,"",`Engine: **${t.engine}**${t.model?`, model: **${t.model}**`:""}. Runtime base: \`${t.image}\`.`,"",`${s} Sidecars share the pod's localhost (Cloud Run multi-container):`,"- **caddy** (ingress, the only port) \u2192 verifies the shared AgentHippo JWT (Bearer for IDE, cookie for browser)",`- **agent** \u2192 serves www + /v1/* on localhost:${at.EDGE_AGENT_PORT} (NOT ingress)`,"- **auth-broker** \u2192 validates the shared `.agenthippo.ai` JWT via `/api/ide/me` (same secret as the IdP)",...r?[`- **model routing** \u2192 agent calls \`${$_}\` directly (ahgw_\u2026 service key) \u2014 same as colocated agents`,"- **no Spotlight sidecars** \u2014 traces are not collected in-pod; use gateway/Spotlight fleet analytics instead"]:n?[]:["- **litellm** gateway \u2192 exports OTLP to `http://localhost:4318`","- **otel-collector** \u2192 writes JSONL traces to the in-memory `/state` volume"],"","**No oauth2-proxy, no per-service Google OAuth client.** Google login happens once at the",`central IdP (${i}); this agent only verifies the resulting shared \`.agenthippo.ai\` JWT.`,"The IDE points `spec.remote.url` at `https://$PUBLIC_HOSTNAME` and the existing AgentHippo","SSO flow works (same as `remote-vm`). Browser visits with no cookie are redirected to the","IdP to log in, then return. Cloud Run is public (`allUsers` invoker) so traffic reaches Caddy.","","```bash","cp deploy/.env.example deploy/.env && cp deploy/.env.auth.example deploy/.env.auth # fill both","export PUBLIC_HOSTNAME=<subdomain>.agenthippo.ai # e.g. cs.agenthippo.ai","export AUTH_JWT_SECRET=<copy from auth.agenthippo.ai> # shared signing key",...n?["export PROVIDER_KEY=<cursor api key>"]:r?["export PROVIDER_KEY=<ahgw_\u2026 from create-gateway-key on gateway host>"]:Qo(t.model)?["export LITELLM_KEY=\u2026 PROVIDER_KEY=<ahgw_\u2026 from create-gateway-key on gateway host>"]:["export LITELLM_KEY=\u2026 PROVIDER_KEY=\u2026"],"bash deploy/cloudrun-deploy.sh # builds linux/amd64, upserts secrets, `gcloud run services replace`, maps the subdomain","```","","**One-time setup (not per agent):** wildcard DNS `*.agenthippo.ai` \u2192 Cloud Run (`gctrl.run.app`),",`and the IdP (${i}) must run the \`/oauth/browser-login\` route (oauth2-proxy forward_auth \u2192`,"auth-broker sets the `ah_token` cookie on `.agenthippo.ai`). After that, every new agent is",r?"just: `deploy init --ingress edge-fed --model-routing gateway` + this script \u2014 zero Console/OAuth work.":"just: `deploy init --ingress edge-fed` + this script \u2014 zero Console/OAuth work.","",r?"`service.yaml` placeholders (`${SERVICE} ${IMAGE} ${PUBLIC_HOSTNAME} ${ALLOWED_DOMAINS}`) are substituted by the deploy script. The Caddyfile is stored in Secret Manager (`${SERVICE}-caddyfile`).":"`service.yaml` placeholders (`${SERVICE} ${IMAGE} ${LITELLM_IMAGE} ${PUBLIC_HOSTNAME} ${ALLOWED_DOMAINS}`) are substituted by the deploy script. The Caddyfile is stored in Secret Manager (`${SERVICE}-caddyfile`).","`AGENTHIPPO_AUTH_COOKIE_DOMAIN` / `AGENTHIPPO_AUTH_IDP_URL` are baked in at generation time.","",e?"**Inbound channel (1b):** `minScale: 1` pins one always-on instance (the socket can't scale to zero).":"**No inbound channel (1a):** scales to zero; in-memory `/state` is wiped on cold start (use the `edge` mode + GCS bucket if you need durable state).","",...nr(t)].join(`
|
|
580
580
|
`),o}function BL(t){let e=["# Databricks App (serverless source app). Databricks runs `npm ci` then start.",'command: ["node", "start.js"]',"env:"," - name: PORT",` value: "${t.port}"`,"user_authorization:"," # OBO: Databricks forwards X-Forwarded-Access-Token (the asking user's"," # downscoped token) so SQL runs as that user \u2192 Unity Catalog enforces"," # per-user grants. serve-v3 \xA711.1.",' scopes: ["sql"]',""].join(`
|
|
581
|
-
`),n=JSON.stringify({name:t.packName,private:!0,dependencies:{[
|
|
581
|
+
`),n=JSON.stringify({name:t.packName,private:!0,dependencies:{[Y.AGENTHIPPO_CLI_NPM_PACKAGE]:__()}},null,2)+`
|
|
582
582
|
`,r=["// Databricks App entrypoint: exec serve against the bundled pack.","const { spawn } = require('node:child_process');","const port = process.env.PORT || '"+t.port+"';","const child = spawn('agenthippo', ["," 'serve', '--agent', './pack',"," '--workspace', '/tmp/agenthippo/workspace',"," '--state-dir', '/tmp/agenthippo/state',"," '--port', port,","], { stdio: 'inherit', env: {"," ...process.env,"," AGENTHIPPO_SERVE_HOST: '0.0.0.0',"," // Databricks Apps workspace SSO sets X-Forwarded-Email; pin serve to trust ONLY that"," // header so an authenticated caller cannot impersonate another user via a spoofed"," // X-Agent-User header (Databricks does not know about or strip that header)."," // Skipped when AGENTHIPPO_PIN_IDENTITY=0 (bootstrap escape hatch) \u2014 same idea as"," // Cloud Run's ENABLE_IAP=0: pinning to an absent header would make every request"," // anonymous instead of leaving body-supplied identity usable during bootstrap."," ...(process.env.AGENTHIPPO_PIN_IDENTITY === '0' ? {} : { AGENTHIPPO_IDENTITY_HEADER: 'x-forwarded-email' }),","} });","child.on('exit', (code) => process.exit(code ?? 0));",""].join(`
|
|
583
583
|
`);return{"app.yaml":e,"package.json":n,"start.js":r,"README.md":[`# Deploy: ${t.packName} \u2014 Databricks App (T1-native, the wedge)`,"","```bash","cp -r . ./databricks-app/pack # bundle the pack next to start.js","databricks apps deploy "+t.packName,"```","","**Per-user permissions:** workspace SSO authenticates the user; OBO forwards","`X-Forwarded-Access-Token`, and the SQL tool authenticates to the warehouse as","that user, so Unity Catalog row filters apply automatically (serve-v3 \xA711.1).","","> \u26A0\uFE0F The OBO *credential* seam (per-turn token \u2192 SQL tool) is the load-bearing","> spike (serve-v3 \xA713.2). Without it serve queries as one app identity. Identity","> attribution (`user_id`) works today; per-user *data* enforcement needs the spike.","",...nr(t)].join(`
|
|
584
584
|
`)}}function FL(t){let e=["# Snowpark Container Services spec. Push the runtime image to your account","# registry, then run deploy.sql in a worksheet. serve-v3 \xA76.","spec:"," containers:",` - name: ${t.packName}`,` image: /<db>/<schema>/<repo>/${t.packName}:latest`," env:",' AGENTHIPPO_NO_AUTO_INSTALL: "1"'," AGENTHIPPO_HOME: /state"," readinessProbe:",` port: ${t.port}`," path: /ready"," # Q1: durable state on a block volume \u2014 survives compute-pool suspend/resume."," volumeMounts:"," - name: state"," mountPath: /state"," volumes:"," - name: state"," source: block"," size: 10Gi"," endpoints:"," - name: api",` port: ${t.port}`," public: true",""].join(`
|
|
@@ -606,31 +606,31 @@ ${rr.COLORS.dim}Scanned pack secrets into .env.example: ${c.join(", ")}${rr.COLO
|
|
|
606
606
|
`),"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(`
|
|
607
607
|
`),"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(`
|
|
608
608
|
`),"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(`
|
|
609
|
-
`)}}});var B_=T(ws=>{"use strict";var l0=ws&&ws.__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]})),u0=ws&&ws.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),x_=ws&&ws.__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"&&l0(n,e,r[s]);return u0(n,e),n}})();Object.defineProperty(ws,"__esModule",{value:!0});ws.idpCommand=f0;var il=x_(require("fs")),Zo=x_(require("path")),d0=j_(),Qi=qn();async function f0(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=Zo.resolve(e.out||"./enterprise-deploy/idp");il.mkdirSync(n,{recursive:!0});let r={hostname:e.hostname.trim(),cookieDomain:e.cookieDomain},s=(0,d0.renderIdpArtifacts)(r),i=[],o=[];for(let[a,c]of Object.entries(s)){let l=Zo.join(n,a);if(il.existsSync(l)&&!e.force){o.push(a);continue}il.mkdirSync(Zo.dirname(l),{recursive:!0}),il.writeFileSync(l,c),i.push(a)}console.log(`${Qi.COLORS.green}\u2713${Qi.COLORS.reset} idp \u2192 ${Zo.relative(process.cwd(),n)||"."}`);for(let a of i)console.log(` ${Qi.COLORS.dim}+ ${a}${Qi.COLORS.reset}`);for(let a of o)console.log(` ${Qi.COLORS.yellow}\u2022 ${a} (exists; --force to overwrite)${Qi.COLORS.reset}`);console.log(`Next: cd ${Zo.relative(process.cwd(),n)||"."}, cp .env.example ~/.agent-hippo/.env, cp .env.auth.example ~/.agent-hippo/.env.auth (fill in), then ./run.sh`)}});var kf=T(Mn=>{"use strict";var p0=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]})),g0=Mn&&Mn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),h0=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"&&p0(n,e,r[s]);return g0(n,e),n}})();Object.defineProperty(Mn,"__esModule",{value:!0});Mn.discoverPublishableEngines=W_;Mn.resolveEngineSourceDir=v0;Mn.validateEngineForPublish=O0;Mn.collectEngineFiles=I0;Mn.isValidPublishVersion=P0;var m0=require("child_process"),Bs=require("fs"),Ln=h0(require("path")),E0=require("util"),y0=
|
|
609
|
+
`)}}});var B_=T(ws=>{"use strict";var l0=ws&&ws.__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]})),u0=ws&&ws.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),x_=ws&&ws.__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"&&l0(n,e,r[s]);return u0(n,e),n}})();Object.defineProperty(ws,"__esModule",{value:!0});ws.idpCommand=f0;var il=x_(require("fs")),Zo=x_(require("path")),d0=j_(),Qi=qn();async function f0(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=Zo.resolve(e.out||"./enterprise-deploy/idp");il.mkdirSync(n,{recursive:!0});let r={hostname:e.hostname.trim(),cookieDomain:e.cookieDomain},s=(0,d0.renderIdpArtifacts)(r),i=[],o=[];for(let[a,c]of Object.entries(s)){let l=Zo.join(n,a);if(il.existsSync(l)&&!e.force){o.push(a);continue}il.mkdirSync(Zo.dirname(l),{recursive:!0}),il.writeFileSync(l,c),i.push(a)}console.log(`${Qi.COLORS.green}\u2713${Qi.COLORS.reset} idp \u2192 ${Zo.relative(process.cwd(),n)||"."}`);for(let a of i)console.log(` ${Qi.COLORS.dim}+ ${a}${Qi.COLORS.reset}`);for(let a of o)console.log(` ${Qi.COLORS.yellow}\u2022 ${a} (exists; --force to overwrite)${Qi.COLORS.reset}`);console.log(`Next: cd ${Zo.relative(process.cwd(),n)||"."}, cp .env.example ~/.agent-hippo/.env, cp .env.auth.example ~/.agent-hippo/.env.auth (fill in), then ./run.sh`)}});var kf=T(Mn=>{"use strict";var p0=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]})),g0=Mn&&Mn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),h0=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"&&p0(n,e,r[s]);return g0(n,e),n}})();Object.defineProperty(Mn,"__esModule",{value:!0});Mn.discoverPublishableEngines=W_;Mn.resolveEngineSourceDir=v0;Mn.validateEngineForPublish=O0;Mn.collectEngineFiles=I0;Mn.isValidPublishVersion=P0;var m0=require("child_process"),Bs=require("fs"),Ln=h0(require("path")),E0=require("util"),y0=Ye(),_i=Zt(),_0=Da(),w0=(0,E0.promisify)(m0.execFile),ol="engine.manifest.json",A0=new Set([".git",".hg",".svn",".DS_Store","node_modules","dist","coverage",".turbo",".cache",".pnpm-store","Thumbs.db"]),S0=[["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 F_(t){return!!(A0.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function Rf(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")||Ln.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 V_(t){let e=Ln.join(t,ol),n=await Bs.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=Rf(r.entry),i=Ln.join(t,s);if(!await(0,_i.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"&&Rf(o.dir),typeof o.rulesFile=="string"&&Rf(o.rulesFile))}return{manifest:r,manifestPath:e,entryPath:i}}async function Cf(t,e=""){let n=Ln.join(t,e),r=await Bs.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(F_(i.name))continue;let o=e?Ln.join(e,i.name):i.name,a=Ln.join(t,o);i.isDirectory()?s.push(...await Cf(t,o)):i.isFile()&&s.push({rel:o.replace(/\\/g,"/"),abs:a})}return s}async function b0(t){let e=[];for(let n of t){if((await Bs.promises.stat(n.abs)).size>5*1024*1024)continue;let s=await Bs.promises.readFile(n.abs);if(s.includes(0))continue;let i=s.toString("utf8");for(let[o,a]of S0)a.test(i)&&e.push(`${n.rel}: ${o}`)}return e}async function T0(t){let e=Ln.join(t,"package.json");if(await(0,_i.pathExists)(e))try{let n=JSON.parse(await Bs.promises.readFile(e,"utf-8"));if(n.version&&/^\d+\.\d+\.\d+/.test(n.version))return n.version}catch{return}}async function W_(t){let e=[];t?.trim()&&e.push({root:Ln.join(Ln.resolve(t),y0.AGENTIDE_DIR_NAME,"engines"),label:"workspace"}),e.push({root:(0,_0.getDefaultCustomEnginesInstallRoot)(),label:"home"});let n=new Map;for(let{root:r,label:s}of e){if(!await(0,_i.pathExists)(r))continue;let i=await Bs.promises.readdir(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||F_(o.name))continue;let a=Ln.join(r,o.name),c=Ln.join(a,ol);if(await(0,_i.pathExists)(c))try{let{manifest:l}=await V_(a),f=l.id;if(n.has(f))continue;n.set(f,{id:f,displayName:typeof l.displayName=="string"?l.displayName:f,sourceDir:a,sourceLabel:s})}catch{}}}return[...n.values()].sort((r,s)=>r.id.localeCompare(s.id))}async function v0(t,e){return(await W_(e)).find(r=>r.id===t)?.sourceDir}async function O0(t,e){let n=[],r=[];if(!await(0,_i.pathExists)(t))return{valid:!1,errors:[`Engine directory not found: ${t}`],warnings:r};let s,i;try{({manifest:s,entryPath:i}=await V_(t))}catch(u){return{valid:!1,errors:[u instanceof Error?u.message:String(u)],warnings:r}}let o=s.id;e&&e!==o&&n.push(`Engine folder id "${e}" does not match manifest id "${o}"`);let a=Ln.join(t,"package.json");await(0,_i.pathExists)(a)&&!await(0,_i.pathExists)(Ln.join(t,"package-lock.json"))&&n.push("package.json present but package-lock.json is missing");let c=await Cf(t);c.some(u=>u.rel===ol)||n.push(`Missing ${ol} in publishable files`);let l=await b0(c);l.length>0&&n.push(`Possible secrets found:
|
|
610
610
|
${l.map(u=>` - ${u}`).join(`
|
|
611
|
-
`)}`);try{await w0(process.execPath,["--check",i],{windowsHide:!0})}catch(u){let d=u instanceof Error?u.message:String(u);n.push(`engine entry failed node --check: ${d}`)}s.description||r.push("Consider adding description to engine.manifest.json");let f=await T0(t);return f||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:f}:void 0}}async function I0(t){let e=await Cf(t),n=[];for(let r of e){if((await Bs.promises.stat(r.abs)).size>5*1024*1024)throw new Error(`File too large to publish (>5MB): ${r.rel}`);let i=await Bs.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 P0(t){return/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t.trim())}});var z_=T(Te=>{"use strict";Object.defineProperty(Te,"__esModule",{value:!0});Te.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE=Te.VIEW_EXPORT_SNAPSHOT_MESSAGE=Te.WORKFLOWS_SIDECAR_SCRIPTS=Te.WORKFLOWS_RUN_SCRIPT=Te.WORKFLOWS_VIEW_ID=Te.FLEET_WIDGET_SCRIPT=void 0;Te.createDefaultWorkflowsView=K_;Te.viewRunsFleetWidget=q_;Te.resolveRefreshOnNavigate=Lf;Te.resolveGalleryLayout=Y_;Te.resolvePreserveFleetIframe=J_;Te.shouldPreserveFleetIframe=R0;Te.buildViewExportSnapshotMessages=k0;Te.shouldRunScriptsOnNavigation=$0;Te.normalizeDashboardViewId=ea;Te.formatDisplayNameForAllocatedViewId=D0;Te.createDefaultDashboardViewsConfig=X_;Te.resolveMergedActiveViewId=Df;Te.mergeDashboardViewsConfigs=L0;Te.FLEET_WIDGET_SCRIPT="agent-fleet-widget.js";Te.WORKFLOWS_VIEW_ID="workflows";Te.WORKFLOWS_RUN_SCRIPT="workflows-widget.cjs";Te.WORKFLOWS_SIDECAR_SCRIPTS=["workflows-collector.cjs","workflows-daemon.mjs","fleet-workflow.sh"];function K_(){return{id:Te.WORKFLOWS_VIEW_ID,name:"Workflows",scope:"global",scripts:[Te.WORKFLOWS_RUN_SCRIPT],bundledScripts:Te.WORKFLOWS_SIDECAR_SCRIPTS,system:!0,refreshOnNavigate:"always",layout:"fleet-dashboard",preserveFleetIframe:!0}}Te.VIEW_EXPORT_SNAPSHOT_MESSAGE="viewExportSnapshot";Te.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE="requestViewExportSnapshot";function N0(t){return t.trim().replace(/^.*[/\\]/,"").toLowerCase()}function q_(t){return t.scripts.some(e=>N0(e)===Te.FLEET_WIDGET_SCRIPT)}function Lf(t){return t.refreshOnNavigate==="always"||t.refreshOnNavigate==="when-empty"?t.refreshOnNavigate:q_(t)?"always":"when-empty"}function Y_(t){return t.layout==="fleet-dashboard"||t.layout==="gallery"?t.layout:Lf(t)==="always"?"fleet-dashboard":"gallery"}function J_(t){return t.preserveFleetIframe===!1?!1:t.preserveFleetIframe===!0?!0:Y_(t)==="fleet-dashboard"}function R0(t){return J_(t)}var C0=192*1024,$f=100;function k0(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<=C0)return[{payload:t,meta:n}];let s={...t,sessions:[]},i=Math.max(1,Math.ceil(e.length/$f)),o=`${Date.now()}-${e.length}-${r}`,a=[];for(let c=0;c<i;c+=1)a.push({payload:{...s,sessions:e.slice(c*$f,(c+1)*$f)},meta:{...n,chunkedSessions:!0,chunkIndex:c,chunkCount:i,snapshotId:o}});return a}function $0(t,e){return Lf(t)==="always"?!0:!e.some(n=>n==="chart")}function ea(t,e="global"){return(t??e).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||e}function D0(t,e,n=ea){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 X_(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},K_()]}}function Df(t,e,n,r){let s=r?.preferWorkspaceScopeFallback===!0,i=e?ea(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 L0(t,e,n=X_()){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=ea(e.activeViewId,n.activeViewId);return{activeViewId:Df(i,a,n,{preferWorkspaceScopeFallback:!0}),views:i}}let o=ea(r.activeViewId,n.activeViewId);return{activeViewId:Df(i,o,n,{preferWorkspaceScopeFallback:!1}),views:i}}});var Mf=T(ta=>{"use strict";Object.defineProperty(ta,"__esModule",{value:!0});ta.normalizeSpotlightViewId=G0;ta.parseSpotlightYamlRecord=U0;ta.dumpSpotlightYaml=H0;var M0=z_();function G0(t,e="view"){return(0,M0.normalizeDashboardViewId)(t,e)}function U0(t){let n=require("js-yaml").load(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function H0(t){return require("js-yaml").dump(t,{lineWidth:120,noRefs:!0})}});var jf=T(sr=>{"use strict";var j0=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]})),x0=sr&&sr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),B0=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"&&j0(n,e,r[s]);return x0(n,e),n}})();Object.defineProperty(sr,"__esModule",{value:!0});sr.resolveViewPublishVersionFromParsed=Q_;sr.discoverPublishableViews=rM;sr.validateViewForPublish=sM;sr.collectViewFiles=iM;var As=require("fs"),Ot=B0(require("path")),F0=qe(),Uf=kf(),Qr=Zt(),V0=Ao(),Zi=Mf();function Q_(t){if(t){if(typeof t.version=="string"&&t.version.trim()){let e=t.version.trim().replace(/^v/,"");if((0,Uf.isValidPublishVersion)(e))return e}if(typeof t.semver=="string"&&t.semver.trim()){let e=t.semver.trim().replace(/^v/,"");if((0,Uf.isValidPublishVersion)(e))return e}}}var Z_=new Set(["global","workspace","fleet","workflows","default"]),ew="view.yaml",W0="panel-entry.yaml",K0=new Set(["charts","reports","exports","panel-state","assets","images"]),tw=["assets","images","charts","reports","exports"],Hf="manifest.json",q0=new Set([".png",".jpg",".jpeg",".gif",".webp",".pdf",".ico",".woff",".woff2"]),Y0=new Set([...K0,"node_modules",".git",".hg",".svn",".DS_Store","__pycache__",".turbo",".cache"]),nw=new Set([".DS_Store","Thumbs.db"]),J0=[["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/]],X0=1024*1024,z0=10*1024*1024;function rw(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Ot.basename(e.trim())):[]}function al(t){let e=new Set,n=[];for(let r of t){let s=Ot.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function Q0(t){let e=[];return t?.trim()&&e.push({root:Ot.join(t.trim(),F0.AGENTIDE_DIR_NAME,"analytics"),label:"workspace"}),e.push({root:Ot.join((0,V0.getAgentideHome)(),"analytics"),label:"home"}),e}function Z0(t){return Ot.join(t,"panel","views.yaml")}async function eM(t){try{let e=await As.promises.readFile(t,"utf-8"),n=(0,Zi.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,Zi.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,f=al(rw(o.scripts)),u=o.system===!0;s.push({id:a,name:l,scope:c,scripts:f,system:u})}return s}catch{return[]}}async function sw(t){let e=Ot.join(t,ew);try{let n=await As.promises.readFile(e,"utf-8"),r=(0,Zi.parseSpotlightYamlRecord)(n);if(!r)return;let s=(0,Zi.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:Q_(r),scope:i,tags:Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):void 0,scripts:al(rw(r.scripts))}}catch{return}}async function tM(t){let e=[];for(let n of t)for(let[r,s]of J0)s.test(n.content)&&e.push(`${n.rel}: possible ${r}`);return e}function iw(t,e){return!!(nw.has(t)||t.startsWith(".")&&t!=="."||e&&Y0.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function ow(t,e){return!!(nw.has(t)||t.startsWith(".")||e&&(t==="node_modules"||t==="__pycache__")||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function aw(t){let e=Ot.extname(t).toLowerCase();return q0.has(e)}async function Gf(t,e){let n=await As.promises.readFile(t);return n.includes(0)||aw(e)?{path:e,content:n.toString("base64"),encoding:"base64"}:{path:e,content:n.toString("utf-8"),encoding:"utf-8"}}async function nM(t){let e=0;for(let n of tw){let r=Ot.join(t,n);if(!await(0,Qr.pathExists)(r))continue;async function s(i){let o=await As.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(ow(a.name,a.isDirectory()))continue;let c=Ot.join(i,a.name);if(a.isDirectory()){await s(c);continue}e++}}await s(r)}return await(0,Qr.pathExists)(Ot.join(t,Hf))&&e++,e}async function cw(t,e){for(let r of tw){let s=Ot.join(t,r);await(0,Qr.pathExists)(s)&&await cl(s,r,ow,e)}let n=Ot.join(t,Hf);if(await(0,Qr.pathExists)(n)){let r=await As.promises.stat(n);await e(n,Hf,r.size)}}async function cl(t,e,n,r){let s=await As.promises.readdir(t,{withFileTypes:!0});for(let i of s){if(n(i.name,i.isDirectory()))continue;let o=Ot.join(t,i.name),a=e?`${e}/${i.name}`:i.name;if(i.isDirectory()){await cl(o,a,n,r);continue}let c=await As.promises.stat(o);await r(o,a,c.size)}}async function rM(t){let e=new Map;for(let{root:n,label:r}of Q0(t)){let s=Z0(n);if(!await(0,Qr.pathExists)(s))continue;let i=await eM(s);for(let o of i){if(o.system||Z_.has(o.id)||e.has(o.id))continue;let a=Ot.join(n,"views",o.id),c=await sw(a),l=al(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 sM(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}"`),Z_.has(t.id)&&s.push(`View id "${t.id}" is reserved for built-in Spotlight views`),!await(0,Qr.pathExists)(t.viewRoot))return s.push(`View directory not found: ${t.viewRoot}`),{valid:!1,errors:s,warnings:i};let o=await sw(t.viewRoot),a=al(o?.scripts.length?o.scripts:t.scripts),c=n==="full"?await nM(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=Ot.join(t.viewRoot,"scripts");for(let m of a){let h=Ot.join(l,m);await(0,Qr.pathExists)(h)||s.push(`Missing script file: scripts/${m}`)}let f=[],u=0;async function d(m,h,E){if(E===void 0&&(E=(await As.promises.stat(m)).size),E>X0){s.push(`File too large (>1MB): ${h}`);return}if(u+=E,u>z0){s.push("Total bundle size exceeds 10MB");return}if(aw(h))return;let y=await As.promises.readFile(m);f.push({rel:h,content:y.toString("utf-8")})}await(0,Qr.pathExists)(l)&&await cl(l,"scripts",iw,d),n==="full"&&await cw(t.viewRoot,d);let p=await tM(f);p.length>0&&s.push(`Possible secrets found:
|
|
611
|
+
`)}`);try{await w0(process.execPath,["--check",i],{windowsHide:!0})}catch(u){let d=u instanceof Error?u.message:String(u);n.push(`engine entry failed node --check: ${d}`)}s.description||r.push("Consider adding description to engine.manifest.json");let f=await T0(t);return f||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:f}:void 0}}async function I0(t){let e=await Cf(t),n=[];for(let r of e){if((await Bs.promises.stat(r.abs)).size>5*1024*1024)throw new Error(`File too large to publish (>5MB): ${r.rel}`);let i=await Bs.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 P0(t){return/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t.trim())}});var z_=T(Te=>{"use strict";Object.defineProperty(Te,"__esModule",{value:!0});Te.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE=Te.VIEW_EXPORT_SNAPSHOT_MESSAGE=Te.WORKFLOWS_SIDECAR_SCRIPTS=Te.WORKFLOWS_RUN_SCRIPT=Te.WORKFLOWS_VIEW_ID=Te.FLEET_WIDGET_SCRIPT=void 0;Te.createDefaultWorkflowsView=K_;Te.viewRunsFleetWidget=q_;Te.resolveRefreshOnNavigate=Lf;Te.resolveGalleryLayout=Y_;Te.resolvePreserveFleetIframe=J_;Te.shouldPreserveFleetIframe=R0;Te.buildViewExportSnapshotMessages=k0;Te.shouldRunScriptsOnNavigation=$0;Te.normalizeDashboardViewId=ea;Te.formatDisplayNameForAllocatedViewId=D0;Te.createDefaultDashboardViewsConfig=X_;Te.resolveMergedActiveViewId=Df;Te.mergeDashboardViewsConfigs=L0;Te.FLEET_WIDGET_SCRIPT="agent-fleet-widget.js";Te.WORKFLOWS_VIEW_ID="workflows";Te.WORKFLOWS_RUN_SCRIPT="workflows-widget.cjs";Te.WORKFLOWS_SIDECAR_SCRIPTS=["workflows-collector.cjs","workflows-daemon.mjs","fleet-workflow.sh"];function K_(){return{id:Te.WORKFLOWS_VIEW_ID,name:"Workflows",scope:"global",scripts:[Te.WORKFLOWS_RUN_SCRIPT],bundledScripts:Te.WORKFLOWS_SIDECAR_SCRIPTS,system:!0,refreshOnNavigate:"always",layout:"fleet-dashboard",preserveFleetIframe:!0}}Te.VIEW_EXPORT_SNAPSHOT_MESSAGE="viewExportSnapshot";Te.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE="requestViewExportSnapshot";function N0(t){return t.trim().replace(/^.*[/\\]/,"").toLowerCase()}function q_(t){return t.scripts.some(e=>N0(e)===Te.FLEET_WIDGET_SCRIPT)}function Lf(t){return t.refreshOnNavigate==="always"||t.refreshOnNavigate==="when-empty"?t.refreshOnNavigate:q_(t)?"always":"when-empty"}function Y_(t){return t.layout==="fleet-dashboard"||t.layout==="gallery"?t.layout:Lf(t)==="always"?"fleet-dashboard":"gallery"}function J_(t){return t.preserveFleetIframe===!1?!1:t.preserveFleetIframe===!0?!0:Y_(t)==="fleet-dashboard"}function R0(t){return J_(t)}var C0=192*1024,$f=100;function k0(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<=C0)return[{payload:t,meta:n}];let s={...t,sessions:[]},i=Math.max(1,Math.ceil(e.length/$f)),o=`${Date.now()}-${e.length}-${r}`,a=[];for(let c=0;c<i;c+=1)a.push({payload:{...s,sessions:e.slice(c*$f,(c+1)*$f)},meta:{...n,chunkedSessions:!0,chunkIndex:c,chunkCount:i,snapshotId:o}});return a}function $0(t,e){return Lf(t)==="always"?!0:!e.some(n=>n==="chart")}function ea(t,e="global"){return(t??e).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||e}function D0(t,e,n=ea){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 X_(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},K_()]}}function Df(t,e,n,r){let s=r?.preferWorkspaceScopeFallback===!0,i=e?ea(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 L0(t,e,n=X_()){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=ea(e.activeViewId,n.activeViewId);return{activeViewId:Df(i,a,n,{preferWorkspaceScopeFallback:!0}),views:i}}let o=ea(r.activeViewId,n.activeViewId);return{activeViewId:Df(i,o,n,{preferWorkspaceScopeFallback:!1}),views:i}}});var Mf=T(ta=>{"use strict";Object.defineProperty(ta,"__esModule",{value:!0});ta.normalizeSpotlightViewId=G0;ta.parseSpotlightYamlRecord=U0;ta.dumpSpotlightYaml=H0;var M0=z_();function G0(t,e="view"){return(0,M0.normalizeDashboardViewId)(t,e)}function U0(t){let n=require("js-yaml").load(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function H0(t){return require("js-yaml").dump(t,{lineWidth:120,noRefs:!0})}});var jf=T(sr=>{"use strict";var j0=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]})),x0=sr&&sr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),B0=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"&&j0(n,e,r[s]);return x0(n,e),n}})();Object.defineProperty(sr,"__esModule",{value:!0});sr.resolveViewPublishVersionFromParsed=Q_;sr.discoverPublishableViews=rM;sr.validateViewForPublish=sM;sr.collectViewFiles=iM;var As=require("fs"),Ot=B0(require("path")),F0=Ye(),Uf=kf(),Qr=Zt(),V0=Ao(),Zi=Mf();function Q_(t){if(t){if(typeof t.version=="string"&&t.version.trim()){let e=t.version.trim().replace(/^v/,"");if((0,Uf.isValidPublishVersion)(e))return e}if(typeof t.semver=="string"&&t.semver.trim()){let e=t.semver.trim().replace(/^v/,"");if((0,Uf.isValidPublishVersion)(e))return e}}}var Z_=new Set(["global","workspace","fleet","workflows","default"]),ew="view.yaml",W0="panel-entry.yaml",K0=new Set(["charts","reports","exports","panel-state","assets","images"]),tw=["assets","images","charts","reports","exports"],Hf="manifest.json",q0=new Set([".png",".jpg",".jpeg",".gif",".webp",".pdf",".ico",".woff",".woff2"]),Y0=new Set([...K0,"node_modules",".git",".hg",".svn",".DS_Store","__pycache__",".turbo",".cache"]),nw=new Set([".DS_Store","Thumbs.db"]),J0=[["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/]],X0=1024*1024,z0=10*1024*1024;function rw(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Ot.basename(e.trim())):[]}function al(t){let e=new Set,n=[];for(let r of t){let s=Ot.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function Q0(t){let e=[];return t?.trim()&&e.push({root:Ot.join(t.trim(),F0.AGENTIDE_DIR_NAME,"analytics"),label:"workspace"}),e.push({root:Ot.join((0,V0.getAgentideHome)(),"analytics"),label:"home"}),e}function Z0(t){return Ot.join(t,"panel","views.yaml")}async function eM(t){try{let e=await As.promises.readFile(t,"utf-8"),n=(0,Zi.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,Zi.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,f=al(rw(o.scripts)),u=o.system===!0;s.push({id:a,name:l,scope:c,scripts:f,system:u})}return s}catch{return[]}}async function sw(t){let e=Ot.join(t,ew);try{let n=await As.promises.readFile(e,"utf-8"),r=(0,Zi.parseSpotlightYamlRecord)(n);if(!r)return;let s=(0,Zi.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:Q_(r),scope:i,tags:Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):void 0,scripts:al(rw(r.scripts))}}catch{return}}async function tM(t){let e=[];for(let n of t)for(let[r,s]of J0)s.test(n.content)&&e.push(`${n.rel}: possible ${r}`);return e}function iw(t,e){return!!(nw.has(t)||t.startsWith(".")&&t!=="."||e&&Y0.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function ow(t,e){return!!(nw.has(t)||t.startsWith(".")||e&&(t==="node_modules"||t==="__pycache__")||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function aw(t){let e=Ot.extname(t).toLowerCase();return q0.has(e)}async function Gf(t,e){let n=await As.promises.readFile(t);return n.includes(0)||aw(e)?{path:e,content:n.toString("base64"),encoding:"base64"}:{path:e,content:n.toString("utf-8"),encoding:"utf-8"}}async function nM(t){let e=0;for(let n of tw){let r=Ot.join(t,n);if(!await(0,Qr.pathExists)(r))continue;async function s(i){let o=await As.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(ow(a.name,a.isDirectory()))continue;let c=Ot.join(i,a.name);if(a.isDirectory()){await s(c);continue}e++}}await s(r)}return await(0,Qr.pathExists)(Ot.join(t,Hf))&&e++,e}async function cw(t,e){for(let r of tw){let s=Ot.join(t,r);await(0,Qr.pathExists)(s)&&await cl(s,r,ow,e)}let n=Ot.join(t,Hf);if(await(0,Qr.pathExists)(n)){let r=await As.promises.stat(n);await e(n,Hf,r.size)}}async function cl(t,e,n,r){let s=await As.promises.readdir(t,{withFileTypes:!0});for(let i of s){if(n(i.name,i.isDirectory()))continue;let o=Ot.join(t,i.name),a=e?`${e}/${i.name}`:i.name;if(i.isDirectory()){await cl(o,a,n,r);continue}let c=await As.promises.stat(o);await r(o,a,c.size)}}async function rM(t){let e=new Map;for(let{root:n,label:r}of Q0(t)){let s=Z0(n);if(!await(0,Qr.pathExists)(s))continue;let i=await eM(s);for(let o of i){if(o.system||Z_.has(o.id)||e.has(o.id))continue;let a=Ot.join(n,"views",o.id),c=await sw(a),l=al(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 sM(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}"`),Z_.has(t.id)&&s.push(`View id "${t.id}" is reserved for built-in Spotlight views`),!await(0,Qr.pathExists)(t.viewRoot))return s.push(`View directory not found: ${t.viewRoot}`),{valid:!1,errors:s,warnings:i};let o=await sw(t.viewRoot),a=al(o?.scripts.length?o.scripts:t.scripts),c=n==="full"?await nM(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=Ot.join(t.viewRoot,"scripts");for(let m of a){let h=Ot.join(l,m);await(0,Qr.pathExists)(h)||s.push(`Missing script file: scripts/${m}`)}let f=[],u=0;async function d(m,h,E){if(E===void 0&&(E=(await As.promises.stat(m)).size),E>X0){s.push(`File too large (>1MB): ${h}`);return}if(u+=E,u>z0){s.push("Total bundle size exceeds 10MB");return}if(aw(h))return;let y=await As.promises.readFile(m);f.push({rel:h,content:y.toString("utf-8")})}await(0,Qr.pathExists)(l)&&await cl(l,"scripts",iw,d),n==="full"&&await cw(t.viewRoot,d);let p=await tM(f);p.length>0&&s.push(`Possible secrets found:
|
|
612
612
|
${p.map(m=>` - ${m}`).join(`
|
|
613
|
-
`)}`);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 iM(t,e,n,r="scripts-only"){if(!(0,Uf.isValidPublishVersion)(e.replace(/^v/,"")))throw new Error(`Invalid publish version: ${e}`);let s=[],i=Ot.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:ew,content:(0,Zi.dumpSpotlightYaml)(a),encoding:"utf-8"}),s.push({path:W0,content:(0,Zi.dumpSpotlightYaml)({id:t.id,name:n.name,scope:n.scope,scripts:n.scripts}),encoding:"utf-8"});let c=Ot.join(t.viewRoot,"README.md");return await(0,Qr.pathExists)(c)&&s.push(await Gf(c,"README.md")),await(0,Qr.pathExists)(i)&&await cl(i,"scripts",iw,async(l,f)=>{s.push(await Gf(l,f))}),r==="full"&&await cw(t.viewRoot,async(l,f)=>{s.push(await Gf(l,f))}),s}});var uw=T(ir=>{"use strict";var oM=ir&&ir.__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]})),aM=ir&&ir.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cM=ir&&ir.__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"&&oM(n,e,r[s]);return aM(n,e),n}})();Object.defineProperty(ir,"__esModule",{value:!0});ir.installSpotlightViewFromFiles=fM;ir.listInstalledSpotlightViews=pM;ir.setActiveSpotlightView=gM;ir.isSpotlightViewInstalled=hM;var yn=require("fs"),mt=cM(require("path")),Ff=qe(),ll=Zt(),Vf=Ao(),Bf=jf(),Lt=Mf();function xf(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>mt.basename(e.trim())):[]}function lw(t){let e=new Set,n=[];for(let r of t){let s=mt.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function lM(t,e){if(t==="workspace"){if(!e?.trim())throw new Error("Workspace-scoped views require an open workspace folder");return mt.join(e.trim(),Ff.AGENTIDE_DIR_NAME,"analytics")}return mt.join((0,Vf.getAgentideHome)(),"analytics")}function uM(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 dM(t,e,n){await yn.promises.mkdir(mt.dirname(t),{recursive:!0});let r;try{let c=await yn.promises.readFile(t,"utf-8");r=(0,Lt.parseSpotlightYamlRecord)(c)??{version:1,activeViewId:"global",views:[]}}catch{r={version:1,activeViewId:"global",views:[]}}let s=Array.isArray(r.views)?[...r.views]:[],i=(0,Lt.normalizeSpotlightViewId)(e.id),o=s.findIndex(c=>{if(!c||typeof c!="object")return!1;let l=c;return(0,Lt.normalizeSpotlightViewId)(typeof l.id=="string"?l.id:void 0)===i}),a={id:i,name:e.name,scope:e.scope,scripts:lw(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 yn.promises.writeFile(t,(0,Lt.dumpSpotlightYaml)(r),"utf-8")}async function fM(t,e){let n=uM(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,Lt.parseSpotlightYamlRecord)(r.toString("utf-8")),o=(0,Lt.parseSpotlightYamlRecord)(s.toString("utf-8"));if(!i||!o)throw new Error("Invalid view.yaml or panel-entry.yaml in store bundle");let a=(0,Lt.normalizeSpotlightViewId)(typeof i.id=="string"?i.id:e.slug,e.slug);if(a!==(0,Lt.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,f=lw(xf(i.scripts).length?xf(i.scripts):xf(o.scripts)),u=lM(c,e.workspaceRoot),d=mt.join(u,"views",a),p=mt.join(u,"panel","views.yaml"),g=mt.join(d,"scripts");if(!e.overwrite&&await(0,ll.pathExists)(d))throw new Error(`Spotlight view "${a}" already exists at ${d}`);e.overwrite&&await yn.promises.rm(d,{recursive:!0,force:!0}),await yn.promises.mkdir(g,{recursive:!0});let m=["scripts/","assets/","images/","charts/","reports/","exports/"],h=new Set(["manifest.json","README.md"]),E=new Set(["view.yaml","panel-entry.yaml"]);for(let[b,v]of n.entries()){if(E.has(b)||!h.has(b)&&!m.some(I=>b.startsWith(I)))continue;let A=mt.resolve(d),S=mt.resolve(A,b);if(!S.startsWith(A+mt.sep))throw new Error(`Store bundle entry "${b}" escapes the install directory`);await yn.promises.mkdir(mt.dirname(S),{recursive:!0}),await yn.promises.writeFile(S,v)}let y=new Date().toISOString(),w=(0,Bf.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0",P={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:y,updatedAt:y,scripts:f,storeVersion:w};if(Array.isArray(i.tags)&&(P.tags=i.tags.filter(b=>typeof b=="string")),await yn.promises.writeFile(mt.join(d,"view.yaml"),(0,Lt.dumpSpotlightYaml)(P),"utf-8"),await dM(p,{id:a,name:l,scope:c,scripts:f},!!e.overwrite),e.activate){let b;try{let v=await yn.promises.readFile(p,"utf-8");b=(0,Lt.parseSpotlightYamlRecord)(v)??{}}catch{b={version:1,views:[]}}b.activeViewId=a,typeof b.version!="number"&&(b.version=1),await yn.promises.writeFile(p,(0,Lt.dumpSpotlightYaml)(b),"utf-8")}return e.logger&&(0,ll.logInfo)(e.logger,`[Spotlight] Installed view "${a}" to ${d}`),{id:a,scope:c,installDir:d,viewsConfigPath:p,version:(0,Bf.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0"}}async function pM(t){let e=[],n=new Set;async function r(s){let i=mt.join(s,"views");if(!await(0,ll.pathExists)(i))return;let o=await yn.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=mt.join(i,a.name,"view.yaml");try{let f=await yn.promises.readFile(l,"utf-8"),u=(0,Lt.parseSpotlightYamlRecord)(f);if(!u)continue;let d=(0,Lt.normalizeSpotlightViewId)(typeof u.id=="string"?u.id:a.name,a.name),p=u.scope==="workspace"?"workspace":"global";n.add(c),e.push({slug:d,displayName:typeof u.name=="string"&&u.name.trim()?u.name.trim():d,description:typeof u.description=="string"?u.description.trim():void 0,tags:Array.isArray(u.tags)?u.tags.filter(g=>typeof g=="string"):["spotlight"],latestVersion:typeof u.storeVersion=="string"?u.storeVersion:(0,Bf.resolveViewPublishVersionFromParsed)(u)??"local",scope:p})}catch{}}}return await r(mt.join((0,Vf.getAgentideHome)(),"analytics")),t?.trim()&&await r(mt.join(t.trim(),Ff.AGENTIDE_DIR_NAME,"analytics")),e.sort((s,i)=>s.slug.localeCompare(i.slug))}async function gM(t,e){let n=(0,Lt.normalizeSpotlightViewId)(e,e),r;try{let s=await yn.promises.readFile(t,"utf-8");r=(0,Lt.parseSpotlightYamlRecord)(s)??{version:1,views:[]}}catch{r={version:1,views:[]}}r.activeViewId=n,typeof r.version!="number"&&(r.version=1),await yn.promises.writeFile(t,(0,Lt.dumpSpotlightYaml)(r),"utf-8")}async function hM(t,e){let n=(0,Lt.normalizeSpotlightViewId)(t,t);for(let r of[mt.join((0,Vf.getAgentideHome)(),"analytics","views",n,"view.yaml"),e?.trim()?mt.join(e.trim(),Ff.AGENTIDE_DIR_NAME,"analytics","views",n,"view.yaml"):""].filter(Boolean))if(await(0,ll.pathExists)(r))return!0;return!1}});var Zf=T(Rr=>{"use strict";var mM=Rr&&Rr.__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]})),EM=Rr&&Rr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yf=Rr&&Rr.__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"&&mM(n,e,r[s]);return EM(n,e),n}})();Object.defineProperty(Rr,"__esModule",{value:!0});Rr.storeCommand=SM;Rr.installFromStore=pw;Rr.resolvePublishBundleMode=gw;var eo=Yf(require("fs/promises")),wi=Yf(require("path")),dw=Yf(require("os")),yM=require("zlib"),ul=qe(),_M=cd(),fw=dd(),Fs=Ic(),Jf=Da(),na=kf(),wM=fd(),Wf=jf();function to(){let t=process.env.AGENTHIPPO_STORE_REPO,e=Fs.DEFAULT_STORE_OWNER,n=Fs.DEFAULT_STORE_REPO;if(t){let r=t.split("/");r.length===2&&(e=r[0],n=r[1])}return{owner:e,repo:n,defaultBranch:Fs.DEFAULT_STORE_BRANCH,paths:Fs.STORE_PATHS}}function AM(){if(process.env.AGENTHIPPO_STORE_URL)return process.env.AGENTHIPPO_STORE_URL;let t=to();return`https://${t.owner}.github.io/${t.repo}/store-index.json`}function Xf(){return process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN}async function zf(t,e={}){let n=Xf(),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 Vs={appendLine:t=>{process.env.VERBOSE==="1"&&console.error(t)}};async function SM(t){switch(t.verbose&&(process.env.VERBOSE="1"),t.action){case"search":await bM(t);break;case"install":await pw(t);break;case"publish":await TM(t);break;case"uninstall":case"remove":await IM(t);break;case"info":await PM(t);break;case"list":await NM(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 or=Fs.STORE_ICONS;async function bM(t){let e=t.query?.toLowerCase()||"",n=t.limit||20,r=t.type,s=await Qf(),i=new fw.LocalRegistry,o=new Set((await i.listPacks()).map(g=>g.slug)),a=await i.listSkills(),c=await i.listMcp(),l=await mw(),f=new Map(a.map(g=>[g.slug,g.installedTo||[]])),u=new Map(c.map(g=>[g.slug,g.installedTo||[]])),d=s.artifacts.filter(g=>r&&g.type!==r?!1:e?[g.slug,g.displayName,g.description,...g.tags||[]].join(" ").toLowerCase().includes(e):!0);d.sort((g,m)=>{let h=g.slug.toLowerCase()===e,E=m.slug.toLowerCase()===e;return h&&!E?-1:!h&&E?1:g.slug.localeCompare(m.slug)}),d=d.slice(0,n);let p=d.map(g=>{let m=!1,h;return g.type==="pack"?m=o.has(g.slug):g.type==="skill"?(h=f.get(g.slug),m=h!==void 0&&h.length>0):g.type==="mcp"?(h=u.get(g.slug),m=h!==void 0&&h.length>0):g.type==="engine"&&(m=l.has(g.slug)),{...g,isLocal:m,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 m=g.latestVersion?`v${g.latestVersion}`:"",h=g.isLocal?or.local:or.remote,E=g.isLocal?` ${or.installed}`:"";if(console.log(` ${h} ${g.type}/${g.slug} ${m}${E}`),g.description){let y=g.description.length>60?g.description.slice(0,57)+"...":g.description;console.log(` ${y}`)}g.installedTo&&g.installedTo.length>0&&console.log(` Installed to: ${g.installedTo.join(", ")}`)}console.log(""),console.log(`Legend: ${or.local} Local ${or.remote} Remote ${or.installed} Installed`),console.log(""),console.log("Install with:"),console.log(" agenthippo store install <type>/<slug>"),console.log("")}async function pw(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=dl(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 f=await qf(n,r);f.length>0?(o=f.find(d=>!d.isPrerelease)?.version||f[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 f=await Kf(n,r,o);f.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let{installSpotlightViewFromFiles:u}=await Promise.resolve().then(()=>Sn(uw())),d=await u(f.map(p=>({path:p.path,content:p.content})),{slug:r,version:o,overwrite:!!t.force,workspaceRoot:i,logger:Vs});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 f=await Kf(n,r,o);f.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let u=await(0,Jf.installCustomEngineFromFiles)(f,{slug:r,version:o,overwrite:!!t.force,logger:Vs});console.log(""),console.log(`\u2713 Installed engine/${u.id} to:`),console.log(` ${u.installDir}`),console.log("");return}let a=t.agent||"default",c;switch(n){case"skill":c=wi.join(i,ul.AGENTIDE_DIR_NAME,"agents",a,"skills",r);break;case"pack":c=t.installDir?wi.resolve(t.installDir):wi.join(dw.homedir(),ul.AGENTIDE_DIR_NAME,"agents",r,o);break;case"mcp":c=wi.join(i,ul.AGENTIDE_DIR_NAME,"agents",a,"mcp",r);break}try{await eo.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 eo.rm(c,{recursive:!0,force:!0})}catch{}console.log(" Downloading...");let l=await Kf(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 eo.mkdir(c,{recursive:!0});for(let f of l){let u=(0,_M.safeJoin)(c,f.path);u||(console.error(`Error: refusing install \u2014 artifact path escapes destination (${f.path})`),process.exit(1)),await eo.mkdir(wi.dirname(u),{recursive:!0}),await eo.writeFile(u,f.content)}if(n==="pack"&&!t.installDir){let f=wi.join(dw.homedir(),ul.AGENTIDE_DIR_NAME,"agents",r);await eo.writeFile(wi.join(f,"current.txt"),o)}console.log(""),console.log(`\u2713 Installed ${n}/${r} to:`),console.log(` ${c}`),console.log("")}function gw(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 TM(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=dl(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)),Xf()||(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 vM(t,r,s);return}await OM(t,r,s)}async function vM(t,e,n){let r=t.workspace||process.cwd(),s=await(0,na.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,na.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,na.isValidPublishVersion)(o)||(console.error(`Error: Invalid version "${o}". Use semver (e.g., 1.0.0).`),process.exit(1));let a=await(0,na.collectEngineFiles)(s),c=to();console.log(` Target store: ${c.owner}/${c.repo}`),console.log(` Version tag: engines/${e}/v${o}`),console.log(` Files: ${a.length}`),await hw({options:t,type:"engine",slug:e,version:o,files:a,installHint:`agenthippo store install engine/${e}`})}async function OM(t,e,n){let r=t.workspace||process.cwd(),s=gw(t),i=await(0,Wf.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,Wf.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,na.isValidPublishVersion)(c)||(console.error(`Error: Invalid version "${c}". Use semver (e.g., 1.0.0).`),process.exit(1));let l=await(0,Wf.collectViewFiles)(o,c,a.metadata,s),f=to(),u=l.filter(d=>d.encoding==="base64").length;console.log(` Target store: ${f.owner}/${f.repo}`),console.log(` Version tag: spotlight/${e}/v${c}`),console.log(` Files: ${l.length}${u>0?` (${u} binary)`:""}`),await hw({options:t,type:"view",slug:e,version:c,files:l,bundle:s,installHint:`agenthippo store install view/${e}`})}async function hw(t){let{options:e,type:n,slug:r,version:s,files:i,bundle:o,installHint:a}=t;try{let c=await(0,wM.publishToStore)({type:n,slug:r,version:s,files:i},Vs);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 IM(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}=dl(t.query);e!=="engine"&&(console.error(`Error: store uninstall currently supports custom engines only, got ${e}/${n}`),process.exit(1));let r=await(0,Jf.uninstallCustomEngine)(n,{logger:Vs});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 PM(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store info <type>/<slug>"),process.exit(1));let e=dl(t.query),r=(await Qf()).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 qf(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 qf(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 NM(t){let e=await Qf(),n=t.type,r=new fw.LocalRegistry,s=new Set((await r.listPacks()).map(p=>p.slug)),i=await r.listSkills(),o=await r.listMcp(),a=await mw(),c=new Map(i.map(p=>[p.slug,p.installedTo||[]])),l=new Map(o.map(p=>[p.slug,p.installedTo||[]])),f=e.artifacts;n&&(f=f.filter(p=>p.type===n));let u=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=f.map(g=>({...g,isLocal:u(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 ${f.length} artifact(s):`),console.log("");let d={};for(let p of f)d[p.type]=d[p.type]||[],d[p.type].push(p);for(let p of["pack","skill","mcp","engine"]){let g=d[p]||[];if(g.length!==0){console.log(`${p}s (${g.length}):`);for(let m of g){let h=m.latestVersion?` v${m.latestVersion}`:"",E=u(m),y=E?or.local:or.remote,w=E?` ${or.installed}`:"";console.log(` ${y} ${m.slug}${h}${w}`)}console.log("")}}console.log(`Legend: ${or.local} Local ${or.remote} Remote ${or.installed} Installed`),console.log("")}function dl(t){try{return(0,Fs.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 mw(){return new Set((await(0,Jf.listInstalledCustomEngines)()).map(t=>t.id))}async function Qf(){let t=AM();Vs.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(Xf()&&(e.status===403||e.status===404)){Vs.appendLine("[Store] GitHub Pages not available, trying API with auth...");let r=to(),s=`https://api.github.com/repos/${r.owner}/${r.repo}/contents/dist/store-index.json`;if(e=await zf(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 qf(t,e){let n=to(),s=`${(0,Fs.getStorePath)(t)}/${e}/v`,i=`https://api.github.com/repos/${n.owner}/${n.repo}/git/refs/tags`;Vs.appendLine(`[Store] Listing versions for ${t}/${e}`);let o=await zf(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 f=l.replace("refs/tags/","");if(f.startsWith(s)){let u=f.slice(s.length-1);c.push({version:u.replace(/^v/,""),tagName:f,isPrerelease:/-(alpha|beta|rc|pre)/.test(u)})}}return c.sort((l,f)=>f.version.localeCompare(l.version,void 0,{numeric:!0}))}async function Kf(t,e,n){let r=to(),s=(0,Fs.getStorePath)(t),i;n==="main"||n==="latest"?i=r.defaultBranch:i=`${s}/${e}/v${n.replace(/^v/,"")}`,Vs.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 zf(a);if(!c.ok)throw new Error(`Failed to download: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer()),f=(0,yM.gunzipSync)(l),u=RM(f),d=`${s}/${e}/`,p=[];for(let[g,m]of u){let h=g.indexOf("/");if(h===-1)continue;let E=g.slice(h+1);if(E.startsWith(d)){let y=E.slice(d.length);y&&p.push({path:y,content:m})}}return p}function RM(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 Ew=T(ep=>{"use strict";Object.defineProperty(ep,"__esModule",{value:!0});ep.parsePackInstallRef=CM;function CM(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 _w=T(Ss=>{"use strict";var kM=Ss&&Ss.__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]})),$M=Ss&&Ss.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yw=Ss&&Ss.__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"&&kM(n,e,r[s]);return $M(n,e),n}})();Object.defineProperty(Ss,"__esModule",{value:!0});Ss.packCommand=GM;var no=yw(require("fs")),pl=yw(require("path")),ro=ci(),fl=qe(),DM=Hi(),ar=No(),LM=Zf(),MM=Ew(),tp="-".repeat(62);async function GM(t){let e=t.workspace;switch(t.action){case"list":await HM(e);break;case"validate":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack validate <name>"),process.exit(1)),await jM(t.name,e);break;case"info":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack info <name>"),process.exit(1)),await xM(t.name,e);break;case"sign":await FM(t);break;case"verify":await VM(t);break;case"digest":await WM(t);break;case"keygen":BM(t);break;case"install":await UM(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 UM(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,MM.parsePackInstallRef)(t.name);await(0,LM.installFromStore)({action:"install",query:`pack/${n}${r?`@${r}`:""}`,workspace:t.workspace,version:r,force:t.force,installDir:pl.resolve(e),verbose:t.verbose})}async function HM(t){let e=(0,ro.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}/${fl.AGENTIDE_DIR_NAME}/agents/`),console.log(` User library: ~/${fl.AGENTIDE_DIR_NAME}/agents/`),console.log(""),console.log("Create a pack with:"),console.log(` mkdir -p ~/${fl.AGENTIDE_DIR_NAME}/agents/my-agent/1.0.0`),console.log(` echo "1.0.0" > ~/${fl.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 jM(t,e){console.log(`Validating pack: ${t}`),console.log("");let n=(0,ro.resolvePackPath)(t,e);n||(console.error(`Error: Pack not found: ${t}`),process.exit(1));let r=[],s=[],i=pl.join(n,"agent.yaml");no.existsSync(i)?console.log(" OK: agent.yaml exists"):r.push("Missing agent.yaml");try{let o=await(0,ro.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}`);let a=pl.join(n,"AGENTS.md");if(no.existsSync(a)){let c=no.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 xM(t,e){try{let n=await(0,ro.loadAgentPack)(t,e);if(console.log(""),console.log(tp),console.log(`Agent: ${n.manifest.metadata.name}`),console.log(tp),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}`),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(tp),console.log("")}catch(n){console.error(`Error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function np(t,e){t||(console.error("Error: pack name or path required"),process.exit(1));let n=(0,ro.resolvePackPath)(t,e);n||(console.error(`Error: pack not found: ${t}`),process.exit(1));let r=await(0,ro.loadAgentPack)(n,e);return{packPath:r.packPath,name:r.manifest.metadata.name,version:r.manifest.metadata.version??"0.0.0"}}function BM(t){let e=t.kid||`sign-${new Date().toISOString().slice(0,10)}`,n=(0,DM.generateWarrantKeypair)(e),r=t.output;r?(no.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 FM(t){let{packPath:e,name:n,version:r}=await np(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=no.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,ar.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 ${pl.join(e,ar.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 VM(t){let{packPath:e,name:n,version:r}=await np(t.name,t.workspace),s=(0,ar.readPackSignature)(e);s||(console.error(`UNSIGNED: no ${ar.PACK_SIGNATURE_FILE} at ${e}`),console.error((0,ar.describePackRefusal)({kind:"unsigned",detail:`no ${ar.PACK_SIGNATURE_FILE}`,pack:n,packVersion:r,packDir:e})),process.exit(1));let i={};if(t.keys)try{i=JSON.parse(no.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,ar.loadPackTrustRoot)({env:t.jwks?{...process.env,[ar.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,ar.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,ar.verifyPack)(s,i,{packDir:e,pack:n,packVersion:r});o.ok||(console.error(`INVALID: ${o.reason}`),console.error((0,ar.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 WM(t){let{packPath:e,name:n,version:r}=await np(t.name,t.workspace);console.log(`${(0,ar.computePackDigest)(e)} ${n}@${r}`)}});var Aw=T(ra=>{"use strict";Object.defineProperty(ra,"__esModule",{value:!0});ra.parseStrictJsonConfig=ww;ra.collectMissingChannelEnvSecrets=qM;ra.disableChannelsInConfigText=YM;var KM=8;function Ai(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ww(t){try{return JSON.parse(t)}catch{return}}function rp(t,e,n){if(!(n>KM)){if(Array.isArray(t)){for(let r of t)rp(r,e,n+1);return}if(Ai(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))rp(r,e,n+1)}}}function qM(t,e){if(!Ai(t)||!Ai(t.channels))return[];let n=[];for(let[r,s]of Object.entries(t.channels)){if(!Ai(s)||s.enabled===!1)continue;let i=new Set;rp(s,i,0);let o=[...i].filter(a=>!e[a]?.trim()).sort();o.length&&n.push({channel:r,envVars:o})}return n}function YM(t,e){let n=ww(t);if(!(!Ai(n)||!Ai(n.channels))){for(let r of e){let s=n.channels[r];Ai(s)&&(s.enabled=!1)}return`${JSON.stringify(n,null,2)}
|
|
614
|
-
`}}});var bw=T(gl=>{"use strict";Object.defineProperty(gl,"__esModule",{value:!0});gl.quoteWindowsCommandLineArg=Sw;gl.buildWindowsArgumentLine=JM;function Sw(t){return t.length===0?'""':/[ \t"]/u.test(t)?`"${t.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\+)$/g,"$1$1")}"`:t}function JM(t){return t.map(e=>Sw(e)).join(" ")}});var Tw=T(sp=>{"use strict";Object.defineProperty(sp,"__esModule",{value:!0});sp.isGatewayScopeAuthError=XM;function XM(t){let e=t.toLowerCase();return e.includes("missing scope")||e.includes("operator.admin")}});var vw=T(cr=>{"use strict";Object.defineProperty(cr,"__esModule",{value:!0});cr.ANYWHERE_INSTALL_SOURCE_FORMS=cr.ANYWHERE_CONFIG_TEMPLATE_ENV=cr.ANYWHERE_SETUP_SCRIPT_ENV=cr.ANYWHERE_INSTALL_SOURCE_ENV=void 0;cr.validateAnywhereInstallSource=nG;cr.ANYWHERE_INSTALL_SOURCE_ENV="AH_INSTALL_SOURCE";cr.ANYWHERE_SETUP_SCRIPT_ENV="AH_SETUP_SCRIPT";cr.ANYWHERE_CONFIG_TEMPLATE_ENV="AH_CONFIG_TEMPLATE";var zM=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:@[a-zA-Z0-9^~*><=][a-zA-Z0-9.^~*+><=|_-]*)?$/,QM=/^github:[A-Za-z0-9][A-Za-z0-9._-]*\/[A-Za-z0-9][A-Za-z0-9._-]*(?:#[A-Za-z0-9._/-]+)?$/,ZM=/^https:\/\/[A-Za-z0-9._-]+(?::\d+)?\/[A-Za-z0-9._~!$'()*+,;=:@%/-]*\.(?:tgz|tar\.gz)$/,eG=/^(?:\.{1,2})?\/[^\0<>"'`;|&$\n\r]*$/,tG=/^[A-Za-z]:[\\/][^\0<>"'`;|&$\n\r]*$/;cr.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 nG(t){let e=r=>({ok:!1,reason:`${r} \u2014 ${cr.ANYWHERE_INSTALL_SOURCE_FORMS}`}),n=t.trim();return n?n!==t?e("it has leading or trailing whitespace"):zM.test(n)||QM.test(n)||ZM.test(n)||eG.test(n)||tG.test(n)?{ok:!0}:e("it is not one of the accepted forms"):e("it is empty")}});var Ww=T(D=>{"use strict";var rG=D&&D.__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]})),sG=D&&D.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bl=D&&D.__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 sG(n,e),n}})();Object.defineProperty(D,"__esModule",{value:!0});D.GatewayLifecycleManager=D.validateAnywhereInstallSource=D.ANYWHERE_SETUP_SCRIPT_ENV=D.ANYWHERE_INSTALL_SOURCE_ENV=D.ANYWHERE_CONFIG_TEMPLATE_ENV=D.AGENT_ANYWHERE_LABEL=void 0;D.detectGateway=yl;var
|
|
613
|
+
`)}`);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 iM(t,e,n,r="scripts-only"){if(!(0,Uf.isValidPublishVersion)(e.replace(/^v/,"")))throw new Error(`Invalid publish version: ${e}`);let s=[],i=Ot.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:ew,content:(0,Zi.dumpSpotlightYaml)(a),encoding:"utf-8"}),s.push({path:W0,content:(0,Zi.dumpSpotlightYaml)({id:t.id,name:n.name,scope:n.scope,scripts:n.scripts}),encoding:"utf-8"});let c=Ot.join(t.viewRoot,"README.md");return await(0,Qr.pathExists)(c)&&s.push(await Gf(c,"README.md")),await(0,Qr.pathExists)(i)&&await cl(i,"scripts",iw,async(l,f)=>{s.push(await Gf(l,f))}),r==="full"&&await cw(t.viewRoot,async(l,f)=>{s.push(await Gf(l,f))}),s}});var uw=T(ir=>{"use strict";var oM=ir&&ir.__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]})),aM=ir&&ir.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cM=ir&&ir.__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"&&oM(n,e,r[s]);return aM(n,e),n}})();Object.defineProperty(ir,"__esModule",{value:!0});ir.installSpotlightViewFromFiles=fM;ir.listInstalledSpotlightViews=pM;ir.setActiveSpotlightView=gM;ir.isSpotlightViewInstalled=hM;var yn=require("fs"),mt=cM(require("path")),Ff=Ye(),ll=Zt(),Vf=Ao(),Bf=jf(),Lt=Mf();function xf(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>mt.basename(e.trim())):[]}function lw(t){let e=new Set,n=[];for(let r of t){let s=mt.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function lM(t,e){if(t==="workspace"){if(!e?.trim())throw new Error("Workspace-scoped views require an open workspace folder");return mt.join(e.trim(),Ff.AGENTIDE_DIR_NAME,"analytics")}return mt.join((0,Vf.getAgentideHome)(),"analytics")}function uM(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 dM(t,e,n){await yn.promises.mkdir(mt.dirname(t),{recursive:!0});let r;try{let c=await yn.promises.readFile(t,"utf-8");r=(0,Lt.parseSpotlightYamlRecord)(c)??{version:1,activeViewId:"global",views:[]}}catch{r={version:1,activeViewId:"global",views:[]}}let s=Array.isArray(r.views)?[...r.views]:[],i=(0,Lt.normalizeSpotlightViewId)(e.id),o=s.findIndex(c=>{if(!c||typeof c!="object")return!1;let l=c;return(0,Lt.normalizeSpotlightViewId)(typeof l.id=="string"?l.id:void 0)===i}),a={id:i,name:e.name,scope:e.scope,scripts:lw(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 yn.promises.writeFile(t,(0,Lt.dumpSpotlightYaml)(r),"utf-8")}async function fM(t,e){let n=uM(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,Lt.parseSpotlightYamlRecord)(r.toString("utf-8")),o=(0,Lt.parseSpotlightYamlRecord)(s.toString("utf-8"));if(!i||!o)throw new Error("Invalid view.yaml or panel-entry.yaml in store bundle");let a=(0,Lt.normalizeSpotlightViewId)(typeof i.id=="string"?i.id:e.slug,e.slug);if(a!==(0,Lt.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,f=lw(xf(i.scripts).length?xf(i.scripts):xf(o.scripts)),u=lM(c,e.workspaceRoot),d=mt.join(u,"views",a),p=mt.join(u,"panel","views.yaml"),g=mt.join(d,"scripts");if(!e.overwrite&&await(0,ll.pathExists)(d))throw new Error(`Spotlight view "${a}" already exists at ${d}`);e.overwrite&&await yn.promises.rm(d,{recursive:!0,force:!0}),await yn.promises.mkdir(g,{recursive:!0});let m=["scripts/","assets/","images/","charts/","reports/","exports/"],h=new Set(["manifest.json","README.md"]),E=new Set(["view.yaml","panel-entry.yaml"]);for(let[b,v]of n.entries()){if(E.has(b)||!h.has(b)&&!m.some(I=>b.startsWith(I)))continue;let A=mt.resolve(d),S=mt.resolve(A,b);if(!S.startsWith(A+mt.sep))throw new Error(`Store bundle entry "${b}" escapes the install directory`);await yn.promises.mkdir(mt.dirname(S),{recursive:!0}),await yn.promises.writeFile(S,v)}let y=new Date().toISOString(),w=(0,Bf.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0",P={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:y,updatedAt:y,scripts:f,storeVersion:w};if(Array.isArray(i.tags)&&(P.tags=i.tags.filter(b=>typeof b=="string")),await yn.promises.writeFile(mt.join(d,"view.yaml"),(0,Lt.dumpSpotlightYaml)(P),"utf-8"),await dM(p,{id:a,name:l,scope:c,scripts:f},!!e.overwrite),e.activate){let b;try{let v=await yn.promises.readFile(p,"utf-8");b=(0,Lt.parseSpotlightYamlRecord)(v)??{}}catch{b={version:1,views:[]}}b.activeViewId=a,typeof b.version!="number"&&(b.version=1),await yn.promises.writeFile(p,(0,Lt.dumpSpotlightYaml)(b),"utf-8")}return e.logger&&(0,ll.logInfo)(e.logger,`[Spotlight] Installed view "${a}" to ${d}`),{id:a,scope:c,installDir:d,viewsConfigPath:p,version:(0,Bf.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0"}}async function pM(t){let e=[],n=new Set;async function r(s){let i=mt.join(s,"views");if(!await(0,ll.pathExists)(i))return;let o=await yn.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=mt.join(i,a.name,"view.yaml");try{let f=await yn.promises.readFile(l,"utf-8"),u=(0,Lt.parseSpotlightYamlRecord)(f);if(!u)continue;let d=(0,Lt.normalizeSpotlightViewId)(typeof u.id=="string"?u.id:a.name,a.name),p=u.scope==="workspace"?"workspace":"global";n.add(c),e.push({slug:d,displayName:typeof u.name=="string"&&u.name.trim()?u.name.trim():d,description:typeof u.description=="string"?u.description.trim():void 0,tags:Array.isArray(u.tags)?u.tags.filter(g=>typeof g=="string"):["spotlight"],latestVersion:typeof u.storeVersion=="string"?u.storeVersion:(0,Bf.resolveViewPublishVersionFromParsed)(u)??"local",scope:p})}catch{}}}return await r(mt.join((0,Vf.getAgentideHome)(),"analytics")),t?.trim()&&await r(mt.join(t.trim(),Ff.AGENTIDE_DIR_NAME,"analytics")),e.sort((s,i)=>s.slug.localeCompare(i.slug))}async function gM(t,e){let n=(0,Lt.normalizeSpotlightViewId)(e,e),r;try{let s=await yn.promises.readFile(t,"utf-8");r=(0,Lt.parseSpotlightYamlRecord)(s)??{version:1,views:[]}}catch{r={version:1,views:[]}}r.activeViewId=n,typeof r.version!="number"&&(r.version=1),await yn.promises.writeFile(t,(0,Lt.dumpSpotlightYaml)(r),"utf-8")}async function hM(t,e){let n=(0,Lt.normalizeSpotlightViewId)(t,t);for(let r of[mt.join((0,Vf.getAgentideHome)(),"analytics","views",n,"view.yaml"),e?.trim()?mt.join(e.trim(),Ff.AGENTIDE_DIR_NAME,"analytics","views",n,"view.yaml"):""].filter(Boolean))if(await(0,ll.pathExists)(r))return!0;return!1}});var Zf=T(Rr=>{"use strict";var mM=Rr&&Rr.__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]})),EM=Rr&&Rr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yf=Rr&&Rr.__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"&&mM(n,e,r[s]);return EM(n,e),n}})();Object.defineProperty(Rr,"__esModule",{value:!0});Rr.storeCommand=SM;Rr.installFromStore=pw;Rr.resolvePublishBundleMode=gw;var eo=Yf(require("fs/promises")),wi=Yf(require("path")),dw=Yf(require("os")),yM=require("zlib"),ul=Ye(),_M=cd(),fw=dd(),Fs=Ic(),Jf=Da(),na=kf(),wM=fd(),Wf=jf();function to(){let t=process.env.AGENTHIPPO_STORE_REPO,e=Fs.DEFAULT_STORE_OWNER,n=Fs.DEFAULT_STORE_REPO;if(t){let r=t.split("/");r.length===2&&(e=r[0],n=r[1])}return{owner:e,repo:n,defaultBranch:Fs.DEFAULT_STORE_BRANCH,paths:Fs.STORE_PATHS}}function AM(){if(process.env.AGENTHIPPO_STORE_URL)return process.env.AGENTHIPPO_STORE_URL;let t=to();return`https://${t.owner}.github.io/${t.repo}/store-index.json`}function Xf(){return process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN}async function zf(t,e={}){let n=Xf(),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 Vs={appendLine:t=>{process.env.VERBOSE==="1"&&console.error(t)}};async function SM(t){switch(t.verbose&&(process.env.VERBOSE="1"),t.action){case"search":await bM(t);break;case"install":await pw(t);break;case"publish":await TM(t);break;case"uninstall":case"remove":await IM(t);break;case"info":await PM(t);break;case"list":await NM(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 or=Fs.STORE_ICONS;async function bM(t){let e=t.query?.toLowerCase()||"",n=t.limit||20,r=t.type,s=await Qf(),i=new fw.LocalRegistry,o=new Set((await i.listPacks()).map(g=>g.slug)),a=await i.listSkills(),c=await i.listMcp(),l=await mw(),f=new Map(a.map(g=>[g.slug,g.installedTo||[]])),u=new Map(c.map(g=>[g.slug,g.installedTo||[]])),d=s.artifacts.filter(g=>r&&g.type!==r?!1:e?[g.slug,g.displayName,g.description,...g.tags||[]].join(" ").toLowerCase().includes(e):!0);d.sort((g,m)=>{let h=g.slug.toLowerCase()===e,E=m.slug.toLowerCase()===e;return h&&!E?-1:!h&&E?1:g.slug.localeCompare(m.slug)}),d=d.slice(0,n);let p=d.map(g=>{let m=!1,h;return g.type==="pack"?m=o.has(g.slug):g.type==="skill"?(h=f.get(g.slug),m=h!==void 0&&h.length>0):g.type==="mcp"?(h=u.get(g.slug),m=h!==void 0&&h.length>0):g.type==="engine"&&(m=l.has(g.slug)),{...g,isLocal:m,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 m=g.latestVersion?`v${g.latestVersion}`:"",h=g.isLocal?or.local:or.remote,E=g.isLocal?` ${or.installed}`:"";if(console.log(` ${h} ${g.type}/${g.slug} ${m}${E}`),g.description){let y=g.description.length>60?g.description.slice(0,57)+"...":g.description;console.log(` ${y}`)}g.installedTo&&g.installedTo.length>0&&console.log(` Installed to: ${g.installedTo.join(", ")}`)}console.log(""),console.log(`Legend: ${or.local} Local ${or.remote} Remote ${or.installed} Installed`),console.log(""),console.log("Install with:"),console.log(" agenthippo store install <type>/<slug>"),console.log("")}async function pw(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=dl(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 f=await qf(n,r);f.length>0?(o=f.find(d=>!d.isPrerelease)?.version||f[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 f=await Kf(n,r,o);f.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let{installSpotlightViewFromFiles:u}=await Promise.resolve().then(()=>Sn(uw())),d=await u(f.map(p=>({path:p.path,content:p.content})),{slug:r,version:o,overwrite:!!t.force,workspaceRoot:i,logger:Vs});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 f=await Kf(n,r,o);f.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let u=await(0,Jf.installCustomEngineFromFiles)(f,{slug:r,version:o,overwrite:!!t.force,logger:Vs});console.log(""),console.log(`\u2713 Installed engine/${u.id} to:`),console.log(` ${u.installDir}`),console.log("");return}let a=t.agent||"default",c;switch(n){case"skill":c=wi.join(i,ul.AGENTIDE_DIR_NAME,"agents",a,"skills",r);break;case"pack":c=t.installDir?wi.resolve(t.installDir):wi.join(dw.homedir(),ul.AGENTIDE_DIR_NAME,"agents",r,o);break;case"mcp":c=wi.join(i,ul.AGENTIDE_DIR_NAME,"agents",a,"mcp",r);break}try{await eo.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 eo.rm(c,{recursive:!0,force:!0})}catch{}console.log(" Downloading...");let l=await Kf(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 eo.mkdir(c,{recursive:!0});for(let f of l){let u=(0,_M.safeJoin)(c,f.path);u||(console.error(`Error: refusing install \u2014 artifact path escapes destination (${f.path})`),process.exit(1)),await eo.mkdir(wi.dirname(u),{recursive:!0}),await eo.writeFile(u,f.content)}if(n==="pack"&&!t.installDir){let f=wi.join(dw.homedir(),ul.AGENTIDE_DIR_NAME,"agents",r);await eo.writeFile(wi.join(f,"current.txt"),o)}console.log(""),console.log(`\u2713 Installed ${n}/${r} to:`),console.log(` ${c}`),console.log("")}function gw(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 TM(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=dl(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)),Xf()||(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 vM(t,r,s);return}await OM(t,r,s)}async function vM(t,e,n){let r=t.workspace||process.cwd(),s=await(0,na.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,na.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,na.isValidPublishVersion)(o)||(console.error(`Error: Invalid version "${o}". Use semver (e.g., 1.0.0).`),process.exit(1));let a=await(0,na.collectEngineFiles)(s),c=to();console.log(` Target store: ${c.owner}/${c.repo}`),console.log(` Version tag: engines/${e}/v${o}`),console.log(` Files: ${a.length}`),await hw({options:t,type:"engine",slug:e,version:o,files:a,installHint:`agenthippo store install engine/${e}`})}async function OM(t,e,n){let r=t.workspace||process.cwd(),s=gw(t),i=await(0,Wf.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,Wf.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,na.isValidPublishVersion)(c)||(console.error(`Error: Invalid version "${c}". Use semver (e.g., 1.0.0).`),process.exit(1));let l=await(0,Wf.collectViewFiles)(o,c,a.metadata,s),f=to(),u=l.filter(d=>d.encoding==="base64").length;console.log(` Target store: ${f.owner}/${f.repo}`),console.log(` Version tag: spotlight/${e}/v${c}`),console.log(` Files: ${l.length}${u>0?` (${u} binary)`:""}`),await hw({options:t,type:"view",slug:e,version:c,files:l,bundle:s,installHint:`agenthippo store install view/${e}`})}async function hw(t){let{options:e,type:n,slug:r,version:s,files:i,bundle:o,installHint:a}=t;try{let c=await(0,wM.publishToStore)({type:n,slug:r,version:s,files:i},Vs);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 IM(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}=dl(t.query);e!=="engine"&&(console.error(`Error: store uninstall currently supports custom engines only, got ${e}/${n}`),process.exit(1));let r=await(0,Jf.uninstallCustomEngine)(n,{logger:Vs});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 PM(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store info <type>/<slug>"),process.exit(1));let e=dl(t.query),r=(await Qf()).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 qf(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 qf(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 NM(t){let e=await Qf(),n=t.type,r=new fw.LocalRegistry,s=new Set((await r.listPacks()).map(p=>p.slug)),i=await r.listSkills(),o=await r.listMcp(),a=await mw(),c=new Map(i.map(p=>[p.slug,p.installedTo||[]])),l=new Map(o.map(p=>[p.slug,p.installedTo||[]])),f=e.artifacts;n&&(f=f.filter(p=>p.type===n));let u=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=f.map(g=>({...g,isLocal:u(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 ${f.length} artifact(s):`),console.log("");let d={};for(let p of f)d[p.type]=d[p.type]||[],d[p.type].push(p);for(let p of["pack","skill","mcp","engine"]){let g=d[p]||[];if(g.length!==0){console.log(`${p}s (${g.length}):`);for(let m of g){let h=m.latestVersion?` v${m.latestVersion}`:"",E=u(m),y=E?or.local:or.remote,w=E?` ${or.installed}`:"";console.log(` ${y} ${m.slug}${h}${w}`)}console.log("")}}console.log(`Legend: ${or.local} Local ${or.remote} Remote ${or.installed} Installed`),console.log("")}function dl(t){try{return(0,Fs.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 mw(){return new Set((await(0,Jf.listInstalledCustomEngines)()).map(t=>t.id))}async function Qf(){let t=AM();Vs.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(Xf()&&(e.status===403||e.status===404)){Vs.appendLine("[Store] GitHub Pages not available, trying API with auth...");let r=to(),s=`https://api.github.com/repos/${r.owner}/${r.repo}/contents/dist/store-index.json`;if(e=await zf(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 qf(t,e){let n=to(),s=`${(0,Fs.getStorePath)(t)}/${e}/v`,i=`https://api.github.com/repos/${n.owner}/${n.repo}/git/refs/tags`;Vs.appendLine(`[Store] Listing versions for ${t}/${e}`);let o=await zf(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 f=l.replace("refs/tags/","");if(f.startsWith(s)){let u=f.slice(s.length-1);c.push({version:u.replace(/^v/,""),tagName:f,isPrerelease:/-(alpha|beta|rc|pre)/.test(u)})}}return c.sort((l,f)=>f.version.localeCompare(l.version,void 0,{numeric:!0}))}async function Kf(t,e,n){let r=to(),s=(0,Fs.getStorePath)(t),i;n==="main"||n==="latest"?i=r.defaultBranch:i=`${s}/${e}/v${n.replace(/^v/,"")}`,Vs.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 zf(a);if(!c.ok)throw new Error(`Failed to download: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer()),f=(0,yM.gunzipSync)(l),u=RM(f),d=`${s}/${e}/`,p=[];for(let[g,m]of u){let h=g.indexOf("/");if(h===-1)continue;let E=g.slice(h+1);if(E.startsWith(d)){let y=E.slice(d.length);y&&p.push({path:y,content:m})}}return p}function RM(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 Ew=T(ep=>{"use strict";Object.defineProperty(ep,"__esModule",{value:!0});ep.parsePackInstallRef=CM;function CM(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 _w=T(Ss=>{"use strict";var kM=Ss&&Ss.__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]})),$M=Ss&&Ss.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yw=Ss&&Ss.__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"&&kM(n,e,r[s]);return $M(n,e),n}})();Object.defineProperty(Ss,"__esModule",{value:!0});Ss.packCommand=GM;var no=yw(require("fs")),pl=yw(require("path")),ro=ci(),fl=Ye(),DM=Hi(),ar=No(),LM=Zf(),MM=Ew(),tp="-".repeat(62);async function GM(t){let e=t.workspace;switch(t.action){case"list":await HM(e);break;case"validate":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack validate <name>"),process.exit(1)),await jM(t.name,e);break;case"info":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack info <name>"),process.exit(1)),await xM(t.name,e);break;case"sign":await FM(t);break;case"verify":await VM(t);break;case"digest":await WM(t);break;case"keygen":BM(t);break;case"install":await UM(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 UM(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,MM.parsePackInstallRef)(t.name);await(0,LM.installFromStore)({action:"install",query:`pack/${n}${r?`@${r}`:""}`,workspace:t.workspace,version:r,force:t.force,installDir:pl.resolve(e),verbose:t.verbose})}async function HM(t){let e=(0,ro.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}/${fl.AGENTIDE_DIR_NAME}/agents/`),console.log(` User library: ~/${fl.AGENTIDE_DIR_NAME}/agents/`),console.log(""),console.log("Create a pack with:"),console.log(` mkdir -p ~/${fl.AGENTIDE_DIR_NAME}/agents/my-agent/1.0.0`),console.log(` echo "1.0.0" > ~/${fl.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 jM(t,e){console.log(`Validating pack: ${t}`),console.log("");let n=(0,ro.resolvePackPath)(t,e);n||(console.error(`Error: Pack not found: ${t}`),process.exit(1));let r=[],s=[],i=pl.join(n,"agent.yaml");no.existsSync(i)?console.log(" OK: agent.yaml exists"):r.push("Missing agent.yaml");try{let o=await(0,ro.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}`);let a=pl.join(n,"AGENTS.md");if(no.existsSync(a)){let c=no.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 xM(t,e){try{let n=await(0,ro.loadAgentPack)(t,e);if(console.log(""),console.log(tp),console.log(`Agent: ${n.manifest.metadata.name}`),console.log(tp),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}`),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(tp),console.log("")}catch(n){console.error(`Error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function np(t,e){t||(console.error("Error: pack name or path required"),process.exit(1));let n=(0,ro.resolvePackPath)(t,e);n||(console.error(`Error: pack not found: ${t}`),process.exit(1));let r=await(0,ro.loadAgentPack)(n,e);return{packPath:r.packPath,name:r.manifest.metadata.name,version:r.manifest.metadata.version??"0.0.0"}}function BM(t){let e=t.kid||`sign-${new Date().toISOString().slice(0,10)}`,n=(0,DM.generateWarrantKeypair)(e),r=t.output;r?(no.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 FM(t){let{packPath:e,name:n,version:r}=await np(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=no.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,ar.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 ${pl.join(e,ar.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 VM(t){let{packPath:e,name:n,version:r}=await np(t.name,t.workspace),s=(0,ar.readPackSignature)(e);s||(console.error(`UNSIGNED: no ${ar.PACK_SIGNATURE_FILE} at ${e}`),console.error((0,ar.describePackRefusal)({kind:"unsigned",detail:`no ${ar.PACK_SIGNATURE_FILE}`,pack:n,packVersion:r,packDir:e})),process.exit(1));let i={};if(t.keys)try{i=JSON.parse(no.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,ar.loadPackTrustRoot)({env:t.jwks?{...process.env,[ar.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,ar.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,ar.verifyPack)(s,i,{packDir:e,pack:n,packVersion:r});o.ok||(console.error(`INVALID: ${o.reason}`),console.error((0,ar.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 WM(t){let{packPath:e,name:n,version:r}=await np(t.name,t.workspace);console.log(`${(0,ar.computePackDigest)(e)} ${n}@${r}`)}});var Aw=T(ra=>{"use strict";Object.defineProperty(ra,"__esModule",{value:!0});ra.parseStrictJsonConfig=ww;ra.collectMissingChannelEnvSecrets=qM;ra.disableChannelsInConfigText=YM;var KM=8;function Ai(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ww(t){try{return JSON.parse(t)}catch{return}}function rp(t,e,n){if(!(n>KM)){if(Array.isArray(t)){for(let r of t)rp(r,e,n+1);return}if(Ai(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))rp(r,e,n+1)}}}function qM(t,e){if(!Ai(t)||!Ai(t.channels))return[];let n=[];for(let[r,s]of Object.entries(t.channels)){if(!Ai(s)||s.enabled===!1)continue;let i=new Set;rp(s,i,0);let o=[...i].filter(a=>!e[a]?.trim()).sort();o.length&&n.push({channel:r,envVars:o})}return n}function YM(t,e){let n=ww(t);if(!(!Ai(n)||!Ai(n.channels))){for(let r of e){let s=n.channels[r];Ai(s)&&(s.enabled=!1)}return`${JSON.stringify(n,null,2)}
|
|
614
|
+
`}}});var bw=T(gl=>{"use strict";Object.defineProperty(gl,"__esModule",{value:!0});gl.quoteWindowsCommandLineArg=Sw;gl.buildWindowsArgumentLine=JM;function Sw(t){return t.length===0?'""':/[ \t"]/u.test(t)?`"${t.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\+)$/g,"$1$1")}"`:t}function JM(t){return t.map(e=>Sw(e)).join(" ")}});var Tw=T(sp=>{"use strict";Object.defineProperty(sp,"__esModule",{value:!0});sp.isGatewayScopeAuthError=XM;function XM(t){let e=t.toLowerCase();return e.includes("missing scope")||e.includes("operator.admin")}});var vw=T(cr=>{"use strict";Object.defineProperty(cr,"__esModule",{value:!0});cr.ANYWHERE_INSTALL_SOURCE_FORMS=cr.ANYWHERE_CONFIG_TEMPLATE_ENV=cr.ANYWHERE_SETUP_SCRIPT_ENV=cr.ANYWHERE_INSTALL_SOURCE_ENV=void 0;cr.validateAnywhereInstallSource=nG;cr.ANYWHERE_INSTALL_SOURCE_ENV="AH_INSTALL_SOURCE";cr.ANYWHERE_SETUP_SCRIPT_ENV="AH_SETUP_SCRIPT";cr.ANYWHERE_CONFIG_TEMPLATE_ENV="AH_CONFIG_TEMPLATE";var zM=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:@[a-zA-Z0-9^~*><=][a-zA-Z0-9.^~*+><=|_-]*)?$/,QM=/^github:[A-Za-z0-9][A-Za-z0-9._-]*\/[A-Za-z0-9][A-Za-z0-9._-]*(?:#[A-Za-z0-9._/-]+)?$/,ZM=/^https:\/\/[A-Za-z0-9._-]+(?::\d+)?\/[A-Za-z0-9._~!$'()*+,;=:@%/-]*\.(?:tgz|tar\.gz)$/,eG=/^(?:\.{1,2})?\/[^\0<>"'`;|&$\n\r]*$/,tG=/^[A-Za-z]:[\\/][^\0<>"'`;|&$\n\r]*$/;cr.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 nG(t){let e=r=>({ok:!1,reason:`${r} \u2014 ${cr.ANYWHERE_INSTALL_SOURCE_FORMS}`}),n=t.trim();return n?n!==t?e("it has leading or trailing whitespace"):zM.test(n)||QM.test(n)||ZM.test(n)||eG.test(n)||tG.test(n)?{ok:!0}:e("it is not one of the accepted forms"):e("it is empty")}});var Ww=T(D=>{"use strict";var rG=D&&D.__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]})),sG=D&&D.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bl=D&&D.__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 sG(n,e),n}})();Object.defineProperty(D,"__esModule",{value:!0});D.GatewayLifecycleManager=D.validateAnywhereInstallSource=D.ANYWHERE_SETUP_SCRIPT_ENV=D.ANYWHERE_INSTALL_SOURCE_ENV=D.ANYWHERE_CONFIG_TEMPLATE_ENV=D.AGENT_ANYWHERE_LABEL=void 0;D.detectGateway=yl;var k=bl(require("vscode")),_l=require("child_process"),ip=require("crypto"),Dw=require("util"),G=bl(require("fs")),V=bl(require("path")),ts=bl(require("os")),Se=Ao(),op=ya(),ap=Aw(),iG=bw(),oG=Tw(),cp=tf(),lp=Ye(),Mt=(0,Dw.promisify)(_l.exec),aG=(0,Dw.promisify)(_l.execFile),le=process.platform==="win32",Lw=process.platform==="darwin";function Ow(t,e){if(e)for(let n of e.split(V.delimiter)){let r=n.trim();r.length>0&&t.add(r)}}function cG(){let t=new Set,e=ts.homedir();Ow(t,"/usr/bin:/bin:/usr/sbin:/sbin"),Ow(t,process.env.PATH);let n=[V.join(e,".local","bin"),V.join(e,"Library","pnpm"),V.join(e,".local","share","pnpm"),V.join(e,".npm-global","bin"),V.join(e,".volta","bin"),V.join(e,".fnm"),V.join(e,".asdf","shims"),"/opt/homebrew/bin","/usr/local/bin"];for(let i of n)G.existsSync(i)&&t.add(i);let r=process.env.NVM_DIR||V.join(e,".nvm"),s=V.join(r,"versions","node");if(G.existsSync(s))try{let i=G.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort().reverse().slice(0,8);for(let o of i){let a=V.join(s,o,"bin");G.existsSync(a)&&t.add(a)}}catch{}return Array.from(t).join(V.delimiter)}function hl(){return Lw&&G.existsSync("/bin/zsh")?"/bin/zsh":"/bin/bash"}function ml(t){return Lw?["-lic",t]:["-lc",t]}function up(){if(!le)return{...process.env,PATH:cG(),npm_config_script_shell:"/bin/sh"}}D.AGENT_ANYWHERE_LABEL="Agent Anywhere";var so=`${D.AGENT_ANYWHERE_LABEL} Setup`,Si=`${D.AGENT_ANYWHERE_LABEL} Uninstall`,bi=18789,dp=V.join(ts.homedir(),".openclaw","gateway.log"),Iw="Open Gateway Log";function lG(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}function uG(t){try{if(!G.existsSync(t))return;let n=G.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=lG(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 sa(t){let e=uG(t),n=e?`${D.AGENT_ANYWHERE_LABEL}: Gateway failed to start. ${e}`:`${D.AGENT_ANYWHERE_LABEL}: Gateway failed to start.`;if(await k.window.showErrorMessage(n,Iw)===Iw)try{let s=await k.workspace.openTextDocument(k.Uri.file(t));await k.window.showTextDocument(s,{preview:!1})}catch(s){let i=s instanceof Error?s.message:String(s);k.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Could not open gateway log (${i}). Path: ${t}`)}}var dG=3e4,fG=le?75e3:2e4,pG=3e4,Tl=Se.PID_FILES.gateway(),Zr="hippoclaw",Ap=["@agenthippo-ai/hippoclaw","openclaw"],Sp=V.join(ts.homedir(),".agenthippo","gateway"),wl=V.join(Sp,"install.json"),gp=V.join(Sp,"install-status.json"),bp=le?V.join(process.env.LOCALAPPDATA||V.join(ts.homedir(),"AppData","Local"),"AgentHippo","bin"):V.join(ts.homedir(),".local","bin"),Mw=V.join(bp,le?"hippoclaw.cmd":"hippoclaw"),hp=V.join(bp,le?"openclaw.cmd":"openclaw"),mp=le?"REM Managed by Agent Anywhere":"# Managed by Agent Anywhere",lt=vw();Object.defineProperty(D,"ANYWHERE_CONFIG_TEMPLATE_ENV",{enumerable:!0,get:function(){return lt.ANYWHERE_CONFIG_TEMPLATE_ENV}});Object.defineProperty(D,"ANYWHERE_INSTALL_SOURCE_ENV",{enumerable:!0,get:function(){return lt.ANYWHERE_INSTALL_SOURCE_ENV}});Object.defineProperty(D,"ANYWHERE_SETUP_SCRIPT_ENV",{enumerable:!0,get:function(){return lt.ANYWHERE_SETUP_SCRIPT_ENV}});Object.defineProperty(D,"validateAnywhereInstallSource",{enumerable:!0,get:function(){return lt.validateAnywhereInstallSource}});function gG(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 Pw=[["npmInstallComplete","npm install complete"],["wrapperExists","wrapper exists"],["configExists","config exists"],["distExists","dist exists"],["webUiExists","web UI exists"],["finalCheckPassed","final check passed"]];function es(t){return t.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()}function Gw(t,e){let n=es(t),r=es(e);return n===r||n.startsWith(`${r}/`)}function Ti(){try{if(!G.existsSync(wl))return;let t=G.readFileSync(wl,"utf8").replace(/^/,"");return JSON.parse(t)}catch{return}}function hG(t){G.mkdirSync(Sp,{recursive:!0}),G.writeFileSync(wl,JSON.stringify(t,null,2),"utf8")}function Tp(t){let e=t?.packageRoot;if(!(!e||!G.existsSync(e)))try{return G.realpathSync(e)}catch{return e}}function mG(t){if(!t)return;let e=Ti();return!e?.entryScriptPath&&!e?.cliPath?t:(e.wrapperPath||e.openclawWrapperPath)&&[e.wrapperPath,e.openclawWrapperPath].some(n=>n&&es(t)===es(n))&&(e.entryScriptPath&&G.existsSync(e.entryScriptPath)||e.cliPath&&G.existsSync(e.cliPath))?e.entryScriptPath&&G.existsSync(e.entryScriptPath)?e.entryScriptPath:e.cliPath:t}function Uw(t){if(!t)return;let e=Ti();return e?.cliPath&&[e.wrapperPath,e.openclawWrapperPath,e.entryScriptPath].some(n=>n&&es(t)===es(n))&&G.existsSync(e.cliPath)?e.cliPath:t}function Hw(t){for(let e of[t?.wrapperPath,t?.openclawWrapperPath,t?.cliPath])if(e&&G.existsSync(e))return e}function jw(t){let e=t?.nodePath;if(!(!e||!G.existsSync(e)))return e}function EG(t){let e=t?.entryScriptPath;if(!(!e||!G.existsSync(e)))return e}async function Ep(t,e){let n=e??Ti(),r=t??Hw(n)??await Vw(),s=Uw(r)??r;if(!s||!G.existsSync(s))return;let i=Tp(n)??vp(s);if(!i)return;let o=jw(n)??_G(s),a=EG(n)??yG(i);if(!(!o||!a))return{launcherPath:s,packageRoot:i,nodePath:o,entryScriptPath:a}}function xw(t){try{return G.existsSync(t)?G.readFileSync(t,"utf8").includes(mp):!1}catch{return!1}}function Nw(t,e,n){G.mkdirSync(V.dirname(n),{recursive:!0});let r=le?`@echo off\r
|
|
615
615
|
${mp}\r
|
|
616
616
|
"${t}" "${e}" %*\r
|
|
617
617
|
`:`#!/bin/sh
|
|
618
618
|
${mp}
|
|
619
619
|
exec "${t}" "${e}" "$@"
|
|
620
620
|
`;return G.writeFileSync(n,r,le?"ascii":"utf8"),le||G.chmodSync(n,493),n}function yG(t){if(t)try{let e=V.join(t,"package.json");if(!G.existsSync(e))return;let n=JSON.parse(G.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=V.resolve(t,o);if(G.existsSync(a))return a}}catch{}}function _G(t){let e=Uw(t)??t;if(e){let n=V.join(V.dirname(e),le?"node.exe":"node");if(G.existsSync(n))return n}for(let n of(0,Se.getCommonBinaryPaths)("node"))if(G.existsSync(n))return n}function Rw(){for(let t of[Mw,hp])if(xw(t))try{G.rmSync(t,{force:!0})}catch{}try{G.rmSync(wl,{force:!0})}catch{}}function Bw(t,e){if(G.existsSync(e))try{t.add(G.realpathSync(e))}catch{t.add(e)}}function Cw(t,e){for(let n of Ap)Bw(t,V.join(e,n))}function wG(){let t=ts.homedir(),e=process.env.NVM_DIR||V.join(t,".nvm"),n=V.join(e,"versions","node");if(!G.existsSync(n))return[];let r=[];try{for(let s of G.readdirSync(n,{withFileTypes:!0}))s.isDirectory()&&r.push(...Ap.map(i=>V.join(n,s.name,"lib","node_modules",i)))}catch{}return r}async function ia(){let t=new Set,e=Ti(),n=Tp(e);n&&G.existsSync(n)&&t.add(n);let r=V.join(ts.homedir(),".agenthippo","tools","node");if(G.existsSync(r))try{let s=G.readdirSync(r,{withFileTypes:!0});for(let i of s)if(i.isDirectory())for(let o of Ap){let a=V.join(r,i.name,...le?["node_modules"]:["lib","node_modules"],o);if(G.existsSync(a))try{t.add(G.realpathSync(a))}catch{t.add(a)}}}catch{}Cw(t,V.join(ts.homedir(),".npm-global",...le?["node_modules"]:["lib","node_modules"]));for(let s of wG())Bw(t,s);try{let{stdout:s}=await Mt("npm root -g",{timeout:3e3}),i=s.trim();i&&Cw(t,i)}catch{}return Array.from(t)}function vp(t){try{let e=mG(t)??t,n=G.realpathSync(e),r=V.dirname(n);for(let s=0;s<8;s++){if(G.existsSync(V.join(r,"package.json")))return r;let i=V.dirname(r);if(i===r)break;r=i}}catch{}}async function yp(t,e){let n=e??await ia();if(n.length===0)return!1;let r=vp(t);return r?n.some(s=>Gw(r,s)):!1}async function AG(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(le)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 Mt(`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 Mt(`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 Mt(`ps -p ${s} -o command=`,{timeout:3e3}),o=i.trim();o&&r.push(o)}catch{}return r}catch{return[]}}async function Al(t,e){let n=await ia();if(n.length===0)return!1;let r=!1,s="";if(e&&(r=await yp(e,n),r))try{s=G.realpathSync(e)}catch{s=e}let i=await AG(t);if(i.length===0)return!1;let o=Ti(),a=jw(o),c=[...i];a&&c.push(a);let l=n.map(u=>es(u));a&&l.push(es(V.dirname(a)));let f=s?es(s):"";for(let u of c){let d=es(u);if(d.includes(Zr)&&r||f&&d.includes(f)||l.some(p=>d.includes(p)))return!0}return!1}async function yl(t=bi){let[e,n]=await Promise.all([(0,Se.probePort)(t),ia()]),r=await Vw(n),s;if(r)try{let{stdout:a}=await Mt(`"${r}" --version`,{timeout:3e3});s=a.trim().split(`
|
|
621
|
-
`)[0]}catch{}let i=!!r&&!!s,o=e?await Al(t,r):!1;return{installed:i,binaryPath:r,version:s,running:o,port:t}}async function Fw(t,e){try{if(le){let n=await Ep(t);if(n){e("Running gateway stop via managed node runtime..."),await aG(n.nodePath,[n.entryScriptPath,"gateway","stop"],{timeout:2e4,windowsHide:!0});return}}e(`Running ${V.basename(t)} gateway stop (CLI)...`),await Mt(`"${t}" gateway stop`,{timeout:2e4,windowsHide:!0})}catch{}}function SG(){try{if(!G.existsSync(gp))return;let t=G.readFileSync(gp,"utf8").replace(/^\uFEFF/,"");return JSON.parse(t)}catch{return}}function bG(t){return t?.phase==="complete"&&t.steps?.finalCheckPassed===!0}function TG(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=Pw.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/Pw.length*100))}}function El(t){return t.replace(/'/g,"''")}async function io(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(le)try{let{stdout:e}=await Mt(`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 Mt(`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 Sl(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,Se.probePort)(t),a=r.filter(c=>(0,Se.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,Se.probePort)(t)&&r.every(o=>!(0,Se.isProcessRunning)(o))}function kw(t,e,n){if(e&&e>0)try{process.kill(-e,n);return}catch{}try{t.kill(n)}catch{}}async function _p(t){if(!(!Number.isFinite(t)||t<1||t>65535)){if(le){try{let{stdout:e}=await Mt(`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 Mt(`taskkill /F /T /PID ${r}`,{timeout:5e3}).catch(()=>{})}catch{}return}try{let{stdout:e}=await Mt(`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 Mt(`kill ${i}`,{timeout:3e3}).catch(()=>{});await new Promise(i=>setTimeout(i,800));let{stdout:r}=await Mt(`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 Mt(`kill -9 ${i}`,{timeout:3e3}).catch(()=>{})}catch{}}}async function $w(t,e,n){let r=await io(t);if(e&&(await Fw(e,n),await Sl(t,r)))return!0;n(`Stopping listener(s) on port ${t}...`),await _p(t);let s=[...r];return t!==bi&&await(0,Se.probePort)(bi)&&(s.push(...await io(bi)),n(`Stopping listener(s) on port ${bi} (default gateway port)...`),await _p(bi)),Sl(t,s)}async function vG(t,e,n){await(0,Se.writePidFile)(Tl,t,e,n)}async function fp(){await(0,Se.removePidFile)(Tl)}async function pp(t){let e=await(0,Se.checkPidFileWithCleanup)(Tl);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,Se.probePort)(s)||!await Al(s,r)?null:{installed:!0,binaryPath:r,running:!0,port:s}}async function Vw(t){let e=t??await ia();return OG(e)}async function OG(t){let e=Ti(),n=Tp(e),r=Hw(e);if(n&&r&&G.existsSync(r)&&(t.length===0||t.some(a=>Gw(n,a))))return r;let s=await(0,Se.findBinaryCached)(Zr,(0,Se.getCommonBinaryPaths)(Zr));if(s&&await yp(s,t))return s;let i=le?`${Zr}.cmd`:Zr;for(let o of t){let a=le?V.dirname(V.dirname(o)):V.dirname(V.dirname(V.dirname(o))),c=le?V.join(a,i):V.join(a,"bin",i);if(G.existsSync(c)&&await yp(c,t))return c}}var wp=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 C.EventEmitter;onStatusChange=this._onStatusChange.event;setBridgeRef(e){this._bridgeRef=e}constructor(e,n){this.outputChannel=e,this.statusBarItem=C.window.createStatusBarItem(C.StatusBarAlignment.Right,100),this.statusBarItem.command="agentide.anywhere.toggle",this.statusBarItem.name=D.AGENT_ANYWHERE_LABEL,C.commands.executeCommand("setContext","agentide.anywhere.connected",this._bridgeConnected),this.disposables.push(C.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 pp(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,lp.toSettingsDisplayKey)("agentide.anywhere.autoStart")} = true)`),await this.start())}registerCommands(){this.disposables.push(C.commands.registerCommand("agentide.anywhere.toggle",()=>this.toggle()),C.commands.registerCommand("agentide.anywhere.install",()=>this.install()),C.commands.registerCommand("agentide.anywhere.uninstall",()=>this.uninstall()),C.commands.registerCommand("agentide.anywhere.start",()=>this.start()),C.commands.registerCommand("agentide.anywhere.stop",()=>this.stop()),C.commands.registerCommand("agentide.anywhere.status",()=>this.showStatus()),C.commands.registerCommand("agentide.anywhere.openConfig",()=>this.openConfig()),C.commands.registerCommand("agentide.anywhere.connect",()=>this.connectBridge()),C.commands.registerCommand("agentide.anywhere.disconnect",()=>this.disconnectBridge()),C.commands.registerCommand("agentide.anywhere.openWebUI",()=>this.openWebUI()),C.commands.registerCommand("agentide.anywhere.detect",()=>this.detect()),C.commands.registerCommand("agentide.anywhere.meetAgent",()=>this.showMeetAgentPicker()))}setBridgeConnected(e){this._bridgeConnected=e,C.commands.executeCommand("setContext","agentide.anywhere.connected",e)}registerConfigWatcher(){this.disposables.push(C.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,C.window.showInformationMessage(`${D.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":C.window.showInformationMessage(`${D.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=C.window.showInformationMessage(`${D.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=C.window.showInformationMessage(`${D.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 C.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Install in progress. Follow the "${D.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?C.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Install completed. Status has been refreshed.`):C.window.showWarningMessage(`${D.AGENT_ANYWHERE_LABEL}: Setup terminal is no longer available. Install did not complete; run Install again to relaunch setup.`)}async showGatewayUninstallInProgressPrompt(){await C.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Uninstall in progress. Follow the "${Si}" 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?C.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Uninstall completed. Status has been refreshed.`):C.window.showWarningMessage(`${D.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??C.window.terminals.find(n=>n.name===so||n.name.startsWith(`${so} `))??null;return e?(this._installSetupTerminal=e,e.show(),!0):!1}revealUninstallSetupTerminal(){let e=this._uninstallSetupTerminal??C.window.terminals.find(n=>n.name===Si||n.name.startsWith(`${Si} `))??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,Se.clearBinaryCache)(Zr),(0,Se.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 SG()}getInstallProgressSummary(e){return TG(e)}async detectGatewayState(e){return yl(e)}async detectGatewayFastState(e){return pp(e)}async probeGatewayPort(e){return(0,Se.probePort)(e)}isStartedGatewayProcessAlive(e){return e!==void 0&&(0,Se.isProcessRunning)(e)}getStartupTimeoutMs(){return fG}getStartupCheckIntervalMs(){return 500}getStartupLaunchGraceMs(){return le?15e3:0}getUninstallInitialDelayMs(){return le?2e3:3e3}getUninstallVerificationTimeoutMs(){return le?15e3:9e4}getUninstallCheckIntervalMs(){return le?1e3:4e3}async sleep(e){await new Promise(n=>setTimeout(n,e))}isWindowsLaunch(){return le}async stopExistingGatewayBeforeStart(e){await Fw(e,n=>this.log(n))}getGatewayLockPathForConfig(){let e=(0,ip.createHash)("sha256").update(this.configPath).digest("hex").slice(0,8);return V.join(ts.tmpdir(),"openclaw",`gateway.${e}.lock`)}async removeStaleGatewayLockBeforeStart(e){if(!le)return;let n=this.getGatewayLockPathForConfig();if(!G.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 G.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<pG){this.log(`Gateway lock is only ${Math.round(r/1e3)}s old; not removing (possible concurrent start still binding).`);return}try{G.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 vG(e,n,r)}async reconcileUninstallProgressState(){if(!this._gatewayUninstallInProgress)return this._lastDetection;if(this.revealUninstallSetupTerminal())return this._lastDetection;let e=await yl(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=C.window.showInformationMessage(`${D.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=C.window.showInformationMessage(`${D.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 C.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,cp.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 C.commands.executeCommand("workbench.action.chat.newChat",{agentMode:!0}),await C.commands.executeCommand("workbench.action.chat.open",{mode:"agent",query:"use openclaw skill as needed.",isPartialQuery:!0})}async showMeetAgentPicker(e){if(!this._bridgeRef?.request){C.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,oG.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,cp.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 C.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){C.window.showWarningMessage("No agent registered with the gateway.");return}let l=(await s("agents.list")).external?.find(g=>g.id.toLowerCase()===a.toLowerCase()),f=new Set(l?.boundChannels?.map(g=>g.toLowerCase())??[]),u=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:f.has(g.id.toLowerCase())})),d=await C.window.showQuickPick(u,{canPickMany:!0,title:`Meet ${a} at...`,placeHolder:"Select channels where people can reach this agent"});if(!d)return;let p=d.map(g=>g.channelId);if(await(0,cp.applyAgentChannelBindingsViaConfigPatch)(s,{agentId:a,selectedChannelIds:p,statusPayload:o}),p.length===0)C.window.showInformationMessage(`${a}: all channel bindings removed.`);else{let g=d.map(m=>m.label).join(", ");C.window.showInformationMessage(`${a} can now be reached at: ${g}`)}}catch(i){this.log(`Meet Agent picker failed: ${i}`),C.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 yl(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 C.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Install source not configured. Set "${(0,lp.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in settings.`),!1;let r=(0,lt.validateAnywhereInstallSource)(e);if(!r.ok)return C.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Refusing to install from "${e}" \u2014 ${r.reason}. Fix "${(0,lp.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in your user settings.`),this.log(`Rejected installSource (${r.reason}): ${e}`),!1;if(this._gatewayInstallInProgress)return await C.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Install is already in progress. Watch the "${D.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,Se.clearBinaryCache)(Zr),(0,Se.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=le?"setup-gateway.ps1":"setup-gateway.sh",a=[V.join(__dirname,"..","..","scripts","gateway",i),V.join(__dirname,"..","scripts","gateway",i)].find(h=>G.existsSync(h)),l=[V.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5"),V.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5")].find(h=>G.existsSync(h)),f,u={...up(),[lt.ANYWHERE_INSTALL_SOURCE_ENV]:e,...a?{[lt.ANYWHERE_SETUP_SCRIPT_ENV]:a}:{},...l?{[lt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}};if(a&&le){let h=[`-Source $env:${lt.ANYWHERE_INSTALL_SOURCE_ENV}`];l&&h.push(`-ConfigTemplate $env:${lt.ANYWHERE_CONFIG_TEMPLATE_ENV}`);let E=`& $env:${lt.ANYWHERE_SETUP_SCRIPT_ENV} ${h.join(" ")}; Write-Host ""; Write-Host "You can close this window."`;f={name:so,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",E],env:{[lt.ANYWHERE_INSTALL_SOURCE_ENV]:e,[lt.ANYWHERE_SETUP_SCRIPT_ENV]:a,...l?{[lt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}}}}else if(a){let h=[`--source "$${lt.ANYWHERE_INSTALL_SOURCE_ENV}"`];l&&h.push(`--config-template "$${lt.ANYWHERE_CONFIG_TEMPLATE_ENV}"`);let y=`${`bash "$${lt.ANYWHERE_SETUP_SCRIPT_ENV}" ${h.join(" ")}`}; echo ""; echo "Press Enter to close..."; read`;f={name:so,shellPath:hl(),shellArgs:ml(y),env:u}}else{this.log("Setup script not found, falling back to npm install");let E=`${`npm install -g "$${lt.ANYWHERE_INSTALL_SOURCE_ENV}"`}; echo ""; echo "Press Enter to close..."; read`;f=le?{name:so,shellPath:"cmd.exe",shellArgs:["/c",`npm install -g "%${lt.ANYWHERE_INSTALL_SOURCE_ENV}%" && echo. && echo Setup complete. && pause`],env:{[lt.ANYWHERE_INSTALL_SOURCE_ENV]:e}}:{name:so,shellPath:hl(),shellArgs:ml(E),env:u}}try{G.rmSync(gp,{force:!0})}catch{}this._installProgressMessage="Launching setup...",this.updateStatusBar("starting");let d=C.window.createTerminal(f);this._installSetupTerminal=d,d.show();let p=gG(e)?10*6e4:12e4;this.log(`Waiting up to ${Math.round(p/6e4)} minute(s) for gateway install completion...`);let g=le&&!!a;return await C.window.withProgress({location:C.ProgressLocation.Window,title:`${D.AGENT_ANYWHERE_LABEL}: Installing gateway...`,cancellable:!1},async h=>{let E=Date.now()+p,y=0;for(;Date.now()<E;){if(!this._gatewayInstallInProgress)return this.log("Gateway install wait aborted \u2014 setup terminal closed before completion was detected"),!1;let w=this.readInstallStatusSnapshot(),P=this.getInstallProgressSummary(w);this._installProgressMessage=P.message,this.updateStatusBar("starting");let b=Math.max(0,P.percent-y);if(h.report({message:P.message,increment:b}),y=Math.max(y,P.percent),w?.phase==="failed")return this.log(`Gateway install failed: ${w.lastError||w.message||"unknown error"}`),!1;(0,Se.clearBinaryCache)(Zr),(0,Se.clearBinaryCache)("openclaw");let v=await this.detectGatewayState(n);if(this._lastDetection=v,g?bG(w)&&v.installed:v.installed)return this.log("Gateway installed successfully"),await this.ensureManagedGatewayWrapperState(v.binaryPath),await this.ensureWebUIBuilt(v.binaryPath),this.writeStarterConfig(),await C.workspace.getConfiguration("agentide.anywhere").update("enabled",!0,C.ConfigurationTarget.Global),v.running?(this.finishInstallUiState("running","success"),h.report({message:`Install complete. Gateway is running on port ${n}.`,increment:Math.max(0,100-y)})):(this.finishInstallUiState("installed","success"),h.report({message:"Install complete. Gateway is installed. Click Agent Anywhere to start.",increment:Math.max(0,100-y)})),C.window.showInformationMessage(v.running?`${D.AGENT_ANYWHERE_LABEL}: Installed and running. Open the config to add your channels or use the status bar to connect.`:`${D.AGENT_ANYWHERE_LABEL}: Installed. Open the config to add your channels, then click Agent Anywhere to start.`,"Open Config").then(async I=>{I==="Open Config"&&await this.openConfig()}),!0;await new Promise(S=>setTimeout(S,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=le?"setup-gateway.ps1":"setup-gateway.sh",r=[V.join(__dirname,"..","scripts","gateway",e),V.join(__dirname,"..","..","scripts","gateway",e)].find(i=>G.existsSync(i)),s;if(r&&le){let i=`& "${r}" -Uninstall; Write-Host ""; Write-Host "You can close this window."`;s={name:Si,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:Si,shellPath:hl(),shellArgs:ml(o),env:up()}}else{let i="npm uninstall -g openclaw",o=`${i}; echo ""; echo "Press Enter to close..."; read`;s=le?{name:Si,shellPath:"cmd.exe",shellArgs:["/c",`${i} && echo. && pause`]}:{name:Si,shellPath:hl(),shellArgs:ml(o),env:up()}}this._gatewayUninstallInProgress=!0,this.setStatus("stopping");try{let i=C.window.createTerminal(s);this._uninstallSetupTerminal=i,i.show(),this.log("Gateway uninstall started in terminal"),(0,Se.clearBinaryCache)(Zr),(0,Se.clearBinaryCache)("openclaw"),await this.sleep(this.getUninstallInitialDelayMs());let o=Date.now()+this.getUninstallVerificationTimeoutMs(),a,c=!0;for(;Date.now()<o;){(0,Se.clearBinaryCache)(Zr),(0,Se.clearBinaryCache)("openclaw");let l=await this.detectGatewayState(this.getGatewayPort());if(a=l,this._lastDetection=l,c=await this.hasGlobalNpmOpenclawTree(),!c&&!l.running){Rw(),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){Rw(),this.setStatus("not-installed"),this.log("Global OpenClaw package removed (or no longer detected).");return}await this.sleep(this.getUninstallCheckIntervalMs())}!c&&a?.running?C.window.showWarningMessage(`${D.AGENT_ANYWHERE_LABEL}: Managed package was removed, but the gateway listener still appears to be running. Finish the terminal command or run Status.`):C.window.showWarningMessage(`${D.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 V.join(ts.homedir(),".openclaw","openclaw.json")}writeStarterConfig(){let e=V.dirname(this.configPath);if(G.existsSync(this.configPath)){this.log("Config already exists, skipping starter config");return}let r=[V.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5"),V.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5")].find(o=>G.existsSync(o));if(!r){this.log("Starter config template not found, skipping");return}G.mkdirSync(e,{recursive:!0,mode:448});let s=G.readFileSync(r,"utf-8"),i=`ah-${(0,ip.randomBytes)(24).toString("hex")}`;s=s.replace("__GENERATED_TOKEN__",i),G.writeFileSync(this.configPath,s,{encoding:"utf-8",mode:le?void 0:384}),this.log(`Wrote starter config to ${this.configPath}`)}async openConfig(){G.existsSync(this.configPath)||this.writeStarterConfig();let e=await C.workspace.openTextDocument(this.configPath);await C.window.showTextDocument(e)}async preflightChannelSecrets(e){let n;try{n=G.readFileSync(this.configPath,"utf-8")}catch{return"continue"}let r=(0,ap.parseStrictJsonConfig)(n);if(r===void 0)return"continue";let s=(0,ap.collectMissingChannelEnvSecrets)(r,e);if(s.length===0)return"continue";let i=(0,op.getAgentHomeEnvFilePath)(),o=s.map(u=>u.channel).join(", "),a=[...new Set(s.flatMap(u=>u.envVars))];this.log(`Channel secrets preflight: ${o} missing ${a.join(", ")}`);let c=`Disable ${o} & Start`,l="Add Secrets",f=await C.window.showErrorMessage(`${D.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(f===c){let u=(0,ap.disableChannelsInConfigText)(n,s.map(p=>p.channel));if(!u)return C.window.showErrorMessage(`${D.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{G.copyFileSync(this.configPath,d),G.writeFileSync(this.configPath,u,{encoding:"utf-8",mode:le?void 0:384})}catch(p){let g=p instanceof Error?p.message:String(p);return C.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath} (${g}).`),"abort"}return this.log(`Disabled channels missing secrets: ${o} (backup: ${d})`),C.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Disabled the ${o} channel (backup: ${V.basename(d)}). To re-enable: add ${a.join(", ")} to ${i}, set "enabled": true in the config, then restart the gateway.`),"continue"}return f===l&&await this.openEnvFileWithSecretStubs(i,a),"abort"}async openEnvFileWithSecretStubs(e,n){try{let r="";try{r=G.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(`
|
|
621
|
+
`)[0]}catch{}let i=!!r&&!!s,o=e?await Al(t,r):!1;return{installed:i,binaryPath:r,version:s,running:o,port:t}}async function Fw(t,e){try{if(le){let n=await Ep(t);if(n){e("Running gateway stop via managed node runtime..."),await aG(n.nodePath,[n.entryScriptPath,"gateway","stop"],{timeout:2e4,windowsHide:!0});return}}e(`Running ${V.basename(t)} gateway stop (CLI)...`),await Mt(`"${t}" gateway stop`,{timeout:2e4,windowsHide:!0})}catch{}}function SG(){try{if(!G.existsSync(gp))return;let t=G.readFileSync(gp,"utf8").replace(/^\uFEFF/,"");return JSON.parse(t)}catch{return}}function bG(t){return t?.phase==="complete"&&t.steps?.finalCheckPassed===!0}function TG(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=Pw.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/Pw.length*100))}}function El(t){return t.replace(/'/g,"''")}async function io(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(le)try{let{stdout:e}=await Mt(`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 Mt(`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 Sl(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,Se.probePort)(t),a=r.filter(c=>(0,Se.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,Se.probePort)(t)&&r.every(o=>!(0,Se.isProcessRunning)(o))}function kw(t,e,n){if(e&&e>0)try{process.kill(-e,n);return}catch{}try{t.kill(n)}catch{}}async function _p(t){if(!(!Number.isFinite(t)||t<1||t>65535)){if(le){try{let{stdout:e}=await Mt(`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 Mt(`taskkill /F /T /PID ${r}`,{timeout:5e3}).catch(()=>{})}catch{}return}try{let{stdout:e}=await Mt(`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 Mt(`kill ${i}`,{timeout:3e3}).catch(()=>{});await new Promise(i=>setTimeout(i,800));let{stdout:r}=await Mt(`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 Mt(`kill -9 ${i}`,{timeout:3e3}).catch(()=>{})}catch{}}}async function $w(t,e,n){let r=await io(t);if(e&&(await Fw(e,n),await Sl(t,r)))return!0;n(`Stopping listener(s) on port ${t}...`),await _p(t);let s=[...r];return t!==bi&&await(0,Se.probePort)(bi)&&(s.push(...await io(bi)),n(`Stopping listener(s) on port ${bi} (default gateway port)...`),await _p(bi)),Sl(t,s)}async function vG(t,e,n){await(0,Se.writePidFile)(Tl,t,e,n)}async function fp(){await(0,Se.removePidFile)(Tl)}async function pp(t){let e=await(0,Se.checkPidFileWithCleanup)(Tl);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,Se.probePort)(s)||!await Al(s,r)?null:{installed:!0,binaryPath:r,running:!0,port:s}}async function Vw(t){let e=t??await ia();return OG(e)}async function OG(t){let e=Ti(),n=Tp(e),r=Hw(e);if(n&&r&&G.existsSync(r)&&(t.length===0||t.some(a=>Gw(n,a))))return r;let s=await(0,Se.findBinaryCached)(Zr,(0,Se.getCommonBinaryPaths)(Zr));if(s&&await yp(s,t))return s;let i=le?`${Zr}.cmd`:Zr;for(let o of t){let a=le?V.dirname(V.dirname(o)):V.dirname(V.dirname(V.dirname(o))),c=le?V.join(a,i):V.join(a,"bin",i);if(G.existsSync(c)&&await yp(c,t))return c}}var wp=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 k.EventEmitter;onStatusChange=this._onStatusChange.event;setBridgeRef(e){this._bridgeRef=e}constructor(e,n){this.outputChannel=e,this.statusBarItem=k.window.createStatusBarItem(k.StatusBarAlignment.Right,100),this.statusBarItem.command="agentide.anywhere.toggle",this.statusBarItem.name=D.AGENT_ANYWHERE_LABEL,k.commands.executeCommand("setContext","agentide.anywhere.connected",this._bridgeConnected),this.disposables.push(k.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 pp(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,lp.toSettingsDisplayKey)("agentide.anywhere.autoStart")} = true)`),await this.start())}registerCommands(){this.disposables.push(k.commands.registerCommand("agentide.anywhere.toggle",()=>this.toggle()),k.commands.registerCommand("agentide.anywhere.install",()=>this.install()),k.commands.registerCommand("agentide.anywhere.uninstall",()=>this.uninstall()),k.commands.registerCommand("agentide.anywhere.start",()=>this.start()),k.commands.registerCommand("agentide.anywhere.stop",()=>this.stop()),k.commands.registerCommand("agentide.anywhere.status",()=>this.showStatus()),k.commands.registerCommand("agentide.anywhere.openConfig",()=>this.openConfig()),k.commands.registerCommand("agentide.anywhere.connect",()=>this.connectBridge()),k.commands.registerCommand("agentide.anywhere.disconnect",()=>this.disconnectBridge()),k.commands.registerCommand("agentide.anywhere.openWebUI",()=>this.openWebUI()),k.commands.registerCommand("agentide.anywhere.detect",()=>this.detect()),k.commands.registerCommand("agentide.anywhere.meetAgent",()=>this.showMeetAgentPicker()))}setBridgeConnected(e){this._bridgeConnected=e,k.commands.executeCommand("setContext","agentide.anywhere.connected",e)}registerConfigWatcher(){this.disposables.push(k.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,k.window.showInformationMessage(`${D.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":k.window.showInformationMessage(`${D.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=k.window.showInformationMessage(`${D.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=k.window.showInformationMessage(`${D.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 k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Install in progress. Follow the "${D.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?k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Install completed. Status has been refreshed.`):k.window.showWarningMessage(`${D.AGENT_ANYWHERE_LABEL}: Setup terminal is no longer available. Install did not complete; run Install again to relaunch setup.`)}async showGatewayUninstallInProgressPrompt(){await k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Uninstall in progress. Follow the "${Si}" 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?k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Uninstall completed. Status has been refreshed.`):k.window.showWarningMessage(`${D.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??k.window.terminals.find(n=>n.name===so||n.name.startsWith(`${so} `))??null;return e?(this._installSetupTerminal=e,e.show(),!0):!1}revealUninstallSetupTerminal(){let e=this._uninstallSetupTerminal??k.window.terminals.find(n=>n.name===Si||n.name.startsWith(`${Si} `))??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,Se.clearBinaryCache)(Zr),(0,Se.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 SG()}getInstallProgressSummary(e){return TG(e)}async detectGatewayState(e){return yl(e)}async detectGatewayFastState(e){return pp(e)}async probeGatewayPort(e){return(0,Se.probePort)(e)}isStartedGatewayProcessAlive(e){return e!==void 0&&(0,Se.isProcessRunning)(e)}getStartupTimeoutMs(){return fG}getStartupCheckIntervalMs(){return 500}getStartupLaunchGraceMs(){return le?15e3:0}getUninstallInitialDelayMs(){return le?2e3:3e3}getUninstallVerificationTimeoutMs(){return le?15e3:9e4}getUninstallCheckIntervalMs(){return le?1e3:4e3}async sleep(e){await new Promise(n=>setTimeout(n,e))}isWindowsLaunch(){return le}async stopExistingGatewayBeforeStart(e){await Fw(e,n=>this.log(n))}getGatewayLockPathForConfig(){let e=(0,ip.createHash)("sha256").update(this.configPath).digest("hex").slice(0,8);return V.join(ts.tmpdir(),"openclaw",`gateway.${e}.lock`)}async removeStaleGatewayLockBeforeStart(e){if(!le)return;let n=this.getGatewayLockPathForConfig();if(!G.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 G.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<pG){this.log(`Gateway lock is only ${Math.round(r/1e3)}s old; not removing (possible concurrent start still binding).`);return}try{G.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 vG(e,n,r)}async reconcileUninstallProgressState(){if(!this._gatewayUninstallInProgress)return this._lastDetection;if(this.revealUninstallSetupTerminal())return this._lastDetection;let e=await yl(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=k.window.showInformationMessage(`${D.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=k.window.showInformationMessage(`${D.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 k.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,cp.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 k.commands.executeCommand("workbench.action.chat.newChat",{agentMode:!0}),await k.commands.executeCommand("workbench.action.chat.open",{mode:"agent",query:"use openclaw skill as needed.",isPartialQuery:!0})}async showMeetAgentPicker(e){if(!this._bridgeRef?.request){k.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,oG.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,cp.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 k.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){k.window.showWarningMessage("No agent registered with the gateway.");return}let l=(await s("agents.list")).external?.find(g=>g.id.toLowerCase()===a.toLowerCase()),f=new Set(l?.boundChannels?.map(g=>g.toLowerCase())??[]),u=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:f.has(g.id.toLowerCase())})),d=await k.window.showQuickPick(u,{canPickMany:!0,title:`Meet ${a} at...`,placeHolder:"Select channels where people can reach this agent"});if(!d)return;let p=d.map(g=>g.channelId);if(await(0,cp.applyAgentChannelBindingsViaConfigPatch)(s,{agentId:a,selectedChannelIds:p,statusPayload:o}),p.length===0)k.window.showInformationMessage(`${a}: all channel bindings removed.`);else{let g=d.map(m=>m.label).join(", ");k.window.showInformationMessage(`${a} can now be reached at: ${g}`)}}catch(i){this.log(`Meet Agent picker failed: ${i}`),k.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 yl(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 k.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Install source not configured. Set "${(0,lp.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in settings.`),!1;let r=(0,lt.validateAnywhereInstallSource)(e);if(!r.ok)return k.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Refusing to install from "${e}" \u2014 ${r.reason}. Fix "${(0,lp.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in your user settings.`),this.log(`Rejected installSource (${r.reason}): ${e}`),!1;if(this._gatewayInstallInProgress)return await k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Install is already in progress. Watch the "${D.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,Se.clearBinaryCache)(Zr),(0,Se.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=le?"setup-gateway.ps1":"setup-gateway.sh",a=[V.join(__dirname,"..","..","scripts","gateway",i),V.join(__dirname,"..","scripts","gateway",i)].find(h=>G.existsSync(h)),l=[V.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5"),V.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5")].find(h=>G.existsSync(h)),f,u={...up(),[lt.ANYWHERE_INSTALL_SOURCE_ENV]:e,...a?{[lt.ANYWHERE_SETUP_SCRIPT_ENV]:a}:{},...l?{[lt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}};if(a&&le){let h=[`-Source $env:${lt.ANYWHERE_INSTALL_SOURCE_ENV}`];l&&h.push(`-ConfigTemplate $env:${lt.ANYWHERE_CONFIG_TEMPLATE_ENV}`);let E=`& $env:${lt.ANYWHERE_SETUP_SCRIPT_ENV} ${h.join(" ")}; Write-Host ""; Write-Host "You can close this window."`;f={name:so,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",E],env:{[lt.ANYWHERE_INSTALL_SOURCE_ENV]:e,[lt.ANYWHERE_SETUP_SCRIPT_ENV]:a,...l?{[lt.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}}}}else if(a){let h=[`--source "$${lt.ANYWHERE_INSTALL_SOURCE_ENV}"`];l&&h.push(`--config-template "$${lt.ANYWHERE_CONFIG_TEMPLATE_ENV}"`);let y=`${`bash "$${lt.ANYWHERE_SETUP_SCRIPT_ENV}" ${h.join(" ")}`}; echo ""; echo "Press Enter to close..."; read`;f={name:so,shellPath:hl(),shellArgs:ml(y),env:u}}else{this.log("Setup script not found, falling back to npm install");let E=`${`npm install -g "$${lt.ANYWHERE_INSTALL_SOURCE_ENV}"`}; echo ""; echo "Press Enter to close..."; read`;f=le?{name:so,shellPath:"cmd.exe",shellArgs:["/c",`npm install -g "%${lt.ANYWHERE_INSTALL_SOURCE_ENV}%" && echo. && echo Setup complete. && pause`],env:{[lt.ANYWHERE_INSTALL_SOURCE_ENV]:e}}:{name:so,shellPath:hl(),shellArgs:ml(E),env:u}}try{G.rmSync(gp,{force:!0})}catch{}this._installProgressMessage="Launching setup...",this.updateStatusBar("starting");let d=k.window.createTerminal(f);this._installSetupTerminal=d,d.show();let p=gG(e)?10*6e4:12e4;this.log(`Waiting up to ${Math.round(p/6e4)} minute(s) for gateway install completion...`);let g=le&&!!a;return await k.window.withProgress({location:k.ProgressLocation.Window,title:`${D.AGENT_ANYWHERE_LABEL}: Installing gateway...`,cancellable:!1},async h=>{let E=Date.now()+p,y=0;for(;Date.now()<E;){if(!this._gatewayInstallInProgress)return this.log("Gateway install wait aborted \u2014 setup terminal closed before completion was detected"),!1;let w=this.readInstallStatusSnapshot(),P=this.getInstallProgressSummary(w);this._installProgressMessage=P.message,this.updateStatusBar("starting");let b=Math.max(0,P.percent-y);if(h.report({message:P.message,increment:b}),y=Math.max(y,P.percent),w?.phase==="failed")return this.log(`Gateway install failed: ${w.lastError||w.message||"unknown error"}`),!1;(0,Se.clearBinaryCache)(Zr),(0,Se.clearBinaryCache)("openclaw");let v=await this.detectGatewayState(n);if(this._lastDetection=v,g?bG(w)&&v.installed:v.installed)return this.log("Gateway installed successfully"),await this.ensureManagedGatewayWrapperState(v.binaryPath),await this.ensureWebUIBuilt(v.binaryPath),this.writeStarterConfig(),await k.workspace.getConfiguration("agentide.anywhere").update("enabled",!0,k.ConfigurationTarget.Global),v.running?(this.finishInstallUiState("running","success"),h.report({message:`Install complete. Gateway is running on port ${n}.`,increment:Math.max(0,100-y)})):(this.finishInstallUiState("installed","success"),h.report({message:"Install complete. Gateway is installed. Click Agent Anywhere to start.",increment:Math.max(0,100-y)})),k.window.showInformationMessage(v.running?`${D.AGENT_ANYWHERE_LABEL}: Installed and running. Open the config to add your channels or use the status bar to connect.`:`${D.AGENT_ANYWHERE_LABEL}: Installed. Open the config to add your channels, then click Agent Anywhere to start.`,"Open Config").then(async I=>{I==="Open Config"&&await this.openConfig()}),!0;await new Promise(S=>setTimeout(S,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=le?"setup-gateway.ps1":"setup-gateway.sh",r=[V.join(__dirname,"..","scripts","gateway",e),V.join(__dirname,"..","..","scripts","gateway",e)].find(i=>G.existsSync(i)),s;if(r&&le){let i=`& "${r}" -Uninstall; Write-Host ""; Write-Host "You can close this window."`;s={name:Si,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:Si,shellPath:hl(),shellArgs:ml(o),env:up()}}else{let i="npm uninstall -g openclaw",o=`${i}; echo ""; echo "Press Enter to close..."; read`;s=le?{name:Si,shellPath:"cmd.exe",shellArgs:["/c",`${i} && echo. && pause`]}:{name:Si,shellPath:hl(),shellArgs:ml(o),env:up()}}this._gatewayUninstallInProgress=!0,this.setStatus("stopping");try{let i=k.window.createTerminal(s);this._uninstallSetupTerminal=i,i.show(),this.log("Gateway uninstall started in terminal"),(0,Se.clearBinaryCache)(Zr),(0,Se.clearBinaryCache)("openclaw"),await this.sleep(this.getUninstallInitialDelayMs());let o=Date.now()+this.getUninstallVerificationTimeoutMs(),a,c=!0;for(;Date.now()<o;){(0,Se.clearBinaryCache)(Zr),(0,Se.clearBinaryCache)("openclaw");let l=await this.detectGatewayState(this.getGatewayPort());if(a=l,this._lastDetection=l,c=await this.hasGlobalNpmOpenclawTree(),!c&&!l.running){Rw(),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){Rw(),this.setStatus("not-installed"),this.log("Global OpenClaw package removed (or no longer detected).");return}await this.sleep(this.getUninstallCheckIntervalMs())}!c&&a?.running?k.window.showWarningMessage(`${D.AGENT_ANYWHERE_LABEL}: Managed package was removed, but the gateway listener still appears to be running. Finish the terminal command or run Status.`):k.window.showWarningMessage(`${D.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 V.join(ts.homedir(),".openclaw","openclaw.json")}writeStarterConfig(){let e=V.dirname(this.configPath);if(G.existsSync(this.configPath)){this.log("Config already exists, skipping starter config");return}let r=[V.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5"),V.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5")].find(o=>G.existsSync(o));if(!r){this.log("Starter config template not found, skipping");return}G.mkdirSync(e,{recursive:!0,mode:448});let s=G.readFileSync(r,"utf-8"),i=`ah-${(0,ip.randomBytes)(24).toString("hex")}`;s=s.replace("__GENERATED_TOKEN__",i),G.writeFileSync(this.configPath,s,{encoding:"utf-8",mode:le?void 0:384}),this.log(`Wrote starter config to ${this.configPath}`)}async openConfig(){G.existsSync(this.configPath)||this.writeStarterConfig();let e=await k.workspace.openTextDocument(this.configPath);await k.window.showTextDocument(e)}async preflightChannelSecrets(e){let n;try{n=G.readFileSync(this.configPath,"utf-8")}catch{return"continue"}let r=(0,ap.parseStrictJsonConfig)(n);if(r===void 0)return"continue";let s=(0,ap.collectMissingChannelEnvSecrets)(r,e);if(s.length===0)return"continue";let i=(0,op.getAgentHomeEnvFilePath)(),o=s.map(u=>u.channel).join(", "),a=[...new Set(s.flatMap(u=>u.envVars))];this.log(`Channel secrets preflight: ${o} missing ${a.join(", ")}`);let c=`Disable ${o} & Start`,l="Add Secrets",f=await k.window.showErrorMessage(`${D.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(f===c){let u=(0,ap.disableChannelsInConfigText)(n,s.map(p=>p.channel));if(!u)return k.window.showErrorMessage(`${D.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{G.copyFileSync(this.configPath,d),G.writeFileSync(this.configPath,u,{encoding:"utf-8",mode:le?void 0:384})}catch(p){let g=p instanceof Error?p.message:String(p);return k.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath} (${g}).`),"abort"}return this.log(`Disabled channels missing secrets: ${o} (backup: ${d})`),k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}: Disabled the ${o} channel (backup: ${V.basename(d)}). To re-enable: add ${a.join(", ")} to ${i}, set "enabled": true in the config, then restart the gateway.`),"continue"}return f===l&&await this.openEnvFileWithSecretStubs(i,a),"abort"}async openEnvFileWithSecretStubs(e,n){try{let r="";try{r=G.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(`
|
|
622
622
|
`)?`
|
|
623
623
|
`:"",a=[`# Added by ${D.AGENT_ANYWHERE_LABEL} \u2014 fill in, then start the gateway again.`,...s.map(c=>`${c}=`)].join(`
|
|
624
624
|
`);G.writeFileSync(e,`${r}${o}${a}
|
|
625
|
-
`,{encoding:"utf-8",mode:le?void 0:384})}let i=await
|
|
626
|
-
`);if(!n.installed){await
|
|
627
|
-
${o}`,"Set Up")==="Set Up"&&await this.install();return}if(!n.running){switch(await
|
|
628
|
-
${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
|
|
625
|
+
`,{encoding:"utf-8",mode:le?void 0:384})}let i=await k.workspace.openTextDocument(k.Uri.file(e));await k.window.showTextDocument(i,{preview:!1})}catch(r){let s=r instanceof Error?r.message:String(r);k.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Could not open ${e} (${s}).`)}}async startGatewayViaHiddenWindowsProcess(e,n,r,s,i){let o=(0,iG.buildWindowsArgumentLine)(n),a=o.length>0?` -ArgumentList '${El(o)}'`:"",c=[`$proc = Start-Process -FilePath '${El(e)}' -WindowStyle Hidden${a} -RedirectStandardOutput '${El(r)}' -RedirectStandardError '${El(s)}' -PassThru`,"Write-Output $proc.Id"].join("; ");return new Promise(l=>{let f="",u="",d=(0,_l.spawn)("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-Command",c],{windowsHide:!0,env:i});d.stdout.on("data",p=>{f+=p.toString()}),d.stderr.on("data",p=>{u+=p.toString()}),d.once("error",p=>{this.log(`Gateway hidden Windows launcher failed to spawn: ${p}`),l(void 0)}),d.once("exit",p=>{if(p!==0){let m=u.trim()||f.trim();this.log(`Gateway hidden Windows launcher exited with code ${p}${m?`: ${m}`:""}`),l(void 0);return}let g=parseInt(f.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 k.window.showWarningMessage(`${D.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"),k.window.showErrorMessage(`${D.AGENT_ANYWHERE_LABEL}: Gateway binary not found. Try reinstalling.`);return}let i=r.binaryPath;if(await this.probeGatewayPort(e)&&await Al(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,f=this.isWindowsLaunch();if(f){let h=await this.resolveWindowsManagedGatewayLaunchRuntime(i);if(!h){this.setStatus("installed"),await k.window.showWarningMessage(`${D.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 u=V.dirname(dp);G.mkdirSync(u,{recursive:!0});let d=dp,p=V.join(u,"gateway.error.log");this.log(`Starting gateway: ${a} ${c.join(" ")}`),this.log(`Gateway log: ${d}`);let g=await(0,op.readGatewayChildProcessEnv)();g.OPENCLAW_NO_RESPAWN="1";for(let h of op.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 m;if(f){if(m=await this.startGatewayViaHiddenWindowsProcess(a,c,d,p,g),this.process=null,!m){this.setStatus("error"),await sa(d);return}}else{let h=G.openSync(d,"a");this.process=(0,_l.spawn)(a,c,{stdio:["ignore",h,h],detached:!0,env:g,shell:l,windowsHide:!0}),G.closeSync(h),this.process.unref(),this.process.on("exit",E=>{this.log(`Gateway process exited with code ${E}`),this.process=null,fp(),!this._startInFlight&&this.setStatus(E!==0&&E!==null?"error":"installed")})}await k.window.withProgress({location:k.ProgressLocation.Window,title:`${D.AGENT_ANYWHERE_LABEL}: Starting gateway...`},async h=>{try{let E=Date.now(),y=this.getStartupTimeoutMs(),w=this.getStartupLaunchGraceMs(),P=this.getStartupCheckIntervalMs(),b=0,v=0,A=!1,S=!1,I=this.process?.pid??m;for(;;){if(await this.probeGatewayPort(e)){this.setStatus("running"),this.log(`Gateway started and ready (${b}ms)`);let Ne=this.process?.pid??m;Ne&&(await this.writeGatewayPidRecord(Ne,e,i),this.log(`PID file written: ${Tl}`)),this.startHealthChecks(e),h.report({message:"Ready!",increment:100});return}let U=this.isStartedGatewayProcessAlive(I);I&&U&&(A=!0),b=Date.now()-E;let O=b<y,F=I!==void 0&&U&&A&&b<y+w,se=!U&&(A||this.process===null);if(I&&se&&!f){this.setStatus("error"),this.log(`Gateway process exited before opening port ${e}`),await sa(d);return}if(I&&A&&!U&&f&&!S&&(S=!0,this.log(`Gateway launch process exited before opening port ${e}; continuing to wait for port readiness`)),!O&&!F)break;let W=Math.max(y+(F?w:0),1),pe=Math.min(90,Math.floor(b/W*100)),me=Math.max(0,pe-v);v=pe;let z=I!==void 0?U?`Gateway launched (PID ${I}), waiting for port ${e}...`:"Waiting for gateway process to initialize...":`Waiting for port ${e}...`;h.report({message:z,increment:me}),await this.sleep(P)}this.setStatus("error"),this.log(`Gateway failed to start within timeout (pid=${I??"n/a"}, alive=${I!==void 0?this.isStartedGatewayProcessAlive(I):!1})`),await sa(d)}catch{this.setStatus("error"),this.log("Gateway failed to start"),await sa(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 io(r),o=[...new Set([s,...i].filter(l=>typeof l=="number"&&l>0))];le&&s?await Mt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):kw(this.process,s,"SIGTERM"),!await new Promise(l=>{let f=setTimeout(()=>l(!1),5e3);this.process?.once("exit",()=>{clearTimeout(f),l(!0)})})&&this.process&&(this.log("Forcefully killing gateway..."),le&&s?await Mt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):kw(this.process,s,"SIGKILL")),this.process=null,await fp();let c=await Sl(r,o);c||(this.log("Gateway port still held after process exit; reaping listener(s)..."),await _p(r),c=await Sl(r,[...o,...await io(r)])),c?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not free gateway port after stop"),k.window.showWarningMessage(`${D.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 $w(e.port,e.binaryPath,r=>this.log(r));await fp(),n?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not stop gateway process"),k.window.showWarningMessage(`${D.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,Se.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(`
|
|
626
|
+
`);if(!n.installed){await k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}
|
|
627
|
+
${o}`,"Set Up")==="Set Up"&&await this.install();return}if(!n.running){switch(await k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}
|
|
628
|
+
${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 k.window.showInformationMessage(`${D.AGENT_ANYWHERE_LABEL}
|
|
629
629
|
${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{G.existsSync(this.configPath)||this.writeStarterConfig();let n=G.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,ip.randomBytes)(24).toString("hex")}`;r.gateway.auth.token=s,G.writeFileSync(this.configPath,`${JSON.stringify(r,null,2)}
|
|
630
|
-
`,{encoding:"utf-8",mode:le?void 0:384}),await C.workspace.getConfiguration("agentide.gateway").update("token",s,C.ConfigurationTarget.Global),await this.restartGateway(),C.window.showInformationMessage(`${D.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)}`),C.window.showErrorMessage(`${D.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,Se.probePort)(e)&&!await Al(e,this._lastDetection?.binaryPath)&&(!await this.promptNonManagedPortTakeover(e,"connect")||await(0,Se.probePort)(e))){this._status==="running"&&this.setStatus("installed");return}let n=this._status==="running";if(!n){let c=await pp(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 C.window.showInformationMessage(`${D.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 sa(dp);return}}}let r=C.workspace.getConfiguration("agentide.gateway"),s=r.get("url","").trim();s||(s=`ws://127.0.0.1:${e}`,await r.update("url",s,C.ConfigurationTarget.Global));let i=/127\.0\.0\.1|localhost|\[::1\]/i.test(s),o=this.readGatewayToken();o&&i&&(await r.update("token",o,C.ConfigurationTarget.Global),this.log("Gateway token applied from openclaw.json (user scope)")),await this._bridgeRef.connect(),this.setBridgeConnected(this._bridgeRef.isConnected),await(0,Se.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,Se.probePort)(e))){await C.window.showWarningMessage(`${D.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=(C.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 C.env.openExternal(C.Uri.parse(o))}startHealthChecks(e){this.stopHealthChecks(),this.healthCheckTimer=setInterval(async()=>{await(0,Se.probePort)(e)||(this.log("Health check failed -- gateway is no longer running"),this.stopHealthChecks(),this.process=null,this.setStatus("installed"))},dG)}stopHealthChecks(){this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null)}async ensureWebUIBuilt(e){if(e)try{let n=vp(e);if(!n)return;let r=V.join(n,"dist","control-ui","index.html");if(G.existsSync(r))return;this.log("Web UI not built - building now..."),await Mt(le?"pnpm.cmd ui:build":"pnpm ui:build",{cwd:n,timeout:6e4,env:{...process.env},...le?{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 C.window.showWarningMessage(`${D.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 io(e));if(!await $w(e,void 0,a=>this.log(a))){let a=await io(e);return i.size>0&&a.some(l=>!i.has(l))?C.window.showWarningMessage(`${D.AGENT_ANYWHERE_LABEL}: Port ${e} is held by a self-restarting gateway service. Run \`openclaw daemon uninstall\` to remove it, then try again.`):C.window.showErrorMessage(`${D.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=Ti(),s=await Ep(e,r);if(!s)return;let{launcherPath:i,packageRoot:o,nodePath:a,entryScriptPath:c}=s,l=Nw(a,c,Mw),f;return(n||xw(hp))&&(f=Nw(a,c,hp)),hG({...r,nodePath:a,cliPath:i,entryScriptPath:c,packageRoot:o,wrapperPath:l,wrapperDir:bp,openclawWrapperPath:f,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(!le)return;await this.ensureManagedGatewayWrapperState(e);let n=await Ep(e);if(n)return{nodePath:n.nodePath,entryScriptPath:n.entryScriptPath}}readGatewayToken(){try{if(!G.existsSync(this.configPath))return;let n=G.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayInstallInProgress?`${D.AGENT_ANYWHERE_LABEL}: ${this._installProgressMessage??"Installing... (see Setup terminal)"}`:`${D.AGENT_ANYWHERE_LABEL}: Starting...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"running":this._bridgeConnected?(this.statusBarItem.text=`$(broadcast) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.AGENT_ANYWHERE_LABEL}: Connected (click for options)`,this.statusBarItem.color=new C.ThemeColor("testing.iconPassed")):(this.statusBarItem.text=`$(debug-disconnect) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayUninstallInProgress?`${D.AGENT_ANYWHERE_LABEL}: Uninstalling... (see Uninstall terminal)`:`${D.AGENT_ANYWHERE_LABEL}: Stopping...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"error":this.statusBarItem.text=`$(warning) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.AGENT_ANYWHERE_LABEL}: Error (click for details)`,this.statusBarItem.color=new C.ThemeColor("errorForeground"),this.statusBarItem.backgroundColor=void 0;break}this.statusBarItem.show()}getConfig(e,n){return C.workspace.getConfiguration("agentide.anywhere").get(e,n)}async hasGlobalNpmOpenclawTree(){return(await ia()).length>0}readGatewayPortFromOpenclawJson(){try{if(!G.existsSync(this.configPath))return;let n=G.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",bi)}log(e){this.outputChannel.appendLine(`[${D.AGENT_ANYWHERE_LABEL}] ${e}`)}dispose(){this.stopHealthChecks(),this.process=null,this.statusBarItem.dispose(),this._onStatusChange.dispose();for(let e of this.disposables)e.dispose()}};D.GatewayLifecycleManager=wp});var qw=T(Op=>{"use strict";Object.defineProperty(Op,"__esModule",{value:!0});Op.anywhereCommand=PG;var vl=Ww(),ns=qn(),IG=18789;async function PG(t){switch(t.action?.trim().toLowerCase()){case"status":case"detect":await NG(t);return;case"help":case"usage":case"":case void 0:Kw();return;default:console.error(`${ns.COLORS.red}Error:${ns.COLORS.reset} Unsupported action "${t.action}".`),Kw(),process.exitCode=1;return}}async function NG(t){let e=t.port??IG;try{let n=await(0,vl.detectGateway)(e),r=n.running?"Running":n.installed?"Installed":"Not installed",s=n.running?ns.COLORS.green:n.installed?ns.COLORS.yellow:ns.COLORS.red;console.log(`${s}${vl.AGENT_ANYWHERE_LABEL}:${ns.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(`${ns.COLORS.dim}Install via the Agent Anywhere UI inside ${vl.AGENT_ANYWHERE_LABEL} in VS Code.${ns.COLORS.reset}`)}catch(n){console.error(`${ns.COLORS.red}Error:${ns.COLORS.reset} ${n instanceof Error?n.message:String(n)}`),process.exitCode=1}}function Kw(){console.log([`${vl.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(`
|
|
631
|
-
`))}});var zw=T(rs=>{"use strict";var RG=rs&&rs.__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=rs&&rs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),kG=rs&&rs.__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(rs,"__esModule",{value:!0});rs.gatewaySendCommand=GG;rs.gatewayListCommand=UG;var $G=require("fs/promises"),DG=kG(require("path")),Ol=Uc(),LG=Xd(),et=qn();function Jw(t){let e=t.trim();return e||(console.error("Error: --outbound is required"),process.exit(1)),DG.resolve(e)}async function Xw(t){try{await(0,$G.access)(t)}catch{console.error(`Error: gateway outbound file not found: ${t}`),process.exit(1)}}async function MG(t,e,n){let r=n.message.trim();r||(console.error("Error: --message is required"),process.exit(1)),n.dryRun&&(console.log(`${et.COLORS.dim}Dry run (egress broker):${et.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(`${et.COLORS.red}\u2717${et.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(`${et.COLORS.green}\u2713${et.COLORS.reset} Sent (via egress broker${o.via?`, ${o.via}`:""})`):(console.error(`${et.COLORS.red}\u2717${et.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 GG(t){let e=process.env.AGENTHIPPO_EGRESS_URL?.trim(),n=process.env.AGENTHIPPO_TURN_NONCE?.trim();if(e&&n){await MG(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=Jw(t.outbound);await Xw(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,Ol.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,LG.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(`${et.COLORS.dim}Dry run:${et.COLORS.reset} ${a.command.join(" ")}`);else if(a.ok){let c=a.via==="hippoclaw"?" (via hippoclaw CLI fallback)":"";console.log(`${et.COLORS.green}\u2713${et.COLORS.reset} Sent via ${o.channel}:${o.target}${c}`),a.stdout&&console.log(a.stdout)}else console.error(`${et.COLORS.red}\u2717${et.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 Yw(t,e){let n=t.label?` (${t.label})`:"",r=t.threadId?` thread=${t.threadId}`:"",s=t.inboundCount>1?` \xD7${t.inboundCount}`:"";return`${e?`${et.COLORS.green}*${et.COLORS.reset} `:" "}${t.agentId}${n}: ${t.channel} \u2192 ${t.target}${r}${s}`}async function UG(t){let e=Jw(t.outbound);await Xw(e);let n=await(0,Ol.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(`${et.COLORS.dim}${e}${et.COLORS.reset}`);for(let i of s.sort()){let o=n.targetsByAgent[i]??[],a=n.lastByAgent[i],c=a?(0,Ol.buildGatewayOutboundHandleKey)(a.target,a.threadId):void 0;if(o.length===0&&a){console.log(Yw(a,!0));continue}console.log(`${et.COLORS.dim}${i}:${et.COLORS.reset}`);for(let l of o){let f=(0,Ol.buildGatewayOutboundHandleKey)(l.target,l.threadId);console.log(Yw(l,f===c))}o.length>1&&a&&console.log(`${et.COLORS.dim} * = last inbound (default for gateway send without --target)${et.COLORS.reset}`)}}});var Qw=T(bs=>{"use strict";var HG=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]})),jG=bs&&bs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),xG=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"&&HG(n,e,r[s]);return jG(n,e),n}})();Object.defineProperty(bs,"__esModule",{value:!0});bs.probeCustomEngineCommand=qG;var BG=xG(require("node:path")),FG=Bu(),VG=Cs(),WG=["in-process","node-subprocess"];function KG(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 qG(t){let e=t.engine.trim(),n=BG.resolve(t.workspace),r=(0,VG.resolveCustomEngineManifest)(n,e),s=KG(t.strategy),i=s==="all"?WG:[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,FG.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 Zw=T(Ip=>{"use strict";Object.defineProperty(Ip,"__esModule",{value:!0});Ip.conformanceCommand=rU;var YG=require("node:child_process"),JG=require("node:util"),XG=wd(),Il=ko(),Ws=Hi(),zG=(0,JG.promisify)(YG.execFile);async function Nl(t,e){try{let{stdout:n}=await zG(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 QG(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 Nl(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=f=>f.replace(/^[A-Z_]*=ahc_\S*$/gm,""),o=f=>s.filter(([,u])=>u.test(i(f))).map(([u])=>u),a=o(r.out),c=await Nl(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 f=/=ahc_/.test(r.out);return{name:e,status:"pass",detail:f?"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 ZG(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 Nl(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 Nl(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 eU(){let t="cost-cap",e="sk-conformance-upstream-key",n=(0,Ws.generateWarrantKeypair)("conformance-cost-cap"),r={[n.kid]:n.publicKeyPem},s=(0,XG.mintSandboxInferenceWarrant)(n,{user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2}),i=(0,Ws.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-A"}).ok,o=(0,Ws.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 tU(){let t="warrant-integrity",e=(0,Ws.generateWarrantKeypair)("conformance"),n={[e.kid]:e.publicKeyPem},r=(0,Ws.mintWarrant)({user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2,aud:"data"},e),s=(0,Ws.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-A"}),i=(0,Ws.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-B"}),o=(0,Ws.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 nU(){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:Pl(()=>(0,Il.assertAdmitted)(n,{pack:"probe",version:"1.0.0",nowSeconds:e})),otherVersionRefused:!Pl(()=>(0,Il.assertAdmitted)(n,{pack:"probe",version:"1.0.1",nowSeconds:e})),killSwitchRefuses:!Pl(()=>(0,Il.assertAdmitted)({...n,enabled:!1},{pack:"probe",version:"1.0.0",nowSeconds:e})),expiredRefused:!Pl(()=>(0,Il.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 Pl(t){try{return t(),!0}catch{return!1}}async function rU(t){let e=a=>c=>({...c,kind:a}),n=[e("deployment")(await QG(t)),e("deployment")(await ZG(t)),e("algorithm")(eU()),e("algorithm")(tU()),e("algorithm")(nU())],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(`
|
|
630
|
+
`,{encoding:"utf-8",mode:le?void 0:384}),await k.workspace.getConfiguration("agentide.gateway").update("token",s,k.ConfigurationTarget.Global),await this.restartGateway(),k.window.showInformationMessage(`${D.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)}`),k.window.showErrorMessage(`${D.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,Se.probePort)(e)&&!await Al(e,this._lastDetection?.binaryPath)&&(!await this.promptNonManagedPortTakeover(e,"connect")||await(0,Se.probePort)(e))){this._status==="running"&&this.setStatus("installed");return}let n=this._status==="running";if(!n){let c=await pp(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 k.window.showInformationMessage(`${D.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 sa(dp);return}}}let r=k.workspace.getConfiguration("agentide.gateway"),s=r.get("url","").trim();s||(s=`ws://127.0.0.1:${e}`,await r.update("url",s,k.ConfigurationTarget.Global));let i=/127\.0\.0\.1|localhost|\[::1\]/i.test(s),o=this.readGatewayToken();o&&i&&(await r.update("token",o,k.ConfigurationTarget.Global),this.log("Gateway token applied from openclaw.json (user scope)")),await this._bridgeRef.connect(),this.setBridgeConnected(this._bridgeRef.isConnected),await(0,Se.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,Se.probePort)(e))){await k.window.showWarningMessage(`${D.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=(k.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 k.env.openExternal(k.Uri.parse(o))}startHealthChecks(e){this.stopHealthChecks(),this.healthCheckTimer=setInterval(async()=>{await(0,Se.probePort)(e)||(this.log("Health check failed -- gateway is no longer running"),this.stopHealthChecks(),this.process=null,this.setStatus("installed"))},dG)}stopHealthChecks(){this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null)}async ensureWebUIBuilt(e){if(e)try{let n=vp(e);if(!n)return;let r=V.join(n,"dist","control-ui","index.html");if(G.existsSync(r))return;this.log("Web UI not built - building now..."),await Mt(le?"pnpm.cmd ui:build":"pnpm ui:build",{cwd:n,timeout:6e4,env:{...process.env},...le?{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 k.window.showWarningMessage(`${D.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 io(e));if(!await $w(e,void 0,a=>this.log(a))){let a=await io(e);return i.size>0&&a.some(l=>!i.has(l))?k.window.showWarningMessage(`${D.AGENT_ANYWHERE_LABEL}: Port ${e} is held by a self-restarting gateway service. Run \`openclaw daemon uninstall\` to remove it, then try again.`):k.window.showErrorMessage(`${D.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=Ti(),s=await Ep(e,r);if(!s)return;let{launcherPath:i,packageRoot:o,nodePath:a,entryScriptPath:c}=s,l=Nw(a,c,Mw),f;return(n||xw(hp))&&(f=Nw(a,c,hp)),hG({...r,nodePath:a,cliPath:i,entryScriptPath:c,packageRoot:o,wrapperPath:l,wrapperDir:bp,openclawWrapperPath:f,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(!le)return;await this.ensureManagedGatewayWrapperState(e);let n=await Ep(e);if(n)return{nodePath:n.nodePath,entryScriptPath:n.entryScriptPath}}readGatewayToken(){try{if(!G.existsSync(this.configPath))return;let n=G.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayInstallInProgress?`${D.AGENT_ANYWHERE_LABEL}: ${this._installProgressMessage??"Installing... (see Setup terminal)"}`:`${D.AGENT_ANYWHERE_LABEL}: Starting...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"running":this._bridgeConnected?(this.statusBarItem.text=`$(broadcast) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.AGENT_ANYWHERE_LABEL}: Connected (click for options)`,this.statusBarItem.color=new k.ThemeColor("testing.iconPassed")):(this.statusBarItem.text=`$(debug-disconnect) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.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) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayUninstallInProgress?`${D.AGENT_ANYWHERE_LABEL}: Uninstalling... (see Uninstall terminal)`:`${D.AGENT_ANYWHERE_LABEL}: Stopping...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"error":this.statusBarItem.text=`$(warning) ${D.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${D.AGENT_ANYWHERE_LABEL}: Error (click for details)`,this.statusBarItem.color=new k.ThemeColor("errorForeground"),this.statusBarItem.backgroundColor=void 0;break}this.statusBarItem.show()}getConfig(e,n){return k.workspace.getConfiguration("agentide.anywhere").get(e,n)}async hasGlobalNpmOpenclawTree(){return(await ia()).length>0}readGatewayPortFromOpenclawJson(){try{if(!G.existsSync(this.configPath))return;let n=G.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",bi)}log(e){this.outputChannel.appendLine(`[${D.AGENT_ANYWHERE_LABEL}] ${e}`)}dispose(){this.stopHealthChecks(),this.process=null,this.statusBarItem.dispose(),this._onStatusChange.dispose();for(let e of this.disposables)e.dispose()}};D.GatewayLifecycleManager=wp});var qw=T(Op=>{"use strict";Object.defineProperty(Op,"__esModule",{value:!0});Op.anywhereCommand=PG;var vl=Ww(),ns=qn(),IG=18789;async function PG(t){switch(t.action?.trim().toLowerCase()){case"status":case"detect":await NG(t);return;case"help":case"usage":case"":case void 0:Kw();return;default:console.error(`${ns.COLORS.red}Error:${ns.COLORS.reset} Unsupported action "${t.action}".`),Kw(),process.exitCode=1;return}}async function NG(t){let e=t.port??IG;try{let n=await(0,vl.detectGateway)(e),r=n.running?"Running":n.installed?"Installed":"Not installed",s=n.running?ns.COLORS.green:n.installed?ns.COLORS.yellow:ns.COLORS.red;console.log(`${s}${vl.AGENT_ANYWHERE_LABEL}:${ns.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(`${ns.COLORS.dim}Install via the Agent Anywhere UI inside ${vl.AGENT_ANYWHERE_LABEL} in VS Code.${ns.COLORS.reset}`)}catch(n){console.error(`${ns.COLORS.red}Error:${ns.COLORS.reset} ${n instanceof Error?n.message:String(n)}`),process.exitCode=1}}function Kw(){console.log([`${vl.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(`
|
|
631
|
+
`))}});var zw=T(rs=>{"use strict";var RG=rs&&rs.__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=rs&&rs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),kG=rs&&rs.__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(rs,"__esModule",{value:!0});rs.gatewaySendCommand=GG;rs.gatewayListCommand=UG;var $G=require("fs/promises"),DG=kG(require("path")),Ol=Uc(),LG=Xd(),tt=qn();function Jw(t){let e=t.trim();return e||(console.error("Error: --outbound is required"),process.exit(1)),DG.resolve(e)}async function Xw(t){try{await(0,$G.access)(t)}catch{console.error(`Error: gateway outbound file not found: ${t}`),process.exit(1)}}async function MG(t,e,n){let r=n.message.trim();r||(console.error("Error: --message is required"),process.exit(1)),n.dryRun&&(console.log(`${tt.COLORS.dim}Dry run (egress broker):${tt.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(`${tt.COLORS.red}\u2717${tt.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(`${tt.COLORS.green}\u2713${tt.COLORS.reset} Sent (via egress broker${o.via?`, ${o.via}`:""})`):(console.error(`${tt.COLORS.red}\u2717${tt.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 GG(t){let e=process.env.AGENTHIPPO_EGRESS_URL?.trim(),n=process.env.AGENTHIPPO_TURN_NONCE?.trim();if(e&&n){await MG(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=Jw(t.outbound);await Xw(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,Ol.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,LG.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(`${tt.COLORS.dim}Dry run:${tt.COLORS.reset} ${a.command.join(" ")}`);else if(a.ok){let c=a.via==="hippoclaw"?" (via hippoclaw CLI fallback)":"";console.log(`${tt.COLORS.green}\u2713${tt.COLORS.reset} Sent via ${o.channel}:${o.target}${c}`),a.stdout&&console.log(a.stdout)}else console.error(`${tt.COLORS.red}\u2717${tt.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 Yw(t,e){let n=t.label?` (${t.label})`:"",r=t.threadId?` thread=${t.threadId}`:"",s=t.inboundCount>1?` \xD7${t.inboundCount}`:"";return`${e?`${tt.COLORS.green}*${tt.COLORS.reset} `:" "}${t.agentId}${n}: ${t.channel} \u2192 ${t.target}${r}${s}`}async function UG(t){let e=Jw(t.outbound);await Xw(e);let n=await(0,Ol.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(`${tt.COLORS.dim}${e}${tt.COLORS.reset}`);for(let i of s.sort()){let o=n.targetsByAgent[i]??[],a=n.lastByAgent[i],c=a?(0,Ol.buildGatewayOutboundHandleKey)(a.target,a.threadId):void 0;if(o.length===0&&a){console.log(Yw(a,!0));continue}console.log(`${tt.COLORS.dim}${i}:${tt.COLORS.reset}`);for(let l of o){let f=(0,Ol.buildGatewayOutboundHandleKey)(l.target,l.threadId);console.log(Yw(l,f===c))}o.length>1&&a&&console.log(`${tt.COLORS.dim} * = last inbound (default for gateway send without --target)${tt.COLORS.reset}`)}}});var Qw=T(bs=>{"use strict";var HG=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]})),jG=bs&&bs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),xG=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"&&HG(n,e,r[s]);return jG(n,e),n}})();Object.defineProperty(bs,"__esModule",{value:!0});bs.probeCustomEngineCommand=qG;var BG=xG(require("node:path")),FG=Bu(),VG=Cs(),WG=["in-process","node-subprocess"];function KG(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 qG(t){let e=t.engine.trim(),n=BG.resolve(t.workspace),r=(0,VG.resolveCustomEngineManifest)(n,e),s=KG(t.strategy),i=s==="all"?WG:[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,FG.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 Zw=T(Ip=>{"use strict";Object.defineProperty(Ip,"__esModule",{value:!0});Ip.conformanceCommand=rU;var YG=require("node:child_process"),JG=require("node:util"),XG=wd(),Il=ko(),Ws=Hi(),zG=(0,JG.promisify)(YG.execFile);async function Nl(t,e){try{let{stdout:n}=await zG(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 QG(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 Nl(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=f=>f.replace(/^[A-Z_]*=ahc_\S*$/gm,""),o=f=>s.filter(([,u])=>u.test(i(f))).map(([u])=>u),a=o(r.out),c=await Nl(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 f=/=ahc_/.test(r.out);return{name:e,status:"pass",detail:f?"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 ZG(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 Nl(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 Nl(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 eU(){let t="cost-cap",e="sk-conformance-upstream-key",n=(0,Ws.generateWarrantKeypair)("conformance-cost-cap"),r={[n.kid]:n.publicKeyPem},s=(0,XG.mintSandboxInferenceWarrant)(n,{user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2}),i=(0,Ws.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-A"}).ok,o=(0,Ws.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 tU(){let t="warrant-integrity",e=(0,Ws.generateWarrantKeypair)("conformance"),n={[e.kid]:e.publicKeyPem},r=(0,Ws.mintWarrant)({user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2,aud:"data"},e),s=(0,Ws.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-A"}),i=(0,Ws.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-B"}),o=(0,Ws.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 nU(){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:Pl(()=>(0,Il.assertAdmitted)(n,{pack:"probe",version:"1.0.0",nowSeconds:e})),otherVersionRefused:!Pl(()=>(0,Il.assertAdmitted)(n,{pack:"probe",version:"1.0.1",nowSeconds:e})),killSwitchRefuses:!Pl(()=>(0,Il.assertAdmitted)({...n,enabled:!1},{pack:"probe",version:"1.0.0",nowSeconds:e})),expiredRefused:!Pl(()=>(0,Il.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 Pl(t){try{return t(),!0}catch{return!1}}async function rU(t){let e=a=>c=>({...c,kind:a}),n=[e("deployment")(await QG(t)),e("deployment")(await ZG(t)),e("algorithm")(eU()),e("algorithm")(tU()),e("algorithm")(nU())],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(`
|
|
632
632
|
AgentHippo conformance
|
|
633
633
|
`);let a=c=>{let l=c.status==="pass"?"PASS":c.status==="fail"?"FAIL":"SKIP";console.log(` ${l} ${c.name}
|
|
634
634
|
${c.detail}`)};if(console.log("THIS DEPLOYMENT (probes a running sandbox)"),r.forEach(a),console.log(`
|
|
635
|
-
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 eA=T(Rp=>{"use strict";Object.defineProperty(Rp,"__esModule",{value:!0});Rp.startRunnerHost=oU;var Pp=Zu(),sU=1e3*60*5,iU={selected:[],freeText:null,declined:!0};function oU(t){let e=f=>{t.output.write((0,Pp.encodeRunnerFrame)(f))},n=new Map,r="",s=!1,i=setInterval(()=>{try{t.engine.onMaintenance(t.logger??cU())}catch(f){t.logger?.warn(`[Runner] maintenance failed: ${Np(f)}`)}},t.maintenanceIntervalMs??sU);typeof i.unref=="function"&&i.unref();let o=()=>{},a=new Promise(f=>{o=()=>{if(!s){s=!0,clearInterval(i);for(let u of n.values())u.abort();n.clear(),f()}},t.input.on("data",u=>{r+=typeof u=="string"?u:u.toString("utf8");let{lines:d,rest:p}=(0,Pp.splitFrames)(r);r=p;for(let g of d){let m=(0,Pp.parseClientFrame)(g);if(!m){t.logger?.warn("[Runner] dropped malformed client frame");continue}c(m)}}),t.input.on("end",o),t.input.on("close",o),t.input.on("error",u=>{t.logger?.warn(`[Runner] input error: ${Np(u)}`),o()})});async function c(f){if(f.type==="abort"){n.get(f.id)?.abort();return}await l(f.id,f.message,f.options)}async function l(f,u,d){if(n.has(f)){e({type:"failed",id:f,message:`duplicate run id ${f}`});return}let p=new AbortController;n.set(f,p);let g=aU(e,f);try{await t.engine.stream(u,d,g,t.runtime,p.signal);let m=t.nativeSessionId?.();e({type:"result",id:f,...m?{nativeSessionId:m}:{}})}catch(m){let h=p.signal.aborted?"aborted":Np(m);e({type:"failed",id:f,message:h})}finally{n.delete(f)}}return e({type:"ready",demux:!0}),{done:a,close:()=>o()}}function aU(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}),iU},async error(r){n({type:"error",message:r})},async done(){n({type:"done"})}}}function Np(t){return t instanceof Error?t.message:String(t)}function cU(){return{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}});var iA=T(Cr=>{"use strict";var lU=Cr&&Cr.__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]})),uU=Cr&&Cr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$p=Cr&&Cr.__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"&&lU(n,e,r[s]);return uU(n,e),n}})();Object.defineProperty(Cr,"__esModule",{value:!0});Cr.resolveSandboxWorkspace=rA;Cr.isForeignWorkspace=sA;Cr.sandboxCommand=yU;var oa=$p(require("fs")),dU=$p(require("net")),Rl=$p(require("path")),Cp=ai(),fU=qn(),tA=ci(),pU=bd(),gU=li(),hU=Fr(),mU=Er(),nA=eA();function rA(t,e){return e}function sA(t,e){return t?Rl.resolve(t)!==Rl.resolve(e):!1}var kp=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,pU.createPackRunner)({storagePath:this.defaults.storagePath,analyticsSessionsDir:this.defaults.analyticsSessionsDir,packId:this.defaults.packId,packVersion:this.defaults.packVersion,provenance:()=>(0,mU.readProvenanceEnvFromProcess)(),workspaceRoot:this.defaults.workspace,credentials:{baseUrl:e.baseUrl,litellmApiKey:e.modelToken,useLiteLLM:!!e.baseUrl},claudeCheapModel:this.defaults.claudeCheapModel,omitGatewayToken:!0}),this.builtWith=n,this.runner)}async stream(e,n,r,s,i){let o=n,a=o.workspaceRoot,c=rA(a,this.defaults.workspace);sA(a,c)&&!this.warnedWorkspace&&(this.warnedWorkspace=!0,console.warn(`[sandbox] ignoring workspaceRoot ${a} from the wire \u2014 this sandbox works in ${c}`));try{oa.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),f=o,u=f.permissions??(f.fileAccess?{fileAccess:f.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:u,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(){}dispose(){this.runner?.dispose()}};function EU(){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 yU(t){await(0,gU.ensureDeps)(!1);let e=t.stateDir??"/state",n=t.workspace??Rl.join(e,"workspace");oa.mkdirSync(n,{recursive:!0});let r=await(0,tA.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=Rl.join(e,"home");oa.mkdirSync(i,{recursive:!0}),process.env.HOME=i;let o=n;await(0,Cp.syncPackToWorkspace)(o,r.packPath,s.name,s.engine,console,(0,fU.findBundledBasePromptsDir)()),console.log(`[sandbox] pack ${s.name}@${s.version??"?"} synced into ${o} (engine ${s.engine})`),EU();let a=r.manifest.spec?.cheapModel?.trim(),c=new kp({storagePath:e,analyticsSessionsDir:(0,hU.resolveAnalyticsSessionsDir)(e,!1),packId:s.name,packVersion:s.version,engineId:s.engine,modelId:(0,Cp.resolveModelAlias)(r.manifest.spec?.model?.trim()||"ah-auto"),claudeCheapModel:a?(0,Cp.resolveModelAlias)(a):void 0,fileAccess:(0,tA.getFileAccess)(r),workspace:o}),l={logger:console};if(t.stdio){await(0,nA.startRunnerHost)({engine:c,runtime:l,input:process.stdin,output:{write:p=>process.stdout.write(p)},nativeSessionId:()=>c.nativeSessionId}).done;return}let f=t.socket;if(!f)throw new Error("sandbox requires --socket <path> or --stdio");try{oa.unlinkSync(f)}catch{}let u=dU.createServer(d=>{(0,nA.startRunnerHost)({engine:c,runtime:l,input:d,output:{write:p=>d.write(p)},nativeSessionId:()=>c.nativeSessionId})});try{await new Promise((d,p)=>{u.once("error",p),u.listen(f,()=>d())})}catch(d){console.error(`[sandbox] FATAL: cannot listen at ${f}: ${d instanceof Error?d.message:String(d)}`),process.exit(1)}try{oa.chmodSync(f,432)}catch{}console.log(`[sandbox] ${t.sandboxId??"sandbox"} listening on ${f} (pack ${s.name}@${s.version??"?"})`),await new Promise(d=>{let p=()=>{u.close(()=>d()),c.dispose()};process.once("SIGTERM",p),process.once("SIGINT",p),u.once("close",()=>d())})}});Object.defineProperty(exports,"__esModule",{value:!0});var oA=require("module"),_U=oA.prototype.require;oA.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{}}:_U.apply(this,arguments)};var aA=require("commander"),wU=Sm(),cA=vm(),AU=Yy(),SU=t_(),bU=g_(),TU=U_(),vU=B_(),OU=_w(),IU=Zf(),PU=qw(),lA=zw(),NU=Qw(),aa=li(),Cl=qe(),RU=ya(),uA=Nc();function CU(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 ${uA.DEPRECATED_CAP_SPELLINGS["--max-concurrent-cells"]}. Honouring it for now.`),n}function kU(){try{return yc().version??"dev"}catch{return"dev"}}var $U=kU(),DU=[`${Cl.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_STORE_REPO Override store GitHub repo (owner/repo; CLI store 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" ${Cl.AGENTIDE_CLI_NAME} ask "Reply with exactly: CLI_TEST_OK"`,"","Agent Packs:",` Loaded from ~/${Cl.AGENTIDE_DIR_NAME}/agents/<name>/ or absolute/relative paths.`," Pack permissions control filesystem access scope."].join(`
|
|
635
|
+
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 eA=T(Rp=>{"use strict";Object.defineProperty(Rp,"__esModule",{value:!0});Rp.startRunnerHost=oU;var Pp=Zu(),sU=1e3*60*5,iU={selected:[],freeText:null,declined:!0};function oU(t){let e=f=>{t.output.write((0,Pp.encodeRunnerFrame)(f))},n=new Map,r="",s=!1,i=setInterval(()=>{try{t.engine.onMaintenance(t.logger??cU())}catch(f){t.logger?.warn(`[Runner] maintenance failed: ${Np(f)}`)}},t.maintenanceIntervalMs??sU);typeof i.unref=="function"&&i.unref();let o=()=>{},a=new Promise(f=>{o=()=>{if(!s){s=!0,clearInterval(i);for(let u of n.values())u.abort();n.clear(),f()}},t.input.on("data",u=>{r+=typeof u=="string"?u:u.toString("utf8");let{lines:d,rest:p}=(0,Pp.splitFrames)(r);r=p;for(let g of d){let m=(0,Pp.parseClientFrame)(g);if(!m){t.logger?.warn("[Runner] dropped malformed client frame");continue}c(m)}}),t.input.on("end",o),t.input.on("close",o),t.input.on("error",u=>{t.logger?.warn(`[Runner] input error: ${Np(u)}`),o()})});async function c(f){if(f.type==="abort"){n.get(f.id)?.abort();return}await l(f.id,f.message,f.options)}async function l(f,u,d){if(n.has(f)){e({type:"failed",id:f,message:`duplicate run id ${f}`});return}let p=new AbortController;n.set(f,p);let g=aU(e,f);try{await t.engine.stream(u,d,g,t.runtime,p.signal);let m=t.nativeSessionId?.();e({type:"result",id:f,...m?{nativeSessionId:m}:{}})}catch(m){let h=p.signal.aborted?"aborted":Np(m);e({type:"failed",id:f,message:h})}finally{n.delete(f)}}return e({type:"ready",demux:!0}),{done:a,close:()=>o()}}function aU(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}),iU},async error(r){n({type:"error",message:r})},async done(){n({type:"done"})}}}function Np(t){return t instanceof Error?t.message:String(t)}function cU(){return{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}});var iA=T(Cr=>{"use strict";var lU=Cr&&Cr.__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]})),uU=Cr&&Cr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$p=Cr&&Cr.__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"&&lU(n,e,r[s]);return uU(n,e),n}})();Object.defineProperty(Cr,"__esModule",{value:!0});Cr.resolveSandboxWorkspace=rA;Cr.isForeignWorkspace=sA;Cr.sandboxCommand=yU;var oa=$p(require("fs")),dU=$p(require("net")),Rl=$p(require("path")),Cp=ai(),fU=qn(),tA=ci(),pU=bd(),gU=li(),hU=Fr(),mU=Er(),nA=eA();function rA(t,e){return e}function sA(t,e){return t?Rl.resolve(t)!==Rl.resolve(e):!1}var kp=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,pU.createPackRunner)({storagePath:this.defaults.storagePath,analyticsSessionsDir:this.defaults.analyticsSessionsDir,packId:this.defaults.packId,packVersion:this.defaults.packVersion,provenance:()=>(0,mU.readProvenanceEnvFromProcess)(),workspaceRoot:this.defaults.workspace,credentials:{baseUrl:e.baseUrl,litellmApiKey:e.modelToken,useLiteLLM:!!e.baseUrl},claudeCheapModel:this.defaults.claudeCheapModel,omitGatewayToken:!0}),this.builtWith=n,this.runner)}async stream(e,n,r,s,i){let o=n,a=o.workspaceRoot,c=rA(a,this.defaults.workspace);sA(a,c)&&!this.warnedWorkspace&&(this.warnedWorkspace=!0,console.warn(`[sandbox] ignoring workspaceRoot ${a} from the wire \u2014 this sandbox works in ${c}`));try{oa.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),f=o,u=f.permissions??(f.fileAccess?{fileAccess:f.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:u,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(){}dispose(){this.runner?.dispose()}};function EU(){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 yU(t){await(0,gU.ensureDeps)(!1);let e=t.stateDir??"/state",n=t.workspace??Rl.join(e,"workspace");oa.mkdirSync(n,{recursive:!0});let r=await(0,tA.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=Rl.join(e,"home");oa.mkdirSync(i,{recursive:!0}),process.env.HOME=i;let o=n;await(0,Cp.syncPackToWorkspace)(o,r.packPath,s.name,s.engine,console,(0,fU.findBundledBasePromptsDir)()),console.log(`[sandbox] pack ${s.name}@${s.version??"?"} synced into ${o} (engine ${s.engine})`),EU();let a=r.manifest.spec?.cheapModel?.trim(),c=new kp({storagePath:e,analyticsSessionsDir:(0,hU.resolveAnalyticsSessionsDir)(e,!1),packId:s.name,packVersion:s.version,engineId:s.engine,modelId:(0,Cp.resolveModelAlias)(r.manifest.spec?.model?.trim()||"ah-auto"),claudeCheapModel:a?(0,Cp.resolveModelAlias)(a):void 0,fileAccess:(0,tA.getFileAccess)(r),workspace:o}),l={logger:console};if(t.stdio){await(0,nA.startRunnerHost)({engine:c,runtime:l,input:process.stdin,output:{write:p=>process.stdout.write(p)},nativeSessionId:()=>c.nativeSessionId}).done;return}let f=t.socket;if(!f)throw new Error("sandbox requires --socket <path> or --stdio");try{oa.unlinkSync(f)}catch{}let u=dU.createServer(d=>{(0,nA.startRunnerHost)({engine:c,runtime:l,input:d,output:{write:p=>d.write(p)},nativeSessionId:()=>c.nativeSessionId})});try{await new Promise((d,p)=>{u.once("error",p),u.listen(f,()=>d())})}catch(d){console.error(`[sandbox] FATAL: cannot listen at ${f}: ${d instanceof Error?d.message:String(d)}`),process.exit(1)}try{oa.chmodSync(f,432)}catch{}console.log(`[sandbox] ${t.sandboxId??"sandbox"} listening on ${f} (pack ${s.name}@${s.version??"?"})`),await new Promise(d=>{let p=()=>{u.close(()=>d()),c.dispose()};process.once("SIGTERM",p),process.once("SIGINT",p),u.once("close",()=>d())})}});Object.defineProperty(exports,"__esModule",{value:!0});var oA=require("module"),_U=oA.prototype.require;oA.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{}}:_U.apply(this,arguments)};var aA=require("commander"),wU=Sm(),cA=vm(),AU=Yy(),SU=t_(),bU=g_(),TU=U_(),vU=B_(),OU=_w(),IU=Zf(),PU=qw(),lA=zw(),NU=Qw(),aa=li(),Cl=Ye(),RU=ya(),uA=Nc();function CU(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 ${uA.DEPRECATED_CAP_SPELLINGS["--max-concurrent-cells"]}. Honouring it for now.`),n}function kU(){try{return yc().version??"dev"}catch{return"dev"}}var $U=kU(),DU=[`${Cl.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_STORE_REPO Override store GitHub repo (owner/repo; CLI store 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" ${Cl.AGENTIDE_CLI_NAME} ask "Reply with exactly: CLI_TEST_OK"`,"","Agent Packs:",` Loaded from ~/${Cl.AGENTIDE_DIR_NAME}/agents/<name>/ or absolute/relative paths.`," Pack permissions control filesystem access scope."].join(`
|
|
636
636
|
`),Le=new aA.Command;Le.hook("preAction",async(t,e)=>{e?.name()!=="sandbox"&&await(0,RU.mergeAgentHomeEnvIntoProcessEnv)()});Le.name(Cl.AGENTIDE_CLI_NAME).description(DU).version($U);Le.option("-v, --verbose","Enable verbose logging").option("--config <path>","Path to config file");Le.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=Le.opts().verbose;await(0,aa.ensureDeps)(e),await(0,wU.chatCommand)({agent:t.agent,engine:t.engine,model:t.model,workspace:t.workspace,verbose:e})});Le.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=Le.opts().verbose;await(0,aa.ensureDeps)(n);let r=t.join(" ");await(0,cA.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})});Le.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=Le.opts().verbose;await(0,aa.ensureDeps)(e),await(0,cA.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})});Le.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 aA.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=Le.opts().verbose;await(0,aa.ensureDeps)(e),await(0,AU.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:CU(t),capOnBreach:(()=>{let n=(0,uA.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})});Le.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(()=>Sn(Zw())),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});Le.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(()=>Sn(iA()));await e({agent:t.agent,socket:t.socket,stdio:!!t.stdio,workspace:t.workspace,stateDir:t.stateDir,sandboxId:t.sandboxId})});Le.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("--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=Le.opts().verbose;await(0,aa.ensureDeps)(e),await(0,SU.dataPlaneSidecarCommand)({agent:t.agent,workspace:t.workspace,gatewayPort:parseInt(t.gatewayPort,10),controlPort:parseInt(t.controlPort,10),host:t.host,stateDir:t.stateDir,verbose:e})});Le.command("auth-broker").description("Start the AgentHippo auth broker (OAuth + IDE bootstrap API)").action(async()=>{await(0,bU.authBrokerCommand)()});Le.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,TU.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})});Le.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,vU.idpCommand)(t,{hostname:e.hostname,cookieDomain:e.cookieDomain,out:e.out,force:!!e.force})});Le.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,OU.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:Le.opts().verbose})});Le.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,IU.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:Le.opts().verbose})});var dA=Le.command("gateway").description("Gateway outbound messaging");dA.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,lA.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})});dA.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,lA.gatewayListCommand)({outbound:t.outbound,agent:t.agent,json:!!t.json})});Le.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,PU.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})});Le.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,NU.probeCustomEngineCommand)({engine:t.engine,workspace:t.workspace,strategy:t.strategy})});Le.parseAsync();
|