@agenthippo-ai/agenthippo 1.110.41 → 1.110.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/out/cli/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*! Copyright (c) 2026 AgentHippo.ai. All rights reserved. Proprietary; see LICENSE. */
2
- "use strict";var tT=Object.create;var Fg=Object.defineProperty;var nT=Object.getOwnPropertyDescriptor;var rT=Object.getOwnPropertyNames;var sT=Object.getPrototypeOf,iT=Object.prototype.hasOwnProperty;var S=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var oT=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of rT(e))!iT.call(t,s)&&s!==n&&Fg(t,s,{get:()=>e[s],enumerable:!(r=nT(e,s))||r.enumerable});return t};var Pn=(t,e,n)=>(n=t!=null?tT(sT(t)):{},oT(e||!t||!t.__esModule?Fg(n,"default",{value:t,enumerable:!0}):n,t));var et=S(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0});Oe.SETTINGS_DISPLAY_PREFIX=Oe.SETTINGS_KEY_PREFIX=Oe.AGENTIDE_DEPS_PACKAGE_NAME=Oe.AGENTIDE_DEPS_DIR_NAME=Oe.AGENTIDE_CLI_NAME=Oe.AGENTIDE_DIR_NAME=Oe.AGENTIDE_EXTENSION_NAME=Oe.AGENTIDE_BRAND_NAME=void 0;Oe.toSettingsDisplayKey=Vg;Oe.describeSettingKey=aT;Oe.applyBrandingTokens=Wg;Oe.brandify=cT;Oe.AGENTIDE_BRAND_NAME="Agent Hippo";Oe.AGENTIDE_EXTENSION_NAME=`${Oe.AGENTIDE_BRAND_NAME} Extension`;Oe.AGENTIDE_DIR_NAME=".agent-hippo";Oe.AGENTIDE_CLI_NAME="agenthippo";Oe.AGENTIDE_DEPS_DIR_NAME=`.${Oe.AGENTIDE_CLI_NAME}-deps`;Oe.AGENTIDE_DEPS_PACKAGE_NAME=`${Oe.AGENTIDE_CLI_NAME}-deps`;Oe.SETTINGS_KEY_PREFIX="agentide.";Oe.SETTINGS_DISPLAY_PREFIX="agenthippoai.";function Vg(t){return t.startsWith(Oe.SETTINGS_KEY_PREFIX)?Oe.SETTINGS_DISPLAY_PREFIX+t.slice(Oe.SETTINGS_KEY_PREFIX.length):t}function aT(t){let e=Vg(t);return e===t?t:`${t} (shown in Settings as ${e})`}function Wg(t){return t.replace(/\{\{AGENT_BRAND\}\}|\{\{AGENTIDE_BRAND\}\}/g,Oe.AGENTIDE_BRAND_NAME).replace(/\{\{BRAND_FOLDER\}\}/g,Oe.AGENTIDE_DIR_NAME)}function cT(t){return Wg(t).replace(/\bAgentIDE\b/g,Oe.AGENTIDE_BRAND_NAME)}});var qn=S(W=>{"use strict";var lT=W&&W.__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]})),uT=W&&W.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wu=W&&W.__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"&&lT(n,e,r[s]);return uT(n,e),n}})();Object.defineProperty(W,"__esModule",{value:!0});W.AGENT_CONSTANTS=void 0;W.getAgentideHome=Ua;W.getUserAgentsDir=Kg;W.getUserSkillsDir=qg;W.getUserSkillDir=gT;W.getUserMcpDir=Yg;W.getUserMcpServerDir=hT;W.getUserAgentRoot=Su;W.getUserAgentVersionDir=mT;W.getUserAgentCurrentPath=ET;W.getAgentideDir=Au;W.getAgentsDir=Jg;W.getAgentRoot=js;W.resolveAgentRuntimePaths=Xg;W.resolveRuntimePaths=_T;W.userScopedEngineHome=yT;W.engineHomeUserKey=zg;W.userScopedEngineHomeFromKey=Qg;W.isDefaultAgent=wT;W.getAgentManifestPath=ST;W.getAgentAgentsMdPath=AT;W.getAgentContextPath=TT;W.getAgentSkillsDir=bT;W.getAgentRulesDir=vT;W.getAgentMcpDir=OT;W.getSessionsDir=IT;W.parseAgentIdFromPath=PT;W.isValidPackName=NT;W.normalizePackName=RT;W.getPackNameError=CT;W.packNameToTitle=Tu;W.stripModelProviderPrefix=Ga;W.generateDefaultAgentYaml=kT;W.generateAgentYaml=$T;W.generateAgentsMd=DT;var $e=wu(require("path")),dT=wu(require("os")),fT=wu(require("crypto")),pT=et();W.AGENT_CONSTANTS={DEFAULT_AGENT_ID:"default",AGENTIDE_DIR_NAME:pT.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 Ua(){return process.env.AGENTHIPPO_HOME||$e.join(dT.homedir(),W.AGENT_CONSTANTS.AGENTIDE_DIR_NAME)}function Kg(){return process.env.AGENTIDE_USER_AGENTS_DIR||$e.join(Ua(),W.AGENT_CONSTANTS.AGENTS_DIR)}function qg(){return $e.join(Ua(),W.AGENT_CONSTANTS.SKILLS_DIR)}function gT(t){return $e.join(qg(),t)}function Yg(){return $e.join(Ua(),W.AGENT_CONSTANTS.MCP_DIR)}function hT(t){return $e.join(Yg(),t)}function Su(t){return $e.join(Kg(),t)}function mT(t,e){return $e.join(Su(t),e)}function ET(t){return $e.join(Su(t),W.AGENT_CONSTANTS.CURRENT_VERSION_FILE)}function Au(t){return $e.join(t,W.AGENT_CONSTANTS.AGENTIDE_DIR_NAME)}function Jg(t){return $e.join(Au(t),W.AGENT_CONSTANTS.AGENTS_DIR)}function js(t,e){return $e.join(Jg(t),e)}function Xg(t,e,n,r="0.0.0"){let s=js(t,n);return{agentId:n,agentVersion:r,agentRoot:s,rulesDir:$e.join(s,W.AGENT_CONSTANTS.RULES_DIR),skillsDir:$e.join(s,W.AGENT_CONSTANTS.SKILLS_DIR),mcpDir:$e.join(s,W.AGENT_CONSTANTS.MCP_DIR),codexDerivedDir:$e.join(t,".codex"),claudeDerivedDir:$e.join(t,".claude"),codexHome:$e.join(e,W.AGENT_CONSTANTS.AGENTS_DIR,n,"codex"),claudeConfigDir:$e.join(e,W.AGENT_CONSTANTS.AGENTS_DIR,n,"claude")}}function _T(t,e,n,r){let s=n??W.AGENT_CONSTANTS.DEFAULT_AGENT_ID;return Xg(t,e,s,r)}function yT(t,e){return Qg(t,zg(e))}function zg(t){let e=t?.trim();if(e)return fT.createHash("sha256").update(e).digest("hex").slice(0,16)}function Qg(t,e){return!e||!/^[0-9a-f]{16}$/.test(e)?t:$e.join(t,"users",e)}function wT(t){return t===W.AGENT_CONSTANTS.DEFAULT_AGENT_ID}function ST(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.MANIFEST_FILE)}function AT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.AGENTS_MD)}function TT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.CONTEXT_MD)}function bT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.SKILLS_DIR)}function vT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.RULES_DIR)}function OT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.MCP_DIR)}function IT(t){return $e.join(Au(t),W.AGENT_CONSTANTS.SESSIONS_DIR)}function PT(t){let e=t.split($e.sep),n=e.lastIndexOf(W.AGENT_CONSTANTS.AGENTS_DIR);if(n!==-1&&e.length>n+1)return e[n+1]}var Zg=/[/\\:*?"<>|]/;function NT(t){return!(!t||t.trim().length===0||Zg.test(t)||t.startsWith("."))}function RT(t){return t.trim().toLowerCase().replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}function CT(t){if(!t||t.trim().length===0)return"Pack name is required";if(Zg.test(t))return'Pack name cannot contain path separators or special characters (/ \\ : * ? " < > |)';if(t.startsWith("."))return"Pack name cannot start with a dot"}function Tu(t){return t.split(/[-_\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function Ga(t){let e=t.match(/^[a-z0-9-]+::/i);return e?t.slice(e[0].length):t}function kT(t={}){let{engine:e="claude",model:n,includeHeaderComments:r=!0,includeModelHintComment:s=!1}=t,i=n?Ga(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(`
2
+ "use strict";var tT=Object.create;var Fg=Object.defineProperty;var nT=Object.getOwnPropertyDescriptor;var rT=Object.getOwnPropertyNames;var sT=Object.getPrototypeOf,iT=Object.prototype.hasOwnProperty;var S=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var oT=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of rT(e))!iT.call(t,s)&&s!==n&&Fg(t,s,{get:()=>e[s],enumerable:!(r=nT(e,s))||r.enumerable});return t};var In=(t,e,n)=>(n=t!=null?tT(sT(t)):{},oT(e||!t||!t.__esModule?Fg(n,"default",{value:t,enumerable:!0}):n,t));var et=S(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0});Oe.SETTINGS_DISPLAY_PREFIX=Oe.SETTINGS_KEY_PREFIX=Oe.AGENTIDE_DEPS_PACKAGE_NAME=Oe.AGENTIDE_DEPS_DIR_NAME=Oe.AGENTIDE_CLI_NAME=Oe.AGENTIDE_DIR_NAME=Oe.AGENTIDE_EXTENSION_NAME=Oe.AGENTIDE_BRAND_NAME=void 0;Oe.toSettingsDisplayKey=Vg;Oe.describeSettingKey=aT;Oe.applyBrandingTokens=Wg;Oe.brandify=cT;Oe.AGENTIDE_BRAND_NAME="Agent Hippo";Oe.AGENTIDE_EXTENSION_NAME=`${Oe.AGENTIDE_BRAND_NAME} Extension`;Oe.AGENTIDE_DIR_NAME=".agent-hippo";Oe.AGENTIDE_CLI_NAME="agenthippo";Oe.AGENTIDE_DEPS_DIR_NAME=`.${Oe.AGENTIDE_CLI_NAME}-deps`;Oe.AGENTIDE_DEPS_PACKAGE_NAME=`${Oe.AGENTIDE_CLI_NAME}-deps`;Oe.SETTINGS_KEY_PREFIX="agentide.";Oe.SETTINGS_DISPLAY_PREFIX="agenthippoai.";function Vg(t){return t.startsWith(Oe.SETTINGS_KEY_PREFIX)?Oe.SETTINGS_DISPLAY_PREFIX+t.slice(Oe.SETTINGS_KEY_PREFIX.length):t}function aT(t){let e=Vg(t);return e===t?t:`${t} (shown in Settings as ${e})`}function Wg(t){return t.replace(/\{\{AGENT_BRAND\}\}|\{\{AGENTIDE_BRAND\}\}/g,Oe.AGENTIDE_BRAND_NAME).replace(/\{\{BRAND_FOLDER\}\}/g,Oe.AGENTIDE_DIR_NAME)}function cT(t){return Wg(t).replace(/\bAgentIDE\b/g,Oe.AGENTIDE_BRAND_NAME)}});var qn=S(W=>{"use strict";var lT=W&&W.__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]})),uT=W&&W.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wu=W&&W.__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"&&lT(n,e,r[s]);return uT(n,e),n}})();Object.defineProperty(W,"__esModule",{value:!0});W.AGENT_CONSTANTS=void 0;W.getAgentideHome=Ua;W.getUserAgentsDir=Kg;W.getUserSkillsDir=qg;W.getUserSkillDir=gT;W.getUserMcpDir=Yg;W.getUserMcpServerDir=hT;W.getUserAgentRoot=Su;W.getUserAgentVersionDir=mT;W.getUserAgentCurrentPath=ET;W.getAgentideDir=Au;W.getAgentsDir=Jg;W.getAgentRoot=js;W.resolveAgentRuntimePaths=Xg;W.resolveRuntimePaths=_T;W.userScopedEngineHome=yT;W.engineHomeUserKey=zg;W.userScopedEngineHomeFromKey=Qg;W.isDefaultAgent=wT;W.getAgentManifestPath=ST;W.getAgentAgentsMdPath=AT;W.getAgentContextPath=TT;W.getAgentSkillsDir=bT;W.getAgentRulesDir=vT;W.getAgentMcpDir=OT;W.getSessionsDir=PT;W.parseAgentIdFromPath=IT;W.isValidPackName=NT;W.normalizePackName=RT;W.getPackNameError=CT;W.packNameToTitle=Tu;W.stripModelProviderPrefix=Ga;W.generateDefaultAgentYaml=kT;W.generateAgentYaml=$T;W.generateAgentsMd=DT;var $e=wu(require("path")),dT=wu(require("os")),fT=wu(require("crypto")),pT=et();W.AGENT_CONSTANTS={DEFAULT_AGENT_ID:"default",AGENTIDE_DIR_NAME:pT.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 Ua(){return process.env.AGENTHIPPO_HOME||$e.join(dT.homedir(),W.AGENT_CONSTANTS.AGENTIDE_DIR_NAME)}function Kg(){return process.env.AGENTIDE_USER_AGENTS_DIR||$e.join(Ua(),W.AGENT_CONSTANTS.AGENTS_DIR)}function qg(){return $e.join(Ua(),W.AGENT_CONSTANTS.SKILLS_DIR)}function gT(t){return $e.join(qg(),t)}function Yg(){return $e.join(Ua(),W.AGENT_CONSTANTS.MCP_DIR)}function hT(t){return $e.join(Yg(),t)}function Su(t){return $e.join(Kg(),t)}function mT(t,e){return $e.join(Su(t),e)}function ET(t){return $e.join(Su(t),W.AGENT_CONSTANTS.CURRENT_VERSION_FILE)}function Au(t){return $e.join(t,W.AGENT_CONSTANTS.AGENTIDE_DIR_NAME)}function Jg(t){return $e.join(Au(t),W.AGENT_CONSTANTS.AGENTS_DIR)}function js(t,e){return $e.join(Jg(t),e)}function Xg(t,e,n,r="0.0.0"){let s=js(t,n);return{agentId:n,agentVersion:r,agentRoot:s,rulesDir:$e.join(s,W.AGENT_CONSTANTS.RULES_DIR),skillsDir:$e.join(s,W.AGENT_CONSTANTS.SKILLS_DIR),mcpDir:$e.join(s,W.AGENT_CONSTANTS.MCP_DIR),codexDerivedDir:$e.join(t,".codex"),claudeDerivedDir:$e.join(t,".claude"),codexHome:$e.join(e,W.AGENT_CONSTANTS.AGENTS_DIR,n,"codex"),claudeConfigDir:$e.join(e,W.AGENT_CONSTANTS.AGENTS_DIR,n,"claude")}}function _T(t,e,n,r){let s=n??W.AGENT_CONSTANTS.DEFAULT_AGENT_ID;return Xg(t,e,s,r)}function yT(t,e){return Qg(t,zg(e))}function zg(t){let e=t?.trim();if(e)return fT.createHash("sha256").update(e).digest("hex").slice(0,16)}function Qg(t,e){return!e||!/^[0-9a-f]{16}$/.test(e)?t:$e.join(t,"users",e)}function wT(t){return t===W.AGENT_CONSTANTS.DEFAULT_AGENT_ID}function ST(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.MANIFEST_FILE)}function AT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.AGENTS_MD)}function TT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.CONTEXT_MD)}function bT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.SKILLS_DIR)}function vT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.RULES_DIR)}function OT(t,e){return $e.join(js(t,e),W.AGENT_CONSTANTS.MCP_DIR)}function PT(t){return $e.join(Au(t),W.AGENT_CONSTANTS.SESSIONS_DIR)}function IT(t){let e=t.split($e.sep),n=e.lastIndexOf(W.AGENT_CONSTANTS.AGENTS_DIR);if(n!==-1&&e.length>n+1)return e[n+1]}var Zg=/[/\\:*?"<>|]/;function NT(t){return!(!t||t.trim().length===0||Zg.test(t)||t.startsWith("."))}function RT(t){return t.trim().toLowerCase().replace(/[\s_]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}function CT(t){if(!t||t.trim().length===0)return"Pack name is required";if(Zg.test(t))return'Pack name cannot contain path separators or special characters (/ \\ : * ? " < > |)';if(t.startsWith("."))return"Pack name cannot start with a dot"}function Tu(t){return t.split(/[-_\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function Ga(t){let e=t.match(/^[a-z0-9-]+::/i);return e?t.slice(e[0].length):t}function kT(t={}){let{engine:e="claude",model:n,includeHeaderComments:r=!0,includeModelHintComment:s=!1}=t,i=n?Ga(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 $T(t,e={}){let{description:n=`A specialized agent for ${Tu(t).toLowerCase()} tasks`,engine:r="claude",author:s=process.env.USER||"unknown"}=e,i=e.model??(r==="claude"?"claude-sonnet-4":"codex"),o=Ga(i),a=e.cheapModel?Ga(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: ${W.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 DT(t,e={}){let n=Tu(t),r=e.description||`A specialized agent for ${n.toLowerCase()} tasks.`;return`# ${n} Agent
5
5
 
@@ -21,14 +21,14 @@ ${r}
21
21
 
22
22
  Provide clear, actionable responses with code examples when relevant.
23
23
  `}});var ps=S(gn=>{"use strict";Object.defineProperty(gn,"__esModule",{value:!0});gn.ON_DENIED_TIMEOUT_MS=gn.WARRANT_DENIED_REASON=void 0;gn.runWithCredential=HT;gn.currentCredential=jT;gn.resolveEngineHomeUserKey=xT;gn.requireUserId=BT;var LT=require("async_hooks"),MT=qn();gn.WARRANT_DENIED_REASON="token_without_verified_user";gn.ON_DENIED_TIMEOUT_MS=2e3;var Ha=new LT.AsyncLocalStorage;async function GT(t,e,n){if(!t)return;let r=Number.isFinite(n)&&n>0?n:gn.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 UT(t,e){if(t.dataToken?.trim()&&!t.userId?.trim())throw await GT(e?.onDenied,gn.WARRANT_DENIED_REASON,e?.onDeniedTimeoutMs??gn.ON_DENIED_TIMEOUT_MS),new Error(`OBO data token present without a verified user in request scope (fail-closed: ${gn.WARRANT_DENIED_REASON})`)}async function HT(t,e,n){return await UT(t,n),Ha.run(t,async()=>e())}function jT(){return Ha.getStore()}function xT(t){return(0,MT.engineHomeUserKey)(Ha.getStore()?.userId)??t?.trim()??void 0}function BT(){let t=Ha.getStore()?.userId?.trim();if(!t)throw new Error("No authenticated user in request scope (fail-closed)");return t}});var fi=S(rn=>{"use strict";var FT=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]})),VT=rn&&rn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),eh=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"&&FT(n,e,r[s]);return VT(n,e),n}})();Object.defineProperty(rn,"__esModule",{value:!0});rn.DIRS=rn.PID_FILES=void 0;rn.getAgentideHome=th;rn.getAgentidePath=di;rn.getAnalyticsScriptsDir=qT;var ja=eh(require("path")),WT=eh(require("os")),KT=et();function th(){let t=process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME;return t?.trim()?t.trim():ja.join(WT.homedir(),KT.AGENTIDE_DIR_NAME)}function di(...t){return ja.join(th(),...t)}rn.PID_FILES={gateway:()=>di("gateway.pid"),litellm:()=>di("litellm.pid"),otelcol:()=>di("analytics","otelcol.pid")};rn.DIRS={analytics:()=>di("analytics"),credentials:()=>di("credentials"),sessions:()=>di("sessions")};function qT(t){let e=require("fs"),n=ja.join(t,"out","scripts","analytics"),r=ja.join(t,"scripts","analytics");try{return e.accessSync(n),n}catch{}try{return e.accessSync(r),r}catch{}return n}});var Ba=S(Yn=>{"use strict";Object.defineProperty(Yn,"__esModule",{value:!0});Yn.GATEWAY_SECRET_ENV_KEYS=void 0;Yn.getAgentHomeEnvFilePath=xa;Yn.parseEnvContent=nh;Yn.readAgentHomeEnvFile=bu;Yn.mergeEnvIntoProcessEnv=rh;Yn.mergeAgentHomeEnvIntoProcessEnv=XT;Yn.buildGatewayChildProcessEnv=sh;Yn.readGatewayChildProcessEnv=zT;var YT=require("fs"),JT=fi();function xa(){return(0,JT.getAgentidePath)(".env")}function nh(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 bu(t=xa()){try{let e=await YT.promises.readFile(t,"utf-8");return nh(e)}catch{return{}}}function rh(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 XT(t=xa()){let e=await bu(t);return{...rh(e),envFilePath:t}}Yn.GATEWAY_SECRET_ENV_KEYS=["SLACK_BOT_TOKEN","SLACK_APP_TOKEN","OPENCLAW_GATEWAY_TOKEN"];function sh(t,e,n=Yn.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 zT(t=xa()){let e=await bu(t);return sh(process.env,e)}});var Fo=S(Je=>{"use strict";var QT=Je&&Je.__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]})),ZT=Je&&Je.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),eb=Je&&Je.__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"&&QT(n,e,r[s]);return ZT(n,e),n}})();Object.defineProperty(Je,"__esModule",{value:!0});Je.AGENTHIPPO_MCP_SERVERS_ENV=Je.ALLOW_INLINE_DATA_TOKEN_ENV=void 0;Je.loadMcpServers=ib;Je.resolveMcpEnvVar=ch;Je.resolveMcpServerEnv=db;Je.generateCodexMcpConfig=hb;Je.getDefaultMcpConfig=mb;Je.loadBundledMcpServers=Eb;Je.resolveHttpMcpHeaders=Ru;Je.referenceHttpMcpHeaders=yb;Je.formatInlineMcpServers=wb;Je.serializeInlineMcpServers=Sb;Je.parseInlineMcpServers=Ab;var zi=require("fs"),jr=eb(require("path")),vu=ps(),ih=qn(),tb=Ba(),nb="enable-bundled",rb="disable-bundled",oh=".mcp.json",Iu="mcp-servers";Je.ALLOW_INLINE_DATA_TOKEN_ENV="AGENTHIPPO_ALLOW_INLINE_DATA_TOKEN";function Ou(){return/^(1|true)$/i.test(process.env[Je.ALLOW_INLINE_DATA_TOKEN_ENV]?.trim()??"")}var Pu=/\$\{env:(\w+)\}/g,sb=/\$\{credential:(\w+)\}/g;async function ib(t,e,n){let r=(0,ih.getAgentMcpDir)(e,t||ih.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=jr.join(r,oh);if(!await Va(s))return[];let i=n?jr.join(n,Iu):"";return ob(s,r,e,i)}async function ob(t,e,n,r){let s;try{let a=await zi.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 pb(n,e),o=[];for(let[a,c]of Object.entries(s.mcpServers))try{let l=await ab(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 ab(t,e,n,r,s){if(e.command===rb)return null;if(e.command===nb)return cb(t,e,r,s);if(e.url){let i=e.url.replace(Pu,(o,a)=>lh(a,s)).trim();return i?{name:t,label:e.label??t,description:e.description,command:"",args:[],url:i,headers:fb(e.headers,s),bearerTokenEnv:e.bearerTokenEnv?.trim()||void 0}:null}return{name:t,label:e.label??t,description:e.description,command:e.command??"",args:Nu(e.args,n),env:Fa(e.env,s)}}async function cb(t,e,n,r){let s=await ah(t,n);if(!s)return null;let i=jr.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:Nu(s.args,i),env:Fa(o,r)}}async function ah(t,e){if(!e)return console.warn(`[AgentIDE] Bundled MCP directory unavailable; cannot resolve '${t}'`),null;let n=jr.join(e,t,"mcp.json");if(!await Va(n))return console.warn(`[AgentIDE] Bundled server '${t}' not found at ${n}`),null;try{let r=await zi.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 Nu(t,e){return t?t.map(n=>{let r=n;return r=r.replace(/\$\{serverDir\}/g,e),(r.startsWith("./")||r.startsWith("../"))&&(r=jr.resolve(e,r)),r}):[]}function ch(t,e={}){let n=lb();if(t==="dataToken"){let r=(0,vu.currentCredential)()?.dataToken?.trim();return r&&Ou()?r:""}if(n.includes(t)){let r=(0,vu.currentCredential)()?.dataToken?.trim();if(r&&Ou())return r}return process.env[t]??e[t]??""}function lb(){let t=process.env.AGENTHIPPO_DATA_TOKEN_ENV_VARS;return t!==void 0?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function ub(t){return/\$\{credential:dataToken\}/.test(t)}function Fa(t,e={}){if(!t)return;let n={};for(let[r,s]of Object.entries(t)){if(sb.lastIndex=0,ub(s)){let i=(0,vu.currentCredential)()?.dataToken?.trim();if(i)Ou()&&(n[r]=i);else{let o=process.env[r]??e[r]??"";o&&(n[r]=o)}continue}n[r]=s.replace(Pu,(i,o)=>ch(o,e))}return n}function db(t,e={}){return Fa(t,e)}function fb(t,e={}){if(!t)return;let n={};for(let[r,s]of Object.entries(t)){let i=s.replace(Pu,(o,a)=>lh(a,e));i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function lh(t,e){return process.env[t]??e[t]??""}async function pb(t,e){let n={},r=[jr.join(e,".env"),jr.join(t,".env")];for(let s of r){let i=await gb(s);Object.assign(n,i)}return n}async function gb(t){try{let e=await zi.promises.readFile(t,"utf-8");return(0,tb.parseEnvContent)(e)}catch{return{}}}function hb(t,e){if(t.length===0)return"";let n=e?.autoApprove?'default_tools_approval_mode = "approve"':void 0;return`
24
+ `).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\\\/g,"\\")),o&&(e[o]=a)}return e}async function bu(t=xa()){try{let e=await YT.promises.readFile(t,"utf-8");return nh(e)}catch{return{}}}function rh(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 XT(t=xa()){let e=await bu(t);return{...rh(e),envFilePath:t}}Yn.GATEWAY_SECRET_ENV_KEYS=["SLACK_BOT_TOKEN","SLACK_APP_TOKEN","OPENCLAW_GATEWAY_TOKEN"];function sh(t,e,n=Yn.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 zT(t=xa()){let e=await bu(t);return sh(process.env,e)}});var Fo=S(Je=>{"use strict";var QT=Je&&Je.__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]})),ZT=Je&&Je.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),eb=Je&&Je.__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"&&QT(n,e,r[s]);return ZT(n,e),n}})();Object.defineProperty(Je,"__esModule",{value:!0});Je.AGENTHIPPO_MCP_SERVERS_ENV=Je.ALLOW_INLINE_DATA_TOKEN_ENV=void 0;Je.loadMcpServers=ib;Je.resolveMcpEnvVar=ch;Je.resolveMcpServerEnv=db;Je.generateCodexMcpConfig=hb;Je.getDefaultMcpConfig=mb;Je.loadBundledMcpServers=Eb;Je.resolveHttpMcpHeaders=Ru;Je.referenceHttpMcpHeaders=yb;Je.formatInlineMcpServers=wb;Je.serializeInlineMcpServers=Sb;Je.parseInlineMcpServers=Ab;var zi=require("fs"),jr=eb(require("path")),vu=ps(),ih=qn(),tb=Ba(),nb="enable-bundled",rb="disable-bundled",oh=".mcp.json",Pu="mcp-servers";Je.ALLOW_INLINE_DATA_TOKEN_ENV="AGENTHIPPO_ALLOW_INLINE_DATA_TOKEN";function Ou(){return/^(1|true)$/i.test(process.env[Je.ALLOW_INLINE_DATA_TOKEN_ENV]?.trim()??"")}var Iu=/\$\{env:(\w+)\}/g,sb=/\$\{credential:(\w+)\}/g;async function ib(t,e,n){let r=(0,ih.getAgentMcpDir)(e,t||ih.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=jr.join(r,oh);if(!await Va(s))return[];let i=n?jr.join(n,Pu):"";return ob(s,r,e,i)}async function ob(t,e,n,r){let s;try{let a=await zi.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 pb(n,e),o=[];for(let[a,c]of Object.entries(s.mcpServers))try{let l=await ab(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 ab(t,e,n,r,s){if(e.command===rb)return null;if(e.command===nb)return cb(t,e,r,s);if(e.url){let i=e.url.replace(Iu,(o,a)=>lh(a,s)).trim();return i?{name:t,label:e.label??t,description:e.description,command:"",args:[],url:i,headers:fb(e.headers,s),bearerTokenEnv:e.bearerTokenEnv?.trim()||void 0}:null}return{name:t,label:e.label??t,description:e.description,command:e.command??"",args:Nu(e.args,n),env:Fa(e.env,s)}}async function cb(t,e,n,r){let s=await ah(t,n);if(!s)return null;let i=jr.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:Nu(s.args,i),env:Fa(o,r)}}async function ah(t,e){if(!e)return console.warn(`[AgentIDE] Bundled MCP directory unavailable; cannot resolve '${t}'`),null;let n=jr.join(e,t,"mcp.json");if(!await Va(n))return console.warn(`[AgentIDE] Bundled server '${t}' not found at ${n}`),null;try{let r=await zi.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 Nu(t,e){return t?t.map(n=>{let r=n;return r=r.replace(/\$\{serverDir\}/g,e),(r.startsWith("./")||r.startsWith("../"))&&(r=jr.resolve(e,r)),r}):[]}function ch(t,e={}){let n=lb();if(t==="dataToken"){let r=(0,vu.currentCredential)()?.dataToken?.trim();return r&&Ou()?r:""}if(n.includes(t)){let r=(0,vu.currentCredential)()?.dataToken?.trim();if(r&&Ou())return r}return process.env[t]??e[t]??""}function lb(){let t=process.env.AGENTHIPPO_DATA_TOKEN_ENV_VARS;return t!==void 0?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function ub(t){return/\$\{credential:dataToken\}/.test(t)}function Fa(t,e={}){if(!t)return;let n={};for(let[r,s]of Object.entries(t)){if(sb.lastIndex=0,ub(s)){let i=(0,vu.currentCredential)()?.dataToken?.trim();if(i)Ou()&&(n[r]=i);else{let o=process.env[r]??e[r]??"";o&&(n[r]=o)}continue}n[r]=s.replace(Iu,(i,o)=>ch(o,e))}return n}function db(t,e={}){return Fa(t,e)}function fb(t,e={}){if(!t)return;let n={};for(let[r,s]of Object.entries(t)){let i=s.replace(Iu,(o,a)=>lh(a,e));i&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function lh(t,e){return process.env[t]??e[t]??""}async function pb(t,e){let n={},r=[jr.join(e,".env"),jr.join(t,".env")];for(let s of r){let i=await gb(s);Object.assign(n,i)}return n}async function gb(t){try{let e=await zi.promises.readFile(t,"utf-8");return(0,tb.parseEnvContent)(e)}catch{return{}}}function hb(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 mb(t){let e=jr.join(t,Iu,oh);if(!await Va(e))return null;try{return await zi.promises.readFile(e,"utf-8")}catch{return null}}async function Eb(t){let e=jr.join(t,Iu);if(!await Va(e))return[];let n=[],r;try{r=await zi.promises.readdir(e,{withFileTypes:!0})}catch{return[]}for(let s of r){if(!s.isDirectory())continue;let i=s.name,o=await ah(i,e);if(!o)continue;let a=jr.join(e,i);n.push({name:o.name??i,label:o.label??i,description:o.description,command:o.command,args:Nu(o.args,a),env:Fa(o.env)})}return n}Je.AGENTHIPPO_MCP_SERVERS_ENV="AGENTHIPPO_MCP_SERVERS";function Ru(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 _b=/^[A-Za-z_][A-Za-z0-9_]*$/;function yb(t,e){let n=t.bearerTokenEnv;if(n&&!_b.test(n))return Ru(t,e);let r={...t.headers??{}};return n&&(r.Authorization=`Bearer \${${n}}`),Object.keys(r).length>0?r:void 0}function wb(t,e){let n={};for(let r of t){if(r.url){let s=Ru(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 Sb(t){if(Object.keys(t).length!==0)return JSON.stringify(t)}function Ab(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 Va(t){try{return await zi.promises.access(t),!0}catch{return!1}}});var Ka=S(Wa=>{"use strict";Object.defineProperty(Wa,"__esModule",{value:!0});Wa.ENGINE_EFFORTS=void 0;Wa.ENGINE_EFFORTS={codex:["minimal","low","medium","high","xhigh","max","ultra","persistent"],claude:["low","medium","high","xhigh","max"]}});var uh=S(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.NoOpLogger=Qi.ConsoleLogger=void 0;var Cu=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}`:""}`)}};Qi.ConsoleLogger=Cu;var ku=class{debug(e){}info(e){}warn(e){}error(e,n){}};Qi.NoOpLogger=ku});var dh=S(xs=>{"use strict";Object.defineProperty(xs,"__esModule",{value:!0});xs.CLIPermissionHandler=xs.AutoDenyPermissionHandler=xs.AutoApprovePermissionHandler=void 0;var $u=class{async requestPermission(e){return{behavior:"allow"}}};xs.AutoApprovePermissionHandler=$u;var Du=class{message;constructor(e="All tool requests are denied"){this.message=e}async requestPermission(e){return{behavior:"deny",message:this.message}}};xs.AutoDenyPermissionHandler=Du;var Lu=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"})})})}};xs.CLIPermissionHandler=Lu});var fh=S(qa=>{"use strict";Object.defineProperty(qa,"__esModule",{value:!0});qa.NoOpEditTracker=void 0;var Mu=class{appliesEdits=!1;async startTracking(e,n){}async stopTracking(e,n){}async applyEdit(e,n,r,s){}};qa.NoOpEditTracker=Mu});var ph=S(hn=>{"use strict";var Tb=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]})),bb=hn&&hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),vb=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"&&Tb(n,e,r[s]);return bb(n,e),n}})();Object.defineProperty(hn,"__esModule",{value:!0});hn.DirectorySessionStore=hn.FileSessionStore=hn.MemorySessionStore=void 0;var sn=require("fs"),Ya=vb(require("path")),Ob=require("crypto"),Gu=class{store=new Map;get(e){return this.store.get(e)}async set(e,n){this.store.set(e,n)}clear(){this.store.clear()}};hn.MemorySessionStore=Gu;var Uu=class{store={};loaded=!1;filePath;constructor(e){this.filePath=e}async load(){if(!this.loaded){try{let e=await sn.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=Ya.dirname(this.filePath);await sn.promises.mkdir(e,{recursive:!0});let n=`${this.filePath}.tmp.${Date.now()}`,r=JSON.stringify(this.store,null,2);try{await sn.promises.writeFile(n,r,"utf-8"),await sn.promises.rename(n,this.filePath)}catch(s){try{await sn.promises.unlink(n)}catch{}throw s}}loadSync(){if(!this.loaded){try{let e=(0,sn.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}}};hn.FileSessionStore=Uu;var Hu=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 sn.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 sn.promises.unlink(Ya.join(this.dir,i))}catch{}this.files.delete(s),this.serialized.delete(s)}this.entries={...r}}fileNameFor(e){return(0,Ob.createHash)("sha256").update(e).digest("hex").slice(0,40)}async writeAtomic(e,n){let r=Ya.join(this.dir,e),s=`${r}.tmp.${process.pid}.${Date.now()}`;try{await sn.promises.writeFile(s,n,"utf-8"),await sn.promises.rename(s,r)}catch(i){try{await sn.promises.unlink(s)}catch{}throw i}}loadSync(){if(this.loaded)return;this.loaded=!0,this.migrateLegacySingleFileSync();let e;try{e=(0,sn.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,sn.readFileSync)(Ya.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,sn.readdirSync)(this.dir)}catch{e=!1}if(e)return;let n=`${this.dir}.json`,r;try{r=JSON.parse((0,sn.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}};hn.DirectorySessionStore=Hu});var gh=S(Ja=>{"use strict";Object.defineProperty(Ja,"__esModule",{value:!0});Ja.StaticConfigProvider=void 0;var ju=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}};Ja.StaticConfigProvider=ju});var Xa=S(ct=>{"use strict";Object.defineProperty(ct,"__esModule",{value:!0});ct.StaticConfigProvider=ct.DirectorySessionStore=ct.FileSessionStore=ct.MemorySessionStore=ct.NoOpEditTracker=ct.CLIPermissionHandler=ct.AutoDenyPermissionHandler=ct.AutoApprovePermissionHandler=ct.NoOpLogger=ct.ConsoleLogger=void 0;var hh=uh();Object.defineProperty(ct,"ConsoleLogger",{enumerable:!0,get:function(){return hh.ConsoleLogger}});Object.defineProperty(ct,"NoOpLogger",{enumerable:!0,get:function(){return hh.NoOpLogger}});var xu=dh();Object.defineProperty(ct,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return xu.AutoApprovePermissionHandler}});Object.defineProperty(ct,"AutoDenyPermissionHandler",{enumerable:!0,get:function(){return xu.AutoDenyPermissionHandler}});Object.defineProperty(ct,"CLIPermissionHandler",{enumerable:!0,get:function(){return xu.CLIPermissionHandler}});var Ib=fh();Object.defineProperty(ct,"NoOpEditTracker",{enumerable:!0,get:function(){return Ib.NoOpEditTracker}});var Bu=ph();Object.defineProperty(ct,"MemorySessionStore",{enumerable:!0,get:function(){return Bu.MemorySessionStore}});Object.defineProperty(ct,"FileSessionStore",{enumerable:!0,get:function(){return Bu.FileSessionStore}});Object.defineProperty(ct,"DirectorySessionStore",{enumerable:!0,get:function(){return Bu.DirectorySessionStore}});var Pb=gh();Object.defineProperty(ct,"StaticConfigProvider",{enumerable:!0,get:function(){return Pb.StaticConfigProvider}})});var Zi=S(Tt=>{"use strict";Object.defineProperty(Tt,"__esModule",{value:!0});Tt.RAW_IDS_ENV=Tt.ID_SALT_ENV=Tt.CONTENT_CAPTURE_ENV=void 0;Tt.isContentCaptureEnabled=_h;Tt.resetPrivacyAnnouncementsForTest=Cb;Tt.hashIdentity=$b;Tt.digestContent=yh;Tt.describeContent=Db;var mh=require("crypto");Tt.CONTENT_CAPTURE_ENV="AGENTHIPPO_EVIDENCE_CONTENT_CAPTURE";Tt.ID_SALT_ENV="AGENTHIPPO_EVIDENCE_ID_SALT";Tt.RAW_IDS_ENV="AGENTHIPPO_EVIDENCE_RAW_IDS";var Nb="agenthippo-evidence-unsalted",Rb=new Set(["1","true","yes","on"]);function Eh(t){return Rb.has((t??"").trim().toLowerCase())}var Fu=!1,Vu=!1;function _h(t=process.env){let e=Eh(t[Tt.CONTENT_CAPTURE_ENV]);return Fu||(Fu=!0,console.warn(e?`[evidence] CONTENT CAPTURE IS ON \u2014 prompts, completions and tool I/O are recorded in evidence (${Tt.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 ${Tt.CONTENT_CAPTURE_ENV}=1 to restore full previews.`)),e}function Cb(){Fu=!1,Vu=!1}function kb(t){let e=t[Tt.ID_SALT_ENV]?.trim();return e||(Vu||(Vu=!0,console.warn(`[evidence] ${Tt.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.`)),Nb)}function $b(t,e=process.env){let n=t?.trim();return n?Eh(e[Tt.RAW_IDS_ENV])?n:`anon_${(0,mh.createHash)("sha256").update(`${kb(e)}\0${n}`).digest("hex").slice(0,32)}`:void 0}function yh(t){return{sha256:(0,mh.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function Db(t,e,n=500,r=process.env){if(e===void 0)return{};let s=yh(e),i={[`${t}_sha256`]:s.sha256,[`${t}_length`]:s.length};return _h(r)&&(i[`${t}Preview`]=e.slice(0,n)),i}});var za=S(Te=>{"use strict";Object.defineProperty(Te,"__esModule",{value:!0});Te.ANTHROPIC_SETUP_TOKEN_PREFIX=Te.PROVIDERS=void 0;Te.getProvider=Lb;Te.requiresApiKey=Mb;Te.isLocalProvider=Gb;Te.getAllProviderIds=Ub;Te.getCloudProviders=Hb;Te.getLocalProviders=jb;Te.getApiKeyProviders=xb;Te.requiresBaseUrl=Bb;Te.getGatewayProviders=Fb;Te.isGatewayProvider=Vb;Te.isAnthropicProviderFamily=Wb;Te.normalizeAnthropicSetupToken=Kb;Te.isAnthropicSetupToken=qb;Te.providerNotSupportAnthropicApi=Yb;Te.PROVIDERS={openai:{id:"openai",displayName:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",requiresApiKey:!0,showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},"openai-codex":{id:"openai-codex",displayName:"OpenAI (ChatGPT subscription)",defaultEndpoint:"https://chatgpt.com/backend-api/codex",requiresApiKey:!0,description:"Use your ChatGPT/Codex subscription via native OAuth",showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},anthropic:{id:"anthropic",displayName:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},showInAddApiKeyUI:!0},"anthropic-setup-token":{id:"anthropic-setup-token",displayName:"Anthropic (Claude Subscription)",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},description:'Use Claude subscription setup-token from "claude setup-token"',showInAddApiKeyUI:!0},openrouter:{id:"openrouter",displayName:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",requiresApiKey:!0,description:"Fast model proxy via openrouter.ai that works with all agents",showInAddApiKeyUI:!0,isGateway:!0},litellm:{id:"litellm",displayName:"LiteLLM",endpointSettingKey:"agentide.providers.litellm.baseUrl",requiresApiKey:!0,description:"local adapter for agents to work with Spotlight and all models from OpenAI, Anthropic, Ollama etc.",showInAddApiKeyUI:!0,isGateway:!0,deferMissingApiKey:!0},ollama:{id:"ollama",displayName:"Ollama",defaultEndpoint:"http://localhost:11434/v1",requiresApiKey:!1,enabledSettingKey:"agentide.local.ollama.enabled",defaultEnabled:!0,placeholderApiKey:"ollama",description:"Local LLM server",showInAddApiKeyUI:!1,notSupportAnthropicApi:!0},agenthippo:{id:"agenthippo",displayName:"AgentHippo Gateway",defaultEndpoint:"https://gateway.agenthippo.ai/v1",endpointSettingKey:"agentide.AgentHippoModelGateway.url",requiresApiKey:!0,description:"AgentHippo managed gateway \u2014 uses account JWT, picks model automatically",showInAddApiKeyUI:!1,isGateway:!0,staticHeaders:{"x-agenthippo-source":"chat-ui"},credentialRefreshCommand:"agentide.auth.refreshToken",deferMissingApiKey:!0}};function Lb(t){return Te.PROVIDERS[t]}function Mb(t){return Te.PROVIDERS[t]?.requiresApiKey??!0}function Gb(t){let e=Te.PROVIDERS[t];return e?!e.requiresApiKey:!1}function Ub(){return Object.keys(Te.PROVIDERS)}function Hb(){return Object.values(Te.PROVIDERS).filter(t=>t.requiresApiKey)}function jb(){return Object.values(Te.PROVIDERS).filter(t=>!t.requiresApiKey)}function xb(){return Object.values(Te.PROVIDERS).filter(t=>t.showInAddApiKeyUI===!0)}function Bb(t){let e=Te.PROVIDERS[t];return e?!!e.endpointSettingKey&&!e.defaultEndpoint:!1}function Fb(){return Object.values(Te.PROVIDERS).filter(t=>t.isGateway)}function Vb(t){return Te.PROVIDERS[t]?.isGateway??!1}function Wb(t){return t==="anthropic"||t==="anthropic-setup-token"}Te.ANTHROPIC_SETUP_TOKEN_PREFIX="sk-ant-oat01-";function Kb(t){return t.replace(/\s+/g,"").trim()}function qb(t){return typeof t=="string"&&t.trim().startsWith(Te.ANTHROPIC_SETUP_TOKEN_PREFIX)}function Yb(t,e){let n=Te.PROVIDERS[t];return n?n.notSupportAnthropicApi??!1:e?.[t]?.notSupportAnthropicApi===!0}});var Qa=S(je=>{"use strict";Object.defineProperty(je,"__esModule",{value:!0});je.REGISTRY_KEY_SEPARATOR=je.BUILTIN_MODELS=void 0;je.getRegistryKey=wh;je.parseRegistryKey=Jb;je.isCompositeKey=Xb;je.getModel=zb;je.getModelByRegistryKey=Qb;je.getModelsForProvider=Zb;je.getRecommendedModels=ev;je.getModelsWithCapability=tv;je.getActiveModels=nv;je.resolveModelAlias=rv;je.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}];je.REGISTRY_KEY_SEPARATOR="::";function wh(t,e){return`${t}${je.REGISTRY_KEY_SEPARATOR}${e}`}function Jb(t){let e=t.indexOf(je.REGISTRY_KEY_SEPARATOR);if(e!==-1)return{providerId:t.substring(0,e),modelId:t.substring(e+je.REGISTRY_KEY_SEPARATOR.length)}}function Xb(t){return t.includes(je.REGISTRY_KEY_SEPARATOR)}function zb(t){return je.BUILTIN_MODELS.find(e=>e.id===t)}function Qb(t){return je.BUILTIN_MODELS.find(e=>wh(e.provider,e.id)===t)}function Zb(t){return je.BUILTIN_MODELS.filter(e=>e.provider===t)}function ev(){return je.BUILTIN_MODELS.filter(t=>t.recommended===!0)}function tv(t){return je.BUILTIN_MODELS.filter(e=>e.capabilities.includes(t))}function nv(){return je.BUILTIN_MODELS.filter(t=>!t.deprecated)}function rv(t){if(!t)return t;let e=t.toLowerCase().trim();return je.BUILTIN_MODELS.find(r=>r.id.toLowerCase()===e)?.id??t}});var Wu=S(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.AGENT_ENGINES=void 0;ft.getAgentEngine=sv;ft.getAllAgentEngines=iv;ft.getAllAgentEngineIds=ov;ft.getCompatibleProviders=av;ft.getEnginesCompatibleWithProvider=cv;ft.isEngineCompatibleWithProvider=lv;ft.getEngineRulesFile=uv;ft.getEngineWorkspaceDir=dv;var gs=za();ft.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 sv(t){return ft.AGENT_ENGINES[t]}function iv(){return Object.values(ft.AGENT_ENGINES)}function ov(){return Object.keys(ft.AGENT_ENGINES)}function av(t){let e=ft.AGENT_ENGINES[t];if(!e)return[];let n=[e.nativeProvider];for(let[r,s]of Object.entries(gs.PROVIDERS))if(!n.includes(r)){if(s.isGateway){n.push(r);continue}e.nativeProvider==="openai"&&!(0,gs.isAnthropicProviderFamily)(r)&&n.push(r),e.nativeProvider==="anthropic"&&(0,gs.isAnthropicProviderFamily)(r)&&n.push(r)}return n}function cv(t){let e=gs.PROVIDERS[t];return e?e.isGateway?Object.values(ft.AGENT_ENGINES):Object.values(ft.AGENT_ENGINES).filter(n=>!!(n.nativeProvider===t||n.nativeProvider==="openai"&&!(0,gs.isAnthropicProviderFamily)(t)||n.nativeProvider==="anthropic"&&(0,gs.isAnthropicProviderFamily)(t))):[]}function lv(t,e){let n=ft.AGENT_ENGINES[t];return n?!!(n.nativeProvider===e||(0,gs.isGatewayProvider)(e)||n.nativeProvider==="openai"&&!(0,gs.isAnthropicProviderFamily)(e)||n.nativeProvider==="anthropic"&&(0,gs.isAnthropicProviderFamily)(e)):!1}function uv(t){return ft.AGENT_ENGINES[t]?.rulesFile}function dv(t){return ft.AGENT_ENGINES[t]?.workspaceDir}});var tc=S(x=>{"use strict";Object.defineProperty(x,"__esModule",{value:!0});x.getEngineWorkspaceDir=x.getEngineRulesFile=x.isEngineCompatibleWithProvider=x.getEnginesCompatibleWithProvider=x.getCompatibleProviders=x.getAllAgentEngineIds=x.getAllAgentEngines=x.getAgentEngine=x.AGENT_ENGINES=x.getActiveModels=x.getModelsWithCapability=x.getRecommendedModels=x.getModelsForProvider=x.getModel=x.getModelByRegistryKey=x.isCompositeKey=x.parseRegistryKey=x.getRegistryKey=x.REGISTRY_KEY_SEPARATOR=x.BUILTIN_MODELS=x.providerNotSupportAnthropicApi=x.isAnthropicSetupToken=x.normalizeAnthropicSetupToken=x.ANTHROPIC_SETUP_TOKEN_PREFIX=x.isAnthropicProviderFamily=x.requiresBaseUrl=x.getApiKeyProviders=x.getLocalProviders=x.getCloudProviders=x.getAllProviderIds=x.isLocalProvider=x.requiresApiKey=x.getProvider=x.PROVIDERS=void 0;x.getProviderForModel=pv;x.getEngineForModel=gv;x.getModelsForEngine=hv;x.isModelFromProvider=mv;var mn=za();Object.defineProperty(x,"PROVIDERS",{enumerable:!0,get:function(){return mn.PROVIDERS}});Object.defineProperty(x,"getProvider",{enumerable:!0,get:function(){return mn.getProvider}});Object.defineProperty(x,"requiresApiKey",{enumerable:!0,get:function(){return mn.requiresApiKey}});Object.defineProperty(x,"isLocalProvider",{enumerable:!0,get:function(){return mn.isLocalProvider}});Object.defineProperty(x,"getAllProviderIds",{enumerable:!0,get:function(){return mn.getAllProviderIds}});Object.defineProperty(x,"getCloudProviders",{enumerable:!0,get:function(){return mn.getCloudProviders}});Object.defineProperty(x,"getLocalProviders",{enumerable:!0,get:function(){return mn.getLocalProviders}});Object.defineProperty(x,"getApiKeyProviders",{enumerable:!0,get:function(){return mn.getApiKeyProviders}});Object.defineProperty(x,"requiresBaseUrl",{enumerable:!0,get:function(){return mn.requiresBaseUrl}});Object.defineProperty(x,"isAnthropicProviderFamily",{enumerable:!0,get:function(){return mn.isAnthropicProviderFamily}});Object.defineProperty(x,"ANTHROPIC_SETUP_TOKEN_PREFIX",{enumerable:!0,get:function(){return mn.ANTHROPIC_SETUP_TOKEN_PREFIX}});Object.defineProperty(x,"normalizeAnthropicSetupToken",{enumerable:!0,get:function(){return mn.normalizeAnthropicSetupToken}});Object.defineProperty(x,"isAnthropicSetupToken",{enumerable:!0,get:function(){return mn.isAnthropicSetupToken}});Object.defineProperty(x,"providerNotSupportAnthropicApi",{enumerable:!0,get:function(){return mn.providerNotSupportAnthropicApi}});var _r=Qa();Object.defineProperty(x,"BUILTIN_MODELS",{enumerable:!0,get:function(){return _r.BUILTIN_MODELS}});Object.defineProperty(x,"REGISTRY_KEY_SEPARATOR",{enumerable:!0,get:function(){return _r.REGISTRY_KEY_SEPARATOR}});Object.defineProperty(x,"getRegistryKey",{enumerable:!0,get:function(){return _r.getRegistryKey}});Object.defineProperty(x,"parseRegistryKey",{enumerable:!0,get:function(){return _r.parseRegistryKey}});Object.defineProperty(x,"isCompositeKey",{enumerable:!0,get:function(){return _r.isCompositeKey}});Object.defineProperty(x,"getModelByRegistryKey",{enumerable:!0,get:function(){return _r.getModelByRegistryKey}});Object.defineProperty(x,"getModel",{enumerable:!0,get:function(){return _r.getModel}});Object.defineProperty(x,"getModelsForProvider",{enumerable:!0,get:function(){return _r.getModelsForProvider}});Object.defineProperty(x,"getRecommendedModels",{enumerable:!0,get:function(){return _r.getRecommendedModels}});Object.defineProperty(x,"getModelsWithCapability",{enumerable:!0,get:function(){return _r.getModelsWithCapability}});Object.defineProperty(x,"getActiveModels",{enumerable:!0,get:function(){return _r.getActiveModels}});var hs=Wu();Object.defineProperty(x,"AGENT_ENGINES",{enumerable:!0,get:function(){return hs.AGENT_ENGINES}});Object.defineProperty(x,"getAgentEngine",{enumerable:!0,get:function(){return hs.getAgentEngine}});Object.defineProperty(x,"getAllAgentEngines",{enumerable:!0,get:function(){return hs.getAllAgentEngines}});Object.defineProperty(x,"getAllAgentEngineIds",{enumerable:!0,get:function(){return hs.getAllAgentEngineIds}});Object.defineProperty(x,"getCompatibleProviders",{enumerable:!0,get:function(){return hs.getCompatibleProviders}});Object.defineProperty(x,"getEnginesCompatibleWithProvider",{enumerable:!0,get:function(){return hs.getEnginesCompatibleWithProvider}});Object.defineProperty(x,"isEngineCompatibleWithProvider",{enumerable:!0,get:function(){return hs.isEngineCompatibleWithProvider}});Object.defineProperty(x,"getEngineRulesFile",{enumerable:!0,get:function(){return hs.getEngineRulesFile}});Object.defineProperty(x,"getEngineWorkspaceDir",{enumerable:!0,get:function(){return hs.getEngineWorkspaceDir}});var fv=za(),ec=Qa(),Za=Wu();function pv(t){let e=ec.BUILTIN_MODELS.find(n=>n.id===t);return e?fv.PROVIDERS[e.provider]:void 0}function gv(t){let e=ec.BUILTIN_MODELS.find(n=>n.id===t);if(e)return Object.values(Za.AGENT_ENGINES).find(n=>(0,Za.isEngineCompatibleWithProvider)(n.id,e.provider))}function hv(t){let e=Za.AGENT_ENGINES[t];return e?ec.BUILTIN_MODELS.filter(n=>(0,Za.isEngineCompatibleWithProvider)(e.id,n.provider)):[]}function mv(t,e){return ec.BUILTIN_MODELS.find(r=>r.id===t)?.provider===e}});var ac=S(Jn=>{"use strict";var Ev=Jn&&Jn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),_v=Jn&&Jn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sh=Jn&&Jn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Ev(n,e,r[s]);return _v(n,e),n}})();Object.defineProperty(Jn,"__esModule",{value:!0});Jn.getDefaultCustomEnginesInstallRoot=oc;Jn.installCustomEngineFromFiles=Rv;Jn.listInstalledCustomEngines=Cv;Jn.uninstallCustomEngine=kv;var yv=require("child_process"),pt=require("fs"),wv=Sh(require("os")),ke=Sh(require("path")),Sv=require("util"),Av=et(),ic=on(),Tv=(0,Sv.promisify)(yv.execFile),Nn="engine.manifest.json";function oc(){return ke.join(process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME||ke.join(wv.homedir(),Av.AGENTIDE_DIR_NAME),"engines")}function Ah(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 nc(t,e){try{return Ah(t).replace(/\//g,ke.sep)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`${e}: ${r}`)}}function pi(t,e,n){let r=ke.resolve(t),s=ke.resolve(e),i=ke.relative(r,s);if(i&&(i.startsWith("..")||ke.isAbsolute(i)))throw new Error(`${n} must stay inside ${t}: ${e}`)}async function rc(t){try{return await pt.promises.access(t),!0}catch{return!1}}function Ku(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 sc(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 Th(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 bv(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=sc(n,"dir",`${e} workspaceSync`),s=sc(n,"rulesFile",`${e} workspaceSync`);nc(r,"workspaceSync.dir"),nc(s,"workspaceSync.rulesFile")}async function vv(t){let e=ke.join(t,Nn),n;try{n=await pt.promises.readFile(e,"utf8")}catch{throw new Error(`Custom engine package is missing ${Nn}`)}let r=Ku(n,Nn),s=sc(r,"id",Nn),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:sc(r,"entry",Nn),workspaceSync:r.workspaceSync};if(i.version!==2)throw new Error(`${Nn} must declare version 2`);if(i.id!==i.id.toLowerCase()||!/^[a-z0-9][a-z0-9._-]*$/.test(i.id))throw new Error(`${Nn} id must contain only lowercase letters, numbers, ".", "_", or "-"`);bv(i.workspaceSync,Nn);let o=nc(i.entry,"entry"),a=ke.join(t,o);if(pi(t,a,"Engine entry"),!await rc(a))throw new Error(`${Nn} entry not found: ${i.entry}`);return i}async function Ov(t,e){let n=new Set;for(let r of e){let s=Ah(r.path);if(n.has(s))throw new Error(`Duplicate engine package path: ${r.path}`);n.add(s);let i=ke.join(t,...s.split("/"));pi(t,i,"Engine package file"),await pt.promises.mkdir(ke.dirname(i),{recursive:!0}),await pt.promises.writeFile(i,r.content)}}async function bh(t,e,n){try{await Tv(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 Iv(t,e,n){let r=ke.join(t,"package.json");if(!await rc(r))return!1;let s=ke.join(t,"package-lock.json");if(!await rc(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,ic.logInfo)(n,"[Store] Running npm ci --omit=dev for custom engine"),await bh(i,["ci","--omit=dev"],t),!0}async function Pv(t,e,n){let r=nc(e.entry,"entry"),s=ke.join(t,r);return n&&(0,ic.logInfo)(n,`[Store] Validating custom engine entry: ${e.entry}`),await bh("node",["--check",s],t),s}async function Nv(t,e,n,r){await pt.promises.mkdir(e,{recursive:!0});let s=ke.join(e,n);pi(e,s,"Custom engine install target");let i=await rc(s);if(i&&!r)throw new Error(`Custom engine "${n}" already exists at ${s}`);if(!i)return await pt.promises.rename(t,s),s;let o=ke.join(e,".tmp");await pt.promises.mkdir(o,{recursive:!0});let a=ke.join(o,`${n}.previous-${Date.now()}`);pi(e,a,"Custom engine backup target"),await pt.promises.rm(a,{recursive:!0,force:!0}),await pt.promises.rename(s,a);try{return await pt.promises.rename(t,s),await pt.promises.rm(a,{recursive:!0,force:!0}),s}catch(c){throw await pt.promises.rm(s,{recursive:!0,force:!0}).catch(()=>{}),await pt.promises.rename(a,s).catch(()=>{}),c}}async function Rv(t,e={}){if(t.length===0)throw new Error("Custom engine package is empty");let n=ke.resolve(e.installRoot??oc()),r=e.runNpmCi!==!1,s=e.overwrite!==!1,i=ke.join(n,".tmp");await pt.promises.mkdir(i,{recursive:!0});let o=await pt.promises.mkdtemp(ke.join(i,`${e.slug||"engine"}-`));pi(i,o,"Custom engine staging directory");let a=!0;try{await Ov(o,t);let c=await vv(o),l=await Iv(o,r,e.logger),d=await Pv(o,c,e.logger),u=await Nv(o,n,c.id,s);a=!1;let f=ke.join(u,ke.relative(o,d)),p={id:c.id,displayName:c.displayName||c.id,version:c.version,manifestPath:ke.join(u,Nn),installDir:u,entryPath:f,npmInstalled:l};if(e.logger){let g=e.sourceUrl?` from ${e.sourceUrl}`:"";(0,ic.logInfo)(e.logger,`[Store] Installed custom engine ${p.id}${g} to ${u}`)}return p}finally{a&&await pt.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}async function Cv(t={}){let e=ke.resolve(t.installRoot??oc()),n;try{n=await pt.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let s of n){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=ke.join(e,s.name);pi(e,i,"Custom engine install target");let o=ke.join(i,Nn),a=s.name,c=s.name;try{let l=Ku(await pt.promises.readFile(o,"utf8"),o);typeof l.id=="string"&&l.id.trim()&&(a=Th(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 kv(t,e={}){let n=Th(t),r=ke.resolve(e.installRoot??oc()),s=ke.join(r,n);pi(r,s,"Custom engine uninstall target");let i;try{let o=await pt.promises.lstat(s);if(!o.isDirectory()||o.isSymbolicLink())throw new Error(`Custom engine install target is not a normal directory: ${s}`);try{let a=Ku(await pt.promises.readFile(ke.join(s,Nn),"utf8"),Nn);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 pt.promises.rm(s,{recursive:!0,force:!0}),e.logger&&(0,ic.logInfo)(e.logger,`[Store] Uninstalled custom engine ${n} from ${s}`),{id:n,displayName:i,installDir:s,removed:!0}}});var Bs=S(Cn=>{"use strict";var $v=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]})),Dv=Cn&&Cn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qu=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"&&$v(n,e,r[s]);return Dv(n,e),n}})();Object.defineProperty(Cn,"__esModule",{value:!0});Cn.parseCustomEngineSearchPath=uc;Cn.getCustomEngineSearchRoots=Ph;Cn.discoverCustomEngineManifests=Nh;Cn.resolveCustomEngineManifest=Rh;Cn.tryResolveCustomEngineManifest=Bv;var cc=qu(require("fs")),Lv=qu(require("os")),yr=qu(require("path")),lc=et(),Mv=ac(),vh="engines",Oh="engine.manifest.json";function Ih(t){return t.trim().toLowerCase()}function Rn(t){return typeof t=="string"&&t.trim().length>0}function uc(t){return Array.isArray(t)?t.flatMap(e=>uc(e)):t?.trim()?t.split(yr.delimiter).map(e=>e.trim()).filter(Boolean):[]}function Gv(t){let e=new Set,n=[];for(let r of t){let s=yr.resolve(r);e.has(s)||(e.add(s),n.push(s))}return n}function Uv(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid model config in ${e}: expected object`);let n=t;if(!Rn(n.defaultModel))throw new Error(`Invalid model config in ${e}: "defaultModel" is required`);return{defaultModel:n.defaultModel.trim(),apiKeyEnvVar:Rn(n.apiKeyEnvVar)?n.apiKeyEnvVar.trim():void 0,baseUrlEnvVar:Rn(n.baseUrlEnvVar)?n.baseUrlEnvVar.trim():void 0,openaiBaseUrlEnvVar:Rn(n.openaiBaseUrlEnvVar)?n.openaiBaseUrlEnvVar.trim():void 0}}function Hv(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=Rn(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 jv(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(!Rn(n.dir))throw new Error(`Invalid workspaceSync config in ${e}: "dir" is required when enabled`);if(!Rn(n.rulesFile))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" is required when enabled`);let s=n.dir.trim();if(yr.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(yr.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 xv(t,e){let n=cc.readFileSync(t,"utf8"),r=JSON.parse(n);if(!Rn(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(!Rn(r.entry))throw new Error(`Invalid custom engine manifest ${t}: "entry" is required`);let s=Ih(r.id),i=yr.dirname(t),o=r.entry.trim(),a=yr.isAbsolute(o)?o:yr.resolve(i,o);return{version:2,id:s,displayName:Rn(r.displayName)?r.displayName.trim():void 0,description:Rn(r.description)?r.description.trim():void 0,entry:o,entryPath:a,engineExport:Rn(r.engineExport)?r.engineExport.trim():void 0,homeEnvVar:Rn(r.homeEnvVar)?r.homeEnvVar.trim():void 0,workspaceSync:jv(r.workspaceSync,t),promptInjection:Hv(r.promptInjection,t),model:Uv(r.model,t),manifestPath:t,manifestDir:i,searchRoot:e}}function Ph(t,e){let n=t?yr.resolve(t):void 0,r=uc(e),s=uc(process.env.AGENTHIPPO_CUSTOM_ENGINES_DIR??process.env.AGENTIDE_CUSTOM_ENGINES_DIR);return Gv([...n?[yr.join(n,lc.AGENTIDE_DIR_NAME,vh)]:[],...r,...s,(0,Mv.getDefaultCustomEnginesInstallRoot)(),yr.join(Lv.homedir(),lc.AGENTIDE_DIR_NAME,vh)])}function Nh(t,e,n){let r=[],s=new Set;for(let i of Ph(t,e)){if(!cc.existsSync(i))continue;let o;try{o=cc.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory())continue;let c=yr.join(i,a.name,Oh);if(!cc.existsSync(c))continue;let l;try{l=xv(c,i)}catch(d){n?.(c,d);continue}s.has(l.id)||(s.add(l.id),r.push(l))}}return r}function Rh(t,e,n,r){let s=Nh(t,n,r),i=e?Ih(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 ${lc.AGENTIDE_DIR_NAME}/engines.`)}return o}if(s.length===0)throw new Error(`No custom engines found. Add ${Oh} under ${lc.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 Bv(t,e,n,r){try{return Rh(t,e,n,r)}catch{return}}});var on=S((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=tc(),branding_1=et(),customRegistry_1=Bs(),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,f)=>{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=f?path.join(f,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 w=await fs_1.promises.readlink(m),_=path.isAbsolute(w)?w:path.resolve(path.dirname(m),w);(await fs_1.promises.stat(_)).isDirectory()?(s.add(h),await o(_,h)):i.set(h,_)}catch(w){let _=getErrorCode(w);if(_==="ENOENT"||_==="ELOOP")continue;throw w}}};await o(t,"");let a=Array.from(s).sort((u,f)=>u.split(path.sep).length-f.split(path.sep).length);for(let u of a)await ensureRealDirectory(path.join(e,u));for(let[u,f]of i.entries())await symlinkOrCopyFile(f,path.join(e,u),n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0});let c=new Set(i.keys()),l=async(u,f)=>{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=f?path.join(f,g.name):g.name,w=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(w),{recursive:!0}),await fs_1.promises.copyFile(m,w),logInfo(n,`[AgentIDE] Copied new file to source: ${r}/${h}`.replace(/\\/g,"/")),i.set(h,w)}catch(_){logInfo(n,`[AgentIDE] Warning: failed to copy back ${h}: ${_ instanceof Error?_.message:String(_)}`)}}};await l(e,"");for(let[u,f]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(f,p,n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0}))}catch{}}let d=async(u,f)=>{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=f?path.join(f,g.name):g.name;g.isDirectory()?await d(m,h):g.isSymbolicLink()&&(c.has(h)||await fs_1.promises.rm(m,{force:!0}))}};await d(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 mb(t){let e=jr.join(t,Pu,oh);if(!await Va(e))return null;try{return await zi.promises.readFile(e,"utf-8")}catch{return null}}async function Eb(t){let e=jr.join(t,Pu);if(!await Va(e))return[];let n=[],r;try{r=await zi.promises.readdir(e,{withFileTypes:!0})}catch{return[]}for(let s of r){if(!s.isDirectory())continue;let i=s.name,o=await ah(i,e);if(!o)continue;let a=jr.join(e,i);n.push({name:o.name??i,label:o.label??i,description:o.description,command:o.command,args:Nu(o.args,a),env:Fa(o.env)})}return n}Je.AGENTHIPPO_MCP_SERVERS_ENV="AGENTHIPPO_MCP_SERVERS";function Ru(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 _b=/^[A-Za-z_][A-Za-z0-9_]*$/;function yb(t,e){let n=t.bearerTokenEnv;if(n&&!_b.test(n))return Ru(t,e);let r={...t.headers??{}};return n&&(r.Authorization=`Bearer \${${n}}`),Object.keys(r).length>0?r:void 0}function wb(t,e){let n={};for(let r of t){if(r.url){let s=Ru(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 Sb(t){if(Object.keys(t).length!==0)return JSON.stringify(t)}function Ab(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 Va(t){try{return await zi.promises.access(t),!0}catch{return!1}}});var Ka=S(Wa=>{"use strict";Object.defineProperty(Wa,"__esModule",{value:!0});Wa.ENGINE_EFFORTS=void 0;Wa.ENGINE_EFFORTS={codex:["minimal","low","medium","high","xhigh","max","ultra","persistent"],claude:["low","medium","high","xhigh","max"]}});var uh=S(Qi=>{"use strict";Object.defineProperty(Qi,"__esModule",{value:!0});Qi.NoOpLogger=Qi.ConsoleLogger=void 0;var Cu=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}`:""}`)}};Qi.ConsoleLogger=Cu;var ku=class{debug(e){}info(e){}warn(e){}error(e,n){}};Qi.NoOpLogger=ku});var dh=S(xs=>{"use strict";Object.defineProperty(xs,"__esModule",{value:!0});xs.CLIPermissionHandler=xs.AutoDenyPermissionHandler=xs.AutoApprovePermissionHandler=void 0;var $u=class{async requestPermission(e){return{behavior:"allow"}}};xs.AutoApprovePermissionHandler=$u;var Du=class{message;constructor(e="All tool requests are denied"){this.message=e}async requestPermission(e){return{behavior:"deny",message:this.message}}};xs.AutoDenyPermissionHandler=Du;var Lu=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"})})})}};xs.CLIPermissionHandler=Lu});var fh=S(qa=>{"use strict";Object.defineProperty(qa,"__esModule",{value:!0});qa.NoOpEditTracker=void 0;var Mu=class{appliesEdits=!1;async startTracking(e,n){}async stopTracking(e,n){}async applyEdit(e,n,r,s){}};qa.NoOpEditTracker=Mu});var ph=S(hn=>{"use strict";var Tb=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]})),bb=hn&&hn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),vb=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"&&Tb(n,e,r[s]);return bb(n,e),n}})();Object.defineProperty(hn,"__esModule",{value:!0});hn.DirectorySessionStore=hn.FileSessionStore=hn.MemorySessionStore=void 0;var sn=require("fs"),Ya=vb(require("path")),Ob=require("crypto"),Gu=class{store=new Map;get(e){return this.store.get(e)}async set(e,n){this.store.set(e,n)}clear(){this.store.clear()}};hn.MemorySessionStore=Gu;var Uu=class{store={};loaded=!1;filePath;constructor(e){this.filePath=e}async load(){if(!this.loaded){try{let e=await sn.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=Ya.dirname(this.filePath);await sn.promises.mkdir(e,{recursive:!0});let n=`${this.filePath}.tmp.${Date.now()}`,r=JSON.stringify(this.store,null,2);try{await sn.promises.writeFile(n,r,"utf-8"),await sn.promises.rename(n,this.filePath)}catch(s){try{await sn.promises.unlink(n)}catch{}throw s}}loadSync(){if(!this.loaded){try{let e=(0,sn.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}}};hn.FileSessionStore=Uu;var Hu=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 sn.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 sn.promises.unlink(Ya.join(this.dir,i))}catch{}this.files.delete(s),this.serialized.delete(s)}this.entries={...r}}fileNameFor(e){return(0,Ob.createHash)("sha256").update(e).digest("hex").slice(0,40)}async writeAtomic(e,n){let r=Ya.join(this.dir,e),s=`${r}.tmp.${process.pid}.${Date.now()}`;try{await sn.promises.writeFile(s,n,"utf-8"),await sn.promises.rename(s,r)}catch(i){try{await sn.promises.unlink(s)}catch{}throw i}}loadSync(){if(this.loaded)return;this.loaded=!0,this.migrateLegacySingleFileSync();let e;try{e=(0,sn.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,sn.readFileSync)(Ya.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,sn.readdirSync)(this.dir)}catch{e=!1}if(e)return;let n=`${this.dir}.json`,r;try{r=JSON.parse((0,sn.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}};hn.DirectorySessionStore=Hu});var gh=S(Ja=>{"use strict";Object.defineProperty(Ja,"__esModule",{value:!0});Ja.StaticConfigProvider=void 0;var ju=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}};Ja.StaticConfigProvider=ju});var Xa=S(ct=>{"use strict";Object.defineProperty(ct,"__esModule",{value:!0});ct.StaticConfigProvider=ct.DirectorySessionStore=ct.FileSessionStore=ct.MemorySessionStore=ct.NoOpEditTracker=ct.CLIPermissionHandler=ct.AutoDenyPermissionHandler=ct.AutoApprovePermissionHandler=ct.NoOpLogger=ct.ConsoleLogger=void 0;var hh=uh();Object.defineProperty(ct,"ConsoleLogger",{enumerable:!0,get:function(){return hh.ConsoleLogger}});Object.defineProperty(ct,"NoOpLogger",{enumerable:!0,get:function(){return hh.NoOpLogger}});var xu=dh();Object.defineProperty(ct,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return xu.AutoApprovePermissionHandler}});Object.defineProperty(ct,"AutoDenyPermissionHandler",{enumerable:!0,get:function(){return xu.AutoDenyPermissionHandler}});Object.defineProperty(ct,"CLIPermissionHandler",{enumerable:!0,get:function(){return xu.CLIPermissionHandler}});var Pb=fh();Object.defineProperty(ct,"NoOpEditTracker",{enumerable:!0,get:function(){return Pb.NoOpEditTracker}});var Bu=ph();Object.defineProperty(ct,"MemorySessionStore",{enumerable:!0,get:function(){return Bu.MemorySessionStore}});Object.defineProperty(ct,"FileSessionStore",{enumerable:!0,get:function(){return Bu.FileSessionStore}});Object.defineProperty(ct,"DirectorySessionStore",{enumerable:!0,get:function(){return Bu.DirectorySessionStore}});var Ib=gh();Object.defineProperty(ct,"StaticConfigProvider",{enumerable:!0,get:function(){return Ib.StaticConfigProvider}})});var Zi=S(Tt=>{"use strict";Object.defineProperty(Tt,"__esModule",{value:!0});Tt.RAW_IDS_ENV=Tt.ID_SALT_ENV=Tt.CONTENT_CAPTURE_ENV=void 0;Tt.isContentCaptureEnabled=_h;Tt.resetPrivacyAnnouncementsForTest=Cb;Tt.hashIdentity=$b;Tt.digestContent=yh;Tt.describeContent=Db;var mh=require("crypto");Tt.CONTENT_CAPTURE_ENV="AGENTHIPPO_EVIDENCE_CONTENT_CAPTURE";Tt.ID_SALT_ENV="AGENTHIPPO_EVIDENCE_ID_SALT";Tt.RAW_IDS_ENV="AGENTHIPPO_EVIDENCE_RAW_IDS";var Nb="agenthippo-evidence-unsalted",Rb=new Set(["1","true","yes","on"]);function Eh(t){return Rb.has((t??"").trim().toLowerCase())}var Fu=!1,Vu=!1;function _h(t=process.env){let e=Eh(t[Tt.CONTENT_CAPTURE_ENV]);return Fu||(Fu=!0,console.warn(e?`[evidence] CONTENT CAPTURE IS ON \u2014 prompts, completions and tool I/O are recorded in evidence (${Tt.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 ${Tt.CONTENT_CAPTURE_ENV}=1 to restore full previews.`)),e}function Cb(){Fu=!1,Vu=!1}function kb(t){let e=t[Tt.ID_SALT_ENV]?.trim();return e||(Vu||(Vu=!0,console.warn(`[evidence] ${Tt.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.`)),Nb)}function $b(t,e=process.env){let n=t?.trim();return n?Eh(e[Tt.RAW_IDS_ENV])?n:`anon_${(0,mh.createHash)("sha256").update(`${kb(e)}\0${n}`).digest("hex").slice(0,32)}`:void 0}function yh(t){return{sha256:(0,mh.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function Db(t,e,n=500,r=process.env){if(e===void 0)return{};let s=yh(e),i={[`${t}_sha256`]:s.sha256,[`${t}_length`]:s.length};return _h(r)&&(i[`${t}Preview`]=e.slice(0,n)),i}});var za=S(Te=>{"use strict";Object.defineProperty(Te,"__esModule",{value:!0});Te.ANTHROPIC_SETUP_TOKEN_PREFIX=Te.PROVIDERS=void 0;Te.getProvider=Lb;Te.requiresApiKey=Mb;Te.isLocalProvider=Gb;Te.getAllProviderIds=Ub;Te.getCloudProviders=Hb;Te.getLocalProviders=jb;Te.getApiKeyProviders=xb;Te.requiresBaseUrl=Bb;Te.getGatewayProviders=Fb;Te.isGatewayProvider=Vb;Te.isAnthropicProviderFamily=Wb;Te.normalizeAnthropicSetupToken=Kb;Te.isAnthropicSetupToken=qb;Te.providerNotSupportAnthropicApi=Yb;Te.PROVIDERS={openai:{id:"openai",displayName:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",requiresApiKey:!0,showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},"openai-codex":{id:"openai-codex",displayName:"OpenAI (ChatGPT subscription)",defaultEndpoint:"https://chatgpt.com/backend-api/codex",requiresApiKey:!0,description:"Use your ChatGPT/Codex subscription via native OAuth",showInAddApiKeyUI:!0,notSupportAnthropicApi:!0},anthropic:{id:"anthropic",displayName:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},showInAddApiKeyUI:!0},"anthropic-setup-token":{id:"anthropic-setup-token",displayName:"Anthropic (Claude Subscription)",defaultEndpoint:"https://api.anthropic.com/v1",endpointSettingKey:"agentide.providers.anthropic.baseUrl",requiresApiKey:!0,apiKeyHeader:"x-api-key",staticHeaders:{"anthropic-version":"2023-06-01"},headerSettingKeys:{"anthropic-version":"agentide.providers.anthropic.version"},description:'Use Claude subscription setup-token from "claude setup-token"',showInAddApiKeyUI:!0},openrouter:{id:"openrouter",displayName:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",requiresApiKey:!0,description:"Fast model proxy via openrouter.ai that works with all agents",showInAddApiKeyUI:!0,isGateway:!0},litellm:{id:"litellm",displayName:"LiteLLM",endpointSettingKey:"agentide.providers.litellm.baseUrl",requiresApiKey:!0,description:"local adapter for agents to work with Spotlight and all models from OpenAI, Anthropic, Ollama etc.",showInAddApiKeyUI:!0,isGateway:!0,deferMissingApiKey:!0},ollama:{id:"ollama",displayName:"Ollama",defaultEndpoint:"http://localhost:11434/v1",requiresApiKey:!1,enabledSettingKey:"agentide.local.ollama.enabled",defaultEnabled:!0,placeholderApiKey:"ollama",description:"Local LLM server",showInAddApiKeyUI:!1,notSupportAnthropicApi:!0},agenthippo:{id:"agenthippo",displayName:"AgentHippo Gateway",defaultEndpoint:"https://gateway.agenthippo.ai/v1",endpointSettingKey:"agentide.AgentHippoModelGateway.url",requiresApiKey:!0,description:"AgentHippo managed gateway \u2014 uses account JWT, picks model automatically",showInAddApiKeyUI:!1,isGateway:!0,staticHeaders:{"x-agenthippo-source":"chat-ui"},credentialRefreshCommand:"agentide.auth.refreshToken",deferMissingApiKey:!0}};function Lb(t){return Te.PROVIDERS[t]}function Mb(t){return Te.PROVIDERS[t]?.requiresApiKey??!0}function Gb(t){let e=Te.PROVIDERS[t];return e?!e.requiresApiKey:!1}function Ub(){return Object.keys(Te.PROVIDERS)}function Hb(){return Object.values(Te.PROVIDERS).filter(t=>t.requiresApiKey)}function jb(){return Object.values(Te.PROVIDERS).filter(t=>!t.requiresApiKey)}function xb(){return Object.values(Te.PROVIDERS).filter(t=>t.showInAddApiKeyUI===!0)}function Bb(t){let e=Te.PROVIDERS[t];return e?!!e.endpointSettingKey&&!e.defaultEndpoint:!1}function Fb(){return Object.values(Te.PROVIDERS).filter(t=>t.isGateway)}function Vb(t){return Te.PROVIDERS[t]?.isGateway??!1}function Wb(t){return t==="anthropic"||t==="anthropic-setup-token"}Te.ANTHROPIC_SETUP_TOKEN_PREFIX="sk-ant-oat01-";function Kb(t){return t.replace(/\s+/g,"").trim()}function qb(t){return typeof t=="string"&&t.trim().startsWith(Te.ANTHROPIC_SETUP_TOKEN_PREFIX)}function Yb(t,e){let n=Te.PROVIDERS[t];return n?n.notSupportAnthropicApi??!1:e?.[t]?.notSupportAnthropicApi===!0}});var Qa=S(je=>{"use strict";Object.defineProperty(je,"__esModule",{value:!0});je.REGISTRY_KEY_SEPARATOR=je.BUILTIN_MODELS=void 0;je.getRegistryKey=wh;je.parseRegistryKey=Jb;je.isCompositeKey=Xb;je.getModel=zb;je.getModelByRegistryKey=Qb;je.getModelsForProvider=Zb;je.getRecommendedModels=ev;je.getModelsWithCapability=tv;je.getActiveModels=nv;je.resolveModelAlias=rv;je.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}];je.REGISTRY_KEY_SEPARATOR="::";function wh(t,e){return`${t}${je.REGISTRY_KEY_SEPARATOR}${e}`}function Jb(t){let e=t.indexOf(je.REGISTRY_KEY_SEPARATOR);if(e!==-1)return{providerId:t.substring(0,e),modelId:t.substring(e+je.REGISTRY_KEY_SEPARATOR.length)}}function Xb(t){return t.includes(je.REGISTRY_KEY_SEPARATOR)}function zb(t){return je.BUILTIN_MODELS.find(e=>e.id===t)}function Qb(t){return je.BUILTIN_MODELS.find(e=>wh(e.provider,e.id)===t)}function Zb(t){return je.BUILTIN_MODELS.filter(e=>e.provider===t)}function ev(){return je.BUILTIN_MODELS.filter(t=>t.recommended===!0)}function tv(t){return je.BUILTIN_MODELS.filter(e=>e.capabilities.includes(t))}function nv(){return je.BUILTIN_MODELS.filter(t=>!t.deprecated)}function rv(t){if(!t)return t;let e=t.toLowerCase().trim();return je.BUILTIN_MODELS.find(r=>r.id.toLowerCase()===e)?.id??t}});var Wu=S(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.AGENT_ENGINES=void 0;ft.getAgentEngine=sv;ft.getAllAgentEngines=iv;ft.getAllAgentEngineIds=ov;ft.getCompatibleProviders=av;ft.getEnginesCompatibleWithProvider=cv;ft.isEngineCompatibleWithProvider=lv;ft.getEngineRulesFile=uv;ft.getEngineWorkspaceDir=dv;var gs=za();ft.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 sv(t){return ft.AGENT_ENGINES[t]}function iv(){return Object.values(ft.AGENT_ENGINES)}function ov(){return Object.keys(ft.AGENT_ENGINES)}function av(t){let e=ft.AGENT_ENGINES[t];if(!e)return[];let n=[e.nativeProvider];for(let[r,s]of Object.entries(gs.PROVIDERS))if(!n.includes(r)){if(s.isGateway){n.push(r);continue}e.nativeProvider==="openai"&&!(0,gs.isAnthropicProviderFamily)(r)&&n.push(r),e.nativeProvider==="anthropic"&&(0,gs.isAnthropicProviderFamily)(r)&&n.push(r)}return n}function cv(t){let e=gs.PROVIDERS[t];return e?e.isGateway?Object.values(ft.AGENT_ENGINES):Object.values(ft.AGENT_ENGINES).filter(n=>!!(n.nativeProvider===t||n.nativeProvider==="openai"&&!(0,gs.isAnthropicProviderFamily)(t)||n.nativeProvider==="anthropic"&&(0,gs.isAnthropicProviderFamily)(t))):[]}function lv(t,e){let n=ft.AGENT_ENGINES[t];return n?!!(n.nativeProvider===e||(0,gs.isGatewayProvider)(e)||n.nativeProvider==="openai"&&!(0,gs.isAnthropicProviderFamily)(e)||n.nativeProvider==="anthropic"&&(0,gs.isAnthropicProviderFamily)(e)):!1}function uv(t){return ft.AGENT_ENGINES[t]?.rulesFile}function dv(t){return ft.AGENT_ENGINES[t]?.workspaceDir}});var tc=S(x=>{"use strict";Object.defineProperty(x,"__esModule",{value:!0});x.getEngineWorkspaceDir=x.getEngineRulesFile=x.isEngineCompatibleWithProvider=x.getEnginesCompatibleWithProvider=x.getCompatibleProviders=x.getAllAgentEngineIds=x.getAllAgentEngines=x.getAgentEngine=x.AGENT_ENGINES=x.getActiveModels=x.getModelsWithCapability=x.getRecommendedModels=x.getModelsForProvider=x.getModel=x.getModelByRegistryKey=x.isCompositeKey=x.parseRegistryKey=x.getRegistryKey=x.REGISTRY_KEY_SEPARATOR=x.BUILTIN_MODELS=x.providerNotSupportAnthropicApi=x.isAnthropicSetupToken=x.normalizeAnthropicSetupToken=x.ANTHROPIC_SETUP_TOKEN_PREFIX=x.isAnthropicProviderFamily=x.requiresBaseUrl=x.getApiKeyProviders=x.getLocalProviders=x.getCloudProviders=x.getAllProviderIds=x.isLocalProvider=x.requiresApiKey=x.getProvider=x.PROVIDERS=void 0;x.getProviderForModel=pv;x.getEngineForModel=gv;x.getModelsForEngine=hv;x.isModelFromProvider=mv;var mn=za();Object.defineProperty(x,"PROVIDERS",{enumerable:!0,get:function(){return mn.PROVIDERS}});Object.defineProperty(x,"getProvider",{enumerable:!0,get:function(){return mn.getProvider}});Object.defineProperty(x,"requiresApiKey",{enumerable:!0,get:function(){return mn.requiresApiKey}});Object.defineProperty(x,"isLocalProvider",{enumerable:!0,get:function(){return mn.isLocalProvider}});Object.defineProperty(x,"getAllProviderIds",{enumerable:!0,get:function(){return mn.getAllProviderIds}});Object.defineProperty(x,"getCloudProviders",{enumerable:!0,get:function(){return mn.getCloudProviders}});Object.defineProperty(x,"getLocalProviders",{enumerable:!0,get:function(){return mn.getLocalProviders}});Object.defineProperty(x,"getApiKeyProviders",{enumerable:!0,get:function(){return mn.getApiKeyProviders}});Object.defineProperty(x,"requiresBaseUrl",{enumerable:!0,get:function(){return mn.requiresBaseUrl}});Object.defineProperty(x,"isAnthropicProviderFamily",{enumerable:!0,get:function(){return mn.isAnthropicProviderFamily}});Object.defineProperty(x,"ANTHROPIC_SETUP_TOKEN_PREFIX",{enumerable:!0,get:function(){return mn.ANTHROPIC_SETUP_TOKEN_PREFIX}});Object.defineProperty(x,"normalizeAnthropicSetupToken",{enumerable:!0,get:function(){return mn.normalizeAnthropicSetupToken}});Object.defineProperty(x,"isAnthropicSetupToken",{enumerable:!0,get:function(){return mn.isAnthropicSetupToken}});Object.defineProperty(x,"providerNotSupportAnthropicApi",{enumerable:!0,get:function(){return mn.providerNotSupportAnthropicApi}});var _r=Qa();Object.defineProperty(x,"BUILTIN_MODELS",{enumerable:!0,get:function(){return _r.BUILTIN_MODELS}});Object.defineProperty(x,"REGISTRY_KEY_SEPARATOR",{enumerable:!0,get:function(){return _r.REGISTRY_KEY_SEPARATOR}});Object.defineProperty(x,"getRegistryKey",{enumerable:!0,get:function(){return _r.getRegistryKey}});Object.defineProperty(x,"parseRegistryKey",{enumerable:!0,get:function(){return _r.parseRegistryKey}});Object.defineProperty(x,"isCompositeKey",{enumerable:!0,get:function(){return _r.isCompositeKey}});Object.defineProperty(x,"getModelByRegistryKey",{enumerable:!0,get:function(){return _r.getModelByRegistryKey}});Object.defineProperty(x,"getModel",{enumerable:!0,get:function(){return _r.getModel}});Object.defineProperty(x,"getModelsForProvider",{enumerable:!0,get:function(){return _r.getModelsForProvider}});Object.defineProperty(x,"getRecommendedModels",{enumerable:!0,get:function(){return _r.getRecommendedModels}});Object.defineProperty(x,"getModelsWithCapability",{enumerable:!0,get:function(){return _r.getModelsWithCapability}});Object.defineProperty(x,"getActiveModels",{enumerable:!0,get:function(){return _r.getActiveModels}});var hs=Wu();Object.defineProperty(x,"AGENT_ENGINES",{enumerable:!0,get:function(){return hs.AGENT_ENGINES}});Object.defineProperty(x,"getAgentEngine",{enumerable:!0,get:function(){return hs.getAgentEngine}});Object.defineProperty(x,"getAllAgentEngines",{enumerable:!0,get:function(){return hs.getAllAgentEngines}});Object.defineProperty(x,"getAllAgentEngineIds",{enumerable:!0,get:function(){return hs.getAllAgentEngineIds}});Object.defineProperty(x,"getCompatibleProviders",{enumerable:!0,get:function(){return hs.getCompatibleProviders}});Object.defineProperty(x,"getEnginesCompatibleWithProvider",{enumerable:!0,get:function(){return hs.getEnginesCompatibleWithProvider}});Object.defineProperty(x,"isEngineCompatibleWithProvider",{enumerable:!0,get:function(){return hs.isEngineCompatibleWithProvider}});Object.defineProperty(x,"getEngineRulesFile",{enumerable:!0,get:function(){return hs.getEngineRulesFile}});Object.defineProperty(x,"getEngineWorkspaceDir",{enumerable:!0,get:function(){return hs.getEngineWorkspaceDir}});var fv=za(),ec=Qa(),Za=Wu();function pv(t){let e=ec.BUILTIN_MODELS.find(n=>n.id===t);return e?fv.PROVIDERS[e.provider]:void 0}function gv(t){let e=ec.BUILTIN_MODELS.find(n=>n.id===t);if(e)return Object.values(Za.AGENT_ENGINES).find(n=>(0,Za.isEngineCompatibleWithProvider)(n.id,e.provider))}function hv(t){let e=Za.AGENT_ENGINES[t];return e?ec.BUILTIN_MODELS.filter(n=>(0,Za.isEngineCompatibleWithProvider)(e.id,n.provider)):[]}function mv(t,e){return ec.BUILTIN_MODELS.find(r=>r.id===t)?.provider===e}});var ac=S(Jn=>{"use strict";var Ev=Jn&&Jn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),_v=Jn&&Jn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sh=Jn&&Jn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Ev(n,e,r[s]);return _v(n,e),n}})();Object.defineProperty(Jn,"__esModule",{value:!0});Jn.getDefaultCustomEnginesInstallRoot=oc;Jn.installCustomEngineFromFiles=Rv;Jn.listInstalledCustomEngines=Cv;Jn.uninstallCustomEngine=kv;var yv=require("child_process"),pt=require("fs"),wv=Sh(require("os")),ke=Sh(require("path")),Sv=require("util"),Av=et(),ic=on(),Tv=(0,Sv.promisify)(yv.execFile),Nn="engine.manifest.json";function oc(){return ke.join(process.env.AGENT_HOME_DIR||process.env.AGENTHIPPO_HOME||ke.join(wv.homedir(),Av.AGENTIDE_DIR_NAME),"engines")}function Ah(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 nc(t,e){try{return Ah(t).replace(/\//g,ke.sep)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`${e}: ${r}`)}}function pi(t,e,n){let r=ke.resolve(t),s=ke.resolve(e),i=ke.relative(r,s);if(i&&(i.startsWith("..")||ke.isAbsolute(i)))throw new Error(`${n} must stay inside ${t}: ${e}`)}async function rc(t){try{return await pt.promises.access(t),!0}catch{return!1}}function Ku(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 sc(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 Th(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 bv(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=sc(n,"dir",`${e} workspaceSync`),s=sc(n,"rulesFile",`${e} workspaceSync`);nc(r,"workspaceSync.dir"),nc(s,"workspaceSync.rulesFile")}async function vv(t){let e=ke.join(t,Nn),n;try{n=await pt.promises.readFile(e,"utf8")}catch{throw new Error(`Custom engine package is missing ${Nn}`)}let r=Ku(n,Nn),s=sc(r,"id",Nn),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:sc(r,"entry",Nn),workspaceSync:r.workspaceSync};if(i.version!==2)throw new Error(`${Nn} must declare version 2`);if(i.id!==i.id.toLowerCase()||!/^[a-z0-9][a-z0-9._-]*$/.test(i.id))throw new Error(`${Nn} id must contain only lowercase letters, numbers, ".", "_", or "-"`);bv(i.workspaceSync,Nn);let o=nc(i.entry,"entry"),a=ke.join(t,o);if(pi(t,a,"Engine entry"),!await rc(a))throw new Error(`${Nn} entry not found: ${i.entry}`);return i}async function Ov(t,e){let n=new Set;for(let r of e){let s=Ah(r.path);if(n.has(s))throw new Error(`Duplicate engine package path: ${r.path}`);n.add(s);let i=ke.join(t,...s.split("/"));pi(t,i,"Engine package file"),await pt.promises.mkdir(ke.dirname(i),{recursive:!0}),await pt.promises.writeFile(i,r.content)}}async function bh(t,e,n){try{await Tv(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 Pv(t,e,n){let r=ke.join(t,"package.json");if(!await rc(r))return!1;let s=ke.join(t,"package-lock.json");if(!await rc(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,ic.logInfo)(n,"[Store] Running npm ci --omit=dev for custom engine"),await bh(i,["ci","--omit=dev"],t),!0}async function Iv(t,e,n){let r=nc(e.entry,"entry"),s=ke.join(t,r);return n&&(0,ic.logInfo)(n,`[Store] Validating custom engine entry: ${e.entry}`),await bh("node",["--check",s],t),s}async function Nv(t,e,n,r){await pt.promises.mkdir(e,{recursive:!0});let s=ke.join(e,n);pi(e,s,"Custom engine install target");let i=await rc(s);if(i&&!r)throw new Error(`Custom engine "${n}" already exists at ${s}`);if(!i)return await pt.promises.rename(t,s),s;let o=ke.join(e,".tmp");await pt.promises.mkdir(o,{recursive:!0});let a=ke.join(o,`${n}.previous-${Date.now()}`);pi(e,a,"Custom engine backup target"),await pt.promises.rm(a,{recursive:!0,force:!0}),await pt.promises.rename(s,a);try{return await pt.promises.rename(t,s),await pt.promises.rm(a,{recursive:!0,force:!0}),s}catch(c){throw await pt.promises.rm(s,{recursive:!0,force:!0}).catch(()=>{}),await pt.promises.rename(a,s).catch(()=>{}),c}}async function Rv(t,e={}){if(t.length===0)throw new Error("Custom engine package is empty");let n=ke.resolve(e.installRoot??oc()),r=e.runNpmCi!==!1,s=e.overwrite!==!1,i=ke.join(n,".tmp");await pt.promises.mkdir(i,{recursive:!0});let o=await pt.promises.mkdtemp(ke.join(i,`${e.slug||"engine"}-`));pi(i,o,"Custom engine staging directory");let a=!0;try{await Ov(o,t);let c=await vv(o),l=await Pv(o,r,e.logger),d=await Iv(o,c,e.logger),u=await Nv(o,n,c.id,s);a=!1;let f=ke.join(u,ke.relative(o,d)),p={id:c.id,displayName:c.displayName||c.id,version:c.version,manifestPath:ke.join(u,Nn),installDir:u,entryPath:f,npmInstalled:l};if(e.logger){let g=e.sourceUrl?` from ${e.sourceUrl}`:"";(0,ic.logInfo)(e.logger,`[Store] Installed custom engine ${p.id}${g} to ${u}`)}return p}finally{a&&await pt.promises.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}async function Cv(t={}){let e=ke.resolve(t.installRoot??oc()),n;try{n=await pt.promises.readdir(e,{withFileTypes:!0})}catch{return[]}let r=[];for(let s of n){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=ke.join(e,s.name);pi(e,i,"Custom engine install target");let o=ke.join(i,Nn),a=s.name,c=s.name;try{let l=Ku(await pt.promises.readFile(o,"utf8"),o);typeof l.id=="string"&&l.id.trim()&&(a=Th(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 kv(t,e={}){let n=Th(t),r=ke.resolve(e.installRoot??oc()),s=ke.join(r,n);pi(r,s,"Custom engine uninstall target");let i;try{let o=await pt.promises.lstat(s);if(!o.isDirectory()||o.isSymbolicLink())throw new Error(`Custom engine install target is not a normal directory: ${s}`);try{let a=Ku(await pt.promises.readFile(ke.join(s,Nn),"utf8"),Nn);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 pt.promises.rm(s,{recursive:!0,force:!0}),e.logger&&(0,ic.logInfo)(e.logger,`[Store] Uninstalled custom engine ${n} from ${s}`),{id:n,displayName:i,installDir:s,removed:!0}}});var Bs=S(Cn=>{"use strict";var $v=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]})),Dv=Cn&&Cn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qu=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"&&$v(n,e,r[s]);return Dv(n,e),n}})();Object.defineProperty(Cn,"__esModule",{value:!0});Cn.parseCustomEngineSearchPath=uc;Cn.getCustomEngineSearchRoots=Ih;Cn.discoverCustomEngineManifests=Nh;Cn.resolveCustomEngineManifest=Rh;Cn.tryResolveCustomEngineManifest=Bv;var cc=qu(require("fs")),Lv=qu(require("os")),yr=qu(require("path")),lc=et(),Mv=ac(),vh="engines",Oh="engine.manifest.json";function Ph(t){return t.trim().toLowerCase()}function Rn(t){return typeof t=="string"&&t.trim().length>0}function uc(t){return Array.isArray(t)?t.flatMap(e=>uc(e)):t?.trim()?t.split(yr.delimiter).map(e=>e.trim()).filter(Boolean):[]}function Gv(t){let e=new Set,n=[];for(let r of t){let s=yr.resolve(r);e.has(s)||(e.add(s),n.push(s))}return n}function Uv(t,e){if(!t)return;if(typeof t!="object")throw new Error(`Invalid model config in ${e}: expected object`);let n=t;if(!Rn(n.defaultModel))throw new Error(`Invalid model config in ${e}: "defaultModel" is required`);return{defaultModel:n.defaultModel.trim(),apiKeyEnvVar:Rn(n.apiKeyEnvVar)?n.apiKeyEnvVar.trim():void 0,baseUrlEnvVar:Rn(n.baseUrlEnvVar)?n.baseUrlEnvVar.trim():void 0,openaiBaseUrlEnvVar:Rn(n.openaiBaseUrlEnvVar)?n.openaiBaseUrlEnvVar.trim():void 0}}function Hv(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=Rn(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 jv(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(!Rn(n.dir))throw new Error(`Invalid workspaceSync config in ${e}: "dir" is required when enabled`);if(!Rn(n.rulesFile))throw new Error(`Invalid workspaceSync config in ${e}: "rulesFile" is required when enabled`);let s=n.dir.trim();if(yr.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(yr.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 xv(t,e){let n=cc.readFileSync(t,"utf8"),r=JSON.parse(n);if(!Rn(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(!Rn(r.entry))throw new Error(`Invalid custom engine manifest ${t}: "entry" is required`);let s=Ph(r.id),i=yr.dirname(t),o=r.entry.trim(),a=yr.isAbsolute(o)?o:yr.resolve(i,o);return{version:2,id:s,displayName:Rn(r.displayName)?r.displayName.trim():void 0,description:Rn(r.description)?r.description.trim():void 0,entry:o,entryPath:a,engineExport:Rn(r.engineExport)?r.engineExport.trim():void 0,homeEnvVar:Rn(r.homeEnvVar)?r.homeEnvVar.trim():void 0,workspaceSync:jv(r.workspaceSync,t),promptInjection:Hv(r.promptInjection,t),model:Uv(r.model,t),manifestPath:t,manifestDir:i,searchRoot:e}}function Ih(t,e){let n=t?yr.resolve(t):void 0,r=uc(e),s=uc(process.env.AGENTHIPPO_CUSTOM_ENGINES_DIR??process.env.AGENTIDE_CUSTOM_ENGINES_DIR);return Gv([...n?[yr.join(n,lc.AGENTIDE_DIR_NAME,vh)]:[],...r,...s,(0,Mv.getDefaultCustomEnginesInstallRoot)(),yr.join(Lv.homedir(),lc.AGENTIDE_DIR_NAME,vh)])}function Nh(t,e,n){let r=[],s=new Set;for(let i of Ih(t,e)){if(!cc.existsSync(i))continue;let o;try{o=cc.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory())continue;let c=yr.join(i,a.name,Oh);if(!cc.existsSync(c))continue;let l;try{l=xv(c,i)}catch(d){n?.(c,d);continue}s.has(l.id)||(s.add(l.id),r.push(l))}}return r}function Rh(t,e,n,r){let s=Nh(t,n,r),i=e?Ph(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 ${lc.AGENTIDE_DIR_NAME}/engines.`)}return o}if(s.length===0)throw new Error(`No custom engines found. Add ${Oh} under ${lc.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 Bv(t,e,n,r){try{return Rh(t,e,n,r)}catch{return}}});var on=S((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=tc(),branding_1=et(),customRegistry_1=Bs(),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,f)=>{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=f?path.join(f,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 w=await fs_1.promises.readlink(m),_=path.isAbsolute(w)?w:path.resolve(path.dirname(m),w);(await fs_1.promises.stat(_)).isDirectory()?(s.add(h),await o(_,h)):i.set(h,_)}catch(w){let _=getErrorCode(w);if(_==="ENOENT"||_==="ELOOP")continue;throw w}}};await o(t,"");let a=Array.from(s).sort((u,f)=>u.split(path.sep).length-f.split(path.sep).length);for(let u of a)await ensureRealDirectory(path.join(e,u));for(let[u,f]of i.entries())await symlinkOrCopyFile(f,path.join(e,u),n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0});let c=new Set(i.keys()),l=async(u,f)=>{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=f?path.join(f,g.name):g.name,w=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(w),{recursive:!0}),await fs_1.promises.copyFile(m,w),logInfo(n,`[AgentIDE] Copied new file to source: ${r}/${h}`.replace(/\\/g,"/")),i.set(h,w)}catch(_){logInfo(n,`[AgentIDE] Warning: failed to copy back ${h}: ${_ instanceof Error?_.message:String(_)}`)}}};await l(e,"");for(let[u,f]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(f,p,n,`${r}/${u}`.replace(/\\/g,"/"),{force:!0}))}catch{}}let d=async(u,f)=>{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=f?path.join(f,g.name):g.name;g.isDirectory()?await d(m,h):g.isSymbolicLink()&&(c.has(h)||await fs_1.promises.rm(m,{force:!0}))}};await d(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)`,f="# AgentIDE (managed)",p=c.includes(u)||c.includes(f),g;if(p){let m=c.split(`
33
33
  `),h=[],w=!1;for(let _ of m){if(_.trim()===u||_.trim()===f){w=!0,h.push(...a);continue}if(w){if(_.trim().startsWith("#")||o.includes(_.trim())||_.trim()==="")continue;w=!1}h.push(_)}g=h.join(`
34
34
  `).replace(/\n{3,}/g,`
@@ -36,16 +36,16 @@ 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=fi();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 Ch=S(dc=>{"use strict";Object.defineProperty(dc,"__esModule",{value:!0});dc.VSCodeSessionStore=void 0;var Yu=class{globalState;constructor(e){this.globalState=e}get(e){return this.globalState.get(e)}async set(e,n){await this.globalState.update(e,n)}};dc.VSCodeSessionStore=Yu});var gi=S(wt=>{"use strict";var Fv=wt&&wt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Vv=wt&&wt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Wv=wt&&wt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Fv(n,e,r[s]);return Vv(n,e),n}})();Object.defineProperty(wt,"__esModule",{value:!0});wt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=void 0;wt.initSessionStore=Xv;wt.initSessionStoreWithStore=Dh;wt._getSessionStore=zv;wt._resetSessionStore=Qv;wt.upsertPersistedSession=Zv;wt.touchPersistedSession=eO;wt.getPersistedSession=tO;wt.runSessionMaintenance=nO;wt.buildConversationKey=sO;wt.withConversationLock=iO;var Kv=Wv(require("crypto")),qv=on(),Yv=Ch(),$h="agentide.providerSessions.v1",kh=200,Jv=1e3*60*60*24*14,Xn={},Vo;function Xv(t){Dh(new Yv.VSCodeSessionStore(t.globalState))}function Dh(t){Vo=t,Xn=t.get($h)??{},pc(Date.now()),gc()}function zv(){return Vo}function Qv(){Vo=void 0,Xn={}}function pc(t){for(let[n,r]of Object.entries(Xn))t-r.lastUsedAt>Jv&&delete Xn[n];let e=Object.keys(Xn);if(!(e.length<=kh)){e.sort((n,r)=>Xn[n].lastUsedAt-Xn[r].lastUsedAt);for(let n=0;n<e.length-kh;n++)delete Xn[e[n]]}}async function gc(){if(Vo)try{await Vo.set($h,Xn)}catch{}}async function Zv(t,e){Xn[t]=e,pc(Date.now()),await gc()}async function eO(t){let e=Xn[t];e&&(e.lastUsedAt=Date.now(),pc(e.lastUsedAt),await gc())}function tO(t){return Xn[t]}function nO(){pc(Date.now()),gc()}function rO(t){return JSON.stringify({workspaceRoot:t.workspaceRoot,additionalDirectories:(0,qv.stableAdditionalDirs)(t.additionalDirectories),agentPackId:t.agentPackId??"default"})}function sO(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=rO(e),l=Kv.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}}wt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=1e3*60*60*48;var fc=new Map;function iO(t,e,n){let r=fc.get(t)??Promise.resolve(),s,i=new Promise(w=>{s=w}),o=r.then(()=>i);fc.set(t,o);let a=n?.label?` (${n.label})`:"",c=typeof n?.timeoutMs=="number"?n.timeoutMs:void 0,l=n?.signal,d,u,f=!1,p=l?new Promise((w,_)=>{if(l.aborted){_(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`));return}d=()=>_(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`)),l.addEventListener("abort",d,{once:!0})}):void 0,g=c&&c>0?new Promise((w,_)=>{u=setTimeout(()=>{f=!0,n?.onTimeout?.(),_(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(f)throw new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`);let _=[e(),g].filter(Boolean);return await Promise.race(_)}).finally(()=>{try{u&&clearTimeout(u),l&&d&&l.removeEventListener("abort",d)}finally{s(),fc.get(t)===o&&fc.delete(t)}})}});var hi=S(En=>{"use strict";var oO=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]})),aO=En&&En.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cO=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"&&oO(n,e,r[s]);return aO(n,e),n}})();Object.defineProperty(En,"__esModule",{value:!0});En.buildLiteLLMMetadataHeaders=dO;En.resolveAnalyticsProjectId=fO;En.generateRequestId=pO;En.persistSessionIfNeeded=gO;En.touchSessionIfNeeded=hO;En.getPersistedSessionId=mO;var lO=Zi(),hc=gi(),uO=cO(require("path"));function dO(t,e){if(!t)return[];let n=[],r=(0,lO.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 fO(t,e){let n=t?.trim();if(n)return n;if(!e)return;let r=e.replace(/[\\/]+$/,"").trim();return r&&uO.basename(r).trim()||void 0}function pO(){return`req-${Math.random().toString(16).slice(2,10)}`}async function gO(t,e,n,r){if(e.isEphemeral)return;let s=Date.now(),i=(0,hc.getPersistedSession)(e.key);await(0,hc.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 hO(t){t.isEphemeral||(0,hc.touchPersistedSession)(t.key)}function mO(t,e){let n=(0,hc.getPersistedSession)(e);return n?.provider===t?n.id:void 0}});var Ju=S(wr=>{"use strict";Object.defineProperty(wr,"__esModule",{value:!0});wr.DEFAULT_PERMISSIONS=void 0;wr.getDefaultPermissions=Lh;wr._resetMappingConfigCache=EO;wr.parsePermissions=Mh;wr.parseManifestPermissions=_O;wr.enforcePermissions=yO;wr.toClaudeOptions=wO;wr.toCodexOptions=SO;wr.DEFAULT_PERMISSIONS={fileAccess:"full"};var Fs={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 Lh(){return{...Fs.defaults}}function EO(){}function Mh(t){let e=t?.spec?.permissions,n=Lh();return{fileAccess:e?.fileAccess??n.fileAccess}}function _O(t){return Mh(t)}function yO(t,e){return{fileAccess:e.fileAccess}}function wO(t,e){return{...t.fileAccess==="read-only"?Fs.claude.readOnly:t.fileAccess==="workspace-write"?Fs.claude.workspaceWrite:Fs.claude.fullAccess,additionalDirectories:t.fileAccess==="full"?void 0:e}}function SO(t,e){let n=t.fileAccess==="read-only"?Fs.codex.readOnly:t.fileAccess==="workspace-write"?Fs.codex.workspaceWrite:Fs.codex.fullAccess;return{approvalPolicy:Fs.codex.approvalPolicy,...n,additionalDirectories:e}}});var mi=S(kn=>{"use strict";var AO=kn&&kn.__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]})),TO=kn&&kn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bO=kn&&kn.__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"&&AO(n,e,r[s]);return TO(n,e),n}})();Object.defineProperty(kn,"__esModule",{value:!0});kn.parseYaml=zu;kn.stringifyYaml=Uh;kn.updateManifestName=OO;kn.loadAgentManifest=IO;kn.parseAgentManifest=Hh;var Xu=require("fs"),Gh=bO(require("path")),vO=et();function zu(t){return require("js-yaml").load(t)}function Uh(t){return require("js-yaml").dump(t,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}async function OO(t,e){let n=await Xu.promises.readFile(t,"utf8"),r=zu(n);r&&typeof r=="object"&&r.metadata&&(r.metadata.name=e);let s=Uh(r);await Xu.promises.writeFile(t,s,"utf8")}async function IO(t){let e=await Xu.promises.readFile(t,"utf8");return Hh(e,t)}function Hh(t,e){let n=zu(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 PO(n,r),n}function PO(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(Gh.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=Gh.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",`${vO.AGENTIDE_DIR_NAME}/data/${t.metadata.name}`)}});var ed=S(Nt=>{"use strict";var NO=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]})),RO=Nt&&Nt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),CO=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"&&NO(n,e,r[s]);return RO(n,e),n}})();Object.defineProperty(Nt,"__esModule",{value:!0});Nt.listUserLibraryAgents=DO;Nt.isWorkspaceAgentAvailable=LO;Nt.isAgentInUserLibrary=MO;Nt.hydrateFromUserLibrary=xh;Nt.promoteToUserLibrary=GO;Nt.readAgentSource=Bh;Nt.checkForUpdate=UO;Nt.updateFromUserLibrary=HO;Nt.duplicateAgent=xO;Nt.resetDefaultAgent=BO;var tt=require("fs"),Xe=CO(require("path")),ce=on(),de=qn(),eo=mi(),jh=et();function kO(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 $O(t){return[...t].sort(kO)}async function Qu(t,e){await tt.promises.mkdir(e,{recursive:!0});let n=await tt.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=Xe.join(t,r.name),i=Xe.join(e,r.name);if(r.isDirectory()){if(r.name.startsWith("."))continue;await Qu(s,i)}else await tt.promises.copyFile(s,i)}}async function DO(){let t=(0,de.getUserAgentsDir)();if(!await(0,ce.pathExists)(t))return[];let e=await tt.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=r.name,i=(0,de.getUserAgentRoot)(s),o=await Zu(i);if(o.length===0)continue;let a=await mc(s),c=a||o[o.length-1],l=(0,de.getUserAgentVersionDir)(s,c),d=Xe.join(l,de.AGENT_CONSTANTS.MANIFEST_FILE),u,f;try{let p=await(0,eo.loadAgentManifest)(d);u=p.metadata.description,f=p.spec.engine}catch{}n.push({id:s,versions:o,currentVersion:a,description:u,preferredEngine:f})}return n}async function Zu(t){try{let e=await tt.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=Xe.join(t,r.name,de.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ce.pathExists)(s))try{await(0,eo.loadAgentManifest)(s),n.push(r.name)}catch{}}return $O(n)}catch{return[]}}async function mc(t){let e=(0,de.getUserAgentCurrentPath)(t);try{let n=(await tt.promises.readFile(e,"utf8")).trim();if(!n)return;let r=(0,de.getUserAgentVersionDir)(t,n),s=Xe.join(r,de.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,ce.pathExists)(s))return;try{return await(0,eo.loadAgentManifest)(s),n}catch{return}}catch{}}async function LO(t,e){let n=(0,de.getAgentManifestPath)(t,e);if(!await(0,ce.pathExists)(n))return!1;try{return(await(0,eo.loadAgentManifest)(n)).metadata.name===e}catch{return!1}}async function MO(t){if(await mc(t))return!0;let n=(0,de.getUserAgentRoot)(t);return(await Zu(n)).length>0}async function xh(t,e,n,r){let s=n,i=n??"current";if(!s&&(s=await mc(e),!s)){let f=(0,de.getUserAgentRoot)(e),p=await Zu(f);if(p.length===0){(0,ce.logInfo)(r,`[AgentStores] Agent not in User Library: ${e}`);return}s=p[p.length-1],i=s}let o=(0,de.getUserAgentVersionDir)(e,s);if(!await(0,ce.pathExists)(o)){(0,ce.logInfo)(r,`[AgentStores] Version not found in User Library: ${e}@${s}`);return}let a=(0,de.getAgentRoot)(t,e);(0,ce.logInfo)(r,`[AgentStores] Hydrating ${e}@${s} from User Library`),await(0,ce.pathExists)(a)&&((0,ce.logInfo)(r,`[AgentStores] Clearing existing directory: ${a}`),await tt.promises.rm(a,{recursive:!0,force:!0})),await(0,ce.copyDirRecursive)(o,a);let c=Xe.join(a,de.AGENT_CONSTANTS.MANIFEST_FILE),{sha256:l}=await(0,ce.readFileSha256)(c),d={source:"user-library",agentId:e,version:s,resolvedFrom:i,sha256:l,hydratedAt:new Date().toISOString()},u=Xe.join(a,de.AGENT_CONSTANTS.SOURCE_FILE);return await tt.promises.writeFile(u,JSON.stringify(d,null,2),"utf8"),(0,ce.logInfo)(r,`[AgentStores] Hydrated ${e}@${s} to ${a}`),s}async function GO(t,e,n){if(e===de.AGENT_CONSTANTS.DEFAULT_AGENT_ID)throw new Error("Cannot promote the default agent to User Library");let r=(0,de.getAgentRoot)(t,e),s=(0,de.getAgentManifestPath)(t,e);if(!await(0,ce.pathExists)(s))throw new Error(`Agent not found: ${e}`);let o=(await(0,eo.loadAgentManifest)(s)).metadata.version,a=(0,de.getUserAgentVersionDir)(e,o),c=Xe.join(a,de.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ce.pathExists)(c)){let d=await(0,ce.readFileSha256)(s),u=await(0,ce.readFileSha256)(c);if(d.sha256===u.sha256)return(0,ce.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,ce.logInfo)(n,`[AgentStores] Promoting ${e}@${o} to User Library`),await tt.promises.mkdir(a,{recursive:!0}),await Qu(r,a);let l=(0,de.getUserAgentCurrentPath)(e);return await tt.promises.writeFile(l,o,"utf8"),(0,ce.logInfo)(n,`[AgentStores] Promoted ${e}@${o} to ${a}`),o}async function Bh(t,e){let n=Xe.join((0,de.getAgentRoot)(t,e),de.AGENT_CONSTANTS.SOURCE_FILE);try{let r=await tt.promises.readFile(n,"utf8");return JSON.parse(r)}catch{return}}async function UO(t,e){let n=await Bh(t,e);if(!n||n.source!=="user-library")return;let r=await mc(e);if(r&&r!==n.version)return r}async function HO(t,e,n,r){let s=(0,de.getAgentRoot)(t,e),i=new Date().toISOString().replace(/[:.]/g,"-"),o=Xe.join(Xe.dirname(s),`.${e}.backup-${i}`);await(0,ce.pathExists)(s)&&((0,ce.logInfo)(r,`[AgentStores] Backing up ${e} to ${o}`),await(0,ce.copyDirRecursive)(s,o),await tt.promises.rm(s,{recursive:!0,force:!0}));let a=await xh(t,e,n,r);if(!a)throw await(0,ce.pathExists)(o)&&((0,ce.logInfo)(r,"[AgentStores] Restoring backup after failed update"),await(0,ce.copyDirRecursive)(o,s)),new Error(`Failed to update ${e} from User Library`);return(0,ce.logInfo)(r,`[AgentStores] Updated ${e} to ${a}`),a}async function jO(t,e){let n=`${e}-copy`;if(!await(0,ce.pathExists)((0,de.getAgentRoot)(t,n)))return n;for(let r=2;r<100;r++){let s=`${e}-${r}`;if(!await(0,ce.pathExists)((0,de.getAgentRoot)(t,s)))return s}return`${e}-${Date.now()}`}async function xO(t,e,n){let r=(0,de.getAgentRoot)(t,e),s=(0,de.getAgentManifestPath)(t,e);if(!await(0,ce.pathExists)(s))throw new Error(`Agent not found: ${e}`);let i=await jO(t,e),o=(0,de.getAgentRoot)(t,i);(0,ce.logInfo)(n,`[AgentStores] Duplicating ${e} to ${i}`),await Qu(r,o);let a=(0,de.getAgentManifestPath)(t,i);await(0,eo.updateManifestName)(a,i);let c=Xe.join(o,de.AGENT_CONSTANTS.SOURCE_FILE);try{await tt.promises.rm(c,{force:!0})}catch{}return(0,ce.logInfo)(n,`[AgentStores] Duplicated ${e} to ${i}`),i}async function BO(t,e,n){let r=(0,de.getAgentRoot)(t,de.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=new Date().toISOString().replace(/[:.]/g,"-"),i=Xe.join(Xe.dirname(r),`.default.backup-${s}`);if(await(0,ce.pathExists)(r)&&((0,ce.logInfo)(n,`[AgentStores] Backing up default agent to ${i}`),await(0,ce.copyDirRecursive)(r,i),await tt.promises.rm(r,{recursive:!0,force:!0})),await tt.promises.mkdir(r,{recursive:!0}),await tt.promises.mkdir(Xe.join(r,de.AGENT_CONSTANTS.RULES_DIR),{recursive:!0}),await tt.promises.mkdir(Xe.join(r,de.AGENT_CONSTANTS.SKILLS_DIR),{recursive:!0}),e){let c=Xe.join(e,"rules","AGENTS.md"),l=Xe.join(r,de.AGENT_CONSTANTS.AGENTS_MD);if(await(0,ce.pathExists)(c)){let p=await tt.promises.readFile(c,"utf8");await tt.promises.writeFile(l,(0,jh.applyBrandingTokens)(p),"utf8"),(0,ce.logInfo)(n,"[AgentStores] Restored AGENTS.md from bundled templates")}let d=Xe.join(e,de.AGENT_CONSTANTS.GHOST_TEXT_FILE),u=Xe.join(r,de.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,ce.pathExists)(d)&&!await(0,ce.pathExists)(u)){let p=await tt.promises.readFile(d,"utf8");await tt.promises.writeFile(u,p,"utf8"),(0,ce.logInfo)(n,"[AgentStores] Restored GHOST_TEXT.md from bundled templates")}let f=Xe.join(e,"skills");if(await(0,ce.pathExists)(f)){let p=await tt.promises.readdir(f,{withFileTypes:!0});for(let g of p){if(!g.isDirectory())continue;let m=Xe.join(f,g.name),h=Xe.join(r,de.AGENT_CONSTANTS.SKILLS_DIR,g.name);await(0,ce.copyDirRecursiveWithTransform)(m,h,jh.applyBrandingTokens),(0,ce.logInfo)(n,`[AgentStores] Restored skill: ${g.name}`)}}}let o=(0,de.generateDefaultAgentYaml)({model:"claude"}),a=Xe.join(r,de.AGENT_CONSTANTS.MANIFEST_FILE);await tt.promises.writeFile(a,o,"utf8"),(0,ce.logInfo)(n,"[AgentStores] Reset default agent complete")}});var Fh=S((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=qn(),manifest_1=mi(),utils_1=on(),stores_1=ed(),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 d=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}`),d}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 Wo=S((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(O=>setTimeout(O,500));let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:a});if(!c.ok){let O=await c.text();throw new Error(`Failed to get branch ref for ${n}: ${c.status} - ${O}`)}let d=(await c.json()).object.sha,u=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits/${d}`,{headers:a});if(!u.ok){let O=await u.text();throw new Error(`Failed to get commit ${d}: ${u.status} - ${O}`)}let p=(await u.json()).tree.sha,g=[];for(let O of r){let T=O.encoding??"utf-8",L=await fetch(`https://api.github.com/repos/${t}/${e}/git/blobs`,{method:"POST",headers:a,body:JSON.stringify({content:O.content,encoding:T})});if(!L.ok){let I=await L.text();throw new Error(`Failed to create blob for ${O.path}: ${L.status} - ${I}`)}let A=await L.json();g.push({path:O.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(),w=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits`,{method:"POST",headers:a,body:JSON.stringify({message:s,tree:h.sha,parents:[d]})});if(!w.ok)throw new Error(`Failed to create commit: ${w.status}`);let _=await w.json(),E=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{method:"PATCH",headers:a,body:JSON.stringify({sha:_.sha})});if(!E.ok)throw new Error(`Failed to update ref: ${E.status}`);return{sha:_.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}),d=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:d})});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 Jh=S(xr=>{"use strict";var FO=xr&&xr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),VO=xr&&xr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),WO=xr&&xr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&FO(n,e,r[s]);return VO(n,e),n}})();Object.defineProperty(xr,"__esModule",{value:!0});xr.validateForPublish=qh;xr.publishToGitHub=qO;var td=require("fs"),Wh=WO(require("path")),_n=on(),Kh=mi(),_c=qn(),Ei=Wo(),KO=[".","..",".git",".claude",".codex",".agentide","node_modules","*.log","current.txt"],Vh=1024*1024,Ec=10*1024*1024;async function qh(t,e){let n=[],r=[],s=(0,_c.getAgentRoot)(t,e);if(!await(0,_n.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 d=Wh.join(s,l);await(0,_n.pathExists)(d)||n.push(`Missing required file: ${l}`)}let o=(0,_c.getAgentManifestPath)(t,e);if(await(0,_n.pathExists)(o))try{let l=await(0,Kh.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 Yh(s),c=a.reduce((l,d)=>l+d.size,0);c>Ec?n.push(`Bundle too large: ${to(c)} (max ${to(Ec)})`):c>Ec*.8&&r.push(`Bundle is ${to(c)}, approaching limit of ${to(Ec)}`);for(let l of a)l.size>Vh&&n.push(`File too large: ${l.relativePath} (${to(l.size)}, max ${to(Vh)})`);return{valid:n.length===0,errors:n,warnings:r}}async function Yh(t){let e=[];async function n(r,s){let i;try{i=await td.promises.readdir(r)}catch{return}for(let o of i){if(KO.some(d=>o===d||o.startsWith(".")))continue;let a=Wh.join(r,o),c=s?`${s}/${o}`:o,l=await td.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 qO(t,e,n){let{agentId:r,visibility:s,changelog:i}=e;(0,_n.logInfo)(n,`[Publish] Starting publish for ${r}...`);let o=await qh(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=fi();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 Ch=S(dc=>{"use strict";Object.defineProperty(dc,"__esModule",{value:!0});dc.VSCodeSessionStore=void 0;var Yu=class{globalState;constructor(e){this.globalState=e}get(e){return this.globalState.get(e)}async set(e,n){await this.globalState.update(e,n)}};dc.VSCodeSessionStore=Yu});var gi=S(wt=>{"use strict";var Fv=wt&&wt.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Vv=wt&&wt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Wv=wt&&wt.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&Fv(n,e,r[s]);return Vv(n,e),n}})();Object.defineProperty(wt,"__esModule",{value:!0});wt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=void 0;wt.initSessionStore=Xv;wt.initSessionStoreWithStore=Dh;wt._getSessionStore=zv;wt._resetSessionStore=Qv;wt.upsertPersistedSession=Zv;wt.touchPersistedSession=eO;wt.getPersistedSession=tO;wt.runSessionMaintenance=nO;wt.buildConversationKey=sO;wt.withConversationLock=iO;var Kv=Wv(require("crypto")),qv=on(),Yv=Ch(),$h="agentide.providerSessions.v1",kh=200,Jv=1e3*60*60*24*14,Xn={},Vo;function Xv(t){Dh(new Yv.VSCodeSessionStore(t.globalState))}function Dh(t){Vo=t,Xn=t.get($h)??{},pc(Date.now()),gc()}function zv(){return Vo}function Qv(){Vo=void 0,Xn={}}function pc(t){for(let[n,r]of Object.entries(Xn))t-r.lastUsedAt>Jv&&delete Xn[n];let e=Object.keys(Xn);if(!(e.length<=kh)){e.sort((n,r)=>Xn[n].lastUsedAt-Xn[r].lastUsedAt);for(let n=0;n<e.length-kh;n++)delete Xn[e[n]]}}async function gc(){if(Vo)try{await Vo.set($h,Xn)}catch{}}async function Zv(t,e){Xn[t]=e,pc(Date.now()),await gc()}async function eO(t){let e=Xn[t];e&&(e.lastUsedAt=Date.now(),pc(e.lastUsedAt),await gc())}function tO(t){return Xn[t]}function nO(){pc(Date.now()),gc()}function rO(t){return JSON.stringify({workspaceRoot:t.workspaceRoot,additionalDirectories:(0,qv.stableAdditionalDirs)(t.additionalDirectories),agentPackId:t.agentPackId??"default"})}function sO(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=rO(e),l=Kv.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}}wt.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS=1e3*60*60*48;var fc=new Map;function iO(t,e,n){let r=fc.get(t)??Promise.resolve(),s,i=new Promise(w=>{s=w}),o=r.then(()=>i);fc.set(t,o);let a=n?.label?` (${n.label})`:"",c=typeof n?.timeoutMs=="number"?n.timeoutMs:void 0,l=n?.signal,d,u,f=!1,p=l?new Promise((w,_)=>{if(l.aborted){_(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`));return}d=()=>_(new Error(`[AgentIDE] Cancelled while waiting for conversation lock${a}`)),l.addEventListener("abort",d,{once:!0})}):void 0,g=c&&c>0?new Promise((w,_)=>{u=setTimeout(()=>{f=!0,n?.onTimeout?.(),_(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(f)throw new Error(`[AgentIDE] Conversation lock timed out after ${c}ms${a}`);let _=[e(),g].filter(Boolean);return await Promise.race(_)}).finally(()=>{try{u&&clearTimeout(u),l&&d&&l.removeEventListener("abort",d)}finally{s(),fc.get(t)===o&&fc.delete(t)}})}});var hi=S(En=>{"use strict";var oO=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]})),aO=En&&En.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cO=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"&&oO(n,e,r[s]);return aO(n,e),n}})();Object.defineProperty(En,"__esModule",{value:!0});En.buildLiteLLMMetadataHeaders=dO;En.resolveAnalyticsProjectId=fO;En.generateRequestId=pO;En.persistSessionIfNeeded=gO;En.touchSessionIfNeeded=hO;En.getPersistedSessionId=mO;var lO=Zi(),hc=gi(),uO=cO(require("path"));function dO(t,e){if(!t)return[];let n=[],r=(0,lO.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 fO(t,e){let n=t?.trim();if(n)return n;if(!e)return;let r=e.replace(/[\\/]+$/,"").trim();return r&&uO.basename(r).trim()||void 0}function pO(){return`req-${Math.random().toString(16).slice(2,10)}`}async function gO(t,e,n,r){if(e.isEphemeral)return;let s=Date.now(),i=(0,hc.getPersistedSession)(e.key);await(0,hc.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 hO(t){t.isEphemeral||(0,hc.touchPersistedSession)(t.key)}function mO(t,e){let n=(0,hc.getPersistedSession)(e);return n?.provider===t?n.id:void 0}});var Ju=S(wr=>{"use strict";Object.defineProperty(wr,"__esModule",{value:!0});wr.DEFAULT_PERMISSIONS=void 0;wr.getDefaultPermissions=Lh;wr._resetMappingConfigCache=EO;wr.parsePermissions=Mh;wr.parseManifestPermissions=_O;wr.enforcePermissions=yO;wr.toClaudeOptions=wO;wr.toCodexOptions=SO;wr.DEFAULT_PERMISSIONS={fileAccess:"full"};var Fs={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 Lh(){return{...Fs.defaults}}function EO(){}function Mh(t){let e=t?.spec?.permissions,n=Lh();return{fileAccess:e?.fileAccess??n.fileAccess}}function _O(t){return Mh(t)}function yO(t,e){return{fileAccess:e.fileAccess}}function wO(t,e){return{...t.fileAccess==="read-only"?Fs.claude.readOnly:t.fileAccess==="workspace-write"?Fs.claude.workspaceWrite:Fs.claude.fullAccess,additionalDirectories:t.fileAccess==="full"?void 0:e}}function SO(t,e){let n=t.fileAccess==="read-only"?Fs.codex.readOnly:t.fileAccess==="workspace-write"?Fs.codex.workspaceWrite:Fs.codex.fullAccess;return{approvalPolicy:Fs.codex.approvalPolicy,...n,additionalDirectories:e}}});var mi=S(kn=>{"use strict";var AO=kn&&kn.__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]})),TO=kn&&kn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bO=kn&&kn.__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"&&AO(n,e,r[s]);return TO(n,e),n}})();Object.defineProperty(kn,"__esModule",{value:!0});kn.parseYaml=zu;kn.stringifyYaml=Uh;kn.updateManifestName=OO;kn.loadAgentManifest=PO;kn.parseAgentManifest=Hh;var Xu=require("fs"),Gh=bO(require("path")),vO=et();function zu(t){return require("js-yaml").load(t)}function Uh(t){return require("js-yaml").dump(t,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}async function OO(t,e){let n=await Xu.promises.readFile(t,"utf8"),r=zu(n);r&&typeof r=="object"&&r.metadata&&(r.metadata.name=e);let s=Uh(r);await Xu.promises.writeFile(t,s,"utf8")}async function PO(t){let e=await Xu.promises.readFile(t,"utf8");return Hh(e,t)}function Hh(t,e){let n=zu(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 IO(n,r),n}function IO(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(Gh.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=Gh.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",`${vO.AGENTIDE_DIR_NAME}/data/${t.metadata.name}`)}});var ed=S(Nt=>{"use strict";var NO=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]})),RO=Nt&&Nt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),CO=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"&&NO(n,e,r[s]);return RO(n,e),n}})();Object.defineProperty(Nt,"__esModule",{value:!0});Nt.listUserLibraryAgents=DO;Nt.isWorkspaceAgentAvailable=LO;Nt.isAgentInUserLibrary=MO;Nt.hydrateFromUserLibrary=xh;Nt.promoteToUserLibrary=GO;Nt.readAgentSource=Bh;Nt.checkForUpdate=UO;Nt.updateFromUserLibrary=HO;Nt.duplicateAgent=xO;Nt.resetDefaultAgent=BO;var tt=require("fs"),Xe=CO(require("path")),ce=on(),de=qn(),eo=mi(),jh=et();function kO(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 $O(t){return[...t].sort(kO)}async function Qu(t,e){await tt.promises.mkdir(e,{recursive:!0});let n=await tt.promises.readdir(t,{withFileTypes:!0});for(let r of n){let s=Xe.join(t,r.name),i=Xe.join(e,r.name);if(r.isDirectory()){if(r.name.startsWith("."))continue;await Qu(s,i)}else await tt.promises.copyFile(s,i)}}async function DO(){let t=(0,de.getUserAgentsDir)();if(!await(0,ce.pathExists)(t))return[];let e=await tt.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=r.name,i=(0,de.getUserAgentRoot)(s),o=await Zu(i);if(o.length===0)continue;let a=await mc(s),c=a||o[o.length-1],l=(0,de.getUserAgentVersionDir)(s,c),d=Xe.join(l,de.AGENT_CONSTANTS.MANIFEST_FILE),u,f;try{let p=await(0,eo.loadAgentManifest)(d);u=p.metadata.description,f=p.spec.engine}catch{}n.push({id:s,versions:o,currentVersion:a,description:u,preferredEngine:f})}return n}async function Zu(t){try{let e=await tt.promises.readdir(t,{withFileTypes:!0}),n=[];for(let r of e){if(!r.isDirectory()||r.name.startsWith("."))continue;let s=Xe.join(t,r.name,de.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ce.pathExists)(s))try{await(0,eo.loadAgentManifest)(s),n.push(r.name)}catch{}}return $O(n)}catch{return[]}}async function mc(t){let e=(0,de.getUserAgentCurrentPath)(t);try{let n=(await tt.promises.readFile(e,"utf8")).trim();if(!n)return;let r=(0,de.getUserAgentVersionDir)(t,n),s=Xe.join(r,de.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,ce.pathExists)(s))return;try{return await(0,eo.loadAgentManifest)(s),n}catch{return}}catch{}}async function LO(t,e){let n=(0,de.getAgentManifestPath)(t,e);if(!await(0,ce.pathExists)(n))return!1;try{return(await(0,eo.loadAgentManifest)(n)).metadata.name===e}catch{return!1}}async function MO(t){if(await mc(t))return!0;let n=(0,de.getUserAgentRoot)(t);return(await Zu(n)).length>0}async function xh(t,e,n,r){let s=n,i=n??"current";if(!s&&(s=await mc(e),!s)){let f=(0,de.getUserAgentRoot)(e),p=await Zu(f);if(p.length===0){(0,ce.logInfo)(r,`[AgentStores] Agent not in User Library: ${e}`);return}s=p[p.length-1],i=s}let o=(0,de.getUserAgentVersionDir)(e,s);if(!await(0,ce.pathExists)(o)){(0,ce.logInfo)(r,`[AgentStores] Version not found in User Library: ${e}@${s}`);return}let a=(0,de.getAgentRoot)(t,e);(0,ce.logInfo)(r,`[AgentStores] Hydrating ${e}@${s} from User Library`),await(0,ce.pathExists)(a)&&((0,ce.logInfo)(r,`[AgentStores] Clearing existing directory: ${a}`),await tt.promises.rm(a,{recursive:!0,force:!0})),await(0,ce.copyDirRecursive)(o,a);let c=Xe.join(a,de.AGENT_CONSTANTS.MANIFEST_FILE),{sha256:l}=await(0,ce.readFileSha256)(c),d={source:"user-library",agentId:e,version:s,resolvedFrom:i,sha256:l,hydratedAt:new Date().toISOString()},u=Xe.join(a,de.AGENT_CONSTANTS.SOURCE_FILE);return await tt.promises.writeFile(u,JSON.stringify(d,null,2),"utf8"),(0,ce.logInfo)(r,`[AgentStores] Hydrated ${e}@${s} to ${a}`),s}async function GO(t,e,n){if(e===de.AGENT_CONSTANTS.DEFAULT_AGENT_ID)throw new Error("Cannot promote the default agent to User Library");let r=(0,de.getAgentRoot)(t,e),s=(0,de.getAgentManifestPath)(t,e);if(!await(0,ce.pathExists)(s))throw new Error(`Agent not found: ${e}`);let o=(await(0,eo.loadAgentManifest)(s)).metadata.version,a=(0,de.getUserAgentVersionDir)(e,o),c=Xe.join(a,de.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,ce.pathExists)(c)){let d=await(0,ce.readFileSha256)(s),u=await(0,ce.readFileSha256)(c);if(d.sha256===u.sha256)return(0,ce.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,ce.logInfo)(n,`[AgentStores] Promoting ${e}@${o} to User Library`),await tt.promises.mkdir(a,{recursive:!0}),await Qu(r,a);let l=(0,de.getUserAgentCurrentPath)(e);return await tt.promises.writeFile(l,o,"utf8"),(0,ce.logInfo)(n,`[AgentStores] Promoted ${e}@${o} to ${a}`),o}async function Bh(t,e){let n=Xe.join((0,de.getAgentRoot)(t,e),de.AGENT_CONSTANTS.SOURCE_FILE);try{let r=await tt.promises.readFile(n,"utf8");return JSON.parse(r)}catch{return}}async function UO(t,e){let n=await Bh(t,e);if(!n||n.source!=="user-library")return;let r=await mc(e);if(r&&r!==n.version)return r}async function HO(t,e,n,r){let s=(0,de.getAgentRoot)(t,e),i=new Date().toISOString().replace(/[:.]/g,"-"),o=Xe.join(Xe.dirname(s),`.${e}.backup-${i}`);await(0,ce.pathExists)(s)&&((0,ce.logInfo)(r,`[AgentStores] Backing up ${e} to ${o}`),await(0,ce.copyDirRecursive)(s,o),await tt.promises.rm(s,{recursive:!0,force:!0}));let a=await xh(t,e,n,r);if(!a)throw await(0,ce.pathExists)(o)&&((0,ce.logInfo)(r,"[AgentStores] Restoring backup after failed update"),await(0,ce.copyDirRecursive)(o,s)),new Error(`Failed to update ${e} from User Library`);return(0,ce.logInfo)(r,`[AgentStores] Updated ${e} to ${a}`),a}async function jO(t,e){let n=`${e}-copy`;if(!await(0,ce.pathExists)((0,de.getAgentRoot)(t,n)))return n;for(let r=2;r<100;r++){let s=`${e}-${r}`;if(!await(0,ce.pathExists)((0,de.getAgentRoot)(t,s)))return s}return`${e}-${Date.now()}`}async function xO(t,e,n){let r=(0,de.getAgentRoot)(t,e),s=(0,de.getAgentManifestPath)(t,e);if(!await(0,ce.pathExists)(s))throw new Error(`Agent not found: ${e}`);let i=await jO(t,e),o=(0,de.getAgentRoot)(t,i);(0,ce.logInfo)(n,`[AgentStores] Duplicating ${e} to ${i}`),await Qu(r,o);let a=(0,de.getAgentManifestPath)(t,i);await(0,eo.updateManifestName)(a,i);let c=Xe.join(o,de.AGENT_CONSTANTS.SOURCE_FILE);try{await tt.promises.rm(c,{force:!0})}catch{}return(0,ce.logInfo)(n,`[AgentStores] Duplicated ${e} to ${i}`),i}async function BO(t,e,n){let r=(0,de.getAgentRoot)(t,de.AGENT_CONSTANTS.DEFAULT_AGENT_ID),s=new Date().toISOString().replace(/[:.]/g,"-"),i=Xe.join(Xe.dirname(r),`.default.backup-${s}`);if(await(0,ce.pathExists)(r)&&((0,ce.logInfo)(n,`[AgentStores] Backing up default agent to ${i}`),await(0,ce.copyDirRecursive)(r,i),await tt.promises.rm(r,{recursive:!0,force:!0})),await tt.promises.mkdir(r,{recursive:!0}),await tt.promises.mkdir(Xe.join(r,de.AGENT_CONSTANTS.RULES_DIR),{recursive:!0}),await tt.promises.mkdir(Xe.join(r,de.AGENT_CONSTANTS.SKILLS_DIR),{recursive:!0}),e){let c=Xe.join(e,"rules","AGENTS.md"),l=Xe.join(r,de.AGENT_CONSTANTS.AGENTS_MD);if(await(0,ce.pathExists)(c)){let p=await tt.promises.readFile(c,"utf8");await tt.promises.writeFile(l,(0,jh.applyBrandingTokens)(p),"utf8"),(0,ce.logInfo)(n,"[AgentStores] Restored AGENTS.md from bundled templates")}let d=Xe.join(e,de.AGENT_CONSTANTS.GHOST_TEXT_FILE),u=Xe.join(r,de.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,ce.pathExists)(d)&&!await(0,ce.pathExists)(u)){let p=await tt.promises.readFile(d,"utf8");await tt.promises.writeFile(u,p,"utf8"),(0,ce.logInfo)(n,"[AgentStores] Restored GHOST_TEXT.md from bundled templates")}let f=Xe.join(e,"skills");if(await(0,ce.pathExists)(f)){let p=await tt.promises.readdir(f,{withFileTypes:!0});for(let g of p){if(!g.isDirectory())continue;let m=Xe.join(f,g.name),h=Xe.join(r,de.AGENT_CONSTANTS.SKILLS_DIR,g.name);await(0,ce.copyDirRecursiveWithTransform)(m,h,jh.applyBrandingTokens),(0,ce.logInfo)(n,`[AgentStores] Restored skill: ${g.name}`)}}}let o=(0,de.generateDefaultAgentYaml)({model:"claude"}),a=Xe.join(r,de.AGENT_CONSTANTS.MANIFEST_FILE);await tt.promises.writeFile(a,o,"utf8"),(0,ce.logInfo)(n,"[AgentStores] Reset default agent complete")}});var Fh=S((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=qn(),manifest_1=mi(),utils_1=on(),stores_1=ed(),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 d=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}`),d}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 Wo=S((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(O=>setTimeout(O,500));let c=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{headers:a});if(!c.ok){let O=await c.text();throw new Error(`Failed to get branch ref for ${n}: ${c.status} - ${O}`)}let d=(await c.json()).object.sha,u=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits/${d}`,{headers:a});if(!u.ok){let O=await u.text();throw new Error(`Failed to get commit ${d}: ${u.status} - ${O}`)}let p=(await u.json()).tree.sha,g=[];for(let O of r){let T=O.encoding??"utf-8",L=await fetch(`https://api.github.com/repos/${t}/${e}/git/blobs`,{method:"POST",headers:a,body:JSON.stringify({content:O.content,encoding:T})});if(!L.ok){let P=await L.text();throw new Error(`Failed to create blob for ${O.path}: ${L.status} - ${P}`)}let A=await L.json();g.push({path:O.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(),w=await fetch(`https://api.github.com/repos/${t}/${e}/git/commits`,{method:"POST",headers:a,body:JSON.stringify({message:s,tree:h.sha,parents:[d]})});if(!w.ok)throw new Error(`Failed to create commit: ${w.status}`);let _=await w.json(),E=await fetch(`https://api.github.com/repos/${t}/${e}/git/refs/heads/${n}`,{method:"PATCH",headers:a,body:JSON.stringify({sha:_.sha})});if(!E.ok)throw new Error(`Failed to update ref: ${E.status}`);return{sha:_.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}),d=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:d})});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 Jh=S(xr=>{"use strict";var FO=xr&&xr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),VO=xr&&xr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),WO=xr&&xr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&FO(n,e,r[s]);return VO(n,e),n}})();Object.defineProperty(xr,"__esModule",{value:!0});xr.validateForPublish=qh;xr.publishToGitHub=qO;var td=require("fs"),Wh=WO(require("path")),_n=on(),Kh=mi(),_c=qn(),Ei=Wo(),KO=[".","..",".git",".claude",".codex",".agentide","node_modules","*.log","current.txt"],Vh=1024*1024,Ec=10*1024*1024;async function qh(t,e){let n=[],r=[],s=(0,_c.getAgentRoot)(t,e);if(!await(0,_n.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 d=Wh.join(s,l);await(0,_n.pathExists)(d)||n.push(`Missing required file: ${l}`)}let o=(0,_c.getAgentManifestPath)(t,e);if(await(0,_n.pathExists)(o))try{let l=await(0,Kh.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 Yh(s),c=a.reduce((l,d)=>l+d.size,0);c>Ec?n.push(`Bundle too large: ${to(c)} (max ${to(Ec)})`):c>Ec*.8&&r.push(`Bundle is ${to(c)}, approaching limit of ${to(Ec)}`);for(let l of a)l.size>Vh&&n.push(`File too large: ${l.relativePath} (${to(l.size)}, max ${to(Vh)})`);return{valid:n.length===0,errors:n,warnings:r}}async function Yh(t){let e=[];async function n(r,s){let i;try{i=await td.promises.readdir(r)}catch{return}for(let o of i){if(KO.some(d=>o===d||o.startsWith(".")))continue;let a=Wh.join(r,o),c=s?`${s}/${o}`:o,l=await td.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 qO(t,e,n){let{agentId:r,visibility:s,changelog:i}=e;(0,_n.logInfo)(n,`[Publish] Starting publish for ${r}...`);let o=await qh(t,r);if(!o.valid)throw new Error(`Validation failed:
40
40
  ${o.errors.join(`
41
41
  `)}`);o.warnings.length>0&&(0,_n.logInfo)(n,`[Publish] Warnings:
42
42
  ${o.warnings.join(`
43
- `)}`);let a=(0,_c.getAgentManifestPath)(t,r),c=await(0,Kh.loadAgentManifest)(a),l=c.metadata.version,d=`v${l}`,u=await(0,Ei.getGitHubUser)();(0,_n.logInfo)(n,`[Publish] Authenticated as ${u.login}`);let f=e.repoName||r,p=await(0,Ei.getRepo)(u.login,f);if(p?(0,_n.logInfo)(n,`[Publish] Using existing repository: ${p.full_name}`):((0,_n.logInfo)(n,`[Publish] Creating new repository: ${u.login}/${f}`),p=await(0,Ei.createRepo)(f,c.metadata.description||`AgentIDE pack: ${r}`,s==="private")),await(0,Ei.getReleaseByTag)(u.login,f,d))throw new Error(`Version ${l} already published. Bump version in agent.yaml and try again.`);let m=(0,_c.getAgentRoot)(t,r),h=await Yh(m);(0,_n.logInfo)(n,`[Publish] Pushing ${h.length} files to ${p.full_name}...`);for(let _ of h){let E=await td.promises.readFile(_.absolutePath,"utf-8"),O=await(0,Ei.getFileContent)(u.login,f,_.relativePath);await(0,Ei.putFileContent)(u.login,f,_.relativePath,E,`Publish ${r} v${l}`,O?.sha,p.default_branch),(0,_n.logInfo)(n,`[Publish] \u2713 ${_.relativePath}`)}(0,_n.logInfo)(n,`[Publish] Creating release ${d}...`);let w=await(0,Ei.createRelease)(u.login,f,d,`${r} v${l}`,i||`Release ${l}`,p.default_branch);return(0,_n.logInfo)(n,`[Publish] OK Published ${r} v${l}`),(0,_n.logInfo)(n,`[Publish] Repo: ${p.html_url}`),(0,_n.logInfo)(n,`[Publish] Release: ${w.html_url}`),{owner:u.login,repo:f,version:l,repoUrl:p.html_url,releaseUrl:w.html_url}}function to(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var Zh=S(Sr=>{"use strict";var YO=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]})),JO=Sr&&Sr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),XO=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"&&YO(n,e,r[s]);return JO(n,e),n}})();Object.defineProperty(Sr,"__esModule",{value:!0});Sr.downloadTarball=zh;Sr.installFromGitHub=tI;Sr.checkGitHubUpdate=nI;var yc=require("fs"),Xh=XO(require("path")),zO=require("zlib"),qt=on(),wc=qn(),QO=mi(),Sc=Wo();async function zh(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,qt.logInfo)(r,"[Install] Requires authentication, signing in...");let c=await(0,Sc.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,zO.gunzipSync)(o);return ZO(a)}function ZO(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 eI(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 tI(t,e,n){let{source:r,force:s=!1}=e;(0,qt.logInfo)(n,`[Install] Installing from ${r}...`);let i=(0,Sc.parseGitHubSource)(r);(0,qt.logInfo)(n,`[Install] Repository: ${i.owner}/${i.repo}`);let o;if(i.version)o=i.version;else{(0,qt.logInfo)(n,"[Install] Resolving latest version...");let f=await Qh(i.owner,i.repo,n);if(!f)throw new Error(`No releases found for ${i.owner}/${i.repo}. The repository may not have any published versions.`);o=f,(0,qt.logInfo)(n,`[Install] Latest version: ${o}`)}let a=i.repo,c=(0,wc.getAgentRoot)(t,a);if(await(0,qt.pathExists)(c)){if(!s)throw new Error(`Agent "${a}" already exists. Use force option to overwrite.`);(0,qt.logInfo)(n,"[Install] Removing existing installation..."),await yc.promises.rm(c,{recursive:!0,force:!0})}(0,qt.logInfo)(n,`[Install] Downloading ${o}...`);let l=await zh(i.owner,i.repo,o,n),d=eI(l);if((0,qt.logInfo)(n,`[Install] Found ${d.size} files`),!d.has(wc.AGENT_CONSTANTS.MANIFEST_FILE))throw new Error(`Invalid agent pack: missing ${wc.AGENT_CONSTANTS.MANIFEST_FILE}. Ensure the repository contains a valid agent pack.`);await yc.promises.mkdir(c,{recursive:!0});let u=0;for(let[f,p]of d){(0,qt.logInfo)(n,`[Install] \u2193 ${f}`);let g=Xh.join(c,f);await yc.promises.mkdir(Xh.dirname(g),{recursive:!0}),await yc.promises.writeFile(g,p),u+=p.length}return(0,qt.logInfo)(n,`[Install] OK Installed ${a} ${o}`),(0,qt.logInfo)(n,`[Install] Location: ${c}`),(0,qt.logInfo)(n,`[Install] Downloaded: ${rI(u)}`),{agentId:a,version:o,source:`github://${i.owner}/${i.repo}@${o}`,installed:!0}}async function Qh(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,qt.logInfo)(n,"[Install] Requires authentication...");let o=await(0,Sc.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 nI(t,e,n,r){try{let s=(0,wc.getAgentManifestPath)(t,e);if(!await(0,qt.pathExists)(s))return{hasUpdate:!1};let o=(await(0,QO.loadAgentManifest)(s)).metadata.version,a=(0,Sc.parseGitHubSource)(n),c=await Qh(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,qt.logInfo)(r,`[Install] Update check failed: ${s}`),{hasUpdate:!1}}}function rI(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var nd=S(k=>{"use strict";Object.defineProperty(k,"__esModule",{value:!0});k.checkGitHubUpdate=k.installFromGitHub=k.validateForPublish=k.publishToGitHub=k.getGitHubUser=k.isGitHubAuthenticated=k.getGitHubToken=k.formatGitHubSource=k.parseGitHubSource=k.resetDefaultAgent=k.duplicateAgent=k.updateFromUserLibrary=k.checkForUpdate=k.readAgentSource=k.promoteToUserLibrary=k.hydrateFromUserLibrary=k.isAgentInUserLibrary=k.isWorkspaceAgentAvailable=k.listUserLibraryAgents=k.updateManifestName=k.parseAgentManifest=k.loadAgentManifest=k.stringifyYaml=k.parseYaml=k.AgentPackManager=k.getUserAgentCurrentPath=k.getUserAgentVersionDir=k.getUserAgentRoot=k.getUserAgentsDir=k.getAgentideHome=k.parseAgentIdFromPath=k.getSessionsDir=k.getAgentMcpDir=k.getAgentRulesDir=k.getAgentSkillsDir=k.getAgentContextPath=k.getAgentAgentsMdPath=k.getAgentManifestPath=k.isDefaultAgent=k.engineHomeUserKey=k.userScopedEngineHomeFromKey=k.userScopedEngineHome=k.resolveRuntimePaths=k.resolveAgentRuntimePaths=k.getAgentRoot=k.getAgentsDir=k.getAgentideDir=k.AGENT_CONSTANTS=void 0;var nt=qn();Object.defineProperty(k,"AGENT_CONSTANTS",{enumerable:!0,get:function(){return nt.AGENT_CONSTANTS}});Object.defineProperty(k,"getAgentideDir",{enumerable:!0,get:function(){return nt.getAgentideDir}});Object.defineProperty(k,"getAgentsDir",{enumerable:!0,get:function(){return nt.getAgentsDir}});Object.defineProperty(k,"getAgentRoot",{enumerable:!0,get:function(){return nt.getAgentRoot}});Object.defineProperty(k,"resolveAgentRuntimePaths",{enumerable:!0,get:function(){return nt.resolveAgentRuntimePaths}});Object.defineProperty(k,"resolveRuntimePaths",{enumerable:!0,get:function(){return nt.resolveRuntimePaths}});Object.defineProperty(k,"userScopedEngineHome",{enumerable:!0,get:function(){return nt.userScopedEngineHome}});Object.defineProperty(k,"userScopedEngineHomeFromKey",{enumerable:!0,get:function(){return nt.userScopedEngineHomeFromKey}});Object.defineProperty(k,"engineHomeUserKey",{enumerable:!0,get:function(){return nt.engineHomeUserKey}});Object.defineProperty(k,"isDefaultAgent",{enumerable:!0,get:function(){return nt.isDefaultAgent}});Object.defineProperty(k,"getAgentManifestPath",{enumerable:!0,get:function(){return nt.getAgentManifestPath}});Object.defineProperty(k,"getAgentAgentsMdPath",{enumerable:!0,get:function(){return nt.getAgentAgentsMdPath}});Object.defineProperty(k,"getAgentContextPath",{enumerable:!0,get:function(){return nt.getAgentContextPath}});Object.defineProperty(k,"getAgentSkillsDir",{enumerable:!0,get:function(){return nt.getAgentSkillsDir}});Object.defineProperty(k,"getAgentRulesDir",{enumerable:!0,get:function(){return nt.getAgentRulesDir}});Object.defineProperty(k,"getAgentMcpDir",{enumerable:!0,get:function(){return nt.getAgentMcpDir}});Object.defineProperty(k,"getSessionsDir",{enumerable:!0,get:function(){return nt.getSessionsDir}});Object.defineProperty(k,"parseAgentIdFromPath",{enumerable:!0,get:function(){return nt.parseAgentIdFromPath}});Object.defineProperty(k,"getAgentideHome",{enumerable:!0,get:function(){return nt.getAgentideHome}});Object.defineProperty(k,"getUserAgentsDir",{enumerable:!0,get:function(){return nt.getUserAgentsDir}});Object.defineProperty(k,"getUserAgentRoot",{enumerable:!0,get:function(){return nt.getUserAgentRoot}});Object.defineProperty(k,"getUserAgentVersionDir",{enumerable:!0,get:function(){return nt.getUserAgentVersionDir}});Object.defineProperty(k,"getUserAgentCurrentPath",{enumerable:!0,get:function(){return nt.getUserAgentCurrentPath}});var sI=Fh();Object.defineProperty(k,"AgentPackManager",{enumerable:!0,get:function(){return sI.AgentPackManager}});var Ko=mi();Object.defineProperty(k,"parseYaml",{enumerable:!0,get:function(){return Ko.parseYaml}});Object.defineProperty(k,"stringifyYaml",{enumerable:!0,get:function(){return Ko.stringifyYaml}});Object.defineProperty(k,"loadAgentManifest",{enumerable:!0,get:function(){return Ko.loadAgentManifest}});Object.defineProperty(k,"parseAgentManifest",{enumerable:!0,get:function(){return Ko.parseAgentManifest}});Object.defineProperty(k,"updateManifestName",{enumerable:!0,get:function(){return Ko.updateManifestName}});var Br=ed();Object.defineProperty(k,"listUserLibraryAgents",{enumerable:!0,get:function(){return Br.listUserLibraryAgents}});Object.defineProperty(k,"isWorkspaceAgentAvailable",{enumerable:!0,get:function(){return Br.isWorkspaceAgentAvailable}});Object.defineProperty(k,"isAgentInUserLibrary",{enumerable:!0,get:function(){return Br.isAgentInUserLibrary}});Object.defineProperty(k,"hydrateFromUserLibrary",{enumerable:!0,get:function(){return Br.hydrateFromUserLibrary}});Object.defineProperty(k,"promoteToUserLibrary",{enumerable:!0,get:function(){return Br.promoteToUserLibrary}});Object.defineProperty(k,"readAgentSource",{enumerable:!0,get:function(){return Br.readAgentSource}});Object.defineProperty(k,"checkForUpdate",{enumerable:!0,get:function(){return Br.checkForUpdate}});Object.defineProperty(k,"updateFromUserLibrary",{enumerable:!0,get:function(){return Br.updateFromUserLibrary}});Object.defineProperty(k,"duplicateAgent",{enumerable:!0,get:function(){return Br.duplicateAgent}});Object.defineProperty(k,"resetDefaultAgent",{enumerable:!0,get:function(){return Br.resetDefaultAgent}});var qo=Wo();Object.defineProperty(k,"parseGitHubSource",{enumerable:!0,get:function(){return qo.parseGitHubSource}});Object.defineProperty(k,"formatGitHubSource",{enumerable:!0,get:function(){return qo.formatGitHubSource}});Object.defineProperty(k,"getGitHubToken",{enumerable:!0,get:function(){return qo.getGitHubToken}});Object.defineProperty(k,"isGitHubAuthenticated",{enumerable:!0,get:function(){return qo.isGitHubAuthenticated}});Object.defineProperty(k,"getGitHubUser",{enumerable:!0,get:function(){return qo.getGitHubUser}});var em=Jh();Object.defineProperty(k,"publishToGitHub",{enumerable:!0,get:function(){return em.publishToGitHub}});Object.defineProperty(k,"validateForPublish",{enumerable:!0,get:function(){return em.validateForPublish}});var tm=Zh();Object.defineProperty(k,"installFromGitHub",{enumerable:!0,get:function(){return tm.installFromGitHub}});Object.defineProperty(k,"checkGitHubUpdate",{enumerable:!0,get:function(){return tm.checkGitHubUpdate}})});var Ac=S(Ut=>{"use strict";var iI=Ut&&Ut.__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=Ut&&Ut.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),aI=Ut&&Ut.__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(Ut,"__esModule",{value:!0});Ut.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV=Ut.GATEWAY_OUTBOUND_FILENAME=void 0;Ut.safeGatewaySessionDirId=rd;Ut.getGatewayOutboundFilePath=nm;Ut.resolveGatewaySessionDirId=rm;Ut.resolveGatewayOutboundFilePath=uI;var cI=aI(require("path")),lI=et();Ut.GATEWAY_OUTBOUND_FILENAME="gateway-outbound.json";Ut.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV="AGENTHIPPO_GATEWAY_OUTBOUND_FILE";function rd(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160).replace(/^\.+$/,n=>"_".repeat(n.length))||"session"}function nm(t,e){return cI.join(t,lI.AGENTIDE_DIR_NAME,"sessions",e,Ut.GATEWAY_OUTBOUND_FILENAME)}function rm(t){let e=t.chatSessionId?.trim();if(e)return rd(e);let n=t.gatewaySessionKey?.trim();if(n)return rd(n)}function uI(t){let e=rm(t);if(e)return nm(t.workspaceRoot,e)}});var om=S(an=>{"use strict";var dI=an&&an.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fI=an&&an.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pI=an&&an.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dI(n,e,r[s]);return fI(n,e),n}})();Object.defineProperty(an,"__esModule",{value:!0});an.isProcessRunning=Tc;an.isProcessRunningAsync=hI;an.isPidFileProcessRunning=mI;an.readPidFile=sm;an.writePidFile=EI;an.removePidFile=im;an.checkPidFileWithCleanup=_I;var Yo=require("fs"),gI=pI(require("path"));function Tc(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function hI(t){return Tc(t)}async function mI(t){try{let e=await Yo.promises.readFile(t,"utf8").catch(()=>null);if(!e)return!1;let n=parseInt(e.trim().split(`
43
+ `)}`);let a=(0,_c.getAgentManifestPath)(t,r),c=await(0,Kh.loadAgentManifest)(a),l=c.metadata.version,d=`v${l}`,u=await(0,Ei.getGitHubUser)();(0,_n.logInfo)(n,`[Publish] Authenticated as ${u.login}`);let f=e.repoName||r,p=await(0,Ei.getRepo)(u.login,f);if(p?(0,_n.logInfo)(n,`[Publish] Using existing repository: ${p.full_name}`):((0,_n.logInfo)(n,`[Publish] Creating new repository: ${u.login}/${f}`),p=await(0,Ei.createRepo)(f,c.metadata.description||`AgentIDE pack: ${r}`,s==="private")),await(0,Ei.getReleaseByTag)(u.login,f,d))throw new Error(`Version ${l} already published. Bump version in agent.yaml and try again.`);let m=(0,_c.getAgentRoot)(t,r),h=await Yh(m);(0,_n.logInfo)(n,`[Publish] Pushing ${h.length} files to ${p.full_name}...`);for(let _ of h){let E=await td.promises.readFile(_.absolutePath,"utf-8"),O=await(0,Ei.getFileContent)(u.login,f,_.relativePath);await(0,Ei.putFileContent)(u.login,f,_.relativePath,E,`Publish ${r} v${l}`,O?.sha,p.default_branch),(0,_n.logInfo)(n,`[Publish] \u2713 ${_.relativePath}`)}(0,_n.logInfo)(n,`[Publish] Creating release ${d}...`);let w=await(0,Ei.createRelease)(u.login,f,d,`${r} v${l}`,i||`Release ${l}`,p.default_branch);return(0,_n.logInfo)(n,`[Publish] OK Published ${r} v${l}`),(0,_n.logInfo)(n,`[Publish] Repo: ${p.html_url}`),(0,_n.logInfo)(n,`[Publish] Release: ${w.html_url}`),{owner:u.login,repo:f,version:l,repoUrl:p.html_url,releaseUrl:w.html_url}}function to(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var Zh=S(Sr=>{"use strict";var YO=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]})),JO=Sr&&Sr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),XO=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"&&YO(n,e,r[s]);return JO(n,e),n}})();Object.defineProperty(Sr,"__esModule",{value:!0});Sr.downloadTarball=zh;Sr.installFromGitHub=tP;Sr.checkGitHubUpdate=nP;var yc=require("fs"),Xh=XO(require("path")),zO=require("zlib"),qt=on(),wc=qn(),QO=mi(),Sc=Wo();async function zh(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,qt.logInfo)(r,"[Install] Requires authentication, signing in...");let c=await(0,Sc.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,zO.gunzipSync)(o);return ZO(a)}function ZO(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 eP(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 tP(t,e,n){let{source:r,force:s=!1}=e;(0,qt.logInfo)(n,`[Install] Installing from ${r}...`);let i=(0,Sc.parseGitHubSource)(r);(0,qt.logInfo)(n,`[Install] Repository: ${i.owner}/${i.repo}`);let o;if(i.version)o=i.version;else{(0,qt.logInfo)(n,"[Install] Resolving latest version...");let f=await Qh(i.owner,i.repo,n);if(!f)throw new Error(`No releases found for ${i.owner}/${i.repo}. The repository may not have any published versions.`);o=f,(0,qt.logInfo)(n,`[Install] Latest version: ${o}`)}let a=i.repo,c=(0,wc.getAgentRoot)(t,a);if(await(0,qt.pathExists)(c)){if(!s)throw new Error(`Agent "${a}" already exists. Use force option to overwrite.`);(0,qt.logInfo)(n,"[Install] Removing existing installation..."),await yc.promises.rm(c,{recursive:!0,force:!0})}(0,qt.logInfo)(n,`[Install] Downloading ${o}...`);let l=await zh(i.owner,i.repo,o,n),d=eP(l);if((0,qt.logInfo)(n,`[Install] Found ${d.size} files`),!d.has(wc.AGENT_CONSTANTS.MANIFEST_FILE))throw new Error(`Invalid agent pack: missing ${wc.AGENT_CONSTANTS.MANIFEST_FILE}. Ensure the repository contains a valid agent pack.`);await yc.promises.mkdir(c,{recursive:!0});let u=0;for(let[f,p]of d){(0,qt.logInfo)(n,`[Install] \u2193 ${f}`);let g=Xh.join(c,f);await yc.promises.mkdir(Xh.dirname(g),{recursive:!0}),await yc.promises.writeFile(g,p),u+=p.length}return(0,qt.logInfo)(n,`[Install] OK Installed ${a} ${o}`),(0,qt.logInfo)(n,`[Install] Location: ${c}`),(0,qt.logInfo)(n,`[Install] Downloaded: ${rP(u)}`),{agentId:a,version:o,source:`github://${i.owner}/${i.repo}@${o}`,installed:!0}}async function Qh(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,qt.logInfo)(n,"[Install] Requires authentication...");let o=await(0,Sc.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 nP(t,e,n,r){try{let s=(0,wc.getAgentManifestPath)(t,e);if(!await(0,qt.pathExists)(s))return{hasUpdate:!1};let o=(await(0,QO.loadAgentManifest)(s)).metadata.version,a=(0,Sc.parseGitHubSource)(n),c=await Qh(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,qt.logInfo)(r,`[Install] Update check failed: ${s}`),{hasUpdate:!1}}}function rP(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}});var nd=S(k=>{"use strict";Object.defineProperty(k,"__esModule",{value:!0});k.checkGitHubUpdate=k.installFromGitHub=k.validateForPublish=k.publishToGitHub=k.getGitHubUser=k.isGitHubAuthenticated=k.getGitHubToken=k.formatGitHubSource=k.parseGitHubSource=k.resetDefaultAgent=k.duplicateAgent=k.updateFromUserLibrary=k.checkForUpdate=k.readAgentSource=k.promoteToUserLibrary=k.hydrateFromUserLibrary=k.isAgentInUserLibrary=k.isWorkspaceAgentAvailable=k.listUserLibraryAgents=k.updateManifestName=k.parseAgentManifest=k.loadAgentManifest=k.stringifyYaml=k.parseYaml=k.AgentPackManager=k.getUserAgentCurrentPath=k.getUserAgentVersionDir=k.getUserAgentRoot=k.getUserAgentsDir=k.getAgentideHome=k.parseAgentIdFromPath=k.getSessionsDir=k.getAgentMcpDir=k.getAgentRulesDir=k.getAgentSkillsDir=k.getAgentContextPath=k.getAgentAgentsMdPath=k.getAgentManifestPath=k.isDefaultAgent=k.engineHomeUserKey=k.userScopedEngineHomeFromKey=k.userScopedEngineHome=k.resolveRuntimePaths=k.resolveAgentRuntimePaths=k.getAgentRoot=k.getAgentsDir=k.getAgentideDir=k.AGENT_CONSTANTS=void 0;var nt=qn();Object.defineProperty(k,"AGENT_CONSTANTS",{enumerable:!0,get:function(){return nt.AGENT_CONSTANTS}});Object.defineProperty(k,"getAgentideDir",{enumerable:!0,get:function(){return nt.getAgentideDir}});Object.defineProperty(k,"getAgentsDir",{enumerable:!0,get:function(){return nt.getAgentsDir}});Object.defineProperty(k,"getAgentRoot",{enumerable:!0,get:function(){return nt.getAgentRoot}});Object.defineProperty(k,"resolveAgentRuntimePaths",{enumerable:!0,get:function(){return nt.resolveAgentRuntimePaths}});Object.defineProperty(k,"resolveRuntimePaths",{enumerable:!0,get:function(){return nt.resolveRuntimePaths}});Object.defineProperty(k,"userScopedEngineHome",{enumerable:!0,get:function(){return nt.userScopedEngineHome}});Object.defineProperty(k,"userScopedEngineHomeFromKey",{enumerable:!0,get:function(){return nt.userScopedEngineHomeFromKey}});Object.defineProperty(k,"engineHomeUserKey",{enumerable:!0,get:function(){return nt.engineHomeUserKey}});Object.defineProperty(k,"isDefaultAgent",{enumerable:!0,get:function(){return nt.isDefaultAgent}});Object.defineProperty(k,"getAgentManifestPath",{enumerable:!0,get:function(){return nt.getAgentManifestPath}});Object.defineProperty(k,"getAgentAgentsMdPath",{enumerable:!0,get:function(){return nt.getAgentAgentsMdPath}});Object.defineProperty(k,"getAgentContextPath",{enumerable:!0,get:function(){return nt.getAgentContextPath}});Object.defineProperty(k,"getAgentSkillsDir",{enumerable:!0,get:function(){return nt.getAgentSkillsDir}});Object.defineProperty(k,"getAgentRulesDir",{enumerable:!0,get:function(){return nt.getAgentRulesDir}});Object.defineProperty(k,"getAgentMcpDir",{enumerable:!0,get:function(){return nt.getAgentMcpDir}});Object.defineProperty(k,"getSessionsDir",{enumerable:!0,get:function(){return nt.getSessionsDir}});Object.defineProperty(k,"parseAgentIdFromPath",{enumerable:!0,get:function(){return nt.parseAgentIdFromPath}});Object.defineProperty(k,"getAgentideHome",{enumerable:!0,get:function(){return nt.getAgentideHome}});Object.defineProperty(k,"getUserAgentsDir",{enumerable:!0,get:function(){return nt.getUserAgentsDir}});Object.defineProperty(k,"getUserAgentRoot",{enumerable:!0,get:function(){return nt.getUserAgentRoot}});Object.defineProperty(k,"getUserAgentVersionDir",{enumerable:!0,get:function(){return nt.getUserAgentVersionDir}});Object.defineProperty(k,"getUserAgentCurrentPath",{enumerable:!0,get:function(){return nt.getUserAgentCurrentPath}});var sP=Fh();Object.defineProperty(k,"AgentPackManager",{enumerable:!0,get:function(){return sP.AgentPackManager}});var Ko=mi();Object.defineProperty(k,"parseYaml",{enumerable:!0,get:function(){return Ko.parseYaml}});Object.defineProperty(k,"stringifyYaml",{enumerable:!0,get:function(){return Ko.stringifyYaml}});Object.defineProperty(k,"loadAgentManifest",{enumerable:!0,get:function(){return Ko.loadAgentManifest}});Object.defineProperty(k,"parseAgentManifest",{enumerable:!0,get:function(){return Ko.parseAgentManifest}});Object.defineProperty(k,"updateManifestName",{enumerable:!0,get:function(){return Ko.updateManifestName}});var Br=ed();Object.defineProperty(k,"listUserLibraryAgents",{enumerable:!0,get:function(){return Br.listUserLibraryAgents}});Object.defineProperty(k,"isWorkspaceAgentAvailable",{enumerable:!0,get:function(){return Br.isWorkspaceAgentAvailable}});Object.defineProperty(k,"isAgentInUserLibrary",{enumerable:!0,get:function(){return Br.isAgentInUserLibrary}});Object.defineProperty(k,"hydrateFromUserLibrary",{enumerable:!0,get:function(){return Br.hydrateFromUserLibrary}});Object.defineProperty(k,"promoteToUserLibrary",{enumerable:!0,get:function(){return Br.promoteToUserLibrary}});Object.defineProperty(k,"readAgentSource",{enumerable:!0,get:function(){return Br.readAgentSource}});Object.defineProperty(k,"checkForUpdate",{enumerable:!0,get:function(){return Br.checkForUpdate}});Object.defineProperty(k,"updateFromUserLibrary",{enumerable:!0,get:function(){return Br.updateFromUserLibrary}});Object.defineProperty(k,"duplicateAgent",{enumerable:!0,get:function(){return Br.duplicateAgent}});Object.defineProperty(k,"resetDefaultAgent",{enumerable:!0,get:function(){return Br.resetDefaultAgent}});var qo=Wo();Object.defineProperty(k,"parseGitHubSource",{enumerable:!0,get:function(){return qo.parseGitHubSource}});Object.defineProperty(k,"formatGitHubSource",{enumerable:!0,get:function(){return qo.formatGitHubSource}});Object.defineProperty(k,"getGitHubToken",{enumerable:!0,get:function(){return qo.getGitHubToken}});Object.defineProperty(k,"isGitHubAuthenticated",{enumerable:!0,get:function(){return qo.isGitHubAuthenticated}});Object.defineProperty(k,"getGitHubUser",{enumerable:!0,get:function(){return qo.getGitHubUser}});var em=Jh();Object.defineProperty(k,"publishToGitHub",{enumerable:!0,get:function(){return em.publishToGitHub}});Object.defineProperty(k,"validateForPublish",{enumerable:!0,get:function(){return em.validateForPublish}});var tm=Zh();Object.defineProperty(k,"installFromGitHub",{enumerable:!0,get:function(){return tm.installFromGitHub}});Object.defineProperty(k,"checkGitHubUpdate",{enumerable:!0,get:function(){return tm.checkGitHubUpdate}})});var Ac=S(Ut=>{"use strict";var iP=Ut&&Ut.__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]})),oP=Ut&&Ut.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),aP=Ut&&Ut.__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"&&iP(n,e,r[s]);return oP(n,e),n}})();Object.defineProperty(Ut,"__esModule",{value:!0});Ut.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV=Ut.GATEWAY_OUTBOUND_FILENAME=void 0;Ut.safeGatewaySessionDirId=rd;Ut.getGatewayOutboundFilePath=nm;Ut.resolveGatewaySessionDirId=rm;Ut.resolveGatewayOutboundFilePath=uP;var cP=aP(require("path")),lP=et();Ut.GATEWAY_OUTBOUND_FILENAME="gateway-outbound.json";Ut.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV="AGENTHIPPO_GATEWAY_OUTBOUND_FILE";function rd(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160).replace(/^\.+$/,n=>"_".repeat(n.length))||"session"}function nm(t,e){return cP.join(t,lP.AGENTIDE_DIR_NAME,"sessions",e,Ut.GATEWAY_OUTBOUND_FILENAME)}function rm(t){let e=t.chatSessionId?.trim();if(e)return rd(e);let n=t.gatewaySessionKey?.trim();if(n)return rd(n)}function uP(t){let e=rm(t);if(e)return nm(t.workspaceRoot,e)}});var om=S(an=>{"use strict";var dP=an&&an.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),fP=an&&an.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pP=an&&an.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&dP(n,e,r[s]);return fP(n,e),n}})();Object.defineProperty(an,"__esModule",{value:!0});an.isProcessRunning=Tc;an.isProcessRunningAsync=hP;an.isPidFileProcessRunning=mP;an.readPidFile=sm;an.writePidFile=EP;an.removePidFile=im;an.checkPidFileWithCleanup=_P;var Yo=require("fs"),gP=pP(require("path"));function Tc(t){try{return process.kill(t,0),!0}catch(e){return e?.code==="EPERM"}}async function hP(t){return Tc(t)}async function mP(t){try{let e=await Yo.promises.readFile(t,"utf8").catch(()=>null);if(!e)return!1;let n=parseInt(e.trim().split(`
44
44
  `)[0],10);return isNaN(n)?!1:Tc(n)}catch{return!1}}async function sm(t){try{let n=(await Yo.promises.readFile(t,"utf8")).trim().split(`
45
- `),r=parseInt(n[0],10);return isNaN(r)?null:{pid:r,metadata:n.slice(1)}}catch{return null}}async function EI(t,e,...n){try{let r=gI.dirname(t);await Yo.promises.mkdir(r,{recursive:!0});let s=[e,...n].join(`
45
+ `),r=parseInt(n[0],10);return isNaN(r)?null:{pid:r,metadata:n.slice(1)}}catch{return null}}async function EP(t,e,...n){try{let r=gP.dirname(t);await Yo.promises.mkdir(r,{recursive:!0});let s=[e,...n].join(`
46
46
  `)+`
47
- `;await Yo.promises.writeFile(t,s,"utf8")}catch{}}async function im(t){try{await Yo.promises.unlink(t)}catch{}}async function _I(t){let e=await sm(t);return e?Tc(e.pid)?e:(await im(t),null):null}});var am=S(ms=>{"use strict";var yI=ms&&ms.__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]})),wI=ms&&ms.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),SI=ms&&ms.__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 wI(n,e),n}})();Object.defineProperty(ms,"__esModule",{value:!0});ms.probePort=TI;var AI=SI(require("net"));function TI(t,e="127.0.0.1",n=2e3){return new Promise(r=>{let s=new AI.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 id=S(zn=>{"use strict";var bI=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]})),vI=zn&&zn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sd=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"&&bI(n,e,r[s]);return vI(n,e),n}})();Object.defineProperty(zn,"__esModule",{value:!0});zn.findBinary=cm;zn.findBinaryCached=kI;zn.getCommonBinaryPaths=$I;zn.clearBinaryCache=DI;var OI=require("child_process"),II=require("util"),PI=require("fs"),bc=sd(require("fs")),$n=sd(require("path")),NI=sd(require("os")),RI=(0,II.promisify)(OI.exec),vc=process.platform==="win32",CI=6e4,Oc=new Map;async function cm(t,e=5e3){try{let n=vc?`where ${t}`:`which ${t}`,{stdout:r}=await RI(n,{timeout:e});return r.trim().split(`
48
- `)[0]||void 0}catch{return}}async function kI(t,e=[],n=CI){let r=Date.now(),s=Oc.get(t);if(s&&r-s.timestamp<n)return s.path;let i=await cm(t);if(!i)for(let o of e)try{await PI.promises.access(o,vc?bc.constants.F_OK:bc.constants.X_OK),i=o;break}catch{}return Oc.set(t,{path:i,timestamp:r}),i}function $I(t){let e=NI.homedir(),n=vc?`${t}.cmd`:t;if(vc){let o=process.env.LOCALAPPDATA||$n.join(e,"AppData","Local");return[$n.join(o,"AgentHippo","bin",n),$n.join(e,"AppData","Local","Programs",t,`${t}.exe`),$n.join(e,"AppData","Roaming","npm",n),$n.join(e,"AppData","Local","pnpm",n),$n.join(e,".npm-global",n)]}let r=[$n.join(e,".local","bin",t),$n.join(e,"Library","pnpm",t),$n.join(e,".local","share","pnpm",t),$n.join(e,".npm-global","bin",t),"/opt/homebrew/bin/"+t,"/usr/local/bin/"+t,"/usr/bin/"+t],s=process.env.NVM_DIR||$n.join(e,".nvm"),i=$n.join(s,"versions","node");if(bc.existsSync(i))try{let o=bc.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort().reverse();for(let a of o)r.push($n.join(i,a,"bin",t))}catch{}return r}function DI(t){t?Oc.delete(t):Oc.clear()}});var Ic=S(Ar=>{"use strict";var LI=Ar&&Ar.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MI=Ar&&Ar.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),od=Ar&&Ar.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LI(n,e,r[s]);return MI(n,e),n}})();Object.defineProperty(Ar,"__esModule",{value:!0});Ar.getNodeBinaryCandidates=hm;Ar.resolveNodeBinary=xI;Ar.prependPathDir=BI;var _i=od(require("fs")),fm=od(require("os")),no=od(require("path")),lm=id(),pm=process.platform==="win32",GI=pm?"node.exe":"node",um=no.join(fm.homedir(),".agenthippo","gateway","install.json"),dm=no.join(fm.homedir(),".agenthippo","tools","node");function gm(t){try{let e=pm?_i.constants.F_OK:_i.constants.X_OK;return _i.accessSync(t,e),!0}catch{return!1}}function UI(){try{if(!_i.existsSync(um))return;let t=_i.readFileSync(um,"utf8").replace(/^\uFEFF/,""),n=JSON.parse(t).nodePath?.trim();return n&&gm(n)?n:void 0}catch{return}}function HI(){if(!_i.existsSync(dm))return[];let t=[],e=(n,r)=>{if(r>4)return;let s;try{s=_i.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){let o=no.join(n,i.name);i.isDirectory()?e(o,r+1):i.isFile()&&i.name===GI&&n.endsWith(`${no.sep}bin`)&&t.push(o)}};return e(dm,0),t.sort().reverse()}function jI(t){let e=new Set,n=[];for(let r of t){let s=no.resolve(r);e.has(s)||!gm(s)||(e.add(s),n.push(s))}return n}function hm(){let t=[];process.env.NODE_BIN?.trim()&&t.push(process.env.NODE_BIN.trim());let e=UI();return e&&t.push(e),t.push(...HI()),process.env.npm_node_execpath?.trim()&&t.push(process.env.npm_node_execpath.trim()),jI(t)}async function xI(){let t=hm();if(t.length>0)return t[0];let e=await(0,lm.findBinaryCached)("node",(0,lm.getCommonBinaryPaths)("node"));return e||"node"}function BI(t,e){if(!e?.trim())return;let n=e.trim(),r=t.PATH?.trim();t.PATH=r?`${n}${no.delimiter}${r}`:n}});var Xo=S(ue=>{"use strict";Object.defineProperty(ue,"__esModule",{value:!0});ue.prependPathDir=ue.getNodeBinaryCandidates=ue.resolveNodeBinary=ue.clearBinaryCache=ue.getCommonBinaryPaths=ue.findBinaryCached=ue.findBinary=ue.probePort=ue.DIRS=ue.PID_FILES=ue.getAnalyticsScriptsDir=ue.getAgentidePath=ue.getAgentideHome=ue.checkPidFileWithCleanup=ue.removePidFile=ue.writePidFile=ue.readPidFile=ue.isPidFileProcessRunning=ue.isProcessRunningAsync=ue.isProcessRunning=void 0;var yi=om();Object.defineProperty(ue,"isProcessRunning",{enumerable:!0,get:function(){return yi.isProcessRunning}});Object.defineProperty(ue,"isProcessRunningAsync",{enumerable:!0,get:function(){return yi.isProcessRunningAsync}});Object.defineProperty(ue,"isPidFileProcessRunning",{enumerable:!0,get:function(){return yi.isPidFileProcessRunning}});Object.defineProperty(ue,"readPidFile",{enumerable:!0,get:function(){return yi.readPidFile}});Object.defineProperty(ue,"writePidFile",{enumerable:!0,get:function(){return yi.writePidFile}});Object.defineProperty(ue,"removePidFile",{enumerable:!0,get:function(){return yi.removePidFile}});Object.defineProperty(ue,"checkPidFileWithCleanup",{enumerable:!0,get:function(){return yi.checkPidFileWithCleanup}});var Jo=fi();Object.defineProperty(ue,"getAgentideHome",{enumerable:!0,get:function(){return Jo.getAgentideHome}});Object.defineProperty(ue,"getAgentidePath",{enumerable:!0,get:function(){return Jo.getAgentidePath}});Object.defineProperty(ue,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return Jo.getAnalyticsScriptsDir}});Object.defineProperty(ue,"PID_FILES",{enumerable:!0,get:function(){return Jo.PID_FILES}});Object.defineProperty(ue,"DIRS",{enumerable:!0,get:function(){return Jo.DIRS}});var FI=am();Object.defineProperty(ue,"probePort",{enumerable:!0,get:function(){return FI.probePort}});var Pc=id();Object.defineProperty(ue,"findBinary",{enumerable:!0,get:function(){return Pc.findBinary}});Object.defineProperty(ue,"findBinaryCached",{enumerable:!0,get:function(){return Pc.findBinaryCached}});Object.defineProperty(ue,"getCommonBinaryPaths",{enumerable:!0,get:function(){return Pc.getCommonBinaryPaths}});Object.defineProperty(ue,"clearBinaryCache",{enumerable:!0,get:function(){return Pc.clearBinaryCache}});var ad=Ic();Object.defineProperty(ue,"resolveNodeBinary",{enumerable:!0,get:function(){return ad.resolveNodeBinary}});Object.defineProperty(ue,"getNodeBinaryCandidates",{enumerable:!0,get:function(){return ad.getNodeBinaryCandidates}});Object.defineProperty(ue,"prependPathDir",{enumerable:!0,get:function(){return ad.prependPathDir}})});var br=S(We=>{"use strict";var VI=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]})),WI=We&&We.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ld=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"&&VI(n,e,r[s]);return WI(n,e),n}})();Object.defineProperty(We,"__esModule",{value:!0});We.OPENCLAW_GATEWAY_TOKEN_ENV=We.AGENTHIPPO_CHAT_SESSION_ID_ENV=We.AGENTIDE_CHAT_SESSION_ID_ENV=void 0;We.readOpenClawGatewayToken=_m;We.getBundledToolsHealth=JI;We.getCliHealth=tP;We.buildSessionEnvPatch=vm;We.buildCliEnvPatch=nP;We.readProvenanceEnvFromProcess=rP;We.buildProvenanceEnv=sP;We.runCli=Om;var Fr=ld(require("fs")),KI=ld(require("os")),Tr=ld(require("path")),qI=require("child_process"),Nc=et(),mm=Ac(),cd=Xo();We.AGENTIDE_CHAT_SESSION_ID_ENV="AGENTIDE_CHAT_SESSION_ID";We.AGENTHIPPO_CHAT_SESSION_ID_ENV="AGENTHIPPO_CHAT_SESSION_ID";We.OPENCLAW_GATEWAY_TOKEN_ENV="OPENCLAW_GATEWAY_TOKEN";function _m(t){let e=t?.OPENCLAW_GATEWAY_TOKEN?.trim()||process.env.OPENCLAW_GATEWAY_TOKEN?.trim();if(e)return e;try{let n=Tr.join(KI.homedir(),".openclaw","openclaw.json"),r=Fr.readFileSync(n,"utf-8"),i=JSON.parse(r).gateway?.auth?.token;return typeof i=="string"?i.trim():void 0}catch{return}}var ym=["rg","sg","tree-sitter"];function wm(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 Sm(t){return process.platform!=="win32"?t:`${t}.exe`}function Am(t){for(let e of ym){let n=Tr.join(t,Sm(e));try{let r=process.platform==="win32"?Fr.constants.F_OK:Fr.constants.X_OK;return Fr.accessSync(n,r),!0}catch{}}return!1}function Tm(t,e){let n=wm();if(!n)return[];let r=[],s=process.env.AGENTHIPPO_TOOLS_DIR||process.env.AGENTIDE_TOOLS_DIR;return s?.trim()&&r.push(bm(s)),t?.trim()&&r.push(Tr.join(t,"tools",n)),e?.trim()&&r.push(Tr.join(e,"tools",n)),r}function YI(t,e){let n=Tm(t,e);for(let r of n)if(Am(r))return r}function JI(t={}){let e=wm(),n=Tm(t.extensionPath,t.binaryDirHint),r=n.find(o=>Am(o)),s=r??n[0],i=ym.map(o=>{let a=s??"",c=Tr.join(a,Sm(o)),l=!1;if(s)try{let d=process.platform==="win32"?Fr.constants.F_OK:Fr.constants.X_OK;Fr.accessSync(c,d),l=!0}catch{l=!1}return{name:o,path:c,available:l}});return{platformKey:e,toolsDir:r,tools:i}}function XI(t,e){let n=e.map(o=>o.trim()).filter(Boolean),r=t.split(Tr.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(Tr.delimiter)}function zI(t){return process.platform!=="win32"?"PATH":t&&Object.prototype.hasOwnProperty.call(t,"Path")?"Path":"PATH"}var QI=3e4,wi;async function Em(t){try{let e=process.platform==="win32"?Fr.constants.F_OK:Fr.constants.X_OK;return await Fr.promises.access(t,e),!0}catch{return!1}}function bm(t){return t.trim().replace(/^"|"$/g,"")}async function ZI(t){let e=t.configuredPath?.trim();if(e){let r=bm(e);if(await Em(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(Tr.join(t.extensionPath,"dist",`${o}${a}`));for(let o of i)if(await Em(o))return{path:o,source:"bundled"}}t.forceRefresh&&(0,cd.clearBinaryCache)(Nc.AGENTIDE_CLI_NAME);let n=await(0,cd.findBinaryCached)(Nc.AGENTIDE_CLI_NAME,(0,cd.getCommonBinaryPaths)(Nc.AGENTIDE_CLI_NAME));return n?{path:n,source:"path"}:{source:"not_found"}}async function eP(t){try{let e=await Om(t,["--version"],{timeoutMs:5e3});return e.code!==0?void 0:e.stdout.trim().split(/\r?\n/)[0]||void 0}catch{return}}async function tP(t={}){let e=Date.now();if(!t.forceRefresh&&wi&&e-wi.lastCheckedAt<QI)return wi;let n=await ZI(t);if(!n.path)return wi={installed:!1,source:"not_found",lastCheckedAt:e,error:t.configuredPath?`Configured path not found: ${t.configuredPath}`:void 0},wi;let r=await eP(n.path);return wi={installed:!0,path:n.path,version:r,source:n.source,lastCheckedAt:e},wi}function vm(t){let e=t.chatSessionId?.trim(),n=t.gatewaySessionKey?.trim();if(!e&&!n)return{};let r={};e&&(r[We.AGENTIDE_CHAT_SESSION_ID_ENV]=e,r[We.AGENTHIPPO_CHAT_SESSION_ID_ENV]=e);let s=(0,mm.resolveGatewayOutboundFilePath)({workspaceRoot:t.workspaceRoot,gatewaySessionKey:n,chatSessionId:n?void 0:e});return s&&(r[mm.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV]=s),r}function nP(t){let e={AGENTHIPPO_WORKSPACE_ROOT:t.workspaceRoot,AGENTHIPPO_ACTIVE_AGENT:t.agentId,...vm({workspaceRoot:t.workspaceRoot,chatSessionId:t.chatSessionId})};if(!t.omitGatewayToken&&!process.env.AGENTHIPPO_EGRESS_URL?.trim()){let i=_m(t.baseEnv);i&&(e[We.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(Tr.dirname(i.rgPath))}catch{}if(t.cliPath?.trim()){let i=t.cliPath.trim();e.AGENTHIPPO_CLI_PATH=i,n.push(Tr.dirname(i))}let r=t.cliPath?.trim()?Tr.dirname(t.cliPath.trim()):void 0,s=YI(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=zI(t.baseEnv),o=t.baseEnv?.[i]??t.baseEnv?.PATH??t.baseEnv?.Path??"";e[i]=XI(o,n)}return e}function rP(){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 sP(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 Om(t,e,n){return await new Promise((r,s)=>{let i=(0,qI.spawn)(t,e,{cwd:n?.cwd,env:{...process.env,...n?.env??{}},shell:!1}),o="",a="",c=!1,l=n?.timeoutMs??6e4,d=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(d),s(u))}),i.on("close",u=>{c||(c=!0,clearTimeout(d),r({code:u??1,stdout:o,stderr:a}))})})}});var Rc=S(Qn=>{"use strict";Object.defineProperty(Qn,"__esModule",{value:!0});Qn.RevocationUnsupportedError=Qn.SANDBOX_PROVIDER_KEY_ENV=Qn.SANDBOX_TIER_ENV=void 0;Qn.sandboxHoldsProviderKey=iP;Qn.isContainerSandbox=oP;Qn.SANDBOX_TIER_ENV="AGENTHIPPO_SANDBOX_TIER";Qn.SANDBOX_PROVIDER_KEY_ENV="AGENTHIPPO_SANDBOX_PROVIDER_KEY";function iP(t=process.env){return t[Qn.SANDBOX_PROVIDER_KEY_ENV]==="1"}function oP(t=process.env){return Number(t[Qn.SANDBOX_TIER_ENV])>=2}var ud=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"}};Qn.RevocationUnsupportedError=ud});var Vm=S(er=>{"use strict";var aP=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]})),cP=er&&er.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lP=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"&&aP(n,e,r[s]);return cP(n,e),n}})();Object.defineProperty(er,"__esModule",{value:!0});er.CodexEngine=void 0;er.resolveCodexReasoningEffort=Bm;er.registerNewFilesWithTracker=Fm;var Zn=require("fs"),yn=lP(require("path")),Im=Fo(),uP=Ka(),dP=Xa(),Cc=hi(),rt=on(),Pm=Ju(),dd=gi(),Si=nd(),fP=ps(),pP=br(),Nm=Rc(),gP="agentide-litellm",hP="agentide-custom",fd="AGENTIDE_ANALYTICS_SESSION_ID",pd="AGENTIDE_ANALYTICS_USER_ID",Rm="AGENTIDE_ANALYTICS_PROJECT_ID",Cm="AGENTIDE_ANALYTICS_AGENT_ID",km="AGENTIDE_ANALYTICS_AGENT_VERSION",$m="AGENTIDE_ANALYTICS_SOURCE",Dm="AGENTIDE_ANALYTICS_ENGINE",Lm="AGENTIDE_ANALYTICS_REQUEST_ID",Mm="AGENTIDE_ANALYTICS_POLICY_VERSION",Gm="AGENTIDE_ANALYTICS_PACK_DIGEST",Um="AGENTIDE_ANALYTICS_ENGINE_VERSION",Hm="AGENTIDE_ANALYTICS_TIER",jm="AGENTIDE_ANALYTICS_INSTANCE_ID";function Bm(t){let e=t?.trim();return e&&uP.ENGINE_EFFORTS.codex.includes(e)?e:"medium"}var mP=21,EP="AGENTIDE_CONTEXT_EXPORT_PATH",_P="AGENTIDE_TERMINAL_LOG_PATH";async function Fm(t,e,n){if(e.appliesEdits!==!1)for(let r of t)try{if((0,rt.isBinaryFile)(r)||!await(0,rt.pathExists)(r))continue;let s=await Zn.promises.readFile(r,"utf-8");try{await Zn.promises.unlink(r),await e.applyEdit(n,r,s,!0)}finally{await(0,rt.pathExists)(r)||await Zn.promises.writeFile(r,s,"utf-8")}}catch{}}function xm(t){return t.type==="item.started"||t.type==="item.updated"||t.type==="item.completed"}var gd=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,d=(0,rt.resolveApiRouting)(n,this.config,"openai"),u=d.apiKey,f=d.openaiBaseUrl,p=d.useLiteLLM,g=n.sessionId,m=n.analyticsUserId,h=(0,Cc.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),_=f&&f!=="https://api.openai.com/v1",E=p?"LiteLLM proxy":_?"custom provider":"direct OpenAI";o.info(`[AgentIDE] Codex routing: ${E}, baseUrl=${f||"default"}, workspaceRoot=${n.workspaceRoot}`);let O=l.toLowerCase().includes("claude");o.info(`[AgentIDE] Codex wire_api=responses (model=${l})`),O&&(p||_)&&o.info("[AgentIDE] Codex note: selected model appears to be Claude via proxy; reasoning summaries depend on provider support over the Responses API.");let L={...process.env,...s.cliEnvPatch??{},OPENAI_LOG:"debug"};delete L[pP.OPENCLAW_GATEWAY_TOKEN_ENV],delete L.AGENTHIPPO_DATA_PLANE_TOKEN;let A=g?.trim(),I=n.contextSessionId?.trim()||A;I&&(L[EP]=yn.join(n.workspaceRoot,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",I,"context.md"),L[_P]=yn.join(n.workspaceRoot,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",I,"terminal.md"));let b=n.agentPackId??"default",N=(0,Si.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,b,n.agentPackVersion),P=(0,Si.userScopedEngineHomeFromKey)(N.codexHome,(0,fP.resolveEngineHomeUserKey)(n.engineHomeUserKey));L.CODEX_HOME=P,await Zn.promises.mkdir(P,{recursive:!0}),L.AGENT_ID=b,n.agentPackVersion&&(L.AGENTIDE_AGENT_VERSION=n.agentPackVersion),b!=="default"?o.info(`[AgentIDE] Codex using agent: ${b}, CODEX_HOME=${P} (agent-isolated)`):o.info(`[AgentIDE] Codex using default agent, CODEX_HOME=${P}`);let v=_?f:void 0;await this.ensureCodexConfig(p,v,l,n.workspaceRoot,n.additionalDirectories??[],o,P,b,s.permissionHandler instanceof dP.AutoApprovePermissionHandler),p&&P&&(m?.trim()&&(L[pd]=m.trim()),g?.trim()&&(L[fd]=g.trim()),h?.trim()&&(L[Rm]=h.trim()),L[Cm]=b,L[km]=n.agentPackVersion??"workspace",L[$m]="agenthippo",L[Dm]="codex",n.requestId&&(L[Lm]=n.requestId),n.policyVersion?.trim()&&(L[Mm]=n.policyVersion.trim()),n.packDigest?.trim()&&(L[Gm]=n.packDigest.trim()),n.engineVersion?.trim()&&(L[Um]=n.engineVersion.trim()),n.tier!==void 0&&(L[Hm]=String(n.tier)),n.instanceId?.trim()&&(L[jm]=n.instanceId.trim())),_&&u&&(L.CODEX_API_KEY=u),_&&(L.OPENAI_BASE_URL=f,o.info(`[AgentIDE] Using custom OpenAI base URL: ${f}`),(0,rt.applyLocalTlsBypass)(L,f)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS (Codex)"));let F=(0,dd.buildConversationKey)("codex",n);o.info(`[AgentIDE] Codex conversationKey=${F.key} (chatSessionId=${F.chatSessionId}, signature=${F.signatureHash}${F.isEphemeral?", ephemeral":""})`),await(0,dd.withConversationLock)(F.key,async()=>{await r.progress("Thinking...");let B=n.permissions??Pm.DEFAULT_PERMISSIONS;o.info(`[AgentIDE] Codex permissions: fileAccess=${B.fileAccess}`);let re=[n.workspaceRoot,...n.additionalDirectories??[]],X=(0,Pm.toCodexOptions)(B,re);(0,Nm.isContainerSandbox)()&&(X.sandboxMode="danger-full-access"),o.info(`[AgentIDE] Codex mapped: sandboxMode=${X.sandboxMode}, approvalPolicy=${X.approvalPolicy}`);let te=n.workspaceRoot,Pe={model:l,sandboxMode:X.sandboxMode,approvalPolicy:X.approvalPolicy,additionalDirectories:X.additionalDirectories,workingDirectory:te,skipGitRepoCheck:!0,modelReasoningEffort:Bm((0,rt.getAgentideEngineSettings)(s?.configProvider).effort)};o.info(`[AgentIDE] Codex modelReasoningEffort=${Pe.modelReasoningEffort??"default"}`);let Ge=_?void 0:u,xe=new c({apiKey:Ge,env:L,...this.config.codexExecutablePath?{codexPathOverride:this.config.codexExecutablePath}:{}}),Mt=(0,Cc.getPersistedSessionId)("codex",F.key),Et;if(Mt)try{Et=xe.resumeThread(Mt,Pe),o.info(`[AgentIDE] Codex resuming thread: ${Mt} (model: ${l})`)}catch(Z){o.warn(`[AgentIDE] Failed to resume Codex thread (${Mt}): ${Z instanceof Error?Z.message:String(Z)}. Starting new thread.`),Et=xe.startThread(Pe)}else Et=xe.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 hr;try{({events:hr}=await Et.runStreamed(e,{signal:i}))}catch(Z){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted while starting turn");return}throw Z}let Be=new Map,it=new Map,On=new Map,mr=0,Ze=0,Zt=0,ii=!1,Hr=Z=>Z.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160);try{for await(let Z of hr){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted; stopping event loop");return}let oi=xm(Z)?Z.item.type:void 0;if(o.debug(`[AgentIDE] Codex event: ${Z.type}${oi?` (item: ${oi})`:""}`),Z.type==="thread.started"){let se=Z.thread_id;o.info(`[AgentIDE] Codex thread started: ${se}`),await(0,Cc.persistSessionIfNeeded)("codex",F,se,n);continue}if(Z.type==="turn.failed")throw await r.error(Z.error?.message||"Codex turn failed"),new Error(Z.error?.message||"Codex turn failed");if(Z.type==="error"){let D=/^Reconnecting\.\.\. \d+\/\d+/.exec(Z.message??"");if(D){o.warn(`[AgentIDE] Codex ${Z.message}`),await r.progress(D[0]);continue}throw await r.error(Z.message||"Codex stream error"),new Error(Z.message||"Codex stream error")}if(Z.type==="turn.completed"){o.info(`[AgentIDE] Codex usage: input=${Z.usage.input_tokens}, cached=${Z.usage.cached_input_tokens}, output=${Z.usage.output_tokens}`);continue}if(xm(Z)){let{item:D}=Z;if(D.type==="reasoning"){Zt++;let se=D.text??"",ie=(0,rt.computeTextDelta)(D.id,D.text??"",Be);ie?(mr++,Ze+=ie.length,mr<=3&&o.debug(`[AgentIDE] Codex reasoning delta #${mr} (${ie.length} chars): ${Hr(ie)}`),await r.thinking(ie)):!ii&&se.length===0&&(ii=!0,o.debug("[AgentIDE] Codex reasoning item observed but text is empty so far."))}else if(D.type==="agent_message"){let se=(0,rt.computeTextDelta)(D.id,D.text??"",Be);se&&await r.text(se)}else if(D.type==="command_execution"){if(Z.type==="item.started"&&(await r.thinking(`**Running command**
47
+ `;await Yo.promises.writeFile(t,s,"utf8")}catch{}}async function im(t){try{await Yo.promises.unlink(t)}catch{}}async function _P(t){let e=await sm(t);return e?Tc(e.pid)?e:(await im(t),null):null}});var am=S(ms=>{"use strict";var yP=ms&&ms.__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=ms&&ms.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),SP=ms&&ms.__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"&&yP(n,e,r[s]);return wP(n,e),n}})();Object.defineProperty(ms,"__esModule",{value:!0});ms.probePort=TP;var AP=SP(require("net"));function TP(t,e="127.0.0.1",n=2e3){return new Promise(r=>{let s=new AP.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 id=S(zn=>{"use strict";var bP=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]})),vP=zn&&zn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),sd=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"&&bP(n,e,r[s]);return vP(n,e),n}})();Object.defineProperty(zn,"__esModule",{value:!0});zn.findBinary=cm;zn.findBinaryCached=kP;zn.getCommonBinaryPaths=$P;zn.clearBinaryCache=DP;var OP=require("child_process"),PP=require("util"),IP=require("fs"),bc=sd(require("fs")),$n=sd(require("path")),NP=sd(require("os")),RP=(0,PP.promisify)(OP.exec),vc=process.platform==="win32",CP=6e4,Oc=new Map;async function cm(t,e=5e3){try{let n=vc?`where ${t}`:`which ${t}`,{stdout:r}=await RP(n,{timeout:e});return r.trim().split(`
48
+ `)[0]||void 0}catch{return}}async function kP(t,e=[],n=CP){let r=Date.now(),s=Oc.get(t);if(s&&r-s.timestamp<n)return s.path;let i=await cm(t);if(!i)for(let o of e)try{await IP.promises.access(o,vc?bc.constants.F_OK:bc.constants.X_OK),i=o;break}catch{}return Oc.set(t,{path:i,timestamp:r}),i}function $P(t){let e=NP.homedir(),n=vc?`${t}.cmd`:t;if(vc){let o=process.env.LOCALAPPDATA||$n.join(e,"AppData","Local");return[$n.join(o,"AgentHippo","bin",n),$n.join(e,"AppData","Local","Programs",t,`${t}.exe`),$n.join(e,"AppData","Roaming","npm",n),$n.join(e,"AppData","Local","pnpm",n),$n.join(e,".npm-global",n)]}let r=[$n.join(e,".local","bin",t),$n.join(e,"Library","pnpm",t),$n.join(e,".local","share","pnpm",t),$n.join(e,".npm-global","bin",t),"/opt/homebrew/bin/"+t,"/usr/local/bin/"+t,"/usr/bin/"+t],s=process.env.NVM_DIR||$n.join(e,".nvm"),i=$n.join(s,"versions","node");if(bc.existsSync(i))try{let o=bc.readdirSync(i,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort().reverse();for(let a of o)r.push($n.join(i,a,"bin",t))}catch{}return r}function DP(t){t?Oc.delete(t):Oc.clear()}});var Pc=S(Ar=>{"use strict";var LP=Ar&&Ar.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),MP=Ar&&Ar.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),od=Ar&&Ar.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&LP(n,e,r[s]);return MP(n,e),n}})();Object.defineProperty(Ar,"__esModule",{value:!0});Ar.getNodeBinaryCandidates=hm;Ar.resolveNodeBinary=xP;Ar.prependPathDir=BP;var _i=od(require("fs")),fm=od(require("os")),no=od(require("path")),lm=id(),pm=process.platform==="win32",GP=pm?"node.exe":"node",um=no.join(fm.homedir(),".agenthippo","gateway","install.json"),dm=no.join(fm.homedir(),".agenthippo","tools","node");function gm(t){try{let e=pm?_i.constants.F_OK:_i.constants.X_OK;return _i.accessSync(t,e),!0}catch{return!1}}function UP(){try{if(!_i.existsSync(um))return;let t=_i.readFileSync(um,"utf8").replace(/^\uFEFF/,""),n=JSON.parse(t).nodePath?.trim();return n&&gm(n)?n:void 0}catch{return}}function HP(){if(!_i.existsSync(dm))return[];let t=[],e=(n,r)=>{if(r>4)return;let s;try{s=_i.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){let o=no.join(n,i.name);i.isDirectory()?e(o,r+1):i.isFile()&&i.name===GP&&n.endsWith(`${no.sep}bin`)&&t.push(o)}};return e(dm,0),t.sort().reverse()}function jP(t){let e=new Set,n=[];for(let r of t){let s=no.resolve(r);e.has(s)||!gm(s)||(e.add(s),n.push(s))}return n}function hm(){let t=[];process.env.NODE_BIN?.trim()&&t.push(process.env.NODE_BIN.trim());let e=UP();return e&&t.push(e),t.push(...HP()),process.env.npm_node_execpath?.trim()&&t.push(process.env.npm_node_execpath.trim()),jP(t)}async function xP(){let t=hm();if(t.length>0)return t[0];let e=await(0,lm.findBinaryCached)("node",(0,lm.getCommonBinaryPaths)("node"));return e||"node"}function BP(t,e){if(!e?.trim())return;let n=e.trim(),r=t.PATH?.trim();t.PATH=r?`${n}${no.delimiter}${r}`:n}});var Xo=S(ue=>{"use strict";Object.defineProperty(ue,"__esModule",{value:!0});ue.prependPathDir=ue.getNodeBinaryCandidates=ue.resolveNodeBinary=ue.clearBinaryCache=ue.getCommonBinaryPaths=ue.findBinaryCached=ue.findBinary=ue.probePort=ue.DIRS=ue.PID_FILES=ue.getAnalyticsScriptsDir=ue.getAgentidePath=ue.getAgentideHome=ue.checkPidFileWithCleanup=ue.removePidFile=ue.writePidFile=ue.readPidFile=ue.isPidFileProcessRunning=ue.isProcessRunningAsync=ue.isProcessRunning=void 0;var yi=om();Object.defineProperty(ue,"isProcessRunning",{enumerable:!0,get:function(){return yi.isProcessRunning}});Object.defineProperty(ue,"isProcessRunningAsync",{enumerable:!0,get:function(){return yi.isProcessRunningAsync}});Object.defineProperty(ue,"isPidFileProcessRunning",{enumerable:!0,get:function(){return yi.isPidFileProcessRunning}});Object.defineProperty(ue,"readPidFile",{enumerable:!0,get:function(){return yi.readPidFile}});Object.defineProperty(ue,"writePidFile",{enumerable:!0,get:function(){return yi.writePidFile}});Object.defineProperty(ue,"removePidFile",{enumerable:!0,get:function(){return yi.removePidFile}});Object.defineProperty(ue,"checkPidFileWithCleanup",{enumerable:!0,get:function(){return yi.checkPidFileWithCleanup}});var Jo=fi();Object.defineProperty(ue,"getAgentideHome",{enumerable:!0,get:function(){return Jo.getAgentideHome}});Object.defineProperty(ue,"getAgentidePath",{enumerable:!0,get:function(){return Jo.getAgentidePath}});Object.defineProperty(ue,"getAnalyticsScriptsDir",{enumerable:!0,get:function(){return Jo.getAnalyticsScriptsDir}});Object.defineProperty(ue,"PID_FILES",{enumerable:!0,get:function(){return Jo.PID_FILES}});Object.defineProperty(ue,"DIRS",{enumerable:!0,get:function(){return Jo.DIRS}});var FP=am();Object.defineProperty(ue,"probePort",{enumerable:!0,get:function(){return FP.probePort}});var Ic=id();Object.defineProperty(ue,"findBinary",{enumerable:!0,get:function(){return Ic.findBinary}});Object.defineProperty(ue,"findBinaryCached",{enumerable:!0,get:function(){return Ic.findBinaryCached}});Object.defineProperty(ue,"getCommonBinaryPaths",{enumerable:!0,get:function(){return Ic.getCommonBinaryPaths}});Object.defineProperty(ue,"clearBinaryCache",{enumerable:!0,get:function(){return Ic.clearBinaryCache}});var ad=Pc();Object.defineProperty(ue,"resolveNodeBinary",{enumerable:!0,get:function(){return ad.resolveNodeBinary}});Object.defineProperty(ue,"getNodeBinaryCandidates",{enumerable:!0,get:function(){return ad.getNodeBinaryCandidates}});Object.defineProperty(ue,"prependPathDir",{enumerable:!0,get:function(){return ad.prependPathDir}})});var br=S(We=>{"use strict";var VP=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]})),WP=We&&We.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ld=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"&&VP(n,e,r[s]);return WP(n,e),n}})();Object.defineProperty(We,"__esModule",{value:!0});We.OPENCLAW_GATEWAY_TOKEN_ENV=We.AGENTHIPPO_CHAT_SESSION_ID_ENV=We.AGENTIDE_CHAT_SESSION_ID_ENV=void 0;We.readOpenClawGatewayToken=_m;We.getBundledToolsHealth=JP;We.getCliHealth=tI;We.buildSessionEnvPatch=vm;We.buildCliEnvPatch=nI;We.readProvenanceEnvFromProcess=rI;We.buildProvenanceEnv=sI;We.runCli=Om;var Fr=ld(require("fs")),KP=ld(require("os")),Tr=ld(require("path")),qP=require("child_process"),Nc=et(),mm=Ac(),cd=Xo();We.AGENTIDE_CHAT_SESSION_ID_ENV="AGENTIDE_CHAT_SESSION_ID";We.AGENTHIPPO_CHAT_SESSION_ID_ENV="AGENTHIPPO_CHAT_SESSION_ID";We.OPENCLAW_GATEWAY_TOKEN_ENV="OPENCLAW_GATEWAY_TOKEN";function _m(t){let e=t?.OPENCLAW_GATEWAY_TOKEN?.trim()||process.env.OPENCLAW_GATEWAY_TOKEN?.trim();if(e)return e;try{let n=Tr.join(KP.homedir(),".openclaw","openclaw.json"),r=Fr.readFileSync(n,"utf-8"),i=JSON.parse(r).gateway?.auth?.token;return typeof i=="string"?i.trim():void 0}catch{return}}var ym=["rg","sg","tree-sitter"];function wm(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 Sm(t){return process.platform!=="win32"?t:`${t}.exe`}function Am(t){for(let e of ym){let n=Tr.join(t,Sm(e));try{let r=process.platform==="win32"?Fr.constants.F_OK:Fr.constants.X_OK;return Fr.accessSync(n,r),!0}catch{}}return!1}function Tm(t,e){let n=wm();if(!n)return[];let r=[],s=process.env.AGENTHIPPO_TOOLS_DIR||process.env.AGENTIDE_TOOLS_DIR;return s?.trim()&&r.push(bm(s)),t?.trim()&&r.push(Tr.join(t,"tools",n)),e?.trim()&&r.push(Tr.join(e,"tools",n)),r}function YP(t,e){let n=Tm(t,e);for(let r of n)if(Am(r))return r}function JP(t={}){let e=wm(),n=Tm(t.extensionPath,t.binaryDirHint),r=n.find(o=>Am(o)),s=r??n[0],i=ym.map(o=>{let a=s??"",c=Tr.join(a,Sm(o)),l=!1;if(s)try{let d=process.platform==="win32"?Fr.constants.F_OK:Fr.constants.X_OK;Fr.accessSync(c,d),l=!0}catch{l=!1}return{name:o,path:c,available:l}});return{platformKey:e,toolsDir:r,tools:i}}function XP(t,e){let n=e.map(o=>o.trim()).filter(Boolean),r=t.split(Tr.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(Tr.delimiter)}function zP(t){return process.platform!=="win32"?"PATH":t&&Object.prototype.hasOwnProperty.call(t,"Path")?"Path":"PATH"}var QP=3e4,wi;async function Em(t){try{let e=process.platform==="win32"?Fr.constants.F_OK:Fr.constants.X_OK;return await Fr.promises.access(t,e),!0}catch{return!1}}function bm(t){return t.trim().replace(/^"|"$/g,"")}async function ZP(t){let e=t.configuredPath?.trim();if(e){let r=bm(e);if(await Em(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(Tr.join(t.extensionPath,"dist",`${o}${a}`));for(let o of i)if(await Em(o))return{path:o,source:"bundled"}}t.forceRefresh&&(0,cd.clearBinaryCache)(Nc.AGENTIDE_CLI_NAME);let n=await(0,cd.findBinaryCached)(Nc.AGENTIDE_CLI_NAME,(0,cd.getCommonBinaryPaths)(Nc.AGENTIDE_CLI_NAME));return n?{path:n,source:"path"}:{source:"not_found"}}async function eI(t){try{let e=await Om(t,["--version"],{timeoutMs:5e3});return e.code!==0?void 0:e.stdout.trim().split(/\r?\n/)[0]||void 0}catch{return}}async function tI(t={}){let e=Date.now();if(!t.forceRefresh&&wi&&e-wi.lastCheckedAt<QP)return wi;let n=await ZP(t);if(!n.path)return wi={installed:!1,source:"not_found",lastCheckedAt:e,error:t.configuredPath?`Configured path not found: ${t.configuredPath}`:void 0},wi;let r=await eI(n.path);return wi={installed:!0,path:n.path,version:r,source:n.source,lastCheckedAt:e},wi}function vm(t){let e=t.chatSessionId?.trim(),n=t.gatewaySessionKey?.trim();if(!e&&!n)return{};let r={};e&&(r[We.AGENTIDE_CHAT_SESSION_ID_ENV]=e,r[We.AGENTHIPPO_CHAT_SESSION_ID_ENV]=e);let s=(0,mm.resolveGatewayOutboundFilePath)({workspaceRoot:t.workspaceRoot,gatewaySessionKey:n,chatSessionId:n?void 0:e});return s&&(r[mm.AGENTHIPPO_GATEWAY_OUTBOUND_FILE_ENV]=s),r}function nI(t){let e={AGENTHIPPO_WORKSPACE_ROOT:t.workspaceRoot,AGENTHIPPO_ACTIVE_AGENT:t.agentId,...vm({workspaceRoot:t.workspaceRoot,chatSessionId:t.chatSessionId})};if(!t.omitGatewayToken&&!process.env.AGENTHIPPO_EGRESS_URL?.trim()){let i=_m(t.baseEnv);i&&(e[We.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(Tr.dirname(i.rgPath))}catch{}if(t.cliPath?.trim()){let i=t.cliPath.trim();e.AGENTHIPPO_CLI_PATH=i,n.push(Tr.dirname(i))}let r=t.cliPath?.trim()?Tr.dirname(t.cliPath.trim()):void 0,s=YP(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=zP(t.baseEnv),o=t.baseEnv?.[i]??t.baseEnv?.PATH??t.baseEnv?.Path??"";e[i]=XP(o,n)}return e}function rI(){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 sI(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 Om(t,e,n){return await new Promise((r,s)=>{let i=(0,qP.spawn)(t,e,{cwd:n?.cwd,env:{...process.env,...n?.env??{}},shell:!1}),o="",a="",c=!1,l=n?.timeoutMs??6e4,d=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(d),s(u))}),i.on("close",u=>{c||(c=!0,clearTimeout(d),r({code:u??1,stdout:o,stderr:a}))})})}});var Rc=S(Qn=>{"use strict";Object.defineProperty(Qn,"__esModule",{value:!0});Qn.RevocationUnsupportedError=Qn.SANDBOX_PROVIDER_KEY_ENV=Qn.SANDBOX_TIER_ENV=void 0;Qn.sandboxHoldsProviderKey=iI;Qn.isContainerSandbox=oI;Qn.SANDBOX_TIER_ENV="AGENTHIPPO_SANDBOX_TIER";Qn.SANDBOX_PROVIDER_KEY_ENV="AGENTHIPPO_SANDBOX_PROVIDER_KEY";function iI(t=process.env){return t[Qn.SANDBOX_PROVIDER_KEY_ENV]==="1"}function oI(t=process.env){return Number(t[Qn.SANDBOX_TIER_ENV])>=2}var ud=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"}};Qn.RevocationUnsupportedError=ud});var Vm=S(er=>{"use strict";var aI=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]})),cI=er&&er.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lI=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"&&aI(n,e,r[s]);return cI(n,e),n}})();Object.defineProperty(er,"__esModule",{value:!0});er.CodexEngine=void 0;er.resolveCodexReasoningEffort=Bm;er.registerNewFilesWithTracker=Fm;var Zn=require("fs"),yn=lI(require("path")),Pm=Fo(),uI=Ka(),dI=Xa(),Cc=hi(),rt=on(),Im=Ju(),dd=gi(),Si=nd(),fI=ps(),pI=br(),Nm=Rc(),gI="agentide-litellm",hI="agentide-custom",fd="AGENTIDE_ANALYTICS_SESSION_ID",pd="AGENTIDE_ANALYTICS_USER_ID",Rm="AGENTIDE_ANALYTICS_PROJECT_ID",Cm="AGENTIDE_ANALYTICS_AGENT_ID",km="AGENTIDE_ANALYTICS_AGENT_VERSION",$m="AGENTIDE_ANALYTICS_SOURCE",Dm="AGENTIDE_ANALYTICS_ENGINE",Lm="AGENTIDE_ANALYTICS_REQUEST_ID",Mm="AGENTIDE_ANALYTICS_POLICY_VERSION",Gm="AGENTIDE_ANALYTICS_PACK_DIGEST",Um="AGENTIDE_ANALYTICS_ENGINE_VERSION",Hm="AGENTIDE_ANALYTICS_TIER",jm="AGENTIDE_ANALYTICS_INSTANCE_ID";function Bm(t){let e=t?.trim();return e&&uI.ENGINE_EFFORTS.codex.includes(e)?e:"medium"}var mI=21,EI="AGENTIDE_CONTEXT_EXPORT_PATH",_I="AGENTIDE_TERMINAL_LOG_PATH";async function Fm(t,e,n){if(e.appliesEdits!==!1)for(let r of t)try{if((0,rt.isBinaryFile)(r)||!await(0,rt.pathExists)(r))continue;let s=await Zn.promises.readFile(r,"utf-8");try{await Zn.promises.unlink(r),await e.applyEdit(n,r,s,!0)}finally{await(0,rt.pathExists)(r)||await Zn.promises.writeFile(r,s,"utf-8")}}catch{}}function xm(t){return t.type==="item.started"||t.type==="item.updated"||t.type==="item.completed"}var gd=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,d=(0,rt.resolveApiRouting)(n,this.config,"openai"),u=d.apiKey,f=d.openaiBaseUrl,p=d.useLiteLLM,g=n.sessionId,m=n.analyticsUserId,h=(0,Cc.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),_=f&&f!=="https://api.openai.com/v1",E=p?"LiteLLM proxy":_?"custom provider":"direct OpenAI";o.info(`[AgentIDE] Codex routing: ${E}, baseUrl=${f||"default"}, workspaceRoot=${n.workspaceRoot}`);let O=l.toLowerCase().includes("claude");o.info(`[AgentIDE] Codex wire_api=responses (model=${l})`),O&&(p||_)&&o.info("[AgentIDE] Codex note: selected model appears to be Claude via proxy; reasoning summaries depend on provider support over the Responses API.");let L={...process.env,...s.cliEnvPatch??{},OPENAI_LOG:"debug"};delete L[pI.OPENCLAW_GATEWAY_TOKEN_ENV],delete L.AGENTHIPPO_DATA_PLANE_TOKEN;let A=g?.trim(),P=n.contextSessionId?.trim()||A;P&&(L[EI]=yn.join(n.workspaceRoot,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",P,"context.md"),L[_I]=yn.join(n.workspaceRoot,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",P,"terminal.md"));let b=n.agentPackId??"default",N=(0,Si.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,b,n.agentPackVersion),I=(0,Si.userScopedEngineHomeFromKey)(N.codexHome,(0,fI.resolveEngineHomeUserKey)(n.engineHomeUserKey));L.CODEX_HOME=I,await Zn.promises.mkdir(I,{recursive:!0}),L.AGENT_ID=b,n.agentPackVersion&&(L.AGENTIDE_AGENT_VERSION=n.agentPackVersion),b!=="default"?o.info(`[AgentIDE] Codex using agent: ${b}, CODEX_HOME=${I} (agent-isolated)`):o.info(`[AgentIDE] Codex using default agent, CODEX_HOME=${I}`);let v=_?f:void 0;await this.ensureCodexConfig(p,v,l,n.workspaceRoot,n.additionalDirectories??[],o,I,b,s.permissionHandler instanceof dI.AutoApprovePermissionHandler),p&&I&&(m?.trim()&&(L[pd]=m.trim()),g?.trim()&&(L[fd]=g.trim()),h?.trim()&&(L[Rm]=h.trim()),L[Cm]=b,L[km]=n.agentPackVersion??"workspace",L[$m]="agenthippo",L[Dm]="codex",n.requestId&&(L[Lm]=n.requestId),n.policyVersion?.trim()&&(L[Mm]=n.policyVersion.trim()),n.packDigest?.trim()&&(L[Gm]=n.packDigest.trim()),n.engineVersion?.trim()&&(L[Um]=n.engineVersion.trim()),n.tier!==void 0&&(L[Hm]=String(n.tier)),n.instanceId?.trim()&&(L[jm]=n.instanceId.trim())),_&&u&&(L.CODEX_API_KEY=u),_&&(L.OPENAI_BASE_URL=f,o.info(`[AgentIDE] Using custom OpenAI base URL: ${f}`),(0,rt.applyLocalTlsBypass)(L,f)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS (Codex)"));let F=(0,dd.buildConversationKey)("codex",n);o.info(`[AgentIDE] Codex conversationKey=${F.key} (chatSessionId=${F.chatSessionId}, signature=${F.signatureHash}${F.isEphemeral?", ephemeral":""})`),await(0,dd.withConversationLock)(F.key,async()=>{await r.progress("Thinking...");let B=n.permissions??Im.DEFAULT_PERMISSIONS;o.info(`[AgentIDE] Codex permissions: fileAccess=${B.fileAccess}`);let re=[n.workspaceRoot,...n.additionalDirectories??[]],X=(0,Im.toCodexOptions)(B,re);(0,Nm.isContainerSandbox)()&&(X.sandboxMode="danger-full-access"),o.info(`[AgentIDE] Codex mapped: sandboxMode=${X.sandboxMode}, approvalPolicy=${X.approvalPolicy}`);let te=n.workspaceRoot,Ie={model:l,sandboxMode:X.sandboxMode,approvalPolicy:X.approvalPolicy,additionalDirectories:X.additionalDirectories,workingDirectory:te,skipGitRepoCheck:!0,modelReasoningEffort:Bm((0,rt.getAgentideEngineSettings)(s?.configProvider).effort)};o.info(`[AgentIDE] Codex modelReasoningEffort=${Ie.modelReasoningEffort??"default"}`);let Ge=_?void 0:u,xe=new c({apiKey:Ge,env:L,...this.config.codexExecutablePath?{codexPathOverride:this.config.codexExecutablePath}:{}}),Mt=(0,Cc.getPersistedSessionId)("codex",F.key),Et;if(Mt)try{Et=xe.resumeThread(Mt,Ie),o.info(`[AgentIDE] Codex resuming thread: ${Mt} (model: ${l})`)}catch(Z){o.warn(`[AgentIDE] Failed to resume Codex thread (${Mt}): ${Z instanceof Error?Z.message:String(Z)}. Starting new thread.`),Et=xe.startThread(Ie)}else Et=xe.startThread(Ie),o.info(`[AgentIDE] Codex starting new thread (model: ${l})`);if(i?.aborted){o.info("[AgentIDE] Codex stream cancelled before starting turn");return}let hr;try{({events:hr}=await Et.runStreamed(e,{signal:i}))}catch(Z){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted while starting turn");return}throw Z}let Be=new Map,it=new Map,On=new Map,mr=0,Ze=0,Zt=0,ii=!1,Hr=Z=>Z.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160);try{for await(let Z of hr){if(i?.aborted){o.info("[AgentIDE] Codex stream aborted; stopping event loop");return}let oi=xm(Z)?Z.item.type:void 0;if(o.debug(`[AgentIDE] Codex event: ${Z.type}${oi?` (item: ${oi})`:""}`),Z.type==="thread.started"){let se=Z.thread_id;o.info(`[AgentIDE] Codex thread started: ${se}`),await(0,Cc.persistSessionIfNeeded)("codex",F,se,n);continue}if(Z.type==="turn.failed")throw await r.error(Z.error?.message||"Codex turn failed"),new Error(Z.error?.message||"Codex turn failed");if(Z.type==="error"){let D=/^Reconnecting\.\.\. \d+\/\d+/.exec(Z.message??"");if(D){o.warn(`[AgentIDE] Codex ${Z.message}`),await r.progress(D[0]);continue}throw await r.error(Z.message||"Codex stream error"),new Error(Z.message||"Codex stream error")}if(Z.type==="turn.completed"){o.info(`[AgentIDE] Codex usage: input=${Z.usage.input_tokens}, cached=${Z.usage.cached_input_tokens}, output=${Z.usage.output_tokens}`);continue}if(xm(Z)){let{item:D}=Z;if(D.type==="reasoning"){Zt++;let se=D.text??"",ie=(0,rt.computeTextDelta)(D.id,D.text??"",Be);ie?(mr++,Ze+=ie.length,mr<=3&&o.debug(`[AgentIDE] Codex reasoning delta #${mr} (${ie.length} chars): ${Hr(ie)}`),await r.thinking(ie)):!ii&&se.length===0&&(ii=!0,o.debug("[AgentIDE] Codex reasoning item observed but text is empty so far."))}else if(D.type==="agent_message"){let se=(0,rt.computeTextDelta)(D.id,D.text??"",Be);se&&await r.text(se)}else if(D.type==="command_execution"){if(Z.type==="item.started"&&(await r.thinking(`**Running command**
49
49
  \`\`\`bash
50
50
  ${D.command}
51
51
  \`\`\`
@@ -72,27 +72,27 @@ ${se.join(`
72
72
  ${se.join(`
73
73
  `)}
74
74
  `)}if(Z.type==="item.started"||Z.type==="item.completed"){let se=D.items.filter(ie=>ie.completed).length;await r.progress(`[Plan] ${se}/${D.items.length} steps complete`)}}else if(D.type==="error"){let se=D.message||"Codex warning";o.warn(`[AgentIDE] Codex warning: ${se}`),await r.thinking(`**Warning:** ${se}
75
- `)}}}}catch(Z){if(i?.aborted){o.info(`[AgentIDE] Codex stream aborted: ${Z instanceof Error?Z.message:String(Z)}`);return}throw Z}o.info(`[AgentIDE] Codex reasoning summary: items=${Zt}, deltas=${mr}, chars=${Ze}`),Zt===0&&o.debug("[AgentIDE] Codex emitted no reasoning items. This SDK only exposes a reasoning *summary* when available; many runs may have none."),(0,Cc.touchSessionIfNeeded)(F)},{signal:i,timeoutMs:dd.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 d=a??this.config.codexHome;if(!d)return;try{let O=this.getSkillsSignature(s);await this.syncCodexSkillsToCodexHome(d,s,c,o,O)}catch(O){o.warn(`[AgentIDE] Warning: failed to sync skills into $CODEX_HOME: ${O instanceof Error?O.message:String(O)}`)}let u=await this.updateCodexRuntimeInstructionsFile(d,s,i,c,o),f="responses",p=e?"litellm":n?"custom":"openai",g=`${mP}:${p}:${n??""}:${f}:${c}:${u??""}`;if(this.lastWrittenConfigSignature===g)return;await Zn.promises.mkdir(d,{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,Nm.isContainerSandbox)()?['sandbox_mode = "danger-full-access"']:[]];if(n){let O=e?gP:hP,T=e?"AgentIDE LiteLLM":"AgentIDE Custom Provider";m.push("",`model_provider = "${O}"`,"",`[model_providers.${O}]`,`name = "${T}"`,`base_url = ${JSON.stringify(n)}`,'env_key = "CODEX_API_KEY"',`wire_api = "${f}"`,"query_params = {}"),e&&m.push(`env_http_headers = { "x-litellm-metadata-session-id" = "${fd}", "x-litellm-metadata-user-id" = "${pd}", "x-litellm-metadata-project-id" = "${Rm}", "langfuse_session_id" = "${fd}", "langfuse_trace_user_id" = "${pd}", "x-litellm-metadata-agent-id" = "${Cm}", "x-litellm-metadata-agent-version" = "${km}", "x-litellm-metadata-source" = "${$m}", "x-litellm-metadata-engine" = "${Dm}", "x-litellm-metadata-request-id" = "${Lm}", "x-litellm-metadata-policy-version" = "${Mm}", "x-litellm-metadata-pack-digest" = "${Gm}", "x-litellm-metadata-engine-version" = "${Um}", "x-litellm-metadata-tier" = "${Hm}", "x-litellm-metadata-instance-id" = "${jm}" }`)}let h=this.getBundledBasePromptsDir(),w=await(0,Im.loadMcpServers)(c,s,h),_=(0,Im.generateCodexMcpConfig)(w,{autoApprove:l});if(w.length>0){let O=c==="default"?"bundled":`pack:${c}`;o.debug(`[AgentIDE] Codex MCP config (${O}): ${w.length} server(s)`)}let E=m.filter(Boolean).join(`
75
+ `)}}}}catch(Z){if(i?.aborted){o.info(`[AgentIDE] Codex stream aborted: ${Z instanceof Error?Z.message:String(Z)}`);return}throw Z}o.info(`[AgentIDE] Codex reasoning summary: items=${Zt}, deltas=${mr}, chars=${Ze}`),Zt===0&&o.debug("[AgentIDE] Codex emitted no reasoning items. This SDK only exposes a reasoning *summary* when available; many runs may have none."),(0,Cc.touchSessionIfNeeded)(F)},{signal:i,timeoutMs:dd.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 d=a??this.config.codexHome;if(!d)return;try{let O=this.getSkillsSignature(s);await this.syncCodexSkillsToCodexHome(d,s,c,o,O)}catch(O){o.warn(`[AgentIDE] Warning: failed to sync skills into $CODEX_HOME: ${O instanceof Error?O.message:String(O)}`)}let u=await this.updateCodexRuntimeInstructionsFile(d,s,i,c,o),f="responses",p=e?"litellm":n?"custom":"openai",g=`${mI}:${p}:${n??""}:${f}:${c}:${u??""}`;if(this.lastWrittenConfigSignature===g)return;await Zn.promises.mkdir(d,{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,Nm.isContainerSandbox)()?['sandbox_mode = "danger-full-access"']:[]];if(n){let O=e?gI:hI,T=e?"AgentIDE LiteLLM":"AgentIDE Custom Provider";m.push("",`model_provider = "${O}"`,"",`[model_providers.${O}]`,`name = "${T}"`,`base_url = ${JSON.stringify(n)}`,'env_key = "CODEX_API_KEY"',`wire_api = "${f}"`,"query_params = {}"),e&&m.push(`env_http_headers = { "x-litellm-metadata-session-id" = "${fd}", "x-litellm-metadata-user-id" = "${pd}", "x-litellm-metadata-project-id" = "${Rm}", "langfuse_session_id" = "${fd}", "langfuse_trace_user_id" = "${pd}", "x-litellm-metadata-agent-id" = "${Cm}", "x-litellm-metadata-agent-version" = "${km}", "x-litellm-metadata-source" = "${$m}", "x-litellm-metadata-engine" = "${Dm}", "x-litellm-metadata-request-id" = "${Lm}", "x-litellm-metadata-policy-version" = "${Mm}", "x-litellm-metadata-pack-digest" = "${Gm}", "x-litellm-metadata-engine-version" = "${Um}", "x-litellm-metadata-tier" = "${Hm}", "x-litellm-metadata-instance-id" = "${jm}" }`)}let h=this.getBundledBasePromptsDir(),w=await(0,Pm.loadMcpServers)(c,s,h),_=(0,Pm.generateCodexMcpConfig)(w,{autoApprove:l});if(w.length>0){let O=c==="default"?"bundled":`pack:${c}`;o.debug(`[AgentIDE] Codex MCP config (${O}): ${w.length} server(s)`)}let E=m.filter(Boolean).join(`
76
76
  `)+_;await Zn.promises.writeFile(yn.join(d,"config.toml"),E,"utf8"),this.lastWrittenConfigSignature=g,o.info(`[AgentIDE] Codex configured (${p}) at ${d}${n?`, baseUrl=${n}, wire_api=${f}`:""}, model=${r??"unknown"}`)}async updateCodexRuntimeInstructionsFile(e,n,r,s,i){let o=yn.join(n,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"AGENTS.md"),a="";if(await(0,rt.pathExists)(o))a=await Zn.promises.readFile(o,"utf8"),i.debug(`[AgentIDE] Codex instructions from pack: ${s}/AGENTS.md`);else{let h=this.getBundledBasePromptsDir();if(h){let w=yn.join(h,"rules","AGENTS.md");await(0,rt.pathExists)(w)&&(a=await Zn.promises.readFile(w,"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=yn.join(n,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",s,"context.md"),l="";await(0,rt.pathExists)(c)&&(l=await Zn.promises.readFile(c,"utf8"));let d=r.slice().filter(Boolean).sort(),f=["## AgentIDE Runtime Context (managed)","","### Workspace Information","","```json",JSON.stringify({workspaceRoot:n,additionalDirectories:d},null,2),"```"].join(`
77
77
  `),p=[a.trimEnd()];l.trim()&&p.push(l.trimEnd()),p.push(f.trimEnd());let g=p.filter(Boolean).join(`
78
78
 
79
79
  ---
80
80
 
81
81
  `).trimEnd().concat(`
82
- `),m=yn.join(e,"agentide.runtime.md");return await(0,rt.writeFileIfChanged)(m,g),m}async syncCodexSkillsToCodexHome(e,n,r,s,i){let o=yn.join(n,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",r,"skills"),a=yn.join(e,"skills");if(i){let d=this.lastCodexSkillsSignatureByWorkspaceRoot.get(n),u=await(0,rt.pathExists)(a);if(d===i&&u){s.debug(`[AgentIDE] Codex skills unchanged (sig=${i}), skipping $CODEX_HOME sync`);return}}try{await Zn.promises.rm(a,{recursive:!0,force:!0})}catch{}if(!await(0,rt.pathExists)(o))return;await Zn.promises.mkdir(a,{recursive:!0});let c=0,l=await Zn.promises.readdir(o,{withFileTypes:!0});for(let d of l){if(!d.isDirectory()||d.name.startsWith("."))continue;let u=yn.join(o,d.name),f=yn.join(u,"SKILL.md");await(0,rt.pathExists)(f)&&(await(0,rt.copyDirRecursive)(u,yn.join(a,d.name)),c++)}i&&this.lastCodexSkillsSignatureByWorkspaceRoot.set(n,i),s.info(`[AgentIDE] Codex skills synced to $CODEX_HOME: ${c} skill(s)`)}};er.CodexEngine=gd});var Jm=S(vr=>{"use strict";var yP=vr&&vr.__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=vr&&vr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qm=vr&&vr.__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"&&yP(n,e,r[s]);return wP(n,e),n}})();Object.defineProperty(vr,"__esModule",{value:!0});vr.ClaudeEngine=void 0;vr.resolveClaudeEffort=Ym;var SP=qm(require("crypto")),AP=require("fs"),kc=qm(require("path")),TP=Ka(),bP=et(),zo=hi(),Ai=on(),Wm=Ju(),hd=Fo(),vP=br(),$c=gi(),Dc=nd(),OP=ps(),Km=tc(),IP=new Set(["Write","Edit","FileEdit","FileWrite","MultiEdit","str_replace_editor","Str_replace_editor","TextEditor","text_editor","Bash","bash","shell","Shell"]),PP=1e3*60*30;function NP(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 d=l.freeText??l.selected.join(", ");o[a.question]=d}return{behavior:"allow",updatedInput:{questions:s.questions,answers:o}}}return{behavior:"allow",updatedInput:r}}}var RP="AGENTIDE_CONTEXT_EXPORT_PATH",CP="AGENTIDE_TERMINAL_LOG_PATH";function kP(){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 $P(t){let e=kP(),n=new AbortController,r=t.queryFn({prompt:e,options:{...t.options,abortController:n,resume:t.resumeSessionId}}),s=r[Symbol.asyncIterator](),i=!1,o=t.resumeSessionId??null;return{get sessionId(){return o},async setMaxThinkingTokens(a){if(i)throw new Error("Cannot setMaxThinkingTokens on closed Claude session");await r.setMaxThinkingTokens(a)},async setMcpServers(a){if(i)throw new Error("Cannot setMcpServers on closed Claude session");return r.setMcpServers(a)},async interrupt(){if(!i)try{await r.interrupt()}catch{}},async send(a){if(i)throw new Error("Cannot send to closed Claude session");let c;typeof a=="string"?c={type:"user",session_id:"",message:{role:"user",content:[{type:"text",text:a}]},parent_tool_use_id:null}:c=a,e.enqueue(c)},async*receive(){for(;;){let{value:a,done:c}=await s.next();if(c)return;let l=a;if(l.type==="system"&&l.subtype==="init"&&(o=l.session_id),yield l,l.type==="result")return}},close(){i||(i=!0,e.close(),n.abort())}}}function Ym(t){let e=t?.trim();return e&&TP.ENGINE_EFFORTS.claude.includes(e)?e:void 0}var md=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:d}=(0,Ai.resolveApiRouting)(n,this.config,"anthropic");if(!c)throw new Error("Claude API key not provided");let u=SP.createHash("sha256").update(`${c}
83
- ${l??""}`).digest("hex").slice(0,16);o.info(`[AgentIDE] Claude using ${d?"LiteLLM proxy":"direct Anthropic"}, baseUrl: ${l||"default"}, workspaceRoot=${n.workspaceRoot}, additionalDirs=${n.additionalDirectories?.length??0}`),await r.progress("Thinking...");let f=(0,zo.buildLiteLLMMetadataHeaders)(d,{sessionId:n.sessionId,analyticsUserId:n.analyticsUserId,analyticsProjectId:(0,zo.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),agentId:n.agentPackId??"default",agentVersion:n.agentPackVersion??"workspace",source:"agenthippo",engine:"claude",requestId:n.requestId,policyVersion:n.policyVersion,packDigest:n.packDigest,instanceId:n.instanceId,engineVersion:n.engineVersion,tier:n.tier}),p={...process.env,...s.cliEnvPatch??{},DEBUG_CLAUDE_AGENT_SDK:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1"};if(delete p[vP.OPENCLAW_GATEWAY_TOKEN_ENV],delete p.AGENTHIPPO_DATA_PLANE_TOKEN,(0,Km.isAnthropicSetupToken)(c)){let N=(0,Km.normalizeAnthropicSetupToken)(c);p.CLAUDE_CODE_OAUTH_TOKEN=N,delete p.ANTHROPIC_AUTH_TOKEN,delete p.ANTHROPIC_API_KEY,o.info("[AgentIDE] Claude using setup-token auth (CLAUDE_CODE_OAUTH_TOKEN)")}else p.ANTHROPIC_API_KEY=c,p.ANTHROPIC_AUTH_TOKEN=c,delete p.CLAUDE_CODE_OAUTH_TOKEN;let m=n.sessionId?.trim(),h=n.contextSessionId?.trim()||m;h&&(p[RP]=kc.join(n.workspaceRoot,Dc.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"context.md"),p[CP]=kc.join(n.workspaceRoot,Dc.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"terminal.md"));let w=n.agentPackId??"default",_=(0,Dc.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,w,n.agentPackVersion),E=(0,Dc.userScopedEngineHomeFromKey)(_.claudeConfigDir,(0,OP.resolveEngineHomeUserKey)(n.engineHomeUserKey));if(p.CLAUDE_CONFIG_DIR=E,await AP.promises.mkdir(E,{recursive:!0}),p.AGENT_ID=w,n.agentPackVersion&&(p.AGENTIDE_AGENT_VERSION=n.agentPackVersion),w!=="default"?o.info(`[AgentIDE] Claude using agent: ${w}, CLAUDE_CONFIG_DIR=${E} (agent-isolated)`):o.info(`[AgentIDE] Claude using default agent, CLAUDE_CONFIG_DIR=${E}`),f.length>0&&(p.ANTHROPIC_CUSTOM_HEADERS=f.join(`
84
- `)),l&&l!=="https://api.anthropic.com/v1"){let N=l.endsWith("/v1")?l.slice(0,-3):l;p.ANTHROPIC_BASE_URL=N,o.info(`[AgentIDE] Using custom Anthropic base URL: ${N}`),(0,Ai.applyLocalTlsBypass)(p,N)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS")}let L=n.modelId;if(!L)throw new Error("Claude modelId not provided for streaming request");o.info(`[AgentIDE] Using Claude model: ${L}`);let A="",I=async N=>{if(!N)return;let P=A.length,v=N.length;if(P===0){A=N,await r.text(N);return}if(v===P){if(N===A){o.debug("[AgentIDE] Claude: exact duplicate, skipping");return}}else if(v>P){if(N.startsWith(A)){let F=N.slice(P);A=N,o.debug(`[AgentIDE] Claude: emitting remainder (${F.length} chars)`),await r.text(F);return}}else if(A.endsWith(N)){o.debug("[AgentIDE] Claude: suffix already streamed, skipping");return}A=N,await r.text(N)},b=(0,$c.buildConversationKey)("claude",n);o.info(`[AgentIDE] Claude conversationKey=${b.key} (chatSessionId=${b.chatSessionId}, signature=${b.signatureHash}${b.isEphemeral?", ephemeral":""})`),await(0,$c.withConversationLock)(b.key,async()=>{let N=(0,Ai.getAgentideEngineSettings)(s?.configProvider),P=typeof N.claudeMaxThinkingTokens=="number"&&N.claudeMaxThinkingTokens>0?Math.floor(N.claudeMaxThinkingTokens):null;o.debug(`[AgentIDE] Claude maxThinkingTokens=${P??"default/disabled"}`);let v=Ym(N.effort);o.debug(`[AgentIDE] Claude effort=${v??"default"}`);let F=(N.claudeCheapModel||"").trim();F&&(p.ANTHROPIC_DEFAULT_HAIKU_MODEL=F,p.CLAUDE_CODE_SUBAGENT_MODEL=F,o.debug(`[AgentIDE] Claude cheapModel=${F}`));let B=n.permissions??Wm.DEFAULT_PERMISSIONS;o.debug(`[AgentIDE] Claude permissions: fileAccess=${B.fileAccess}`);let re=(0,Ai.stableAdditionalDirs)([n.workspaceRoot,...n.additionalDirectories??[]]),X=(0,Wm.toClaudeOptions)(B,re);o.debug(`[AgentIDE] Claude mapped: permissionMode=${X.permissionMode}, allowDangerouslySkipPermissions=${X.allowDangerouslySkipPermissions}, dirs=${X.additionalDirectories?.length??"undefined"}`);let te=(0,Ai.stableAdditionalDirs)([...X.additionalDirectories??[],E]),Pe=await this.computeAgentideSignature(n.workspaceRoot,n.additionalDirectories),Ge=n.sessionId,xe=n.workspaceRoot,Mt={current:null},Et=Y=>{let It=Y.trim();return/(?:^|&&|\||;)\s*git\s+/.test(It)},hr=(Y,It)=>{let tn=It;if(!tn)return[];if(Y==="Bash"){let Pt=tn.command;return Pt?Et(Pt)?[]:(0,Ai.extractFilePaths)(Pt,xe):[]}let me=tn.file_path??tn.path;return me?[kc.isAbsolute(me)?me:kc.join(xe,me)]:[]},Be={continue:!0},it=async(Y,It,tn)=>{try{o.debug(`[AgentIDE] PreToolUse hook called: toolUseID=${It}, event=${Y.hook_event_name}`);let me=Mt.current;if(!me)return o.debug("[AgentIDE] PreToolUse: no edit state"),Be;if(me.aborted)return o.debug("[AgentIDE] PreToolUse: aborted"),Be;if(Y.hook_event_name!=="PreToolUse")return o.debug(`[AgentIDE] PreToolUse: wrong event ${Y.hook_event_name}`),Be;if(!Ge)return o.debug("[AgentIDE] PreToolUse: no rawChatSessionId"),Be;if(!a)return o.debug("[AgentIDE] PreToolUse: no edit tracker available"),Be;let Gt=Y.tool_name;if(!IP.has(Gt))return o.debug(`[AgentIDE] PreToolUse: tool ${Gt} not tracked (not in FILE_TOOLS)`),Be;let Pt=Y.tool_use_id,In=hr(Gt,Y.tool_input).filter(pn=>!(0,Ai.isBinaryFile)(pn));if(o.debug(`[AgentIDE] PreToolUse: ${Gt} files=${In.length}: ${In.join(", ")}`),In.length===0)return Be;o.debug(`[AgentIDE] PreToolUse: calling startTracking for ${In.length} files`);try{let pn=await a.startTracking(Ge,In);pn?.operationId!==void 0&&me&&!me.aborted&&(o.debug(`[AgentIDE] PreToolUse: startTracking returned opId=${pn.operationId}`),me.pendingOperations.set(Pt,pn.operationId))}catch(pn){o.warn(`[AgentIDE] PreToolUse: startTracking failed: ${pn}`)}return Be}catch(me){return o.error("[AgentIDE] PreToolUse hook EXCEPTION",me instanceof Error?me:void 0),Be}},On=async(Y,It,tn)=>{try{o.debug(`[AgentIDE] PostToolUse hook called: toolUseID=${It}, event=${Y.hook_event_name}`);let me=Mt.current;if(!me||me.aborted||Y.hook_event_name!=="PostToolUse"||!Ge||!a)return Be;let Gt=Y.tool_use_id;if(!Gt)return Be;let Pt=me.pendingOperations.get(Gt);if(o.debug(`[AgentIDE] PostToolUse: toolUseId=${Gt} opId=${Pt}`),Pt!==void 0){me.pendingOperations.delete(Gt);try{await a.stopTracking(Ge,Pt),o.debug("[AgentIDE] PostToolUse: stopTracking done")}catch(In){o.warn(`[AgentIDE] PostToolUse: stopTracking failed: ${In}`)}}return Be}catch(me){return o.error("[AgentIDE] PostToolUse hook EXCEPTION",me instanceof Error?me:void 0),Be}};o.debug(`[AgentIDE] Setting up Claude hooks for session ${Ge}`);let mr=async(Y,It,tn)=>(o.debug(`[AgentIDE] SessionStart hook called! event=${Y.hook_event_name}`),Be),{spawn:Ze,perTurn:Zt}=await this.loadMcpServersForClaude(o,n.workspaceRoot,w,p),ii=n.workspaceRoot,Hr=w!=="default"?["project"]:["user","project"],Z=X.allowDangerouslySkipPermissions===!0?!0:void 0,oi={model:L,cwd:ii,additionalDirectories:te,settingSources:Hr,env:p,permissionMode:X.permissionMode,allowDangerouslySkipPermissions:Z,includePartialMessages:!0,persistSession:!0,...P?{maxThinkingTokens:P}:{},...v?{effort:v}:{},...Object.keys(Ze).length>0?{mcpServers:Ze}:{},...this.config.claudeCodeExecutablePath?{pathToClaudeCodeExecutable:this.config.claudeCodeExecutablePath}:{},canUseTool:NP(r,o),hooks:{SessionStart:[{hooks:[mr]}],PreToolUse:[{hooks:[it]}],PostToolUse:[{hooks:[On]}]},stderr:Y=>{o.debug(`[AgentIDE] Claude CLI stderr: ${Y}`)}},D=await this.getOrCreateSession({conversationKey:b.key,chatSessionId:b.chatSessionId,signatureHash:b.signatureHash,signatureRaw:b.signatureRaw,agentideSignature:Pe,isEphemeral:b.isEphemeral,modelId:L,cheapModel:F||void 0,effort:v,credentialFingerprint:u,queryOptions:oi,logger:o}),se=D.session,ie=D.editTrackingState;Mt.current=ie;let we=!1,en=()=>{we=!0,ie.aborted=!0;let Y=Array.from(ie.pendingOperations.values());if(ie.pendingOperations.clear(),Ge&&Y.length>0&&a)for(let It of Y)a.stopTracking(Ge,It).catch(()=>{});o.info("[AgentIDE] Claude cancel requested; interrupting session..."),se.interrupt().catch(()=>{try{se.close()}catch{}})};if(i?.aborted){en();return}i?.addEventListener("abort",en,{once:!0});try{try{await se.setMaxThinkingTokens(P),o.debug(`[AgentIDE] Claude setMaxThinkingTokens(${P??"null"}) ok`)}catch(J){o.warn(`[AgentIDE] Claude setMaxThinkingTokens(${P??"null"}) failed: ${J instanceof Error?J.message:String(J)}`)}if(Object.keys(Zt).length>0)try{let J=await se.setMcpServers(Zt),U=Object.entries(J.errors);U.length>0?o.warn(`[AgentIDE] Claude setMcpServers connect errors: ${U.map(([Ee,Ne])=>`${Ee}: ${Ne}`).join("; ")} \u2014 data tools will fail closed this turn`):o.debug(`[AgentIDE] Claude setMcpServers ok (${Object.keys(Zt).join(", ")})`)}catch(J){o.warn(`[AgentIDE] Claude setMcpServers failed: ${J instanceof Error?J.message:String(J)} \u2014 data tools will fail closed this turn`)}await se.send(e);let Y=0,It=0,tn=0,me=0,Gt=0,Pt=0,In=0,pn=0,ls=new Set,Wi=new Set,Ki=new Set,Ls=new Map,Mo=new Map,qi=new Map,ai=new Map,Go=J=>J.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160),Yi=(J,U)=>{if(typeof U=="string")return U.trim()?U:void 0;if(!U||typeof U!="object")return;let Ee=U,Ne=Ee.command;if(typeof Ne=="string"&&Ne.trim())return Ne.trim();let ot=Ee.args;if(Array.isArray(ot)&&ot.every(Re=>typeof Re=="string"))return ot.join(" ");let Se=Ee.location,Ve=Se&&typeof Se=="object"?Se.path:void 0,Kt=Ee.path??Ee.file_path??Ee.file??Ee.filename??Ve,Ce=[];typeof Kt=="string"&&Kt.trim()&&Ce.push(Kt.trim());let _t=Ee.content;typeof _t=="string"&&Ce.push(`contentBytes=${Buffer.byteLength(_t,"utf8")}`);let Ae=Ee.patch??Ee.diff;if(typeof Ae=="string"&&Ce.push(`patchBytes=${Buffer.byteLength(Ae,"utf8")}`),Ce.length>0)return Ce.join(" ");let Ue=300,At=30,Ms=4,Gs=(Re,Wn)=>{if(typeof Re=="string")return Re.length>Ue?`${Re.slice(0,Ue)}\u2026 (${Re.length} chars)`:Re;if(typeof Re=="number"||typeof Re=="boolean"||Re===null)return Re;if(Array.isArray(Re)){if(Wn>=Ms)return`[Array(${Re.length})]`;let yt=Re.slice(0,At).map(Kn=>Gs(Kn,Wn+1));return Re.length>At?[...yt,`\u2026 (${Re.length-At} more)`]:yt}if(typeof Re=="object"&&Re){if(Wn>=Ms)return"[Object]";let yt={};for(let[Kn,ds]of Object.entries(Re)){if(typeof ds=="string"&&/content|text|data|body|patch|diff/i.test(Kn)&&ds.length>Ue){yt[Kn]=`<${Buffer.byteLength(ds,"utf8")} bytes>`;continue}yt[Kn]=Gs(ds,Wn+1)}return yt}};try{let Re=JSON.stringify(Gs(U,0),null,2),Wn=Re.trim();return Wn==="{}"||Wn==="[]"?void 0:Re}catch{return}},Uo=J=>{if(!J||typeof J!="object")return;let U=J,Ee=U.type;if(Ee==="tool_use"||Ee==="server_tool_use"){let Ne=U.id,ot=U.name,Se=U.input;return typeof Ne=="string"&&typeof ot=="string"?{id:Ne,name:ot,input:Se}:void 0}if(Ee==="mcp_tool_use"){let Ne=U.id,ot=U.name,Se=U.server_name,Ve=U.input;if(typeof Ne=="string"&&typeof ot=="string"&&typeof Se=="string")return{id:Ne,name:`${Se}.${ot}`,input:Ve}}},Er=J=>{if(typeof J=="string")return J;if(J!=null)try{return JSON.stringify(J,null,2)}catch{return String(J)}},_u=J=>{if(typeof J=="string")return J;if(Array.isArray(J)){let U=[];for(let Ne of J){if(typeof Ne=="string"){U.push(Ne);continue}if(!Ne||typeof Ne!="object")continue;let ot=Ne;if(typeof ot.text=="string"){U.push(ot.text);continue}let Se=Er(Ne);Se&&U.push(Se)}return U.join(`
85
- `).trim()||void 0}if(J&&typeof J=="object"){let U=J;if(typeof U.text=="string")return U.text}return Er(J)},Ji=J=>{if(!J||typeof J!="object")return;let U=J,Ee=U.type;if(Ee!=="tool_result"&&Ee!=="server_tool_result"&&Ee!=="mcp_tool_result")return;let Ne=U.tool_use_id;if(typeof Ne!="string"||!Ne)return;let ot=_u(U.content??U.result??U.output??U.data??U.text),Se=typeof U.is_error=="boolean"?U.is_error:typeof U.isError=="boolean"?U.isError:void 0;return{toolUseId:Ne,resultText:ot,isError:Se}},ci=async(J,U,Ee)=>{if(!(!ls.has(U)||!!Ee&&!Wi.has(U))){Ls.set(U,J);return}Pt++,ls.add(U),Ee&&Wi.add(U),Ls.set(U,J),we||await r.toolStart(J,Ee,U)},li=async(J,U,Ee,Ne)=>{if(Ki.has(J))return;let ot=Ls.get(J)??Ne??"tool";ls.has(J)||await ci(ot,J),Ki.add(J),Ls.delete(J),we||await r.toolEnd(ot,J,U,Ee)},us=!1,Ho=0;for await(let J of se.receive()){Ho++;let U=J,Ee=U.session_id;!us&&Ee&&(us=!0,await(0,zo.persistSessionIfNeeded)("claude",b,Ee,n));let Ne=U.type==="result"||U.type==="system"?U.subtype:void 0;if(o.debug(`[AgentIDE] Claude msg #${Ho}: type=${U.type}, subtype=${Ne||"none"}`),we&&U.type!=="result")continue;if(U.type==="stream_event"){let Se=U.event,Ve=Se.type;if(Ve==="content_block_start"){let Kt=Se.content_block,Ce=Kt?.type,_t=Se.index;if(Ce==="thinking"){let Ae=Kt?.thinking;tn++,typeof Ae=="string"&&Ae?(It+=Ae.length,o.debug(`[AgentIDE] Claude thinking block start (${Ae.length} chars): ${Go(Ae)}`),we||await r.thinking(Ae)):o.debug("[AgentIDE] Claude thinking block start (no initial thinking text)")}else if(Ce==="redacted_thinking"){me++;let Ae=Kt?.data;o.debug(`[AgentIDE] Claude redacted_thinking block start (dataType=${typeof Ae})`)}else{let Ae=Ji(Se.content_block);if(Ae){await li(Ae.toolUseId,Ae.resultText,Ae.isError);continue}let Ue=Uo(Se.content_block);if(Ue&&(Gt++,typeof _t=="number"&&(Mo.set(_t,Ue.id),qi.set(_t,Ue.name)),!ls.has(Ue.id))){let At=Yi(Ue.name,Ue.input);o.debug(`[AgentIDE] Claude tool_use start: ${Ue.name} (id=${Ue.id}, input=${At?"yes":"no"})`),await ci(Ue.name,Ue.id,At)}}}else if(Ve==="content_block_delta"){let Kt=Se.delta,Ce=Kt.type,_t=Kt.thinking,Ae=Kt.text;if(Ce==="thinking_delta"&&typeof _t=="string"&&_t)Y++,It+=_t.length,Y<=3&&o.debug(`[AgentIDE] Claude thinking delta #${Y} (${_t.length} chars): ${Go(_t)}`),we||await r.thinking(_t);else if(Ce==="input_json_delta"){let Ue=Se.index,At=Kt.partial_json;if(typeof Ue=="number"&&typeof At=="string"&&At){pn++;let Gs=(ai.get(Ue)??"")+At;ai.set(Ue,Gs);let Re=Mo.get(Ue);if(Re&&!Wi.has(Re))try{let Wn=JSON.parse(Gs),yt=qi.get(Ue)??"tool",Kn=Yi(yt,Wn);Kn&&(o.debug(`[AgentIDE] Claude tool_use input_json parsed: ${yt} (id=${Re})`),await ci(yt,Re,Kn))}catch{}}}else Ce==="text_delta"&&typeof Ae=="string"&&Ae&&(A+=Ae,we||await r.text(Ae))}}else if(U.type==="assistant"){let Se=U.message.content;if(Array.isArray(Se))for(let Ve of Se){let Kt=Ve.type,Ce=Ve.text,_t=Ji(Ve);if(_t){await li(_t.toolUseId,_t.resultText,_t.isError);continue}let Ae=Uo(Ve);if(Ae&&!ls.has(Ae.id)){Gt++;let Ue=Yi(Ae.name,Ae.input);o.debug(`[AgentIDE] Claude tool_use (assistant msg): ${Ae.name} (id=${Ae.id}, input=${Ue?"yes":"no"})`),await ci(Ae.name,Ae.id,Ue);continue}Kt==="text"&&typeof Ce=="string"&&Ce&&(we||await I(Ce))}}else if(U.type==="tool_progress"){In++;let Se=U.tool_use_id,Ve=U.tool_name||"tool";Se&&!ls.has(Se)&&(o.debug(`[AgentIDE] Claude tool_progress: ${Ve} (tool_use_id=${Se})`),await ci(Ve,Se))}else if(U.type==="system")U.subtype==="status"&&U.status==="compacting"&&(we||await r.progress("Compacting context\u2026"));else if(U.type==="result"){if(U.subtype==="success")we||await I(U.result);else if(!we)throw new Error(U.errors?.join(`
86
- `)||U.subtype)}let ot=U.message?.content;if(U.type!=="assistant"&&Array.isArray(ot))for(let Se of ot){let Ve=Ji(Se);Ve&&await li(Ve.toolUseId,Ve.resultText,Ve.isError)}}for(let[J,U]of Array.from(Ls.entries()))await li(J,"Completed",!1,U);o.info(`[AgentIDE] Claude thinking summary: startBlocks=${tn}, redactedBlocks=${me}, deltas=${Y}, chars=${It}`),o.info(`[AgentIDE] Claude tool summary: toolBlocks=${Gt}, toolEmits=${Pt}, toolProgressMsgs=${In}, inputJsonDeltas=${pn}`),tn===0&&Y===0&&me===0&&o.debug(`[AgentIDE] Claude emitted no thinking blocks/deltas. Ensure model supports extended thinking and set ${(0,bP.toSettingsDisplayKey)("agentide.claude.maxThinkingTokens")} >= 1024.`),Gt===0&&In===0&&o.debug("[AgentIDE] Claude emitted no tool usage events. If tools were used, ensure includePartialMessages=true and parse tool_use blocks."),(0,zo.touchSessionIfNeeded)(b)}catch(Y){if(!we)throw Y;o.info(`[AgentIDE] Claude stream aborted: ${Y instanceof Error?Y.message:String(Y)}`)}finally{i?.removeEventListener("abort",en)}},{signal:i,timeoutMs:$c.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:"claude.stream"}),await r.done(),o.info("[AgentIDE] Claude streaming complete")}dispose(){for(let e of this.activeSessions.values())try{e.session.close()}catch{}this.activeSessions.clear()}onMaintenance(e){this.sweepIdleSessions(e)}loadClaudeSdk(){return import("@anthropic-ai/claude-agent-sdk")}sweepIdleSessions(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())if(n-s.lastUsedAt>PP){try{s.session.close(),e?.info(`[AgentIDE] Closed idle Claude session (key=${r}, idleMs=${n-s.lastUsedAt})`)}catch{}this.activeSessions.delete(r)}}async getOrCreateSession(e){let n=this.activeSessions.get(e.conversationKey);if(n&&n.signatureHash===e.signatureHash&&n.modelId===e.modelId&&n.cheapModel===e.cheapModel&&n.effort===e.effort&&n.credentialFingerprint===e.credentialFingerprint&&n.agentideSignature===e.agentideSignature)return n.lastUsedAt=Date.now(),n.editTrackingState.aborted=!1,n.editTrackingState.pendingOperations.clear(),(0,$c.touchPersistedSession)(e.conversationKey),e.logger.debug(`[AgentIDE] REUSING existing Claude session (key=${e.conversationKey}) - NOTE: hooks from original session creation are used, not new ones`),n;let r;if(n){n.signatureHash===e.signatureHash&&n.agentideSignature!==e.agentideSignature&&(e.logger.info(`[AgentIDE] AgentIDE manifest changed (${n.agentideSignature} \u2192 ${e.agentideSignature}), restarting Claude session with resume`),r=n.session.sessionId??void 0),n.modelId!==e.modelId&&(e.logger.info(`[AgentIDE] Model changed (${n.modelId} \u2192 ${e.modelId}), will resume session with new model`),r=n.session.sessionId??void 0),n.cheapModel!==e.cheapModel&&(e.logger.info(`[AgentIDE] Cheap model changed (${n.cheapModel??"unset"} \u2192 ${e.cheapModel??"unset"}), will resume session with updated env`),r=n.session.sessionId??void 0),n.effort!==e.effort&&(e.logger.info(`[AgentIDE] Effort changed (${n.effort??"default"} \u2192 ${e.effort??"default"}), will resume session with new effort`),r=n.session.sessionId??void 0),n.credentialFingerprint!==e.credentialFingerprint&&(e.logger.info("[AgentIDE] Credential rotated, will resume session with fresh credentials"),r=n.session.sessionId??void 0);try{n.session.close()}catch{}this.activeSessions.delete(e.conversationKey)}!r&&!e.isEphemeral&&(r=(0,zo.getPersistedSessionId)("claude",e.conversationKey)),r?e.logger.info(`[AgentIDE] Claude session will resume: ${r} (model: ${e.modelId})`):e.logger.info(`[AgentIDE] Claude session starting new (model: ${e.modelId})`);let s=await this.loadClaudeSdk(),o={session:$P({resumeSessionId:r,queryFn:s.query,options:e.queryOptions}),chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,agentideSignature:e.agentideSignature,modelId:e.modelId,cheapModel:e.cheapModel,effort:e.effort,credentialFingerprint:e.credentialFingerprint,lastUsedAt:Date.now(),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,hd.loadMcpServers)(r,n,i);if(o.length===0)return{spawn:{},perTurn:{}};let a={},c={};for(let d of o){if(d.url&&d.bearerTokenEnv){let u=(0,hd.resolveHttpMcpHeaders)(d,s??process.env);c[d.name]={type:"http",url:d.url,...u?{headers:u}:{}};continue}if(d.url){let u=(0,hd.referenceHttpMcpHeaders)(d,s??process.env);a[d.name]={type:"http",url:d.url,...u?{headers:u}:{}};continue}a[d.name]={command:d.command,args:d.args,...d.env&&Object.keys(d.env).length>0?{env:d.env}:{}}}let l=r==="default"?"bundled":`pack:${r}`;return e.debug(`[AgentIDE] Claude MCP servers loaded (${l}): ${o.map(d=>d.name).join(", ")} (per-turn: ${Object.keys(c).join(", ")||"none"})`),{spawn:a,perTurn:c}}};vr.ClaudeEngine=md});var _d=S(wn=>{"use strict";var DP=wn&&wn.__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]})),LP=wn&&wn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),MP=wn&&wn.__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"&&DP(n,e,r[s]);return LP(n,e),n}})();Object.defineProperty(wn,"__esModule",{value:!0});wn.syncPackMcpToWorkspace=Zm;wn.syncPackToWorkspace=VP;wn.computeSkillsSignature=eE;wn.createSkillsSignatureGetter=WP;wn.createSessionDir=KP;wn.getSessionDir=qP;var ze=require("fs"),Q=MP(require("path")),zm=require("crypto"),_e=on(),GP=tc(),De=qn(),Qm=mi(),UP=Fo(),HP=Bs();async function Zm(t,e,n,r){let s=Q.join(t,De.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,_e.pathExists)(s))return;let i;try{i=await(0,Qm.loadAgentManifest)(s)}catch(u){Ht(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=Q.join(e,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.AGENTS_DIR,n,De.AGENT_CONSTANTS.MCP_DIR);await ze.promises.mkdir(a,{recursive:!0});let c={mcpServers:{}},l=Q.join(a,".mcp.json");for(let u of o){let f=u.config?.trim();if(!f)continue;let p=Q.resolve(t,f);if(!Ed(t,p)){Ht(r,`[AgentIDE] Skipping MCP config ${f}: path escapes pack root`);continue}if(!await(0,_e.pathExists)(p)){Ht(r,`[AgentIDE] Skipping MCP config ${f}: file not found`);continue}try{let m=JSON.parse(await ze.promises.readFile(p,"utf8")).mcpServers;m&&typeof m=="object"&&Object.assign(c.mcpServers,m)}catch(g){Ht(r,`[AgentIDE] Skipping MCP config ${f}: ${g instanceof Error?g.message:String(g)}`)}}let d=Q.join(t,De.AGENT_CONSTANTS.MCP_DIR);if(await(0,_e.pathExists)(d)){let u=await ze.promises.readdir(d,{withFileTypes:!0});for(let f of u){if(!f.isDirectory()||f.name.startsWith("."))continue;let p=Q.join(d,f.name),g=Q.join(a,f.name);await(0,_e.pathExists)(g)||await(0,_e.copyDirRecursive)(p,g)}}!c.mcpServers||Object.keys(c.mcpServers).length===0||(await(0,_e.writeFileIfChanged)(l,`${JSON.stringify(c,null,2)}
87
- `),Ht(r,`[AgentIDE] Synced pack MCP config: ${l}`))}function Xm(t){return!(!t||!t.trim()||Q.isAbsolute(t)||/^(https?:\/\/|git@|ssh:\/\/)/i.test(t))}function Ed(t,e){let n=Q.relative(t,e);return n!==".."&&!n.startsWith(`..${Q.sep}`)&&!Q.isAbsolute(n)}async function jP(t){return(await ze.promises.readdir(t)).length===0}async function xP(t,e,n,r){let s=Q.join(e,De.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,_e.pathExists)(s))try{let o=(await(0,Qm.loadAgentManifest)(s)).spec?.data;if(!o)return;let a=o.sourcePath?.trim()||"./data",c=(o.workspacePath?.trim()||`.${Q.sep}${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}${Q.sep}data${Q.sep}${n}`).replace(/^(?:\.\/|\.\\)/,"");if(!Xm(a)||!Xm(c)){Ht(r,`[AgentIDE] Skipping data sync for ${n}: invalid spec.data paths`);return}let l=Q.resolve(e,a),d=Q.resolve(t,c);if(!Ed(e,l)||!Ed(t,d)){Ht(r,`[AgentIDE] Skipping data sync for ${n}: path escapes allowed root`);return}if(!await(0,_e.pathExists)(l))return;if(!await(0,_e.pathExists)(d)){await(0,_e.copyDirRecursive)(l,d),Ht(r,`[AgentIDE] Seeded pack data for ${n}: ${d}`);return}(await ze.promises.stat(d)).isDirectory()&&await jP(d)&&(await(0,_e.copyDirRecursive)(l,d),Ht(r,`[AgentIDE] Seeded pack data for ${n}: ${d}`))}catch(i){Ht(r,`[AgentIDE] Skipping data sync for ${n}: ${i instanceof Error?i.message:String(i)}`)}}async function BP(t){let e=Q.join(t,"SKILL.md");try{if((await ze.promises.lstat(e)).isSymbolicLink()){let r=await ze.promises.readlink(e),s=Q.isAbsolute(r)?r:Q.resolve(Q.dirname(e),r);if(Q.resolve(s)===Q.resolve(e))return!1}return await ze.promises.access(e),!0}catch{return!1}}async function FP(t,e,n){let r=Q.join(t,"skills");if(!await(0,_e.pathExists)(r))return;await ze.promises.mkdir(e,{recursive:!0});let s=await ze.promises.readdir(r,{withFileTypes:!0});for(let i of s){if(!i.isDirectory())continue;let o=Q.join(e,i.name);await(0,_e.pathExists)(o)&&await BP(o)||(await(0,_e.pathExists)(o)&&await ze.promises.rm(o,{recursive:!0,force:!0}),await(0,_e.copyDirRecursive)(Q.join(r,i.name),o),Ht(n,`[AgentIDE] Bootstrapped bundled skill: ${i.name}`))}}async function VP(t,e,n,r,s,i){let o=GP.AGENT_ENGINES[r],a=o?{workspaceDir:o.workspaceDir,rulesFile:o.rulesFile,includeSkills:!0,includeRules:!0}:(()=>{let A=(0,HP.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=Q.join(e,"AGENTS.md"),l=Q.join(e,"context.md"),d=Q.join(e,"skills"),u=Q.join(e,"rules");await(0,_e.ensureWorkspaceGitAndGitignore)(t,s);let f=Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.AGENTS_DIR,n);if(await ze.promises.mkdir(f,{recursive:!0}),await(0,_e.pathExists)(c)){let A=await ze.promises.readFile(c,"utf8");await(0,_e.writeFileIfChanged)(Q.join(f,De.AGENT_CONSTANTS.AGENTS_MD),A)}if(await(0,_e.pathExists)(l)){let A=await ze.promises.readFile(l,"utf8");await(0,_e.writeFileIfChanged)(Q.join(f,De.AGENT_CONSTANTS.CONTEXT_MD),A)}let p=Q.join(e,De.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,_e.pathExists)(p)){let A=await ze.promises.readFile(p,"utf8");await(0,_e.writeFileIfChanged)(Q.join(f,De.AGENT_CONSTANTS.GHOST_TEXT_FILE),A),Ht(s,`[AgentIDE] Synced GHOST_TEXT.md to ${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}`)}let g=Q.join(f,De.AGENT_CONSTANTS.SKILLS_DIR),m=Q.resolve(d),h=Q.resolve(g);await(0,_e.pathExists)(d)&&(m===h?Ht(s,`[AgentIDE] Skipping skills self-sync (pack already under ${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n})`):(await(0,_e.syncDirByFileLinks)(d,g,s,`${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n}/skills`),Ht(s,`[AgentIDE] Synced skills to ${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}: ${g}`))),i&&await FP(i,g,s);let w=Q.join(f,De.AGENT_CONSTANTS.RULES_DIR);if(await(0,_e.pathExists)(u)){await ze.promises.mkdir(w,{recursive:!0});let A=await ze.promises.readdir(u,{withFileTypes:!0});for(let I of A){if(!I.isFile()||!I.name.toLowerCase().endsWith(".md"))continue;let b=Q.join(u,I.name),N=Q.join(w,I.name);await(0,_e.symlinkOrCopyFile)(b,N,s,`rules/${I.name}`,{force:!0})}}if(n===De.AGENT_CONSTANTS.DEFAULT_AGENT_ID&&i){let A=await(0,UP.getDefaultMcpConfig)(i);if(A){let I=Q.join(f,De.AGENT_CONSTANTS.MCP_DIR);await ze.promises.mkdir(I,{recursive:!0});let b=Q.join(I,".mcp.json");await(0,_e.writeFileIfChanged)(b,A),Ht(s,`[AgentIDE] Synced MCP config: ${b}`)}}if(await Zm(e,t,n,s),await xP(t,e,n,s),!a)return;let _=Q.join(t,a.workspaceDir);await ze.promises.mkdir(_,{recursive:!0});let E="";if(await(0,_e.pathExists)(c)&&(E=await ze.promises.readFile(c,"utf8")),await(0,_e.pathExists)(l)){let A=await ze.promises.readFile(l,"utf8");E=E.trimEnd()+`
82
+ `),m=yn.join(e,"agentide.runtime.md");return await(0,rt.writeFileIfChanged)(m,g),m}async syncCodexSkillsToCodexHome(e,n,r,s,i){let o=yn.join(n,Si.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"agents",r,"skills"),a=yn.join(e,"skills");if(i){let d=this.lastCodexSkillsSignatureByWorkspaceRoot.get(n),u=await(0,rt.pathExists)(a);if(d===i&&u){s.debug(`[AgentIDE] Codex skills unchanged (sig=${i}), skipping $CODEX_HOME sync`);return}}try{await Zn.promises.rm(a,{recursive:!0,force:!0})}catch{}if(!await(0,rt.pathExists)(o))return;await Zn.promises.mkdir(a,{recursive:!0});let c=0,l=await Zn.promises.readdir(o,{withFileTypes:!0});for(let d of l){if(!d.isDirectory()||d.name.startsWith("."))continue;let u=yn.join(o,d.name),f=yn.join(u,"SKILL.md");await(0,rt.pathExists)(f)&&(await(0,rt.copyDirRecursive)(u,yn.join(a,d.name)),c++)}i&&this.lastCodexSkillsSignatureByWorkspaceRoot.set(n,i),s.info(`[AgentIDE] Codex skills synced to $CODEX_HOME: ${c} skill(s)`)}};er.CodexEngine=gd});var Jm=S(vr=>{"use strict";var yI=vr&&vr.__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]})),wI=vr&&vr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),qm=vr&&vr.__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 wI(n,e),n}})();Object.defineProperty(vr,"__esModule",{value:!0});vr.ClaudeEngine=void 0;vr.resolveClaudeEffort=Ym;var SI=qm(require("crypto")),AI=require("fs"),kc=qm(require("path")),TI=Ka(),bI=et(),zo=hi(),Ai=on(),Wm=Ju(),hd=Fo(),vI=br(),$c=gi(),Dc=nd(),OI=ps(),Km=tc(),PI=new Set(["Write","Edit","FileEdit","FileWrite","MultiEdit","str_replace_editor","Str_replace_editor","TextEditor","text_editor","Bash","bash","shell","Shell"]),II=1e3*60*30;function NI(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 d=l.freeText??l.selected.join(", ");o[a.question]=d}return{behavior:"allow",updatedInput:{questions:s.questions,answers:o}}}return{behavior:"allow",updatedInput:r}}}var RI="AGENTIDE_CONTEXT_EXPORT_PATH",CI="AGENTIDE_TERMINAL_LOG_PATH";function kI(){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 $I(t){let e=kI(),n=new AbortController,r=t.queryFn({prompt:e,options:{...t.options,abortController:n,resume:t.resumeSessionId}}),s=r[Symbol.asyncIterator](),i=!1,o=t.resumeSessionId??null;return{get sessionId(){return o},async setMaxThinkingTokens(a){if(i)throw new Error("Cannot setMaxThinkingTokens on closed Claude session");await r.setMaxThinkingTokens(a)},async setMcpServers(a){if(i)throw new Error("Cannot setMcpServers on closed Claude session");return r.setMcpServers(a)},async interrupt(){if(!i)try{await r.interrupt()}catch{}},async send(a){if(i)throw new Error("Cannot send to closed Claude session");let c;typeof a=="string"?c={type:"user",session_id:"",message:{role:"user",content:[{type:"text",text:a}]},parent_tool_use_id:null}:c=a,e.enqueue(c)},async*receive(){for(;;){let{value:a,done:c}=await s.next();if(c)return;let l=a;if(l.type==="system"&&l.subtype==="init"&&(o=l.session_id),yield l,l.type==="result")return}},close(){i||(i=!0,e.close(),n.abort())}}}function Ym(t){let e=t?.trim();return e&&TI.ENGINE_EFFORTS.claude.includes(e)?e:void 0}var md=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:d}=(0,Ai.resolveApiRouting)(n,this.config,"anthropic");if(!c)throw new Error("Claude API key not provided");let u=SI.createHash("sha256").update(`${c}
83
+ ${l??""}`).digest("hex").slice(0,16);o.info(`[AgentIDE] Claude using ${d?"LiteLLM proxy":"direct Anthropic"}, baseUrl: ${l||"default"}, workspaceRoot=${n.workspaceRoot}, additionalDirs=${n.additionalDirectories?.length??0}`),await r.progress("Thinking...");let f=(0,zo.buildLiteLLMMetadataHeaders)(d,{sessionId:n.sessionId,analyticsUserId:n.analyticsUserId,analyticsProjectId:(0,zo.resolveAnalyticsProjectId)(n.analyticsProjectId,n.workspaceRoot),agentId:n.agentPackId??"default",agentVersion:n.agentPackVersion??"workspace",source:"agenthippo",engine:"claude",requestId:n.requestId,policyVersion:n.policyVersion,packDigest:n.packDigest,instanceId:n.instanceId,engineVersion:n.engineVersion,tier:n.tier}),p={...process.env,...s.cliEnvPatch??{},DEBUG_CLAUDE_AGENT_SDK:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1"};if(delete p[vI.OPENCLAW_GATEWAY_TOKEN_ENV],delete p.AGENTHIPPO_DATA_PLANE_TOKEN,(0,Km.isAnthropicSetupToken)(c)){let N=(0,Km.normalizeAnthropicSetupToken)(c);p.CLAUDE_CODE_OAUTH_TOKEN=N,delete p.ANTHROPIC_AUTH_TOKEN,delete p.ANTHROPIC_API_KEY,o.info("[AgentIDE] Claude using setup-token auth (CLAUDE_CODE_OAUTH_TOKEN)")}else p.ANTHROPIC_API_KEY=c,p.ANTHROPIC_AUTH_TOKEN=c,delete p.CLAUDE_CODE_OAUTH_TOKEN;let m=n.sessionId?.trim(),h=n.contextSessionId?.trim()||m;h&&(p[RI]=kc.join(n.workspaceRoot,Dc.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"context.md"),p[CI]=kc.join(n.workspaceRoot,Dc.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,"sessions",h,"terminal.md"));let w=n.agentPackId??"default",_=(0,Dc.resolveRuntimePaths)(n.workspaceRoot,this.config.storagePath,w,n.agentPackVersion),E=(0,Dc.userScopedEngineHomeFromKey)(_.claudeConfigDir,(0,OI.resolveEngineHomeUserKey)(n.engineHomeUserKey));if(p.CLAUDE_CONFIG_DIR=E,await AI.promises.mkdir(E,{recursive:!0}),p.AGENT_ID=w,n.agentPackVersion&&(p.AGENTIDE_AGENT_VERSION=n.agentPackVersion),w!=="default"?o.info(`[AgentIDE] Claude using agent: ${w}, CLAUDE_CONFIG_DIR=${E} (agent-isolated)`):o.info(`[AgentIDE] Claude using default agent, CLAUDE_CONFIG_DIR=${E}`),f.length>0&&(p.ANTHROPIC_CUSTOM_HEADERS=f.join(`
84
+ `)),l&&l!=="https://api.anthropic.com/v1"){let N=l.endsWith("/v1")?l.slice(0,-3):l;p.ANTHROPIC_BASE_URL=N,o.info(`[AgentIDE] Using custom Anthropic base URL: ${N}`),(0,Ai.applyLocalTlsBypass)(p,N)&&o.info("[AgentIDE] Disabling TLS verification for local HTTPS")}let L=n.modelId;if(!L)throw new Error("Claude modelId not provided for streaming request");o.info(`[AgentIDE] Using Claude model: ${L}`);let A="",P=async N=>{if(!N)return;let I=A.length,v=N.length;if(I===0){A=N,await r.text(N);return}if(v===I){if(N===A){o.debug("[AgentIDE] Claude: exact duplicate, skipping");return}}else if(v>I){if(N.startsWith(A)){let F=N.slice(I);A=N,o.debug(`[AgentIDE] Claude: emitting remainder (${F.length} chars)`),await r.text(F);return}}else if(A.endsWith(N)){o.debug("[AgentIDE] Claude: suffix already streamed, skipping");return}A=N,await r.text(N)},b=(0,$c.buildConversationKey)("claude",n);o.info(`[AgentIDE] Claude conversationKey=${b.key} (chatSessionId=${b.chatSessionId}, signature=${b.signatureHash}${b.isEphemeral?", ephemeral":""})`),await(0,$c.withConversationLock)(b.key,async()=>{let N=(0,Ai.getAgentideEngineSettings)(s?.configProvider),I=typeof N.claudeMaxThinkingTokens=="number"&&N.claudeMaxThinkingTokens>0?Math.floor(N.claudeMaxThinkingTokens):null;o.debug(`[AgentIDE] Claude maxThinkingTokens=${I??"default/disabled"}`);let v=Ym(N.effort);o.debug(`[AgentIDE] Claude effort=${v??"default"}`);let F=(N.claudeCheapModel||"").trim();F&&(p.ANTHROPIC_DEFAULT_HAIKU_MODEL=F,p.CLAUDE_CODE_SUBAGENT_MODEL=F,o.debug(`[AgentIDE] Claude cheapModel=${F}`));let B=n.permissions??Wm.DEFAULT_PERMISSIONS;o.debug(`[AgentIDE] Claude permissions: fileAccess=${B.fileAccess}`);let re=(0,Ai.stableAdditionalDirs)([n.workspaceRoot,...n.additionalDirectories??[]]),X=(0,Wm.toClaudeOptions)(B,re);o.debug(`[AgentIDE] Claude mapped: permissionMode=${X.permissionMode}, allowDangerouslySkipPermissions=${X.allowDangerouslySkipPermissions}, dirs=${X.additionalDirectories?.length??"undefined"}`);let te=(0,Ai.stableAdditionalDirs)([...X.additionalDirectories??[],E]),Ie=await this.computeAgentideSignature(n.workspaceRoot,n.additionalDirectories),Ge=n.sessionId,xe=n.workspaceRoot,Mt={current:null},Et=Y=>{let Pt=Y.trim();return/(?:^|&&|\||;)\s*git\s+/.test(Pt)},hr=(Y,Pt)=>{let tn=Pt;if(!tn)return[];if(Y==="Bash"){let It=tn.command;return It?Et(It)?[]:(0,Ai.extractFilePaths)(It,xe):[]}let me=tn.file_path??tn.path;return me?[kc.isAbsolute(me)?me:kc.join(xe,me)]:[]},Be={continue:!0},it=async(Y,Pt,tn)=>{try{o.debug(`[AgentIDE] PreToolUse hook called: toolUseID=${Pt}, event=${Y.hook_event_name}`);let me=Mt.current;if(!me)return o.debug("[AgentIDE] PreToolUse: no edit state"),Be;if(me.aborted)return o.debug("[AgentIDE] PreToolUse: aborted"),Be;if(Y.hook_event_name!=="PreToolUse")return o.debug(`[AgentIDE] PreToolUse: wrong event ${Y.hook_event_name}`),Be;if(!Ge)return o.debug("[AgentIDE] PreToolUse: no rawChatSessionId"),Be;if(!a)return o.debug("[AgentIDE] PreToolUse: no edit tracker available"),Be;let Gt=Y.tool_name;if(!PI.has(Gt))return o.debug(`[AgentIDE] PreToolUse: tool ${Gt} not tracked (not in FILE_TOOLS)`),Be;let It=Y.tool_use_id,Pn=hr(Gt,Y.tool_input).filter(pn=>!(0,Ai.isBinaryFile)(pn));if(o.debug(`[AgentIDE] PreToolUse: ${Gt} files=${Pn.length}: ${Pn.join(", ")}`),Pn.length===0)return Be;o.debug(`[AgentIDE] PreToolUse: calling startTracking for ${Pn.length} files`);try{let pn=await a.startTracking(Ge,Pn);pn?.operationId!==void 0&&me&&!me.aborted&&(o.debug(`[AgentIDE] PreToolUse: startTracking returned opId=${pn.operationId}`),me.pendingOperations.set(It,pn.operationId))}catch(pn){o.warn(`[AgentIDE] PreToolUse: startTracking failed: ${pn}`)}return Be}catch(me){return o.error("[AgentIDE] PreToolUse hook EXCEPTION",me instanceof Error?me:void 0),Be}},On=async(Y,Pt,tn)=>{try{o.debug(`[AgentIDE] PostToolUse hook called: toolUseID=${Pt}, event=${Y.hook_event_name}`);let me=Mt.current;if(!me||me.aborted||Y.hook_event_name!=="PostToolUse"||!Ge||!a)return Be;let Gt=Y.tool_use_id;if(!Gt)return Be;let It=me.pendingOperations.get(Gt);if(o.debug(`[AgentIDE] PostToolUse: toolUseId=${Gt} opId=${It}`),It!==void 0){me.pendingOperations.delete(Gt);try{await a.stopTracking(Ge,It),o.debug("[AgentIDE] PostToolUse: stopTracking done")}catch(Pn){o.warn(`[AgentIDE] PostToolUse: stopTracking failed: ${Pn}`)}}return Be}catch(me){return o.error("[AgentIDE] PostToolUse hook EXCEPTION",me instanceof Error?me:void 0),Be}};o.debug(`[AgentIDE] Setting up Claude hooks for session ${Ge}`);let mr=async(Y,Pt,tn)=>(o.debug(`[AgentIDE] SessionStart hook called! event=${Y.hook_event_name}`),Be),{spawn:Ze,perTurn:Zt}=await this.loadMcpServersForClaude(o,n.workspaceRoot,w,p),ii=n.workspaceRoot,Hr=w!=="default"?["project"]:["user","project"],Z=X.allowDangerouslySkipPermissions===!0?!0:void 0,oi={model:L,cwd:ii,additionalDirectories:te,settingSources:Hr,env:p,permissionMode:X.permissionMode,allowDangerouslySkipPermissions:Z,includePartialMessages:!0,persistSession:!0,...I?{maxThinkingTokens:I}:{},...v?{effort:v}:{},...Object.keys(Ze).length>0?{mcpServers:Ze}:{},...this.config.claudeCodeExecutablePath?{pathToClaudeCodeExecutable:this.config.claudeCodeExecutablePath}:{},canUseTool:NI(r,o),hooks:{SessionStart:[{hooks:[mr]}],PreToolUse:[{hooks:[it]}],PostToolUse:[{hooks:[On]}]},stderr:Y=>{o.debug(`[AgentIDE] Claude CLI stderr: ${Y}`)}},D=await this.getOrCreateSession({conversationKey:b.key,chatSessionId:b.chatSessionId,signatureHash:b.signatureHash,signatureRaw:b.signatureRaw,agentideSignature:Ie,isEphemeral:b.isEphemeral,modelId:L,cheapModel:F||void 0,effort:v,credentialFingerprint:u,queryOptions:oi,logger:o}),se=D.session,ie=D.editTrackingState;Mt.current=ie;let we=!1,en=()=>{we=!0,ie.aborted=!0;let Y=Array.from(ie.pendingOperations.values());if(ie.pendingOperations.clear(),Ge&&Y.length>0&&a)for(let Pt of Y)a.stopTracking(Ge,Pt).catch(()=>{});o.info("[AgentIDE] Claude cancel requested; interrupting session..."),se.interrupt().catch(()=>{try{se.close()}catch{}})};if(i?.aborted){en();return}i?.addEventListener("abort",en,{once:!0});try{try{await se.setMaxThinkingTokens(I),o.debug(`[AgentIDE] Claude setMaxThinkingTokens(${I??"null"}) ok`)}catch(J){o.warn(`[AgentIDE] Claude setMaxThinkingTokens(${I??"null"}) failed: ${J instanceof Error?J.message:String(J)}`)}if(Object.keys(Zt).length>0)try{let J=await se.setMcpServers(Zt),U=Object.entries(J.errors);U.length>0?o.warn(`[AgentIDE] Claude setMcpServers connect errors: ${U.map(([Ee,Ne])=>`${Ee}: ${Ne}`).join("; ")} \u2014 data tools will fail closed this turn`):o.debug(`[AgentIDE] Claude setMcpServers ok (${Object.keys(Zt).join(", ")})`)}catch(J){o.warn(`[AgentIDE] Claude setMcpServers failed: ${J instanceof Error?J.message:String(J)} \u2014 data tools will fail closed this turn`)}await se.send(e);let Y=0,Pt=0,tn=0,me=0,Gt=0,It=0,Pn=0,pn=0,ls=new Set,Wi=new Set,Ki=new Set,Ls=new Map,Mo=new Map,qi=new Map,ai=new Map,Go=J=>J.replace(/\r/g,"").replace(/\n/g,"\\n").slice(0,160),Yi=(J,U)=>{if(typeof U=="string")return U.trim()?U:void 0;if(!U||typeof U!="object")return;let Ee=U,Ne=Ee.command;if(typeof Ne=="string"&&Ne.trim())return Ne.trim();let ot=Ee.args;if(Array.isArray(ot)&&ot.every(Re=>typeof Re=="string"))return ot.join(" ");let Se=Ee.location,Ve=Se&&typeof Se=="object"?Se.path:void 0,Kt=Ee.path??Ee.file_path??Ee.file??Ee.filename??Ve,Ce=[];typeof Kt=="string"&&Kt.trim()&&Ce.push(Kt.trim());let _t=Ee.content;typeof _t=="string"&&Ce.push(`contentBytes=${Buffer.byteLength(_t,"utf8")}`);let Ae=Ee.patch??Ee.diff;if(typeof Ae=="string"&&Ce.push(`patchBytes=${Buffer.byteLength(Ae,"utf8")}`),Ce.length>0)return Ce.join(" ");let Ue=300,At=30,Ms=4,Gs=(Re,Wn)=>{if(typeof Re=="string")return Re.length>Ue?`${Re.slice(0,Ue)}\u2026 (${Re.length} chars)`:Re;if(typeof Re=="number"||typeof Re=="boolean"||Re===null)return Re;if(Array.isArray(Re)){if(Wn>=Ms)return`[Array(${Re.length})]`;let yt=Re.slice(0,At).map(Kn=>Gs(Kn,Wn+1));return Re.length>At?[...yt,`\u2026 (${Re.length-At} more)`]:yt}if(typeof Re=="object"&&Re){if(Wn>=Ms)return"[Object]";let yt={};for(let[Kn,ds]of Object.entries(Re)){if(typeof ds=="string"&&/content|text|data|body|patch|diff/i.test(Kn)&&ds.length>Ue){yt[Kn]=`<${Buffer.byteLength(ds,"utf8")} bytes>`;continue}yt[Kn]=Gs(ds,Wn+1)}return yt}};try{let Re=JSON.stringify(Gs(U,0),null,2),Wn=Re.trim();return Wn==="{}"||Wn==="[]"?void 0:Re}catch{return}},Uo=J=>{if(!J||typeof J!="object")return;let U=J,Ee=U.type;if(Ee==="tool_use"||Ee==="server_tool_use"){let Ne=U.id,ot=U.name,Se=U.input;return typeof Ne=="string"&&typeof ot=="string"?{id:Ne,name:ot,input:Se}:void 0}if(Ee==="mcp_tool_use"){let Ne=U.id,ot=U.name,Se=U.server_name,Ve=U.input;if(typeof Ne=="string"&&typeof ot=="string"&&typeof Se=="string")return{id:Ne,name:`${Se}.${ot}`,input:Ve}}},Er=J=>{if(typeof J=="string")return J;if(J!=null)try{return JSON.stringify(J,null,2)}catch{return String(J)}},_u=J=>{if(typeof J=="string")return J;if(Array.isArray(J)){let U=[];for(let Ne of J){if(typeof Ne=="string"){U.push(Ne);continue}if(!Ne||typeof Ne!="object")continue;let ot=Ne;if(typeof ot.text=="string"){U.push(ot.text);continue}let Se=Er(Ne);Se&&U.push(Se)}return U.join(`
85
+ `).trim()||void 0}if(J&&typeof J=="object"){let U=J;if(typeof U.text=="string")return U.text}return Er(J)},Ji=J=>{if(!J||typeof J!="object")return;let U=J,Ee=U.type;if(Ee!=="tool_result"&&Ee!=="server_tool_result"&&Ee!=="mcp_tool_result")return;let Ne=U.tool_use_id;if(typeof Ne!="string"||!Ne)return;let ot=_u(U.content??U.result??U.output??U.data??U.text),Se=typeof U.is_error=="boolean"?U.is_error:typeof U.isError=="boolean"?U.isError:void 0;return{toolUseId:Ne,resultText:ot,isError:Se}},ci=async(J,U,Ee)=>{if(!(!ls.has(U)||!!Ee&&!Wi.has(U))){Ls.set(U,J);return}It++,ls.add(U),Ee&&Wi.add(U),Ls.set(U,J),we||await r.toolStart(J,Ee,U)},li=async(J,U,Ee,Ne)=>{if(Ki.has(J))return;let ot=Ls.get(J)??Ne??"tool";ls.has(J)||await ci(ot,J),Ki.add(J),Ls.delete(J),we||await r.toolEnd(ot,J,U,Ee)},us=!1,Ho=0;for await(let J of se.receive()){Ho++;let U=J,Ee=U.session_id;!us&&Ee&&(us=!0,await(0,zo.persistSessionIfNeeded)("claude",b,Ee,n));let Ne=U.type==="result"||U.type==="system"?U.subtype:void 0;if(o.debug(`[AgentIDE] Claude msg #${Ho}: type=${U.type}, subtype=${Ne||"none"}`),we&&U.type!=="result")continue;if(U.type==="stream_event"){let Se=U.event,Ve=Se.type;if(Ve==="content_block_start"){let Kt=Se.content_block,Ce=Kt?.type,_t=Se.index;if(Ce==="thinking"){let Ae=Kt?.thinking;tn++,typeof Ae=="string"&&Ae?(Pt+=Ae.length,o.debug(`[AgentIDE] Claude thinking block start (${Ae.length} chars): ${Go(Ae)}`),we||await r.thinking(Ae)):o.debug("[AgentIDE] Claude thinking block start (no initial thinking text)")}else if(Ce==="redacted_thinking"){me++;let Ae=Kt?.data;o.debug(`[AgentIDE] Claude redacted_thinking block start (dataType=${typeof Ae})`)}else{let Ae=Ji(Se.content_block);if(Ae){await li(Ae.toolUseId,Ae.resultText,Ae.isError);continue}let Ue=Uo(Se.content_block);if(Ue&&(Gt++,typeof _t=="number"&&(Mo.set(_t,Ue.id),qi.set(_t,Ue.name)),!ls.has(Ue.id))){let At=Yi(Ue.name,Ue.input);o.debug(`[AgentIDE] Claude tool_use start: ${Ue.name} (id=${Ue.id}, input=${At?"yes":"no"})`),await ci(Ue.name,Ue.id,At)}}}else if(Ve==="content_block_delta"){let Kt=Se.delta,Ce=Kt.type,_t=Kt.thinking,Ae=Kt.text;if(Ce==="thinking_delta"&&typeof _t=="string"&&_t)Y++,Pt+=_t.length,Y<=3&&o.debug(`[AgentIDE] Claude thinking delta #${Y} (${_t.length} chars): ${Go(_t)}`),we||await r.thinking(_t);else if(Ce==="input_json_delta"){let Ue=Se.index,At=Kt.partial_json;if(typeof Ue=="number"&&typeof At=="string"&&At){pn++;let Gs=(ai.get(Ue)??"")+At;ai.set(Ue,Gs);let Re=Mo.get(Ue);if(Re&&!Wi.has(Re))try{let Wn=JSON.parse(Gs),yt=qi.get(Ue)??"tool",Kn=Yi(yt,Wn);Kn&&(o.debug(`[AgentIDE] Claude tool_use input_json parsed: ${yt} (id=${Re})`),await ci(yt,Re,Kn))}catch{}}}else Ce==="text_delta"&&typeof Ae=="string"&&Ae&&(A+=Ae,we||await r.text(Ae))}}else if(U.type==="assistant"){let Se=U.message.content;if(Array.isArray(Se))for(let Ve of Se){let Kt=Ve.type,Ce=Ve.text,_t=Ji(Ve);if(_t){await li(_t.toolUseId,_t.resultText,_t.isError);continue}let Ae=Uo(Ve);if(Ae&&!ls.has(Ae.id)){Gt++;let Ue=Yi(Ae.name,Ae.input);o.debug(`[AgentIDE] Claude tool_use (assistant msg): ${Ae.name} (id=${Ae.id}, input=${Ue?"yes":"no"})`),await ci(Ae.name,Ae.id,Ue);continue}Kt==="text"&&typeof Ce=="string"&&Ce&&(we||await P(Ce))}}else if(U.type==="tool_progress"){Pn++;let Se=U.tool_use_id,Ve=U.tool_name||"tool";Se&&!ls.has(Se)&&(o.debug(`[AgentIDE] Claude tool_progress: ${Ve} (tool_use_id=${Se})`),await ci(Ve,Se))}else if(U.type==="system")U.subtype==="status"&&U.status==="compacting"&&(we||await r.progress("Compacting context\u2026"));else if(U.type==="result"){if(U.subtype==="success")we||await P(U.result);else if(!we)throw new Error(U.errors?.join(`
86
+ `)||U.subtype)}let ot=U.message?.content;if(U.type!=="assistant"&&Array.isArray(ot))for(let Se of ot){let Ve=Ji(Se);Ve&&await li(Ve.toolUseId,Ve.resultText,Ve.isError)}}for(let[J,U]of Array.from(Ls.entries()))await li(J,"Completed",!1,U);o.info(`[AgentIDE] Claude thinking summary: startBlocks=${tn}, redactedBlocks=${me}, deltas=${Y}, chars=${Pt}`),o.info(`[AgentIDE] Claude tool summary: toolBlocks=${Gt}, toolEmits=${It}, toolProgressMsgs=${Pn}, inputJsonDeltas=${pn}`),tn===0&&Y===0&&me===0&&o.debug(`[AgentIDE] Claude emitted no thinking blocks/deltas. Ensure model supports extended thinking and set ${(0,bI.toSettingsDisplayKey)("agentide.claude.maxThinkingTokens")} >= 1024.`),Gt===0&&Pn===0&&o.debug("[AgentIDE] Claude emitted no tool usage events. If tools were used, ensure includePartialMessages=true and parse tool_use blocks."),(0,zo.touchSessionIfNeeded)(b)}catch(Y){if(!we)throw Y;o.info(`[AgentIDE] Claude stream aborted: ${Y instanceof Error?Y.message:String(Y)}`)}finally{i?.removeEventListener("abort",en)}},{signal:i,timeoutMs:$c.DEFAULT_CONVERSATION_LOCK_TIMEOUT_MS,label:"claude.stream"}),await r.done(),o.info("[AgentIDE] Claude streaming complete")}dispose(){for(let e of this.activeSessions.values())try{e.session.close()}catch{}this.activeSessions.clear()}onMaintenance(e){this.sweepIdleSessions(e)}loadClaudeSdk(){return import("@anthropic-ai/claude-agent-sdk")}sweepIdleSessions(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())if(n-s.lastUsedAt>II){try{s.session.close(),e?.info(`[AgentIDE] Closed idle Claude session (key=${r}, idleMs=${n-s.lastUsedAt})`)}catch{}this.activeSessions.delete(r)}}async getOrCreateSession(e){let n=this.activeSessions.get(e.conversationKey);if(n&&n.signatureHash===e.signatureHash&&n.modelId===e.modelId&&n.cheapModel===e.cheapModel&&n.effort===e.effort&&n.credentialFingerprint===e.credentialFingerprint&&n.agentideSignature===e.agentideSignature)return n.lastUsedAt=Date.now(),n.editTrackingState.aborted=!1,n.editTrackingState.pendingOperations.clear(),(0,$c.touchPersistedSession)(e.conversationKey),e.logger.debug(`[AgentIDE] REUSING existing Claude session (key=${e.conversationKey}) - NOTE: hooks from original session creation are used, not new ones`),n;let r;if(n){n.signatureHash===e.signatureHash&&n.agentideSignature!==e.agentideSignature&&(e.logger.info(`[AgentIDE] AgentIDE manifest changed (${n.agentideSignature} \u2192 ${e.agentideSignature}), restarting Claude session with resume`),r=n.session.sessionId??void 0),n.modelId!==e.modelId&&(e.logger.info(`[AgentIDE] Model changed (${n.modelId} \u2192 ${e.modelId}), will resume session with new model`),r=n.session.sessionId??void 0),n.cheapModel!==e.cheapModel&&(e.logger.info(`[AgentIDE] Cheap model changed (${n.cheapModel??"unset"} \u2192 ${e.cheapModel??"unset"}), will resume session with updated env`),r=n.session.sessionId??void 0),n.effort!==e.effort&&(e.logger.info(`[AgentIDE] Effort changed (${n.effort??"default"} \u2192 ${e.effort??"default"}), will resume session with new effort`),r=n.session.sessionId??void 0),n.credentialFingerprint!==e.credentialFingerprint&&(e.logger.info("[AgentIDE] Credential rotated, will resume session with fresh credentials"),r=n.session.sessionId??void 0);try{n.session.close()}catch{}this.activeSessions.delete(e.conversationKey)}!r&&!e.isEphemeral&&(r=(0,zo.getPersistedSessionId)("claude",e.conversationKey)),r?e.logger.info(`[AgentIDE] Claude session will resume: ${r} (model: ${e.modelId})`):e.logger.info(`[AgentIDE] Claude session starting new (model: ${e.modelId})`);let s=await this.loadClaudeSdk(),o={session:$I({resumeSessionId:r,queryFn:s.query,options:e.queryOptions}),chatSessionId:e.chatSessionId,signatureHash:e.signatureHash,agentideSignature:e.agentideSignature,modelId:e.modelId,cheapModel:e.cheapModel,effort:e.effort,credentialFingerprint:e.credentialFingerprint,lastUsedAt:Date.now(),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,hd.loadMcpServers)(r,n,i);if(o.length===0)return{spawn:{},perTurn:{}};let a={},c={};for(let d of o){if(d.url&&d.bearerTokenEnv){let u=(0,hd.resolveHttpMcpHeaders)(d,s??process.env);c[d.name]={type:"http",url:d.url,...u?{headers:u}:{}};continue}if(d.url){let u=(0,hd.referenceHttpMcpHeaders)(d,s??process.env);a[d.name]={type:"http",url:d.url,...u?{headers:u}:{}};continue}a[d.name]={command:d.command,args:d.args,...d.env&&Object.keys(d.env).length>0?{env:d.env}:{}}}let l=r==="default"?"bundled":`pack:${r}`;return e.debug(`[AgentIDE] Claude MCP servers loaded (${l}): ${o.map(d=>d.name).join(", ")} (per-turn: ${Object.keys(c).join(", ")||"none"})`),{spawn:a,perTurn:c}}};vr.ClaudeEngine=md});var _d=S(wn=>{"use strict";var DI=wn&&wn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),LI=wn&&wn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),MI=wn&&wn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&DI(n,e,r[s]);return LI(n,e),n}})();Object.defineProperty(wn,"__esModule",{value:!0});wn.syncPackMcpToWorkspace=Zm;wn.syncPackToWorkspace=VI;wn.computeSkillsSignature=eE;wn.createSkillsSignatureGetter=WI;wn.createSessionDir=KI;wn.getSessionDir=qI;var ze=require("fs"),Q=MI(require("path")),zm=require("crypto"),_e=on(),GI=tc(),De=qn(),Qm=mi(),UI=Fo(),HI=Bs();async function Zm(t,e,n,r){let s=Q.join(t,De.AGENT_CONSTANTS.MANIFEST_FILE);if(!await(0,_e.pathExists)(s))return;let i;try{i=await(0,Qm.loadAgentManifest)(s)}catch(u){Ht(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=Q.join(e,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.AGENTS_DIR,n,De.AGENT_CONSTANTS.MCP_DIR);await ze.promises.mkdir(a,{recursive:!0});let c={mcpServers:{}},l=Q.join(a,".mcp.json");for(let u of o){let f=u.config?.trim();if(!f)continue;let p=Q.resolve(t,f);if(!Ed(t,p)){Ht(r,`[AgentIDE] Skipping MCP config ${f}: path escapes pack root`);continue}if(!await(0,_e.pathExists)(p)){Ht(r,`[AgentIDE] Skipping MCP config ${f}: file not found`);continue}try{let m=JSON.parse(await ze.promises.readFile(p,"utf8")).mcpServers;m&&typeof m=="object"&&Object.assign(c.mcpServers,m)}catch(g){Ht(r,`[AgentIDE] Skipping MCP config ${f}: ${g instanceof Error?g.message:String(g)}`)}}let d=Q.join(t,De.AGENT_CONSTANTS.MCP_DIR);if(await(0,_e.pathExists)(d)){let u=await ze.promises.readdir(d,{withFileTypes:!0});for(let f of u){if(!f.isDirectory()||f.name.startsWith("."))continue;let p=Q.join(d,f.name),g=Q.join(a,f.name);await(0,_e.pathExists)(g)||await(0,_e.copyDirRecursive)(p,g)}}!c.mcpServers||Object.keys(c.mcpServers).length===0||(await(0,_e.writeFileIfChanged)(l,`${JSON.stringify(c,null,2)}
87
+ `),Ht(r,`[AgentIDE] Synced pack MCP config: ${l}`))}function Xm(t){return!(!t||!t.trim()||Q.isAbsolute(t)||/^(https?:\/\/|git@|ssh:\/\/)/i.test(t))}function Ed(t,e){let n=Q.relative(t,e);return n!==".."&&!n.startsWith(`..${Q.sep}`)&&!Q.isAbsolute(n)}async function jI(t){return(await ze.promises.readdir(t)).length===0}async function xI(t,e,n,r){let s=Q.join(e,De.AGENT_CONSTANTS.MANIFEST_FILE);if(await(0,_e.pathExists)(s))try{let o=(await(0,Qm.loadAgentManifest)(s)).spec?.data;if(!o)return;let a=o.sourcePath?.trim()||"./data",c=(o.workspacePath?.trim()||`.${Q.sep}${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}${Q.sep}data${Q.sep}${n}`).replace(/^(?:\.\/|\.\\)/,"");if(!Xm(a)||!Xm(c)){Ht(r,`[AgentIDE] Skipping data sync for ${n}: invalid spec.data paths`);return}let l=Q.resolve(e,a),d=Q.resolve(t,c);if(!Ed(e,l)||!Ed(t,d)){Ht(r,`[AgentIDE] Skipping data sync for ${n}: path escapes allowed root`);return}if(!await(0,_e.pathExists)(l))return;if(!await(0,_e.pathExists)(d)){await(0,_e.copyDirRecursive)(l,d),Ht(r,`[AgentIDE] Seeded pack data for ${n}: ${d}`);return}(await ze.promises.stat(d)).isDirectory()&&await jI(d)&&(await(0,_e.copyDirRecursive)(l,d),Ht(r,`[AgentIDE] Seeded pack data for ${n}: ${d}`))}catch(i){Ht(r,`[AgentIDE] Skipping data sync for ${n}: ${i instanceof Error?i.message:String(i)}`)}}async function BI(t){let e=Q.join(t,"SKILL.md");try{if((await ze.promises.lstat(e)).isSymbolicLink()){let r=await ze.promises.readlink(e),s=Q.isAbsolute(r)?r:Q.resolve(Q.dirname(e),r);if(Q.resolve(s)===Q.resolve(e))return!1}return await ze.promises.access(e),!0}catch{return!1}}async function FI(t,e,n){let r=Q.join(t,"skills");if(!await(0,_e.pathExists)(r))return;await ze.promises.mkdir(e,{recursive:!0});let s=await ze.promises.readdir(r,{withFileTypes:!0});for(let i of s){if(!i.isDirectory())continue;let o=Q.join(e,i.name);await(0,_e.pathExists)(o)&&await BI(o)||(await(0,_e.pathExists)(o)&&await ze.promises.rm(o,{recursive:!0,force:!0}),await(0,_e.copyDirRecursive)(Q.join(r,i.name),o),Ht(n,`[AgentIDE] Bootstrapped bundled skill: ${i.name}`))}}async function VI(t,e,n,r,s,i){let o=GI.AGENT_ENGINES[r],a=o?{workspaceDir:o.workspaceDir,rulesFile:o.rulesFile,includeSkills:!0,includeRules:!0}:(()=>{let A=(0,HI.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=Q.join(e,"AGENTS.md"),l=Q.join(e,"context.md"),d=Q.join(e,"skills"),u=Q.join(e,"rules");await(0,_e.ensureWorkspaceGitAndGitignore)(t,s);let f=Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.AGENTS_DIR,n);if(await ze.promises.mkdir(f,{recursive:!0}),await(0,_e.pathExists)(c)){let A=await ze.promises.readFile(c,"utf8");await(0,_e.writeFileIfChanged)(Q.join(f,De.AGENT_CONSTANTS.AGENTS_MD),A)}if(await(0,_e.pathExists)(l)){let A=await ze.promises.readFile(l,"utf8");await(0,_e.writeFileIfChanged)(Q.join(f,De.AGENT_CONSTANTS.CONTEXT_MD),A)}let p=Q.join(e,De.AGENT_CONSTANTS.GHOST_TEXT_FILE);if(await(0,_e.pathExists)(p)){let A=await ze.promises.readFile(p,"utf8");await(0,_e.writeFileIfChanged)(Q.join(f,De.AGENT_CONSTANTS.GHOST_TEXT_FILE),A),Ht(s,`[AgentIDE] Synced GHOST_TEXT.md to ${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}`)}let g=Q.join(f,De.AGENT_CONSTANTS.SKILLS_DIR),m=Q.resolve(d),h=Q.resolve(g);await(0,_e.pathExists)(d)&&(m===h?Ht(s,`[AgentIDE] Skipping skills self-sync (pack already under ${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n})`):(await(0,_e.syncDirByFileLinks)(d,g,s,`${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}/agents/${n}/skills`),Ht(s,`[AgentIDE] Synced skills to ${De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME}: ${g}`))),i&&await FI(i,g,s);let w=Q.join(f,De.AGENT_CONSTANTS.RULES_DIR);if(await(0,_e.pathExists)(u)){await ze.promises.mkdir(w,{recursive:!0});let A=await ze.promises.readdir(u,{withFileTypes:!0});for(let P of A){if(!P.isFile()||!P.name.toLowerCase().endsWith(".md"))continue;let b=Q.join(u,P.name),N=Q.join(w,P.name);await(0,_e.symlinkOrCopyFile)(b,N,s,`rules/${P.name}`,{force:!0})}}if(n===De.AGENT_CONSTANTS.DEFAULT_AGENT_ID&&i){let A=await(0,UI.getDefaultMcpConfig)(i);if(A){let P=Q.join(f,De.AGENT_CONSTANTS.MCP_DIR);await ze.promises.mkdir(P,{recursive:!0});let b=Q.join(P,".mcp.json");await(0,_e.writeFileIfChanged)(b,A),Ht(s,`[AgentIDE] Synced MCP config: ${b}`)}}if(await Zm(e,t,n,s),await xI(t,e,n,s),!a)return;let _=Q.join(t,a.workspaceDir);await ze.promises.mkdir(_,{recursive:!0});let E="";if(await(0,_e.pathExists)(c)&&(E=await ze.promises.readFile(c,"utf8")),await(0,_e.pathExists)(l)){let A=await ze.promises.readFile(l,"utf8");E=E.trimEnd()+`
88
88
 
89
89
  ---
90
90
 
91
91
  `+A.trimEnd()+`
92
- `}let O=Q.join(_,a.rulesFile);E&&(await(0,_e.writeFileIfChanged)(O,E),Ht(s,`[AgentIDE] Synced rules: ${O}`));let T=Q.join(_,"skills");a.includeSkills&&await(0,_e.pathExists)(g)&&await(0,_e.syncDirByFileLinks)(g,T,s,`${a.workspaceDir}/skills`);let L=Q.join(_,"rules");if(a.includeRules&&await(0,_e.pathExists)(u)){await ze.promises.mkdir(L,{recursive:!0});let A=await ze.promises.readdir(u,{withFileTypes:!0});for(let I of A){if(!I.isFile()||!I.name.toLowerCase().endsWith(".md"))continue;let b=Q.join(u,I.name),N=Q.join(L,I.name);await(0,_e.symlinkOrCopyFile)(b,N,s,`rules/${I.name}`,{force:!0})}}Ht(s,`[AgentIDE] Pack '${n}' synced to workspace: ${t}`)}function eE(t,e){let n=Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.AGENTS_DIR,e,De.AGENT_CONSTANTS.SKILLS_DIR);try{let r=require("fs");if(!r.existsSync(n))return;let s=(0,zm.createHash)("sha256"),i=r.readdirSync(n,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||o.name.startsWith("."))continue;let a=Q.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 WP(t){return e=>eE(e,t)}async function KP(t){let e=(0,zm.randomUUID)(),n=Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.SESSIONS_DIR,e);return await ze.promises.mkdir(n,{recursive:!0}),e}function qP(t,e){return Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.SESSIONS_DIR,e)}function Ht(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}});var ro=S(bt=>{"use strict";var YP=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]})),JP=bt&&bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),rE=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"&&YP(n,e,r[s]);return JP(n,e),n}})();Object.defineProperty(bt,"__esModule",{value:!0});bt.ObservableStreamEmitter=bt.SessionEventWriter=bt.EVIDENCE_REQUIRED_ENV=void 0;bt.getSessionEventWriterStats=QP;bt.resetSessionEventWriterStatsForTest=ZP;bt.evidenceRequired=sE;bt.wrapEmitterWithObservability=eN;var tE=rE(require("path")),nE=require("fs"),XP=et(),zP=rE(require("os")),yd=Zi(),Vr={written:0,failed:0};function QP(){return{written:Vr.written,failed:Vr.failed,lastError:Vr.lastError}}function ZP(){Vr.written=0,Vr.failed=0,Vr.lastError=void 0}bt.EVIDENCE_REQUIRED_ENV="AGENTHIPPO_EVIDENCE_REQUIRED";function sE(t=process.env){let e=(t[bt.EVIDENCE_REQUIRED_ENV]??"").trim().toLowerCase();return e==="1"||e==="true"||e==="yes"||e==="on"}var wd=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??tE.join(zP.homedir(),XP.AGENTIDE_DIR_NAME,"analytics","sessions")}async append(e,n,r,s){try{let i=this.sanitizeSessionId(e);this.ensuredDirs.has(i)||(await nE.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=tE.join(this.baseDir,`${i}.jsonl`),c=JSON.stringify(o)+`
92
+ `}let O=Q.join(_,a.rulesFile);E&&(await(0,_e.writeFileIfChanged)(O,E),Ht(s,`[AgentIDE] Synced rules: ${O}`));let T=Q.join(_,"skills");a.includeSkills&&await(0,_e.pathExists)(g)&&await(0,_e.syncDirByFileLinks)(g,T,s,`${a.workspaceDir}/skills`);let L=Q.join(_,"rules");if(a.includeRules&&await(0,_e.pathExists)(u)){await ze.promises.mkdir(L,{recursive:!0});let A=await ze.promises.readdir(u,{withFileTypes:!0});for(let P of A){if(!P.isFile()||!P.name.toLowerCase().endsWith(".md"))continue;let b=Q.join(u,P.name),N=Q.join(L,P.name);await(0,_e.symlinkOrCopyFile)(b,N,s,`rules/${P.name}`,{force:!0})}}Ht(s,`[AgentIDE] Pack '${n}' synced to workspace: ${t}`)}function eE(t,e){let n=Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.AGENTS_DIR,e,De.AGENT_CONSTANTS.SKILLS_DIR);try{let r=require("fs");if(!r.existsSync(n))return;let s=(0,zm.createHash)("sha256"),i=r.readdirSync(n,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||o.name.startsWith("."))continue;let a=Q.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 WI(t){return e=>eE(e,t)}async function KI(t){let e=(0,zm.randomUUID)(),n=Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.SESSIONS_DIR,e);return await ze.promises.mkdir(n,{recursive:!0}),e}function qI(t,e){return Q.join(t,De.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,De.AGENT_CONSTANTS.SESSIONS_DIR,e)}function Ht(t,e){t.appendLine?t.appendLine(e):t.info&&t.info(e)}});var ro=S(bt=>{"use strict";var YI=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]})),JI=bt&&bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),rE=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"&&YI(n,e,r[s]);return JI(n,e),n}})();Object.defineProperty(bt,"__esModule",{value:!0});bt.ObservableStreamEmitter=bt.SessionEventWriter=bt.EVIDENCE_REQUIRED_ENV=void 0;bt.getSessionEventWriterStats=QI;bt.resetSessionEventWriterStatsForTest=ZI;bt.evidenceRequired=sE;bt.wrapEmitterWithObservability=eN;var tE=rE(require("path")),nE=require("fs"),XI=et(),zI=rE(require("os")),yd=Zi(),Vr={written:0,failed:0};function QI(){return{written:Vr.written,failed:Vr.failed,lastError:Vr.lastError}}function ZI(){Vr.written=0,Vr.failed=0,Vr.lastError=void 0}bt.EVIDENCE_REQUIRED_ENV="AGENTHIPPO_EVIDENCE_REQUIRED";function sE(t=process.env){let e=(t[bt.EVIDENCE_REQUIRED_ENV]??"").trim().toLowerCase();return e==="1"||e==="true"||e==="yes"||e==="on"}var wd=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??tE.join(zI.homedir(),XI.AGENTIDE_DIR_NAME,"analytics","sessions")}async append(e,n,r,s){try{let i=this.sanitizeSessionId(e);this.ensuredDirs.has(i)||(await nE.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=tE.join(this.baseDir,`${i}.jsonl`),c=JSON.stringify(o)+`
93
93
  `;await nE.promises.appendFile(a,c),this.written++,Vr.written++}catch(i){let o=i instanceof Error?i.message:String(i);this.failed++,Vr.failed++;let a={at:Date.now(),message:o,eventType:r};if(this.lastError=a,Vr.lastError=a,console.error(`[evidence] LOST session event ${r} (session=${e} request=${n}): ${o} \u2014 ${Vr.failed} evidence write(s) lost since start`),sE())throw new Error(`evidence write failed for ${r}: ${o}`)}}getStats(){return{written:this.written,failed:this.failed,lastError:this.lastError}}getSessionsDir(){return this.baseDir}};bt.SessionEventWriter=wd;var Lc=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,yd.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,yd.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,yd.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})}};bt.ObservableStreamEmitter=Lc;function eN(t,e,n,r,s,i){return new Lc(t,e,n,r,s,i)}});var Mc=S(Ti=>{"use strict";Object.defineProperty(Ti,"__esModule",{value:!0});Ti.encodeRunnerEvent=tN;Ti.encodeWorkerRequest=nN;Ti.parseWorkerOutbound=rN;Ti.applyRunnerEvent=sN;Ti.applyParsedRunnerEvent=iE;function tN(t){return`${JSON.stringify(t)}
94
94
  `}function nN(t){return`${JSON.stringify(t)}
95
- `}function rN(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 sN(t,e){let n;try{n=JSON.parse(e)}catch{return}return iE(t,n)}async function iE(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 oE=S(Gc=>{"use strict";Object.defineProperty(Gc,"__esModule",{value:!0});Gc.PersistentEngineWorkerPool=void 0;var iN=require("node:child_process"),oN=require("node:readline"),Sd=Mc(),aN=1e3*60*30,cN=1e3*60,lN=1e3*30,uN=1e3*10,Ad=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,iN.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??lN;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,oN.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,Sd.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,Sd.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(),cN),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,Sd.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??uN),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??aN)}},Td=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 Ad(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}};Gc.PersistentEngineWorkerPool=Td});var aE=S(so=>{"use strict";Object.defineProperty(so,"__esModule",{value:!0});so.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=so.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH=void 0;so.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH="fe3840b3a767b36e";so.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=`"use strict";
95
+ `}function rN(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 sN(t,e){let n;try{n=JSON.parse(e)}catch{return}return iE(t,n)}async function iE(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 oE=S(Gc=>{"use strict";Object.defineProperty(Gc,"__esModule",{value:!0});Gc.PersistentEngineWorkerPool=void 0;var iN=require("node:child_process"),oN=require("node:readline"),Sd=Mc(),aN=1e3*60*30,cN=1e3*60,lN=1e3*30,uN=1e3*10,Ad=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,iN.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??lN;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,oN.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,Sd.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,Sd.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(),cN),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,Sd.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??uN),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??aN)}},Td=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 Ad(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}};Gc.PersistentEngineWorkerPool=Td});var aE=S(so=>{"use strict";Object.defineProperty(so,"__esModule",{value:!0});so.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=so.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH=void 0;so.EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH="f3ac3ed081de8e36";so.EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE=`"use strict";
96
96
  /*---------------------------------------------------------------------------------------------
97
97
  * Copyright (c) AgentHippo.ai. All rights reserved.
98
98
  *--------------------------------------------------------------------------------------------*/
@@ -151,6 +151,19 @@ function parseInlineMcpServers(raw) {
151
151
  return undefined;
152
152
  }
153
153
  }
154
+ /** The host's turn.permissions (JSON); full access when absent, as before the host sent it. */
155
+ function parsePermissions(raw) {
156
+ try {
157
+ const parsed = raw ? JSON.parse(raw) : undefined;
158
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
159
+ return parsed;
160
+ }
161
+ }
162
+ catch {
163
+ // fall through
164
+ }
165
+ return { fileAccess: 'full' };
166
+ }
154
167
  function emitEvent(obj) {
155
168
  process.stdout.write(\`\${JSON.stringify(obj)}\\n\`);
156
169
  }
@@ -159,6 +172,7 @@ const runtime = {
159
172
  info: () => { },
160
173
  warn: () => { },
161
174
  error: () => { },
175
+ debug: () => { },
162
176
  },
163
177
  };
164
178
  /** Apply the engine entry's directory to cwd + NODE_PATH so its node_modules resolve. */
@@ -213,7 +227,7 @@ function buildTurn(env, emitter, signal) {
213
227
  modelId,
214
228
  workspaceRoot,
215
229
  additionalDirectories: [],
216
- permissions: { fileAccess: 'full' },
230
+ permissions: parsePermissions(env.AGENTHIPPO_PERMISSIONS),
217
231
  env: { ...env },
218
232
  routing: {
219
233
  useLiteLLM: env.AGENTHIPPO_USE_LITELLM === 'true',
@@ -233,7 +247,12 @@ function buildTurn(env, emitter, signal) {
233
247
  terminalLogPath: env.AGENTHIPPO_TERMINAL_LOG_PATH?.trim() || undefined,
234
248
  attachmentsDir: env.AGENTHIPPO_ATTACHMENTS_DIR?.trim() || undefined,
235
249
  },
236
- agent: { id: env.AGENTHIPPO_ACTIVE_AGENT ?? 'default' },
250
+ agent: {
251
+ id: env.AGENTHIPPO_ACTIVE_AGENT ?? 'default',
252
+ ...(env.AGENTHIPPO_RULES_FILE_PATH ? { rulesFilePath: env.AGENTHIPPO_RULES_FILE_PATH } : {}),
253
+ ...(env.AGENTHIPPO_SKILLS_DIR ? { skillsDir: env.AGENTHIPPO_SKILLS_DIR } : {}),
254
+ ...(env.AGENTHIPPO_RULES_DIR ? { rulesDir: env.AGENTHIPPO_RULES_DIR } : {}),
255
+ },
237
256
  ...(mcpServers ? { mcpServers } : {}),
238
257
  emitter,
239
258
  runtime,
@@ -410,14 +429,14 @@ else {
410
429
  process.exit(1);
411
430
  });
412
431
  }
413
- `});var bd=S(Yt=>{"use strict";var dN=Yt&&Yt.__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]})),fN=Yt&&Yt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pN=Yt&&Yt.__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"&&dN(n,e,r[s]);return fN(n,e),n}})();Object.defineProperty(Yt,"__esModule",{value:!0});Yt.NODE_RUNNER_FILENAME=void 0;Yt.ensureNodeRunnerScriptPath=mN;Yt.embeddedRunnerContentHash=EN;var gN=require("node:crypto"),io=require("node:fs"),Vs=pN(require("node:path")),hN=fi();Yt.NODE_RUNNER_FILENAME="run-custom-engine-runner.js";async function cE(){return Promise.resolve().then(()=>Pn(aE()))}async function mN(){let t=[],e=process.argv[1];e&&t.push(Vs.join(Vs.dirname(e),Yt.NODE_RUNNER_FILENAME)),t.push(Vs.join(Vs.dirname(process.execPath),Yt.NODE_RUNNER_FILENAME));for(let o of t)try{return await io.promises.access(o),o}catch{}let{EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH:n,EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:r}=await cE(),s=Vs.join((0,hN.getAgentideHome)(),"cache","cli"),i=Vs.join(s,`${Yt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-${n}.js`);try{if(await io.promises.readFile(i,"utf8")===r)return i}catch{}await io.promises.mkdir(s,{recursive:!0}),await io.promises.writeFile(i,r,"utf8");try{let o=`${Yt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-`;for(let a of await io.promises.readdir(s))a.startsWith(o)&&a.endsWith(".js")&&Vs.join(s,a)!==i&&await io.promises.unlink(Vs.join(s,a)).catch(()=>{})}catch{}return i}async function EN(){let{EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:t}=await cE();return(0,gN.createHash)("sha256").update(t).digest("hex")}});var Pd=S(Sn=>{"use strict";var _N=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]})),yN=Sn&&Sn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wN=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"&&_N(n,e,r[s]);return yN(n,e),n}})();Object.defineProperty(Sn,"__esModule",{value:!0});Sn.CustomEngine=void 0;Sn.resolveCustomEngineLoadStrategy=lE;Sn.deliverModelRoutingEnv=uE;Sn.buildRunnerChildEnv=Id;Sn.probeCustomEngineImport=kN;var SN=require("node:child_process"),AN=require("node:readline"),Zo=require("fs"),Rt=wN(require("path")),TN=require("url"),Qo=hi(),bN=br(),vN=Bs(),Es=qn(),ON=ps(),Uc=on(),Hc=Ic(),IN=Mc(),PN=oE(),vd=gi(),jc=Fo(),NN=1e3*60*30;function lE(){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 RN(t){let e=t.engineId?.trim();if(e&&e!=="claude"&&e!=="codex")return e}function CN(t){return t.configProvider?.get("agentide","additionalEngineDir")}function xc(t,e){let n=Rt.join(e,"node_modules"),r=t.NODE_PATH?.trim();t.NODE_PATH=r?`${n}${Rt.delimiter}${r}`:n}function uE(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 Id(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,jc.serializeInlineMcpServers)(e.mcpServers):void 0;return s&&(r[jc.AGENTHIPPO_MCP_SERVERS_ENV]=s),xc(r,t.manifestDir),r}async function dE(t,e,n,r,s){let i;try{let{ensureNodeRunnerScriptPath:c}=await Promise.resolve().then(()=>Pn(bd()));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,Hc.resolveNodeBinary)();e.runtime.logger.info(`[AgentIDE] Custom engine Node runner: ${o}`);let a=Id(t,e,r);return process.platform==="win32"&&o===process.execPath&&!o.toLowerCase().endsWith("\\node.exe")&&(a.ELECTRON_RUN_AS_NODE="1"),(0,Hc.prependPathDir)(a,Rt.dirname(o)),new Promise((c,l)=>{let d=(0,SN.spawn)(o,[i],{cwd:t.manifestDir,env:a,stdio:["ignore","pipe","pipe"]}),u="",f,p=Promise.resolve(),g=(0,AN.createInterface)({input:d.stdout});g.on("line",h=>{p=p.then(async()=>{let w=await(0,IN.applyRunnerEvent)(n,h);w&&(f=w)}).catch(w=>{g.close(),d.kill(),l(w)})}),d.stderr?.on("data",h=>{u+=String(h)});let m=()=>{d.kill("SIGTERM")};s?.addEventListener("abort",m,{once:!0}),d.on("error",l),d.on("close",h=>{s?.removeEventListener("abort",m),g.close(),p.finally(()=>{if(h===0)c(f?{nativeSessionId:f}:void 0);else{let w=u.trim()||`Custom engine Node runner exited with code ${h}`;l(new Error(w))}})})})}async function kN(t,e){try{if(e==="in-process")return await fE(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 dE(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 fE(t){let{entryPath:e,id:n,engineExport:r}=t;try{await Zo.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),xc(process.env,t.manifestDir);let o=await Zo.promises.stat(e).catch(()=>{}),a=`${(0,TN.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 d=typeof l=="function"?new l:l;return $N(n,d),d}finally{process.chdir(s),i===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=i}}function $N(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 DN(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160)||"session"}function LN(t){let e=[];t.session.contextFilePath&&e.push(`context_file: ${Rt.relative(t.workspaceRoot,t.session.contextFilePath)}`),t.session.terminalLogPath&&e.push(`terminal_log: ${Rt.relative(t.workspaceRoot,t.session.terminalLogPath)}`),t.session.attachmentsDir&&e.push(`attachments_dir: ${Rt.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(`
414
- `)}var MN=5e3,Od=class{config;getBundledBasePromptsDir;id="custom";displayName="Custom Engine";instances=new Map;activeSessions=new Map;mtimeCache=new Map;workerPool=new PN.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<MN)return r.mtime;let s=(await Zo.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=RN(n),a=(0,vN.resolveCustomEngineManifest)(n.workspaceRoot,o,CN(s),(d,u)=>s.logger.warn(`[AgentIDE] Skipping malformed custom engine manifest ${d}: ${u instanceof Error?u.message:String(u)}`)),c=`custom:${a.id}`,l=(0,vd.buildConversationKey)(c,n);await(0,vd.withConversationLock)(l.key,async()=>{let d=lE(),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=${d} entry=${a.entryPath}`);let f;if(d==="in-process"){let{engine:m}=await this.getOrLoadInstance(a,s),h=process.cwd(),w=process.env.NODE_PATH;try{process.chdir(a.manifestDir),xc(process.env,a.manifestDir),f=await m.run(u)}finally{process.chdir(h),w===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=w}}else d==="persistent-worker"?f=await this.runViaPersistentWorker(a,u,r,i):f=await dE(a,u,r,!1,i);let p=f?.nativeSessionId?.trim(),g=p||u.session.nativeSessionId;this.activeSessions.set(l.key,{nativeSessionId:g,lastUsedAt:Date.now()}),p?await(0,Qo.persistSessionIfNeeded)(c,l,p,n):(0,Qo.touchSessionIfNeeded)(l)},{signal:i,timeoutMs:vd.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 fE(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(()=>Pn(bd())),o=await i(),a=await(0,Hc.resolveNodeBinary)();n.runtime.logger.info(`[AgentIDE] Custom engine persistent worker: ${a}`);let c=Id(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,Hc.prependPathDir)(l,Rt.dirname(a));let d=await this.buildCacheKey(e);return this.workerPool.run({cacheKey:d,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 d=r.modelId?.trim()||e.model?.defaultModel?.trim();if(!d)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??Es.AGENT_CONSTANTS.DEFAULT_AGENT_ID,f=r.contextSessionId?.trim()||r.sessionId?.trim()||a,p=DN(f),g=this.config.customEnginesStoragePath??Rt.join(this.config.storagePath,Es.AGENT_CONSTANTS.AGENTS_DIR,u,"custom"),m=Rt.join(g,e.id),h=(0,Es.userScopedEngineHomeFromKey)(Rt.join(m,"home"),(0,ON.resolveEngineHomeUserKey)(r.engineHomeUserKey)),w=Rt.join(m,Es.AGENT_CONSTANTS.SESSIONS_DIR,p);await Zo.promises.mkdir(h,{recursive:!0}),await Zo.promises.mkdir(w,{recursive:!0});let _=Rt.join(r.workspaceRoot,Es.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Es.AGENT_CONSTANTS.SESSIONS_DIR,f),E=Rt.join(_,Es.AGENT_CONSTANTS.CONTEXT_MD),O=Rt.join(_,"terminal.md"),T=Rt.join(_,"attachments"),L=this.activeSessions.get(o)?.nativeSessionId??(0,Qo.getPersistedSessionId)(`custom:${e.id}`,o),A=(0,Uc.resolveApiRouting)(r,this.config,(0,Uc.inferModelProvider)(r.modelId),i.configProvider),I=A.apiKey?.trim()||void 0,b=A.baseUrl?.trim()||void 0,N=A.openaiBaseUrl?.trim()||void 0,P=e.workspaceSync?.enabled?Rt.join(r.workspaceRoot,e.workspaceSync.dir,e.workspaceSync.rulesFile):void 0,v=e.workspaceSync?.enabled&&e.workspaceSync.includeSkills?Rt.join(r.workspaceRoot,e.workspaceSync.dir,Es.AGENT_CONSTANTS.SKILLS_DIR):void 0,F=e.workspaceSync?.enabled&&e.workspaceSync.includeRules?Rt.join(r.workspaceRoot,e.workspaceSync.dir,Es.AGENT_CONSTANTS.RULES_DIR):void 0,B={...process.env,...i.cliEnvPatch??{},AGENTHIPPO_ENGINE_ID:e.id,AGENTHIPPO_ENGINE_HOME:h,AGENTHIPPO_ENGINE_SESSION_DIR:w,AGENTHIPPO_CONTEXT_SESSION_ID:f,AGENTHIPPO_CONTEXT_EXPORT_PATH:E,AGENTHIPPO_TERMINAL_LOG_PATH:O,AGENTHIPPO_ATTACHMENTS_DIR:T,AGENTHIPPO_ACTIVE_AGENT:u,AGENT_ID:u,AGENTHIPPO_MODEL_ID:d,AGENTHIPPO_USE_LITELLM:A.useLiteLLM?"true":"false"};if(delete B[bN.OPENCLAW_GATEWAY_TOKEN_ENV],delete B.AGENTHIPPO_DATA_PLANE_TOKEN,xc(B,e.manifestDir),I&&(B.AGENTHIPPO_API_KEY=I),b&&(B.AGENTHIPPO_BASE_URL=b),N&&(B.AGENTHIPPO_OPENAI_BASE_URL=N),A.useLiteLLM){B.AGENTHIPPO_LITELLM_API_KEY=I??"sk-dummy",B.AGENTIDE_LITELLM_API_KEY=I??"sk-dummy",b&&(B.AGENTHIPPO_LITELLM_BASE_URL=b,B.AGENTIDE_LITELLM_BASE_URL=b);let xe=(0,Qo.buildLiteLLMMetadataHeaders)(!0,{sessionId:r.sessionId,analyticsUserId:r.analyticsUserId,analyticsProjectId:(0,Qo.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});xe.length>0&&(B.AGENTHIPPO_LITELLM_METADATA_HEADERS=xe.join(`
415
- `))}r.agentPackVersion&&(B.AGENTHIPPO_AGENT_VERSION=r.agentPackVersion,B.AGENTIDE_AGENT_VERSION=r.agentPackVersion),e.homeEnvVar&&(B[e.homeEnvVar]=h),uE(B,e,{apiKey:I,baseUrl:b,openaiBaseUrl:N},process.env,i.logger),(b&&(0,Uc.applyLocalTlsBypass)(B,b)||N&&N!==b&&(0,Uc.applyLocalTlsBypass)(B,N))&&i.logger.info(`[AgentIDE] Disabling TLS verification for local HTTPS (${e.id})`);let re=A.useLiteLLM?"LiteLLM proxy":b?"custom provider":"native provider";i.logger.info(`[AgentIDE] Custom engine "${e.id}" routing: ${re}, baseUrl=${b||"default"}, model=${d}`);let X=await(0,jc.loadMcpServers)(u,r.workspaceRoot,this.getBundledBasePromptsDir()),te=(0,jc.formatInlineMcpServers)(X,B);X.length>0&&i.logger.debug(`[AgentIDE] Custom engine "${e.id}" MCP (${u}): ${X.map(xe=>xe.name).join(", ")}`);let Pe=n,Ge={message:Pe,modelId:d,workspaceRoot:r.workspaceRoot,additionalDirectories:r.additionalDirectories??[],permissions:r.permissions??{fileAccess:"workspace-write"},env:B,routing:{useLiteLLM:A.useLiteLLM,...I?{apiKey:I}:{},...b?{baseUrl:b}:{},...N?{openaiBaseUrl:N}:{}},session:{key:o,chatSessionId:a,contextSessionId:f,isEphemeral:c,engineHomeDir:h,engineSessionDir:w,nativeSessionId:L,contextFilePath:E,terminalLogPath:O,attachmentsDir:T},agent:{id:u,version:r.agentPackVersion,rulesFilePath:P,skillsDir:v,rulesDir:F},...Object.keys(te).length>0?{mcpServers:te}:{},emitter:s,runtime:{...i,invalidateEngineInstance:()=>this.clearInstances(e.id)},signal:l};if(e.promptInjection.mode==="message-suffix"){let xe=LN(Ge);xe&&(Pe=`${n}
432
+ `});var bd=S(Yt=>{"use strict";var dN=Yt&&Yt.__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]})),fN=Yt&&Yt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pN=Yt&&Yt.__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"&&dN(n,e,r[s]);return fN(n,e),n}})();Object.defineProperty(Yt,"__esModule",{value:!0});Yt.NODE_RUNNER_FILENAME=void 0;Yt.ensureNodeRunnerScriptPath=mN;Yt.embeddedRunnerContentHash=EN;var gN=require("node:crypto"),io=require("node:fs"),Vs=pN(require("node:path")),hN=fi();Yt.NODE_RUNNER_FILENAME="run-custom-engine-runner.js";async function cE(){return Promise.resolve().then(()=>In(aE()))}async function mN(){let t=[],e=process.argv[1];e&&t.push(Vs.join(Vs.dirname(e),Yt.NODE_RUNNER_FILENAME)),t.push(Vs.join(Vs.dirname(process.execPath),Yt.NODE_RUNNER_FILENAME));for(let o of t)try{return await io.promises.access(o),o}catch{}let{EMBEDDED_CUSTOM_ENGINE_RUNNER_HASH:n,EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:r}=await cE(),s=Vs.join((0,hN.getAgentideHome)(),"cache","cli"),i=Vs.join(s,`${Yt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-${n}.js`);try{if(await io.promises.readFile(i,"utf8")===r)return i}catch{}await io.promises.mkdir(s,{recursive:!0}),await io.promises.writeFile(i,r,"utf8");try{let o=`${Yt.NODE_RUNNER_FILENAME.replace(/\.js$/,"")}-`;for(let a of await io.promises.readdir(s))a.startsWith(o)&&a.endsWith(".js")&&Vs.join(s,a)!==i&&await io.promises.unlink(Vs.join(s,a)).catch(()=>{})}catch{}return i}async function EN(){let{EMBEDDED_CUSTOM_ENGINE_RUNNER_SOURCE:t}=await cE();return(0,gN.createHash)("sha256").update(t).digest("hex")}});var Id=S(Sn=>{"use strict";var _N=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]})),yN=Sn&&Sn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),wN=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"&&_N(n,e,r[s]);return yN(n,e),n}})();Object.defineProperty(Sn,"__esModule",{value:!0});Sn.CustomEngine=void 0;Sn.resolveCustomEngineLoadStrategy=lE;Sn.deliverModelRoutingEnv=uE;Sn.buildRunnerChildEnv=Pd;Sn.probeCustomEngineImport=kN;var SN=require("node:child_process"),AN=require("node:readline"),Zo=require("fs"),Rt=wN(require("path")),TN=require("url"),Qo=hi(),bN=br(),vN=Bs(),Es=qn(),ON=ps(),Uc=on(),Hc=Pc(),PN=Mc(),IN=oE(),vd=gi(),jc=Fo(),NN=1e3*60*30;function lE(){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 RN(t){let e=t.engineId?.trim();if(e&&e!=="claude"&&e!=="codex")return e}function CN(t){return t.configProvider?.get("agentide","additionalEngineDir")}function xc(t,e){let n=Rt.join(e,"node_modules"),r=t.NODE_PATH?.trim();t.NODE_PATH=r?`${n}${Rt.delimiter}${r}`:n}function uE(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 Pd(t,e,n){let r={...process.env,...e.env,AGENTHIPPO_ENGINE_ENTRY:t.entryPath,AGENTHIPPO_MESSAGE:e.message,AGENTHIPPO_WORKSPACE_ROOT:e.workspaceRoot,AGENTHIPPO_MODEL_ID:e.modelId,AGENTHIPPO_CONVERSATION_KEY:e.session.key,AGENTHIPPO_IS_EPHEMERAL:e.session.isEphemeral?"true":"false"};e.permissions&&(r.AGENTHIPPO_PERMISSIONS=JSON.stringify(e.permissions)),e.agent?.rulesFilePath&&(r.AGENTHIPPO_RULES_FILE_PATH=e.agent.rulesFilePath),e.agent?.skillsDir&&(r.AGENTHIPPO_SKILLS_DIR=e.agent.skillsDir),e.agent?.rulesDir&&(r.AGENTHIPPO_RULES_DIR=e.agent.rulesDir),n&&(r.AGENTHIPPO_CUSTOM_ENGINE_PROBE="import"),e.session.nativeSessionId?.trim()&&(r.AGENTHIPPO_NATIVE_SESSION_ID=e.session.nativeSessionId.trim()),t.engineExport&&(r.AGENTHIPPO_ENGINE_EXPORT=t.engineExport);let s=e.mcpServers?(0,jc.serializeInlineMcpServers)(e.mcpServers):void 0;return s&&(r[jc.AGENTHIPPO_MCP_SERVERS_ENV]=s),xc(r,t.manifestDir),r}async function dE(t,e,n,r,s){let i;try{let{ensureNodeRunnerScriptPath:c}=await Promise.resolve().then(()=>In(bd()));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,Hc.resolveNodeBinary)();e.runtime.logger.info(`[AgentIDE] Custom engine Node runner: ${o}`);let a=Pd(t,e,r);return process.platform==="win32"&&o===process.execPath&&!o.toLowerCase().endsWith("\\node.exe")&&(a.ELECTRON_RUN_AS_NODE="1"),(0,Hc.prependPathDir)(a,Rt.dirname(o)),new Promise((c,l)=>{let d=(0,SN.spawn)(o,[i],{cwd:t.manifestDir,env:a,stdio:["ignore","pipe","pipe"]}),u="",f,p=Promise.resolve(),g=(0,AN.createInterface)({input:d.stdout});g.on("line",h=>{p=p.then(async()=>{let w=await(0,PN.applyRunnerEvent)(n,h);w&&(f=w)}).catch(w=>{g.close(),d.kill(),l(w)})}),d.stderr?.on("data",h=>{u+=String(h)});let m=()=>{d.kill("SIGTERM")};s?.addEventListener("abort",m,{once:!0}),d.on("error",l),d.on("close",h=>{s?.removeEventListener("abort",m),g.close(),p.finally(()=>{if(h===0)c(f?{nativeSessionId:f}:void 0);else{let w=u.trim()||`Custom engine Node runner exited with code ${h}`;l(new Error(w))}})})})}async function kN(t,e){try{if(e==="in-process")return await fE(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 dE(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 fE(t){let{entryPath:e,id:n,engineExport:r}=t;try{await Zo.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),xc(process.env,t.manifestDir);let o=await Zo.promises.stat(e).catch(()=>{}),a=`${(0,TN.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 d=typeof l=="function"?new l:l;return $N(n,d),d}finally{process.chdir(s),i===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=i}}function $N(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 DN(t){return t.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_").slice(0,160)||"session"}function LN(t){let e=[];t.session.contextFilePath&&e.push(`context_file: ${Rt.relative(t.workspaceRoot,t.session.contextFilePath)}`),t.session.terminalLogPath&&e.push(`terminal_log: ${Rt.relative(t.workspaceRoot,t.session.terminalLogPath)}`),t.session.attachmentsDir&&e.push(`attachments_dir: ${Rt.relative(t.workspaceRoot,t.session.attachmentsDir)}`);let n=t.env.AGENTHIPPO_GATEWAY_OUTBOUND_FILE?.trim();n&&e.push(`gateway_outbound_file: ${n}`);let r=t.env.AGENTHIPPO_ACTIVE_AGENT?.trim();return r&&e.push(`active_agent: ${r}`),e.length===0?"":["<agenthippo_runtime_context>",...e,"</agenthippo_runtime_context>"].join(`
433
+ `)}var MN=5e3,Od=class{config;getBundledBasePromptsDir;id="custom";displayName="Custom Engine";instances=new Map;activeSessions=new Map;mtimeCache=new Map;workerPool=new IN.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<MN)return r.mtime;let s=(await Zo.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=RN(n),a=(0,vN.resolveCustomEngineManifest)(n.workspaceRoot,o,CN(s),(d,u)=>s.logger.warn(`[AgentIDE] Skipping malformed custom engine manifest ${d}: ${u instanceof Error?u.message:String(u)}`)),c=`custom:${a.id}`,l=(0,vd.buildConversationKey)(c,n);await(0,vd.withConversationLock)(l.key,async()=>{let d=lE(),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=${d} entry=${a.entryPath}`);let f;if(d==="in-process"){let{engine:m}=await this.getOrLoadInstance(a,s),h=process.cwd(),w=process.env.NODE_PATH;try{process.chdir(a.manifestDir),xc(process.env,a.manifestDir),f=await m.run(u)}finally{process.chdir(h),w===void 0?delete process.env.NODE_PATH:process.env.NODE_PATH=w}}else d==="persistent-worker"?f=await this.runViaPersistentWorker(a,u,r,i):f=await dE(a,u,r,!1,i);let p=f?.nativeSessionId?.trim(),g=p||u.session.nativeSessionId;this.activeSessions.set(l.key,{nativeSessionId:g,lastUsedAt:Date.now()}),p?await(0,Qo.persistSessionIfNeeded)(c,l,p,n):(0,Qo.touchSessionIfNeeded)(l)},{signal:i,timeoutMs:vd.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 fE(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(()=>In(bd())),o=await i(),a=await(0,Hc.resolveNodeBinary)();n.runtime.logger.info(`[AgentIDE] Custom engine persistent worker: ${a}`);let c=Pd(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,Hc.prependPathDir)(l,Rt.dirname(a));let d=await this.buildCacheKey(e);return this.workerPool.run({cacheKey:d,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 d=r.modelId?.trim()||e.model?.defaultModel?.trim();if(!d)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??Es.AGENT_CONSTANTS.DEFAULT_AGENT_ID,f=r.contextSessionId?.trim()||r.sessionId?.trim()||a,p=DN(f),g=this.config.customEnginesStoragePath??Rt.join(this.config.storagePath,Es.AGENT_CONSTANTS.AGENTS_DIR,u,"custom"),m=Rt.join(g,e.id),h=(0,Es.userScopedEngineHomeFromKey)(Rt.join(m,"home"),(0,ON.resolveEngineHomeUserKey)(r.engineHomeUserKey)),w=Rt.join(m,Es.AGENT_CONSTANTS.SESSIONS_DIR,p);await Zo.promises.mkdir(h,{recursive:!0}),await Zo.promises.mkdir(w,{recursive:!0});let _=Rt.join(r.workspaceRoot,Es.AGENT_CONSTANTS.AGENTIDE_DIR_NAME,Es.AGENT_CONSTANTS.SESSIONS_DIR,f),E=Rt.join(_,Es.AGENT_CONSTANTS.CONTEXT_MD),O=Rt.join(_,"terminal.md"),T=Rt.join(_,"attachments"),L=this.activeSessions.get(o)?.nativeSessionId??(0,Qo.getPersistedSessionId)(`custom:${e.id}`,o),A=(0,Uc.resolveApiRouting)(r,this.config,(0,Uc.inferModelProvider)(r.modelId),i.configProvider),P=A.apiKey?.trim()||void 0,b=A.baseUrl?.trim()||void 0,N=A.openaiBaseUrl?.trim()||void 0,I=e.workspaceSync?.enabled?Rt.join(r.workspaceRoot,e.workspaceSync.dir,e.workspaceSync.rulesFile):void 0,v=e.workspaceSync?.enabled&&e.workspaceSync.includeSkills?Rt.join(r.workspaceRoot,e.workspaceSync.dir,Es.AGENT_CONSTANTS.SKILLS_DIR):void 0,F=e.workspaceSync?.enabled&&e.workspaceSync.includeRules?Rt.join(r.workspaceRoot,e.workspaceSync.dir,Es.AGENT_CONSTANTS.RULES_DIR):void 0,B={...process.env,...i.cliEnvPatch??{},AGENTHIPPO_ENGINE_ID:e.id,AGENTHIPPO_ENGINE_HOME:h,AGENTHIPPO_ENGINE_SESSION_DIR:w,AGENTHIPPO_CONTEXT_SESSION_ID:f,AGENTHIPPO_CONTEXT_EXPORT_PATH:E,AGENTHIPPO_TERMINAL_LOG_PATH:O,AGENTHIPPO_ATTACHMENTS_DIR:T,AGENTHIPPO_ACTIVE_AGENT:u,AGENT_ID:u,AGENTHIPPO_MODEL_ID:d,AGENTHIPPO_USE_LITELLM:A.useLiteLLM?"true":"false"};if(delete B[bN.OPENCLAW_GATEWAY_TOKEN_ENV],delete B.AGENTHIPPO_DATA_PLANE_TOKEN,xc(B,e.manifestDir),P&&(B.AGENTHIPPO_API_KEY=P),b&&(B.AGENTHIPPO_BASE_URL=b),N&&(B.AGENTHIPPO_OPENAI_BASE_URL=N),A.useLiteLLM){B.AGENTHIPPO_LITELLM_API_KEY=P??"sk-dummy",B.AGENTIDE_LITELLM_API_KEY=P??"sk-dummy",b&&(B.AGENTHIPPO_LITELLM_BASE_URL=b,B.AGENTIDE_LITELLM_BASE_URL=b);let xe=(0,Qo.buildLiteLLMMetadataHeaders)(!0,{sessionId:r.sessionId,analyticsUserId:r.analyticsUserId,analyticsProjectId:(0,Qo.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});xe.length>0&&(B.AGENTHIPPO_LITELLM_METADATA_HEADERS=xe.join(`
434
+ `))}r.agentPackVersion&&(B.AGENTHIPPO_AGENT_VERSION=r.agentPackVersion,B.AGENTIDE_AGENT_VERSION=r.agentPackVersion),e.homeEnvVar&&(B[e.homeEnvVar]=h),uE(B,e,{apiKey:P,baseUrl:b,openaiBaseUrl:N},process.env,i.logger),(b&&(0,Uc.applyLocalTlsBypass)(B,b)||N&&N!==b&&(0,Uc.applyLocalTlsBypass)(B,N))&&i.logger.info(`[AgentIDE] Disabling TLS verification for local HTTPS (${e.id})`);let re=A.useLiteLLM?"LiteLLM proxy":b?"custom provider":"native provider";i.logger.info(`[AgentIDE] Custom engine "${e.id}" routing: ${re}, baseUrl=${b||"default"}, model=${d}`);let X=await(0,jc.loadMcpServers)(u,r.workspaceRoot,this.getBundledBasePromptsDir()),te=(0,jc.formatInlineMcpServers)(X,B);X.length>0&&i.logger.debug(`[AgentIDE] Custom engine "${e.id}" MCP (${u}): ${X.map(xe=>xe.name).join(", ")}`);let Ie=n,Ge={message:Ie,modelId:d,workspaceRoot:r.workspaceRoot,additionalDirectories:r.additionalDirectories??[],permissions:r.permissions??{fileAccess:"workspace-write"},env:B,routing:{useLiteLLM:A.useLiteLLM,...P?{apiKey:P}:{},...b?{baseUrl:b}:{},...N?{openaiBaseUrl:N}:{}},session:{key:o,chatSessionId:a,contextSessionId:f,isEphemeral:c,engineHomeDir:h,engineSessionDir:w,nativeSessionId:L,contextFilePath:E,terminalLogPath:O,attachmentsDir:T},agent:{id:u,version:r.agentPackVersion,rulesFilePath:I,skillsDir:v,rulesDir:F},...Object.keys(te).length>0?{mcpServers:te}:{},emitter:s,runtime:{...i,invalidateEngineInstance:()=>this.clearInstances(e.id)},signal:l};if(e.promptInjection.mode==="message-suffix"){let xe=LN(Ge);xe&&(Ie=`${n}
416
435
 
417
- ${xe}`,Ge.message=Pe)}return Ge}onMaintenance(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())n-s.lastUsedAt>NN&&(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()}};Sn.CustomEngine=Od});var bi=S(fe=>{"use strict";var GN=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]})),UN=fe&&fe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),HN=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"&&GN(n,e,r[s]);return UN(n,e),n}})();Object.defineProperty(fe,"__esModule",{value:!0});fe.resolveModelAlias=fe.getSessionDir=fe.createSessionDir=fe.computeSkillsSignature=fe.syncPackToWorkspace=fe.initSessionStoreWithStore=fe.CLIPermissionHandler=fe.AutoApprovePermissionHandler=fe.DirectorySessionStore=fe.FileSessionStore=fe.MemorySessionStore=fe.StaticConfigProvider=fe.NoOpEditTracker=fe.NoOpLogger=fe.ConsoleLogger=void 0;fe.createHeadlessRunner=Nd;fe.createEvalRunner=zN;fe.createCLIRunner=QN;var pE=HN(require("path")),jN=Vm(),xN=Jm(),BN=hi(),jt=Xa();Object.defineProperty(fe,"ConsoleLogger",{enumerable:!0,get:function(){return jt.ConsoleLogger}});Object.defineProperty(fe,"NoOpLogger",{enumerable:!0,get:function(){return jt.NoOpLogger}});Object.defineProperty(fe,"NoOpEditTracker",{enumerable:!0,get:function(){return jt.NoOpEditTracker}});Object.defineProperty(fe,"StaticConfigProvider",{enumerable:!0,get:function(){return jt.StaticConfigProvider}});Object.defineProperty(fe,"MemorySessionStore",{enumerable:!0,get:function(){return jt.MemorySessionStore}});Object.defineProperty(fe,"FileSessionStore",{enumerable:!0,get:function(){return jt.FileSessionStore}});Object.defineProperty(fe,"DirectorySessionStore",{enumerable:!0,get:function(){return jt.DirectorySessionStore}});Object.defineProperty(fe,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return jt.AutoApprovePermissionHandler}});Object.defineProperty(fe,"CLIPermissionHandler",{enumerable:!0,get:function(){return jt.CLIPermissionHandler}});var gE=gi(),FN=_d(),hE=ro(),VN=br(),WN=ps(),KN=fi(),qN="AGENTHIPPO_TURN_NONCE";function YN(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 Nd(t){if(t.freshState){let _=new jt.MemorySessionStore;(0,gE.initSessionStoreWithStore)(_)}else(0,gE.initSessionStoreWithStore)(new jt.DirectorySessionStore(pE.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 jt.ConsoleLogger("[AgentIDE]"),s=t.editTracker??new jt.NoOpEditTracker,i=new jt.StaticConfigProvider({},t.customProviders??{},t.engineSettings??{}),o=t.permissionHandler??new jt.AutoApprovePermissionHandler,a={logger:r,editTracker:s,configProvider:i,permissionHandler:o,cliEnvPatch:t.cliEnvPatch},c=t.packId??"default",l=_=>(0,FN.computeSkillsSignature)(_,c),d=()=>t.bundledPromptsDir,u,f,p,g=()=>(u||(u=new xN.ClaudeEngine(n,async(_,E)=>l(_)??`headless-${c}`,d)),u),m=()=>(f||(f=new jN.CodexEngine(n,l,d)),f),h=async()=>{if(!p){let{CustomEngine:_}=await Promise.resolve().then(()=>Pn(Pd()));p=new _(n,d)}return p},w=new hE.SessionEventWriter(t.analyticsSessionsDir??pE.join((0,KN.getAgentideHome)(),"analytics","sessions"));return{async run(_){let E={success:!1,text:"",thinking:"",toolCalls:[]},O={async thinking(v){if(_.emitter)return _.emitter.thinking(v);E.thinking+=v},async text(v){if(_.emitter)return _.emitter.text(v);E.text+=v},async toolStart(v,F,B,re){if(_.emitter)return _.emitter.toolStart(v,F,B,re);E.toolCalls.push({name:v,input:F})},async toolEnd(v,F,B,re,X){if(_.emitter)return _.emitter.toolEnd(v,F,B,re,X);let te=E.toolCalls.find(Pe=>Pe.name===v&&!Pe.result);te&&(te.result=B,te.isError=re)},async progress(v){if(_.emitter)return _.emitter.progress(v);r.debug(`[Progress] ${v}`)},async question(v){return _.emitter?_.emitter.question(v):(r.debug(`[Question] ${v.prompt}`),{selected:[],freeText:null,declined:!0})},async error(v){E.error=v,E.success=!1,await _.emitter?.error(v)},async done(){E.error||(E.success=!0),await _.emitter?.done()}},T=(0,BN.generateRequestId)(),L=_.sessionId??`headless-${Date.now()}`,A=t.provenance?.(),I=(0,hE.wrapEmitterWithObservability)(O,w,L,T,(0,WN.currentCredential)()?.userId,A&&{policy_version:A.policyVersion,pack_digest:A.packDigest,engine_version:A.engineVersion,tier:A.tier,instance_id:A.instanceId}),b={modelId:_.modelId,engineId:_.engineId,workspaceRoot:_.workspaceRoot,additionalDirectories:_.additionalDirectories,sessionId:L,analyticsUserId:YN(_.analyticsUserId,t.analyticsUserId),apiKey:_.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:_.permissions,engineHomeUserKey:_.engineHomeUserKey,requestId:T};await I.emitTurnStart();let N=null;if(t.dataPlane&&!_.turnEnv?.[qN])try{N=await t.dataPlane.beginTurn({sessionKey:L})}catch(v){return E.error=`data-plane turn registration failed: ${v instanceof Error?v.message:String(v)}`,await I.error(E.error),await I.emitTurnEnd(!1),E}let P={...a,cliEnvPatch:{...a.cliEnvPatch??{},...(0,VN.buildSessionEnvPatch)({workspaceRoot:_.workspaceRoot,chatSessionId:L,gatewaySessionKey:_.gatewaySessionKey}),..._.turnEnv??{},...N?.env??{}}};try{let v=_.engineId.trim().toLowerCase();v==="claude"?await g().stream(_.message,b,I,P,_.signal):v==="codex"?await m().stream(_.message,b,I,P,_.signal):await(await h()).stream(_.message,b,I,P,_.signal)}catch(v){E.error=v instanceof Error?v.message:String(v),E.success=!1,await I.error(E.error)}finally{try{await N?.release()}catch{}}return await I.emitTurnEnd(E.success),E},dispose(){u?.dispose(),f?.dispose(),p?.dispose()}}}var JN=gi();Object.defineProperty(fe,"initSessionStoreWithStore",{enumerable:!0,get:function(){return JN.initSessionStoreWithStore}});var Bc=_d();Object.defineProperty(fe,"syncPackToWorkspace",{enumerable:!0,get:function(){return Bc.syncPackToWorkspace}});Object.defineProperty(fe,"computeSkillsSignature",{enumerable:!0,get:function(){return Bc.computeSkillsSignature}});Object.defineProperty(fe,"createSessionDir",{enumerable:!0,get:function(){return Bc.createSessionDir}});Object.defineProperty(fe,"getSessionDir",{enumerable:!0,get:function(){return Bc.getSessionDir}});var XN=Qa();Object.defineProperty(fe,"resolveModelAlias",{enumerable:!0,get:function(){return XN.resolveModelAlias}});function zN(t,e,n){return Nd({storagePath:t,apiKey:e,baseUrl:n,freshState:!0,logger:new jt.NoOpLogger})}function QN(t,e,n){return Nd({storagePath:t,apiKey:e,baseUrl:n,logger:new jt.ConsoleLogger("[Agent]")})}});var vi=S(Jt=>{"use strict";var ZN=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]})),eR=Jt&&Jt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Fc=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"&&ZN(n,e,r[s]);return eR(n,e),n}})();Object.defineProperty(Jt,"__esModule",{value:!0});Jt.resolvePackPath=EE;Jt.listAvailablePacks=iR;Jt.loadAgentPack=oR;Jt.getDefaultConfig=lR;Jt.getEnvDefaultModel=uR;Jt.getApiConfig=_E;Jt.hasCredentialForEngine=dR;Jt.getFileAccess=fR;var cn=Fc(require("fs")),gt=Fc(require("path")),tR=Fc(require("os")),nR=Fc(require("js-yaml")),Vc=et(),rR=Ka();function ea(t,e){return process.env[t]??(e?process.env[e]:void 0)}var sR=process.env.AGENTHIPPO_HOME||gt.join(tR.homedir(),Vc.AGENTIDE_DIR_NAME),Cd=gt.join(sR,"agents"),Rd="agents";function oo(t){if(!cn.existsSync(t))return;let e=gt.join(t,"current.txt");if(cn.existsSync(e)){let r=cn.readFileSync(e,"utf-8").trim(),s=gt.join(t,r);if(cn.existsSync(s))return s}let n=gt.join(t,"agent.yaml");if(cn.existsSync(n))return t;try{let s=cn.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),[d,u,f]=o.split(".").map(p=>parseInt(p,10)||0);return d!==a?d-a:u!==c?u-c:f-l});for(let i of s){let o=gt.join(t,i),a=gt.join(o,"agent.yaml");if(cn.existsSync(a))return o}}catch{}}function EE(t,e){if(gt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")){let c=gt.isAbsolute(t)?t:gt.resolve(process.cwd(),t);if(cn.existsSync(c)){try{if(cn.statSync(c).isDirectory())return oo(c)??c}catch{}return c}return}let n=gt.join(process.cwd(),t),r=oo(n);if(r)return r;let s=gt.join(process.cwd(),Rd,t),i=oo(s);if(i)return i;if(e){let c=gt.join(e,Vc.AGENTIDE_DIR_NAME,Rd,t),l=oo(c);if(l)return l}let o=gt.join(Cd,t),a=oo(o);if(a)return a}function mE(t,e){let n=[];if(!cn.existsSync(t))return n;let r=cn.readdirSync(t,{withFileTypes:!0});for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=gt.join(t,s.name),o=oo(i);if(!o)continue;let a;o!==i&&(a=gt.basename(o)),n.push({name:s.name,path:o,version:a,source:e})}return n}function iR(t){let e=[],n=new Set;if(t){let s=gt.join(t,Vc.AGENTIDE_DIR_NAME,Rd),i=mE(s,"workspace");for(let o of i)e.push(o),n.add(o.name)}let r=mE(Cd,"user-library");for(let s of r)n.has(s.name)||e.push(s);return e}async function oR(t,e){let n=EE(t,e);if(!n){let u=gt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")?[gt.resolve(process.cwd(),t)]:[`${process.cwd()}/${t}`,`${process.cwd()}/agents/${t}`,e?`${e}/${Vc.AGENTIDE_DIR_NAME}/agents/${t}`:null,`${Cd}/${t}`].filter(Boolean);throw new Error(`Agent pack not found: ${t}
436
+ ${xe}`,Ge.message=Ie)}return Ge}onMaintenance(e){let n=Date.now();for(let[r,s]of this.activeSessions.entries())n-s.lastUsedAt>NN&&(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()}};Sn.CustomEngine=Od});var bi=S(fe=>{"use strict";var GN=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]})),UN=fe&&fe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),HN=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"&&GN(n,e,r[s]);return UN(n,e),n}})();Object.defineProperty(fe,"__esModule",{value:!0});fe.resolveModelAlias=fe.getSessionDir=fe.createSessionDir=fe.computeSkillsSignature=fe.syncPackToWorkspace=fe.initSessionStoreWithStore=fe.CLIPermissionHandler=fe.AutoApprovePermissionHandler=fe.DirectorySessionStore=fe.FileSessionStore=fe.MemorySessionStore=fe.StaticConfigProvider=fe.NoOpEditTracker=fe.NoOpLogger=fe.ConsoleLogger=void 0;fe.createHeadlessRunner=Nd;fe.createEvalRunner=zN;fe.createCLIRunner=QN;var pE=HN(require("path")),jN=Vm(),xN=Jm(),BN=hi(),jt=Xa();Object.defineProperty(fe,"ConsoleLogger",{enumerable:!0,get:function(){return jt.ConsoleLogger}});Object.defineProperty(fe,"NoOpLogger",{enumerable:!0,get:function(){return jt.NoOpLogger}});Object.defineProperty(fe,"NoOpEditTracker",{enumerable:!0,get:function(){return jt.NoOpEditTracker}});Object.defineProperty(fe,"StaticConfigProvider",{enumerable:!0,get:function(){return jt.StaticConfigProvider}});Object.defineProperty(fe,"MemorySessionStore",{enumerable:!0,get:function(){return jt.MemorySessionStore}});Object.defineProperty(fe,"FileSessionStore",{enumerable:!0,get:function(){return jt.FileSessionStore}});Object.defineProperty(fe,"DirectorySessionStore",{enumerable:!0,get:function(){return jt.DirectorySessionStore}});Object.defineProperty(fe,"AutoApprovePermissionHandler",{enumerable:!0,get:function(){return jt.AutoApprovePermissionHandler}});Object.defineProperty(fe,"CLIPermissionHandler",{enumerable:!0,get:function(){return jt.CLIPermissionHandler}});var gE=gi(),FN=_d(),hE=ro(),VN=br(),WN=ps(),KN=fi(),qN="AGENTHIPPO_TURN_NONCE";function YN(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 Nd(t){if(t.freshState){let _=new jt.MemorySessionStore;(0,gE.initSessionStoreWithStore)(_)}else(0,gE.initSessionStoreWithStore)(new jt.DirectorySessionStore(pE.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 jt.ConsoleLogger("[AgentIDE]"),s=t.editTracker??new jt.NoOpEditTracker,i=new jt.StaticConfigProvider({},t.customProviders??{},t.engineSettings??{}),o=t.permissionHandler??new jt.AutoApprovePermissionHandler,a={logger:r,editTracker:s,configProvider:i,permissionHandler:o,cliEnvPatch:t.cliEnvPatch},c=t.packId??"default",l=_=>(0,FN.computeSkillsSignature)(_,c),d=()=>t.bundledPromptsDir,u,f,p,g=()=>(u||(u=new xN.ClaudeEngine(n,async(_,E)=>l(_)??`headless-${c}`,d)),u),m=()=>(f||(f=new jN.CodexEngine(n,l,d)),f),h=async()=>{if(!p){let{CustomEngine:_}=await Promise.resolve().then(()=>In(Id()));p=new _(n,d)}return p},w=new hE.SessionEventWriter(t.analyticsSessionsDir??pE.join((0,KN.getAgentideHome)(),"analytics","sessions"));return{async run(_){let E={success:!1,text:"",thinking:"",toolCalls:[]},O={async thinking(v){if(_.emitter)return _.emitter.thinking(v);E.thinking+=v},async text(v){if(_.emitter)return _.emitter.text(v);E.text+=v},async toolStart(v,F,B,re){if(_.emitter)return _.emitter.toolStart(v,F,B,re);E.toolCalls.push({name:v,input:F})},async toolEnd(v,F,B,re,X){if(_.emitter)return _.emitter.toolEnd(v,F,B,re,X);let te=E.toolCalls.find(Ie=>Ie.name===v&&!Ie.result);te&&(te.result=B,te.isError=re)},async progress(v){if(_.emitter)return _.emitter.progress(v);r.debug(`[Progress] ${v}`)},async question(v){return _.emitter?_.emitter.question(v):(r.debug(`[Question] ${v.prompt}`),{selected:[],freeText:null,declined:!0})},async error(v){E.error=v,E.success=!1,await _.emitter?.error(v)},async done(){E.error||(E.success=!0),await _.emitter?.done()}},T=(0,BN.generateRequestId)(),L=_.sessionId??`headless-${Date.now()}`,A=t.provenance?.(),P=(0,hE.wrapEmitterWithObservability)(O,w,L,T,(0,WN.currentCredential)()?.userId,A&&{policy_version:A.policyVersion,pack_digest:A.packDigest,engine_version:A.engineVersion,tier:A.tier,instance_id:A.instanceId}),b={modelId:_.modelId,engineId:_.engineId,workspaceRoot:_.workspaceRoot,additionalDirectories:_.additionalDirectories,sessionId:L,analyticsUserId:YN(_.analyticsUserId,t.analyticsUserId),apiKey:_.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:_.permissions,engineHomeUserKey:_.engineHomeUserKey,requestId:T};await P.emitTurnStart();let N=null;if(t.dataPlane&&!_.turnEnv?.[qN])try{N=await t.dataPlane.beginTurn({sessionKey:L})}catch(v){return E.error=`data-plane turn registration failed: ${v instanceof Error?v.message:String(v)}`,await P.error(E.error),await P.emitTurnEnd(!1),E}let I={...a,cliEnvPatch:{...a.cliEnvPatch??{},...(0,VN.buildSessionEnvPatch)({workspaceRoot:_.workspaceRoot,chatSessionId:L,gatewaySessionKey:_.gatewaySessionKey}),..._.turnEnv??{},...N?.env??{}}};try{let v=_.engineId.trim().toLowerCase();v==="claude"?await g().stream(_.message,b,P,I,_.signal):v==="codex"?await m().stream(_.message,b,P,I,_.signal):await(await h()).stream(_.message,b,P,I,_.signal)}catch(v){E.error=v instanceof Error?v.message:String(v),E.success=!1,await P.error(E.error)}finally{try{await N?.release()}catch{}}return await P.emitTurnEnd(E.success),E},dispose(){u?.dispose(),f?.dispose(),p?.dispose()}}}var JN=gi();Object.defineProperty(fe,"initSessionStoreWithStore",{enumerable:!0,get:function(){return JN.initSessionStoreWithStore}});var Bc=_d();Object.defineProperty(fe,"syncPackToWorkspace",{enumerable:!0,get:function(){return Bc.syncPackToWorkspace}});Object.defineProperty(fe,"computeSkillsSignature",{enumerable:!0,get:function(){return Bc.computeSkillsSignature}});Object.defineProperty(fe,"createSessionDir",{enumerable:!0,get:function(){return Bc.createSessionDir}});Object.defineProperty(fe,"getSessionDir",{enumerable:!0,get:function(){return Bc.getSessionDir}});var XN=Qa();Object.defineProperty(fe,"resolveModelAlias",{enumerable:!0,get:function(){return XN.resolveModelAlias}});function zN(t,e,n){return Nd({storagePath:t,apiKey:e,baseUrl:n,freshState:!0,logger:new jt.NoOpLogger})}function QN(t,e,n){return Nd({storagePath:t,apiKey:e,baseUrl:n,logger:new jt.ConsoleLogger("[Agent]")})}});var vi=S(Jt=>{"use strict";var ZN=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]})),eR=Jt&&Jt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Fc=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"&&ZN(n,e,r[s]);return eR(n,e),n}})();Object.defineProperty(Jt,"__esModule",{value:!0});Jt.resolvePackPath=EE;Jt.listAvailablePacks=iR;Jt.loadAgentPack=oR;Jt.getDefaultConfig=lR;Jt.getEnvDefaultModel=uR;Jt.getApiConfig=_E;Jt.hasCredentialForEngine=dR;Jt.getFileAccess=fR;var cn=Fc(require("fs")),gt=Fc(require("path")),tR=Fc(require("os")),nR=Fc(require("js-yaml")),Vc=et(),rR=Ka();function ea(t,e){return process.env[t]??(e?process.env[e]:void 0)}var sR=process.env.AGENTHIPPO_HOME||gt.join(tR.homedir(),Vc.AGENTIDE_DIR_NAME),Cd=gt.join(sR,"agents"),Rd="agents";function oo(t){if(!cn.existsSync(t))return;let e=gt.join(t,"current.txt");if(cn.existsSync(e)){let r=cn.readFileSync(e,"utf-8").trim(),s=gt.join(t,r);if(cn.existsSync(s))return s}let n=gt.join(t,"agent.yaml");if(cn.existsSync(n))return t;try{let s=cn.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),[d,u,f]=o.split(".").map(p=>parseInt(p,10)||0);return d!==a?d-a:u!==c?u-c:f-l});for(let i of s){let o=gt.join(t,i),a=gt.join(o,"agent.yaml");if(cn.existsSync(a))return o}}catch{}}function EE(t,e){if(gt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")){let c=gt.isAbsolute(t)?t:gt.resolve(process.cwd(),t);if(cn.existsSync(c)){try{if(cn.statSync(c).isDirectory())return oo(c)??c}catch{}return c}return}let n=gt.join(process.cwd(),t),r=oo(n);if(r)return r;let s=gt.join(process.cwd(),Rd,t),i=oo(s);if(i)return i;if(e){let c=gt.join(e,Vc.AGENTIDE_DIR_NAME,Rd,t),l=oo(c);if(l)return l}let o=gt.join(Cd,t),a=oo(o);if(a)return a}function mE(t,e){let n=[];if(!cn.existsSync(t))return n;let r=cn.readdirSync(t,{withFileTypes:!0});for(let s of r){if(!s.isDirectory()||s.name.startsWith("."))continue;let i=gt.join(t,s.name),o=oo(i);if(!o)continue;let a;o!==i&&(a=gt.basename(o)),n.push({name:s.name,path:o,version:a,source:e})}return n}function iR(t){let e=[],n=new Set;if(t){let s=gt.join(t,Vc.AGENTIDE_DIR_NAME,Rd),i=mE(s,"workspace");for(let o of i)e.push(o),n.add(o.name)}let r=mE(Cd,"user-library");for(let s of r)n.has(s.name)||e.push(s);return e}async function oR(t,e){let n=EE(t,e);if(!n){let u=gt.isAbsolute(t)||t.startsWith("./")||t.startsWith("../")?[gt.resolve(process.cwd(),t)]:[`${process.cwd()}/${t}`,`${process.cwd()}/agents/${t}`,e?`${e}/${Vc.AGENTIDE_DIR_NAME}/agents/${t}`:null,`${Cd}/${t}`].filter(Boolean);throw new Error(`Agent pack not found: ${t}
418
437
  Searched: ${u.join(", ")}`)}let r=gt.join(n,"agent.yaml");if(!cn.existsSync(r))throw new Error(`Missing agent.yaml in pack: ${n}`);let s=cn.readFileSync(r,"utf-8"),i=nR.load(s);cR(i,r);let o=aR(i),a="",c=gt.join(n,"AGENTS.md");return cn.existsSync(c)&&(a=cn.readFileSync(c,"utf-8")),{manifest:o,packPath:n,systemPrompt:a,rules:[]}}function aR(t){let e=t.spec.engine?.trim()??"",n=e.toLowerCase();return e!==n?{...t,spec:{...t.spec,engine:n}}:t}function cR(t,e){let n=[];t.metadata?.name||n.push("Missing metadata.name"),t.metadata?.version||n.push("Missing metadata.version"),t.spec?.engine?.trim()||n.push("Missing spec.engine");let r=t.spec?.engine?.trim().toLowerCase();r==="custom"&&n.push('Invalid spec.engine: use the concrete custom engine id (for example, openclaw), not "custom"'),t.spec?.cheapModel!==void 0&&typeof t.spec.cheapModel!="string"&&n.push("Invalid spec.cheapModel: must be a string when provided");let s=r==="codex"||r==="claude"?rR.ENGINE_EFFORTS[r]:void 0;if(t.spec?.effort!==void 0&&s&&!s.includes(t.spec.effort)&&n.push(`Invalid spec.effort for engine ${r}: must be one of ${s.join(", ")}`),t.spec?.dataPlane!==void 0&&((typeof t.spec.dataPlane!="object"||!t.spec.dataPlane.connector?.trim())&&n.push("Invalid spec.dataPlane: requires a `connector` path (stdio MCP module run broker-side)"),t.spec.dataPlane?.provider!==void 0&&typeof t.spec.dataPlane.provider!="string"&&n.push("Invalid spec.dataPlane.provider: must be a string when provided")),n.length>0)throw new Error(`Invalid agent manifest at ${e}:
419
438
  - ${n.join(`
420
- - `)}`)}function lR(){return{engine:(ea("AGENTHIPPO_DEFAULT_ENGINE","AGENTIDE_DEFAULT_ENGINE")||"claude").trim().toLowerCase(),model:ea("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")||"claude-sonnet-4-5-20250929"}}function uR(){return ea("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")?.trim()||void 0}function _E(){let t=ea("AGENTHIPPO_LITELLM_API_KEY","AGENTIDE_LITELLM_API_KEY"),e=ea("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 dR(t,e=_E()){if(e.useLiteLLM)return!0;let n=t.trim().toLowerCase();return n==="claude"?!!e.anthropicApiKey:n==="codex"?!!e.openaiApiKey:!0}function fR(t){return t?.manifest.spec.permissions?.fileAccess??"workspace-write"}});var Wc=S((w1,pR)=>{pR.exports={name:"agenthippo",displayName:"Agent Hippo",description:"Agent Hippo - The easiest way to build and test your AI agents",version:"1.110.41",agenthippo:{litellmImageTag:"0.2.23",hippoclawNpm:"@agenthippo-ai/hippoclaw@2026.7.28"},publisher:"agenthippo",private:!0,engines:{vscode:"^1.93.0"},enabledApiProposals:["chatParticipantAdditions","chatParticipantPrivate","languageModelThinkingPart"],activationEvents:["onStartupFinished","onCommand:agentide.customEngine.list","onCommand:agentide.engine.install","onCommand:agentide.engine.uninstall","onChatParticipant:agentide.claude","onChatParticipant:agentide.codex"],main:"./out/extension.js",contributes:{authentication:[{id:"agenthippo",label:"AgentHippo"}],chatParticipants:[{id:"agentide.claude",name:"claude",fullName:"Claude Agent",description:"AI coding agent powered by Anthropic's Claude Agent SDK",isSticky:!1},{id:"agentide.codex",name:"codex",fullName:"Codex Agent",description:"AI coding agent powered by OpenAI's Codex SDK",isSticky:!1}],mcpServerDefinitionProviders:[{id:"bundled-mcp-servers",label:"Agent Hippo Bundled MCP Servers"}],commands:[{command:"agentide.skills.syncRemote",title:"Sync Remote Skills",category:"Agent Hippo"},{command:"agentide.clearManagedResources",title:"Clear Managed Resources",category:"Agent Hippo"},{command:"agentide.showManagedResources",title:"Show Managed Resources",category:"Agent Hippo"},{command:"agentide.cleanupSessionLogs",title:"Cleanup Old Session Logs",category:"Agent Hippo"},{command:"agentide.pack.install",title:"Install Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.list",title:"List Installed Packs",category:"Agent Hippo"},{command:"agentide.customEngine.list",title:"List Custom Engines",category:"Agent Hippo"},{command:"agentide.pack.uninstall",title:"Uninstall Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.getActive",title:"Get Active Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.create",title:"Create Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.share",title:"Share Agent to User Library",category:"Agent Hippo"},{command:"agentide.pack.publish",title:"Publish Agent to Store",category:"Agent Hippo"},{command:"agentide.skill.share",title:"Save Skill to User Library",category:"Agent Hippo"},{command:"agentide.skill.publish",title:"Publish Skill to Store",category:"Agent Hippo"},{command:"agentide.mcp.share",title:"Save MCP Server to User Library",category:"Agent Hippo"},{command:"agentide.mcp.publish",title:"Publish MCP Server to Store",category:"Agent Hippo"},{command:"agenthippo.signIn",title:"Sign In to AgentHippo",category:"Agent Hippo"},{command:"agenthippo.signOut",title:"Sign Out of AgentHippo",category:"Agent Hippo"},{command:"agentide.store.find",title:"Install Packs, Skills, MCP Tools, Engines, Spotlight Views",category:"Agent Hippo"},{command:"agentide.engine.install",title:"Install Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.uninstall",title:"Uninstall Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.publish",title:"Publish Engine to Store",category:"Agent Hippo"},{command:"agentide.spotlight.publish",title:"Publish Spotlight View to Store (Full Bundle)",category:"Agent Hippo"},{command:"agentide.view.install",title:"Install Spotlight View",category:"Agent Hippo"},{command:"agentide.store.sync",title:"Sync Store Index",category:"Agent Hippo"},{command:"agentide.store.setup",title:"Setup Store Index Automation",category:"Agent Hippo"},{command:"agentide.pack.browseLibrary",title:"Browse User Library",category:"Agent Hippo"},{command:"agentide.pack.update",title:"Update Agent from User Library",category:"Agent Hippo"},{command:"agentide.pack.duplicate",title:"Duplicate Agent",category:"Agent Hippo"},{command:"agentide.pack.refresh",title:"Refresh Agent Packs",category:"Agent Hippo"},{command:"agentide.pack.resetDefault",title:"Reset Default Agent",category:"Agent Hippo"},{command:"agentide.gateway.connect",title:"Connect to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.disconnect",title:"Disconnect from Gateway",category:"Agent Hippo"},{command:"agentide.gateway.toggle",title:"Toggle Gateway Connection",category:"Agent Hippo"},{command:"agentide.gateway.status",title:"Show Gateway Status",category:"Agent Hippo"},{command:"agentide.gateway.connectSession",title:"Connect Chat to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.listSessions",title:"Show Connected Gateway Sessions",category:"Agent Hippo"},{command:"agentide.gateway.resetMappings",title:"Reset Agent Mappings (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.toggle",title:"Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.install",title:"Install Agent Anywhere (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.uninstall",title:"Uninstall Agent Anywhere (OpenClaw CLI)",category:"Agent Hippo"},{command:"agentide.anywhere.start",title:"Start Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.stop",title:"Stop Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.status",title:"Agent Anywhere Status",category:"Agent Hippo"},{command:"agentide.anywhere.connect",title:"Connect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.disconnect",title:"Disconnect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.openConfig",title:"Open Agent Anywhere Config",category:"Agent Hippo"},{command:"agentide.anywhere.openWebUI",title:"Open Agent Anywhere Web UI",category:"Agent Hippo"},{command:"agentide.anywhere.detect",title:"Detect Agent Anywhere Gateway",category:"Agent Hippo"},{command:"agentide.anywhere.meetAgent",title:"Meet Agent Anywhere...",category:"Agent Hippo"},{command:"agentide.setupCli",title:"Setup AgentHippo CLI",category:"Agent Hippo"},{command:"agentide.cli.status",title:"AgentHippo CLI Status",category:"Agent Hippo"},{command:"agentide.installBundledTools",title:"Install Bundled Tools (rg, sg, tree-sitter)",category:"Agent Hippo"},{command:"agentide.setupAnalytics",title:"Install Spotlight (OTEL + DuckDB)",category:"Agent Hippo"},{command:"agentide.analytics.toggle",title:"Manage Spotlight",category:"Agent Hippo"},{command:"agentide.analytics.start",title:"Start Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.stop",title:"Stop Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.status",title:"Show Spotlight Status",category:"Agent Hippo"},{command:"agentide.analytics.query",title:"Query Spotlight (Cost, Sessions)",category:"Agent Hippo"},{command:"agentide.analytics.openDashboard",title:"Open Spotlight Dashboard",category:"Agent Hippo"},{command:"agentide.fleet.open",title:"Open Agent Team",category:"Agent Hippo"},{command:"agentide.analytics.clearArtifacts",title:"Clear Spotlight Artifacts",category:"Agent Hippo"},{command:"agentide.analytics.regenerateDefaults",title:"Regenerate Default Charts",category:"Agent Hippo"}],menus:{ChatModePicker:[{command:"agentide.anywhere.meetAgent",group:"navigation@30",when:"agentide.anywhere.enabled && !agentide.anywhere.hidden",icon:"$(broadcast)"}]},viewsContainers:{activitybar:[{id:"agentide-analytics",title:"Agent Hippo",icon:"$(graph)"},{id:"agentide-team",title:"Agent Team",icon:"$(organization)"}]},views:{"agentide-analytics":[{type:"webview",id:"agentide.analyticsView",name:"Spotlight"}],"agentide-team":[{type:"webview",id:"agentide.teamView",name:"Agent Team"}]},configuration:{title:"Agent Hippo",properties:{"agentide.permissions.fileAccess":{type:"string",scope:"application",enum:["read-only","workspace-write","full"],default:"full",markdownDescription:"Filesystem access scope (applies to all engines).\n- `read-only`: Read/search only (no file writes)\n- `workspace-write`: Read/write within workspace folders only\n- `full`: Full filesystem access (yolo, default)\n\n**Security**: Agent manifest permissions take precedence - user cannot override stricter pack permissions."},"agentide.claude.maxThinkingTokens":{type:"number",default:1024,description:"Claude extended thinking budget (tokens). Set to 0 to disable. Requires a compatible model; Anthropic requires >=1024 for extended thinking."},"agentide.claude.cheapModel":{type:"string",default:"",description:"Optional cheap Claude model for subagents/background routing (for example, claude-haiku-4-5-20251001). Main model selection still comes from the model picker."},"agentide.sessions.retentionDays":{type:"number",default:7,minimum:1,maximum:365,description:"Number of days to retain session logs before cleanup. Cleanup runs on startup (best-effort) and via the 'Agent Hippo: Cleanup Old Session Logs' command."},"agentide.fallbackDirectory":{type:"string",scope:"machine",default:".agent-hippo",description:"Directory name (relative to home) used as workspace when no folder is open. Default: ~/.agent-hippo"},"agentide.additionalEngineDir":{type:"string",scope:"machine",default:"",description:"Additional directories to scan for custom engines. Machine-scoped: engines discovered here are executed, so a workspace must not be able to point this at attacker-controlled code."},"agentide.auth.baseUrl":{type:"string",scope:"application",default:"https://auth.agenthippo.ai",markdownDescription:"AgentHippo auth broker base URL for team sign-in and bootstrap (`agenthippo.signIn`).\n\n**Application-scoped on purpose**: this endpoint receives your PKCE authorization code and your AgentHippo access token, and its `/api/ide/bootstrap` response is written into your model-routing settings. A workspace must never be able to redirect it. Must be `https://` (plain `http://` is accepted only for loopback dev hosts)."},"agentide.cli.path":{type:"string",scope:"machine",default:"",description:"Optional absolute path to the AgentHippo CLI binary. If unset, Agent Hippo auto-detects a bundled binary or falls back to PATH. Machine-scoped: this path is executed."},"agentide.cli.installSource":{type:"string",scope:"machine",default:"",description:"Optional setup source for AgentHippo CLI. Supports HTTPS URL to a prebuilt binary, or local file path. If empty, setup builds from the local repository. Machine-scoped: this source is downloaded and executed."},"agentide.storeRepo":{type:"string",scope:"application",default:"agenthippoai/agenthippo-store",markdownDescription:"GitHub repository for pack store (owner/repo format).\n\nDefault: `agenthippoai/agenthippo-store` ([github.com/agenthippoai/agenthippo-store](https://github.com/agenthippoai/agenthippo-store))\n\nSet to your own repo (e.g., `mycompany/our-packs`) to use a private or custom store."},"agentide.store.indexUrl":{type:"string",scope:"application",default:"https://agenthippoai.github.io/agenthippo-store",markdownDescription:`Base URL for the store index (Orama + metadata are loaded from paths under this URL).
439
+ - `)}`)}function lR(){return{engine:(ea("AGENTHIPPO_DEFAULT_ENGINE","AGENTIDE_DEFAULT_ENGINE")||"claude").trim().toLowerCase(),model:ea("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")||"claude-sonnet-4-5-20250929"}}function uR(){return ea("AGENTHIPPO_DEFAULT_MODEL","AGENTIDE_DEFAULT_MODEL")?.trim()||void 0}function _E(){let t=ea("AGENTHIPPO_LITELLM_API_KEY","AGENTIDE_LITELLM_API_KEY"),e=ea("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 dR(t,e=_E()){if(e.useLiteLLM)return!0;let n=t.trim().toLowerCase();return n==="claude"?!!e.anthropicApiKey:n==="codex"?!!e.openaiApiKey:!0}function fR(t){return t?.manifest.spec.permissions?.fileAccess??"workspace-write"}});var Wc=S((w1,pR)=>{pR.exports={name:"agenthippo",displayName:"Agent Hippo",description:"Agent Hippo - The easiest way to build and test your AI agents",version:"1.110.42",agenthippo:{litellmImageTag:"0.2.24",hippoclawNpm:"@agenthippo-ai/hippoclaw@2026.7.28"},publisher:"agenthippo",private:!0,engines:{vscode:"^1.93.0"},enabledApiProposals:["chatParticipantAdditions","chatParticipantPrivate","languageModelThinkingPart"],activationEvents:["onStartupFinished","onCommand:agentide.customEngine.list","onCommand:agentide.engine.install","onCommand:agentide.engine.uninstall","onChatParticipant:agentide.claude","onChatParticipant:agentide.codex"],main:"./out/extension.js",contributes:{authentication:[{id:"agenthippo",label:"AgentHippo"}],chatParticipants:[{id:"agentide.claude",name:"claude",fullName:"Claude Agent",description:"AI coding agent powered by Anthropic's Claude Agent SDK",isSticky:!1},{id:"agentide.codex",name:"codex",fullName:"Codex Agent",description:"AI coding agent powered by OpenAI's Codex SDK",isSticky:!1}],mcpServerDefinitionProviders:[{id:"bundled-mcp-servers",label:"Agent Hippo Bundled MCP Servers"}],commands:[{command:"agentide.skills.syncRemote",title:"Sync Remote Skills",category:"Agent Hippo"},{command:"agentide.clearManagedResources",title:"Clear Managed Resources",category:"Agent Hippo"},{command:"agentide.showManagedResources",title:"Show Managed Resources",category:"Agent Hippo"},{command:"agentide.cleanupSessionLogs",title:"Cleanup Old Session Logs",category:"Agent Hippo"},{command:"agentide.pack.install",title:"Install Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.list",title:"List Installed Packs",category:"Agent Hippo"},{command:"agentide.customEngine.list",title:"List Custom Engines",category:"Agent Hippo"},{command:"agentide.pack.uninstall",title:"Uninstall Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.getActive",title:"Get Active Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.create",title:"Create Agent Pack",category:"Agent Hippo"},{command:"agentide.pack.share",title:"Share Agent to User Library",category:"Agent Hippo"},{command:"agentide.pack.publish",title:"Publish Agent to Store",category:"Agent Hippo"},{command:"agentide.skill.share",title:"Save Skill to User Library",category:"Agent Hippo"},{command:"agentide.skill.publish",title:"Publish Skill to Store",category:"Agent Hippo"},{command:"agentide.mcp.share",title:"Save MCP Server to User Library",category:"Agent Hippo"},{command:"agentide.mcp.publish",title:"Publish MCP Server to Store",category:"Agent Hippo"},{command:"agenthippo.signIn",title:"Sign In to AgentHippo",category:"Agent Hippo"},{command:"agenthippo.signOut",title:"Sign Out of AgentHippo",category:"Agent Hippo"},{command:"agentide.store.find",title:"Install Packs, Skills, MCP Tools, Engines, Spotlight Views",category:"Agent Hippo"},{command:"agentide.engine.install",title:"Install Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.uninstall",title:"Uninstall Custom Engine",category:"Agent Hippo"},{command:"agentide.engine.publish",title:"Publish Engine to Store",category:"Agent Hippo"},{command:"agentide.spotlight.publish",title:"Publish Spotlight View to Store (Full Bundle)",category:"Agent Hippo"},{command:"agentide.view.install",title:"Install Spotlight View",category:"Agent Hippo"},{command:"agentide.store.sync",title:"Sync Store Index",category:"Agent Hippo"},{command:"agentide.store.setup",title:"Setup Store Index Automation",category:"Agent Hippo"},{command:"agentide.pack.browseLibrary",title:"Browse User Library",category:"Agent Hippo"},{command:"agentide.pack.update",title:"Update Agent from User Library",category:"Agent Hippo"},{command:"agentide.pack.duplicate",title:"Duplicate Agent",category:"Agent Hippo"},{command:"agentide.pack.refresh",title:"Refresh Agent Packs",category:"Agent Hippo"},{command:"agentide.pack.resetDefault",title:"Reset Default Agent",category:"Agent Hippo"},{command:"agentide.gateway.connect",title:"Connect to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.disconnect",title:"Disconnect from Gateway",category:"Agent Hippo"},{command:"agentide.gateway.toggle",title:"Toggle Gateway Connection",category:"Agent Hippo"},{command:"agentide.gateway.status",title:"Show Gateway Status",category:"Agent Hippo"},{command:"agentide.gateway.connectSession",title:"Connect Chat to Gateway",category:"Agent Hippo"},{command:"agentide.gateway.listSessions",title:"Show Connected Gateway Sessions",category:"Agent Hippo"},{command:"agentide.gateway.resetMappings",title:"Reset Agent Mappings (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.toggle",title:"Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.install",title:"Install Agent Anywhere (Gateway)",category:"Agent Hippo"},{command:"agentide.anywhere.uninstall",title:"Uninstall Agent Anywhere (OpenClaw CLI)",category:"Agent Hippo"},{command:"agentide.anywhere.start",title:"Start Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.stop",title:"Stop Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.status",title:"Agent Anywhere Status",category:"Agent Hippo"},{command:"agentide.anywhere.connect",title:"Connect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.disconnect",title:"Disconnect Agent Anywhere",category:"Agent Hippo"},{command:"agentide.anywhere.openConfig",title:"Open Agent Anywhere Config",category:"Agent Hippo"},{command:"agentide.anywhere.openWebUI",title:"Open Agent Anywhere Web UI",category:"Agent Hippo"},{command:"agentide.anywhere.detect",title:"Detect Agent Anywhere Gateway",category:"Agent Hippo"},{command:"agentide.anywhere.meetAgent",title:"Meet Agent Anywhere...",category:"Agent Hippo"},{command:"agentide.setupCli",title:"Setup AgentHippo CLI",category:"Agent Hippo"},{command:"agentide.cli.status",title:"AgentHippo CLI Status",category:"Agent Hippo"},{command:"agentide.installBundledTools",title:"Install Bundled Tools (rg, sg, tree-sitter)",category:"Agent Hippo"},{command:"agentide.setupAnalytics",title:"Install Spotlight (OTEL + DuckDB)",category:"Agent Hippo"},{command:"agentide.analytics.toggle",title:"Manage Spotlight",category:"Agent Hippo"},{command:"agentide.analytics.start",title:"Start Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.stop",title:"Stop Spotlight (OTEL + LiteLLM)",category:"Agent Hippo"},{command:"agentide.analytics.status",title:"Show Spotlight Status",category:"Agent Hippo"},{command:"agentide.analytics.query",title:"Query Spotlight (Cost, Sessions)",category:"Agent Hippo"},{command:"agentide.analytics.openDashboard",title:"Open Spotlight Dashboard",category:"Agent Hippo"},{command:"agentide.fleet.open",title:"Open Agent Team",category:"Agent Hippo"},{command:"agentide.analytics.clearArtifacts",title:"Clear Spotlight Artifacts",category:"Agent Hippo"},{command:"agentide.analytics.regenerateDefaults",title:"Regenerate Default Charts",category:"Agent Hippo"}],menus:{ChatModePicker:[{command:"agentide.anywhere.meetAgent",group:"navigation@30",when:"agentide.anywhere.enabled && !agentide.anywhere.hidden",icon:"$(broadcast)"}]},viewsContainers:{activitybar:[{id:"agentide-analytics",title:"Agent Hippo",icon:"$(graph)"},{id:"agentide-team",title:"Agent Team",icon:"$(organization)"}]},views:{"agentide-analytics":[{type:"webview",id:"agentide.analyticsView",name:"Spotlight"}],"agentide-team":[{type:"webview",id:"agentide.teamView",name:"Agent Team"}]},configuration:{title:"Agent Hippo",properties:{"agentide.permissions.fileAccess":{type:"string",scope:"application",enum:["read-only","workspace-write","full"],default:"full",markdownDescription:"Filesystem access scope (applies to all engines).\n- `read-only`: Read/search only (no file writes)\n- `workspace-write`: Read/write within workspace folders only\n- `full`: Full filesystem access (yolo, default)\n\n**Security**: Agent manifest permissions take precedence - user cannot override stricter pack permissions."},"agentide.claude.maxThinkingTokens":{type:"number",default:1024,description:"Claude extended thinking budget (tokens). Set to 0 to disable. Requires a compatible model; Anthropic requires >=1024 for extended thinking."},"agentide.claude.cheapModel":{type:"string",default:"",description:"Optional cheap Claude model for subagents/background routing (for example, claude-haiku-4-5-20251001). Main model selection still comes from the model picker."},"agentide.sessions.retentionDays":{type:"number",default:7,minimum:1,maximum:365,description:"Number of days to retain session logs before cleanup. Cleanup runs on startup (best-effort) and via the 'Agent Hippo: Cleanup Old Session Logs' command."},"agentide.fallbackDirectory":{type:"string",scope:"machine",default:".agent-hippo",description:"Directory name (relative to home) used as workspace when no folder is open. Default: ~/.agent-hippo"},"agentide.additionalEngineDir":{type:"string",scope:"machine",default:"",description:"Additional directories to scan for custom engines. Machine-scoped: engines discovered here are executed, so a workspace must not be able to point this at attacker-controlled code."},"agentide.auth.baseUrl":{type:"string",scope:"application",default:"https://auth.agenthippo.ai",markdownDescription:"AgentHippo auth broker base URL for team sign-in and bootstrap (`agenthippo.signIn`).\n\n**Application-scoped on purpose**: this endpoint receives your PKCE authorization code and your AgentHippo access token, and its `/api/ide/bootstrap` response is written into your model-routing settings. A workspace must never be able to redirect it. Must be `https://` (plain `http://` is accepted only for loopback dev hosts)."},"agentide.cli.path":{type:"string",scope:"machine",default:"",description:"Optional absolute path to the AgentHippo CLI binary. If unset, Agent Hippo auto-detects a bundled binary or falls back to PATH. Machine-scoped: this path is executed."},"agentide.cli.installSource":{type:"string",scope:"machine",default:"",description:"Optional setup source for AgentHippo CLI. Supports HTTPS URL to a prebuilt binary, or local file path. If empty, setup builds from the local repository. Machine-scoped: this source is downloaded and executed."},"agentide.storeRepo":{type:"string",scope:"application",default:"agenthippoai/agenthippo-store",markdownDescription:"GitHub repository for pack store (owner/repo format).\n\nDefault: `agenthippoai/agenthippo-store` ([github.com/agenthippoai/agenthippo-store](https://github.com/agenthippoai/agenthippo-store))\n\nSet to your own repo (e.g., `mycompany/our-packs`) to use a private or custom store."},"agentide.store.indexUrl":{type:"string",scope:"application",default:"https://agenthippoai.github.io/agenthippo-store",markdownDescription:`Base URL for the store index (Orama + metadata are loaded from paths under this URL).
421
440
 
422
441
  Default: \`https://agenthippoai.github.io/agenthippo-store\`
423
442
 
@@ -451,16 +470,16 @@ When enabled, JSONL trace files are incrementally converted to an indexed DuckDB
451
470
 
452
471
  **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.
453
472
 
454
- **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.282","@anthropic-ai/sdk":"0.128.0","@cfworker/json-schema":"^4.1.1","@mariozechner/pi-ai":"0.54.0","@modelcontextprotocol/sdk":"^1.30.0","@openai/codex":"0.157.0","@openai/codex-sdk":"0.157.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 Oi=S(ht=>{"use strict";var gR=ht&&ht.__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]})),hR=ht&&ht.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$d=ht&&ht.__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"&&gR(n,e,r[s]);return hR(n,e),n}})();Object.defineProperty(ht,"__esModule",{value:!0});ht.getDepsDir=co;ht.resolveFromOwnDeps=SE;ht.getClaudeAgentSdkPlatformPackageName=wR;ht.resolveClaudeCodeExecutablePath=Yc;ht.resolveClaudeCodeFromOwnDeps=TE;ht.getUnsupportedClaudePlatformHint=AR;ht.areDepsInstalled=bE;ht.installDeps=vE;ht.isAutoInstallDisabled=OE;ht.ensureDeps=TR;ht.getClaudeSdkCliPath=bR;ht.getCodexSdkBinaryPath=vR;ht.installedEngineVersion=IR;var ln=$d(require("fs")),mR=$d(require("os")),st=$d(require("path")),yE=require("child_process"),Wr=Xt(),qc=et();function ER(){let e=(()=>{try{return Wc()}catch{return}})()?.dependencies??{};return{"@anthropic-ai/claude-agent-sdk":e["@anthropic-ai/claude-agent-sdk"]??"0.3.282","@openai/codex":e["@openai/codex"]??"0.157.0","@openai/codex-sdk":e["@openai/codex-sdk"]??"0.157.0"}}var wE=ER();function co(){let t=st.dirname(process.execPath),e=st.join(t,qc.AGENTIDE_DEPS_DIR_NAME);if(ln.existsSync(e))return e;try{return ln.accessSync(t,ln.constants.W_OK),e}catch{return st.join(mR.homedir(),qc.AGENTIDE_DIR_NAME,qc.AGENTIDE_DEPS_DIR_NAME)}}function SE(t,e){let n=__dirname;for(let r=0;r<8;r++){let s=st.join(n,"node_modules",...t.split("/"),...e.split("/"));try{if(ln.existsSync(s))return s}catch{}let i=st.dirname(n);if(i===n)break;n=i}}function ao(t){try{return ln.existsSync(t)}catch{return!1}}function kd(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 AE(t,e){return t===process.platform&&e===process.arch}var Kc;function _R(){return Kc||(Kc=(()=>{try{let s=process.report?.getReport?.();if((typeof s=="object"&&s?s.header:void 0)?.glibcVersionRuntime)return"glibc"}catch{}let t=kd("glibc",process.arch),e=kd("musl",process.arch),n=t?ao(t):!1,r=e?ao(e):!1;if(r&&!n)return"musl";if(n&&!r)return"glibc";if(ao("/etc/alpine-release"))return"musl";try{if(/musl/i.test((0,yE.execSync)("ldd --version 2>&1 || true",{encoding:"utf8"})))return"musl"}catch{}return"glibc"})(),Kc)}function yR(t,e){return AE(t,e)?n=>{let r=kd(n,e);return r?ao(r):!1}:()=>!0}function Dd(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??(AE(e,n)?_R():"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 wR(t={}){return Dd(t)[0]?.name}function SR(t=process.platform){return t==="win32"?"claude.exe":"claude"}function Yc(t,e={}){let n=e.platform??process.platform,r=e.arch??process.arch,s=e.hasLoader??yR(n,r),i=SR(n),o;for(let{name:c,libc:l}of Dd(e)){let d=st.join(t,...c.split("/"),i);if(ao(d)){if(l&&!s(l)){o??=d;continue}return d}}let a=st.join(t,"@anthropic-ai","claude-agent-sdk","cli.js");return ao(a)?a:o}function TE(){let t=__dirname;for(let e=0;e<8;e++){let n=st.join(t,"node_modules"),r=Yc(n);if(r)return r;let s=st.dirname(t);if(s===t)break;t=s}}function AR(t={}){if(Dd(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 bE(){let t=co(),e=st.join(t,"node_modules"),n=st.join(t,"package.json");try{if(!ln.existsSync(n))return!1;let o=ln.readFileSync(n,"utf8"),c=JSON.parse(o).dependencies??{};for(let[l,d]of Object.entries(wE))if(c[l]!==d)return!1}catch{return!1}let r=Yc(e),s=st.join(e,"@openai","codex","bin","codex.js"),i=st.join(e,"@openai","codex-sdk","package.json");return!!r&&ln.existsSync(s)&&ln.existsSync(i)}async function vE(t=!1){let e=co();console.log(`${Wr.COLORS.cyan}Installing engine dependencies...${Wr.COLORS.reset}`),t&&console.log(` Directory: ${e}`),ln.mkdirSync(e,{recursive:!0});let n={name:qc.AGENTIDE_DEPS_PACKAGE_NAME,version:"1.0.0",private:!0,dependencies:wE};ln.writeFileSync(st.join(e,"package.json"),JSON.stringify(n,null,2)+`
455
- `);try{let r=process.platform==="win32"?"npm.cmd":"npm";(0,yE.execSync)(`${r} install --production --no-audit --no-fund`,{cwd:e,stdio:t?"inherit":"pipe"}),console.log(`${Wr.COLORS.green}Dependencies installed${Wr.COLORS.reset}`)}catch(r){throw console.error(`${Wr.COLORS.red}Error: Failed to install dependencies${Wr.COLORS.reset}`),r instanceof Error&&console.error(` ${r.message}`),r}}function OE(){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 TR(t=!1){if(!bE()){if(TE()&&SE("@openai/codex","bin/codex.js")){t&&console.error(`${Wr.COLORS.dim}Engine SDKs resolved from the CLI's own node_modules \u2014 skipping install.${Wr.COLORS.reset}`);return}if(OE()){t&&console.error(`${Wr.COLORS.dim}AGENTHIPPO_NO_AUTO_INSTALL set \u2014 skipping engine dependency install (expecting a self-contained image).${Wr.COLORS.reset}`);return}await vE(t)}}function bR(){return Yc(st.join(co(),"node_modules"))}function vR(){let t=co(),e=st.join(t,"node_modules","@openai","codex","bin","codex.js");if(ln.existsSync(e))return e;let n=st.join(t,"node_modules","@openai","codex-sdk"),r=OR();if(!r)return;let s=process.platform==="win32"?"codex.exe":"codex",i=st.join(n,"vendor",r,"codex",s);return ln.existsSync(i)?i:void 0}function OR(){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 IR(t){let e=t==="codex"?st.join("@openai","codex"):t==="claude"?st.join("@anthropic-ai","claude-agent-sdk"):void 0;if(!e)return;let n=[st.join(co(),"node_modules",e,"package.json"),st.join("/usr/local/lib/node_modules",e,"package.json"),st.join("/usr/lib/node_modules",e,"package.json")];for(let r of n)try{if(!ln.existsSync(r))continue;let s=JSON.parse(ln.readFileSync(r,"utf8"));if(s.version)return s.version}catch{}}});var Xt=S(Ct=>{"use strict";var PR=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]})),NR=Ct&&Ct.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ld=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"&&PR(n,e,r[s]);return NR(n,e),n}})();Object.defineProperty(Ct,"__esModule",{value:!0});Ct.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND=Ct.COLORS=void 0;Ct.getBinaryDir=Xc;Ct.findClaudeCodePath=CR;Ct.findCodexPath=kR;Ct.findBundledBasePromptsDir=$R;Ct.getLiteLLMQuickstartHintLines=DR;var RR=Ld(require("os")),Ii=Ld(require("path")),tr=Ld(require("fs")),IE=require("child_process"),Jc=Oi();function Xc(){return Ii.dirname(process.execPath)}function CR(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;let t=(0,Jc.getClaudeSdkCliPath)();if(t)return t;let e=(0,Jc.resolveClaudeCodeFromOwnDeps)();if(e)return e;let n=Xc(),r=Ii.join(n,"claude-sdk","cli.js");try{return tr.accessSync(r,tr.constants.R_OK),r}catch{}try{let o=process.platform==="win32"?"where claude":"which claude",a=(0,IE.execSync)(o,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(a)return a.split(`
456
- `)[0]}catch{}let s=RR.homedir(),i=[Ii.join(s,".npm-global","bin","claude"),Ii.join(s,".local","bin","claude"),"/usr/local/bin/claude","/opt/homebrew/bin/claude"];for(let o of i)try{return tr.accessSync(o,tr.constants.X_OK),o}catch{}}function kR(){if(process.env.CODEX_PATH)return process.env.CODEX_PATH;let t=(0,Jc.resolveFromOwnDeps)("@openai/codex","bin/codex.js");if(t)return t;let e=(0,Jc.getCodexSdkBinaryPath)();if(e)return e;let n=Xc(),r=process.platform==="win32"?"codex.exe":"codex",s=Ii.join(n,"codex-sdk",r);try{return tr.accessSync(s,tr.constants.X_OK),s}catch{}try{let i=process.platform==="win32"?"where codex":"which codex",o=(0,IE.execSync)(i,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(o)return o.split(`
457
- `)[0]}catch{}}function $R(){let t=process.env.AGENTHIPPO_BASE_PROMPTS_DIR||process.env.AGENTIDE_BASE_PROMPTS_DIR;if(t)try{return tr.accessSync(t,tr.constants.R_OK),t}catch{}let e=Xc(),n=Ii.join(e,"base-prompts");try{return tr.accessSync(n,tr.constants.R_OK),n}catch{}let r=Ii.resolve(__dirname,"..","base-prompts");try{return tr.accessSync(r,tr.constants.R_OK),r}catch{}}Ct.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"};Ct.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 DR(){return["Try local LiteLLM quickstart:",` ${Ct.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND}`]}});var lo=S(_s=>{"use strict";Object.defineProperty(_s,"__esModule",{value:!0});_s.TurnRegistry=_s.DEFAULT_TURN_DEADLINE_MS=void 0;_s.hashNonce=zc;_s.isNonceShaped=NE;var PE=require("crypto");_s.DEFAULT_TURN_DEADLINE_MS=30*6e4;function zc(t){return(0,PE.createHash)("sha256").update(t).digest("hex")}var LR=/^[0-9a-f]{32}$/;function NE(t){return LR.test(t)}var Md=class{entries=new Map;generations=new Map;generationCounter=0;register(e,n){this.prune();let r=n?.renewNonce?.trim()||void 0;if(r!==void 0&&!NE(r))throw new Error("renewNonce must be a previously minted turn nonce (32 lowercase hex chars)");let s=r??(0,PE.randomBytes)(16).toString("hex"),i=zc(s);this.entries.set(i,{userId:e.userId,sessionKey:e.sessionKey,inboundToken:e.inboundToken,egressStoreKey:e.egressStoreKey,deadline:e.deadline??Date.now()+_s.DEFAULT_TURN_DEADLINE_MS});let o=++this.generationCounter;this.generations.set(i,o);let a=!1;return{nonce:s,release:()=>{a||(a=!0,this.generations.get(i)===o&&(this.entries.delete(i),this.generations.delete(i)))}}}releaseByNonce(e){let n=zc(e);return this.generations.delete(n),this.entries.delete(n)}resolve(e,n=Date.now()){let r=zc(e),s=this.entries.get(r);if(s){if(n>s.deadline){this.entries.delete(r),this.generations.delete(r);return}return s}}prune(e=Date.now()){for(let[n,r]of this.entries)e>r.deadline&&(this.entries.delete(n),this.generations.delete(n))}get size(){return this.entries.size}};_s.TurnRegistry=Md});var Hd=S(nr=>{"use strict";var MR=nr&&nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),GR=nr&&nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),UR=nr&&nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&MR(n,e,r[s]);return GR(n,e),n}})();Object.defineProperty(nr,"__esModule",{value:!0});nr.GrantStore=void 0;nr.userKeyHash=Gd;nr.parseGrantKey=HR;var ta=require("crypto"),Pi=require("fs"),RE=UR(require("path")),CE=1,kE="agenthippo-grant:v1:";function Gd(t){return(0,ta.createHash)("sha256").update(t).digest("hex")}function HR(t){let e=t.trim(),n=/^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):Buffer.from(e,"base64");if(n.length!==32)throw new Error("the grant store key must be 32 bytes, base64 or hex (e.g. `openssl rand -base64 32`)");return n}var Ud=class{dir;key;chains=new Map;constructor(e,n){if(this.dir=e,this.key=n,n.length!==32)throw new Error("GrantStore key must be 32 bytes")}file(e){return RE.join(this.dir,`${e}.grant`)}encrypt(e,n,r){let s=(0,ta.randomBytes)(12),i=(0,ta.createCipheriv)("aes-256-gcm",this.key,s);i.setAAD(Buffer.from(kE+e));let o=Buffer.concat([i.update(JSON.stringify({userId:n,grants:r}),"utf8"),i.final()]);return JSON.stringify({v:CE,iv:s.toString("base64"),tag:i.getAuthTag().toString("base64"),data:o.toString("base64")})}decrypt(e,n){let r=JSON.parse(n);if(r.v!==CE)throw new Error(`unsupported grant file format ${r.v}`);let s=(0,ta.createDecipheriv)("aes-256-gcm",this.key,Buffer.from(r.iv,"base64"));s.setAAD(Buffer.from(kE+e)),s.setAuthTag(Buffer.from(r.tag,"base64"));let i=Buffer.concat([s.update(Buffer.from(r.data,"base64")),s.final()]).toString("utf8");return JSON.parse(i)}async get(e){let n=Gd(e),r;try{r=await Pi.promises.readFile(this.file(n),"utf8")}catch(i){if(i.code==="ENOENT")return{};throw i}let s=this.decrypt(n,r);if(s.userId!==e)throw new Error("grant record does not belong to this user");return s.grants??{}}async update(e,n){let r=Gd(e),i=(this.chains.get(r)??Promise.resolve()).catch(()=>{}).then(async()=>{let o=await n(await this.get(e));return await this.write(r,e,o),o});this.chains.set(r,i);try{return await i}finally{this.chains.get(r)===i&&this.chains.delete(r)}}async write(e,n,r){let s=this.file(e);if(!r.google&&!r.plaid?.items.length){await Pi.promises.rm(s,{force:!0});return}await Pi.promises.mkdir(this.dir,{recursive:!0,mode:448});let o=`${s}.${(0,ta.randomBytes)(6).toString("hex")}.tmp`;await Pi.promises.writeFile(o,this.encrypt(e,n,r),{mode:384}),await Pi.promises.rename(o,s)}async list(){let e;try{e=await Pi.promises.readdir(this.dir)}catch(r){if(r.code==="ENOENT")return[];throw r}let n=[];for(let r of e.filter(s=>/^[0-9a-f]{64}\.grant$/.test(s)).sort())try{n.push(this.decrypt(r.slice(0,64),await Pi.promises.readFile(RE.join(this.dir,r),"utf8")))}catch(s){n.push({file:r,error:s instanceof Error?s.message:String(s)})}return n}};nr.GrantStore=Ud});var na=S(Dn=>{"use strict";var jR=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]})),xR=Dn&&Dn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),BR=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"&&jR(n,e,r[s]);return xR(n,e),n}})();Object.defineProperty(Dn,"__esModule",{value:!0});Dn.StoredGrantProvider=Dn.ConnectError=void 0;Dn.readStoredGrantConfig=WR;var fo=require("crypto"),FR=BR(require("fs")),Zc=Hd(),VR=["AGENTHIPPO_GRANT_STORE_DIR","AGENTHIPPO_GRANT_STORE_KEY","AGENTHIPPO_GRANT_STORE_KEY_FILE","AGENTHIPPO_CONNECT_BASE_URL","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET_FILE","AGENTHIPPO_PLAID_CLIENT_ID","AGENTHIPPO_PLAID_SECRET","AGENTHIPPO_PLAID_SECRET_FILE","AGENTHIPPO_PLAID_ENV","AGENTHIPPO_PLAID_PRODUCTS","AGENTHIPPO_PLAID_COUNTRY_CODES","AGENTHIPPO_CONNECT_TICKET_ONLY"];function jd(t,e){let n=t[`${e}_FILE`]?.trim();return n?FR.readFileSync(n,"utf8").trim()||void 0:t[e]?.trim()||void 0}function $E(t,e){return(t?.trim()||e).split(",").map(n=>n.trim()).filter(Boolean)}var DE=new WeakMap;function WR(t=process.env){let e=DE.get(t);if(e)return e;try{let n=t.AGENTHIPPO_GRANT_STORE_DIR?.trim(),r=jd(t,"AGENTHIPPO_GRANT_STORE_KEY");if(!n||!r)throw new Error("provider=stored-grant needs AGENTHIPPO_GRANT_STORE_DIR and AGENTHIPPO_GRANT_STORE_KEY (32 bytes, base64 or hex, e.g. `openssl rand -base64 32`; or AGENTHIPPO_GRANT_STORE_KEY_FILE)");let s=t.AGENTHIPPO_PLAID_ENV?.trim()||"sandbox";if(s!=="sandbox"&&s!=="production")throw new Error(`AGENTHIPPO_PLAID_ENV must be sandbox or production (got ${s})`);let i=t.AGENTHIPPO_CONNECT_BASE_URL?.trim().replace(/\/+$/,"");if(i&&!/^https?:\/\/[^/]+/.test(i))throw new Error(`AGENTHIPPO_CONNECT_BASE_URL must be an http(s) URL (got ${i})`);let o=t.AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID?.trim(),a=jd(t,"AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET"),c=t.AGENTHIPPO_PLAID_CLIENT_ID?.trim(),l=jd(t,"AGENTHIPPO_PLAID_SECRET"),d={store:new Zc.GrantStore(n,(0,Zc.parseGrantKey)(r)),connectBaseUrl:i||void 0,google:o&&a?{clientId:o,clientSecret:a}:void 0,plaid:c&&l?{env:s,clientId:c,secret:l,products:$E(t.AGENTHIPPO_PLAID_PRODUCTS,"transactions"),countryCodes:$E(t.AGENTHIPPO_PLAID_COUNTRY_CODES,"US")}:void 0,ticketOnly:t.AGENTHIPPO_CONNECT_TICKET_ONLY?.trim()==="1"};return DE.set(t,d),d}finally{for(let n of VR)delete t[n]}}var kt=class extends Error{status;constructor(e,n){super(n),this.status=e}};Dn.ConnectError=kt;var LE={gmail:["https://www.googleapis.com/auth/gmail.modify"],calendar:["https://www.googleapis.com/auth/calendar"],drive:["https://www.googleapis.com/auth/drive.readonly","https://www.googleapis.com/auth/drive.file"]},Qc=15*6e4,KR=5*6e4,ME=new Set(["ITEM_NOT_FOUND","INVALID_ACCESS_TOKEN"]),uo=t=>(0,fo.createHash)("sha256").update(t).digest("hex");function qR(t){try{let e=JSON.parse(Buffer.from(String(t).split(".")[1],"base64url").toString("utf8"));return typeof e.email=="string"?e.email:void 0}catch{return}}var YR=3e4,xd=class{cfg;name="stored-grant";tools;tickets=new Map;googleFlows=new Map;bankFlows=new Map;googleTokens=new Map;changeListeners=[];constructor(e){this.cfg=e,this.tools=[this.statusTool(),this.connectTool(),this.disconnectTool()]}onGrantsChanged(e){this.changeListeners.push(e)}changed(e){for(let n of this.changeListeners)n(e)}get connectBaseUrl(){return this.cfg.connectBaseUrl}get http(){let e=this.cfg.fetchImpl??fetch;return((n,r)=>e(n,{signal:AbortSignal.timeout(YR),...r}))}now(){return this.cfg.now?.()??Date.now()}async acquire({userId:e}){if(!e?.trim())throw new Error("No verified user (fail-closed)");let n=await this.cfg.store.get(e),r=this.now()+KR,s;if(!this.cfg.google)s={status:"not_configured"};else if(!n.google)s={status:"not_connected"};else try{let c=await this.googleAccessToken(e,n.google);s={status:"connected",accessToken:c.accessToken,email:n.google.email,scopes:n.google.scopes},r=Math.min(r,c.expiresAt-6e4)}catch(c){let l=c instanceof Error?c.message:String(c),d=c.reconnect;s={status:d?"reconnect_required":"unavailable",error:l},d||(r=this.now())}let i,o=n.plaid?.items??[];if(!this.cfg.plaid)i={status:"not_configured"};else if(!o.length)i={status:"not_connected"};else{let c=this.cfg.plaid;i={status:"connected",env:c.env,clientId:c.clientId,secret:c.secret,items:o.map(l=>({item_id:l.itemId,access_token:l.accessToken,env:l.env,institution:l.institution,...l.replacedBy?{replaced_by:l.replacedBy}:{}}))}}return{expiresAt:r,secretRef:{google:s,plaid:i}}}async googleAccessToken(e,n){let r=uo(n.refreshToken),s=this.googleTokens.get(e);if(s&&s.refreshHash===r&&s.expiresAt>this.now()+6e4)return s;let i=this.cfg.google,o=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i.clientId,client_secret:i.clientSecret,refresh_token:n.refreshToken,grant_type:"refresh_token"})}),a=await o.json().catch(()=>({}));if(!o.ok||!a.access_token)throw Object.assign(new Error(`google token: ${a.error??o.status} ${a.error_description??""}`.trim()),{reconnect:a.error==="invalid_grant"});let c={accessToken:a.access_token,expiresAt:this.now()+(a.expires_in??3600)*1e3,refreshHash:r};return this.googleTokens.set(e,c),c}async plaid(e,n){let r=this.cfg.plaid;if(!r)throw new Error("bank connections are not set up on this deployment");let s=await this.http(`https://${r.env}.plaid.com${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:r.clientId,secret:r.secret,...n})}),i=await s.json().catch(()=>({}));if(!s.ok)throw Object.assign(new Error(`plaid ${e}: ${i.error_code} ${i.error_message}`),{code:i.error_code});return i}prune(){let e=this.now();for(let n of[this.tickets,this.googleFlows,this.bankFlows])for(let[r,s]of n)s.expiresAt<=e&&n.delete(r)}take(e,n){if(!n)return;let r=uo(n),s=e.get(r);return e.delete(r),s&&s.expiresAt>this.now()?s:void 0}createTicket(e,n,r=[]){this.prune();let s=(0,fo.randomBytes)(24).toString("base64url");return this.tickets.set(uo(s),{userId:e,service:n,scopes:r,expiresAt:this.now()+Qc}),s}checkBrowserUser(e,n){if(n===void 0){if(this.cfg.ticketOnly)return;throw new kt(401,"This page only works when opened through this deployment's sign-in. (Operator: route /connect/ through the identity edge, like the chat endpoint.)")}if(n.trim().toLowerCase()!==e.trim().toLowerCase())throw new kt(403,"This link was made for a different account. Sign in as the person who asked for it, or ask your agent for a new link.")}requireBase(){if(!this.cfg.connectBaseUrl)throw new kt(500,"This deployment has no AGENTHIPPO_CONNECT_BASE_URL.");return this.cfg.connectBaseUrl}async startConnect(e,n){let r=this.take(this.tickets,e);if(!r)throw new kt(410,"This link has expired or was already used. Ask your agent for a new one.");this.checkBrowserUser(r.userId,n);let s=this.requireBase();if(r.service==="google"){let c=this.cfg.google;if(!c)throw new kt(500,"Google is not set up on this deployment.");let l=(0,fo.randomBytes)(24).toString("base64url"),d=(0,fo.randomBytes)(32).toString("base64url");return this.googleFlows.set(uo(l),{userId:r.userId,verifier:d,scopes:r.scopes,expiresAt:this.now()+Qc}),{kind:"redirect",location:`https://accounts.google.com/o/oauth2/v2/auth?${new URLSearchParams({client_id:c.clientId,redirect_uri:`${s}/connect/google/callback`,response_type:"code",scope:["openid","email",...r.scopes.flatMap(f=>LE[f]??[])].join(" "),access_type:"offline",prompt:"consent",state:l,code_challenge:(0,fo.createHash)("sha256").update(d).digest("base64url"),code_challenge_method:"S256"})}`}}let i=this.cfg.plaid;if(!i)throw new kt(500,"Bank connections are not set up on this deployment.");let o=await this.plaid("/link/token/create",{client_name:"AgentHippo",user:{client_user_id:(0,Zc.userKeyHash)(r.userId).slice(0,32)},products:i.products,country_codes:i.countryCodes,language:"en"}).catch(c=>{throw new kt(502,`Plaid could not start the bank link (${c instanceof Error?c.message:c}).`)}),a=(0,fo.randomBytes)(24).toString("base64url");return this.bankFlows.set(uo(a),{userId:r.userId,expiresAt:this.now()+Qc}),{kind:"bank",flow:a,linkToken:String(o.link_token)}}async finishGoogle(e,n){let r=this.take(this.googleFlows,e.state);if(!r)throw new kt(410,"This sign-in has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),e.error)throw new kt(400,`Google did not grant access (${e.error}).`);if(!e.code)throw new kt(400,"Google sent no authorization code.");let s=this.cfg.google,i=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({code:e.code,client_id:s.clientId,client_secret:s.clientSecret,redirect_uri:`${this.requireBase()}/connect/google/callback`,grant_type:"authorization_code",code_verifier:r.verifier})}),o=await i.json().catch(()=>({}));if(!i.ok||!o.access_token)throw new kt(502,`Google refused the sign-in (${o.error??i.status}).`);if(!o.refresh_token)throw new kt(502,"Google returned no refresh token: remove this app at myaccount.google.com/permissions, then ask your agent for a new link.");let a=qR(o.id_token),c={refreshToken:o.refresh_token,email:a,scopes:String(o.scope??"").split(" ").filter(Boolean),connectedAt:new Date(this.now()).toISOString()};return await this.cfg.store.update(r.userId,l=>({...l,google:c})),this.googleTokens.set(r.userId,{accessToken:o.access_token,expiresAt:this.now()+(o.expires_in??3600)*1e3,refreshHash:uo(o.refresh_token)}),this.changed(r.userId),{userId:r.userId,email:a}}async finishBank(e,n){let r=this.take(this.bankFlows,typeof e.flow=="string"?e.flow:void 0);if(!r)throw new kt(410,"This bank link has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),typeof e.public_token!="string"||!e.public_token)throw new kt(400,"Plaid sent no public token.");let s=e.institution&&typeof e.institution=="object"?e.institution:{},i=typeof s.name=="string"?s.name.slice(0,200):void 0,o=typeof s.institution_id=="string"?s.institution_id.slice(0,100):void 0,a=Array.isArray(e.masks)?e.masks.filter(d=>typeof d=="string"&&/^[0-9A-Za-z]{1,8}$/.test(d)):[],c=await this.plaid("/item/public_token/exchange",{public_token:e.public_token}).catch(d=>{throw new kt(502,`Plaid could not finish the bank link (${d instanceof Error?d.message:d}).`)}),l=this.cfg.plaid.env;return await this.cfg.store.update(r.userId,async d=>{let u=[];for(let f of d.plaid?.items??[]){if(!(f.env===l&&!!o&&f.institutionId===o&&f.masks.some(m=>a.includes(m)))){u.push(f);continue}await this.plaid("/item/remove",{access_token:f.accessToken}).then(()=>!0,m=>ME.has(m.code))||u.push({...f,replacedBy:String(c.item_id)})}return u.push({itemId:String(c.item_id),accessToken:String(c.access_token),env:l,institution:i,institutionId:o,masks:a,connectedAt:new Date(this.now()).toISOString()}),{...d,plaid:{items:u}}}),this.changed(r.userId),{userId:r.userId,institution:i}}async revoke(e,n,r,s){let i=f=>s===void 0||!(Date.parse(f)/1e3>s);if(n==="google"){let f=(await this.cfg.store.get(e)).google;if(!f||!i(f.connectedAt))return{ok:!0,disconnected:[],failed:[]};let p;try{p=await this.http(`https://oauth2.googleapis.com/revoke?token=${encodeURIComponent(f.refreshToken)}`,{method:"POST"})}catch(h){return{ok:!1,disconnected:[],failed:[{error:`could not reach Google to revoke access (${h instanceof Error?h.message:h}); nothing was removed, try again`}]}}if(!p.ok){let h=await p.text();if(!/invalid_token/.test(h))return{ok:!1,disconnected:[],failed:[{error:`Google did not revoke access (${p.status}); nothing was removed, try again`}]}}let g={};await this.cfg.store.update(e,h=>h.google?.refreshToken===f.refreshToken?{...h,google:void 0}:(g.grant=h.google,h)),this.googleTokens.delete(e);let m=g.grant;return m&&await this.googleAccessToken(e,m).then(()=>!1,w=>!!w?.reconnect)&&await this.cfg.store.update(e,w=>w.google?.refreshToken===m.refreshToken?{...w,google:void 0}:w),this.changed(e),{ok:!0,disconnected:["google"],failed:[]}}let o=(await this.cfg.store.get(e)).plaid?.items??[],a=JR(o,r).filter(f=>i(f.connectedAt));if(!a.length)return{ok:!0,disconnected:[],failed:[]};let c=this.cfg.plaid?.env,l=[],d=[];for(let f of a){if(f.env!==c){f.env==="sandbox"?l.push(f):d.push({bank:f.institution,item_id:f.itemId,error:`linked in ${f.env}, which this deployment is not configured for`});continue}try{await this.plaid("/item/remove",{access_token:f.accessToken}),l.push(f)}catch(p){ME.has(p.code??"")?l.push(f):d.push({bank:f.institution,item_id:f.itemId,error:p instanceof Error?p.message:String(p)})}}let u=new Set(l.map(f=>f.itemId));return await this.cfg.store.update(e,f=>({...f,plaid:{items:(f.plaid?.items??[]).filter(p=>!u.has(p.itemId))}})),l.length&&this.changed(e),{ok:!d.length,disconnected:l.map(f=>f.institution??f.itemId),failed:d}}listGrants(){return this.cfg.store.list()}async summary(e){let n={users:0,google:0,banks:0,unreadable:0};for(let r of e??await this.cfg.store.list()){if("error"in r){n.unreadable++;continue}let s=(r.grants.plaid?.items??[]).filter(i=>!i.replacedBy).length;(r.grants.google||s)&&n.users++,n.google+=r.grants.google?1:0,n.banks+=s}return n}async applyRevocations(e,n,r){if(!e.length)return[];let s=new Map;for(let o of n??await this.cfg.store.list())"error"in o||s.set((0,Zc.userKeyHash)(o.userId),o);let i=[];for(let o of e){let a=s.get(o.user);if(!a)continue;let c=u=>!(Date.parse(u)/1e3>o.requestedAt),l=u=>this.revoke(a.userId,u,void 0,o.requestedAt).catch(f=>({ok:!1,disconnected:[],failed:[{error:f instanceof Error?f.message:String(f)}]})),d=[];(!o.service||o.service==="google")&&a.grants.google&&c(a.grants.google.connectedAt)&&d.push("google"),(!o.service||o.service==="bank")&&(a.grants.plaid?.items??[]).some(u=>c(u.connectedAt))&&d.push("bank");for(let u of d){let f=await l(u);(!f.ok||f.disconnected.length)&&(i.push({user:o.user,service:u,result:f}),r?.({user:o.user,service:u,result:f}))}}return i}statusTool(){return{definition:{name:"connections_status",description:"Which of the user's own accounts are connected on this deployment (Google, banks) and which it can connect. Start here before using Gmail, Calendar, Drive or bank tools.",inputSchema:{type:"object",properties:{}}},call:async({userId:e})=>{let n=await this.cfg.store.get(e),r=this.cfg.plaid?.env;return{google:{available:!!this.cfg.google,connected:!!n.google,...n.google?{email:n.google.email,scopes:n.google.scopes,connected_at:n.google.connectedAt}:{}},banks:{available:!!this.cfg.plaid,...r?{environment:r}:{},linked:(n.plaid?.items??[]).map(s=>({institution:s.institution,item_id:s.itemId,connected_at:s.connectedAt,...s.replacedBy?{note:`replaced by ${s.replacedBy}, but Plaid did not remove it: disconnect it with bank "${s.itemId}"`}:s.env!==r?{note:`linked in ${s.env}; unused on this deployment`}:{}}))},connect_links:!!this.cfg.connectBaseUrl}}}}connectTool(){return{definition:{name:"connections_connect",description:"A one-time link for the user to connect their Google account or a bank. Give them the link: it works only when they open it signed in, and expires in 15 minutes. When they are done, call connections_status.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},google_scopes:{type:"array",items:{type:"string",enum:["gmail","calendar","drive"]},description:"Limit Google access (default: all three)"}},required:["service"]}},call:async({userId:e},n)=>{let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');if(!this.cfg.connectBaseUrl)throw new Error("this deployment cannot issue connect links (the operator has not set AGENTHIPPO_CONNECT_BASE_URL)");if(r==="google"&&!this.cfg.google)throw new Error("Google is not set up on this deployment");if(r==="bank"&&!this.cfg.plaid)throw new Error("bank connections are not set up on this deployment");let s=[];if(r==="google"){let o=Array.isArray(n.google_scopes)?n.google_scopes.map(String):["gmail","calendar","drive"];if(o.filter(c=>!LE[c]).length||!o.length)throw new Error(`google_scopes must be some of gmail, calendar, drive (got ${o.join(", ")||"none"})`);s=[...new Set(o)]}let i=this.createTicket(e,r,s);return{url:`${this.cfg.connectBaseUrl}/connect/start?ticket=${i}`,expires_in_minutes:Qc/6e4,next:"Give the user this link to open in their browser. It works only for them. When they are done, call connections_status."}}}}disconnectTool(){return{definition:{name:"connections_disconnect",description:"Disconnect the user's Google account or a bank: revokes access at Google or removes the bank link at Plaid, then forgets it. Needs confirmed: true, only after the user asked for it.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},bank:{type:"string",description:"Bank name or item_id to disconnect (default: every bank). A name matching several links fails and lists them."},confirmed:{type:"boolean",description:"true only after the user asked to disconnect"}},required:["service","confirmed"]}},call:async(e,n)=>{if(n.confirmed!==!0)throw new Error("refusing to disconnect without confirmed: true (only after the user asked for it)");let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');let s=await this.revoke(e.userId,r,typeof n.bank=="string"?n.bank:void 0);return e.invalidate(),s}}}};Dn.StoredGrantProvider=xd;function JR(t,e){if(!e)return t;let n=e.toLowerCase(),r=t.filter(i=>i.itemId===e||i.institution?.toLowerCase()===n),s=r.length?r:t.filter(i=>i.institution?.toLowerCase().includes(n));if(!s.length)throw new Error(`no connected bank matches "${e}"`);if(s.length>1)throw new Error(`"${e}" matches ${s.length} bank links; pass one item_id: ${s.map(i=>`${i.itemId} (${i.institution})`).join(", ")}`);return s}});var Fd=S(Or=>{"use strict";Object.defineProperty(Or,"__esModule",{value:!0});Or.CredentialBroker=Or.identityProvider=Or.passthroughProvider=void 0;Or.resolveProvider=XR;var GE=na();Or.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}}};Or.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 XR(t,e=process.env){let n=(t??"passthrough").trim().toLowerCase();if(n==="passthrough")return Or.passthroughProvider;if(n==="identity")return Or.identityProvider;if(n==="stored-grant")return new GE.StoredGrantProvider((0,GE.readStoredGrantConfig)(e));throw new Error(`Unknown data credential provider "${t}" (supported: passthrough, identity, stored-grant)`)}var Bd=class{provider;cache=new Map;constructor(e){this.provider=e,e.onGrantsChanged?.(n=>this.invalidate(n))}async acquire(e,n){if(this.provider.refreshOnInbound)return this.provider.acquire({userId:e,inboundToken:n});let r=this.cache.get(e);if(r&&r.expiresAt>Date.now())return r;this.cache.delete(e);let s=await this.provider.acquire({userId:e,inboundToken:n});return this.cache.set(e,s),s}invalidate(e){this.cache.delete(e)}};Or.CredentialBroker=Bd});var Wd=S(Ln=>{"use strict";var zR=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]})),QR=Ln&&Ln.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ZR=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"&&zR(n,e,r[s]);return QR(n,e),n}})();Object.defineProperty(Ln,"__esModule",{value:!0});Ln.ConnectorHost=Ln.TURN_META_KEY=void 0;var UE=ZR(require("path")),eC=require("fs"),tC=require("@modelcontextprotocol/sdk/client/index.js"),nC=require("@modelcontextprotocol/sdk/client/stdio.js"),rC=require("@modelcontextprotocol/sdk/types.js"),sC=Ic();Ln.TURN_META_KEY="ai.agenthippo/turn";var Vd=class t{client;logger;connectorPath;constructor(e,n,r){this.client=e,this.logger=n,this.connectorPath=r}static async spawn(e){let n=UE.resolve(e.connectorPath);await eC.promises.access(n);let r=await(0,sC.resolveNodeBinary)(),s=new nC.StdioClientTransport({command:r,args:[n],cwd:UE.dirname(n),env:{...process.env,AGENTHIPPO_DATA_CONNECTOR:"1"},stderr:"pipe"}),i=new tC.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:{[Ln.TURN_META_KEY]:{userId:r.userId,credential:r.credential}}}},rC.CallToolResultSchema)}async close(){try{await this.client.close()}catch(e){this.logger?.warn(`[DataPlane] connector close: ${e instanceof Error?e.message:String(e)}`)}}};Ln.ConnectorHost=Vd});var ra=S(Mn=>{"use strict";Object.defineProperty(Mn,"__esModule",{value:!0});Mn.DEFAULT_AUTH_BIND=Mn.AUTH_PROXY_SECRET_HEADER=Mn.DEFAULT_JWT_SECRET=void 0;Mn.resolveAuthBrokerBind=aC;Mn.loadAuthBrokerConfig=cC;Mn.emailDomainAllowed=lC;function iC(t){return t?.trim()?t.split(",").map(e=>e.trim().toLowerCase()).filter(Boolean):[]}Mn.DEFAULT_JWT_SECRET="dev-agenthippo-auth-secret-change-me";Mn.AUTH_PROXY_SECRET_HEADER="x-agenthippo-proxy-secret";Mn.DEFAULT_AUTH_BIND="127.0.0.1";var oC=new Set(["127.0.0.1","localhost","::1","[::1]"]);function aC(t=process.env){let e=t.AGENTHIPPO_AUTH_BIND?.trim()||Mn.DEFAULT_AUTH_BIND;if(!!oC.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.
473
+ **Application-scoped on purpose**: skills fetched from here become agent instructions and tool definitions on this machine, so this is an install source.`},"agentide.skills.remote.syncOnStartup":{type:"boolean",scope:"application",default:!0,description:"Sync remote skills on extension startup (requires agentide.skills.remote.enabled)."},"agentide.skills.remote.allowOverwriteLocal":{type:"boolean",scope:"application",default:!1,description:"Allow remote skills to overwrite locally-authored skill files of the same name."},"agentide.skills.remote.timeoutMs":{type:"number",scope:"application",default:8e3,minimum:500,maximum:12e4,description:"Timeout (milliseconds) for remote skill registry requests."}}}},capabilities:{untrustedWorkspaces:{supported:"limited",description:"Agent Hippo runs AI agents that read your code, spawn processes, and send prompts to remote model endpoints. In an untrusted workspace the security-relevant settings below are ignored in favour of your user/application values, and remote agent packs (`spec.remote.url`) will not receive your AgentHippo access token without an explicit per-host approval.",restrictedConfigurations:["agentide.auth.baseUrl","agentide.storeRepo","agentide.store.indexUrl","agentide.anywhere.installSource","agentide.anywhere.enabled","agentide.anywhere.autoStart","agentide.anywhere.autoConnect","agentide.anywhere.port","agentide.anywhere.hidden","agentide.cli.path","agentide.cli.installSource","agentide.additionalEngineDir","agentide.fallbackDirectory","agentide.permissions.fileAccess","agentide.gateway.url","agentide.gateway.token","agentide.gateway.autoConnect","agentide.gateway.autoRegister","agentide.gateway.agents","agentide.providers.litellm.baseUrl","agentide.providers.anthropic.baseUrl","agentide.AgentHippoModelGateway.url","agentide.skills.remote.enabled","agentide.skills.remote.registryUrl","agentide.skills.remote.syncOnStartup","agentide.skills.remote.allowOverwriteLocal","agentide.analytics.fleetSources","agentide.analytics.fleetScriptSources","agentide.analytics.defaultDashboardPrompt","agentide.analytics.duckdb.tempDirectory"]}},dependencies:{"@agenthippo-ai/evidence-ship":"0.2.4","@anthropic-ai/claude-agent-sdk":"0.3.282","@anthropic-ai/sdk":"0.128.0","@cfworker/json-schema":"^4.1.1","@mariozechner/pi-ai":"0.54.0","@modelcontextprotocol/sdk":"^1.30.0","@openai/codex":"0.157.0","@openai/codex-sdk":"0.157.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 Oi=S(ht=>{"use strict";var gR=ht&&ht.__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]})),hR=ht&&ht.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$d=ht&&ht.__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"&&gR(n,e,r[s]);return hR(n,e),n}})();Object.defineProperty(ht,"__esModule",{value:!0});ht.getDepsDir=co;ht.resolveFromOwnDeps=SE;ht.getClaudeAgentSdkPlatformPackageName=wR;ht.resolveClaudeCodeExecutablePath=Yc;ht.resolveClaudeCodeFromOwnDeps=TE;ht.getUnsupportedClaudePlatformHint=AR;ht.areDepsInstalled=bE;ht.installDeps=vE;ht.isAutoInstallDisabled=OE;ht.ensureDeps=TR;ht.getClaudeSdkCliPath=bR;ht.getCodexSdkBinaryPath=vR;ht.installedEngineVersion=PR;var ln=$d(require("fs")),mR=$d(require("os")),st=$d(require("path")),yE=require("child_process"),Wr=Xt(),qc=et();function ER(){let e=(()=>{try{return Wc()}catch{return}})()?.dependencies??{};return{"@anthropic-ai/claude-agent-sdk":e["@anthropic-ai/claude-agent-sdk"]??"0.3.282","@openai/codex":e["@openai/codex"]??"0.157.0","@openai/codex-sdk":e["@openai/codex-sdk"]??"0.157.0"}}var wE=ER();function co(){let t=st.dirname(process.execPath),e=st.join(t,qc.AGENTIDE_DEPS_DIR_NAME);if(ln.existsSync(e))return e;try{return ln.accessSync(t,ln.constants.W_OK),e}catch{return st.join(mR.homedir(),qc.AGENTIDE_DIR_NAME,qc.AGENTIDE_DEPS_DIR_NAME)}}function SE(t,e){let n=__dirname;for(let r=0;r<8;r++){let s=st.join(n,"node_modules",...t.split("/"),...e.split("/"));try{if(ln.existsSync(s))return s}catch{}let i=st.dirname(n);if(i===n)break;n=i}}function ao(t){try{return ln.existsSync(t)}catch{return!1}}function kd(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 AE(t,e){return t===process.platform&&e===process.arch}var Kc;function _R(){return Kc||(Kc=(()=>{try{let s=process.report?.getReport?.();if((typeof s=="object"&&s?s.header:void 0)?.glibcVersionRuntime)return"glibc"}catch{}let t=kd("glibc",process.arch),e=kd("musl",process.arch),n=t?ao(t):!1,r=e?ao(e):!1;if(r&&!n)return"musl";if(n&&!r)return"glibc";if(ao("/etc/alpine-release"))return"musl";try{if(/musl/i.test((0,yE.execSync)("ldd --version 2>&1 || true",{encoding:"utf8"})))return"musl"}catch{}return"glibc"})(),Kc)}function yR(t,e){return AE(t,e)?n=>{let r=kd(n,e);return r?ao(r):!1}:()=>!0}function Dd(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??(AE(e,n)?_R():"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 wR(t={}){return Dd(t)[0]?.name}function SR(t=process.platform){return t==="win32"?"claude.exe":"claude"}function Yc(t,e={}){let n=e.platform??process.platform,r=e.arch??process.arch,s=e.hasLoader??yR(n,r),i=SR(n),o;for(let{name:c,libc:l}of Dd(e)){let d=st.join(t,...c.split("/"),i);if(ao(d)){if(l&&!s(l)){o??=d;continue}return d}}let a=st.join(t,"@anthropic-ai","claude-agent-sdk","cli.js");return ao(a)?a:o}function TE(){let t=__dirname;for(let e=0;e<8;e++){let n=st.join(t,"node_modules"),r=Yc(n);if(r)return r;let s=st.dirname(t);if(s===t)break;t=s}}function AR(t={}){if(Dd(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 bE(){let t=co(),e=st.join(t,"node_modules"),n=st.join(t,"package.json");try{if(!ln.existsSync(n))return!1;let o=ln.readFileSync(n,"utf8"),c=JSON.parse(o).dependencies??{};for(let[l,d]of Object.entries(wE))if(c[l]!==d)return!1}catch{return!1}let r=Yc(e),s=st.join(e,"@openai","codex","bin","codex.js"),i=st.join(e,"@openai","codex-sdk","package.json");return!!r&&ln.existsSync(s)&&ln.existsSync(i)}async function vE(t=!1){let e=co();console.log(`${Wr.COLORS.cyan}Installing engine dependencies...${Wr.COLORS.reset}`),t&&console.log(` Directory: ${e}`),ln.mkdirSync(e,{recursive:!0});let n={name:qc.AGENTIDE_DEPS_PACKAGE_NAME,version:"1.0.0",private:!0,dependencies:wE};ln.writeFileSync(st.join(e,"package.json"),JSON.stringify(n,null,2)+`
474
+ `);try{let r=process.platform==="win32"?"npm.cmd":"npm";(0,yE.execSync)(`${r} install --production --no-audit --no-fund`,{cwd:e,stdio:t?"inherit":"pipe"}),console.log(`${Wr.COLORS.green}Dependencies installed${Wr.COLORS.reset}`)}catch(r){throw console.error(`${Wr.COLORS.red}Error: Failed to install dependencies${Wr.COLORS.reset}`),r instanceof Error&&console.error(` ${r.message}`),r}}function OE(){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 TR(t=!1){if(!bE()){if(TE()&&SE("@openai/codex","bin/codex.js")){t&&console.error(`${Wr.COLORS.dim}Engine SDKs resolved from the CLI's own node_modules \u2014 skipping install.${Wr.COLORS.reset}`);return}if(OE()){t&&console.error(`${Wr.COLORS.dim}AGENTHIPPO_NO_AUTO_INSTALL set \u2014 skipping engine dependency install (expecting a self-contained image).${Wr.COLORS.reset}`);return}await vE(t)}}function bR(){return Yc(st.join(co(),"node_modules"))}function vR(){let t=co(),e=st.join(t,"node_modules","@openai","codex","bin","codex.js");if(ln.existsSync(e))return e;let n=st.join(t,"node_modules","@openai","codex-sdk"),r=OR();if(!r)return;let s=process.platform==="win32"?"codex.exe":"codex",i=st.join(n,"vendor",r,"codex",s);return ln.existsSync(i)?i:void 0}function OR(){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 PR(t){let e=t==="codex"?st.join("@openai","codex"):t==="claude"?st.join("@anthropic-ai","claude-agent-sdk"):void 0;if(!e)return;let n=[st.join(co(),"node_modules",e,"package.json"),st.join("/usr/local/lib/node_modules",e,"package.json"),st.join("/usr/lib/node_modules",e,"package.json")];for(let r of n)try{if(!ln.existsSync(r))continue;let s=JSON.parse(ln.readFileSync(r,"utf8"));if(s.version)return s.version}catch{}}});var Xt=S(Ct=>{"use strict";var IR=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]})),NR=Ct&&Ct.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ld=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"&&IR(n,e,r[s]);return NR(n,e),n}})();Object.defineProperty(Ct,"__esModule",{value:!0});Ct.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND=Ct.COLORS=void 0;Ct.getBinaryDir=Xc;Ct.findClaudeCodePath=CR;Ct.findCodexPath=kR;Ct.findBundledBasePromptsDir=$R;Ct.getLiteLLMQuickstartHintLines=DR;var RR=Ld(require("os")),Pi=Ld(require("path")),tr=Ld(require("fs")),PE=require("child_process"),Jc=Oi();function Xc(){return Pi.dirname(process.execPath)}function CR(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;let t=(0,Jc.getClaudeSdkCliPath)();if(t)return t;let e=(0,Jc.resolveClaudeCodeFromOwnDeps)();if(e)return e;let n=Xc(),r=Pi.join(n,"claude-sdk","cli.js");try{return tr.accessSync(r,tr.constants.R_OK),r}catch{}try{let o=process.platform==="win32"?"where claude":"which claude",a=(0,PE.execSync)(o,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(a)return a.split(`
475
+ `)[0]}catch{}let s=RR.homedir(),i=[Pi.join(s,".npm-global","bin","claude"),Pi.join(s,".local","bin","claude"),"/usr/local/bin/claude","/opt/homebrew/bin/claude"];for(let o of i)try{return tr.accessSync(o,tr.constants.X_OK),o}catch{}}function kR(){if(process.env.CODEX_PATH)return process.env.CODEX_PATH;let t=(0,Jc.resolveFromOwnDeps)("@openai/codex","bin/codex.js");if(t)return t;let e=(0,Jc.getCodexSdkBinaryPath)();if(e)return e;let n=Xc(),r=process.platform==="win32"?"codex.exe":"codex",s=Pi.join(n,"codex-sdk",r);try{return tr.accessSync(s,tr.constants.X_OK),s}catch{}try{let i=process.platform==="win32"?"where codex":"which codex",o=(0,PE.execSync)(i,{encoding:"utf8",stdio:["pipe","pipe","ignore"]}).trim();if(o)return o.split(`
476
+ `)[0]}catch{}}function $R(){let t=process.env.AGENTHIPPO_BASE_PROMPTS_DIR||process.env.AGENTIDE_BASE_PROMPTS_DIR;if(t)try{return tr.accessSync(t,tr.constants.R_OK),t}catch{}let e=Xc(),n=Pi.join(e,"base-prompts");try{return tr.accessSync(n,tr.constants.R_OK),n}catch{}let r=Pi.resolve(__dirname,"..","base-prompts");try{return tr.accessSync(r,tr.constants.R_OK),r}catch{}}Ct.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"};Ct.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 DR(){return["Try local LiteLLM quickstart:",` ${Ct.SUGGESTED_LITELLM_SMOKE_TEST_COMMAND}`]}});var lo=S(_s=>{"use strict";Object.defineProperty(_s,"__esModule",{value:!0});_s.TurnRegistry=_s.DEFAULT_TURN_DEADLINE_MS=void 0;_s.hashNonce=zc;_s.isNonceShaped=NE;var IE=require("crypto");_s.DEFAULT_TURN_DEADLINE_MS=30*6e4;function zc(t){return(0,IE.createHash)("sha256").update(t).digest("hex")}var LR=/^[0-9a-f]{32}$/;function NE(t){return LR.test(t)}var Md=class{entries=new Map;generations=new Map;generationCounter=0;register(e,n){this.prune();let r=n?.renewNonce?.trim()||void 0;if(r!==void 0&&!NE(r))throw new Error("renewNonce must be a previously minted turn nonce (32 lowercase hex chars)");let s=r??(0,IE.randomBytes)(16).toString("hex"),i=zc(s);this.entries.set(i,{userId:e.userId,sessionKey:e.sessionKey,inboundToken:e.inboundToken,egressStoreKey:e.egressStoreKey,deadline:e.deadline??Date.now()+_s.DEFAULT_TURN_DEADLINE_MS});let o=++this.generationCounter;this.generations.set(i,o);let a=!1;return{nonce:s,release:()=>{a||(a=!0,this.generations.get(i)===o&&(this.entries.delete(i),this.generations.delete(i)))}}}releaseByNonce(e){let n=zc(e);return this.generations.delete(n),this.entries.delete(n)}resolve(e,n=Date.now()){let r=zc(e),s=this.entries.get(r);if(s){if(n>s.deadline){this.entries.delete(r),this.generations.delete(r);return}return s}}prune(e=Date.now()){for(let[n,r]of this.entries)e>r.deadline&&(this.entries.delete(n),this.generations.delete(n))}get size(){return this.entries.size}};_s.TurnRegistry=Md});var Hd=S(nr=>{"use strict";var MR=nr&&nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),GR=nr&&nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),UR=nr&&nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&MR(n,e,r[s]);return GR(n,e),n}})();Object.defineProperty(nr,"__esModule",{value:!0});nr.GrantStore=void 0;nr.userKeyHash=Gd;nr.parseGrantKey=HR;var ta=require("crypto"),Ii=require("fs"),RE=UR(require("path")),CE=1,kE="agenthippo-grant:v1:";function Gd(t){return(0,ta.createHash)("sha256").update(t).digest("hex")}function HR(t){let e=t.trim(),n=/^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):Buffer.from(e,"base64");if(n.length!==32)throw new Error("the grant store key must be 32 bytes, base64 or hex (e.g. `openssl rand -base64 32`)");return n}var Ud=class{dir;key;chains=new Map;constructor(e,n){if(this.dir=e,this.key=n,n.length!==32)throw new Error("GrantStore key must be 32 bytes")}file(e){return RE.join(this.dir,`${e}.grant`)}encrypt(e,n,r){let s=(0,ta.randomBytes)(12),i=(0,ta.createCipheriv)("aes-256-gcm",this.key,s);i.setAAD(Buffer.from(kE+e));let o=Buffer.concat([i.update(JSON.stringify({userId:n,grants:r}),"utf8"),i.final()]);return JSON.stringify({v:CE,iv:s.toString("base64"),tag:i.getAuthTag().toString("base64"),data:o.toString("base64")})}decrypt(e,n){let r=JSON.parse(n);if(r.v!==CE)throw new Error(`unsupported grant file format ${r.v}`);let s=(0,ta.createDecipheriv)("aes-256-gcm",this.key,Buffer.from(r.iv,"base64"));s.setAAD(Buffer.from(kE+e)),s.setAuthTag(Buffer.from(r.tag,"base64"));let i=Buffer.concat([s.update(Buffer.from(r.data,"base64")),s.final()]).toString("utf8");return JSON.parse(i)}async get(e){let n=Gd(e),r;try{r=await Ii.promises.readFile(this.file(n),"utf8")}catch(i){if(i.code==="ENOENT")return{};throw i}let s=this.decrypt(n,r);if(s.userId!==e)throw new Error("grant record does not belong to this user");return s.grants??{}}async update(e,n){let r=Gd(e),i=(this.chains.get(r)??Promise.resolve()).catch(()=>{}).then(async()=>{let o=await n(await this.get(e));return await this.write(r,e,o),o});this.chains.set(r,i);try{return await i}finally{this.chains.get(r)===i&&this.chains.delete(r)}}async write(e,n,r){let s=this.file(e);if(!r.google&&!r.plaid?.items.length){await Ii.promises.rm(s,{force:!0});return}await Ii.promises.mkdir(this.dir,{recursive:!0,mode:448});let o=`${s}.${(0,ta.randomBytes)(6).toString("hex")}.tmp`;await Ii.promises.writeFile(o,this.encrypt(e,n,r),{mode:384}),await Ii.promises.rename(o,s)}async list(){let e;try{e=await Ii.promises.readdir(this.dir)}catch(r){if(r.code==="ENOENT")return[];throw r}let n=[];for(let r of e.filter(s=>/^[0-9a-f]{64}\.grant$/.test(s)).sort())try{n.push(this.decrypt(r.slice(0,64),await Ii.promises.readFile(RE.join(this.dir,r),"utf8")))}catch(s){n.push({file:r,error:s instanceof Error?s.message:String(s)})}return n}};nr.GrantStore=Ud});var na=S(Dn=>{"use strict";var jR=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]})),xR=Dn&&Dn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),BR=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"&&jR(n,e,r[s]);return xR(n,e),n}})();Object.defineProperty(Dn,"__esModule",{value:!0});Dn.StoredGrantProvider=Dn.ConnectError=void 0;Dn.readStoredGrantConfig=WR;var fo=require("crypto"),FR=BR(require("fs")),Zc=Hd(),VR=["AGENTHIPPO_GRANT_STORE_DIR","AGENTHIPPO_GRANT_STORE_KEY","AGENTHIPPO_GRANT_STORE_KEY_FILE","AGENTHIPPO_CONNECT_BASE_URL","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET","AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET_FILE","AGENTHIPPO_PLAID_CLIENT_ID","AGENTHIPPO_PLAID_SECRET","AGENTHIPPO_PLAID_SECRET_FILE","AGENTHIPPO_PLAID_ENV","AGENTHIPPO_PLAID_PRODUCTS","AGENTHIPPO_PLAID_COUNTRY_CODES","AGENTHIPPO_CONNECT_TICKET_ONLY"];function jd(t,e){let n=t[`${e}_FILE`]?.trim();return n?FR.readFileSync(n,"utf8").trim()||void 0:t[e]?.trim()||void 0}function $E(t,e){return(t?.trim()||e).split(",").map(n=>n.trim()).filter(Boolean)}var DE=new WeakMap;function WR(t=process.env){let e=DE.get(t);if(e)return e;try{let n=t.AGENTHIPPO_GRANT_STORE_DIR?.trim(),r=jd(t,"AGENTHIPPO_GRANT_STORE_KEY");if(!n||!r)throw new Error("provider=stored-grant needs AGENTHIPPO_GRANT_STORE_DIR and AGENTHIPPO_GRANT_STORE_KEY (32 bytes, base64 or hex, e.g. `openssl rand -base64 32`; or AGENTHIPPO_GRANT_STORE_KEY_FILE)");let s=t.AGENTHIPPO_PLAID_ENV?.trim()||"sandbox";if(s!=="sandbox"&&s!=="production")throw new Error(`AGENTHIPPO_PLAID_ENV must be sandbox or production (got ${s})`);let i=t.AGENTHIPPO_CONNECT_BASE_URL?.trim().replace(/\/+$/,"");if(i&&!/^https?:\/\/[^/]+/.test(i))throw new Error(`AGENTHIPPO_CONNECT_BASE_URL must be an http(s) URL (got ${i})`);let o=t.AGENTHIPPO_GOOGLE_OAUTH_CLIENT_ID?.trim(),a=jd(t,"AGENTHIPPO_GOOGLE_OAUTH_CLIENT_SECRET"),c=t.AGENTHIPPO_PLAID_CLIENT_ID?.trim(),l=jd(t,"AGENTHIPPO_PLAID_SECRET"),d={store:new Zc.GrantStore(n,(0,Zc.parseGrantKey)(r)),connectBaseUrl:i||void 0,google:o&&a?{clientId:o,clientSecret:a}:void 0,plaid:c&&l?{env:s,clientId:c,secret:l,products:$E(t.AGENTHIPPO_PLAID_PRODUCTS,"transactions"),countryCodes:$E(t.AGENTHIPPO_PLAID_COUNTRY_CODES,"US")}:void 0,ticketOnly:t.AGENTHIPPO_CONNECT_TICKET_ONLY?.trim()==="1"};return DE.set(t,d),d}finally{for(let n of VR)delete t[n]}}var kt=class extends Error{status;constructor(e,n){super(n),this.status=e}};Dn.ConnectError=kt;var LE={gmail:["https://www.googleapis.com/auth/gmail.modify"],calendar:["https://www.googleapis.com/auth/calendar"],drive:["https://www.googleapis.com/auth/drive.readonly","https://www.googleapis.com/auth/drive.file"]},Qc=15*6e4,KR=5*6e4,ME=new Set(["ITEM_NOT_FOUND","INVALID_ACCESS_TOKEN"]),uo=t=>(0,fo.createHash)("sha256").update(t).digest("hex");function qR(t){try{let e=JSON.parse(Buffer.from(String(t).split(".")[1],"base64url").toString("utf8"));return typeof e.email=="string"?e.email:void 0}catch{return}}var YR=3e4,xd=class{cfg;name="stored-grant";tools;tickets=new Map;googleFlows=new Map;bankFlows=new Map;googleTokens=new Map;changeListeners=[];constructor(e){this.cfg=e,this.tools=[this.statusTool(),this.connectTool(),this.disconnectTool()]}onGrantsChanged(e){this.changeListeners.push(e)}changed(e){for(let n of this.changeListeners)n(e)}get connectBaseUrl(){return this.cfg.connectBaseUrl}get http(){let e=this.cfg.fetchImpl??fetch;return((n,r)=>e(n,{signal:AbortSignal.timeout(YR),...r}))}now(){return this.cfg.now?.()??Date.now()}async acquire({userId:e}){if(!e?.trim())throw new Error("No verified user (fail-closed)");let n=await this.cfg.store.get(e),r=this.now()+KR,s;if(!this.cfg.google)s={status:"not_configured"};else if(!n.google)s={status:"not_connected"};else try{let c=await this.googleAccessToken(e,n.google);s={status:"connected",accessToken:c.accessToken,email:n.google.email,scopes:n.google.scopes},r=Math.min(r,c.expiresAt-6e4)}catch(c){let l=c instanceof Error?c.message:String(c),d=c.reconnect;s={status:d?"reconnect_required":"unavailable",error:l},d||(r=this.now())}let i,o=n.plaid?.items??[];if(!this.cfg.plaid)i={status:"not_configured"};else if(!o.length)i={status:"not_connected"};else{let c=this.cfg.plaid;i={status:"connected",env:c.env,clientId:c.clientId,secret:c.secret,items:o.map(l=>({item_id:l.itemId,access_token:l.accessToken,env:l.env,institution:l.institution,...l.replacedBy?{replaced_by:l.replacedBy}:{}}))}}return{expiresAt:r,secretRef:{google:s,plaid:i}}}async googleAccessToken(e,n){let r=uo(n.refreshToken),s=this.googleTokens.get(e);if(s&&s.refreshHash===r&&s.expiresAt>this.now()+6e4)return s;let i=this.cfg.google,o=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:i.clientId,client_secret:i.clientSecret,refresh_token:n.refreshToken,grant_type:"refresh_token"})}),a=await o.json().catch(()=>({}));if(!o.ok||!a.access_token)throw Object.assign(new Error(`google token: ${a.error??o.status} ${a.error_description??""}`.trim()),{reconnect:a.error==="invalid_grant"});let c={accessToken:a.access_token,expiresAt:this.now()+(a.expires_in??3600)*1e3,refreshHash:r};return this.googleTokens.set(e,c),c}async plaid(e,n){let r=this.cfg.plaid;if(!r)throw new Error("bank connections are not set up on this deployment");let s=await this.http(`https://${r.env}.plaid.com${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:r.clientId,secret:r.secret,...n})}),i=await s.json().catch(()=>({}));if(!s.ok)throw Object.assign(new Error(`plaid ${e}: ${i.error_code} ${i.error_message}`),{code:i.error_code});return i}prune(){let e=this.now();for(let n of[this.tickets,this.googleFlows,this.bankFlows])for(let[r,s]of n)s.expiresAt<=e&&n.delete(r)}take(e,n){if(!n)return;let r=uo(n),s=e.get(r);return e.delete(r),s&&s.expiresAt>this.now()?s:void 0}createTicket(e,n,r=[]){this.prune();let s=(0,fo.randomBytes)(24).toString("base64url");return this.tickets.set(uo(s),{userId:e,service:n,scopes:r,expiresAt:this.now()+Qc}),s}checkBrowserUser(e,n){if(n===void 0){if(this.cfg.ticketOnly)return;throw new kt(401,"This page only works when opened through this deployment's sign-in. (Operator: route /connect/ through the identity edge, like the chat endpoint.)")}if(n.trim().toLowerCase()!==e.trim().toLowerCase())throw new kt(403,"This link was made for a different account. Sign in as the person who asked for it, or ask your agent for a new link.")}requireBase(){if(!this.cfg.connectBaseUrl)throw new kt(500,"This deployment has no AGENTHIPPO_CONNECT_BASE_URL.");return this.cfg.connectBaseUrl}async startConnect(e,n){let r=this.take(this.tickets,e);if(!r)throw new kt(410,"This link has expired or was already used. Ask your agent for a new one.");this.checkBrowserUser(r.userId,n);let s=this.requireBase();if(r.service==="google"){let c=this.cfg.google;if(!c)throw new kt(500,"Google is not set up on this deployment.");let l=(0,fo.randomBytes)(24).toString("base64url"),d=(0,fo.randomBytes)(32).toString("base64url");return this.googleFlows.set(uo(l),{userId:r.userId,verifier:d,scopes:r.scopes,expiresAt:this.now()+Qc}),{kind:"redirect",location:`https://accounts.google.com/o/oauth2/v2/auth?${new URLSearchParams({client_id:c.clientId,redirect_uri:`${s}/connect/google/callback`,response_type:"code",scope:["openid","email",...r.scopes.flatMap(f=>LE[f]??[])].join(" "),access_type:"offline",prompt:"consent",state:l,code_challenge:(0,fo.createHash)("sha256").update(d).digest("base64url"),code_challenge_method:"S256"})}`}}let i=this.cfg.plaid;if(!i)throw new kt(500,"Bank connections are not set up on this deployment.");let o=await this.plaid("/link/token/create",{client_name:"AgentHippo",user:{client_user_id:(0,Zc.userKeyHash)(r.userId).slice(0,32)},products:i.products,country_codes:i.countryCodes,language:"en"}).catch(c=>{throw new kt(502,`Plaid could not start the bank link (${c instanceof Error?c.message:c}).`)}),a=(0,fo.randomBytes)(24).toString("base64url");return this.bankFlows.set(uo(a),{userId:r.userId,expiresAt:this.now()+Qc}),{kind:"bank",flow:a,linkToken:String(o.link_token)}}async finishGoogle(e,n){let r=this.take(this.googleFlows,e.state);if(!r)throw new kt(410,"This sign-in has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),e.error)throw new kt(400,`Google did not grant access (${e.error}).`);if(!e.code)throw new kt(400,"Google sent no authorization code.");let s=this.cfg.google,i=await this.http("https://oauth2.googleapis.com/token",{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({code:e.code,client_id:s.clientId,client_secret:s.clientSecret,redirect_uri:`${this.requireBase()}/connect/google/callback`,grant_type:"authorization_code",code_verifier:r.verifier})}),o=await i.json().catch(()=>({}));if(!i.ok||!o.access_token)throw new kt(502,`Google refused the sign-in (${o.error??i.status}).`);if(!o.refresh_token)throw new kt(502,"Google returned no refresh token: remove this app at myaccount.google.com/permissions, then ask your agent for a new link.");let a=qR(o.id_token),c={refreshToken:o.refresh_token,email:a,scopes:String(o.scope??"").split(" ").filter(Boolean),connectedAt:new Date(this.now()).toISOString()};return await this.cfg.store.update(r.userId,l=>({...l,google:c})),this.googleTokens.set(r.userId,{accessToken:o.access_token,expiresAt:this.now()+(o.expires_in??3600)*1e3,refreshHash:uo(o.refresh_token)}),this.changed(r.userId),{userId:r.userId,email:a}}async finishBank(e,n){let r=this.take(this.bankFlows,typeof e.flow=="string"?e.flow:void 0);if(!r)throw new kt(410,"This bank link has expired or was already used. Ask your agent for a new link.");if(this.checkBrowserUser(r.userId,n),typeof e.public_token!="string"||!e.public_token)throw new kt(400,"Plaid sent no public token.");let s=e.institution&&typeof e.institution=="object"?e.institution:{},i=typeof s.name=="string"?s.name.slice(0,200):void 0,o=typeof s.institution_id=="string"?s.institution_id.slice(0,100):void 0,a=Array.isArray(e.masks)?e.masks.filter(d=>typeof d=="string"&&/^[0-9A-Za-z]{1,8}$/.test(d)):[],c=await this.plaid("/item/public_token/exchange",{public_token:e.public_token}).catch(d=>{throw new kt(502,`Plaid could not finish the bank link (${d instanceof Error?d.message:d}).`)}),l=this.cfg.plaid.env;return await this.cfg.store.update(r.userId,async d=>{let u=[];for(let f of d.plaid?.items??[]){if(!(f.env===l&&!!o&&f.institutionId===o&&f.masks.some(m=>a.includes(m)))){u.push(f);continue}await this.plaid("/item/remove",{access_token:f.accessToken}).then(()=>!0,m=>ME.has(m.code))||u.push({...f,replacedBy:String(c.item_id)})}return u.push({itemId:String(c.item_id),accessToken:String(c.access_token),env:l,institution:i,institutionId:o,masks:a,connectedAt:new Date(this.now()).toISOString()}),{...d,plaid:{items:u}}}),this.changed(r.userId),{userId:r.userId,institution:i}}async revoke(e,n,r,s){let i=f=>s===void 0||!(Date.parse(f)/1e3>s);if(n==="google"){let f=(await this.cfg.store.get(e)).google;if(!f||!i(f.connectedAt))return{ok:!0,disconnected:[],failed:[]};let p;try{p=await this.http(`https://oauth2.googleapis.com/revoke?token=${encodeURIComponent(f.refreshToken)}`,{method:"POST"})}catch(h){return{ok:!1,disconnected:[],failed:[{error:`could not reach Google to revoke access (${h instanceof Error?h.message:h}); nothing was removed, try again`}]}}if(!p.ok){let h=await p.text();if(!/invalid_token/.test(h))return{ok:!1,disconnected:[],failed:[{error:`Google did not revoke access (${p.status}); nothing was removed, try again`}]}}let g={};await this.cfg.store.update(e,h=>h.google?.refreshToken===f.refreshToken?{...h,google:void 0}:(g.grant=h.google,h)),this.googleTokens.delete(e);let m=g.grant;return m&&await this.googleAccessToken(e,m).then(()=>!1,w=>!!w?.reconnect)&&await this.cfg.store.update(e,w=>w.google?.refreshToken===m.refreshToken?{...w,google:void 0}:w),this.changed(e),{ok:!0,disconnected:["google"],failed:[]}}let o=(await this.cfg.store.get(e)).plaid?.items??[],a=JR(o,r).filter(f=>i(f.connectedAt));if(!a.length)return{ok:!0,disconnected:[],failed:[]};let c=this.cfg.plaid?.env,l=[],d=[];for(let f of a){if(f.env!==c){f.env==="sandbox"?l.push(f):d.push({bank:f.institution,item_id:f.itemId,error:`linked in ${f.env}, which this deployment is not configured for`});continue}try{await this.plaid("/item/remove",{access_token:f.accessToken}),l.push(f)}catch(p){ME.has(p.code??"")?l.push(f):d.push({bank:f.institution,item_id:f.itemId,error:p instanceof Error?p.message:String(p)})}}let u=new Set(l.map(f=>f.itemId));return await this.cfg.store.update(e,f=>({...f,plaid:{items:(f.plaid?.items??[]).filter(p=>!u.has(p.itemId))}})),l.length&&this.changed(e),{ok:!d.length,disconnected:l.map(f=>f.institution??f.itemId),failed:d}}listGrants(){return this.cfg.store.list()}async summary(e){let n={users:0,google:0,banks:0,unreadable:0};for(let r of e??await this.cfg.store.list()){if("error"in r){n.unreadable++;continue}let s=(r.grants.plaid?.items??[]).filter(i=>!i.replacedBy).length;(r.grants.google||s)&&n.users++,n.google+=r.grants.google?1:0,n.banks+=s}return n}async applyRevocations(e,n,r){if(!e.length)return[];let s=new Map;for(let o of n??await this.cfg.store.list())"error"in o||s.set((0,Zc.userKeyHash)(o.userId),o);let i=[];for(let o of e){let a=s.get(o.user);if(!a)continue;let c=u=>!(Date.parse(u)/1e3>o.requestedAt),l=u=>this.revoke(a.userId,u,void 0,o.requestedAt).catch(f=>({ok:!1,disconnected:[],failed:[{error:f instanceof Error?f.message:String(f)}]})),d=[];(!o.service||o.service==="google")&&a.grants.google&&c(a.grants.google.connectedAt)&&d.push("google"),(!o.service||o.service==="bank")&&(a.grants.plaid?.items??[]).some(u=>c(u.connectedAt))&&d.push("bank");for(let u of d){let f=await l(u);(!f.ok||f.disconnected.length)&&(i.push({user:o.user,service:u,result:f}),r?.({user:o.user,service:u,result:f}))}}return i}statusTool(){return{definition:{name:"connections_status",description:"Which of the user's own accounts are connected on this deployment (Google, banks) and which it can connect. Start here before using Gmail, Calendar, Drive or bank tools.",inputSchema:{type:"object",properties:{}}},call:async({userId:e})=>{let n=await this.cfg.store.get(e),r=this.cfg.plaid?.env;return{google:{available:!!this.cfg.google,connected:!!n.google,...n.google?{email:n.google.email,scopes:n.google.scopes,connected_at:n.google.connectedAt}:{}},banks:{available:!!this.cfg.plaid,...r?{environment:r}:{},linked:(n.plaid?.items??[]).map(s=>({institution:s.institution,item_id:s.itemId,connected_at:s.connectedAt,...s.replacedBy?{note:`replaced by ${s.replacedBy}, but Plaid did not remove it: disconnect it with bank "${s.itemId}"`}:s.env!==r?{note:`linked in ${s.env}; unused on this deployment`}:{}}))},connect_links:!!this.cfg.connectBaseUrl}}}}connectTool(){return{definition:{name:"connections_connect",description:"A one-time link for the user to connect their Google account or a bank. Give them the link: it works only when they open it signed in, and expires in 15 minutes. When they are done, call connections_status.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},google_scopes:{type:"array",items:{type:"string",enum:["gmail","calendar","drive"]},description:"Limit Google access (default: all three)"}},required:["service"]}},call:async({userId:e},n)=>{let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');if(!this.cfg.connectBaseUrl)throw new Error("this deployment cannot issue connect links (the operator has not set AGENTHIPPO_CONNECT_BASE_URL)");if(r==="google"&&!this.cfg.google)throw new Error("Google is not set up on this deployment");if(r==="bank"&&!this.cfg.plaid)throw new Error("bank connections are not set up on this deployment");let s=[];if(r==="google"){let o=Array.isArray(n.google_scopes)?n.google_scopes.map(String):["gmail","calendar","drive"];if(o.filter(c=>!LE[c]).length||!o.length)throw new Error(`google_scopes must be some of gmail, calendar, drive (got ${o.join(", ")||"none"})`);s=[...new Set(o)]}let i=this.createTicket(e,r,s);return{url:`${this.cfg.connectBaseUrl}/connect/start?ticket=${i}`,expires_in_minutes:Qc/6e4,next:"Give the user this link to open in their browser. It works only for them. When they are done, call connections_status."}}}}disconnectTool(){return{definition:{name:"connections_disconnect",description:"Disconnect the user's Google account or a bank: revokes access at Google or removes the bank link at Plaid, then forgets it. Needs confirmed: true, only after the user asked for it.",inputSchema:{type:"object",properties:{service:{type:"string",enum:["google","bank"]},bank:{type:"string",description:"Bank name or item_id to disconnect (default: every bank). A name matching several links fails and lists them."},confirmed:{type:"boolean",description:"true only after the user asked to disconnect"}},required:["service","confirmed"]}},call:async(e,n)=>{if(n.confirmed!==!0)throw new Error("refusing to disconnect without confirmed: true (only after the user asked for it)");let r=n.service;if(r!=="google"&&r!=="bank")throw new Error('service must be "google" or "bank"');let s=await this.revoke(e.userId,r,typeof n.bank=="string"?n.bank:void 0);return e.invalidate(),s}}}};Dn.StoredGrantProvider=xd;function JR(t,e){if(!e)return t;let n=e.toLowerCase(),r=t.filter(i=>i.itemId===e||i.institution?.toLowerCase()===n),s=r.length?r:t.filter(i=>i.institution?.toLowerCase().includes(n));if(!s.length)throw new Error(`no connected bank matches "${e}"`);if(s.length>1)throw new Error(`"${e}" matches ${s.length} bank links; pass one item_id: ${s.map(i=>`${i.itemId} (${i.institution})`).join(", ")}`);return s}});var Fd=S(Or=>{"use strict";Object.defineProperty(Or,"__esModule",{value:!0});Or.CredentialBroker=Or.identityProvider=Or.passthroughProvider=void 0;Or.resolveProvider=XR;var GE=na();Or.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}}};Or.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 XR(t,e=process.env){let n=(t??"passthrough").trim().toLowerCase();if(n==="passthrough")return Or.passthroughProvider;if(n==="identity")return Or.identityProvider;if(n==="stored-grant")return new GE.StoredGrantProvider((0,GE.readStoredGrantConfig)(e));throw new Error(`Unknown data credential provider "${t}" (supported: passthrough, identity, stored-grant)`)}var Bd=class{provider;cache=new Map;constructor(e){this.provider=e,e.onGrantsChanged?.(n=>this.invalidate(n))}async acquire(e,n){if(this.provider.refreshOnInbound)return this.provider.acquire({userId:e,inboundToken:n});let r=this.cache.get(e);if(r&&r.expiresAt>Date.now())return r;this.cache.delete(e);let s=await this.provider.acquire({userId:e,inboundToken:n});return this.cache.set(e,s),s}invalidate(e){this.cache.delete(e)}};Or.CredentialBroker=Bd});var Wd=S(Ln=>{"use strict";var zR=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]})),QR=Ln&&Ln.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ZR=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"&&zR(n,e,r[s]);return QR(n,e),n}})();Object.defineProperty(Ln,"__esModule",{value:!0});Ln.ConnectorHost=Ln.TURN_META_KEY=void 0;var UE=ZR(require("path")),eC=require("fs"),tC=require("@modelcontextprotocol/sdk/client/index.js"),nC=require("@modelcontextprotocol/sdk/client/stdio.js"),rC=require("@modelcontextprotocol/sdk/types.js"),sC=Pc();Ln.TURN_META_KEY="ai.agenthippo/turn";var Vd=class t{client;logger;connectorPath;constructor(e,n,r){this.client=e,this.logger=n,this.connectorPath=r}static async spawn(e){let n=UE.resolve(e.connectorPath);await eC.promises.access(n);let r=await(0,sC.resolveNodeBinary)(),s=new nC.StdioClientTransport({command:r,args:[n],cwd:UE.dirname(n),env:{...process.env,AGENTHIPPO_DATA_CONNECTOR:"1"},stderr:"pipe"}),i=new tC.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:{[Ln.TURN_META_KEY]:{userId:r.userId,credential:r.credential}}}},rC.CallToolResultSchema)}async close(){try{await this.client.close()}catch(e){this.logger?.warn(`[DataPlane] connector close: ${e instanceof Error?e.message:String(e)}`)}}};Ln.ConnectorHost=Vd});var ra=S(Mn=>{"use strict";Object.defineProperty(Mn,"__esModule",{value:!0});Mn.DEFAULT_AUTH_BIND=Mn.AUTH_PROXY_SECRET_HEADER=Mn.DEFAULT_JWT_SECRET=void 0;Mn.resolveAuthBrokerBind=aC;Mn.loadAuthBrokerConfig=cC;Mn.emailDomainAllowed=lC;function iC(t){return t?.trim()?t.split(",").map(e=>e.trim().toLowerCase()).filter(Boolean):[]}Mn.DEFAULT_JWT_SECRET="dev-agenthippo-auth-secret-change-me";Mn.AUTH_PROXY_SECRET_HEADER="x-agenthippo-proxy-secret";Mn.DEFAULT_AUTH_BIND="127.0.0.1";var oC=new Set(["127.0.0.1","localhost","::1","[::1]"]);function aC(t=process.env){let e=t.AGENTHIPPO_AUTH_BIND?.trim()||Mn.DEFAULT_AUTH_BIND;if(!!oC.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.
458
477
  - Same-host proxy (recommended): bind 127.0.0.1 and run Caddy/oauth2-proxy alongside it.
459
478
  - SEPARATE CONTAINER for the proxy (the compose/Cloud Run layout, where Caddy dials
460
479
  "auth-broker:9780"): the broker must listen on the container's network interface, so set
461
480
  BOTH AGENTHIPPO_AUTH_BIND=${e} AND AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND=1,
462
481
  and make sure the port is not published outside the private network.
463
- 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 cC(t=process.env){let e=t.AGENTHIPPO_AUTH_JWT_SECRET?.trim()||Mn.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:iC(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 lC(t,e){if(e.length===0)return!0;let n=t.split("@")[1]?.toLowerCase();return!!n&&e.includes(n)}});var Ir=S(M=>{"use strict";var uC=M&&M.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),dC=M&&M.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Jd=M&&M.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&uC(n,e,r[s]);return dC(n,e),n}})();Object.defineProperty(M,"__esModule",{value:!0});M.TurnGate=M.TURN_LIMIT_BUSY_MESSAGE=M.RATE_LIMIT_BUSY_MESSAGE=M.TURN_GATE_BUSY_MESSAGE=M.TURN_GATE_RETRY_AFTER_SECONDS=M.TURN_QUEUE_ENV=M.MAX_CONCURRENT_TURNS_ENV=M.TurnLimiter=M.SESSION_WITHOUT_USER_REASON=M.REQUIRE_TENANT_ISOLATION_ENV=M.IDENTITY_PROXY_SECRET_ENV=M.IDENTITY_HEADER_ENV=M.PIN_ONLY_IDENTITY_HEADERS=M.RateLimiter=M.XFF_TRUSTED_HOPS_ENV=M.CONTAINER_SERVE_HOST=M.SERVE_HOST_ENV=M.DEFAULT_BIND_HOST=M.SERVICE_USER_ENV=M.DEFAULT_MAX_BODY_BYTES=void 0;M.resolveStateDir=hC;M.resolveAnalyticsSessionsDir=mC;M.resolveServiceIdentity=EC;M.isLoopbackHost=xE;M.resolveBindHost=_C;M.clientIp=yC;M.hasTrustedProxyProof=FE;M.identityHeaderAdvice=wC;M.tenantIsolationAdvice=SC;M.resolveUserId=AC;M.resolveDataToken=bC;M.peerToUserId=vC;M.userNamespaceHash=qd;M.resolveServeSessionKey=OC;M.corsHeaders=IC;M.createTurnGateFromEnv=PC;M.createRejectionWarner=NC;M.readBodyWithCap=RC;var fC=Jd(require("os")),ys=Jd(require("path")),el=Jd(require("crypto")),pC=fi(),gC=ra();M.DEFAULT_MAX_BODY_BYTES=1024*1024;function hC(t,e=process.env){let n=t?.trim();if(n)return{dir:ys.resolve(n),ephemeral:!1};let r=e.AGENTHIPPO_HOME?.trim()||e.AGENTIDE_HOME?.trim();return r?{dir:ys.join(ys.resolve(r),"serve-state"),ephemeral:!1}:{dir:ys.join(fC.tmpdir(),"agenthippo-server"),ephemeral:!0}}function mC(t,e,n=process.env){return!(n.AGENT_HOME_DIR?.trim()||n.AGENTHIPPO_HOME?.trim())&&!e?ys.join(t,"analytics","sessions"):ys.join((0,pC.getAgentideHome)(),"analytics","sessions")}M.SERVICE_USER_ENV="AGENTHIPPO_SERVICE_USER";var HE=256;function EC(t=process.env){let e=t[M.SERVICE_USER_ENV];if(e===void 0)return{};let n=e.trim();return n?/\s/.test(n)?{error:`${M.SERVICE_USER_ENV} must not contain whitespace, got ${JSON.stringify(e)}.`}:n.length>HE?{error:`${M.SERVICE_USER_ENV} is ${n.length} chars; the maximum is ${HE}.`}:/^svc:/.test(n)||/^spiffe:\/\//.test(n)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n)?{identity:n}:{identity:n,warning:`${M.SERVICE_USER_ENV}="${n}" carries no namespace marker (svc: / spiffe:// / GUID). It will be used verbatim and must be mapped in the connector role map, exactly like a human identity. If it can collide with a real user id, prefix it with \`svc:\`.`}:{error:`${M.SERVICE_USER_ENV} is set but empty. Unset it, or give it the identity unattended runs should act as.`}}M.DEFAULT_BIND_HOST="127.0.0.1";function xE(t){let e=t.trim().toLowerCase().replace(/^\[|\]$/g,"");return e==="localhost"||e==="::1"||/^127\./.test(e)}M.SERVE_HOST_ENV="AGENTHIPPO_SERVE_HOST";M.CONTAINER_SERVE_HOST="0.0.0.0";function _C(t,e=process.env){return t?.trim()||e.AGENTHIPPO_SERVE_HOST?.trim()||M.DEFAULT_BIND_HOST}M.XFF_TRUSTED_HOPS_ENV="AGENTHIPPO_XFF_TRUSTED_HOPS";function yC(t,e=process.env){let n=t.headers["x-forwarded-for"],r=Array.isArray(n)?n[0]:n;if(r){let s=r.split(",").map(i=>i.trim()).filter(Boolean);if(s.length>0){let i=Number(e[M.XFF_TRUSTED_HOPS_ENV]),o=Number.isInteger(i)&&i>=1?i:1;return s[Math.max(0,s.length-o)]}}return t.socket?.remoteAddress||"unknown"}var Kd=class t{maxPerWindow;windowMs;hits=new Map;static MAX_KEYS=1e5;constructor(e,n=6e4){this.maxPerWindow=e,this.windowMs=n}tryConsume(e,n=Date.now()){if(!Number.isFinite(this.maxPerWindow)||this.maxPerWindow<=0)return!0;let r=this.hits.get(e);return!r||r.resetAt<=n?(this.hits.size>=t.MAX_KEYS&&this.prune(n),this.hits.set(e,{count:1,resetAt:n+this.windowMs}),!0):r.count>=this.maxPerWindow?!1:(r.count+=1,!0)}retryAfterSeconds(e,n=Date.now()){let r=this.hits.get(e);return r?Math.max(1,Math.ceil((r.resetAt-n)/1e3)):Math.ceil(this.windowMs/1e3)}prune(e){for(let[n,r]of this.hits)r.resetAt<=e&&this.hits.delete(n);this.hits.size>=t.MAX_KEYS&&this.hits.clear()}};M.RateLimiter=Kd;var BE=["x-forwarded-email","x-forwarded-preferred-username","x-goog-authenticated-user-email","cf-access-authenticated-user-email"];M.PIN_ONLY_IDENTITY_HEADERS=["x-agent-user"];M.IDENTITY_HEADER_ENV="AGENTHIPPO_IDENTITY_HEADER";M.IDENTITY_PROXY_SECRET_ENV="AGENTHIPPO_IDENTITY_PROXY_SECRET";function FE(t,e){if(!e)return!1;let n=t[gC.AUTH_PROXY_SECRET_HEADER],r=typeof n=="string"?n:Array.isArray(n)?String(n[0]??""):"";if(!r)return!1;let s=el.createHash("sha256").update(r).digest(),i=el.createHash("sha256").update(e).digest();return el.timingSafeEqual(s,i)}function wC(t=process.env,e){if(t[M.IDENTITY_HEADER_ENV]?.trim())return[];let r=e?.trim();return r&&xE(r)?[`${M.IDENTITY_HEADER_ENV} is not set. Fine for this loopback bind; pin it before exposing serve on a network interface.`]:[...r?[`serve is bound to ${r} \u2014 reachable beyond this machine \u2014 with no ${M.IDENTITY_HEADER_ENV} pinned. Anyone who can reach this port is trusted to state who they are.`]:[],`${M.IDENTITY_HEADER_ENV} is not set, so identity falls back to the platform header aliases (${BE.join(", ")}). That is only safe when your proxy sets AND STRIPS every one of them. Pin the single header your deploy layer really controls, e.g. ${M.IDENTITY_HEADER_ENV}=x-goog-authenticated-user-email.`,`NOTE: ${M.PIN_ONLY_IDENTITY_HEADERS.join(", ")} is NO LONGER trusted by default \u2014 it is not stripped by any platform, so an arbitrary client could send it and be namespaced as another user. If your proxy does set it (the Caddy forward_auth / auth-broker flow does), pin it: ${M.IDENTITY_HEADER_ENV}=x-agent-user.`]}M.REQUIRE_TENANT_ISOLATION_ENV="AGENTHIPPO_REQUIRE_TENANT_ISOLATION";function jE(t,e){let n=ys.resolve(t),r=ys.resolve(e);return n===r||n.startsWith(r+ys.sep)}function SC(t,e=process.env){if(!e[M.IDENTITY_HEADER_ENV]?.trim())return{level:"ok",lines:[]};if(t.sandbox==="container"&&!t.sharedWorkspace)return{level:"ok",lines:[]};let r=t.sandbox==="process"?"a tier-0 (--sandbox=process) sandbox":"no sandbox",s=[`${M.IDENTITY_HEADER_ENV} is pinned \u2014 so this serve has more than one user \u2014 but it runs with ${r}, which shares one uid, one workspace (${t.workspace??"unset"}) and one state dir (${t.stateDir}) across all of them. Any user can read every other user's engine session files, which hold their conversations verbatim. Per-user paths are namespacing, not isolation.`,"The boundary is --sandbox=container (per-session workspace and state, without --shared-workspace) or one serve per tenant. Until then, restrict the pack's tool surface so the agent has no way to read arbitrary files."];return t.workspace&&jE(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&&jE(t.stateDir,t.workspace)&&s.push(`--state-dir ${t.stateDir} sits INSIDE --workspace ${t.workspace}: every other user's sessions, analytics and evidence spool are inside the directory the agent is pointed at. Put them in unrelated subtrees (e.g. --workspace=/work --state-dir=/state).`),{level:/^(1|true|yes|on)$/i.test(e[M.REQUIRE_TENANT_ISOLATION_ENV]?.trim()??"")?"refuse":"warn",lines:s}}function AC(t,e,n=process.env){let r=n[M.IDENTITY_PROXY_SECRET_ENV]?.trim();if(r&&!FE(t,r))return;let s=n[M.IDENTITY_HEADER_ENV]?.trim().toLowerCase(),i=s?[s]:BE;for(let a of i){let c=t[a],l=(Array.isArray(c)?c[0]:c)?.trim();if(l){let d=l.lastIndexOf(":");return d>=0&&l.slice(d+1).includes("@")?l.slice(d+1):l}}return s||n.AGENTHIPPO_ALLOW_BODY_IDENTITY?.trim()!=="1"?void 0:e?.user_id?.trim()||void 0}var TC=["x-forwarded-access-token","x-agent-data-token"];function bC(t){for(let e of TC){let n=t[e],r=(Array.isArray(n)?n[0]:n)?.trim();if(r)return r}}function vC(t){if(!t)return;let e=t.senderId?.trim()||t.senderUsername?.trim()||t.senderName?.trim();if(!e)return;let n=t.channel?.trim();return n?`${n}:${e}`:e}M.SESSION_WITHOUT_USER_REASON="session_without_verified_user";function qd(t){return el.createHash("sha256").update(t).digest("hex").slice(0,16)}function OC(t,e,n="session",r=process.env){let s=t?.trim(),i=e?.trim();if(i){let a=`u${qd(i)}--${s||"default"}`;return{sessionKey:a,sandboxKey:n==="user"?`u${qd(i)}`:a}}if(r[M.IDENTITY_HEADER_ENV]?.trim())return{sessionKey:"",sandboxKey:"",rejected:M.SESSION_WITHOUT_USER_REASON};let o=s||"anon-unknown";return{sessionKey:o,sandboxKey:o}}function IC(){return{"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Agent-User","Access-Control-Allow-Origin":"*"}}var Yd=class{maxPerSession;counts=new Map;constructor(e){this.maxPerSession=e}tryConsume(e){if(!Number.isFinite(this.maxPerSession)||this.maxPerSession<=0)return!0;let n=this.counts.get(e)??0;return n>=this.maxPerSession?!1:(this.counts.set(e,n+1),!0)}reset(e){this.counts.delete(e)}};M.TurnLimiter=Yd;M.MAX_CONCURRENT_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_TURNS";M.TURN_QUEUE_ENV="AGENTHIPPO_TURN_QUEUE";M.TURN_GATE_RETRY_AFTER_SECONDS=15;M.TURN_GATE_BUSY_MESSAGE="At capacity \u2014 please retry in a moment";M.RATE_LIMIT_BUSY_MESSAGE="Rate limit exceeded \u2014 please retry in a moment";M.TURN_LIMIT_BUSY_MESSAGE="Per-session turn limit reached";var tl=class{maxInflight;maxQueue;queueTimeoutMs;inflightCount=0;waiters=[];constructor(e,n,r=M.TURN_GATE_RETRY_AFTER_SECONDS*1e3){this.maxInflight=e,this.maxQueue=n,this.queueTimeoutMs=r}async acquire(){return!Number.isFinite(this.maxInflight)||this.maxInflight<=0?()=>{}:this.inflightCount<this.maxInflight?(this.inflightCount+=1,()=>this.releaseSlot()):this.waiters.length>=this.maxQueue?null:new Promise(e=>{let n=!1,r=o=>{if(n){o&&o();return}n=!0,clearTimeout(i),e(o)},s={resolve:r,timer:null},i=setTimeout(()=>{let o=this.waiters.indexOf(s);o>=0&&this.waiters.splice(o,1),r(null)},this.queueTimeoutMs);s.timer=i,this.waiters.push(s)})}releaseSlot(){let e=this.waiters.shift();if(e){e.resolve(()=>this.releaseSlot());return}this.inflightCount=Math.max(0,this.inflightCount-1)}get inflight(){return this.inflightCount}get queued(){return this.waiters.length}get max(){return this.maxInflight>0?this.maxInflight:0}};M.TurnGate=tl;function PC(t=process.env){let e=Number(t[M.MAX_CONCURRENT_TURNS_ENV]??10),n=Number(t[M.TURN_QUEUE_ENV]??20),r=Number.isFinite(e)?e:10,s=Number.isFinite(n)&&n>=0?n:20;return new tl(r,s)}function NC(t=5e3){let e=0;return n=>{let r=Date.now();r-e<t||(e=r,console.warn(n))}}function RC(t,e=M.DEFAULT_MAX_BODY_BYTES){return new Promise((n,r)=>{let s=0,i=[],o=d=>{if(s+=d.length,s>e){l();let u=new Error(`Request body exceeds ${e} bytes`);u.tooLarge=!0,r(u);return}i.push(d)},a=()=>{l(),n(Buffer.concat(i).toString("utf8"))},c=d=>{l(),r(d)},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 po=S(un=>{"use strict";var CC=un&&un.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),kC=un&&un.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$C=un&&un.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&CC(n,e,r[s]);return kC(n,e),n}})();Object.defineProperty(un,"__esModule",{value:!0});un.TURN_NONCE_HEADER=un.TURN_NONCE_ENV=un.DATA_MCP_URL_ENV=void 0;un.startDataGateway=HC;var DC=$C(require("http")),LC=require("@modelcontextprotocol/sdk/server/index.js"),MC=require("@modelcontextprotocol/sdk/server/streamableHttp.js"),VE=require("@modelcontextprotocol/sdk/types.js"),GC=Ir(),UC=lo();un.DATA_MCP_URL_ENV="AGENTHIPPO_DATA_MCP_URL";un.TURN_NONCE_ENV="AGENTHIPPO_TURN_NONCE";un.TURN_NONCE_HEADER="x-agent-turn-nonce";function WE(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function KE(t){return t?(0,UC.hashNonce)(t).slice(0,12):"none"}async function HC(t){let e=DC.createServer(async(i,o)=>{try{let a=i.url?.split("?")[0]??"";if(a==="/turn"&&i.method==="DELETE"){let p=WE(i.headers.authorization);if(p){let g=t.registry.releaseByNonce(p);t.audit?.("edge","turn_release",{released:g,nonce_sha256_prefix:KE(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=WE(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:KE(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 d;try{d=JSON.parse(await(0,GC.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=jC(t,l),f=new MC.StreamableHTTPServerTransport({sessionIdGenerator:void 0,enableJsonResponse:!0});o.on("close",()=>{f.close(),u.close()}),await u.connect(f),await f.handleRequest(i,o,d)}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 jC(t,e){let n=new LC.Server({name:"agenthippo-data-gateway",version:"1.0.0"},{capabilities:{tools:{}}}),r=t.broker.provider.tools??[],s=new Set(r.map(i=>i.definition.name));return n.setRequestHandler(VE.ListToolsRequestSchema,async()=>({tools:[...r.map(i=>i.definition),...(await t.connector.listTools()).filter(i=>!s.has(i.name))]})),n.setRequestHandler(VE.CallToolRequestSchema,async i=>{let o=i.params.name,a=r.find(l=>l.definition.name===o);if(a){t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name,brokerSide:!0});try{let l=await a.call({userId:e.userId,sessionKey:e.sessionKey,invalidate:()=>t.broker.invalidate(e.userId)},i.params.arguments??{});return{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}catch(l){let d=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"provider_tool_failed",error:d}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:d})}],isError:!0}}}let c;try{c=(await t.broker.acquire(e.userId,e.inboundToken)).secretRef,t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name})}catch(l){let d=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"acquire_failed",error:d}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:`credential acquire failed (fail-closed): ${d}`})}],isError:!0}}try{return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:c})}catch(l){let d=l instanceof Error?l.message:String(l);if(/401|unauthoriz|expired/i.test(d)){t.broker.invalidate(e.userId);try{let u=await t.broker.acquire(e.userId,e.inboundToken);return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:u.secretRef})}catch{}}return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"call_failed",error:d}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:d})}],isError:!0}}}),n}});var Zd=S(Qd=>{"use strict";Object.defineProperty(Qd,"__esModule",{value:!0});Qd.createConnectHandler=WC;var xC=require("crypto"),BC=Ir(),nl=na(),sl=t=>t.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]),qE=t=>JSON.stringify(t).replace(/</g,"\\u003c"),YE="default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'",FC=t=>`default-src 'none'; script-src 'nonce-${t}' https://cdn.plaid.com; frame-src https://cdn.plaid.com https://*.plaid.com; connect-src 'self' https://*.plaid.com; img-src https: data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'`,rl={"Cache-Control":"no-store","Referrer-Policy":"no-referrer","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY"};function Xd(t,e,n,r){t.writeHead(e,{...rl,"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":r}),t.end(n)}function zd(t,e){return`<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
482
+ In either case set AGENTHIPPO_AUTH_PROXY_SECRET (and have the proxy send it) so a forged X-Auth-Request-Email is rejected \u2014 that is what actually stops the token-minting attack.`);return{address:e,isPublic:!0}}function cC(t=process.env){let e=t.AGENTHIPPO_AUTH_JWT_SECRET?.trim()||Mn.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:iC(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 lC(t,e){if(e.length===0)return!0;let n=t.split("@")[1]?.toLowerCase();return!!n&&e.includes(n)}});var Pr=S(M=>{"use strict";var uC=M&&M.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),dC=M&&M.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Jd=M&&M.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&uC(n,e,r[s]);return dC(n,e),n}})();Object.defineProperty(M,"__esModule",{value:!0});M.TurnGate=M.TURN_LIMIT_BUSY_MESSAGE=M.RATE_LIMIT_BUSY_MESSAGE=M.TURN_GATE_BUSY_MESSAGE=M.TURN_GATE_RETRY_AFTER_SECONDS=M.TURN_QUEUE_ENV=M.MAX_CONCURRENT_TURNS_ENV=M.TurnLimiter=M.SESSION_WITHOUT_USER_REASON=M.REQUIRE_TENANT_ISOLATION_ENV=M.IDENTITY_PROXY_SECRET_ENV=M.IDENTITY_HEADER_ENV=M.PIN_ONLY_IDENTITY_HEADERS=M.RateLimiter=M.XFF_TRUSTED_HOPS_ENV=M.CONTAINER_SERVE_HOST=M.SERVE_HOST_ENV=M.DEFAULT_BIND_HOST=M.SERVICE_USER_ENV=M.DEFAULT_MAX_BODY_BYTES=void 0;M.resolveStateDir=hC;M.resolveAnalyticsSessionsDir=mC;M.resolveServiceIdentity=EC;M.isLoopbackHost=xE;M.resolveBindHost=_C;M.clientIp=yC;M.hasTrustedProxyProof=FE;M.identityHeaderAdvice=wC;M.tenantIsolationAdvice=SC;M.resolveUserId=AC;M.resolveDataToken=bC;M.peerToUserId=vC;M.userNamespaceHash=qd;M.resolveServeSessionKey=OC;M.corsHeaders=PC;M.createTurnGateFromEnv=IC;M.createRejectionWarner=NC;M.readBodyWithCap=RC;var fC=Jd(require("os")),ys=Jd(require("path")),el=Jd(require("crypto")),pC=fi(),gC=ra();M.DEFAULT_MAX_BODY_BYTES=1024*1024;function hC(t,e=process.env){let n=t?.trim();if(n)return{dir:ys.resolve(n),ephemeral:!1};let r=e.AGENTHIPPO_HOME?.trim()||e.AGENTIDE_HOME?.trim();return r?{dir:ys.join(ys.resolve(r),"serve-state"),ephemeral:!1}:{dir:ys.join(fC.tmpdir(),"agenthippo-server"),ephemeral:!0}}function mC(t,e,n=process.env){return!(n.AGENT_HOME_DIR?.trim()||n.AGENTHIPPO_HOME?.trim())&&!e?ys.join(t,"analytics","sessions"):ys.join((0,pC.getAgentideHome)(),"analytics","sessions")}M.SERVICE_USER_ENV="AGENTHIPPO_SERVICE_USER";var HE=256;function EC(t=process.env){let e=t[M.SERVICE_USER_ENV];if(e===void 0)return{};let n=e.trim();return n?/\s/.test(n)?{error:`${M.SERVICE_USER_ENV} must not contain whitespace, got ${JSON.stringify(e)}.`}:n.length>HE?{error:`${M.SERVICE_USER_ENV} is ${n.length} chars; the maximum is ${HE}.`}:/^svc:/.test(n)||/^spiffe:\/\//.test(n)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n)?{identity:n}:{identity:n,warning:`${M.SERVICE_USER_ENV}="${n}" carries no namespace marker (svc: / spiffe:// / GUID). It will be used verbatim and must be mapped in the connector role map, exactly like a human identity. If it can collide with a real user id, prefix it with \`svc:\`.`}:{error:`${M.SERVICE_USER_ENV} is set but empty. Unset it, or give it the identity unattended runs should act as.`}}M.DEFAULT_BIND_HOST="127.0.0.1";function xE(t){let e=t.trim().toLowerCase().replace(/^\[|\]$/g,"");return e==="localhost"||e==="::1"||/^127\./.test(e)}M.SERVE_HOST_ENV="AGENTHIPPO_SERVE_HOST";M.CONTAINER_SERVE_HOST="0.0.0.0";function _C(t,e=process.env){return t?.trim()||e.AGENTHIPPO_SERVE_HOST?.trim()||M.DEFAULT_BIND_HOST}M.XFF_TRUSTED_HOPS_ENV="AGENTHIPPO_XFF_TRUSTED_HOPS";function yC(t,e=process.env){let n=t.headers["x-forwarded-for"],r=Array.isArray(n)?n[0]:n;if(r){let s=r.split(",").map(i=>i.trim()).filter(Boolean);if(s.length>0){let i=Number(e[M.XFF_TRUSTED_HOPS_ENV]),o=Number.isInteger(i)&&i>=1?i:1;return s[Math.max(0,s.length-o)]}}return t.socket?.remoteAddress||"unknown"}var Kd=class t{maxPerWindow;windowMs;hits=new Map;static MAX_KEYS=1e5;constructor(e,n=6e4){this.maxPerWindow=e,this.windowMs=n}tryConsume(e,n=Date.now()){if(!Number.isFinite(this.maxPerWindow)||this.maxPerWindow<=0)return!0;let r=this.hits.get(e);return!r||r.resetAt<=n?(this.hits.size>=t.MAX_KEYS&&this.prune(n),this.hits.set(e,{count:1,resetAt:n+this.windowMs}),!0):r.count>=this.maxPerWindow?!1:(r.count+=1,!0)}retryAfterSeconds(e,n=Date.now()){let r=this.hits.get(e);return r?Math.max(1,Math.ceil((r.resetAt-n)/1e3)):Math.ceil(this.windowMs/1e3)}prune(e){for(let[n,r]of this.hits)r.resetAt<=e&&this.hits.delete(n);this.hits.size>=t.MAX_KEYS&&this.hits.clear()}};M.RateLimiter=Kd;var BE=["x-forwarded-email","x-forwarded-preferred-username","x-goog-authenticated-user-email","cf-access-authenticated-user-email"];M.PIN_ONLY_IDENTITY_HEADERS=["x-agent-user"];M.IDENTITY_HEADER_ENV="AGENTHIPPO_IDENTITY_HEADER";M.IDENTITY_PROXY_SECRET_ENV="AGENTHIPPO_IDENTITY_PROXY_SECRET";function FE(t,e){if(!e)return!1;let n=t[gC.AUTH_PROXY_SECRET_HEADER],r=typeof n=="string"?n:Array.isArray(n)?String(n[0]??""):"";if(!r)return!1;let s=el.createHash("sha256").update(r).digest(),i=el.createHash("sha256").update(e).digest();return el.timingSafeEqual(s,i)}function wC(t=process.env,e){if(t[M.IDENTITY_HEADER_ENV]?.trim())return[];let r=e?.trim();return r&&xE(r)?[`${M.IDENTITY_HEADER_ENV} is not set. Fine for this loopback bind; pin it before exposing serve on a network interface.`]:[...r?[`serve is bound to ${r} \u2014 reachable beyond this machine \u2014 with no ${M.IDENTITY_HEADER_ENV} pinned. Anyone who can reach this port is trusted to state who they are.`]:[],`${M.IDENTITY_HEADER_ENV} is not set, so identity falls back to the platform header aliases (${BE.join(", ")}). That is only safe when your proxy sets AND STRIPS every one of them. Pin the single header your deploy layer really controls, e.g. ${M.IDENTITY_HEADER_ENV}=x-goog-authenticated-user-email.`,`NOTE: ${M.PIN_ONLY_IDENTITY_HEADERS.join(", ")} is NO LONGER trusted by default \u2014 it is not stripped by any platform, so an arbitrary client could send it and be namespaced as another user. If your proxy does set it (the Caddy forward_auth / auth-broker flow does), pin it: ${M.IDENTITY_HEADER_ENV}=x-agent-user.`]}M.REQUIRE_TENANT_ISOLATION_ENV="AGENTHIPPO_REQUIRE_TENANT_ISOLATION";function jE(t,e){let n=ys.resolve(t),r=ys.resolve(e);return n===r||n.startsWith(r+ys.sep)}function SC(t,e=process.env){if(!e[M.IDENTITY_HEADER_ENV]?.trim())return{level:"ok",lines:[]};if(t.sandbox==="container"&&!t.sharedWorkspace)return{level:"ok",lines:[]};let r=t.sandbox==="process"?"a tier-0 (--sandbox=process) sandbox":"no sandbox",s=[`${M.IDENTITY_HEADER_ENV} is pinned \u2014 so this serve has more than one user \u2014 but it runs with ${r}, which shares one uid, one workspace (${t.workspace??"unset"}) and one state dir (${t.stateDir}) across all of them. Any user can read every other user's engine session files, which hold their conversations verbatim. Per-user paths are namespacing, not isolation.`,"The boundary is --sandbox=container (per-session workspace and state, without --shared-workspace) or one serve per tenant. Until then, restrict the pack's tool surface so the agent has no way to read arbitrary files."];return t.workspace&&jE(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&&jE(t.stateDir,t.workspace)&&s.push(`--state-dir ${t.stateDir} sits INSIDE --workspace ${t.workspace}: every other user's sessions, analytics and evidence spool are inside the directory the agent is pointed at. Put them in unrelated subtrees (e.g. --workspace=/work --state-dir=/state).`),{level:/^(1|true|yes|on)$/i.test(e[M.REQUIRE_TENANT_ISOLATION_ENV]?.trim()??"")?"refuse":"warn",lines:s}}function AC(t,e,n=process.env){let r=n[M.IDENTITY_PROXY_SECRET_ENV]?.trim();if(r&&!FE(t,r))return;let s=n[M.IDENTITY_HEADER_ENV]?.trim().toLowerCase(),i=s?[s]:BE;for(let a of i){let c=t[a],l=(Array.isArray(c)?c[0]:c)?.trim();if(l){let d=l.lastIndexOf(":");return d>=0&&l.slice(d+1).includes("@")?l.slice(d+1):l}}return s||n.AGENTHIPPO_ALLOW_BODY_IDENTITY?.trim()!=="1"?void 0:e?.user_id?.trim()||void 0}var TC=["x-forwarded-access-token","x-agent-data-token"];function bC(t){for(let e of TC){let n=t[e],r=(Array.isArray(n)?n[0]:n)?.trim();if(r)return r}}function vC(t){if(!t)return;let e=t.senderId?.trim()||t.senderUsername?.trim()||t.senderName?.trim();if(!e)return;let n=t.channel?.trim();return n?`${n}:${e}`:e}M.SESSION_WITHOUT_USER_REASON="session_without_verified_user";function qd(t){return el.createHash("sha256").update(t).digest("hex").slice(0,16)}function OC(t,e,n="session",r=process.env){let s=t?.trim(),i=e?.trim();if(i){let a=`u${qd(i)}--${s||"default"}`;return{sessionKey:a,sandboxKey:n==="user"?`u${qd(i)}`:a}}if(r[M.IDENTITY_HEADER_ENV]?.trim())return{sessionKey:"",sandboxKey:"",rejected:M.SESSION_WITHOUT_USER_REASON};let o=s||"anon-unknown";return{sessionKey:o,sandboxKey:o}}function PC(){return{"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Agent-User","Access-Control-Allow-Origin":"*"}}var Yd=class{maxPerSession;counts=new Map;constructor(e){this.maxPerSession=e}tryConsume(e){if(!Number.isFinite(this.maxPerSession)||this.maxPerSession<=0)return!0;let n=this.counts.get(e)??0;return n>=this.maxPerSession?!1:(this.counts.set(e,n+1),!0)}reset(e){this.counts.delete(e)}};M.TurnLimiter=Yd;M.MAX_CONCURRENT_TURNS_ENV="AGENTHIPPO_MAX_CONCURRENT_TURNS";M.TURN_QUEUE_ENV="AGENTHIPPO_TURN_QUEUE";M.TURN_GATE_RETRY_AFTER_SECONDS=15;M.TURN_GATE_BUSY_MESSAGE="At capacity \u2014 please retry in a moment";M.RATE_LIMIT_BUSY_MESSAGE="Rate limit exceeded \u2014 please retry in a moment";M.TURN_LIMIT_BUSY_MESSAGE="Per-session turn limit reached";var tl=class{maxInflight;maxQueue;queueTimeoutMs;inflightCount=0;waiters=[];constructor(e,n,r=M.TURN_GATE_RETRY_AFTER_SECONDS*1e3){this.maxInflight=e,this.maxQueue=n,this.queueTimeoutMs=r}async acquire(){return!Number.isFinite(this.maxInflight)||this.maxInflight<=0?()=>{}:this.inflightCount<this.maxInflight?(this.inflightCount+=1,()=>this.releaseSlot()):this.waiters.length>=this.maxQueue?null:new Promise(e=>{let n=!1,r=o=>{if(n){o&&o();return}n=!0,clearTimeout(i),e(o)},s={resolve:r,timer:null},i=setTimeout(()=>{let o=this.waiters.indexOf(s);o>=0&&this.waiters.splice(o,1),r(null)},this.queueTimeoutMs);s.timer=i,this.waiters.push(s)})}releaseSlot(){let e=this.waiters.shift();if(e){e.resolve(()=>this.releaseSlot());return}this.inflightCount=Math.max(0,this.inflightCount-1)}get inflight(){return this.inflightCount}get queued(){return this.waiters.length}get max(){return this.maxInflight>0?this.maxInflight:0}};M.TurnGate=tl;function IC(t=process.env){let e=Number(t[M.MAX_CONCURRENT_TURNS_ENV]??10),n=Number(t[M.TURN_QUEUE_ENV]??20),r=Number.isFinite(e)?e:10,s=Number.isFinite(n)&&n>=0?n:20;return new tl(r,s)}function NC(t=5e3){let e=0;return n=>{let r=Date.now();r-e<t||(e=r,console.warn(n))}}function RC(t,e=M.DEFAULT_MAX_BODY_BYTES){return new Promise((n,r)=>{let s=0,i=[],o=d=>{if(s+=d.length,s>e){l();let u=new Error(`Request body exceeds ${e} bytes`);u.tooLarge=!0,r(u);return}i.push(d)},a=()=>{l(),n(Buffer.concat(i).toString("utf8"))},c=d=>{l(),r(d)},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 po=S(un=>{"use strict";var CC=un&&un.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),kC=un&&un.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),$C=un&&un.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&CC(n,e,r[s]);return kC(n,e),n}})();Object.defineProperty(un,"__esModule",{value:!0});un.TURN_NONCE_HEADER=un.TURN_NONCE_ENV=un.DATA_MCP_URL_ENV=void 0;un.startDataGateway=HC;var DC=$C(require("http")),LC=require("@modelcontextprotocol/sdk/server/index.js"),MC=require("@modelcontextprotocol/sdk/server/streamableHttp.js"),VE=require("@modelcontextprotocol/sdk/types.js"),GC=Pr(),UC=lo();un.DATA_MCP_URL_ENV="AGENTHIPPO_DATA_MCP_URL";un.TURN_NONCE_ENV="AGENTHIPPO_TURN_NONCE";un.TURN_NONCE_HEADER="x-agent-turn-nonce";function WE(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function KE(t){return t?(0,UC.hashNonce)(t).slice(0,12):"none"}async function HC(t){let e=DC.createServer(async(i,o)=>{try{let a=i.url?.split("?")[0]??"";if(a==="/turn"&&i.method==="DELETE"){let p=WE(i.headers.authorization);if(p){let g=t.registry.releaseByNonce(p);t.audit?.("edge","turn_release",{released:g,nonce_sha256_prefix:KE(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=WE(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:KE(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 d;try{d=JSON.parse(await(0,GC.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=jC(t,l),f=new MC.StreamableHTTPServerTransport({sessionIdGenerator:void 0,enableJsonResponse:!0});o.on("close",()=>{f.close(),u.close()}),await u.connect(f),await f.handleRequest(i,o,d)}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 jC(t,e){let n=new LC.Server({name:"agenthippo-data-gateway",version:"1.0.0"},{capabilities:{tools:{}}}),r=t.broker.provider.tools??[],s=new Set(r.map(i=>i.definition.name));return n.setRequestHandler(VE.ListToolsRequestSchema,async()=>({tools:[...r.map(i=>i.definition),...(await t.connector.listTools()).filter(i=>!s.has(i.name))]})),n.setRequestHandler(VE.CallToolRequestSchema,async i=>{let o=i.params.name,a=r.find(l=>l.definition.name===o);if(a){t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name,brokerSide:!0});try{let l=await a.call({userId:e.userId,sessionKey:e.sessionKey,invalidate:()=>t.broker.invalidate(e.userId)},i.params.arguments??{});return{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}catch(l){let d=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"provider_tool_failed",error:d}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:d})}],isError:!0}}}let c;try{c=(await t.broker.acquire(e.userId,e.inboundToken)).secretRef,t.audit?.(e.sessionKey,"tool_authorize",{tool:o,userId:e.userId,provider:t.broker.provider.name})}catch(l){let d=l instanceof Error?l.message:String(l);return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"acquire_failed",error:d}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:`credential acquire failed (fail-closed): ${d}`})}],isError:!0}}try{return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:c})}catch(l){let d=l instanceof Error?l.message:String(l);if(/401|unauthoriz|expired/i.test(d)){t.broker.invalidate(e.userId);try{let u=await t.broker.acquire(e.userId,e.inboundToken);return await t.connector.callTool(o,i.params.arguments??{},{userId:e.userId,credential:u.secretRef})}catch{}}return t.audit?.(e.sessionKey,"tool_deny",{tool:o,userId:e.userId,reason:"call_failed",error:d}),{content:[{type:"text",text:JSON.stringify({ok:!1,error:d})}],isError:!0}}}),n}});var Zd=S(Qd=>{"use strict";Object.defineProperty(Qd,"__esModule",{value:!0});Qd.createConnectHandler=WC;var xC=require("crypto"),BC=Pr(),nl=na(),sl=t=>t.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]),qE=t=>JSON.stringify(t).replace(/</g,"\\u003c"),YE="default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'",FC=t=>`default-src 'none'; script-src 'nonce-${t}' https://cdn.plaid.com; frame-src https://cdn.plaid.com https://*.plaid.com; connect-src 'self' https://*.plaid.com; img-src https: data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'`,rl={"Cache-Control":"no-store","Referrer-Policy":"no-referrer","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY"};function Xd(t,e,n,r){t.writeHead(e,{...rl,"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":r}),t.end(n)}function zd(t,e){return`<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
464
483
  <title>${sl(t)}</title>
465
484
  <body style="font-family:system-ui,sans-serif;max-width:34rem;margin:4rem auto;padding:0 1rem;line-height:1.5">
466
485
  <h2>${sl(t)}</h2>${e}</body></html>`}function VC(t,e,n){return zd("Connect your bank",`<p id="s">Opening Plaid\u2026</p>
@@ -479,13 +498,13 @@ Plaid.create({
479
498
  },
480
499
  onExit: (err) => { s.textContent = err ? 'Plaid stopped: ' + (err.display_message || err.error_message) : 'Cancelled. Ask your agent for a new link to try again.'; },
481
500
  }).open();
482
- </script>`)}function WC(t){return async(e,n)=>{let r=new URL(e.url??"/","http://connect.invalid");if(!r.pathname.startsWith("/connect/"))return!1;let s=`${e.method} ${r.pathname}`;try{if(s==="GET /connect/start"){let i=await t.provider.startConnect(r.searchParams.get("ticket")??void 0,t.browserUser(e));if(i.kind==="redirect")n.writeHead(302,{...rl,Location:i.location}),n.end();else{let o=(0,xC.randomBytes)(16).toString("base64");Xd(n,200,VC(i.flow,i.linkToken,o),FC(o))}return!0}if(s==="GET /connect/google/callback"){let i=await t.provider.finishGoogle({state:r.searchParams.get("state")??void 0,code:r.searchParams.get("code")??void 0,error:r.searchParams.get("error")??void 0},t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"google",userId:i.userId}),Xd(n,200,zd("Google connected",`<p>Connected <b>${sl(i.email??"your Google account")}</b>. You can close this tab and go back to your agent.</p>`),YE),!0}if(s==="POST /connect/bank/exchange"){let i;try{i=JSON.parse(await(0,BC.readBodyWithCap)(e))??{}}catch{throw new nl.ConnectError(400,"Bad request.")}let o=await t.provider.finishBank(i,t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"bank",userId:o.userId,institution:o.institution??null}),n.writeHead(200,{...rl,"Content-Type":"text/plain; charset=utf-8"}),n.end("ok"),!0}throw new nl.ConnectError(404,"Not found.")}catch(i){let o=i instanceof nl.ConnectError?i.status:500,a=i instanceof nl.ConnectError?i.message:"Something went wrong. Ask your agent for a new link and try again.";return t.audit?.("connect","grant_connect_failed",{route:s,status:o,error:i instanceof Error?i.message:String(i)}),s==="POST /connect/bank/exchange"?(n.writeHead(o,{...rl,"Content-Type":"text/plain; charset=utf-8"}),n.end(a)):Xd(n,o,zd("Could not connect",`<p>${sl(a)}</p>`),YE),!0}}}});var XE=S(Pr=>{"use strict";var KC=Pr&&Pr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),qC=Pr&&Pr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),YC=Pr&&Pr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&KC(n,e,r[s]);return qC(n,e),n}})();Object.defineProperty(Pr,"__esModule",{value:!0});Pr.backupTimestamp=XC;Pr.backupPathFor=JE;Pr.renameToBackup=zC;var JC=require("fs"),ef=YC(require("path"));function XC(t=new Date){return t.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function JE(t,e){let n=ef.dirname(t),r=ef.basename(t).replace(/\.json$/i,"");return ef.join(n,`${r}.${e}.bk`)}async function zC(t,e){let n=JE(t,e);try{return await JC.promises.rename(t,n),n}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code):"")==="ENOENT")return;throw r}}});var cl=S($t=>{"use strict";var QC=$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]})),ZC=$t&&$t.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ek=$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"&&QC(n,e,r[s]);return ZC(n,e),n}})();Object.defineProperty($t,"__esModule",{value:!0});$t._resetOutboundHandleStoreLockForTest=nk;$t._setOutboundHandleStorePathForTest=rk;$t.buildGatewayOutboundHandleKey=e_;$t.upsertGatewayOutboundHandle=lk;$t.getLastGatewayOutboundHandle=uk;$t.listGatewayOutboundTargets=dk;$t.mergeGatewayOutboundHandles=fk;$t.resolveGatewayOutboundHandle=pk;$t.backupAndClearOutboundHandlesForAgent=gk;$t.getGatewayOutboundStoreSnapshot=hk;var il=require("fs"),tk=ek(require("path")),zE=XE(),nf=1,ZE={value:void 0},go=new Map,tf=new Map;function rf(t,e){let r=(tf.get(t)??Promise.resolve()).then(()=>e());return tf.set(t,r.catch(()=>{})),r}function nk(){tf.clear(),go.clear()}function rk(t){ZE.value=t,go.clear()}function sa(t){return ZE.value??t}function e_(t,e){let n=e?.trim();return n?`${t}::thread:${n}`:`${t}::`}function sk(){return{version:nf,lastByAgent:{},targetsByAgent:{}}}async function Ks(t){let e=sa(t),n=go.get(e);if(n)return n;try{let s=await il.promises.readFile(e,"utf-8"),i=JSON.parse(s);if(i.targetsByAgent&&typeof i.targetsByAgent=="object"){let o={version:i.version??nf,lastByAgent:i.lastByAgent??{},targetsByAgent:i.targetsByAgent};return go.set(e,o),o}}catch{}let r=sk();return go.set(e,r),r}async function sf(t,e){let n=sa(t);await il.promises.mkdir(tk.dirname(n),{recursive:!0});let r={version:nf,lastByAgent:e.lastByAgent,targetsByAgent:e.targetsByAgent},s=`${n}.tmp`;await il.promises.writeFile(s,JSON.stringify(r,null,2),"utf-8"),await il.promises.rename(s,n),go.set(n,e)}function Ws(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 QE(t,e,n){let r=Ws(t,n),s=Ws(e,n);return r.toLowerCase()===s.toLowerCase()}function ik(t,e,n){if(n)return t.find(i=>QE(i.target,e,i.channel)&&i.threadId?.trim()===n);let r=t.filter(i=>QE(i.target,e,i.channel));return r.length===0?void 0:r.find(i=>!i.threadId?.trim())??ol(r)[0]}function ok(t,e){let n=t.match(/:thread:([^:]+)$/),r=n?t.slice(0,-n[0].length):t,s=r.match(/:direct:([^:]+)$/);if(s)return Ws(`user:${s[1]}`,e);let i=r.match(/:dm:([^:]+)$/);if(i)return Ws(`user:${i[1]}`,e);let o=r.match(/:channel:([^:]+)$/);if(o)return Ws(`channel:${o[1]}`,e);let a=r.match(/:group:([^:]+)$/);if(a)return Ws(`channel:${a[1]}`,e)}function ak(t){let e=t.target?.trim();if(e)return Ws(e,t.channel);let n=t.sessionKey?.trim().toLowerCase();if(n){let s=ok(n,t.channel);if(s)return s}let r=t.senderId?.trim();if(r&&t.channel)return Ws(`user:${r}`,t.channel)}function ck(t){return t.senderName?.trim()?t.senderName.trim():t.senderUsername?.trim()?t.senderUsername.trim():t.target?.trim()||t.senderId?.trim()}function ol(t){return[...t].sort((e,n)=>n.lastSeenAt-e.lastSeenAt)}function al(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 lk(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 d=c.match(/^agent:[^:]+:([a-z0-9_-]+):/);d&&(a=d[1])}let l=ak(n);if(!(!a||!l))return rf(sa(t),async()=>{let d=Date.now(),u=await Ks(t);u.targetsByAgent[i]||(u.targetsByAgent[i]={});let f=e_(l,n.threadId?.trim()),p=u.targetsByAgent[i][f],g={agentId:i,...o?{gatewayAgentId:o}:{},channel:a,accountId:n.accountId?.trim()||void 0,target:l,threadId:n.threadId?.trim()||void 0,sessionKey:n.sessionKey?.trim()||void 0,sessionId:n.sessionId?.trim()||void 0,senderId:n.senderId?.trim()||void 0,senderName:n.senderName?.trim()||void 0,senderUsername:n.senderUsername?.trim()||void 0,label:ck(n),firstSeenAt:p?.firstSeenAt??d,lastSeenAt:d,lastInboundRunId:r,inboundCount:(p?.inboundCount??0)+1};return u.targetsByAgent[i][f]=g,u.lastByAgent[i]=g,await sf(t,u),g})}async function uk(t,e){let n=await Ks(t),r=al(n,e);return n.lastByAgent[r]}async function dk(t,e){let n=await Ks(t);if(e?.trim()){let s=al(n,e.trim());return ol(Object.values(n.targetsByAgent[s]??{}))}let r=[];for(let s of Object.values(n.targetsByAgent))r.push(...Object.values(s));return ol(r)}async function fk(t,e,n){let r=await Ks(t),s=n?.trim()?[n.trim()]:[...new Set([...Object.keys(r.targetsByAgent),...Object.keys(r.lastByAgent)])];return s.length===0?0:rf(sa(e),async()=>{let i=await Ks(e),o=0,a=!1;for(let c of s){let l=r.targetsByAgent[c]??{},d=Object.entries(l);d.length>0&&!i.targetsByAgent[c]&&(i.targetsByAgent[c]={});for(let[f,p]of d){let g=i.targetsByAgent[c]?.[f];(!g||p.lastSeenAt>=g.lastSeenAt)&&(i.targetsByAgent[c][f]=p,o++,a=!0)}let u=r.lastByAgent[c];if(u){let f=i.lastByAgent[c];(!f||u.lastSeenAt>=f.lastSeenAt)&&(i.lastByAgent[c]=u,a=!0)}}return a&&await sf(e,i),o})}async function pk(t,e,n){let r=await Ks(t),s=al(r,e),i=n?.target?.trim();if(i){let o=Object.values(r.targetsByAgent[s]??{});return ik(o,i,n?.threadId?.trim())}return r.lastByAgent[s]}async function gk(t,e,n=(0,zE.backupTimestamp)()){let r=sa(t);return rf(r,async()=>{let s=await Ks(t),i=al(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,zE.renameToBackup)(r,n);return delete s.targetsByAgent[i],delete s.lastByAgent[i],await sf(t,s),{removed:c,backupPath:l}})}async function hk(t){let e=await Ks(t),n={};for(let[r,s]of Object.entries(e.targetsByAgent))n[r]=ol(Object.values(s));return{lastByAgent:e.lastByAgent,targetsByAgent:n}}});var n_=S(Nr=>{"use strict";var mk=Nr&&Nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Ek=Nr&&Nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_k=Nr&&Nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&mk(n,e,r[s]);return Ek(n,e),n}})();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.EGRESS_URL_ENV=void 0;Nr.startEgressBroker=Ok;var yk=_k(require("http")),wk=Ir(),Sk=lo(),Ak=cl(),t_=Ac();Nr.EGRESS_URL_ENV="AGENTHIPPO_EGRESS_URL";function Tk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function bk(t){return t?(0,Sk.hashNonce)(t).slice(0,12):"none"}function vk(t,e){return(0,t_.getGatewayOutboundFilePath)(t,(0,t_.safeGatewaySessionDirId)(e))}async function Ok(t){let e=yk.createServer(async(s,i)=>{let o=(a,c,l,d)=>{l&&t.audit?.("unauthorized",l,d??{}),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=Tk(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:bk(c)});return}let d=l.egressStoreKey?.trim();if(!d){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,wk.readBodyWithCap)(s))}catch{o(400,"invalid JSON body");return}let f=typeof u.message=="string"?u.message:"";if(!f.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=vk(t.workspaceRoot,d),h;try{h=await(0,Ak.resolveGatewayOutboundHandle)(m,t.agentId,p?{target:p}:void 0)}catch(_){t.logger?.warn(`[Egress] store read failed: ${_ instanceof Error?_.message:String(_)}`)}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 w=await t.send(h,f,g);i.writeHead(w.ok?200:502,{"Content-Type":"application/json"}),i.end(JSON.stringify(w))}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 a_=S(Gn=>{"use strict";var Ik=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]})),Pk=Gn&&Gn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Nk=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"&&Ik(n,e,r[s]);return Pk(n,e),n}})();Object.defineProperty(Gn,"__esModule",{value:!0});Gn.ASSERTION_HEADER=void 0;Gn.startDataPlaneSidecar=Gk;var r_=Nk(require("http")),o_=require("crypto"),Rk=Ni(),Ck=lo(),s_=Ir(),i_=na(),kk=Zd(),$k=po();Gn.ASSERTION_HEADER="x-agent-user-assertion";function Dk(t,e){let n=t.headers[e];return(Array.isArray(n)?n[0]:n)?.trim()||void 0}function ll(t){return(0,o_.createHash)("sha256").update(t).digest("hex").slice(0,12)}function Lk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function Mk(t,e){let n=Buffer.from(t),r=Buffer.from(e);return n.length===r.length&&(0,o_.timingSafeEqual)(n,r)}async function Gk(t){let e=t.bindHost??"0.0.0.0",n=await Rk.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=r_.createServer(async(d,u)=>{let f=(p,g)=>{u.writeHead(p,{"Content-Type":"application/json"}),u.end(JSON.stringify({error:g}))};try{let p=d.url?.split("?")[0]??"";if(d.method==="GET"&&p==="/health")return u.writeHead(200,{"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!0}));let g=Lk(d.headers.authorization);if(!g||!Mk(g,t.registerToken))return t.audit?.("unauthorized","sidecar_register_reject",{reason:g?"bad_token":"missing_token"}),f(401,"unauthorized");if((d.method==="GET"||d.method==="POST")&&p==="/edge/turn"){let m=(Array.isArray(d.headers["x-agent-user"])?d.headers["x-agent-user"][0]:d.headers["x-agent-user"])?.trim();if(!m)return t.audit?.("unauthorized","sidecar_edge_reject",{reason:"missing_user"}),f(400,"X-Agent-User required");let h=Dk(d,Gn.ASSERTION_HEADER)?.replace(/^Bearer\s+/i,"").trim()||void 0,{nonce:w}=n.registerTurnRaw({userId:m,sessionKey:m,inboundToken:h});return t.audit?.(m,"sidecar_edge_register",{userId:m,assertion:h?`sha256:${ll(h)}`:"none",nonce_sha256_prefix:ll(w)}),u.writeHead(200,{"Content-Type":"application/json",[$k.TURN_NONCE_HEADER]:w}),u.end(JSON.stringify({ok:!0}))}if(d.method==="POST"&&p==="/turns"){let m;try{m=JSON.parse(await(0,s_.readBodyWithCap)(d))}catch{return f(400,"bad json")}let h=(m.userId??"").trim();if(!h)return f(400,"userId required");let w=m.renewNonce?.trim()||void 0;if(w!==void 0&&!(0,Ck.isNonceShaped)(w))return f(400,"renewNonce must be a previously minted turn nonce");let _=m.agent?.pack?.trim(),E=!!(_&&t.agent?.pack&&_!==t.agent.pack);E&&console.warn(`Warning: turn registration claims agent "${_}" but this connector loaded "${t.agent?.pack}". One connector is meant to serve one agent \u2014 both now share this connector's base credential, so neither is bounded by the job it was deployed for.`);let{nonce:O,release:T}=n.registerTurnRaw({userId:h,sessionKey:(m.sessionKey??"").trim()||h,inboundToken:m.inboundToken,egressStoreKey:m.egressStoreKey},{renewNonce:w});return r.set(O,T),t.audit?.((m.sessionKey??"").trim()||h,"sidecar_register",{userId:h,claimedAgent:_??"none",binding:"asserted",nonce_sha256_prefix:ll(O),...w?{renewed:!0}:{},...E?{agentMismatch:!0,loadedAgent:t.agent?.pack}:{}}),u.writeHead(200,{"Content-Type":"application/json"}),u.end(JSON.stringify({nonce:O}))}if(d.method==="DELETE"&&p.startsWith("/turns/")){let m=decodeURIComponent(p.slice(7)),h=r.has(m);return r.get(m)?.(),r.delete(m),t.audit?.("control","sidecar_release",{released:h,nonce_sha256_prefix:ll(m)}),u.writeHead(204),u.end()}f(404,"not found")}catch(p){t.logger?.warn(`[Sidecar] control error: ${p instanceof Error?p.message:String(p)}`),u.headersSent||u.writeHead(500,{"Content-Type":"application/json"}),u.end(JSON.stringify({error:"internal"}))}});await new Promise((d,u)=>{s.once("error",u),s.listen(t.controlPort,e,()=>d())});let i=s.address(),o=i&&typeof i!="string"?i.port:t.controlPort;t.logger?.info(`[Sidecar] gateway ${n.url} | control :${o} (bound ${e})`),(t.config.provider??"passthrough").trim().toLowerCase()==="passthrough"&&console.warn(`Warning: provider=passthrough needs a per-user token on every turn. Edge-registered turns supply it via the ${Gn.ASSERTION_HEADER} header \u2014 if your edge does not forward it, every tool call will fail closed.`);let a,c,l=n.broker.provider;if(t.connectPort!==void 0&&l instanceof i_.StoredGrantProvider){let d=(0,kk.createConnectHandler)({provider:l,browserUser:p=>(0,s_.resolveUserId)(p.headers,void 0),audit:t.audit}),u=r_.createServer(async(p,g)=>{try{await d(p,g)||(g.writeHead(404,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:"not found"})))}catch(m){t.logger?.warn(`[Sidecar] connect error: ${m instanceof Error?m.message:String(m)}`),g.headersSent||g.writeHead(500),g.end()}});await new Promise((p,g)=>{u.once("error",g),u.listen(t.connectPort,e,()=>p())});let f=u.address();c=f&&typeof f!="string"?f.port:t.connectPort,a=u,t.logger?.info(`[Sidecar] connect pages :${c} (bound ${e})`)}return{gatewayUrl:n.url,controlPort:o,connectPort:c,...l instanceof i_.StoredGrantProvider?{grants:l}:{},close:async()=>{await new Promise(d=>s.close(()=>d())),a&&await new Promise(d=>a.close(()=>d())),await n.close()}}}});var cf=S(qs=>{"use strict";Object.defineProperty(qs,"__esModule",{value:!0});qs.RemoteDataPlane=qs.EdgeDataPlane=void 0;qs.resolveEdgeDataPlane=Uk;qs.resolveRemoteDataPlane=Hk;var ul=po();function Uk(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 of=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}adoptTurn(e){return{nonce:e,env:{[ul.TURN_NONCE_ENV]:e,[ul.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{}}}}};qs.EdgeDataPlane=of;function Hk(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 af=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:{[ul.TURN_NONCE_ENV]:r,[ul.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{}}}}};qs.RemoteDataPlane=af});var Ni=S(K=>{"use strict";var jk=K&&K.__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]})),xk=K&&K.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Bk=K&&K.__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"&&jk(n,e,r[s]);return xk(n,e),n}})();Object.defineProperty(K,"__esModule",{value:!0});K.DataPlane=K.resolveEdgeDataPlane=K.EdgeDataPlane=K.resolveRemoteDataPlane=K.RemoteDataPlane=K.ASSERTION_HEADER=K.startDataPlaneSidecar=K.EGRESS_URL_ENV=K.startEgressBroker=K.TURN_NONCE_HEADER=K.TURN_NONCE_ENV=K.DATA_MCP_URL_ENV=K.startDataGateway=K.TURN_META_KEY=K.ConnectorHost=K.createConnectHandler=K.parseGrantKey=K.GrantStore=K.ConnectError=K.readStoredGrantConfig=K.StoredGrantProvider=K.identityProvider=K.passthroughProvider=K.resolveProvider=K.CredentialBroker=K.DEFAULT_TURN_DEADLINE_MS=K.isNonceShaped=K.hashNonce=K.TurnRegistry=void 0;K.resolveDataPlaneConfig=qk;var ia=Bk(require("path")),Fk=lo(),c_=Fd(),Vk=Wd(),lf=po(),Wk=Xt(),dl=lo();Object.defineProperty(K,"TurnRegistry",{enumerable:!0,get:function(){return dl.TurnRegistry}});Object.defineProperty(K,"hashNonce",{enumerable:!0,get:function(){return dl.hashNonce}});Object.defineProperty(K,"isNonceShaped",{enumerable:!0,get:function(){return dl.isNonceShaped}});Object.defineProperty(K,"DEFAULT_TURN_DEADLINE_MS",{enumerable:!0,get:function(){return dl.DEFAULT_TURN_DEADLINE_MS}});var fl=Fd();Object.defineProperty(K,"CredentialBroker",{enumerable:!0,get:function(){return fl.CredentialBroker}});Object.defineProperty(K,"resolveProvider",{enumerable:!0,get:function(){return fl.resolveProvider}});Object.defineProperty(K,"passthroughProvider",{enumerable:!0,get:function(){return fl.passthroughProvider}});Object.defineProperty(K,"identityProvider",{enumerable:!0,get:function(){return fl.identityProvider}});var df=na();Object.defineProperty(K,"StoredGrantProvider",{enumerable:!0,get:function(){return df.StoredGrantProvider}});Object.defineProperty(K,"readStoredGrantConfig",{enumerable:!0,get:function(){return df.readStoredGrantConfig}});Object.defineProperty(K,"ConnectError",{enumerable:!0,get:function(){return df.ConnectError}});var u_=Hd();Object.defineProperty(K,"GrantStore",{enumerable:!0,get:function(){return u_.GrantStore}});Object.defineProperty(K,"parseGrantKey",{enumerable:!0,get:function(){return u_.parseGrantKey}});var Kk=Zd();Object.defineProperty(K,"createConnectHandler",{enumerable:!0,get:function(){return Kk.createConnectHandler}});var d_=Wd();Object.defineProperty(K,"ConnectorHost",{enumerable:!0,get:function(){return d_.ConnectorHost}});Object.defineProperty(K,"TURN_META_KEY",{enumerable:!0,get:function(){return d_.TURN_META_KEY}});var pl=po();Object.defineProperty(K,"startDataGateway",{enumerable:!0,get:function(){return pl.startDataGateway}});Object.defineProperty(K,"DATA_MCP_URL_ENV",{enumerable:!0,get:function(){return pl.DATA_MCP_URL_ENV}});Object.defineProperty(K,"TURN_NONCE_ENV",{enumerable:!0,get:function(){return pl.TURN_NONCE_ENV}});Object.defineProperty(K,"TURN_NONCE_HEADER",{enumerable:!0,get:function(){return pl.TURN_NONCE_HEADER}});var f_=n_();Object.defineProperty(K,"startEgressBroker",{enumerable:!0,get:function(){return f_.startEgressBroker}});Object.defineProperty(K,"EGRESS_URL_ENV",{enumerable:!0,get:function(){return f_.EGRESS_URL_ENV}});var p_=a_();Object.defineProperty(K,"startDataPlaneSidecar",{enumerable:!0,get:function(){return p_.startDataPlaneSidecar}});Object.defineProperty(K,"ASSERTION_HEADER",{enumerable:!0,get:function(){return p_.ASSERTION_HEADER}});var gl=cf();Object.defineProperty(K,"RemoteDataPlane",{enumerable:!0,get:function(){return gl.RemoteDataPlane}});Object.defineProperty(K,"resolveRemoteDataPlane",{enumerable:!0,get:function(){return gl.resolveRemoteDataPlane}});Object.defineProperty(K,"EdgeDataPlane",{enumerable:!0,get:function(){return gl.EdgeDataPlane}});Object.defineProperty(K,"resolveEdgeDataPlane",{enumerable:!0,get:function(){return gl.resolveEdgeDataPlane}});var l_={"personal-connectors":ia.join("skills","personal-connectors","scripts","server.mjs")};function qk(t,e,n=(0,Wk.findBundledBasePromptsDir)()){let r=t?.dataPlane,s=r?.connector?.trim();if(!s)return;let i=r?.provider?.trim()||void 0;if(s.startsWith("builtin:")){let o=s.slice(8),a=l_[o];if(!a)throw new Error(`Unknown builtin connector "${o}" (known: ${Object.keys(l_).join(", ")})`);if(!n)throw new Error(`connector ${s}: this AgentHippo build ships no base-prompts. Copy the connector into the pack (${ia.dirname(a)}/server.mjs and lib.mjs) and point spec.dataPlane.connector at the copy.`);return{connectorPath:ia.join(n,a),provider:i}}return{connectorPath:ia.isAbsolute(s)?s:ia.join(e,s),provider:i}}var uf=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 Fk.TurnRegistry,s=new c_.CredentialBroker(n?.provider??(0,c_.resolveProvider)(e.provider)),i=await Vk.ConnectorHost.spawn({connectorPath:e.connectorPath,logger:n?.logger});try{let o=await(0,lf.startDataGateway)({registry:r,broker:s,connector:i,logger:n?.logger,audit:n?.audit,host:n?.gateway?.host,port:n?.gateway?.port,advertiseHost:n?.gateway?.advertiseHost});return new t(o.url,r,s,i,o)}catch(o){throw await i.close(),o}}registerTurnRaw(e,n){return this.registry.register(e,n)}registerTurn(e,n){let{nonce:r,release:s}=this.registry.register(e,n);return{nonce:r,env:{[lf.TURN_NONCE_ENV]:r,[lf.DATA_MCP_URL_ENV]:this.url},release:s}}async close(){await this.gateway.close(),await this.connector.close()}};K.DataPlane=uf});var E_=S(El=>{"use strict";Object.defineProperty(El,"__esModule",{value:!0});El.resolveLocalTurnUserId=m_;El.resolveLocalTurnScope=Jk;var g_=Ni(),h_=cf(),hl=po(),Yk=ps();function m_(t=process.env){return t.AGENTHIPPO_DATA_USER?.trim()||(0,Yk.currentCredential)()?.userId?.trim()||t.LOGNAME?.trim()||t.USER?.trim()||t.LNAME?.trim()||t.USERNAME?.trim()||void 0}var ff=new WeakMap,ml=class{mode;userId;gatewayUrl;registrar;closePlane;sessionNonce;activeTurns=0;latestRelease;constructor(e,n,r,s,i){this.mode=e,this.userId=n,this.gatewayUrl=r,this.registrar=s,this.closePlane=i}async beginTurn(e){let n=await this.registrar.registerTurn({userId:this.userId,sessionKey:e.sessionKey,renewNonce:this.sessionNonce});this.sessionNonce=n.nonce,this.latestRelease=n.release,this.activeTurns++;let r=!1;return{env:n.env,release:async()=>{if(!r&&(r=!0,this.activeTurns--,this.activeTurns<=0)){let s=this.latestRelease;this.latestRelease=void 0,await s?.()}}}}async close(){await this.closePlane()}};async function Jk(t){let e=t.env??process.env,n=i=>{let o=m_(e);if(!o)throw new Error(`${i} is configured but no acting user resolves \u2014 set AGENTHIPPO_DATA_USER (fail-closed: turns register a real identity; there is no anonymous data access)`);return o},r=ff.has(e)?ff.get(e):(0,h_.resolveRemoteDataPlane)(e);if(r){ff.set(e,r);let i=n("The data-plane sidecar"),o=new h_.RemoteDataPlane(r);return delete e.AGENTHIPPO_DATA_PLANE_TOKEN,e[hl.DATA_MCP_URL_ENV]=o.url,new ml("sidecar",i,o.url,{registerTurn:a=>o.registerTurn({...a,agent:t.agent})},async()=>{})}if(e[hl.TURN_NONCE_ENV]?.trim()&&e[hl.DATA_MCP_URL_ENV]?.trim())return console.warn("Warning: using a pre-minted session nonce from the environment (not rotated per turn, expires on the registry deadline). Set AGENTHIPPO_DATA_PLANE_CONTROL_URL + AGENTHIPPO_DATA_PLANE_TOKEN to register real per-turn identities instead."),null;let s=t.packPath?(0,g_.resolveDataPlaneConfig)(t.spec,t.packPath):void 0;if(s){let i=n("The pack's data plane (spec.dataPlane)"),o=await g_.DataPlane.start(s,{logger:t.logger,audit:t.audit});return e[hl.DATA_MCP_URL_ENV]=o.url,new ml("in-process",i,o.url,{registerTurn:async a=>o.registerTurn(a,{renewNonce:a.renewNonce})},()=>o.close())}return null}});var Ri=S(Le=>{"use strict";var Xk=Le&&Le.__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]})),zk=Le&&Le.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Qk=Le&&Le.__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"&&Xk(n,e,r[s]);return zk(n,e),n}})();Object.defineProperty(Le,"__esModule",{value:!0});Le.WARRANT_TTL_ENV=Le.DEFAULT_WARRANT_TTL_SECONDS=Le.MAX_TTL_SECONDS=void 0;Le.b64urlEncode=pf;Le.signCompactJws=__;Le.verifyCompactJws=y_;Le.timingSafeEqualString=Zk;Le.generateWarrantKeypair=e$;Le.warrantTtlFromEnv=t$;Le.mintWarrant=n$;Le.verifyWarrant=r$;Le.jwks=s$;var ws=Qk(require("node:crypto"));function pf(t){return Buffer.from(t,"utf8").toString("base64url")}function __(t,e,n){let r={alg:"ES256",typ:t.typ??"JWT",kid:t.kid},s=`${pf(JSON.stringify(r))}.${pf(JSON.stringify(e))}`,i=ws.sign("sha256",Buffer.from(s),{key:ws.createPrivateKey(n),dsaEncoding:"ieee-p1363"});return`${s}.${i.toString("base64url")}`}function y_(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 d=!1;try{d=ws.verify("sha256",Buffer.from(`${s}.${i}`),{key:ws.createPublicKey(l),dsaEncoding:"ieee-p1363"},Buffer.from(o,"base64url"))}catch{return{ok:!1,reason:"bad signature"}}return d?{ok:!0,header:a,payload:c,signingInput:`${s}.${i}`}:{ok:!1,reason:"bad signature"}}function Zk(t,e){let n=Buffer.from(t,"utf8"),r=Buffer.from(e,"utf8");return n.length!==r.length?!1:ws.timingSafeEqual(n,r)}function e$(t){let{privateKey:e,publicKey:n}=ws.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??ws.createHash("sha256").update(r).digest("hex").slice(0,16)}}Le.MAX_TTL_SECONDS=86400;Le.DEFAULT_WARRANT_TTL_SECONDS=3600;Le.WARRANT_TTL_ENV="AGENTHIPPO_WARRANT_TTL_SECONDS";function t$(t=process.env){let e=t[Le.WARRANT_TTL_ENV]?.trim();if(e===void 0||e==="")return Le.DEFAULT_WARRANT_TTL_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<=0?Le.DEFAULT_WARRANT_TTL_SECONDS:Math.min(Math.floor(n),Le.MAX_TTL_SECONDS)}function n$(t,e){let n=t.nowSeconds??Math.floor(Date.now()/1e3),r=Math.min(t.ttlSeconds??120,Le.MAX_TTL_SECONDS),s={user:t.user,pack:t.pack,packVersion:t.packVersion,sandboxId:t.sandboxId,tier:t.tier,aud:t.aud,iat:n,exp:n+r,jti:ws.randomUUID(),...t.billing==="user"?{billing:"user"}:{},...t.budgetKey?{budgetKey:t.budgetKey}:{},...t.budgetWindowSeconds!==void 0&&t.budgetWindowSeconds>0?{budgetWindowSeconds:t.budgetWindowSeconds}:{}};return __({typ:"JWT",kid:e.kid},s,e.privateKeyPem)}function r$(t,e,n){let r=y_(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 s$(t){return{keys:t.map(e=>({...ws.createPublicKey(e.publicKeyPem).export({format:"jwk"}),kid:e.kid,alg:"ES256",use:"sig"}))}}});var aa=S(le=>{"use strict";Object.defineProperty(le,"__esModule",{value:!0});le.DENY_SCOPE_ALIASES=le.DENY_MODE_ALIASES=le.STRICTEST_DENY_MODE=le.DENY_MODES=le.DENY_SCOPES=le.STRICTEST_ON_BREACH=le.ON_BREACH_ALIASES=le.ON_BREACH_ACTIONS=le.DEPRECATED_CAP_SPELLINGS=le.LEASE_CAP_ALIASES=le.LEASE_CAP_FIELDS=void 0;le.parseCapPolicy=w_;le.parseLease=a$;le.LEASE_CAP_FIELDS={maxTurnsPerSession:{kind:"positive-int"},maxSessionSeconds:{kind:"positive-int"},maxConcurrentSandboxes:{kind:"positive-int"}};le.LEASE_CAP_ALIASES={maxConcurrentCells:"maxConcurrentSandboxes"};le.DEPRECATED_CAP_SPELLINGS={maxConcurrentCells:"maxConcurrentSandboxes",AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES","destroy-cell":"destroy-sandbox","--max-concurrent-cells":"--max-concurrent-sandboxes"};le.ON_BREACH_ACTIONS={"revoke-inference":{strictness:1},"destroy-sandbox":{strictness:2}};le.ON_BREACH_ALIASES={"destroy-cell":"destroy-sandbox"};le.STRICTEST_ON_BREACH=Object.keys(le.ON_BREACH_ACTIONS).reduce((t,e)=>le.ON_BREACH_ACTIONS[t].strictness>=le.ON_BREACH_ACTIONS[e].strictness?t:e);le.DENY_SCOPES=["session","user","pack"];le.DENY_MODES={drain:{strictness:1},kill:{strictness:2}};le.STRICTEST_DENY_MODE="kill";le.DENY_MODE_ALIASES={};le.DENY_SCOPE_ALIASES={};var oa=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function i$(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 w_(t,e="caps"){if(t==null)return{ok:!0,caps:{},warnings:[]};if(!oa(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 le.LEASE_CAP_FIELDS?i:le.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=i$(`${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 le.ON_BREACH_ACTIONS?s:le.ON_BREACH_ALIASES[s];i?r.onBreach=i:(r.onBreach=le.STRICTEST_ON_BREACH,n.push(`${e}.onBreach="${s}" is not an action this build understands. Failing CLOSED to "${le.STRICTEST_ON_BREACH}" (the strictest known action). Known actions: ${Object.keys(le.ON_BREACH_ACTIONS).join(", ")}.`))}return{ok:!0,caps:r,warnings:n}}function o$(t,e){if(!oa(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=le.DENY_SCOPES.includes(r)?r:le.DENY_SCOPE_ALIASES[r];if(!s)return{ok:!1,reason:`deny[${e}].scope "${r}" is not a scope this build understands (known: ${le.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 le.DENY_MODES?i:le.DENY_MODE_ALIASES[i];o||(o=le.STRICTEST_DENY_MODE,n.push(`deny[${e}].mode="${i}" is not a mode this build understands. Failing CLOSED to "${le.STRICTEST_DENY_MODE}". Known modes: ${Object.keys(le.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 a$(t){if(!oa(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=w_(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=o$(t.deny[s],s);if(!i.ok)return{ok:!1,reason:i.reason};r.push(i.rule),e.push(...i.warnings)}n.deny=r}if(t.grants!==void 0&&t.grants!==null){let r=oa(t.grants)?t.grants.revoke:void 0;if(!Array.isArray(r))e.push("lease.grants.revoke is not an array \u2014 ignored");else{let s=[];for(let[i,o]of r.entries()){if(!oa(o)||typeof o.user!="string"||!/^[0-9a-f]{64}$/.test(o.user)||typeof o.requestedAt!="number"||!Number.isFinite(o.requestedAt)||o.service!==void 0&&o.service!=="google"&&o.service!=="bank"){e.push(`lease.grants.revoke[${i}] is malformed \u2014 ignored`);continue}s.push({user:o.user,requestedAt:o.requestedAt,...o.service?{service:o.service}:{}})}n.grants={revoke:s}}}return t.issuedAt!==void 0&&t.issuedAt!==null&&(typeof t.issuedAt=="number"&&Number.isFinite(t.issuedAt)?n.issuedAt=t.issuedAt:e.push("lease.issuedAt is not a finite number \u2014 ignored")),t.deployment!==void 0&&t.deployment!==null&&(typeof t.deployment=="string"&&t.deployment.length>0?n.deployment=t.deployment:e.push("lease.deployment is not a non-empty string \u2014 ignored")),{ok:!0,lease:n,warnings:e}}});var mo=S(j=>{"use strict";var c$=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]})),l$=j&&j.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),hf=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"&&c$(n,e,r[s]);return l$(n,e),n}})();Object.defineProperty(j,"__esModule",{value:!0});j.PACK_FULL_REVERIFY_INTERVAL_MS=j.PACK_PROBE_INTERVAL_MS=j.LEASE_JWKS_PINS_ENV=j.LEASE_JWKS_URL_ENV=j.LEASE_SIGNING_KEYS_ENV=j.ALLOW_INSECURE_TRUST_ROOT_ENV=j.PACK_JWKS_PINS_ENV=j.PACK_JWKS_URL_ENV_LEGACY=j.PACK_JWKS_URL_ENV=j.ALLOW_UNSIGNED_PACK_ENV=j.DIGEST_EXCLUDED_SEGMENTS=j.PACK_SIGNATURE_FILE=void 0;j.isDigestExcluded=yl;j.computePackDigestFromFiles=A_;j.computePackDigest=mf;j.packTreeProbe=gf;j.signPack=u$;j.readPackSignature=T_;j.verifyPack=b_;j.verifyPackFromFiles=d$;j.requireSignedPack=O_;j.resolveRequireSignedPack=p$;j.allowUnsignedPackFromEnv=g$;j.describePackRefusal=h$;j.publicKeyThumbprints=I_;j.parseJwksPins=P_;j.assertSecureTrustUrl=N_;j.loadPackTrustRoot=C_;j.loadLeaseTrustRoot=y$;j.selectLeaseSigningKeys=w$;j.checkTrustRootSeparation=S$;j.loadPackSigningKeys=T$;j.createPackVerifier=b$;var ho=hf(require("node:crypto")),Ys=hf(require("node:fs")),_l=hf(require("node:path")),ca=Ri();j.PACK_SIGNATURE_FILE="pack.sig";j.DIGEST_EXCLUDED_SEGMENTS=new Set([".git","node_modules"]);function yl(t){return t===j.PACK_SIGNATURE_FILE?!0:t.split("/").some(e=>j.DIGEST_EXCLUDED_SEGMENTS.has(e))}function S_(t){let e=ho.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 A_(t){let e=[];for(let n of t){let r=n.path.replace(/\\/g,"/");yl(r)||e.push({rel:r,body:n.content,link:n.link})}return S_(e)}function mf(t){let e=[],n=(r,s)=>{for(let i of Ys.readdirSync(r)){let o=s?`${s}/${i}`:i;if(yl(o))continue;let a=_l.join(r,i),c=Ys.lstatSync(a);c.isSymbolicLink()?e.push({rel:o,body:Buffer.from(Ys.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({rel:o,body:Ys.readFileSync(a)})}};return n(t,""),S_(e)}function gf(t){let e=[],n=(r,s)=>{let i;try{i=Ys.readdirSync(r).sort()}catch{e.push(`${s}/?unreadable`);return}for(let o of i){let a=s?`${s}/${o}`:o;if(yl(a))continue;let c=_l.join(r,o),l;try{l=Ys.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 ho.createHash("sha256").update(e.join(`
501
+ </script>`)}function WC(t){return async(e,n)=>{let r=new URL(e.url??"/","http://connect.invalid");if(!r.pathname.startsWith("/connect/"))return!1;let s=`${e.method} ${r.pathname}`;try{if(s==="GET /connect/start"){let i=await t.provider.startConnect(r.searchParams.get("ticket")??void 0,t.browserUser(e));if(i.kind==="redirect")n.writeHead(302,{...rl,Location:i.location}),n.end();else{let o=(0,xC.randomBytes)(16).toString("base64");Xd(n,200,VC(i.flow,i.linkToken,o),FC(o))}return!0}if(s==="GET /connect/google/callback"){let i=await t.provider.finishGoogle({state:r.searchParams.get("state")??void 0,code:r.searchParams.get("code")??void 0,error:r.searchParams.get("error")??void 0},t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"google",userId:i.userId}),Xd(n,200,zd("Google connected",`<p>Connected <b>${sl(i.email??"your Google account")}</b>. You can close this tab and go back to your agent.</p>`),YE),!0}if(s==="POST /connect/bank/exchange"){let i;try{i=JSON.parse(await(0,BC.readBodyWithCap)(e))??{}}catch{throw new nl.ConnectError(400,"Bad request.")}let o=await t.provider.finishBank(i,t.browserUser(e));return t.audit?.("connect","grant_connected",{service:"bank",userId:o.userId,institution:o.institution??null}),n.writeHead(200,{...rl,"Content-Type":"text/plain; charset=utf-8"}),n.end("ok"),!0}throw new nl.ConnectError(404,"Not found.")}catch(i){let o=i instanceof nl.ConnectError?i.status:500,a=i instanceof nl.ConnectError?i.message:"Something went wrong. Ask your agent for a new link and try again.";return t.audit?.("connect","grant_connect_failed",{route:s,status:o,error:i instanceof Error?i.message:String(i)}),s==="POST /connect/bank/exchange"?(n.writeHead(o,{...rl,"Content-Type":"text/plain; charset=utf-8"}),n.end(a)):Xd(n,o,zd("Could not connect",`<p>${sl(a)}</p>`),YE),!0}}}});var XE=S(Ir=>{"use strict";var KC=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]})),qC=Ir&&Ir.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),YC=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"&&KC(n,e,r[s]);return qC(n,e),n}})();Object.defineProperty(Ir,"__esModule",{value:!0});Ir.backupTimestamp=XC;Ir.backupPathFor=JE;Ir.renameToBackup=zC;var JC=require("fs"),ef=YC(require("path"));function XC(t=new Date){return t.toISOString().replace(/[-:]/g,"").replace(/\.\d+Z$/,"Z")}function JE(t,e){let n=ef.dirname(t),r=ef.basename(t).replace(/\.json$/i,"");return ef.join(n,`${r}.${e}.bk`)}async function zC(t,e){let n=JE(t,e);try{return await JC.promises.rename(t,n),n}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code):"")==="ENOENT")return;throw r}}});var cl=S($t=>{"use strict";var QC=$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]})),ZC=$t&&$t.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ek=$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"&&QC(n,e,r[s]);return ZC(n,e),n}})();Object.defineProperty($t,"__esModule",{value:!0});$t._resetOutboundHandleStoreLockForTest=nk;$t._setOutboundHandleStorePathForTest=rk;$t.buildGatewayOutboundHandleKey=e_;$t.upsertGatewayOutboundHandle=lk;$t.getLastGatewayOutboundHandle=uk;$t.listGatewayOutboundTargets=dk;$t.mergeGatewayOutboundHandles=fk;$t.resolveGatewayOutboundHandle=pk;$t.backupAndClearOutboundHandlesForAgent=gk;$t.getGatewayOutboundStoreSnapshot=hk;var il=require("fs"),tk=ek(require("path")),zE=XE(),nf=1,ZE={value:void 0},go=new Map,tf=new Map;function rf(t,e){let r=(tf.get(t)??Promise.resolve()).then(()=>e());return tf.set(t,r.catch(()=>{})),r}function nk(){tf.clear(),go.clear()}function rk(t){ZE.value=t,go.clear()}function sa(t){return ZE.value??t}function e_(t,e){let n=e?.trim();return n?`${t}::thread:${n}`:`${t}::`}function sk(){return{version:nf,lastByAgent:{},targetsByAgent:{}}}async function Ks(t){let e=sa(t),n=go.get(e);if(n)return n;try{let s=await il.promises.readFile(e,"utf-8"),i=JSON.parse(s);if(i.targetsByAgent&&typeof i.targetsByAgent=="object"){let o={version:i.version??nf,lastByAgent:i.lastByAgent??{},targetsByAgent:i.targetsByAgent};return go.set(e,o),o}}catch{}let r=sk();return go.set(e,r),r}async function sf(t,e){let n=sa(t);await il.promises.mkdir(tk.dirname(n),{recursive:!0});let r={version:nf,lastByAgent:e.lastByAgent,targetsByAgent:e.targetsByAgent},s=`${n}.tmp`;await il.promises.writeFile(s,JSON.stringify(r,null,2),"utf-8"),await il.promises.rename(s,n),go.set(n,e)}function Ws(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 QE(t,e,n){let r=Ws(t,n),s=Ws(e,n);return r.toLowerCase()===s.toLowerCase()}function ik(t,e,n){if(n)return t.find(i=>QE(i.target,e,i.channel)&&i.threadId?.trim()===n);let r=t.filter(i=>QE(i.target,e,i.channel));return r.length===0?void 0:r.find(i=>!i.threadId?.trim())??ol(r)[0]}function ok(t,e){let n=t.match(/:thread:([^:]+)$/),r=n?t.slice(0,-n[0].length):t,s=r.match(/:direct:([^:]+)$/);if(s)return Ws(`user:${s[1]}`,e);let i=r.match(/:dm:([^:]+)$/);if(i)return Ws(`user:${i[1]}`,e);let o=r.match(/:channel:([^:]+)$/);if(o)return Ws(`channel:${o[1]}`,e);let a=r.match(/:group:([^:]+)$/);if(a)return Ws(`channel:${a[1]}`,e)}function ak(t){let e=t.target?.trim();if(e)return Ws(e,t.channel);let n=t.sessionKey?.trim().toLowerCase();if(n){let s=ok(n,t.channel);if(s)return s}let r=t.senderId?.trim();if(r&&t.channel)return Ws(`user:${r}`,t.channel)}function ck(t){return t.senderName?.trim()?t.senderName.trim():t.senderUsername?.trim()?t.senderUsername.trim():t.target?.trim()||t.senderId?.trim()}function ol(t){return[...t].sort((e,n)=>n.lastSeenAt-e.lastSeenAt)}function al(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 lk(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 d=c.match(/^agent:[^:]+:([a-z0-9_-]+):/);d&&(a=d[1])}let l=ak(n);if(!(!a||!l))return rf(sa(t),async()=>{let d=Date.now(),u=await Ks(t);u.targetsByAgent[i]||(u.targetsByAgent[i]={});let f=e_(l,n.threadId?.trim()),p=u.targetsByAgent[i][f],g={agentId:i,...o?{gatewayAgentId:o}:{},channel:a,accountId:n.accountId?.trim()||void 0,target:l,threadId:n.threadId?.trim()||void 0,sessionKey:n.sessionKey?.trim()||void 0,sessionId:n.sessionId?.trim()||void 0,senderId:n.senderId?.trim()||void 0,senderName:n.senderName?.trim()||void 0,senderUsername:n.senderUsername?.trim()||void 0,label:ck(n),firstSeenAt:p?.firstSeenAt??d,lastSeenAt:d,lastInboundRunId:r,inboundCount:(p?.inboundCount??0)+1};return u.targetsByAgent[i][f]=g,u.lastByAgent[i]=g,await sf(t,u),g})}async function uk(t,e){let n=await Ks(t),r=al(n,e);return n.lastByAgent[r]}async function dk(t,e){let n=await Ks(t);if(e?.trim()){let s=al(n,e.trim());return ol(Object.values(n.targetsByAgent[s]??{}))}let r=[];for(let s of Object.values(n.targetsByAgent))r.push(...Object.values(s));return ol(r)}async function fk(t,e,n){let r=await Ks(t),s=n?.trim()?[n.trim()]:[...new Set([...Object.keys(r.targetsByAgent),...Object.keys(r.lastByAgent)])];return s.length===0?0:rf(sa(e),async()=>{let i=await Ks(e),o=0,a=!1;for(let c of s){let l=r.targetsByAgent[c]??{},d=Object.entries(l);d.length>0&&!i.targetsByAgent[c]&&(i.targetsByAgent[c]={});for(let[f,p]of d){let g=i.targetsByAgent[c]?.[f];(!g||p.lastSeenAt>=g.lastSeenAt)&&(i.targetsByAgent[c][f]=p,o++,a=!0)}let u=r.lastByAgent[c];if(u){let f=i.lastByAgent[c];(!f||u.lastSeenAt>=f.lastSeenAt)&&(i.lastByAgent[c]=u,a=!0)}}return a&&await sf(e,i),o})}async function pk(t,e,n){let r=await Ks(t),s=al(r,e),i=n?.target?.trim();if(i){let o=Object.values(r.targetsByAgent[s]??{});return ik(o,i,n?.threadId?.trim())}return r.lastByAgent[s]}async function gk(t,e,n=(0,zE.backupTimestamp)()){let r=sa(t);return rf(r,async()=>{let s=await Ks(t),i=al(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,zE.renameToBackup)(r,n);return delete s.targetsByAgent[i],delete s.lastByAgent[i],await sf(t,s),{removed:c,backupPath:l}})}async function hk(t){let e=await Ks(t),n={};for(let[r,s]of Object.entries(e.targetsByAgent))n[r]=ol(Object.values(s));return{lastByAgent:e.lastByAgent,targetsByAgent:n}}});var n_=S(Nr=>{"use strict";var mk=Nr&&Nr.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Ek=Nr&&Nr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_k=Nr&&Nr.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&mk(n,e,r[s]);return Ek(n,e),n}})();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.EGRESS_URL_ENV=void 0;Nr.startEgressBroker=Ok;var yk=_k(require("http")),wk=Pr(),Sk=lo(),Ak=cl(),t_=Ac();Nr.EGRESS_URL_ENV="AGENTHIPPO_EGRESS_URL";function Tk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function bk(t){return t?(0,Sk.hashNonce)(t).slice(0,12):"none"}function vk(t,e){return(0,t_.getGatewayOutboundFilePath)(t,(0,t_.safeGatewaySessionDirId)(e))}async function Ok(t){let e=yk.createServer(async(s,i)=>{let o=(a,c,l,d)=>{l&&t.audit?.("unauthorized",l,d??{}),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=Tk(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:bk(c)});return}let d=l.egressStoreKey?.trim();if(!d){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,wk.readBodyWithCap)(s))}catch{o(400,"invalid JSON body");return}let f=typeof u.message=="string"?u.message:"";if(!f.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=vk(t.workspaceRoot,d),h;try{h=await(0,Ak.resolveGatewayOutboundHandle)(m,t.agentId,p?{target:p}:void 0)}catch(_){t.logger?.warn(`[Egress] store read failed: ${_ instanceof Error?_.message:String(_)}`)}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 w=await t.send(h,f,g);i.writeHead(w.ok?200:502,{"Content-Type":"application/json"}),i.end(JSON.stringify(w))}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 a_=S(Gn=>{"use strict";var Pk=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]})),Ik=Gn&&Gn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Nk=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"&&Pk(n,e,r[s]);return Ik(n,e),n}})();Object.defineProperty(Gn,"__esModule",{value:!0});Gn.ASSERTION_HEADER=void 0;Gn.startDataPlaneSidecar=Gk;var r_=Nk(require("http")),o_=require("crypto"),Rk=Ni(),Ck=lo(),s_=Pr(),i_=na(),kk=Zd(),$k=po();Gn.ASSERTION_HEADER="x-agent-user-assertion";function Dk(t,e){let n=t.headers[e];return(Array.isArray(n)?n[0]:n)?.trim()||void 0}function ll(t){return(0,o_.createHash)("sha256").update(t).digest("hex").slice(0,12)}function Lk(t){return t?.match(/^Bearer\s+(\S+)$/i)?.[1]}function Mk(t,e){let n=Buffer.from(t),r=Buffer.from(e);return n.length===r.length&&(0,o_.timingSafeEqual)(n,r)}async function Gk(t){let e=t.bindHost??"0.0.0.0",n=await Rk.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=r_.createServer(async(d,u)=>{let f=(p,g)=>{u.writeHead(p,{"Content-Type":"application/json"}),u.end(JSON.stringify({error:g}))};try{let p=d.url?.split("?")[0]??"";if(d.method==="GET"&&p==="/health")return u.writeHead(200,{"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!0}));let g=Lk(d.headers.authorization);if(!g||!Mk(g,t.registerToken))return t.audit?.("unauthorized","sidecar_register_reject",{reason:g?"bad_token":"missing_token"}),f(401,"unauthorized");if((d.method==="GET"||d.method==="POST")&&p==="/edge/turn"){let m=(Array.isArray(d.headers["x-agent-user"])?d.headers["x-agent-user"][0]:d.headers["x-agent-user"])?.trim();if(!m)return t.audit?.("unauthorized","sidecar_edge_reject",{reason:"missing_user"}),f(400,"X-Agent-User required");let h=Dk(d,Gn.ASSERTION_HEADER)?.replace(/^Bearer\s+/i,"").trim()||void 0,{nonce:w}=n.registerTurnRaw({userId:m,sessionKey:m,inboundToken:h});return t.audit?.(m,"sidecar_edge_register",{userId:m,assertion:h?`sha256:${ll(h)}`:"none",nonce_sha256_prefix:ll(w)}),u.writeHead(200,{"Content-Type":"application/json",[$k.TURN_NONCE_HEADER]:w}),u.end(JSON.stringify({ok:!0}))}if(d.method==="POST"&&p==="/turns"){let m;try{m=JSON.parse(await(0,s_.readBodyWithCap)(d))}catch{return f(400,"bad json")}let h=(m.userId??"").trim();if(!h)return f(400,"userId required");let w=m.renewNonce?.trim()||void 0;if(w!==void 0&&!(0,Ck.isNonceShaped)(w))return f(400,"renewNonce must be a previously minted turn nonce");let _=m.agent?.pack?.trim(),E=!!(_&&t.agent?.pack&&_!==t.agent.pack);E&&console.warn(`Warning: turn registration claims agent "${_}" but this connector loaded "${t.agent?.pack}". One connector is meant to serve one agent \u2014 both now share this connector's base credential, so neither is bounded by the job it was deployed for.`);let{nonce:O,release:T}=n.registerTurnRaw({userId:h,sessionKey:(m.sessionKey??"").trim()||h,inboundToken:m.inboundToken,egressStoreKey:m.egressStoreKey},{renewNonce:w});return r.set(O,T),t.audit?.((m.sessionKey??"").trim()||h,"sidecar_register",{userId:h,claimedAgent:_??"none",binding:"asserted",nonce_sha256_prefix:ll(O),...w?{renewed:!0}:{},...E?{agentMismatch:!0,loadedAgent:t.agent?.pack}:{}}),u.writeHead(200,{"Content-Type":"application/json"}),u.end(JSON.stringify({nonce:O}))}if(d.method==="DELETE"&&p.startsWith("/turns/")){let m=decodeURIComponent(p.slice(7)),h=r.has(m);return r.get(m)?.(),r.delete(m),t.audit?.("control","sidecar_release",{released:h,nonce_sha256_prefix:ll(m)}),u.writeHead(204),u.end()}f(404,"not found")}catch(p){t.logger?.warn(`[Sidecar] control error: ${p instanceof Error?p.message:String(p)}`),u.headersSent||u.writeHead(500,{"Content-Type":"application/json"}),u.end(JSON.stringify({error:"internal"}))}});await new Promise((d,u)=>{s.once("error",u),s.listen(t.controlPort,e,()=>d())});let i=s.address(),o=i&&typeof i!="string"?i.port:t.controlPort;t.logger?.info(`[Sidecar] gateway ${n.url} | control :${o} (bound ${e})`),(t.config.provider??"passthrough").trim().toLowerCase()==="passthrough"&&console.warn(`Warning: provider=passthrough needs a per-user token on every turn. Edge-registered turns supply it via the ${Gn.ASSERTION_HEADER} header \u2014 if your edge does not forward it, every tool call will fail closed.`);let a,c,l=n.broker.provider;if(t.connectPort!==void 0&&l instanceof i_.StoredGrantProvider){let d=(0,kk.createConnectHandler)({provider:l,browserUser:p=>(0,s_.resolveUserId)(p.headers,void 0),audit:t.audit}),u=r_.createServer(async(p,g)=>{try{await d(p,g)||(g.writeHead(404,{"Content-Type":"application/json"}),g.end(JSON.stringify({error:"not found"})))}catch(m){t.logger?.warn(`[Sidecar] connect error: ${m instanceof Error?m.message:String(m)}`),g.headersSent||g.writeHead(500),g.end()}});await new Promise((p,g)=>{u.once("error",g),u.listen(t.connectPort,e,()=>p())});let f=u.address();c=f&&typeof f!="string"?f.port:t.connectPort,a=u,t.logger?.info(`[Sidecar] connect pages :${c} (bound ${e})`)}return{gatewayUrl:n.url,controlPort:o,connectPort:c,...l instanceof i_.StoredGrantProvider?{grants:l}:{},close:async()=>{await new Promise(d=>s.close(()=>d())),a&&await new Promise(d=>a.close(()=>d())),await n.close()}}}});var cf=S(qs=>{"use strict";Object.defineProperty(qs,"__esModule",{value:!0});qs.RemoteDataPlane=qs.EdgeDataPlane=void 0;qs.resolveEdgeDataPlane=Uk;qs.resolveRemoteDataPlane=Hk;var ul=po();function Uk(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 of=class{cfg;constructor(e){this.cfg=e}get url(){return this.cfg.gatewayUrl}adoptTurn(e){return{nonce:e,env:{[ul.TURN_NONCE_ENV]:e,[ul.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{}}}}};qs.EdgeDataPlane=of;function Hk(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 af=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:{[ul.TURN_NONCE_ENV]:r,[ul.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{}}}}};qs.RemoteDataPlane=af});var Ni=S(K=>{"use strict";var jk=K&&K.__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]})),xk=K&&K.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Bk=K&&K.__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"&&jk(n,e,r[s]);return xk(n,e),n}})();Object.defineProperty(K,"__esModule",{value:!0});K.DataPlane=K.resolveEdgeDataPlane=K.EdgeDataPlane=K.resolveRemoteDataPlane=K.RemoteDataPlane=K.ASSERTION_HEADER=K.startDataPlaneSidecar=K.EGRESS_URL_ENV=K.startEgressBroker=K.TURN_NONCE_HEADER=K.TURN_NONCE_ENV=K.DATA_MCP_URL_ENV=K.startDataGateway=K.TURN_META_KEY=K.ConnectorHost=K.createConnectHandler=K.parseGrantKey=K.GrantStore=K.ConnectError=K.readStoredGrantConfig=K.StoredGrantProvider=K.identityProvider=K.passthroughProvider=K.resolveProvider=K.CredentialBroker=K.DEFAULT_TURN_DEADLINE_MS=K.isNonceShaped=K.hashNonce=K.TurnRegistry=void 0;K.resolveDataPlaneConfig=qk;var ia=Bk(require("path")),Fk=lo(),c_=Fd(),Vk=Wd(),lf=po(),Wk=Xt(),dl=lo();Object.defineProperty(K,"TurnRegistry",{enumerable:!0,get:function(){return dl.TurnRegistry}});Object.defineProperty(K,"hashNonce",{enumerable:!0,get:function(){return dl.hashNonce}});Object.defineProperty(K,"isNonceShaped",{enumerable:!0,get:function(){return dl.isNonceShaped}});Object.defineProperty(K,"DEFAULT_TURN_DEADLINE_MS",{enumerable:!0,get:function(){return dl.DEFAULT_TURN_DEADLINE_MS}});var fl=Fd();Object.defineProperty(K,"CredentialBroker",{enumerable:!0,get:function(){return fl.CredentialBroker}});Object.defineProperty(K,"resolveProvider",{enumerable:!0,get:function(){return fl.resolveProvider}});Object.defineProperty(K,"passthroughProvider",{enumerable:!0,get:function(){return fl.passthroughProvider}});Object.defineProperty(K,"identityProvider",{enumerable:!0,get:function(){return fl.identityProvider}});var df=na();Object.defineProperty(K,"StoredGrantProvider",{enumerable:!0,get:function(){return df.StoredGrantProvider}});Object.defineProperty(K,"readStoredGrantConfig",{enumerable:!0,get:function(){return df.readStoredGrantConfig}});Object.defineProperty(K,"ConnectError",{enumerable:!0,get:function(){return df.ConnectError}});var u_=Hd();Object.defineProperty(K,"GrantStore",{enumerable:!0,get:function(){return u_.GrantStore}});Object.defineProperty(K,"parseGrantKey",{enumerable:!0,get:function(){return u_.parseGrantKey}});var Kk=Zd();Object.defineProperty(K,"createConnectHandler",{enumerable:!0,get:function(){return Kk.createConnectHandler}});var d_=Wd();Object.defineProperty(K,"ConnectorHost",{enumerable:!0,get:function(){return d_.ConnectorHost}});Object.defineProperty(K,"TURN_META_KEY",{enumerable:!0,get:function(){return d_.TURN_META_KEY}});var pl=po();Object.defineProperty(K,"startDataGateway",{enumerable:!0,get:function(){return pl.startDataGateway}});Object.defineProperty(K,"DATA_MCP_URL_ENV",{enumerable:!0,get:function(){return pl.DATA_MCP_URL_ENV}});Object.defineProperty(K,"TURN_NONCE_ENV",{enumerable:!0,get:function(){return pl.TURN_NONCE_ENV}});Object.defineProperty(K,"TURN_NONCE_HEADER",{enumerable:!0,get:function(){return pl.TURN_NONCE_HEADER}});var f_=n_();Object.defineProperty(K,"startEgressBroker",{enumerable:!0,get:function(){return f_.startEgressBroker}});Object.defineProperty(K,"EGRESS_URL_ENV",{enumerable:!0,get:function(){return f_.EGRESS_URL_ENV}});var p_=a_();Object.defineProperty(K,"startDataPlaneSidecar",{enumerable:!0,get:function(){return p_.startDataPlaneSidecar}});Object.defineProperty(K,"ASSERTION_HEADER",{enumerable:!0,get:function(){return p_.ASSERTION_HEADER}});var gl=cf();Object.defineProperty(K,"RemoteDataPlane",{enumerable:!0,get:function(){return gl.RemoteDataPlane}});Object.defineProperty(K,"resolveRemoteDataPlane",{enumerable:!0,get:function(){return gl.resolveRemoteDataPlane}});Object.defineProperty(K,"EdgeDataPlane",{enumerable:!0,get:function(){return gl.EdgeDataPlane}});Object.defineProperty(K,"resolveEdgeDataPlane",{enumerable:!0,get:function(){return gl.resolveEdgeDataPlane}});var l_={"personal-connectors":ia.join("skills","personal-connectors","scripts","server.mjs")};function qk(t,e,n=(0,Wk.findBundledBasePromptsDir)()){let r=t?.dataPlane,s=r?.connector?.trim();if(!s)return;let i=r?.provider?.trim()||void 0;if(s.startsWith("builtin:")){let o=s.slice(8),a=l_[o];if(!a)throw new Error(`Unknown builtin connector "${o}" (known: ${Object.keys(l_).join(", ")})`);if(!n)throw new Error(`connector ${s}: this AgentHippo build ships no base-prompts. Copy the connector into the pack (${ia.dirname(a)}/server.mjs and lib.mjs) and point spec.dataPlane.connector at the copy.`);return{connectorPath:ia.join(n,a),provider:i}}return{connectorPath:ia.isAbsolute(s)?s:ia.join(e,s),provider:i}}var uf=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 Fk.TurnRegistry,s=new c_.CredentialBroker(n?.provider??(0,c_.resolveProvider)(e.provider)),i=await Vk.ConnectorHost.spawn({connectorPath:e.connectorPath,logger:n?.logger});try{let o=await(0,lf.startDataGateway)({registry:r,broker:s,connector:i,logger:n?.logger,audit:n?.audit,host:n?.gateway?.host,port:n?.gateway?.port,advertiseHost:n?.gateway?.advertiseHost});return new t(o.url,r,s,i,o)}catch(o){throw await i.close(),o}}registerTurnRaw(e,n){return this.registry.register(e,n)}registerTurn(e,n){let{nonce:r,release:s}=this.registry.register(e,n);return{nonce:r,env:{[lf.TURN_NONCE_ENV]:r,[lf.DATA_MCP_URL_ENV]:this.url},release:s}}async close(){await this.gateway.close(),await this.connector.close()}};K.DataPlane=uf});var E_=S(El=>{"use strict";Object.defineProperty(El,"__esModule",{value:!0});El.resolveLocalTurnUserId=m_;El.resolveLocalTurnScope=Jk;var g_=Ni(),h_=cf(),hl=po(),Yk=ps();function m_(t=process.env){return t.AGENTHIPPO_DATA_USER?.trim()||(0,Yk.currentCredential)()?.userId?.trim()||t.LOGNAME?.trim()||t.USER?.trim()||t.LNAME?.trim()||t.USERNAME?.trim()||void 0}var ff=new WeakMap,ml=class{mode;userId;gatewayUrl;registrar;closePlane;sessionNonce;activeTurns=0;latestRelease;constructor(e,n,r,s,i){this.mode=e,this.userId=n,this.gatewayUrl=r,this.registrar=s,this.closePlane=i}async beginTurn(e){let n=await this.registrar.registerTurn({userId:this.userId,sessionKey:e.sessionKey,renewNonce:this.sessionNonce});this.sessionNonce=n.nonce,this.latestRelease=n.release,this.activeTurns++;let r=!1;return{env:n.env,release:async()=>{if(!r&&(r=!0,this.activeTurns--,this.activeTurns<=0)){let s=this.latestRelease;this.latestRelease=void 0,await s?.()}}}}async close(){await this.closePlane()}};async function Jk(t){let e=t.env??process.env,n=i=>{let o=m_(e);if(!o)throw new Error(`${i} is configured but no acting user resolves \u2014 set AGENTHIPPO_DATA_USER (fail-closed: turns register a real identity; there is no anonymous data access)`);return o},r=ff.has(e)?ff.get(e):(0,h_.resolveRemoteDataPlane)(e);if(r){ff.set(e,r);let i=n("The data-plane sidecar"),o=new h_.RemoteDataPlane(r);return delete e.AGENTHIPPO_DATA_PLANE_TOKEN,e[hl.DATA_MCP_URL_ENV]=o.url,new ml("sidecar",i,o.url,{registerTurn:a=>o.registerTurn({...a,agent:t.agent})},async()=>{})}if(e[hl.TURN_NONCE_ENV]?.trim()&&e[hl.DATA_MCP_URL_ENV]?.trim())return console.warn("Warning: using a pre-minted session nonce from the environment (not rotated per turn, expires on the registry deadline). Set AGENTHIPPO_DATA_PLANE_CONTROL_URL + AGENTHIPPO_DATA_PLANE_TOKEN to register real per-turn identities instead."),null;let s=t.packPath?(0,g_.resolveDataPlaneConfig)(t.spec,t.packPath):void 0;if(s){let i=n("The pack's data plane (spec.dataPlane)"),o=await g_.DataPlane.start(s,{logger:t.logger,audit:t.audit});return e[hl.DATA_MCP_URL_ENV]=o.url,new ml("in-process",i,o.url,{registerTurn:async a=>o.registerTurn(a,{renewNonce:a.renewNonce})},()=>o.close())}return null}});var Ri=S(Le=>{"use strict";var Xk=Le&&Le.__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]})),zk=Le&&Le.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Qk=Le&&Le.__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"&&Xk(n,e,r[s]);return zk(n,e),n}})();Object.defineProperty(Le,"__esModule",{value:!0});Le.WARRANT_TTL_ENV=Le.DEFAULT_WARRANT_TTL_SECONDS=Le.MAX_TTL_SECONDS=void 0;Le.b64urlEncode=pf;Le.signCompactJws=__;Le.verifyCompactJws=y_;Le.timingSafeEqualString=Zk;Le.generateWarrantKeypair=e$;Le.warrantTtlFromEnv=t$;Le.mintWarrant=n$;Le.verifyWarrant=r$;Le.jwks=s$;var ws=Qk(require("node:crypto"));function pf(t){return Buffer.from(t,"utf8").toString("base64url")}function __(t,e,n){let r={alg:"ES256",typ:t.typ??"JWT",kid:t.kid},s=`${pf(JSON.stringify(r))}.${pf(JSON.stringify(e))}`,i=ws.sign("sha256",Buffer.from(s),{key:ws.createPrivateKey(n),dsaEncoding:"ieee-p1363"});return`${s}.${i.toString("base64url")}`}function y_(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 d=!1;try{d=ws.verify("sha256",Buffer.from(`${s}.${i}`),{key:ws.createPublicKey(l),dsaEncoding:"ieee-p1363"},Buffer.from(o,"base64url"))}catch{return{ok:!1,reason:"bad signature"}}return d?{ok:!0,header:a,payload:c,signingInput:`${s}.${i}`}:{ok:!1,reason:"bad signature"}}function Zk(t,e){let n=Buffer.from(t,"utf8"),r=Buffer.from(e,"utf8");return n.length!==r.length?!1:ws.timingSafeEqual(n,r)}function e$(t){let{privateKey:e,publicKey:n}=ws.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??ws.createHash("sha256").update(r).digest("hex").slice(0,16)}}Le.MAX_TTL_SECONDS=86400;Le.DEFAULT_WARRANT_TTL_SECONDS=3600;Le.WARRANT_TTL_ENV="AGENTHIPPO_WARRANT_TTL_SECONDS";function t$(t=process.env){let e=t[Le.WARRANT_TTL_ENV]?.trim();if(e===void 0||e==="")return Le.DEFAULT_WARRANT_TTL_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<=0?Le.DEFAULT_WARRANT_TTL_SECONDS:Math.min(Math.floor(n),Le.MAX_TTL_SECONDS)}function n$(t,e){let n=t.nowSeconds??Math.floor(Date.now()/1e3),r=Math.min(t.ttlSeconds??120,Le.MAX_TTL_SECONDS),s={user:t.user,pack:t.pack,packVersion:t.packVersion,sandboxId:t.sandboxId,tier:t.tier,aud:t.aud,iat:n,exp:n+r,jti:ws.randomUUID(),...t.billing==="user"?{billing:"user"}:{},...t.budgetKey?{budgetKey:t.budgetKey}:{},...t.budgetWindowSeconds!==void 0&&t.budgetWindowSeconds>0?{budgetWindowSeconds:t.budgetWindowSeconds}:{}};return __({typ:"JWT",kid:e.kid},s,e.privateKeyPem)}function r$(t,e,n){let r=y_(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 s$(t){return{keys:t.map(e=>({...ws.createPublicKey(e.publicKeyPem).export({format:"jwk"}),kid:e.kid,alg:"ES256",use:"sig"}))}}});var aa=S(le=>{"use strict";Object.defineProperty(le,"__esModule",{value:!0});le.DENY_SCOPE_ALIASES=le.DENY_MODE_ALIASES=le.STRICTEST_DENY_MODE=le.DENY_MODES=le.DENY_SCOPES=le.STRICTEST_ON_BREACH=le.ON_BREACH_ALIASES=le.ON_BREACH_ACTIONS=le.DEPRECATED_CAP_SPELLINGS=le.LEASE_CAP_ALIASES=le.LEASE_CAP_FIELDS=void 0;le.parseCapPolicy=w_;le.parseLease=a$;le.LEASE_CAP_FIELDS={maxTurnsPerSession:{kind:"positive-int"},maxSessionSeconds:{kind:"positive-int"},maxConcurrentSandboxes:{kind:"positive-int"}};le.LEASE_CAP_ALIASES={maxConcurrentCells:"maxConcurrentSandboxes"};le.DEPRECATED_CAP_SPELLINGS={maxConcurrentCells:"maxConcurrentSandboxes",AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES","destroy-cell":"destroy-sandbox","--max-concurrent-cells":"--max-concurrent-sandboxes"};le.ON_BREACH_ACTIONS={"revoke-inference":{strictness:1},"destroy-sandbox":{strictness:2}};le.ON_BREACH_ALIASES={"destroy-cell":"destroy-sandbox"};le.STRICTEST_ON_BREACH=Object.keys(le.ON_BREACH_ACTIONS).reduce((t,e)=>le.ON_BREACH_ACTIONS[t].strictness>=le.ON_BREACH_ACTIONS[e].strictness?t:e);le.DENY_SCOPES=["session","user","pack"];le.DENY_MODES={drain:{strictness:1},kill:{strictness:2}};le.STRICTEST_DENY_MODE="kill";le.DENY_MODE_ALIASES={};le.DENY_SCOPE_ALIASES={};var oa=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function i$(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 w_(t,e="caps"){if(t==null)return{ok:!0,caps:{},warnings:[]};if(!oa(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 le.LEASE_CAP_FIELDS?i:le.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=i$(`${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 le.ON_BREACH_ACTIONS?s:le.ON_BREACH_ALIASES[s];i?r.onBreach=i:(r.onBreach=le.STRICTEST_ON_BREACH,n.push(`${e}.onBreach="${s}" is not an action this build understands. Failing CLOSED to "${le.STRICTEST_ON_BREACH}" (the strictest known action). Known actions: ${Object.keys(le.ON_BREACH_ACTIONS).join(", ")}.`))}return{ok:!0,caps:r,warnings:n}}function o$(t,e){if(!oa(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=le.DENY_SCOPES.includes(r)?r:le.DENY_SCOPE_ALIASES[r];if(!s)return{ok:!1,reason:`deny[${e}].scope "${r}" is not a scope this build understands (known: ${le.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 le.DENY_MODES?i:le.DENY_MODE_ALIASES[i];o||(o=le.STRICTEST_DENY_MODE,n.push(`deny[${e}].mode="${i}" is not a mode this build understands. Failing CLOSED to "${le.STRICTEST_DENY_MODE}". Known modes: ${Object.keys(le.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 a$(t){if(!oa(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=w_(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=o$(t.deny[s],s);if(!i.ok)return{ok:!1,reason:i.reason};r.push(i.rule),e.push(...i.warnings)}n.deny=r}if(t.grants!==void 0&&t.grants!==null){let r=oa(t.grants)?t.grants.revoke:void 0;if(!Array.isArray(r))e.push("lease.grants.revoke is not an array \u2014 ignored");else{let s=[];for(let[i,o]of r.entries()){if(!oa(o)||typeof o.user!="string"||!/^[0-9a-f]{64}$/.test(o.user)||typeof o.requestedAt!="number"||!Number.isFinite(o.requestedAt)||o.service!==void 0&&o.service!=="google"&&o.service!=="bank"){e.push(`lease.grants.revoke[${i}] is malformed \u2014 ignored`);continue}s.push({user:o.user,requestedAt:o.requestedAt,...o.service?{service:o.service}:{}})}n.grants={revoke:s}}}return t.issuedAt!==void 0&&t.issuedAt!==null&&(typeof t.issuedAt=="number"&&Number.isFinite(t.issuedAt)?n.issuedAt=t.issuedAt:e.push("lease.issuedAt is not a finite number \u2014 ignored")),t.deployment!==void 0&&t.deployment!==null&&(typeof t.deployment=="string"&&t.deployment.length>0?n.deployment=t.deployment:e.push("lease.deployment is not a non-empty string \u2014 ignored")),{ok:!0,lease:n,warnings:e}}});var mo=S(j=>{"use strict";var c$=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]})),l$=j&&j.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),hf=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"&&c$(n,e,r[s]);return l$(n,e),n}})();Object.defineProperty(j,"__esModule",{value:!0});j.PACK_FULL_REVERIFY_INTERVAL_MS=j.PACK_PROBE_INTERVAL_MS=j.LEASE_JWKS_PINS_ENV=j.LEASE_JWKS_URL_ENV=j.LEASE_SIGNING_KEYS_ENV=j.ALLOW_INSECURE_TRUST_ROOT_ENV=j.PACK_JWKS_PINS_ENV=j.PACK_JWKS_URL_ENV_LEGACY=j.PACK_JWKS_URL_ENV=j.ALLOW_UNSIGNED_PACK_ENV=j.DIGEST_EXCLUDED_SEGMENTS=j.PACK_SIGNATURE_FILE=void 0;j.isDigestExcluded=yl;j.computePackDigestFromFiles=A_;j.computePackDigest=mf;j.packTreeProbe=gf;j.signPack=u$;j.readPackSignature=T_;j.verifyPack=b_;j.verifyPackFromFiles=d$;j.requireSignedPack=O_;j.resolveRequireSignedPack=p$;j.allowUnsignedPackFromEnv=g$;j.describePackRefusal=h$;j.publicKeyThumbprints=P_;j.parseJwksPins=I_;j.assertSecureTrustUrl=N_;j.loadPackTrustRoot=C_;j.loadLeaseTrustRoot=y$;j.selectLeaseSigningKeys=w$;j.checkTrustRootSeparation=S$;j.loadPackSigningKeys=T$;j.createPackVerifier=b$;var ho=hf(require("node:crypto")),Ys=hf(require("node:fs")),_l=hf(require("node:path")),ca=Ri();j.PACK_SIGNATURE_FILE="pack.sig";j.DIGEST_EXCLUDED_SEGMENTS=new Set([".git","node_modules"]);function yl(t){return t===j.PACK_SIGNATURE_FILE?!0:t.split("/").some(e=>j.DIGEST_EXCLUDED_SEGMENTS.has(e))}function S_(t){let e=ho.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 A_(t){let e=[];for(let n of t){let r=n.path.replace(/\\/g,"/");yl(r)||e.push({rel:r,body:n.content,link:n.link})}return S_(e)}function mf(t){let e=[],n=(r,s)=>{for(let i of Ys.readdirSync(r)){let o=s?`${s}/${i}`:i;if(yl(o))continue;let a=_l.join(r,i),c=Ys.lstatSync(a);c.isSymbolicLink()?e.push({rel:o,body:Buffer.from(Ys.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({rel:o,body:Ys.readFileSync(a)})}};return n(t,""),S_(e)}function gf(t){let e=[],n=(r,s)=>{let i;try{i=Ys.readdirSync(r).sort()}catch{e.push(`${s}/?unreadable`);return}for(let o of i){let a=s?`${s}/${o}`:o;if(yl(a))continue;let c=_l.join(r,o),l;try{l=Ys.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 ho.createHash("sha256").update(e.join(`
483
502
  `)).digest("hex")}function u$(t){let e=mf(t.packDir),n={pack:t.pack,packVersion:t.packVersion,digest:e,iat:t.nowSeconds??Math.floor(Date.now()/1e3)},r=(0,ca.signCompactJws)({typ:"JWT",kid:t.kid},n,t.privateKeyPem);return Ys.writeFileSync(_l.join(t.packDir,j.PACK_SIGNATURE_FILE),`${r}
484
503
  `),{signature:r,digest:e}}function T_(t){try{return Ys.readFileSync(_l.join(t,j.PACK_SIGNATURE_FILE),"utf8").trim()||void 0}catch{return}}function b_(t,e,n){return v_(t,e,n.pack,n.packVersion,()=>mf(n.packDir))}function d$(t,e,n,r,s){return v_(t,e,n,r,()=>A_(s))}function v_(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,ca.verifyCompactJws)(t,e);if(!i.ok)return i.reason==="unknown kid"?{ok:!1,kind:"unknown-key",reason:`unknown signing key ${f$(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,ca.timingSafeEqualString)(s(),o.digest)?{ok:!0,claims:o}:{ok:!1,kind:"digest-mismatch",reason:"pack contents changed after signing"}}function f$(t){try{return JSON.parse(Buffer.from(t.split(".")[0],"base64url").toString("utf8")).kid}catch{return}}function O_(t,e){return!!t||!!e}j.ALLOW_UNSIGNED_PACK_ENV="AGENTHIPPO_ALLOW_UNSIGNED_PACK";function p$(t){return O_(t.lease,t.localRequire)?!0:!t.localAllowUnsigned}function g$(t=process.env){let e=t[j.ALLOW_UNSIGNED_PACK_ENV]?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function h$(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 ${j.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)',` ${j.PACK_JWKS_URL_ENV} https URL of the JWKS document publishing your signing keys`,` ${j.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(` ${j.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 ${j.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(`
485
- `)}j.PACK_JWKS_URL_ENV="AGENTHIPPO_PACK_JWKS_URL";j.PACK_JWKS_URL_ENV_LEGACY="AGENTHIPPO_PACK_SIGNING_JWKS_URL";j.PACK_JWKS_PINS_ENV="AGENTHIPPO_PACK_JWKS_PINS";j.ALLOW_INSECURE_TRUST_ROOT_ENV="AGENTHIPPO_ALLOW_INSECURE_TRUST_ROOT";j.LEASE_SIGNING_KEYS_ENV="AGENTHIPPO_LEASE_SIGNING_KEYS";j.LEASE_JWKS_URL_ENV="AGENTHIPPO_LEASE_JWKS_URL";j.LEASE_JWKS_PINS_ENV="AGENTHIPPO_LEASE_JWKS_PINS";function I_(t){let e=ho.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:ho.createHash("sha256").update(JSON.stringify(r)).digest("base64url"),spki:ho.createHash("sha256").update(e.export({type:"spki",format:"der"})).digest("hex")}}var m$=t=>t.trim().replace(/^sha256:/i,"").toLowerCase();function P_(t){return(t??"").split(",").map(m$).filter(e=>e.length>0)}function N_(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[j.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 ${j.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 ${j.ALLOW_INSECURE_TRUST_ROOT_ENV}=1 to allow plaintext for LOCAL DEVELOPMENT ONLY.`}}var E$={label:"pack",purpose:"pack-signing",inlineEnv:"AGENTHIPPO_PACK_SIGNING_KEYS",urlEnvs:[j.PACK_JWKS_URL_ENV,j.PACK_JWKS_URL_ENV_LEGACY],pinsEnv:j.PACK_JWKS_PINS_ENV,derivedRisk:"chooses which packs this instance will run"},_$={label:"lease",purpose:"lease-signing",inlineEnv:j.LEASE_SIGNING_KEYS_ENV,urlEnvs:[j.LEASE_JWKS_URL_ENV],pinsEnv:j.LEASE_JWKS_PINS_ENV,derivedRisk:"chooses whether this instance's kill switch is ever honoured"};async function R_(t,e){let n=e.env??process.env,r=[],s=P_(n[t.pinsEnv]),i=n[t.inlineEnv]?.trim(),o=t.urlEnvs.map(f=>n[f]).find(f=>f!==void 0&&f.trim()!=="")?.trim(),a=!!i||!!o,c=(f,p,g)=>{if(s.length===0)return Object.keys(f).length===0?{status:"unavailable",keys:{},source:p,url:g,warnings:r,explicitlyConfigured:a,reason:"the trust root published no usable ES256 keys"}:{status:"configured",keys:f,source:p,url:g,warnings:r,explicitlyConfigured:a};let m={};for(let[h,w]of Object.entries(f)){let _;try{_=I_(w)}catch{r.push(`${t.label} trust root: key ${h} is unreadable and was dropped`);continue}s.some(O=>(0,ca.timingSafeEqualString)(O,_.jwk.toLowerCase())||(0,ca.timingSafeEqualString)(O,_.spki))?m[h]=w:r.push(`${t.label} trust root: key ${h} does not match any pin in ${t.pinsEnv} and was REFUSED (its thumbprints are jwk=${_.jwk} spki=${_.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 f;try{f=JSON.parse(i)}catch(p){return{status:"unavailable",keys:{},source:"inline",warnings:r,explicitlyConfigured:a,reason:`${t.inlineEnv} is set but is not valid JSON: ${p instanceof Error?p.message:String(p)}`}}return c(f,"inline")}let l=o,d=!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}`}}d=!0}if(!l)return{status:"unconfigured",keys:{},warnings:r,explicitlyConfigured:a};let u=N_(l,`the ${t.purpose} JWKS URL`,n);if(!u.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:u.reason,derivedFromLease:d,explicitlyConfigured:a};r.push(...u.warnings),d&&s.length===0&&r.push(`${t.label} trust root is derived from AGENTHIPPO_LEASE_URL (${l}) and is not pinned. Whoever can answer that origin ${t.derivedRisk}. Pin it with ${t.urlEnvs[0]} and ${t.pinsEnv}.`);try{let f=await(e.fetchImpl??fetch)(l);if(!f.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:`JWKS fetch returned HTTP ${f.status}`,derivedFromLease:d,explicitlyConfigured:a};let p=await f.json(),g=A$(p);return g.ok?{...c(g.pems,"jwks",l),derivedFromLease:d}:{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:g.reason,derivedFromLease:d,explicitlyConfigured:a}}catch(f){return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,derivedFromLease:d,explicitlyConfigured:a,reason:`JWKS fetch failed: ${f instanceof Error?f.message:String(f)}`}}}async function C_(t){return R_(E$,t)}async function y$(t){return R_(_$,t)}function w$(t,e){return t.explicitlyConfigured?{keys:t.keys,packFallback:!1}:{keys:{...e.keys,...t.keys},packFallback:!0}}function S$(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:`${j.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 ${j.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 A$(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]=ho.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 T$(t){return(await C_(t)).keys}j.PACK_PROBE_INTERVAL_MS=1e3;j.PACK_FULL_REVERIFY_INTERVAL_MS=3e4;function b$(t={}){let e=t.probeIntervalMs??j.PACK_PROBE_INTERVAL_MS,n=t.fullReverifyIntervalMs??j.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(",")}`,d=(u,f)=>{c+=1,s=l(u),i=gf(u.packDir),o=f,a=f;let p=T_(u.packDir);return r=p?b_(p,u.keys,{packDir:u.packDir,pack:u.pack,packVersion:u.packVersion}):{ok:!1,kind:"unsigned",reason:`${u.pack} is not signed (no ${j.PACK_SIGNATURE_FILE} at the pack root)`},r};return{fullVerifications:()=>c,refresh(u,f=Date.now()){return d(u,f)},verify(u,f=Date.now()){return!r||s!==l(u)||f-a>=n?d(u,f):f-o<e||(o=f,gf(u.packDir)===i)?r:d(u,f)}}}});var Eo=S(oe=>{"use strict";Object.defineProperty(oe,"__esModule",{value:!0});oe.MAX_LEASE_ENVELOPE_TTL_SECONDS=oe.LEASE_JWS_TYP=oe.LeaseDeniedError=oe.LEASE_MAX_STALENESS_ENV=oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS=oe.MIN_LEASE_POLL_SECONDS=oe.DEFAULT_LEASE_POLL_SECONDS=void 0;oe.resolveLeasePollSeconds=Ef;oe.leaseCacheSecondsFor=_f;oe.effectiveKillLatencySeconds=I$;oe.leaseMaxStalenessFromEnv=L_;oe.resolveAllowServiceTurns=P$;oe.describeServiceTurnGate=N$;oe.denyVerdict=M_;oe.resolveFollowedUsers=C$;oe.leaseIsDead=k$;oe.policyVersion=$$;oe.assertAdmitted=D$;oe.signLease=L$;oe.verifySignedLease=U_;oe.requireSignedLease=H_;oe.leaseUrlDeployment=j_;oe.createLeaseSource=G$;var v$=require("crypto"),$_=Ri(),D_=aa(),O$=mo();oe.DEFAULT_LEASE_POLL_SECONDS=30;oe.MIN_LEASE_POLL_SECONDS=5;function Ef(t){let e=typeof t=="number"&&Number.isFinite(t)?t:oe.DEFAULT_LEASE_POLL_SECONDS;return Math.max(oe.MIN_LEASE_POLL_SECONDS,Math.floor(e))}function _f(t){return Ef(t)}function I$(t){let e=Ef(t);return e+_f(e)}oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS=1440*60;oe.LEASE_MAX_STALENESS_ENV="AGENTHIPPO_LEASE_MAX_STALENESS_SECONDS";function L_(t=process.env){let e=t[oe.LEASE_MAX_STALENESS_ENV]?.trim();if(e===void 0||e==="")return oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<0?oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS:Math.floor(n)}function P$(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 N$(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 M_(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&&R$(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 G_=t=>`${t.scope}:${t.match}`;function R$(t,e,n){return n?.get(G_(t))?.has(e)??!1}function C$(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("--"),d=l>=0?a.slice(l+2):a;i.match!==a&&i.match!==d||i.user!==void 0&&i.user!==c||o.add(c)}o.size>0&&r.set(G_(i),o)}return r}function k$(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 $$(t){if(!t)return;let{expiresAt:e,issuedAt:n,...r}=t,s=i=>Array.isArray(i)?i.map(s):i&&typeof i=="object"?Object.fromEntries(Object.keys(i).sort().map(o=>[o,s(i[o])])):i;return(0,v$.createHash)("sha256").update(JSON.stringify(s(r))).digest("hex")}var Ss=class extends Error{constructor(e){super(e),this.name="LeaseDeniedError"}};oe.LeaseDeniedError=Ss;function D$(t,e){if(!t)return;let n=e.nowSeconds??Math.floor(Date.now()/1e3);if(!t.enabled)throw new Ss(`kill switch active for pack ${e.pack}${t.reason?`: ${t.reason}`:""}`);if(t.pack!==e.pack)throw new Ss(`lease is for pack ${t.pack}, not ${e.pack}`);if(t.expiresAt<=n)throw new Ss(`lease for ${e.pack} expired at ${new Date(t.expiresAt*1e3).toISOString()}`);if(t.version&&t.version!==e.version)throw new Ss(`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 Ss(`image for ${e.pack} does not match the leased digest ${t.imageDigest}`);if(e.sessionKey){let r=M_(t,{sessionKey:e.sessionKey,pack:e.pack,userHash:e.userHash,userId:e.userId,followedUsers:e.followedUsers},n);if(r.denied)throw new Ss(r.reason??"stopped by the control plane")}}oe.LEASE_JWS_TYP="agenthippo-lease+jws";oe.MAX_LEASE_ENVELOPE_TTL_SECONDS=3600;function L$(t,e,n){let r=n.nowSeconds??Math.floor(Date.now()/1e3),s=Math.min(n.ttlSeconds??300,oe.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,$_.signCompactJws)({typ:oe.LEASE_JWS_TYP,kid:e.kid},i,e.privateKeyPem)}function U_(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,$_.verifyCompactJws)(t,e,{typ:oe.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>oe.MAX_LEASE_ENVELOPE_TTL_SECONDS)return{ok:!1,reason:`lease envelope lifetime ${s.exp-s.iat}s exceeds the ${oe.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,D_.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 H_(t,e){return!!t||!!e}var k_=t=>/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(t),M$=2e4;function j_(t){if(t)try{let e=/\/lease\/([^/]+)\.json$/.exec(new URL(t).pathname);return e?decodeURIComponent(e[1]):void 0}catch{return}}function G$(t){let e=t.staticLease,n=0,r,s,i=!1,o=!1,a,c=j_(t.url),l=!1,d,u=!1,f=!1,p=!1,g=!1,m=t.cacheSeconds??_f(oe.DEFAULT_LEASE_POLL_SECONDS),h=t.maxStalenessSeconds??L_(t.env),w=t.fetchImpl??fetch,_=()=>H_(l,t.requireSignedLease),E=b=>({...e??{pack:"",expiresAt:0},enabled:!1,reason:`the control plane has not been reachable for ${b}s, past the ${h}s staleness ceiling (${oe.LEASE_MAX_STALENESS_ENV}). Refusing work rather than running on a lease that can no longer be revoked. Set ${oe.LEASE_MAX_STALENESS_ENV}=0 to accept unbounded staleness.`}),O=()=>({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."}),T=!1,L=b=>{if(T=!0,!t.persistence)return;let N;try{N=t.persistence.load()}catch(v){t.logger?.warn(`[Lease] persisted lease unreadable: ${v instanceof Error?v.message:String(v)}`);return}if(!N||typeof N.body!="string")return;typeof N.lastGoodAt=="number"&&Number.isFinite(N.lastGoodAt)&&(r=Math.min(N.lastGoodAt,b));let P=I(N.body,b);if(!P.ok){t.logger?.warn(`[Lease] persisted lease not reinstalled: ${P.reason}`);return}P.signed&&(i=!0,P.lease.requireSignedLease&&(l=!0)),e=P.lease,o=P.signed,a=void 0},A=b=>b.deployment!==void 0&&c!==void 0&&b.deployment!==c?`lease is for deployment ${b.deployment}, not ${c} (${t.url})`:void 0,I=(b,N)=>{let P=b.trim(),v,F;if(k_(P))v=P;else{try{F=JSON.parse(P)}catch(X){return{ok:!1,reason:`lease body is not JSON: ${X instanceof Error?X.message:String(X)}`}}typeof F=="string"&&k_(F.trim())?v=F.trim():F&&typeof F=="object"&&typeof F.lease=="string"&&(v=F.lease.trim())}if(v){let X=U_(v,t.signingKeys?.()??{},{instanceId:t.instanceId,minIat:d,nowSeconds:N});if(!X.ok)return{ok:!1,reason:X.reason};let te=A(X.lease);return te?{ok:!1,reason:te}:(d=X.claims.iat,{ok:!0,lease:X.lease,signed:!0})}if(_())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 B=(0,D_.parseLease)(F);if(!B.ok)return{ok:!1,reason:B.reason};for(let X of B.warnings)t.logger?.warn(`[Lease] ${X}`);let re=A(B.lease);return re?{ok:!1,reason:re}:{ok:!0,lease:B.lease,signed:!1}};return{status(b){let N=b??Math.floor(Date.now()/1e3),P=r===void 0?void 0:N-r,v=!!t.url&&e===void 0&&s!==void 0;return{signed:i,currentSigned:o,clockOffsetSeconds:a,requireSignedLease:_(),lastGoodAt:r,stalenessSeconds:P,maxStalenessSeconds:h,failClosed:v||h>0&&P!==void 0&&P>h,lastError:s}},async get(b){let N=b??Math.floor(Date.now()/1e3);if(!t.url)return e;if(!g){g=!0;let P=(0,O$.assertSecureTrustUrl)(t.url,"AGENTHIPPO_LEASE_URL",t.env??process.env);if(P.ok)for(let v of P.warnings)t.logger?.warn(`[Lease] ${v}`);else _()?t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${P.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 ${oe.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 ${P.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&&!T&&L(N),e&&N-n<m)return e;try{let P={accept:"application/json, text/plain"};for(let[re,X]of Object.entries(t.identity?.()??{}))X!==void 0&&X!==""&&(P[`x-agenthippo-${re}`]=String(X));let v=await w(t.url,{headers:P,signal:AbortSignal.timeout(M$)});if(!v.ok)throw new Error(v.status===404?`lease fetch 404 \u2014 the control plane has no deployment at ${t.url}; check AGENTHIPPO_LEASE_URL`:`lease fetch ${v.status}`);let F=typeof v.text=="function"?await v.text():JSON.stringify(await v.json()),B=I(F,N);if(!B.ok)throw new Error(B.reason);B.signed?(i=!0,B.lease.requireSignedLease&&(l=!0)):p||(p=!0,t.logger?.warn(`[Lease] running on an UNSIGNED lease. Anyone who can answer or intercept ${t.url} can lift this instance's kill switch, widen its caps and change its version pin. Have the control plane sign leases (ES256 compact JWS) and set requireSignedLease.`)),e=B.lease,o=B.signed,a=B.signed&&B.lease.issuedAt!==void 0?B.lease.issuedAt-(b??Math.ceil(Date.now()/1e3)):void 0,n=N,r=N,s=void 0,u=!1,f=!1;try{t.persistence?.save({body:F,lastGoodAt:N})}catch(re){t.logger?.warn(`[Lease] could not persist lease: ${re instanceof Error?re.message:String(re)}`)}return e}catch(P){if(s=P instanceof Error?P.message:String(P),e===void 0)return f||(f=!0,t.logger?.warn(`[Lease] NO LEASE HAS EVER BEEN INSTALLED \u2014 fetch failed (${s}) and there is no persisted or static lease to fall back on. Failing closed: turns are refused until the control plane is reachable. For air-gapped use, provide --static-lease.`)),O();t.logger?.warn(`[Lease] fetch failed, using cached lease: ${s}`),r===void 0&&(r=N);let v=N-r;return h>0&&v>h?(u||(u=!0,t.logger?.warn(`[Lease] STALENESS CEILING PASSED \u2014 no successful lease refresh for ${v}s (ceiling ${h}s). Failing closed: turns are refused until the control plane is reachable.`)),E(v)):e}}}}});var F_=S(As=>{"use strict";var U$=As&&As.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),H$=As&&As.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),j$=As&&As.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&U$(n,e,r[s]);return H$(n,e),n}})();Object.defineProperty(As,"__esModule",{value:!0});As.startGrantGovernance=V$;var x$=j$(require("os")),x_=Eo(),B_=mo(),B$=5*6e4,F$=6*36e5;async function V$(t){let e=Math.max(15,t.pollSeconds??60),n=t.env??process.env,r=await(0,B_.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}),s,i=`connector-${x$.hostname()}`,o=new Map,a=(0,x_.createLeaseSource)({url:t.leaseUrl,fetchImpl:t.fetchImpl,env:n,instanceId:i,cacheSeconds:e-1,signingKeys:()=>r.keys,identity:()=>({instance:i,role:"connector",...s?{grants:JSON.stringify(s)}:{},...t.enrollToken?{"enroll-token":t.enrollToken}:{}}),logger:t.logger}),c=(0,x_.leaseUrlDeployment)(t.leaseUrl),l=async()=>{let f;try{f=await t.provider.listGrants(),s=await t.provider.summary(f)}catch(T){t.logger?.warn(`[grants] could not count grants: ${T instanceof Error?T.message:T}`)}r.status!=="configured"&&(r=await(0,B_.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}));let p=await a.get(),g=p?.grants?.revoke??[],m=new Set(g.map(T=>T.user));for(let T of o.keys())m.has(T)||o.delete(T);if(!g.length)return;if(!a.status().currentSigned){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s) on an UNSIGNED lease \u2014 only a signed lease may revoke a user's grants`);return}if(!c||p?.deployment!==c){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s): the lease does not name deployment ${c??`(none in ${t.leaseUrl})`}`);return}let h=a.status().clockOffsetSeconds;if(h===void 0){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s) until a live lease poll measures the plane's clock`);return}let w=Date.now(),_=g.filter(T=>(o.get(T.user)?.at??0)<=w),E=new Set,O=_.map(T=>({...T,requestedAt:T.requestedAt-h}));await t.provider.applyRevocations(O,f,T=>{let L=T.result.ok?"grant_revoked_by_plane":"grant_revoke_failed";t.audit?.("control",L,{user_sha256:T.user,service:T.service,failed:T.result.failed}),t.logger?.info(`[grants] ${L}: ${T.service} for user sha256:${T.user.slice(0,12)}\u2026`),T.result.ok||E.add(T.user)});for(let T of _)if(E.has(T.user)){let L=Math.min((o.get(T.user)?.delayMs??B$/2)*2,F$);o.set(T.user,{at:w+L,delayMs:L})}else o.delete(T.user)};await l().catch(f=>t.logger?.warn(`[grants] first poll failed: ${f instanceof Error?f.message:f}`));let d,u=setInterval(()=>{d||(d=l().catch(f=>t.logger?.warn(`[grants] poll failed: ${f instanceof Error?f.message:f}`)).finally(()=>{d=void 0}))},e*1e3);return u.unref(),{tick:l,stop:()=>clearInterval(u)}}});var yf=S(wl=>{"use strict";Object.defineProperty(wl,"__esModule",{value:!0});wl.createDataPlaneAuditSink=J_;wl.dataPlaneSidecarCommand=J$;var V_=require("fs"),W$=vi(),W_=Ni(),K$=F_(),K_=Ir(),Y_=ro(),q$=Zi(),Y$=hi(),q_=bi(),Js=Xt();async function J_(t,e){let{dir:n,ephemeral:r}=(0,K_.resolveStateDir)(t),s=(0,K_.resolveAnalyticsSessionsDir)(n,r),i=!0,o;try{await V_.promises.mkdir(s,{recursive:!0}),await V_.promises.access(s)}catch(l){i=!1,o=l instanceof Error?l.message:String(l)}let a=new Y_.SessionEventWriter(s);return{audit:(l,d,u)=>{let f=typeof u.userId=="string"?u.userId:void 0,p=(0,q$.hashIdentity)(f),g=p?{...u,userId:p}:u,m=p&&l===f?p:l;a.append(m,(0,Y$.generateRequestId)(),d,e?{...g,agent:{...e,digest:null}}:g)},auditDir:s,ephemeral:r,ok:i,error:o}}async function J$(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,W$.loadAgentPack)(t.agent,t.workspace)}catch(g){console.error(`Error: ${g instanceof Error?g.message:g}`),process.exit(1);return}let r=(0,W_.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 q_.ConsoleLogger("[Sidecar]"):new q_.NoOpLogger,{audit:i,auditDir:o,ephemeral:a,ok:c,error:l}=await J_(t.stateDir,{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"});if(!c){let g=`${o}: ${l}`;if((0,Y_.evidenceRequired)()){console.error(`${Js.COLORS.red}Error: data-plane audit directory is not writable${Js.COLORS.reset} \u2014 ${g}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1);return}console.warn(`${Js.COLORS.yellow}Warning:${Js.COLORS.reset} data-plane audit directory is not writable \u2014 ${g}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set --state-dir or AGENTHIPPO_HOME to a writable path.")}let d;try{d=await(0,W_.startDataPlaneSidecar)({config:r,registerToken:e,gatewayPort:t.gatewayPort,controlPort:t.controlPort,connectPort:t.connectPort,bindHost:t.host??"0.0.0.0",logger:s,audit:i,agent:{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"}})}catch(g){console.error(`${Js.COLORS.red}Error: failed to start the data-plane sidecar:${Js.COLORS.reset} ${g instanceof Error?g.message:g}`),process.exit(1);return}console.log(`OK: Data-plane sidecar (provider=${r.provider??"passthrough"}) \u2014 connector: ${r.connectorPath}`),console.log(` gateway (engine dials, nonce-auth): ${d.gatewayUrl}`),console.log(` control (edge/serve registers, bearer): :${d.controlPort}`),d.connectPort!==void 0&&console.log(` connect (users link accounts, via edge): :${d.connectPort}`),console.log(` audit (tool_authorize / tool_deny / register events): ${o}${a?" (EPHEMERAL \u2014 lost on restart; set AGENTHIPPO_HOME or --state-dir)":""}`),console.log(" Base credentials live here only \u2014 never in the agent container."),console.log(" Edge mode (P1): give the register token to the IdP edge only; serve runs with AGENTHIPPO_DATA_PLANE_EDGE=1 and no token.");let u,f=()=>{u?.stop(),d.close().finally(()=>process.exit(0))};process.on("SIGINT",f),process.on("SIGTERM",f);let p=process.env.AGENTHIPPO_LEASE_URL?.trim();u=d.grants&&p?await(0,K$.startGrantGovernance)({provider:d.grants,leaseUrl:p,enrollToken:process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()||void 0,logger:{info:g=>console.log(g),warn:g=>console.warn(`${Js.COLORS.yellow}Warning:${Js.COLORS.reset} ${g}`)},audit:i}):void 0,u&&console.log(` grants governance: counts reported and revocations applied on the lease poll (${p})`),await new Promise(()=>{})}});var Sf=S(wf=>{"use strict";Object.defineProperty(wf,"__esModule",{value:!0});wf.resolveCliTurnScope=Z$;var X$=E_(),z$=yf(),X_=Ni(),Q$=ro(),z_=Xa(),Xs=Xt();async function Z$(t){let e=t.pack?.manifest.spec,n=t.pack?.packPath,r=!!((0,X_.resolveRemoteDataPlane)()||e&&n&&(0,X_.resolveDataPlaneConfig)(e,n)),s;if(r){let o=t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version??"0.0.0"}:void 0,a=await(0,z$.createDataPlaneAuditSink)(void 0,o);if(s=a.audit,!a.ok){let c=`${a.auditDir}: ${a.error}`;(0,Q$.evidenceRequired)()&&(console.error(`${Xs.COLORS.red}Error: data-plane audit directory is not writable${Xs.COLORS.reset} \u2014 ${c}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1)),console.warn(`${Xs.COLORS.yellow}Warning:${Xs.COLORS.reset} data-plane audit directory is not writable \u2014 ${c}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set AGENTHIPPO_HOME to a writable path.")}}let i;try{i=await(0,X$.resolveLocalTurnScope)({spec:e,packPath:n,agent:t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version}:void 0,logger:t.verbose?new z_.ConsoleLogger("[DataPlane]"):new z_.NoOpLogger,audit:s})}catch(o){console.error(`${Xs.COLORS.red}Error: failed to start the data plane:${Xs.COLORS.reset} ${o instanceof Error?o.message:o}`),process.exit(1)}return i&&!t.quiet&&console.log(`${Xs.COLORS.green}OK:${Xs.COLORS.reset} Data plane ${i.mode==="sidecar"?"SIDECAR":"(in-process)"} \u2014 gateway ${i.gatewayUrl}; acting as ${i.userId} (locally asserted; per-turn registration, session-stable nonce bytes)`),i}});var ey=S(Ts=>{"use strict";var eD=Ts&&Ts.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),tD=Ts&&Ts.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tf=Ts&&Ts.__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"&&eD(n,e,r[s]);return tD(n,e),n}})();Object.defineProperty(Ts,"__esModule",{value:!0});Ts.chatCommand=cD;var nD=Tf(require("readline")),rD=Tf(require("path")),sD=Tf(require("os")),Rr=bi(),Ci=vi(),ge=Xt(),iD=Oi(),Q_=et(),oD=br(),Z_=Bs(),aD=Sf(),Af="-".repeat(62);async function cD(t){let e=(0,Ci.getApiConfig)(),n,r="default",s,i,o,a,c=t.verbose?new Rr.ConsoleLogger("[Sync]"):new Rr.NoOpLogger;if(t.agent)try{n=await(0,Ci.loadAgentPack)(t.agent,t.workspace),r=n.manifest.metadata.name,s=t.engine||n.manifest.spec.engine;let I=["claude","codex"].includes(s)?void 0:(0,Z_.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,b=t.model||n.manifest.spec.model||I||(0,Ci.getEnvDefaultModel)()||(0,Ci.getDefaultConfig)().model;i=(0,Rr.resolveModelAlias)(b);let N=n.manifest.spec.cheapModel?.trim();o=N?(0,Rr.resolveModelAlias)(N):void 0,a=n.manifest.spec.effort?.trim()||void 0,await(0,Rr.syncPackToWorkspace)(t.workspace,n.packPath,r,s,c,(0,ge.findBundledBasePromptsDir)()),console.log(`${ge.COLORS.green}OK:${ge.COLORS.reset} Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),b!==i&&console.log(`${ge.COLORS.dim} Model: ${b} -> ${i}${ge.COLORS.reset}`),N&&N!==o&&console.log(`${ge.COLORS.dim} Cheap model: ${N} -> ${o}${ge.COLORS.reset}`)}catch(A){console.error(`${ge.COLORS.red}Error: ${A instanceof Error?A.message:A}${ge.COLORS.reset}`),process.exit(1)}else{let A=(0,Ci.getDefaultConfig)();s=t.engine||A.engine;let I=["claude","codex"].includes(s)?void 0:(0,Z_.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,b=t.model||I||(0,Ci.getEnvDefaultModel)()||A.model;i=(0,Rr.resolveModelAlias)(b),b!==i&&console.log(`${ge.COLORS.dim}Model: ${b} -> ${i}${ge.COLORS.reset}`)}if(!e.apiKey&&(s==="claude"||s==="codex")){let A=(0,ge.getLiteLLMQuickstartHintLines)();console.log(["To start a chat, set an API key and re-run the command. Example:",` ${A[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(`
486
- `)),process.exit(1)}let l=rD.join(sD.tmpdir(),`${Q_.AGENTIDE_CLI_NAME}-cli`),d=t.verbose?new Rr.ConsoleLogger("[Agent]"):new Rr.NoOpLogger,u=(0,ge.findClaudeCodePath)(),f=(0,ge.findCodexPath)(),p=(0,ge.findBundledBasePromptsDir)();if(s==="claude"&&!u){console.error(`${ge.COLORS.red}Error: Claude Code CLI not found.${ge.COLORS.reset}`);let A=(0,iD.getUnsupportedClaudePlatformHint)();A&&console.error(` ${A}`),console.error(" Install it: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),console.error(" Or use --engine codex instead"),process.exit(1)}s==="codex"&&!f&&(console.error(`${ge.COLORS.red}Error: Codex CLI not found.${ge.COLORS.reset}`),console.error(" Install it: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),console.error(" Or use --engine claude instead"),process.exit(1));let g=new Rr.AutoApprovePermissionHandler,m={fileAccess:(0,Ci.getFileAccess)(n)},h=`cli-${Date.now()}`,w=await(0,aD.resolveCliTurnScope)({pack:n,verbose:t.verbose}),_=()=>(0,Rr.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:d,freshState:!1,claudeCodeExecutablePath:u,codexExecutablePath:f,permissionHandler:g,cliEnvPatch:(0,oD.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:h,baseEnv:process.env}),dataPlane:w??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}}),E={runner:_(),sessionId:h,engine:s,model:i},O=()=>({async thinking(A){process.stdout.write(`${ge.COLORS.gray}${A}${ge.COLORS.reset}`)},async text(A){process.stdout.write(A)},async toolStart(A,I){console.log(`
487
- ${ge.COLORS.blue}Tool: ${A}${ge.COLORS.reset}`),I&&I.length<200&&t.verbose&&console.log(` ${ge.COLORS.gray}${I}${ge.COLORS.reset}`)},async toolEnd(A,I,b,N){console.log(N?` ${ge.COLORS.red}Error: ${b?.slice(0,100)}${ge.COLORS.reset}`:` ${ge.COLORS.green}OK${ge.COLORS.reset}`)},async progress(A){t.verbose&&console.log(`${ge.COLORS.yellow}Progress: ${A}${ge.COLORS.reset}`)},async error(A){console.error(`${ge.COLORS.red}Error: ${A}${ge.COLORS.reset}`)},async question(A){return{selected:[],freeText:null,declined:!0}},async done(){console.log(`
488
- `)}});console.log(""),console.log(Af),console.log(`${Q_.AGENTIDE_BRAND_NAME} Chat`),console.log(Af),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(Af),console.log("Type a message to chat. Commands: /help"),console.log("");let T=nD.createInterface({input:process.stdin,output:process.stdout}),L=()=>{T.question(`${ge.COLORS.cyan}> ${ge.COLORS.reset}`,async A=>{let I=A.trim();if(!I){L();return}if(I.startsWith("/")){if(!await lD(I,E,T,{createRunner:_,claudeCodePath:u,codexPath:f,turnScope:w}))return;L();return}try{let b=await E.runner.run({engineId:E.engine,modelId:E.model,message:I,workspaceRoot:t.workspace,sessionId:E.sessionId,emitter:O(),permissions:m});!b.success&&b.error&&console.error(`
504
+ `)}j.PACK_JWKS_URL_ENV="AGENTHIPPO_PACK_JWKS_URL";j.PACK_JWKS_URL_ENV_LEGACY="AGENTHIPPO_PACK_SIGNING_JWKS_URL";j.PACK_JWKS_PINS_ENV="AGENTHIPPO_PACK_JWKS_PINS";j.ALLOW_INSECURE_TRUST_ROOT_ENV="AGENTHIPPO_ALLOW_INSECURE_TRUST_ROOT";j.LEASE_SIGNING_KEYS_ENV="AGENTHIPPO_LEASE_SIGNING_KEYS";j.LEASE_JWKS_URL_ENV="AGENTHIPPO_LEASE_JWKS_URL";j.LEASE_JWKS_PINS_ENV="AGENTHIPPO_LEASE_JWKS_PINS";function P_(t){let e=ho.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:ho.createHash("sha256").update(JSON.stringify(r)).digest("base64url"),spki:ho.createHash("sha256").update(e.export({type:"spki",format:"der"})).digest("hex")}}var m$=t=>t.trim().replace(/^sha256:/i,"").toLowerCase();function I_(t){return(t??"").split(",").map(m$).filter(e=>e.length>0)}function N_(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[j.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 ${j.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 ${j.ALLOW_INSECURE_TRUST_ROOT_ENV}=1 to allow plaintext for LOCAL DEVELOPMENT ONLY.`}}var E$={label:"pack",purpose:"pack-signing",inlineEnv:"AGENTHIPPO_PACK_SIGNING_KEYS",urlEnvs:[j.PACK_JWKS_URL_ENV,j.PACK_JWKS_URL_ENV_LEGACY],pinsEnv:j.PACK_JWKS_PINS_ENV,derivedRisk:"chooses which packs this instance will run"},_$={label:"lease",purpose:"lease-signing",inlineEnv:j.LEASE_SIGNING_KEYS_ENV,urlEnvs:[j.LEASE_JWKS_URL_ENV],pinsEnv:j.LEASE_JWKS_PINS_ENV,derivedRisk:"chooses whether this instance's kill switch is ever honoured"};async function R_(t,e){let n=e.env??process.env,r=[],s=I_(n[t.pinsEnv]),i=n[t.inlineEnv]?.trim(),o=t.urlEnvs.map(f=>n[f]).find(f=>f!==void 0&&f.trim()!=="")?.trim(),a=!!i||!!o,c=(f,p,g)=>{if(s.length===0)return Object.keys(f).length===0?{status:"unavailable",keys:{},source:p,url:g,warnings:r,explicitlyConfigured:a,reason:"the trust root published no usable ES256 keys"}:{status:"configured",keys:f,source:p,url:g,warnings:r,explicitlyConfigured:a};let m={};for(let[h,w]of Object.entries(f)){let _;try{_=P_(w)}catch{r.push(`${t.label} trust root: key ${h} is unreadable and was dropped`);continue}s.some(O=>(0,ca.timingSafeEqualString)(O,_.jwk.toLowerCase())||(0,ca.timingSafeEqualString)(O,_.spki))?m[h]=w:r.push(`${t.label} trust root: key ${h} does not match any pin in ${t.pinsEnv} and was REFUSED (its thumbprints are jwk=${_.jwk} spki=${_.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 f;try{f=JSON.parse(i)}catch(p){return{status:"unavailable",keys:{},source:"inline",warnings:r,explicitlyConfigured:a,reason:`${t.inlineEnv} is set but is not valid JSON: ${p instanceof Error?p.message:String(p)}`}}return c(f,"inline")}let l=o,d=!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}`}}d=!0}if(!l)return{status:"unconfigured",keys:{},warnings:r,explicitlyConfigured:a};let u=N_(l,`the ${t.purpose} JWKS URL`,n);if(!u.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:u.reason,derivedFromLease:d,explicitlyConfigured:a};r.push(...u.warnings),d&&s.length===0&&r.push(`${t.label} trust root is derived from AGENTHIPPO_LEASE_URL (${l}) and is not pinned. Whoever can answer that origin ${t.derivedRisk}. Pin it with ${t.urlEnvs[0]} and ${t.pinsEnv}.`);try{let f=await(e.fetchImpl??fetch)(l);if(!f.ok)return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:`JWKS fetch returned HTTP ${f.status}`,derivedFromLease:d,explicitlyConfigured:a};let p=await f.json(),g=A$(p);return g.ok?{...c(g.pems,"jwks",l),derivedFromLease:d}:{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,reason:g.reason,derivedFromLease:d,explicitlyConfigured:a}}catch(f){return{status:"unavailable",keys:{},source:"jwks",url:l,warnings:r,derivedFromLease:d,explicitlyConfigured:a,reason:`JWKS fetch failed: ${f instanceof Error?f.message:String(f)}`}}}async function C_(t){return R_(E$,t)}async function y$(t){return R_(_$,t)}function w$(t,e){return t.explicitlyConfigured?{keys:t.keys,packFallback:!1}:{keys:{...e.keys,...t.keys},packFallback:!0}}function S$(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:`${j.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 ${j.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 A$(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]=ho.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 T$(t){return(await C_(t)).keys}j.PACK_PROBE_INTERVAL_MS=1e3;j.PACK_FULL_REVERIFY_INTERVAL_MS=3e4;function b$(t={}){let e=t.probeIntervalMs??j.PACK_PROBE_INTERVAL_MS,n=t.fullReverifyIntervalMs??j.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(",")}`,d=(u,f)=>{c+=1,s=l(u),i=gf(u.packDir),o=f,a=f;let p=T_(u.packDir);return r=p?b_(p,u.keys,{packDir:u.packDir,pack:u.pack,packVersion:u.packVersion}):{ok:!1,kind:"unsigned",reason:`${u.pack} is not signed (no ${j.PACK_SIGNATURE_FILE} at the pack root)`},r};return{fullVerifications:()=>c,refresh(u,f=Date.now()){return d(u,f)},verify(u,f=Date.now()){return!r||s!==l(u)||f-a>=n?d(u,f):f-o<e||(o=f,gf(u.packDir)===i)?r:d(u,f)}}}});var Eo=S(oe=>{"use strict";Object.defineProperty(oe,"__esModule",{value:!0});oe.MAX_LEASE_ENVELOPE_TTL_SECONDS=oe.LEASE_JWS_TYP=oe.LeaseDeniedError=oe.LEASE_MAX_STALENESS_ENV=oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS=oe.MIN_LEASE_POLL_SECONDS=oe.DEFAULT_LEASE_POLL_SECONDS=void 0;oe.resolveLeasePollSeconds=Ef;oe.leaseCacheSecondsFor=_f;oe.effectiveKillLatencySeconds=P$;oe.leaseMaxStalenessFromEnv=L_;oe.resolveAllowServiceTurns=I$;oe.describeServiceTurnGate=N$;oe.denyVerdict=M_;oe.resolveFollowedUsers=C$;oe.leaseIsDead=k$;oe.policyVersion=$$;oe.assertAdmitted=D$;oe.signLease=L$;oe.verifySignedLease=U_;oe.requireSignedLease=H_;oe.leaseUrlDeployment=j_;oe.createLeaseSource=G$;var v$=require("crypto"),$_=Ri(),D_=aa(),O$=mo();oe.DEFAULT_LEASE_POLL_SECONDS=30;oe.MIN_LEASE_POLL_SECONDS=5;function Ef(t){let e=typeof t=="number"&&Number.isFinite(t)?t:oe.DEFAULT_LEASE_POLL_SECONDS;return Math.max(oe.MIN_LEASE_POLL_SECONDS,Math.floor(e))}function _f(t){return Ef(t)}function P$(t){let e=Ef(t);return e+_f(e)}oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS=1440*60;oe.LEASE_MAX_STALENESS_ENV="AGENTHIPPO_LEASE_MAX_STALENESS_SECONDS";function L_(t=process.env){let e=t[oe.LEASE_MAX_STALENESS_ENV]?.trim();if(e===void 0||e==="")return oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS;let n=Number(e);return!Number.isFinite(n)||n<0?oe.DEFAULT_LEASE_MAX_STALENESS_SECONDS:Math.floor(n)}function I$(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 N$(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 M_(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&&R$(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 G_=t=>`${t.scope}:${t.match}`;function R$(t,e,n){return n?.get(G_(t))?.has(e)??!1}function C$(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("--"),d=l>=0?a.slice(l+2):a;i.match!==a&&i.match!==d||i.user!==void 0&&i.user!==c||o.add(c)}o.size>0&&r.set(G_(i),o)}return r}function k$(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 $$(t){if(!t)return;let{expiresAt:e,issuedAt:n,...r}=t,s=i=>Array.isArray(i)?i.map(s):i&&typeof i=="object"?Object.fromEntries(Object.keys(i).sort().map(o=>[o,s(i[o])])):i;return(0,v$.createHash)("sha256").update(JSON.stringify(s(r))).digest("hex")}var Ss=class extends Error{constructor(e){super(e),this.name="LeaseDeniedError"}};oe.LeaseDeniedError=Ss;function D$(t,e){if(!t)return;let n=e.nowSeconds??Math.floor(Date.now()/1e3);if(!t.enabled)throw new Ss(`kill switch active for pack ${e.pack}${t.reason?`: ${t.reason}`:""}`);if(t.pack!==e.pack)throw new Ss(`lease is for pack ${t.pack}, not ${e.pack}`);if(t.expiresAt<=n)throw new Ss(`lease for ${e.pack} expired at ${new Date(t.expiresAt*1e3).toISOString()}`);if(t.version&&t.version!==e.version)throw new Ss(`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 Ss(`image for ${e.pack} does not match the leased digest ${t.imageDigest}`);if(e.sessionKey){let r=M_(t,{sessionKey:e.sessionKey,pack:e.pack,userHash:e.userHash,userId:e.userId,followedUsers:e.followedUsers},n);if(r.denied)throw new Ss(r.reason??"stopped by the control plane")}}oe.LEASE_JWS_TYP="agenthippo-lease+jws";oe.MAX_LEASE_ENVELOPE_TTL_SECONDS=3600;function L$(t,e,n){let r=n.nowSeconds??Math.floor(Date.now()/1e3),s=Math.min(n.ttlSeconds??300,oe.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,$_.signCompactJws)({typ:oe.LEASE_JWS_TYP,kid:e.kid},i,e.privateKeyPem)}function U_(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,$_.verifyCompactJws)(t,e,{typ:oe.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>oe.MAX_LEASE_ENVELOPE_TTL_SECONDS)return{ok:!1,reason:`lease envelope lifetime ${s.exp-s.iat}s exceeds the ${oe.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,D_.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 H_(t,e){return!!t||!!e}var k_=t=>/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(t),M$=2e4;function j_(t){if(t)try{let e=/\/lease\/([^/]+)\.json$/.exec(new URL(t).pathname);return e?decodeURIComponent(e[1]):void 0}catch{return}}function G$(t){let e=t.staticLease,n=0,r,s,i=!1,o=!1,a,c=j_(t.url),l=!1,d,u=!1,f=!1,p=!1,g=!1,m=t.cacheSeconds??_f(oe.DEFAULT_LEASE_POLL_SECONDS),h=t.maxStalenessSeconds??L_(t.env),w=t.fetchImpl??fetch,_=()=>H_(l,t.requireSignedLease),E=b=>({...e??{pack:"",expiresAt:0},enabled:!1,reason:`the control plane has not been reachable for ${b}s, past the ${h}s staleness ceiling (${oe.LEASE_MAX_STALENESS_ENV}). Refusing work rather than running on a lease that can no longer be revoked. Set ${oe.LEASE_MAX_STALENESS_ENV}=0 to accept unbounded staleness.`}),O=()=>({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."}),T=!1,L=b=>{if(T=!0,!t.persistence)return;let N;try{N=t.persistence.load()}catch(v){t.logger?.warn(`[Lease] persisted lease unreadable: ${v instanceof Error?v.message:String(v)}`);return}if(!N||typeof N.body!="string")return;typeof N.lastGoodAt=="number"&&Number.isFinite(N.lastGoodAt)&&(r=Math.min(N.lastGoodAt,b));let I=P(N.body,b);if(!I.ok){t.logger?.warn(`[Lease] persisted lease not reinstalled: ${I.reason}`);return}I.signed&&(i=!0,I.lease.requireSignedLease&&(l=!0)),e=I.lease,o=I.signed,a=void 0},A=b=>b.deployment!==void 0&&c!==void 0&&b.deployment!==c?`lease is for deployment ${b.deployment}, not ${c} (${t.url})`:void 0,P=(b,N)=>{let I=b.trim(),v,F;if(k_(I))v=I;else{try{F=JSON.parse(I)}catch(X){return{ok:!1,reason:`lease body is not JSON: ${X instanceof Error?X.message:String(X)}`}}typeof F=="string"&&k_(F.trim())?v=F.trim():F&&typeof F=="object"&&typeof F.lease=="string"&&(v=F.lease.trim())}if(v){let X=U_(v,t.signingKeys?.()??{},{instanceId:t.instanceId,minIat:d,nowSeconds:N});if(!X.ok)return{ok:!1,reason:X.reason};let te=A(X.lease);return te?{ok:!1,reason:te}:(d=X.claims.iat,{ok:!0,lease:X.lease,signed:!0})}if(_())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 B=(0,D_.parseLease)(F);if(!B.ok)return{ok:!1,reason:B.reason};for(let X of B.warnings)t.logger?.warn(`[Lease] ${X}`);let re=A(B.lease);return re?{ok:!1,reason:re}:{ok:!0,lease:B.lease,signed:!1}};return{status(b){let N=b??Math.floor(Date.now()/1e3),I=r===void 0?void 0:N-r,v=!!t.url&&e===void 0&&s!==void 0;return{signed:i,currentSigned:o,clockOffsetSeconds:a,requireSignedLease:_(),lastGoodAt:r,stalenessSeconds:I,maxStalenessSeconds:h,failClosed:v||h>0&&I!==void 0&&I>h,lastError:s}},async get(b){let N=b??Math.floor(Date.now()/1e3);if(!t.url)return e;if(!g){g=!0;let I=(0,O$.assertSecureTrustUrl)(t.url,"AGENTHIPPO_LEASE_URL",t.env??process.env);if(I.ok)for(let v of I.warnings)t.logger?.warn(`[Lease] ${v}`);else _()?t.logger?.warn(`[Lease] INSECURE LEASE CHANNEL \u2014 ${I.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 ${oe.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 ${I.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&&!T&&L(N),e&&N-n<m)return e;try{let I={accept:"application/json, text/plain"};for(let[re,X]of Object.entries(t.identity?.()??{}))X!==void 0&&X!==""&&(I[`x-agenthippo-${re}`]=String(X));let v=await w(t.url,{headers:I,signal:AbortSignal.timeout(M$)});if(!v.ok)throw new Error(v.status===404?`lease fetch 404 \u2014 the control plane has no deployment at ${t.url}; check AGENTHIPPO_LEASE_URL`:`lease fetch ${v.status}`);let F=typeof v.text=="function"?await v.text():JSON.stringify(await v.json()),B=P(F,N);if(!B.ok)throw new Error(B.reason);B.signed?(i=!0,B.lease.requireSignedLease&&(l=!0)):p||(p=!0,t.logger?.warn(`[Lease] running on an UNSIGNED lease. Anyone who can answer or intercept ${t.url} can lift this instance's kill switch, widen its caps and change its version pin. Have the control plane sign leases (ES256 compact JWS) and set requireSignedLease.`)),e=B.lease,o=B.signed,a=B.signed&&B.lease.issuedAt!==void 0?B.lease.issuedAt-(b??Math.ceil(Date.now()/1e3)):void 0,n=N,r=N,s=void 0,u=!1,f=!1;try{t.persistence?.save({body:F,lastGoodAt:N})}catch(re){t.logger?.warn(`[Lease] could not persist lease: ${re instanceof Error?re.message:String(re)}`)}return e}catch(I){if(s=I instanceof Error?I.message:String(I),e===void 0)return f||(f=!0,t.logger?.warn(`[Lease] NO LEASE HAS EVER BEEN INSTALLED \u2014 fetch failed (${s}) and there is no persisted or static lease to fall back on. Failing closed: turns are refused until the control plane is reachable. For air-gapped use, provide --static-lease.`)),O();t.logger?.warn(`[Lease] fetch failed, using cached lease: ${s}`),r===void 0&&(r=N);let v=N-r;return h>0&&v>h?(u||(u=!0,t.logger?.warn(`[Lease] STALENESS CEILING PASSED \u2014 no successful lease refresh for ${v}s (ceiling ${h}s). Failing closed: turns are refused until the control plane is reachable.`)),E(v)):e}}}}});var F_=S(As=>{"use strict";var U$=As&&As.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),H$=As&&As.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),j$=As&&As.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&U$(n,e,r[s]);return H$(n,e),n}})();Object.defineProperty(As,"__esModule",{value:!0});As.startGrantGovernance=V$;var x$=j$(require("os")),x_=Eo(),B_=mo(),B$=5*6e4,F$=6*36e5;async function V$(t){let e=Math.max(15,t.pollSeconds??60),n=t.env??process.env,r=await(0,B_.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}),s,i=`connector-${x$.hostname()}`,o=new Map,a=(0,x_.createLeaseSource)({url:t.leaseUrl,fetchImpl:t.fetchImpl,env:n,instanceId:i,cacheSeconds:e-1,signingKeys:()=>r.keys,identity:()=>({instance:i,role:"connector",...s?{grants:JSON.stringify(s)}:{},...t.enrollToken?{"enroll-token":t.enrollToken}:{}}),logger:t.logger}),c=(0,x_.leaseUrlDeployment)(t.leaseUrl),l=async()=>{let f;try{f=await t.provider.listGrants(),s=await t.provider.summary(f)}catch(T){t.logger?.warn(`[grants] could not count grants: ${T instanceof Error?T.message:T}`)}r.status!=="configured"&&(r=await(0,B_.loadLeaseTrustRoot)({env:n,leaseUrl:t.leaseUrl,fetchImpl:t.fetchImpl}));let p=await a.get(),g=p?.grants?.revoke??[],m=new Set(g.map(T=>T.user));for(let T of o.keys())m.has(T)||o.delete(T);if(!g.length)return;if(!a.status().currentSigned){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s) on an UNSIGNED lease \u2014 only a signed lease may revoke a user's grants`);return}if(!c||p?.deployment!==c){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s): the lease does not name deployment ${c??`(none in ${t.leaseUrl})`}`);return}let h=a.status().clockOffsetSeconds;if(h===void 0){t.logger?.warn(`[grants] ignoring ${g.length} revocation(s) until a live lease poll measures the plane's clock`);return}let w=Date.now(),_=g.filter(T=>(o.get(T.user)?.at??0)<=w),E=new Set,O=_.map(T=>({...T,requestedAt:T.requestedAt-h}));await t.provider.applyRevocations(O,f,T=>{let L=T.result.ok?"grant_revoked_by_plane":"grant_revoke_failed";t.audit?.("control",L,{user_sha256:T.user,service:T.service,failed:T.result.failed}),t.logger?.info(`[grants] ${L}: ${T.service} for user sha256:${T.user.slice(0,12)}\u2026`),T.result.ok||E.add(T.user)});for(let T of _)if(E.has(T.user)){let L=Math.min((o.get(T.user)?.delayMs??B$/2)*2,F$);o.set(T.user,{at:w+L,delayMs:L})}else o.delete(T.user)};await l().catch(f=>t.logger?.warn(`[grants] first poll failed: ${f instanceof Error?f.message:f}`));let d,u=setInterval(()=>{d||(d=l().catch(f=>t.logger?.warn(`[grants] poll failed: ${f instanceof Error?f.message:f}`)).finally(()=>{d=void 0}))},e*1e3);return u.unref(),{tick:l,stop:()=>clearInterval(u)}}});var yf=S(wl=>{"use strict";Object.defineProperty(wl,"__esModule",{value:!0});wl.createDataPlaneAuditSink=J_;wl.dataPlaneSidecarCommand=J$;var V_=require("fs"),W$=vi(),W_=Ni(),K$=F_(),K_=Pr(),Y_=ro(),q$=Zi(),Y$=hi(),q_=bi(),Js=Xt();async function J_(t,e){let{dir:n,ephemeral:r}=(0,K_.resolveStateDir)(t),s=(0,K_.resolveAnalyticsSessionsDir)(n,r),i=!0,o;try{await V_.promises.mkdir(s,{recursive:!0}),await V_.promises.access(s)}catch(l){i=!1,o=l instanceof Error?l.message:String(l)}let a=new Y_.SessionEventWriter(s);return{audit:(l,d,u)=>{let f=typeof u.userId=="string"?u.userId:void 0,p=(0,q$.hashIdentity)(f),g=p?{...u,userId:p}:u,m=p&&l===f?p:l;a.append(m,(0,Y$.generateRequestId)(),d,e?{...g,agent:{...e,digest:null}}:g)},auditDir:s,ephemeral:r,ok:i,error:o}}async function J$(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,W$.loadAgentPack)(t.agent,t.workspace)}catch(g){console.error(`Error: ${g instanceof Error?g.message:g}`),process.exit(1);return}let r=(0,W_.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 q_.ConsoleLogger("[Sidecar]"):new q_.NoOpLogger,{audit:i,auditDir:o,ephemeral:a,ok:c,error:l}=await J_(t.stateDir,{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"});if(!c){let g=`${o}: ${l}`;if((0,Y_.evidenceRequired)()){console.error(`${Js.COLORS.red}Error: data-plane audit directory is not writable${Js.COLORS.reset} \u2014 ${g}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1);return}console.warn(`${Js.COLORS.yellow}Warning:${Js.COLORS.reset} data-plane audit directory is not writable \u2014 ${g}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set --state-dir or AGENTHIPPO_HOME to a writable path.")}let d;try{d=await(0,W_.startDataPlaneSidecar)({config:r,registerToken:e,gatewayPort:t.gatewayPort,controlPort:t.controlPort,connectPort:t.connectPort,bindHost:t.host??"0.0.0.0",logger:s,audit:i,agent:{pack:n.manifest.metadata.name,version:n.manifest.metadata.version??"0.0.0"}})}catch(g){console.error(`${Js.COLORS.red}Error: failed to start the data-plane sidecar:${Js.COLORS.reset} ${g instanceof Error?g.message:g}`),process.exit(1);return}console.log(`OK: Data-plane sidecar (provider=${r.provider??"passthrough"}) \u2014 connector: ${r.connectorPath}`),console.log(` gateway (engine dials, nonce-auth): ${d.gatewayUrl}`),console.log(` control (edge/serve registers, bearer): :${d.controlPort}`),d.connectPort!==void 0&&console.log(` connect (users link accounts, via edge): :${d.connectPort}`),console.log(` audit (tool_authorize / tool_deny / register events): ${o}${a?" (EPHEMERAL \u2014 lost on restart; set AGENTHIPPO_HOME or --state-dir)":""}`),console.log(" Base credentials live here only \u2014 never in the agent container."),console.log(" Edge mode (P1): give the register token to the IdP edge only; serve runs with AGENTHIPPO_DATA_PLANE_EDGE=1 and no token.");let u,f=()=>{u?.stop(),d.close().finally(()=>process.exit(0))};process.on("SIGINT",f),process.on("SIGTERM",f);let p=process.env.AGENTHIPPO_LEASE_URL?.trim();u=d.grants&&p?await(0,K$.startGrantGovernance)({provider:d.grants,leaseUrl:p,enrollToken:process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()||void 0,logger:{info:g=>console.log(g),warn:g=>console.warn(`${Js.COLORS.yellow}Warning:${Js.COLORS.reset} ${g}`)},audit:i}):void 0,u&&console.log(` grants governance: counts reported and revocations applied on the lease poll (${p})`),await new Promise(()=>{})}});var Sf=S(wf=>{"use strict";Object.defineProperty(wf,"__esModule",{value:!0});wf.resolveCliTurnScope=Z$;var X$=E_(),z$=yf(),X_=Ni(),Q$=ro(),z_=Xa(),Xs=Xt();async function Z$(t){let e=t.pack?.manifest.spec,n=t.pack?.packPath,r=!!((0,X_.resolveRemoteDataPlane)()||e&&n&&(0,X_.resolveDataPlaneConfig)(e,n)),s;if(r){let o=t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version??"0.0.0"}:void 0,a=await(0,z$.createDataPlaneAuditSink)(void 0,o);if(s=a.audit,!a.ok){let c=`${a.auditDir}: ${a.error}`;(0,Q$.evidenceRequired)()&&(console.error(`${Xs.COLORS.red}Error: data-plane audit directory is not writable${Xs.COLORS.reset} \u2014 ${c}`),console.error("AGENTHIPPO_EVIDENCE_REQUIRED is set, so refusing to run an unauditable data plane. Unset it to downgrade this to a warning."),process.exit(1)),console.warn(`${Xs.COLORS.yellow}Warning:${Xs.COLORS.reset} data-plane audit directory is not writable \u2014 ${c}`),console.warn(" Tool authorizations and denials will NOT be recorded. Set AGENTHIPPO_HOME to a writable path.")}}let i;try{i=await(0,X$.resolveLocalTurnScope)({spec:e,packPath:n,agent:t.pack?{pack:t.pack.manifest.metadata.name,version:t.pack.manifest.metadata.version}:void 0,logger:t.verbose?new z_.ConsoleLogger("[DataPlane]"):new z_.NoOpLogger,audit:s})}catch(o){console.error(`${Xs.COLORS.red}Error: failed to start the data plane:${Xs.COLORS.reset} ${o instanceof Error?o.message:o}`),process.exit(1)}return i&&!t.quiet&&console.log(`${Xs.COLORS.green}OK:${Xs.COLORS.reset} Data plane ${i.mode==="sidecar"?"SIDECAR":"(in-process)"} \u2014 gateway ${i.gatewayUrl}; acting as ${i.userId} (locally asserted; per-turn registration, session-stable nonce bytes)`),i}});var ey=S(Ts=>{"use strict";var eD=Ts&&Ts.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),tD=Ts&&Ts.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Tf=Ts&&Ts.__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"&&eD(n,e,r[s]);return tD(n,e),n}})();Object.defineProperty(Ts,"__esModule",{value:!0});Ts.chatCommand=cD;var nD=Tf(require("readline")),rD=Tf(require("path")),sD=Tf(require("os")),Rr=bi(),Ci=vi(),ge=Xt(),iD=Oi(),Q_=et(),oD=br(),Z_=Bs(),aD=Sf(),Af="-".repeat(62);async function cD(t){let e=(0,Ci.getApiConfig)(),n,r="default",s,i,o,a,c=t.verbose?new Rr.ConsoleLogger("[Sync]"):new Rr.NoOpLogger;if(t.agent)try{n=await(0,Ci.loadAgentPack)(t.agent,t.workspace),r=n.manifest.metadata.name,s=t.engine||n.manifest.spec.engine;let P=["claude","codex"].includes(s)?void 0:(0,Z_.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,b=t.model||n.manifest.spec.model||P||(0,Ci.getEnvDefaultModel)()||(0,Ci.getDefaultConfig)().model;i=(0,Rr.resolveModelAlias)(b);let N=n.manifest.spec.cheapModel?.trim();o=N?(0,Rr.resolveModelAlias)(N):void 0,a=n.manifest.spec.effort?.trim()||void 0,await(0,Rr.syncPackToWorkspace)(t.workspace,n.packPath,r,s,c,(0,ge.findBundledBasePromptsDir)()),console.log(`${ge.COLORS.green}OK:${ge.COLORS.reset} Loaded agent: ${n.manifest.metadata.name} v${n.manifest.metadata.version}`),b!==i&&console.log(`${ge.COLORS.dim} Model: ${b} -> ${i}${ge.COLORS.reset}`),N&&N!==o&&console.log(`${ge.COLORS.dim} Cheap model: ${N} -> ${o}${ge.COLORS.reset}`)}catch(A){console.error(`${ge.COLORS.red}Error: ${A instanceof Error?A.message:A}${ge.COLORS.reset}`),process.exit(1)}else{let A=(0,Ci.getDefaultConfig)();s=t.engine||A.engine;let P=["claude","codex"].includes(s)?void 0:(0,Z_.tryResolveCustomEngineManifest)(t.workspace,s)?.model?.defaultModel,b=t.model||P||(0,Ci.getEnvDefaultModel)()||A.model;i=(0,Rr.resolveModelAlias)(b),b!==i&&console.log(`${ge.COLORS.dim}Model: ${b} -> ${i}${ge.COLORS.reset}`)}if(!e.apiKey&&(s==="claude"||s==="codex")){let A=(0,ge.getLiteLLMQuickstartHintLines)();console.log(["To start a chat, set an API key and re-run the command. Example:",` ${A[1]}`,"","Other options:"," AGENTHIPPO_LITELLM_API_KEY=your_key AGENTHIPPO_LITELLM_BASE_URL=https://... dist/agenthippo chat"," LITELLM_API_KEY=your_key LITELLM_BASE_URL=https://... dist/agenthippo chat"," ANTHROPIC_API_KEY=your_key dist/agenthippo chat"," OPENAI_API_KEY=your_key dist/agenthippo chat"].join(`
505
+ `)),process.exit(1)}let l=rD.join(sD.tmpdir(),`${Q_.AGENTIDE_CLI_NAME}-cli`),d=t.verbose?new Rr.ConsoleLogger("[Agent]"):new Rr.NoOpLogger,u=(0,ge.findClaudeCodePath)(),f=(0,ge.findCodexPath)(),p=(0,ge.findBundledBasePromptsDir)();if(s==="claude"&&!u){console.error(`${ge.COLORS.red}Error: Claude Code CLI not found.${ge.COLORS.reset}`);let A=(0,iD.getUnsupportedClaudePlatformHint)();A&&console.error(` ${A}`),console.error(" Install it: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),console.error(" Or use --engine codex instead"),process.exit(1)}s==="codex"&&!f&&(console.error(`${ge.COLORS.red}Error: Codex CLI not found.${ge.COLORS.reset}`),console.error(" Install it: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),console.error(" Or use --engine claude instead"),process.exit(1));let g=new Rr.AutoApprovePermissionHandler,m={fileAccess:(0,Ci.getFileAccess)(n)},h=`cli-${Date.now()}`,w=await(0,aD.resolveCliTurnScope)({pack:n,verbose:t.verbose}),_=()=>(0,Rr.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:d,freshState:!1,claudeCodeExecutablePath:u,codexExecutablePath:f,permissionHandler:g,cliEnvPatch:(0,oD.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:h,baseEnv:process.env}),dataPlane:w??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}}),E={runner:_(),sessionId:h,engine:s,model:i},O=()=>({async thinking(A){process.stdout.write(`${ge.COLORS.gray}${A}${ge.COLORS.reset}`)},async text(A){process.stdout.write(A)},async toolStart(A,P){console.log(`
506
+ ${ge.COLORS.blue}Tool: ${A}${ge.COLORS.reset}`),P&&P.length<200&&t.verbose&&console.log(` ${ge.COLORS.gray}${P}${ge.COLORS.reset}`)},async toolEnd(A,P,b,N){console.log(N?` ${ge.COLORS.red}Error: ${b?.slice(0,100)}${ge.COLORS.reset}`:` ${ge.COLORS.green}OK${ge.COLORS.reset}`)},async progress(A){t.verbose&&console.log(`${ge.COLORS.yellow}Progress: ${A}${ge.COLORS.reset}`)},async error(A){console.error(`${ge.COLORS.red}Error: ${A}${ge.COLORS.reset}`)},async question(A){return{selected:[],freeText:null,declined:!0}},async done(){console.log(`
507
+ `)}});console.log(""),console.log(Af),console.log(`${Q_.AGENTIDE_BRAND_NAME} Chat`),console.log(Af),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(Af),console.log("Type a message to chat. Commands: /help"),console.log("");let T=nD.createInterface({input:process.stdin,output:process.stdout}),L=()=>{T.question(`${ge.COLORS.cyan}> ${ge.COLORS.reset}`,async A=>{let P=A.trim();if(!P){L();return}if(P.startsWith("/")){if(!await lD(P,E,T,{createRunner:_,claudeCodePath:u,codexPath:f,turnScope:w}))return;L();return}try{let b=await E.runner.run({engineId:E.engine,modelId:E.model,message:P,workspaceRoot:t.workspace,sessionId:E.sessionId,emitter:O(),permissions:m});!b.success&&b.error&&console.error(`
489
508
  ${ge.COLORS.red}Error: ${b.error}${ge.COLORS.reset}
490
509
  `)}catch(b){console.error(`
491
510
  ${ge.COLORS.red}Error: ${b instanceof Error?b.message:b}${ge.COLORS.reset}
@@ -504,7 +523,7 @@ ${O}
504
523
  \`\`\``}catch{t.json?console.log(JSON.stringify({error:`Failed to read file: ${t.file}`})):console.error(`Error: Failed to read file: ${t.file}`),process.exit(1)}let d=ty.join(pD.tmpdir(),"agenthippo-cli"),u=t.verbose?new Kr.ConsoleLogger("[Agent]"):new Kr.NoOpLogger,f=(0,qr.findClaudeCodePath)(),p=(0,qr.findCodexPath)(),g=(0,qr.findBundledBasePromptsDir)();if(s==="claude"&&!f){let E=(0,gD.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(`${qr.COLORS.red}Error: Claude Code CLI not found.${qr.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"&&!p&&(t.json?console.log(JSON.stringify({error:"Codex CLI not found. Install: npm install -g @openai/codex"})):(console.error(`${qr.COLORS.red}Error: Codex CLI not found.${qr.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH, or use --engine claude")),process.exit(1));let m=new Kr.AutoApprovePermissionHandler,h={fileAccess:(0,ki.getFileAccess)(n)},w=await(0,mD.resolveCliTurnScope)({pack:n,verbose:t.verbose,quiet:t.json}),_=(0,Kr.createHeadlessRunner)({storagePath:d,packId:r,packVersion:n?.manifest.metadata.version,bundledPromptsDir:g,apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey,logger:u,freshState:!t.sessionId?.trim(),permissionHandler:m,claudeCodeExecutablePath:f,codexExecutablePath:p,cliEnvPatch:(0,hD.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspace,agentId:r,chatSessionId:t.sessionId,baseEnv:process.env}),dataPlane:w??void 0,engineSettings:{...o?{claudeCheapModel:o}:{},...a?{effort:a}:{}}});try{let E=await _.run({engineId:s,modelId:i,message:l,workspaceRoot:t.workspace,sessionId:t.sessionId,permissions:h});t.json?(t.outputMode==="agent-run"?console.log(JSON.stringify({text: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{_.dispose();try{await w?.close()}catch{}}}});var vf=S(Yr=>{"use strict";Object.defineProperty(Yr,"__esModule",{value:!0});Yr.isTerminalFrame=_D;Yr.isTaggedEvent=yD;Yr.encodeRunnerFrame=wD;Yr.encodeClientFrame=SD;Yr.parseRunnerFrame=AD;Yr.parseClientFrame=TD;Yr.splitFrames=bD;Yr.toWireOptions=vD;function _D(t){return"type"in t&&(t.type==="result"||t.type==="failed")}function yD(t){return"event"in t}function wD(t){return`${JSON.stringify(t)}
505
524
  `}function SD(t){return`${JSON.stringify(t)}
506
525
  `}function AD(t){let e=iy(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"&&sy.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"&&sy.has(n))return e}function TD(t){let e=iy(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 sy=new Set(["text","thinking","toolStart","toolEnd","progress","error","done","nativeSessionId","probe"]);function iy(t){let e;try{e=JSON.parse(t)}catch{return}if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function bD(t){let e=t.split(`
507
- `),n=e.pop()??"";return{lines:e.filter(r=>r.trim().length>0),rest:n}}function vD(t,e){let{apiKey:n,...r}=t;return{...r,...e.baseUrl?{baseUrl:e.baseUrl}:{},...e.modelToken?{modelToken:e.modelToken}:{}}}});var ay=S(Sl=>{"use strict";Object.defineProperty(Sl,"__esModule",{value:!0});Sl.RemoteEngine=void 0;var oy=Mc(),la=vf(),Of=class{id;displayName;channel;model;logger;onActivity;pending=new Map;buffer="";seq=0;wired=!1;peerDemux=!1;constructor(e){this.id=e.id,this.displayName=e.displayName,this.channel=e.channel,this.model=e.model??{},this.logger=e.logger,this.onActivity=e.onActivity}async stream(e,n,r,s,i){this.wire();let o=`r${++this.seq}`,a=new Promise((l,d)=>{this.pending.set(o,{emitter:r,resolve:l,reject:d,chain:Promise.resolve()})}),c=()=>{this.send({type:"abort",id:o})};i&&(i.aborted?c():i.addEventListener("abort",c,{once:!0}));try{let l=this.model.mintToken?await this.model.mintToken()??this.model.modelToken:this.model.modelToken;this.onActivity?.(),this.send({type:"run",id:o,message:e,options:(0,la.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,la.splitFrames)(this.buffer);this.buffer=r;for(let s of n){let i=(0,la.parseRunnerFrame)(s);if(!i){this.logger?.warn("[RemoteEngine] dropped malformed runner frame");continue}this.onActivity?.(),this.dispatch(i)}}),this.channel.closed?.then(()=>this.failAll(new Error("sandbox channel closed")),e=>this.failAll(e instanceof Error?e:new Error(String(e)))))}dispatch(e){if((0,la.isTaggedEvent)(e)){this.enqueue(this.pending.get(e.id),n=>(0,oy.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,oy.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,la.encodeClientFrame)(e))}};Sl.RemoteEngine=Of});var uy=S(If=>{"use strict";Object.defineProperty(If,"__esModule",{value:!0});If.createSandboxRunner=ND;var OD=ay(),ID=qn(),PD=ps();function ND(t){let e=new Map,n=new Map,r=new Map,s=1e4,i=(u,f)=>{if(r.size>=s&&!r.has(u)){let p=r.keys().next();p.done||r.delete(p.value)}r.set(u,f)},o=u=>r.get(u)??u,a=async(u,f)=>{await t.admit?.({sandboxKey:u,sessionKey:f});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 OD.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,onActivity:()=>t.driver.touch?.(p)}),w={handle:p,engine:h,dead:!1,sessionKeys:new Set([f]),queue:Promise.resolve()},_=E=>{w.dead=!0;let O=e.get(u)===w;O&&e.delete(u);let T=E instanceof Error?`: ${E.message}`:"";t.logger?.info(`[Sandbox] ${p.id} closed${T}; ${u} will rehydrate on next message`),O&&t.driver.destroy(p).catch(()=>{})};return m.closed?.then(()=>_(),_),e.set(u,w),t.logger?.info(`[Sandbox] created ${p.id} for ${u} (tier ${p.tier})`),w},c=(u,f)=>{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,f).finally(()=>{n.delete(u)});return n.set(u,m),m},l=async(u,f)=>{if(u.engine.supportsDemux())return f(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 f(u)}finally{g()}};return{run:async u=>{let f=u.sessionId??"default",p=u.sandboxKey??f,g=E=>(E.sessionKeys.add(f),i(f,p),E),m={text:"",thinking:"",toolCalls:[]},h=RD(u.emitter,m),w=()=>m.text===""&&m.thinking===""&&m.toolCalls.length===0,_=async E=>{await E.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,ID.engineHomeUserKey)((0,PD.currentCredential)()?.userId),turnEnv:u.turnEnv,gatewaySessionKey:u.gatewaySessionKey},h,t.runtime,u.signal)};try{let E=g(await c(p,f));try{await l(E,_)}catch(O){let T=cy(O);if(!/channel closed/i.test(T)||!w())throw O;e.get(p)===E&&e.delete(p),t.logger?.info(`[Sandbox] session ${f} lost its sandbox mid-turn; recreating and retrying once`),await l(g(await c(p,f)),_)}return{success:!0,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls}}catch(E){return{success:!1,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls,error:cy(E)}}},dispose(){for(let[u,f]of e)t.driver.destroy(f.handle).catch(()=>{}),e.delete(u)},sandboxes:()=>[...e.entries()].map(([u,f])=>({sandboxKey:u,sandboxId:f.handle.id,tier:f.handle.tier,sessionKeys:[...f.sessionKeys]})),async destroySession(u){let f=o(u),p=e.get(f);p&&(e.delete(f),await t.driver.destroy(p.handle),t.logger?.info(`[Sandbox] destroyed ${p.handle.id} (${f}${ly(p,u)})`))},async revokeRoute(u,f){let p=o(u),g=e.get(p);g&&(await t.driver.revoke(g.handle,f),f==="all"&&e.delete(p),t.logger?.info(`[Sandbox] revoked ${f} on ${g.handle.id} (${p}${ly(g,u)})`))}}}function RD(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 cy(t){return t instanceof Error?t.message:String(t)}function ly(t,e){let n=[...t.sessionKeys].filter(r=>r!==e);return n.length===0?"":`, also ending ${n.length}: ${n.join(", ")}`}});var Rf=S(dn=>{"use strict";var CD=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]})),kD=dn&&dn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),dy=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"&&CD(n,e,r[s]);return kD(n,e),n}})();Object.defineProperty(dn,"__esModule",{value:!0});dn.CURRENT_LINK=void 0;dn.safeJoin=fy;dn.promoteCurrent=Nf;dn.reconcilePinnedPack=$D;dn.readDirAsFiles=py;var xt=dy(require("node:fs")),vs=dy(require("node:path")),Pf=mo();dn.CURRENT_LINK="current";function fy(t,e){if(vs.isAbsolute(e))return;let n=vs.resolve(t,e),r=t.endsWith(vs.sep)?t:t+vs.sep;return n.startsWith(r)?n:void 0}function Nf(t,e){let n=vs.join(t,dn.CURRENT_LINK),r=`${n}.swap-${process.pid}-${Date.now()}`;return xt.symlinkSync(e,r),xt.renameSync(r,n),n}async function $D(t){let{pack:e,pinnedVersion:n,packsRoot:r,logger:s}=t,i=vs.join(r,n);if(xt.mkdirSync(r,{recursive:!0}),xt.existsSync(i)){let c=DD(i,e,n,t.publicKeysByKid);if(c.ok)return Nf(r,i),{ok:!0,packDir:i,version:n,alreadyPresent:!0};s?.warn(`[Pack] cached ${e}@${n} failed verification (${c.reason}); re-fetching`),xt.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=vs.join(r,`.staging-${n}-${process.pid}-${Date.now()}`);try{xt.mkdirSync(a,{recursive:!0});for(let l of o){let d=fy(a,l.path);if(!d)return xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: entry escapes the pack root (${l.path})`};if(l.link)return xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: symlink entries are not accepted from the store (${l.path})`};xt.mkdirSync(vs.dirname(d),{recursive:!0}),xt.writeFileSync(d,l.content)}let c=gy(o,e,n,t.publicKeysByKid);return c.ok?(xt.renameSync(a,i),Nf(r,i),s?.info(`[Pack] converged to ${e}@${n} (signature verified)`),{ok:!0,packDir:i,version:n,alreadyPresent:!1}):(xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:c.reason})}catch(c){return xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`staging failed: ${c instanceof Error?c.message:String(c)}`}}}function py(t){let e=[],n=(r,s)=>{for(let i of xt.readdirSync(r)){let o=s?`${s}/${i}`:i;if(Pf.DIGEST_EXCLUDED_SEGMENTS.has(i))continue;let a=vs.join(r,i),c=xt.lstatSync(a);c.isSymbolicLink()?e.push({path:o,content:Buffer.from(xt.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({path:o,content:xt.readFileSync(a)})}};return n(t,""),e}function gy(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,"/")===Pf.PACK_SIGNATURE_FILE);if(!s)return{ok:!1,reason:`${e}@${n} is not signed`};let i=s.content.toString("utf8").trim(),o=(0,Pf.verifyPackFromFiles)(i,r,e,n,t);return o.ok?{ok:!0}:{ok:!1,reason:o.reason}}function DD(t,e,n,r){return gy(py(t),e,n,r)}});var Al=S(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=hy;ye.parseStoreUrl=LD;ye.formatStoreUrl=MD;ye.isStoreUrl=GD;ye.getStorePath=my;ye.getStoreIndexUrl=UD;ye.getTagsApiUrl=HD;ye.isForkOfStoreRepo=jD;ye.formatStorePullRequestError=xD;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 hy(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,d=o===e&&a===n;return{owner:o,repo:a.replace(/\.git$/,""),ref:c,path:l,isStore:d}}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 LD(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 MD(t){let n=`store://${my(t.type)}/${t.slug}`;return t.version&&(n+=`@v${t.version}`),n}function GD(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=hy(t,e,n);if(s.isStore&&s.path)return/^(agent-packs|skills|mcp|engines|spotlight|spotlight-views)\//.test(s.path)}catch{}return!1}function my(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 UD(t=ye.DEFAULT_STORE_OWNER,e=ye.DEFAULT_STORE_REPO){return`https://${t}.github.io/${e}/store-index.json`}function HD(t=ye.DEFAULT_STORE_OWNER,e=ye.DEFAULT_STORE_REPO){return`https://api.github.com/repos/${t}/${e}/git/refs/tags`}function jD(t,e,n){if(!t.fork)return!1;let r=`${e}/${n}`.toLowerCase();return(t.parentFullName??"").toLowerCase()===r}function xD(t,e,n,r){try{let s=JSON.parse(t),i=[s.message,...s.errors?.map(o=>o.message)??[]].filter(Boolean).join(" ");if(i.includes("no history in common")){let o=r?`https://github.com/${r}/${n}`:`your fork of ${e}/${n}`;return`Cannot open pull request: your fork has no shared git history with ${e}/${n}.
526
+ `),n=e.pop()??"";return{lines:e.filter(r=>r.trim().length>0),rest:n}}function vD(t,e){let{apiKey:n,...r}=t;return{...r,...e.baseUrl?{baseUrl:e.baseUrl}:{},...e.modelToken?{modelToken:e.modelToken}:{}}}});var ay=S(Sl=>{"use strict";Object.defineProperty(Sl,"__esModule",{value:!0});Sl.RemoteEngine=void 0;var oy=Mc(),la=vf(),Of=class{id;displayName;channel;model;logger;onActivity;pending=new Map;buffer="";seq=0;wired=!1;peerDemux=!1;constructor(e){this.id=e.id,this.displayName=e.displayName,this.channel=e.channel,this.model=e.model??{},this.logger=e.logger,this.onActivity=e.onActivity}async stream(e,n,r,s,i){this.wire();let o=`r${++this.seq}`,a=new Promise((l,d)=>{this.pending.set(o,{emitter:r,resolve:l,reject:d,chain:Promise.resolve()})}),c=()=>{this.send({type:"abort",id:o})};i&&(i.aborted?c():i.addEventListener("abort",c,{once:!0}));try{let l=this.model.mintToken?await this.model.mintToken()??this.model.modelToken:this.model.modelToken;this.onActivity?.(),this.send({type:"run",id:o,message:e,options:(0,la.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,la.splitFrames)(this.buffer);this.buffer=r;for(let s of n){let i=(0,la.parseRunnerFrame)(s);if(!i){this.logger?.warn("[RemoteEngine] dropped malformed runner frame");continue}this.onActivity?.(),this.dispatch(i)}}),this.channel.closed?.then(()=>this.failAll(new Error("sandbox channel closed")),e=>this.failAll(e instanceof Error?e:new Error(String(e)))))}dispatch(e){if((0,la.isTaggedEvent)(e)){this.enqueue(this.pending.get(e.id),n=>(0,oy.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,oy.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,la.encodeClientFrame)(e))}};Sl.RemoteEngine=Of});var uy=S(Pf=>{"use strict";Object.defineProperty(Pf,"__esModule",{value:!0});Pf.createSandboxRunner=ND;var OD=ay(),PD=qn(),ID=ps();function ND(t){let e=new Map,n=new Map,r=new Map,s=1e4,i=(u,f)=>{if(r.size>=s&&!r.has(u)){let p=r.keys().next();p.done||r.delete(p.value)}r.set(u,f)},o=u=>r.get(u)??u,a=async(u,f)=>{await t.admit?.({sandboxKey:u,sessionKey:f});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 OD.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,onActivity:()=>t.driver.touch?.(p)}),w={handle:p,engine:h,dead:!1,sessionKeys:new Set([f]),queue:Promise.resolve()},_=E=>{w.dead=!0;let O=e.get(u)===w;O&&e.delete(u);let T=E instanceof Error?`: ${E.message}`:"";t.logger?.info(`[Sandbox] ${p.id} closed${T}; ${u} will rehydrate on next message`),O&&t.driver.destroy(p).catch(()=>{})};return m.closed?.then(()=>_(),_),e.set(u,w),t.logger?.info(`[Sandbox] created ${p.id} for ${u} (tier ${p.tier})`),w},c=(u,f)=>{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,f).finally(()=>{n.delete(u)});return n.set(u,m),m},l=async(u,f)=>{if(u.engine.supportsDemux())return f(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 f(u)}finally{g()}};return{run:async u=>{let f=u.sessionId??"default",p=u.sandboxKey??f,g=E=>(E.sessionKeys.add(f),i(f,p),E),m={text:"",thinking:"",toolCalls:[]},h=RD(u.emitter,m),w=()=>m.text===""&&m.thinking===""&&m.toolCalls.length===0,_=async E=>{await E.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,PD.engineHomeUserKey)((0,ID.currentCredential)()?.userId),turnEnv:u.turnEnv,gatewaySessionKey:u.gatewaySessionKey},h,t.runtime,u.signal)};try{let E=g(await c(p,f));try{await l(E,_)}catch(O){let T=cy(O);if(!/channel closed/i.test(T)||!w())throw O;e.get(p)===E&&e.delete(p),t.logger?.info(`[Sandbox] session ${f} lost its sandbox mid-turn; recreating and retrying once`),await l(g(await c(p,f)),_)}return{success:!0,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls}}catch(E){return{success:!1,text:m.text,thinking:m.thinking,toolCalls:m.toolCalls,error:cy(E)}}},dispose(){for(let[u,f]of e)t.driver.destroy(f.handle).catch(()=>{}),e.delete(u)},sandboxes:()=>[...e.entries()].map(([u,f])=>({sandboxKey:u,sandboxId:f.handle.id,tier:f.handle.tier,sessionKeys:[...f.sessionKeys]})),async destroySession(u){let f=o(u),p=e.get(f);p&&(e.delete(f),await t.driver.destroy(p.handle),t.logger?.info(`[Sandbox] destroyed ${p.handle.id} (${f}${ly(p,u)})`))},async revokeRoute(u,f){let p=o(u),g=e.get(p);g&&(await t.driver.revoke(g.handle,f),f==="all"&&e.delete(p),t.logger?.info(`[Sandbox] revoked ${f} on ${g.handle.id} (${p}${ly(g,u)})`))}}}function RD(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 cy(t){return t instanceof Error?t.message:String(t)}function ly(t,e){let n=[...t.sessionKeys].filter(r=>r!==e);return n.length===0?"":`, also ending ${n.length}: ${n.join(", ")}`}});var Rf=S(dn=>{"use strict";var CD=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]})),kD=dn&&dn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),dy=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"&&CD(n,e,r[s]);return kD(n,e),n}})();Object.defineProperty(dn,"__esModule",{value:!0});dn.CURRENT_LINK=void 0;dn.safeJoin=fy;dn.promoteCurrent=Nf;dn.reconcilePinnedPack=$D;dn.readDirAsFiles=py;var xt=dy(require("node:fs")),vs=dy(require("node:path")),If=mo();dn.CURRENT_LINK="current";function fy(t,e){if(vs.isAbsolute(e))return;let n=vs.resolve(t,e),r=t.endsWith(vs.sep)?t:t+vs.sep;return n.startsWith(r)?n:void 0}function Nf(t,e){let n=vs.join(t,dn.CURRENT_LINK),r=`${n}.swap-${process.pid}-${Date.now()}`;return xt.symlinkSync(e,r),xt.renameSync(r,n),n}async function $D(t){let{pack:e,pinnedVersion:n,packsRoot:r,logger:s}=t,i=vs.join(r,n);if(xt.mkdirSync(r,{recursive:!0}),xt.existsSync(i)){let c=DD(i,e,n,t.publicKeysByKid);if(c.ok)return Nf(r,i),{ok:!0,packDir:i,version:n,alreadyPresent:!0};s?.warn(`[Pack] cached ${e}@${n} failed verification (${c.reason}); re-fetching`),xt.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=vs.join(r,`.staging-${n}-${process.pid}-${Date.now()}`);try{xt.mkdirSync(a,{recursive:!0});for(let l of o){let d=fy(a,l.path);if(!d)return xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: entry escapes the pack root (${l.path})`};if(l.link)return xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`refusing artifact: symlink entries are not accepted from the store (${l.path})`};xt.mkdirSync(vs.dirname(d),{recursive:!0}),xt.writeFileSync(d,l.content)}let c=gy(o,e,n,t.publicKeysByKid);return c.ok?(xt.renameSync(a,i),Nf(r,i),s?.info(`[Pack] converged to ${e}@${n} (signature verified)`),{ok:!0,packDir:i,version:n,alreadyPresent:!1}):(xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:c.reason})}catch(c){return xt.rmSync(a,{recursive:!0,force:!0}),{ok:!1,reason:`staging failed: ${c instanceof Error?c.message:String(c)}`}}}function py(t){let e=[],n=(r,s)=>{for(let i of xt.readdirSync(r)){let o=s?`${s}/${i}`:i;if(If.DIGEST_EXCLUDED_SEGMENTS.has(i))continue;let a=vs.join(r,i),c=xt.lstatSync(a);c.isSymbolicLink()?e.push({path:o,content:Buffer.from(xt.readlinkSync(a)),link:!0}):c.isDirectory()?n(a,o):c.isFile()&&e.push({path:o,content:xt.readFileSync(a)})}};return n(t,""),e}function gy(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,"/")===If.PACK_SIGNATURE_FILE);if(!s)return{ok:!1,reason:`${e}@${n} is not signed`};let i=s.content.toString("utf8").trim(),o=(0,If.verifyPackFromFiles)(i,r,e,n,t);return o.ok?{ok:!0}:{ok:!1,reason:o.reason}}function DD(t,e,n,r){return gy(py(t),e,n,r)}});var Al=S(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=hy;ye.parseStoreUrl=LD;ye.formatStoreUrl=MD;ye.isStoreUrl=GD;ye.getStorePath=my;ye.getStoreIndexUrl=UD;ye.getTagsApiUrl=HD;ye.isForkOfStoreRepo=jD;ye.formatStorePullRequestError=xD;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 hy(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,d=o===e&&a===n;return{owner:o,repo:a.replace(/\.git$/,""),ref:c,path:l,isStore:d}}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 LD(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 MD(t){let n=`store://${my(t.type)}/${t.slug}`;return t.version&&(n+=`@v${t.version}`),n}function GD(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=hy(t,e,n);if(s.isStore&&s.path)return/^(agent-packs|skills|mcp|engines|spotlight|spotlight-views)\//.test(s.path)}catch{}return!1}function my(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 UD(t=ye.DEFAULT_STORE_OWNER,e=ye.DEFAULT_STORE_REPO){return`https://${t}.github.io/${e}/store-index.json`}function HD(t=ye.DEFAULT_STORE_OWNER,e=ye.DEFAULT_STORE_REPO){return`https://api.github.com/repos/${t}/${e}/git/refs/tags`}function jD(t,e,n){if(!t.fork)return!1;let r=`${e}/${n}`.toLowerCase();return(t.parentFullName??"").toLowerCase()===r}function xD(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}.
508
527
 
509
528
  Open ${o} on GitHub, use "Sync fork" \u2192 "Update branch", then publish again.
510
529
  If sync is unavailable, delete or rename the fork so AgentIDE can create a fresh fork of the store.`}return i?`Failed to create PR: ${i}`:`Failed to create PR: ${t}`}catch{return`Failed to create PR: ${t}`}}});var $f=S(Cr=>{"use strict";var BD=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]})),FD=Cr&&Cr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),kf=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"&&BD(n,e,r[s]);return FD(n,e),n}})();Object.defineProperty(Cr,"__esModule",{value:!0});Cr.LocalRegistry=void 0;Cr.getRegistry=WD;var ua=kf(require("fs")),Ey=kf(require("path")),VD=kf(require("os"));function _y(){return{packs:{},skills:{},mcp:{}}}var Tl=class{data=null;registryPath;constructor(e,n){this.registryPath=e||Ey.join(VD.homedir(),".agentide","registry.json")}ensureDir(){let e=Ey.dirname(this.registryPath);ua.existsSync(e)||ua.mkdirSync(e,{recursive:!0})}load(){if(this.data)return this.data;if(ua.existsSync(this.registryPath))try{let e=ua.readFileSync(this.registryPath,"utf-8");this.data=JSON.parse(e)}catch{this.data=_y()}else this.data=_y();return this.data}save(){this.data&&(this.ensureDir(),ua.writeFileSync(this.registryPath,JSON.stringify(this.data,null,2)))}async registerPack(e){let n=this.load();n.packs[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,githubOwner:e.github?.owner,githubRepo:e.github?.repo,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,stars:e.stats.stars,updatedAt:Date.now()},this.save()}async getPack(e){return this.load().packs[e]||null}async listPacks(){let e=this.load();return Object.values(e.packs).sort((n,r)=>r.installs-n.installs)}async trackPackInstall(e){let r=this.load().packs[e];r&&(r.installs+=1,r.updatedAt=Date.now(),this.save())}async registerSkill(e){let n=this.load(),s=n.skills[e.slug]?.installedTo||[];e.agentPackId&&!s.includes(e.agentPackId)&&(s=[...s,e.agentPackId]),n.skills[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,githubOwner:e.github?.owner,githubRepo:e.github?.repo,githubPath:e.github?.path,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,updatedAt:Date.now(),installedTo:s},this.save()}async getSkill(e){return this.load().skills[e]||null}async listSkills(){let e=this.load();return Object.values(e.skills).sort((n,r)=>r.installs-n.installs)}async registerMcp(e){let n=this.load(),s=n.mcp[e.slug]?.installedTo||[];e.agentPackId&&!s.includes(e.agentPackId)&&(s=[...s,e.agentPackId]),n.mcp[e.slug]={slug:e.slug,displayName:e.displayName,description:e.description,transport:e.transport,githubOwner:e.github?.owner,githubRepo:e.github?.repo,npmPackage:e.npmPackage,latestVersion:e.latestVersion,tags:e.tags,installs:e.stats.installs,updatedAt:Date.now(),installedTo:s},this.save()}async getMcp(e){return this.load().mcp[e]||null}async listMcp(){let e=this.load();return Object.values(e.mcp).sort((n,r)=>r.installs-n.installs)}async isSkillInstalledTo(e,n){return(await this.getSkill(e))?.installedTo?.includes(n)??!1}async isMcpInstalledTo(e,n){return(await this.getMcp(e))?.installedTo?.includes(n)??!1}async unregisterSkillFromPack(e,n){let s=this.load().skills[e];s&&s.installedTo&&(s.installedTo=s.installedTo.filter(i=>i!==n),s.updatedAt=Date.now(),this.save())}async unregisterMcpFromPack(e,n){let s=this.load().mcp[e];s&&s.installedTo&&(s.installedTo=s.installedTo.filter(i=>i!==n),s.updatedAt=Date.now(),this.save())}async search(e,n){let r=n?.types||["pack","skill","mcp"],s=n?.limit||20,i=[],a=e.toLowerCase().split(/\s+/).filter(l=>l.length>0),c=(l,d)=>{let u=`${l.slug} ${l.displayName} ${l.description||""} ${l.tags.join(" ")}`.toLowerCase(),f=0;for(let p of a)u.includes(p)&&(f+=10);return f===0?0:f+d/100};if(r.includes("pack")){let l=await this.listPacks();for(let d of l){let u=c(d,d.installs);u>0&&i.push({type:"pack",slug:d.slug,displayName:d.displayName,description:d.description,score:u,data:d})}}if(r.includes("skill")){let l=await this.listSkills();for(let d of l){let u=c(d,d.installs);u>0&&i.push({type:"skill",slug:d.slug,displayName:d.displayName,description:d.description,score:u,data:d})}}if(r.includes("mcp")){let l=await this.listMcp();for(let d of l){let u=c(d,d.installs);u>0&&i.push({type:"mcp",slug:d.slug,displayName:d.displayName,description:d.description,score:u,data:d})}}return i.sort((l,d)=>d.score-l.score).slice(0,s)}};Cr.LocalRegistry=Tl;var Cf=null;function WD(t){return Cf||(Cf=new Tl(void 0,t)),Cf}});var Df=S((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=on(),branding_1=et(),github_1=Wo(),shared_1=Al(),shared_2=Al();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=$f();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],d=parseInt(c,8)||0,u=t.subarray(n+512,n+512+d),f=512+Math.ceil(d/512)*512;if(l===120||l===103){let g=u.toString("utf-8").match(/\d+ path=([^\n]+)\n/);g&&(r=g[1]),n+=f;continue}if(l===76){r=s(u),n+=f;continue}let p=r??(a?`${a}/${o}`:o);r=void 0,p&&(l===0||l===48)&&e.set(p,Buffer.from(u)),n+=f}return e}async function downloadFromStore(t,e){let{type:n,slug:r,version:s,includePrerelease:i}=t,o=(0,shared_1.getStorePath)(n),a;if(s==="main"||s==="latest")a=exports.STORE_CONFIG.defaultBranch,e&&(0,utils_1.logInfo)(e,`[Store] Using ${a} branch (latest)`);else if(s)a=`${o}/${r}/v${s.replace(/^v/,"")}`;else{let h=await getLatestStoreVersion(n,r,i);h?(a=h.tagName,e&&(0,utils_1.logInfo)(e,`[Store] Using latest version: ${h.version}`)):(a=exports.STORE_CONFIG.defaultBranch,e&&(0,utils_1.logInfo)(e,`[Store] No version tags found, using ${a} branch`))}e&&(0,utils_1.logInfo)(e,`[Store] Downloading ${n}/${r} at ${a}`);let c=encodeURIComponent(a),l=`https://api.github.com/repos/${exports.STORE_CONFIG.owner}/${exports.STORE_CONFIG.repo}/tarball/${c}`,d=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json"},redirect:"follow"});if(!d.ok){if(d.status===401||d.status===403||d.status===404||d.status===429){e&&(0,utils_1.logInfo)(e,"[Store] Requires authentication, signing in...");let h=await(0,github_1.getGitHubToken)();d=await fetch(l,{headers:{"User-Agent":"AgentIDE",Accept:"application/vnd.github.v3+json",Authorization:`Bearer ${h}`},redirect:"follow"})}if(!d.ok)throw new Error(`Version ${s||"latest"} not found for ${n} "${r}"`)}let u=Buffer.from(await d.arrayBuffer()),f=(0,zlib_1.gunzipSync)(u),p=parseTar(f),g=`${o}/${r}/`,m=[];for(let[h,w]of p){let _=h.indexOf("/");if(_===-1)continue;let E=h.slice(_+1);if(E.startsWith(g)){let O=E.slice(g.length);O&&(m.push({path:O,content:w}),e&&(0,utils_1.logInfo)(e,`[Store] \u2193 ${O}`))}}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()),d=(0,zlib_1.gunzipSync)(l),u=parseTar(d),f="";for(let m of u.keys())if(m.includes("/")){f=m.split("/")[0]+"/";break}let p=i?`${f}${i}/`:f,g=[];for(let[m,h]of u)if(m.startsWith(p)){let w=m.slice(p.length);w&&!w.endsWith("/")&&g.push({path:w,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}.
@@ -527,33 +546,33 @@ ${o||"No changelog provided."}
527
546
 
528
547
  ---
529
548
  *Submitted via AgentIDE*
530
- `,w=await createPullRequest(p,`[${n}] Add ${r} v${s}`,h,g);return e&&(0,utils_1.logInfo)(e,`[Store] OK Created PR: ${w.url}`),{prUrl:w.url,prNumber:w.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 bl=S(Ke=>{"use strict";Object.defineProperty(Ke,"__esModule",{value:!0});Ke.CapMeter=Ke.CAP_ENV_ALIASES=Ke.parseCapPolicy=Ke.STRICTEST_ON_BREACH=Ke.ON_BREACH_ALIASES=Ke.ON_BREACH_ACTIONS=Ke.LEASE_CAP_FIELDS=Ke.LEASE_CAP_ALIASES=Ke.DEPRECATED_CAP_SPELLINGS=void 0;Ke.resolveOnBreach=yy;Ke.mergeCaps=qD;Ke.capsAreUnbounded=YD;Ke.capsFromEnv=JD;var _o=aa(),$i=aa();Object.defineProperty(Ke,"DEPRECATED_CAP_SPELLINGS",{enumerable:!0,get:function(){return $i.DEPRECATED_CAP_SPELLINGS}});Object.defineProperty(Ke,"LEASE_CAP_ALIASES",{enumerable:!0,get:function(){return $i.LEASE_CAP_ALIASES}});Object.defineProperty(Ke,"LEASE_CAP_FIELDS",{enumerable:!0,get:function(){return $i.LEASE_CAP_FIELDS}});Object.defineProperty(Ke,"ON_BREACH_ACTIONS",{enumerable:!0,get:function(){return $i.ON_BREACH_ACTIONS}});Object.defineProperty(Ke,"ON_BREACH_ALIASES",{enumerable:!0,get:function(){return $i.ON_BREACH_ALIASES}});Object.defineProperty(Ke,"STRICTEST_ON_BREACH",{enumerable:!0,get:function(){return $i.STRICTEST_ON_BREACH}});Object.defineProperty(Ke,"parseCapPolicy",{enumerable:!0,get:function(){return $i.parseCapPolicy}});Ke.CAP_ENV_ALIASES={AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"};function yy(t,e){let n=t?.trim();if(!n)return{action:void 0,warnings:[]};if(n in _o.ON_BREACH_ACTIONS)return{action:n,warnings:[]};let r=_o.ON_BREACH_ALIASES[n];return r?{action:r,warnings:[`${e}="${n}" is DEPRECATED; use "${_o.DEPRECATED_CAP_SPELLINGS[n]??r}". Treating it as "${r}". The old spelling will stop being accepted.`]}:{action:_o.STRICTEST_ON_BREACH,warnings:[`${e}="${n}" is not a breach action this build understands. FAILING CLOSED to "${_o.STRICTEST_ON_BREACH}" \u2014 an unreadable enforcement setting must never weaken enforcement. Known actions: ${Object.keys(_o.ON_BREACH_ACTIONS).join(", ")}.`]}}var KD=1e4;function qD(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 YD(t){return t.maxTurnsPerSession===void 0&&t.maxSessionSeconds===void 0&&t.maxConcurrentSandboxes===void 0}var Lf=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>=KD){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)}}};Ke.CapMeter=Lf;function JD(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(Ke.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=yy(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 Sy=S(da=>{"use strict";Object.defineProperty(da,"__esModule",{value:!0});da.effectiveDenyMode=wy;da.createGovernor=XD;da.withGovernor=zD;var vl=bl(),yo=Eo();function wy(t,e){return t==="kill"&&!e?"drain":t}function XD(t){let e=new vl.CapMeter(t.caps),n=(0,vl.capsAreUnbounded)(t.caps),r,s,i,o=new Map,a=t.sandboxes.supportsInFlightTermination!==!1,c=new Map,l=new Set,d=(h,w)=>{try{t.audit?.(h,w)}catch{}},u=1e4,f=(h,w)=>{if(o.size>=u&&!o.has(h)){let _=o.keys().next();_.done||o.delete(_.value)}o.set(h,w)},p=async(h,w)=>{let _=e.policy().onBreach??"revoke-inference";try{_==="destroy-sandbox"?await t.sandboxes.destroySession(h):await t.sandboxes.revokeRoute(h,"inference")}catch(E){t.logger?.warn(`[Governor] ${_} failed for ${h}, destroying instead: ${E instanceof Error?E.message:String(E)}`),await t.sandboxes.destroySession(h).catch(()=>{})}t.logger?.warn(`[Governor] cap breach on ${h}: ${w.reason} \u2014 ${_}`),d("cap_breach",{sessionKey:h,cap:w.cap,reason:w.reason,action:_})},g=async(h,w=!1)=>{let _=t.sandboxes.sandboxes();for(let E of _)await t.sandboxes.destroySession(E.sandboxKey).catch(()=>{});return _.length>0?t.logger?.warn(`[Governor] kill switch: destroyed ${_.length} live sandbox(s) \u2014 ${h}`):!a&&!w&&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.`),(_.length>0||!w)&&d("kill_switch",{reason:h,destroyed:_.length,inFlightTerminated:a}),_.length},m=async()=>{if(t.getLease)try{let h=await t.getLease(),w=(0,vl.mergeCaps)(h?.caps,t.caps);if(e.setCaps(w),n=(0,vl.capsAreUnbounded)(w),i=h,c=(0,yo.resolveFollowedUsers)(h,o),!a)for(let E of h?.deny??[]){if(E.mode!=="kill")continue;let O=`${E.scope}:${E.match}`;l.has(O)||(l.add(O),t.logger?.warn(`[Governor] deny(kill) on ${O} 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.`),d("deny_kill_degraded",{scope:E.scope,match:E.match,effectiveMode:"drain"}))}for(let E of t.sandboxes.sandboxes()){let O=E.sessionKeys.map(T=>({sessionKey:T,v:(0,yo.denyVerdict)(h,{sessionKey:T,pack:t.pack??"",userHash:t.userHash,userId:o.get(T),followedUsers:c})})).find(({v:T})=>T.denied&&wy(T.mode,a)==="kill");if(O){await t.sandboxes.destroySession(E.sandboxKey).catch(()=>{});for(let T of E.sessionKeys)o.delete(T);t.logger?.warn(`[Governor] deny(kill) destroyed ${E.sandboxId} \u2014 ${O.v.reason}`),d("session_killed",{sessionKey:O.sessionKey,sandboxId:E.sandboxId,reason:O.v.reason,collateralSessions:E.sessionKeys.filter(T=>T!==O.sessionKey)})}}let _=(0,yo.leaseIsDead)(h);if(_.dead){let E=_.reason??"lease revoked",O=s===E;s=E,await g(E,O)}else s&&(t.logger?.info("[Governor] lease restored \u2014 accepting turns again"),d("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,w){if(s)return{allowed:!1,reason:`stopped by the control plane: ${s}`};w&&f(h,w);let _=(0,yo.denyVerdict)(i,{sessionKey:h,pack:t.pack??"",userHash:t.userHash,userId:w??o.get(h),followedUsers:(0,yo.resolveFollowedUsers)(i,o)});if(_.denied)return{allowed:!1,reason:_.reason};if(t.admitPack){let O=t.admitPack(h,i);if(!O.allowed)return{allowed:!1,reason:O.reason??"refused by pack admission"}}if(n)return{allowed:!0};let E=e.check(h,t.sandboxes.sandboxes().length);return E.allowed||E.cap!=="concurrency"&&await p(h,E),E},recordTurn(h){e.record(h)},killAll:g,refresh:m,start(){if(!t.getLease||r)return;let h=(0,yo.resolveLeasePollSeconds)(t.pollSeconds)*1e3;r=setInterval(()=>{m()},h),r.unref?.(),m()},stop(){r&&(clearInterval(r),r=void 0)},policy:()=>e.policy()}}function zD(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 Py=S(Qe=>{"use strict";var QD=Qe&&Qe.__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]})),ZD=Qe&&Qe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pa=Qe&&Qe.__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"&&QD(n,e,r[s]);return ZD(n,e),n}})();Object.defineProperty(Qe,"__esModule",{value:!0});Qe.ContainerSandboxDriver=Qe.SANDBOX_PACK_DIR=Qe.SANDBOX_WORKSPACE_DIR=Qe.SANDBOX_STATE_DIR=Qe.SANDBOX_SOCKET_DIR_IN_SANDBOX=void 0;Qe.strictEgressFromEnv=vy;Qe.prepareSocketDir=Oy;Qe.assertOwnSocket=Iy;var e0=pa(require("node:crypto")),kr=pa(require("node:fs")),t0=pa(require("node:net")),n0=pa(require("node:os")),fa=pa(require("node:path")),Ay=Rc();function vy(t=process.env){return t.AGENTHIPPO_SANDBOX_STRICT_EGRESS==="1"}function r0(){let t=[process.env.AGENTHIPPO_SANDBOX_SOCKET_DIR,"/run/agenthippo/sandboxes",process.env.XDG_RUNTIME_DIR?fa.join(process.env.XDG_RUNTIME_DIR,"agenthippo-sandboxes"):void 0,fa.join(n0.tmpdir(),"agenthippo-sandboxes")].filter(e=>!!e);for(let e of t)try{if(kr.mkdirSync(e,{recursive:!0}),kr.accessSync(e,kr.constants.W_OK),e.length>60)continue;return e}catch{}return"/run/agenthippo/sandboxes"}var s0=r0(),i0=9e4,o0=150;Qe.SANDBOX_SOCKET_DIR_IN_SANDBOX="/run/sandbox";Qe.SANDBOX_STATE_DIR="/state";Qe.SANDBOX_WORKSPACE_DIR="/state/workspace";Qe.SANDBOX_PACK_DIR="/app/pack";var Mf=class{opts;kind="container";tier=2;sandboxes=new Map;seq=0;instance=e0.randomBytes(2).toString("hex");constructor(e){this.opts=e}async create(e){a0(e.image);let n=`sandbox-${this.instance}-${++this.seq}-${d0(e.sandboxKey)}`,r=this.opts.socketDir??s0,s=fa.join(r,n),i=fa.join(s,"sandbox.sock");kr.rmSync(s,{recursive:!0,force:!0}),Oy(s,this.opts.socketOwner);let o=e.routes.map(h=>({kind:h.kind,network:l0(h.target)})),c=await this.assertRouteNetworks(o)?this.tier:1,l=o[0],d=["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}:${Qe.SANDBOX_STATE_DIR}`]:["--tmpfs",`${Qe.SANDBOX_STATE_DIR}:rw,exec,nosuid,size=512m,mode=1777`],"--volume",`${s}:${Qe.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)d.push("--volume",Ty(h,!0));for(let h of e.fs.writable)d.push("--volume",Ty(h,!1));e.limits.memMiB&&d.push("--memory",`${e.limits.memMiB}m`),e.limits.cpu&&d.push("--cpus",e.limits.cpu);for(let[h,w]of Object.entries(e.env??{}))d.push("--env",`${h}=${w}`);d.push("--env",`${Ay.SANDBOX_TIER_ENV}=${c}`),d.push(e.image);let u=await this.opts.exec(d);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 f=u.stdout.trim(),p=new Map;l&&p.set(l.kind,l.network);for(let h of o.slice(1)){let w=await this.opts.exec(["network","connect",h.network,n]);if(w.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to attach ${h.kind} route for sandbox ${n}: ${w.stdout.trim()}`);p.set(h.kind,h.network)}await this.waitForSocket(n,i);let g={containerId:f,socketPath:i,networks:p,idleSeconds:e.limits.ttlSeconds};this.armIdleReap(n,g),this.sandboxes.set(n,g);let m=this.opts.connectFn??u0;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??vy())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??i0;if(r<=0)return;let s=Date.now()+r;for(;Date.now()<s;){if(kr.existsSync(n)){try{Iy(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: ${by(a)}`)}await new Promise(a=>setTimeout(a,o0))}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: ${by(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 Ay.RevocationUnsupportedError("container",n);let i=await this.opts.exec(["network","disconnect","--force",s,e.id]);if(i.code!==0)throw new Error(`failed to revoke ${n} for sandbox ${e.id}: ${i.stdout.trim()}`);r.networks.delete(n)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.destroyById(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.destroyById(e.id)}async 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{kr.rmSync(fa.dirname(n.socketPath),{recursive:!0,force:!0})}catch{}}}};Qe.ContainerSandboxDriver=Mf;function Oy(t,e){if(kr.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{kr.chownSync(t,e.uid,e.gid),kr.chmodSync(t,448);return}catch{}kr.chmodSync(t,987)}function Iy(t,e,n=typeof process.getuid=="function"?process.getuid():void 0){let r=kr.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 Ty(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 a0(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 by(t){return`${t.stdout??""}${t.stderr??""}`.trim()||"(no output)"}var c0=new Set(["localhost","127.0.0.1","::1","0.0.0.0","[::1]"]);function l0(t){let e=t.replace(/^\w+:\/\//,"").split(/[:/]/)[0];if(c0.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 u0(t){let e=t0.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 d0(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Dy=S(lt=>{"use strict";Object.defineProperty(lt,"__esModule",{value:!0});lt.ProcessSandboxDriver=lt.PROVIDER_KEY_PASSTHROUGH_VARS=lt.NS_PROBE_ARGS=lt.UNSHARE_WRAP_ARGS=void 0;lt.namespaceIsolationFromEnv=f0;lt.probeNamespaceIsolation=Ry;lt.providerKeyPassthroughFromEnv=Cy;lt.sandboxEnvCarriesProviderKey=ky;lt.baseSandboxEnv=$y;var Ny=require("node:child_process"),Gf=Rc();function f0(t=process.env){let e=t.AGENTHIPPO_SANDBOX_NS_ISOLATION?.trim().toLowerCase();return e==="off"||e==="0"?"off":e==="require"?"require":"auto"}lt.UNSHARE_WRAP_ARGS=["--user","--map-current-user","--pid","--fork","--kill-child=SIGTERM","--mount-proc"];lt.NS_PROBE_ARGS=[...lt.UNSHARE_WRAP_ARGS,"unshare","--user","true"];async function Ry(t=Ny.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",[...lt.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))})}lt.PROVIDER_KEY_PASSTHROUGH_VARS=["CURSOR_API_KEY"];function Cy(t=process.env){return t.AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY==="1"}function ky(t){return lt.PROVIDER_KEY_PASSTHROUGH_VARS.some(e=>!!t[e])}var Uf=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??(()=>Ry());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 ${lt.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}-${p0(e.sandboxKey)}`,r=this.opts.spawnFn??Ny.spawn,s=await this.namespaceWrap(),i=s?"unshare":this.opts.command,o=s?[...lt.UNSHARE_WRAP_ARGS,this.opts.command,...this.opts.args??[]]:this.opts.args??[],c={...$y({...this.opts.allowProviderKeyPassthrough!==void 0?{allowProviderKeyPassthrough:this.opts.allowProviderKeyPassthrough}:{},logger:{warn:g=>console.warn(g)}}),...this.opts.env,...e.env},l=ky(c),d=r(i,o,{cwd:this.opts.cwd,stdio:["pipe","pipe","inherit"],env:{...c,[Gf.SANDBOX_TIER_ENV]:String(this.tier),...l?{[Gf.SANDBOX_PROVIDER_KEY_ENV]:"1"}:{}}});l&&console.warn(`[Sandbox] ${n} runs WITH a raw provider key in its environment (${lt.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=>{d.once("exit",()=>g()),d.once("error",()=>g())}),f={input:d.stdout,output:{write:g=>d.stdin?.write(g)??!1},closed:u},p={child:d,channel:f,idleSeconds:e.limits.ttlSeconds};return this.armIdleReap(n,p),this.sandboxes.set(n,p),{id:n,tier:this.tier,endpoint:"stdio",connect:()=>f}}async revoke(e,n){if(n!=="all")throw new Gf.RevocationUnsupportedError("process",n);await this.kill(e.id)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.kill(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.kill(e.id)}async kill(e){let n=this.sandboxes.get(e);n&&(this.sandboxes.delete(e),n.ttl&&clearTimeout(n.ttl),n.child.exitCode===null&&!n.child.killed&&n.child.kill("SIGTERM"))}};lt.ProcessSandboxDriver=Uf;function $y(t={},e=process.env){let n=["PATH","HOME","LANG","LC_ALL","TMPDIR","TERM","NODE_ENV","CLAUDE_CODE_PATH","CODEX_PATH","AGENTHIPPO_CUSTOM_ENGINES_DIR","AGENTHIPPO_NO_AUTO_INSTALL","AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_LITELLM_BASE_URL","AGENTHIPPO_SERVE","HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","NO_PROXY","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE"],r={};for(let i of n){let o=e[i];o&&(r[i]=o)}let s=t.allowProviderKeyPassthrough??Cy(e);for(let i of lt.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 p0(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Hf=S(vt=>{"use strict";var g0=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]})),h0=vt&&vt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),My=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"&&g0(n,e,r[s]);return h0(n,e),n}})();Object.defineProperty(vt,"__esModule",{value:!0});vt.DEPRECATED_SANDBOX_ENV_ALIASES=void 0;vt.dockerExec=_0;vt.alignSandboxWorkspaceOwnership=y0;vt.resolveSandboxImageUser=Uy;vt.ensureSandboxStateDir=w0;vt.sandboxScriptArg=T0;vt.applyDeprecatedSandboxEnvAliases=jy;vt.loadWarrantKeypair=v0;vt.mintSandboxInferenceWarrant=O0;var m0=require("node:child_process"),ga=My(require("node:fs")),E0=My(require("node:path")),Gy=Ri();function _0(t){return new Promise(e=>{(0,m0.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 y0(t){let e=t.writable.map(i=>i.includes(":")?i.slice(0,i.indexOf(":")):i);if(e.length===0)return;let n=await Uy(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=Hy(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 Uy(t,e){let n=await Ly(t,e,"-u");if(n!==void 0)return{uid:n,gid:await Ly(t,e,"-g")??n}}function w0(t,e){if(ga.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Hy(t,e.uid,e.gid)}catch{}return t}async function Ly(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 Hy(t,e,n){let r=0,s=i=>{let o=ga.lstatSync(i);if((o.uid!==e||o.gid!==n)&&(ga.lchownSync(i,e,n),r++),o.isDirectory())for(let a of ga.readdirSync(i))s(E0.join(i,a))};return ga.existsSync(t)?(s(t),r):0}var S0=["/$bunfs","/snapshot"];function A0(t){return t.replace(/\\/g,"/").replace(/^[A-Za-z]:/,"")}function T0(t=process.argv,e=process.execPath){let n=t[1];if(!n||n===e)return[];let r=A0(n);return S0.some(s=>r.startsWith(s))?[]:[n]}vt.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 b0=new Set;function jy(t=process.env,e=r=>console.warn(r),n=b0){let r=[];for(let[s,i]of vt.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}jy();function v0(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,Gy.generateWarrantKeypair)(n);return t?.info(`[Warrant] no AGENTHIPPO_WARRANT_PRIVATE_KEY \u2014 generated an ephemeral key (kid=${r.kid}). Configure gateways with:
531
- GATEWAY_SANDBOX_WARRANT_KEYS=${JSON.stringify({[r.kid]:r.publicKeyPem})}`),r}function O0(t,e){return(0,Gy.mintWarrant)({...e,aud:"inference"},t)}});var Bf=S(xf=>{"use strict";Object.defineProperty(xf,"__esModule",{value:!0});xf.createPackRunner=N0;var I0=bi(),P0=br(),jf=Xt();function N0(t){return(0,I0.createHeadlessRunner)({storagePath:t.storagePath,analyticsSessionsDir:t.analyticsSessionsDir,packId:t.packId,packVersion:t.packVersion,provenance:t.provenance,bundledPromptsDir:(0,jf.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,jf.findClaudeCodePath)(),codexExecutablePath:(0,jf.findCodexPath)(),permissionHandler:t.permissionHandler,cliEnvPatch:(0,P0.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspaceRoot,agentId:t.packId,chatSessionId:t.chatSessionId,baseEnv:process.env,omitGatewayToken:t.omitGatewayToken}),engineSettings:{...t.claudeCheapModel?{claudeCheapModel:t.claudeCheapModel}:{},...t.effort?{effort:t.effort}:{}}})}});var Qy=S(Un=>{"use strict";var R0=Un&&Un.__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]})),C0=Un&&Un.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),k0=Un&&Un.__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"&&R0(n,e,r[s]);return C0(n,e),n}})();Object.defineProperty(Un,"__esModule",{value:!0});Un.getEvidenceShipStatus=Yy;Un.validateEvidenceUrl=Xy;Un.resolveSessionShipConfig=U0;Un.redactSessionLine=zy;Un.startSessionShipper=j0;var Di=k0(require("path")),rr=require("fs"),Vy=require("crypto"),$0=require("zlib"),D0=Zi(),Wy=ro(),Ol="AGENTHIPPO_EVIDENCE_SHIP",ha="AGENTHIPPO_EVIDENCE_URL",xy="AGENTHIPPO_EVIDENCE_SHIP_TOKEN",L0="AGENTHIPPO_EVIDENCE_SHIP_INTERVAL_SEC",Ky="AGENTHIPPO_EVIDENCE_SHIP_SINCE_DAYS",qy="AGENTHIPPO_EVIDENCE_SHIP_DRAIN_TIMEOUT_SEC",Il="AGENTHIPPO_EVIDENCE_ALLOW_INSECURE_URL",Ff=30,Vf=30,M0=/(^|_)(input|output|result|prompt|completion|content|text|messages?)(_|$)|preview$/i,Wf={enabled:!1,disabledReason:"not-configured",consecutiveFailures:0,recordsStaged:0,recordsShipped:0,recordsSkippedTooOld:0,filesSkippedTooOld:0,writeFailures:0,contentCapture:!1};function Yy(){return{...Wf,writeFailures:(0,Wy.getSessionEventWriterStats)().failed}}function wo(t){Wf={...Wf,...t}}function Kf(t){return["1","true","yes","on"].includes((t??"").trim().toLowerCase())}function Jy(t){return Kf(t[Il])||Kf(t.EVIDENCE_ALLOW_INSECURE_URL)}var G0=new Set(["localhost","127.0.0.1","::1","[::1]","0.0.0.0"]);function Xy(t,e=process.env){let n;try{n=new URL(t)}catch{return{error:`${ha} is not a valid URL: ${JSON.stringify(t)}`}}if(n.protocol==="https:")return{url:n.toString().replace(/\/$/,"")};if(n.protocol!=="http:")return{error:`${ha} must be https (got ${n.protocol.replace(":","")})`};if(G0.has(n.hostname))return{url:n.toString().replace(/\/$/,"")};if(Jy(e)){let r=Kf(e[Il])?Il:"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:`${ha} 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 ${Il}=1 (or EVIDENCE_ALLOW_INSECURE_URL=1) if the network is genuinely private.`}}function U0(t,e,n,r=process.env){if(r[Ol]==="0"||r[Ol]?.toLowerCase()==="false"){console.warn(`
549
+ `,w=await createPullRequest(p,`[${n}] Add ${r} v${s}`,h,g);return e&&(0,utils_1.logInfo)(e,`[Store] OK Created PR: ${w.url}`),{prUrl:w.url,prNumber:w.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 bl=S(Ke=>{"use strict";Object.defineProperty(Ke,"__esModule",{value:!0});Ke.CapMeter=Ke.CAP_ENV_ALIASES=Ke.parseCapPolicy=Ke.STRICTEST_ON_BREACH=Ke.ON_BREACH_ALIASES=Ke.ON_BREACH_ACTIONS=Ke.LEASE_CAP_FIELDS=Ke.LEASE_CAP_ALIASES=Ke.DEPRECATED_CAP_SPELLINGS=void 0;Ke.resolveOnBreach=yy;Ke.mergeCaps=qD;Ke.capsAreUnbounded=YD;Ke.capsFromEnv=JD;var _o=aa(),$i=aa();Object.defineProperty(Ke,"DEPRECATED_CAP_SPELLINGS",{enumerable:!0,get:function(){return $i.DEPRECATED_CAP_SPELLINGS}});Object.defineProperty(Ke,"LEASE_CAP_ALIASES",{enumerable:!0,get:function(){return $i.LEASE_CAP_ALIASES}});Object.defineProperty(Ke,"LEASE_CAP_FIELDS",{enumerable:!0,get:function(){return $i.LEASE_CAP_FIELDS}});Object.defineProperty(Ke,"ON_BREACH_ACTIONS",{enumerable:!0,get:function(){return $i.ON_BREACH_ACTIONS}});Object.defineProperty(Ke,"ON_BREACH_ALIASES",{enumerable:!0,get:function(){return $i.ON_BREACH_ALIASES}});Object.defineProperty(Ke,"STRICTEST_ON_BREACH",{enumerable:!0,get:function(){return $i.STRICTEST_ON_BREACH}});Object.defineProperty(Ke,"parseCapPolicy",{enumerable:!0,get:function(){return $i.parseCapPolicy}});Ke.CAP_ENV_ALIASES={AGENTHIPPO_MAX_CONCURRENT_CELLS:"AGENTHIPPO_MAX_CONCURRENT_SANDBOXES"};function yy(t,e){let n=t?.trim();if(!n)return{action:void 0,warnings:[]};if(n in _o.ON_BREACH_ACTIONS)return{action:n,warnings:[]};let r=_o.ON_BREACH_ALIASES[n];return r?{action:r,warnings:[`${e}="${n}" is DEPRECATED; use "${_o.DEPRECATED_CAP_SPELLINGS[n]??r}". Treating it as "${r}". The old spelling will stop being accepted.`]}:{action:_o.STRICTEST_ON_BREACH,warnings:[`${e}="${n}" is not a breach action this build understands. FAILING CLOSED to "${_o.STRICTEST_ON_BREACH}" \u2014 an unreadable enforcement setting must never weaken enforcement. Known actions: ${Object.keys(_o.ON_BREACH_ACTIONS).join(", ")}.`]}}var KD=1e4;function qD(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 YD(t){return t.maxTurnsPerSession===void 0&&t.maxSessionSeconds===void 0&&t.maxConcurrentSandboxes===void 0}var Lf=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>=KD){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)}}};Ke.CapMeter=Lf;function JD(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(Ke.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=yy(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 Sy=S(da=>{"use strict";Object.defineProperty(da,"__esModule",{value:!0});da.effectiveDenyMode=wy;da.createGovernor=XD;da.withGovernor=zD;var vl=bl(),yo=Eo();function wy(t,e){return t==="kill"&&!e?"drain":t}function XD(t){let e=new vl.CapMeter(t.caps),n=(0,vl.capsAreUnbounded)(t.caps),r,s,i,o=new Map,a=t.sandboxes.supportsInFlightTermination!==!1,c=new Map,l=new Set,d=(h,w)=>{try{t.audit?.(h,w)}catch{}},u=1e4,f=(h,w)=>{if(o.size>=u&&!o.has(h)){let _=o.keys().next();_.done||o.delete(_.value)}o.set(h,w)},p=async(h,w)=>{let _=e.policy().onBreach??"revoke-inference";try{_==="destroy-sandbox"?await t.sandboxes.destroySession(h):await t.sandboxes.revokeRoute(h,"inference")}catch(E){t.logger?.warn(`[Governor] ${_} failed for ${h}, destroying instead: ${E instanceof Error?E.message:String(E)}`),await t.sandboxes.destroySession(h).catch(()=>{})}t.logger?.warn(`[Governor] cap breach on ${h}: ${w.reason} \u2014 ${_}`),d("cap_breach",{sessionKey:h,cap:w.cap,reason:w.reason,action:_})},g=async(h,w=!1)=>{let _=t.sandboxes.sandboxes();for(let E of _)await t.sandboxes.destroySession(E.sandboxKey).catch(()=>{});return _.length>0?t.logger?.warn(`[Governor] kill switch: destroyed ${_.length} live sandbox(s) \u2014 ${h}`):!a&&!w&&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.`),(_.length>0||!w)&&d("kill_switch",{reason:h,destroyed:_.length,inFlightTerminated:a}),_.length},m=async()=>{if(t.getLease)try{let h=await t.getLease(),w=(0,vl.mergeCaps)(h?.caps,t.caps);if(e.setCaps(w),n=(0,vl.capsAreUnbounded)(w),i=h,c=(0,yo.resolveFollowedUsers)(h,o),!a)for(let E of h?.deny??[]){if(E.mode!=="kill")continue;let O=`${E.scope}:${E.match}`;l.has(O)||(l.add(O),t.logger?.warn(`[Governor] deny(kill) on ${O} 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.`),d("deny_kill_degraded",{scope:E.scope,match:E.match,effectiveMode:"drain"}))}for(let E of t.sandboxes.sandboxes()){let O=E.sessionKeys.map(T=>({sessionKey:T,v:(0,yo.denyVerdict)(h,{sessionKey:T,pack:t.pack??"",userHash:t.userHash,userId:o.get(T),followedUsers:c})})).find(({v:T})=>T.denied&&wy(T.mode,a)==="kill");if(O){await t.sandboxes.destroySession(E.sandboxKey).catch(()=>{});for(let T of E.sessionKeys)o.delete(T);t.logger?.warn(`[Governor] deny(kill) destroyed ${E.sandboxId} \u2014 ${O.v.reason}`),d("session_killed",{sessionKey:O.sessionKey,sandboxId:E.sandboxId,reason:O.v.reason,collateralSessions:E.sessionKeys.filter(T=>T!==O.sessionKey)})}}let _=(0,yo.leaseIsDead)(h);if(_.dead){let E=_.reason??"lease revoked",O=s===E;s=E,await g(E,O)}else s&&(t.logger?.info("[Governor] lease restored \u2014 accepting turns again"),d("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,w){if(s)return{allowed:!1,reason:`stopped by the control plane: ${s}`};w&&f(h,w);let _=(0,yo.denyVerdict)(i,{sessionKey:h,pack:t.pack??"",userHash:t.userHash,userId:w??o.get(h),followedUsers:(0,yo.resolveFollowedUsers)(i,o)});if(_.denied)return{allowed:!1,reason:_.reason};if(t.admitPack){let O=t.admitPack(h,i);if(!O.allowed)return{allowed:!1,reason:O.reason??"refused by pack admission"}}if(n)return{allowed:!0};let E=e.check(h,t.sandboxes.sandboxes().length);return E.allowed||E.cap!=="concurrency"&&await p(h,E),E},recordTurn(h){e.record(h)},killAll:g,refresh:m,start(){if(!t.getLease||r)return;let h=(0,yo.resolveLeasePollSeconds)(t.pollSeconds)*1e3;r=setInterval(()=>{m()},h),r.unref?.(),m()},stop(){r&&(clearInterval(r),r=void 0)},policy:()=>e.policy()}}function zD(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 Iy=S(Qe=>{"use strict";var QD=Qe&&Qe.__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]})),ZD=Qe&&Qe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),pa=Qe&&Qe.__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"&&QD(n,e,r[s]);return ZD(n,e),n}})();Object.defineProperty(Qe,"__esModule",{value:!0});Qe.ContainerSandboxDriver=Qe.SANDBOX_PACK_DIR=Qe.SANDBOX_WORKSPACE_DIR=Qe.SANDBOX_STATE_DIR=Qe.SANDBOX_SOCKET_DIR_IN_SANDBOX=void 0;Qe.strictEgressFromEnv=vy;Qe.prepareSocketDir=Oy;Qe.assertOwnSocket=Py;var eL=pa(require("node:crypto")),kr=pa(require("node:fs")),tL=pa(require("node:net")),nL=pa(require("node:os")),fa=pa(require("node:path")),Ay=Rc();function vy(t=process.env){return t.AGENTHIPPO_SANDBOX_STRICT_EGRESS==="1"}function rL(){let t=[process.env.AGENTHIPPO_SANDBOX_SOCKET_DIR,"/run/agenthippo/sandboxes",process.env.XDG_RUNTIME_DIR?fa.join(process.env.XDG_RUNTIME_DIR,"agenthippo-sandboxes"):void 0,fa.join(nL.tmpdir(),"agenthippo-sandboxes")].filter(e=>!!e);for(let e of t)try{if(kr.mkdirSync(e,{recursive:!0}),kr.accessSync(e,kr.constants.W_OK),e.length>60)continue;return e}catch{}return"/run/agenthippo/sandboxes"}var sL=rL(),iL=9e4,oL=150;Qe.SANDBOX_SOCKET_DIR_IN_SANDBOX="/run/sandbox";Qe.SANDBOX_STATE_DIR="/state";Qe.SANDBOX_WORKSPACE_DIR="/state/workspace";Qe.SANDBOX_PACK_DIR="/app/pack";var Mf=class{opts;kind="container";tier=2;sandboxes=new Map;seq=0;instance=eL.randomBytes(2).toString("hex");constructor(e){this.opts=e}async create(e){aL(e.image);let n=`sandbox-${this.instance}-${++this.seq}-${dL(e.sandboxKey)}`,r=this.opts.socketDir??sL,s=fa.join(r,n),i=fa.join(s,"sandbox.sock");kr.rmSync(s,{recursive:!0,force:!0}),Oy(s,this.opts.socketOwner);let o=e.routes.map(h=>({kind:h.kind,network:lL(h.target)})),c=await this.assertRouteNetworks(o)?this.tier:1,l=o[0],d=["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}:${Qe.SANDBOX_STATE_DIR}`]:["--tmpfs",`${Qe.SANDBOX_STATE_DIR}:rw,exec,nosuid,size=512m,mode=1777`],"--volume",`${s}:${Qe.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)d.push("--volume",Ty(h,!0));for(let h of e.fs.writable)d.push("--volume",Ty(h,!1));e.limits.memMiB&&d.push("--memory",`${e.limits.memMiB}m`),e.limits.cpu&&d.push("--cpus",e.limits.cpu);for(let[h,w]of Object.entries(e.env??{}))d.push("--env",`${h}=${w}`);d.push("--env",`${Ay.SANDBOX_TIER_ENV}=${c}`),d.push(e.image);let u=await this.opts.exec(d);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 f=u.stdout.trim(),p=new Map;l&&p.set(l.kind,l.network);for(let h of o.slice(1)){let w=await this.opts.exec(["network","connect",h.network,n]);if(w.code!==0)throw await this.opts.exec(["rm","--force",n]),new Error(`failed to attach ${h.kind} route for sandbox ${n}: ${w.stdout.trim()}`);p.set(h.kind,h.network)}await this.waitForSocket(n,i);let g={containerId:f,socketPath:i,networks:p,idleSeconds:e.limits.ttlSeconds};this.armIdleReap(n,g),this.sandboxes.set(n,g);let m=this.opts.connectFn??uL;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??vy())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??iL;if(r<=0)return;let s=Date.now()+r;for(;Date.now()<s;){if(kr.existsSync(n)){try{Py(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: ${by(a)}`)}await new Promise(a=>setTimeout(a,oL))}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: ${by(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 Ay.RevocationUnsupportedError("container",n);let i=await this.opts.exec(["network","disconnect","--force",s,e.id]);if(i.code!==0)throw new Error(`failed to revoke ${n} for sandbox ${e.id}: ${i.stdout.trim()}`);r.networks.delete(n)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.destroyById(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.destroyById(e.id)}async 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{kr.rmSync(fa.dirname(n.socketPath),{recursive:!0,force:!0})}catch{}}}};Qe.ContainerSandboxDriver=Mf;function Oy(t,e){if(kr.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{kr.chownSync(t,e.uid,e.gid),kr.chmodSync(t,448);return}catch{}kr.chmodSync(t,987)}function Py(t,e,n=typeof process.getuid=="function"?process.getuid():void 0){let r=kr.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 Ty(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 aL(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 by(t){return`${t.stdout??""}${t.stderr??""}`.trim()||"(no output)"}var cL=new Set(["localhost","127.0.0.1","::1","0.0.0.0","[::1]"]);function lL(t){let e=t.replace(/^\w+:\/\//,"").split(/[:/]/)[0];if(cL.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 uL(t){let e=tL.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 dL(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Dy=S(lt=>{"use strict";Object.defineProperty(lt,"__esModule",{value:!0});lt.ProcessSandboxDriver=lt.PROVIDER_KEY_PASSTHROUGH_VARS=lt.NS_PROBE_ARGS=lt.UNSHARE_WRAP_ARGS=void 0;lt.namespaceIsolationFromEnv=fL;lt.probeNamespaceIsolation=Ry;lt.providerKeyPassthroughFromEnv=Cy;lt.sandboxEnvCarriesProviderKey=ky;lt.baseSandboxEnv=$y;var Ny=require("node:child_process"),Gf=Rc();function fL(t=process.env){let e=t.AGENTHIPPO_SANDBOX_NS_ISOLATION?.trim().toLowerCase();return e==="off"||e==="0"?"off":e==="require"?"require":"auto"}lt.UNSHARE_WRAP_ARGS=["--user","--map-current-user","--pid","--fork","--kill-child=SIGTERM","--mount-proc"];lt.NS_PROBE_ARGS=[...lt.UNSHARE_WRAP_ARGS,"unshare","--user","true"];async function Ry(t=Ny.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",[...lt.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))})}lt.PROVIDER_KEY_PASSTHROUGH_VARS=["CURSOR_API_KEY"];function Cy(t=process.env){return t.AGENTHIPPO_SANDBOX_ALLOW_PROVIDER_KEY==="1"}function ky(t){return lt.PROVIDER_KEY_PASSTHROUGH_VARS.some(e=>!!t[e])}var Uf=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??(()=>Ry());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 ${lt.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}-${pL(e.sandboxKey)}`,r=this.opts.spawnFn??Ny.spawn,s=await this.namespaceWrap(),i=s?"unshare":this.opts.command,o=s?[...lt.UNSHARE_WRAP_ARGS,this.opts.command,...this.opts.args??[]]:this.opts.args??[],c={...$y({...this.opts.allowProviderKeyPassthrough!==void 0?{allowProviderKeyPassthrough:this.opts.allowProviderKeyPassthrough}:{},logger:{warn:g=>console.warn(g)}}),...this.opts.env,...e.env},l=ky(c),d=r(i,o,{cwd:this.opts.cwd,stdio:["pipe","pipe","inherit"],env:{...c,[Gf.SANDBOX_TIER_ENV]:String(this.tier),...l?{[Gf.SANDBOX_PROVIDER_KEY_ENV]:"1"}:{}}});l&&console.warn(`[Sandbox] ${n} runs WITH a raw provider key in its environment (${lt.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=>{d.once("exit",()=>g()),d.once("error",()=>g())}),f={input:d.stdout,output:{write:g=>d.stdin?.write(g)??!1},closed:u},p={child:d,channel:f,idleSeconds:e.limits.ttlSeconds};return this.armIdleReap(n,p),this.sandboxes.set(n,p),{id:n,tier:this.tier,endpoint:"stdio",connect:()=>f}}async revoke(e,n){if(n!=="all")throw new Gf.RevocationUnsupportedError("process",n);await this.kill(e.id)}armIdleReap(e,n){n.idleSeconds>0&&(n.ttl&&clearTimeout(n.ttl),n.ttl=setTimeout(()=>{this.kill(e)},n.idleSeconds*1e3),n.ttl.unref?.(),n.armedAt=Date.now())}touch(e){let n=this.sandboxes.get(e.id);if(!n||!(n.idleSeconds>0))return;let r=Math.min(5e3,n.idleSeconds*100);Date.now()-(n.armedAt??0)<r||this.armIdleReap(e.id,n)}async destroy(e){await this.kill(e.id)}async kill(e){let n=this.sandboxes.get(e);n&&(this.sandboxes.delete(e),n.ttl&&clearTimeout(n.ttl),n.child.exitCode===null&&!n.child.killed&&n.child.kill("SIGTERM"))}};lt.ProcessSandboxDriver=Uf;function $y(t={},e=process.env){let n=["PATH","HOME","LANG","LC_ALL","TMPDIR","TERM","NODE_ENV","CLAUDE_CODE_PATH","CODEX_PATH","AGENTHIPPO_CUSTOM_ENGINES_DIR","AGENTHIPPO_NO_AUTO_INSTALL","AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_LITELLM_BASE_URL","AGENTHIPPO_SERVE","HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","NO_PROXY","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE"],r={};for(let i of n){let o=e[i];o&&(r[i]=o)}let s=t.allowProviderKeyPassthrough??Cy(e);for(let i of lt.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 pL(t){return t.replace(/[^a-zA-Z0-9_-]/g,"").slice(0,32)||"session"}});var Hf=S(vt=>{"use strict";var gL=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]})),hL=vt&&vt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),My=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"&&gL(n,e,r[s]);return hL(n,e),n}})();Object.defineProperty(vt,"__esModule",{value:!0});vt.DEPRECATED_SANDBOX_ENV_ALIASES=void 0;vt.dockerExec=_L;vt.alignSandboxWorkspaceOwnership=yL;vt.resolveSandboxImageUser=Uy;vt.ensureSandboxStateDir=wL;vt.sandboxScriptArg=TL;vt.applyDeprecatedSandboxEnvAliases=jy;vt.loadWarrantKeypair=vL;vt.mintSandboxInferenceWarrant=OL;var mL=require("node:child_process"),ga=My(require("node:fs")),EL=My(require("node:path")),Gy=Ri();function _L(t){return new Promise(e=>{(0,mL.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 yL(t){let e=t.writable.map(i=>i.includes(":")?i.slice(0,i.indexOf(":")):i);if(e.length===0)return;let n=await Uy(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=Hy(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 Uy(t,e){let n=await Ly(t,e,"-u");if(n!==void 0)return{uid:n,gid:await Ly(t,e,"-g")??n}}function wL(t,e){if(ga.mkdirSync(t,{recursive:!0}),e&&e.uid!==0)try{Hy(t,e.uid,e.gid)}catch{}return t}async function Ly(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 Hy(t,e,n){let r=0,s=i=>{let o=ga.lstatSync(i);if((o.uid!==e||o.gid!==n)&&(ga.lchownSync(i,e,n),r++),o.isDirectory())for(let a of ga.readdirSync(i))s(EL.join(i,a))};return ga.existsSync(t)?(s(t),r):0}var SL=["/$bunfs","/snapshot"];function AL(t){return t.replace(/\\/g,"/").replace(/^[A-Za-z]:/,"")}function TL(t=process.argv,e=process.execPath){let n=t[1];if(!n||n===e)return[];let r=AL(n);return SL.some(s=>r.startsWith(s))?[]:[n]}vt.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 bL=new Set;function jy(t=process.env,e=r=>console.warn(r),n=bL){let r=[];for(let[s,i]of vt.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}jy();function vL(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,Gy.generateWarrantKeypair)(n);return t?.info(`[Warrant] no AGENTHIPPO_WARRANT_PRIVATE_KEY \u2014 generated an ephemeral key (kid=${r.kid}). Configure gateways with:
550
+ GATEWAY_SANDBOX_WARRANT_KEYS=${JSON.stringify({[r.kid]:r.publicKeyPem})}`),r}function OL(t,e){return(0,Gy.mintWarrant)({...e,aud:"inference"},t)}});var Bf=S(xf=>{"use strict";Object.defineProperty(xf,"__esModule",{value:!0});xf.createPackRunner=NL;var PL=bi(),IL=br(),jf=Xt();function NL(t){return(0,PL.createHeadlessRunner)({storagePath:t.storagePath,analyticsSessionsDir:t.analyticsSessionsDir,packId:t.packId,packVersion:t.packVersion,provenance:t.provenance,bundledPromptsDir:(0,jf.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,jf.findClaudeCodePath)(),codexExecutablePath:(0,jf.findCodexPath)(),permissionHandler:t.permissionHandler,cliEnvPatch:(0,IL.buildCliEnvPatch)({cliPath:process.execPath,workspaceRoot:t.workspaceRoot,agentId:t.packId,chatSessionId:t.chatSessionId,baseEnv:process.env,omitGatewayToken:t.omitGatewayToken}),engineSettings:{...t.claudeCheapModel?{claudeCheapModel:t.claudeCheapModel}:{},...t.effort?{effort:t.effort}:{}}})}});var Qy=S(Un=>{"use strict";var RL=Un&&Un.__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]})),CL=Un&&Un.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),kL=Un&&Un.__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"&&RL(n,e,r[s]);return CL(n,e),n}})();Object.defineProperty(Un,"__esModule",{value:!0});Un.getEvidenceShipStatus=Yy;Un.validateEvidenceUrl=Xy;Un.resolveSessionShipConfig=UL;Un.redactSessionLine=zy;Un.startSessionShipper=jL;var Di=kL(require("path")),rr=require("fs"),Vy=require("crypto"),$L=require("zlib"),DL=Zi(),Wy=ro(),Ol="AGENTHIPPO_EVIDENCE_SHIP",ha="AGENTHIPPO_EVIDENCE_URL",xy="AGENTHIPPO_EVIDENCE_SHIP_TOKEN",LL="AGENTHIPPO_EVIDENCE_SHIP_INTERVAL_SEC",Ky="AGENTHIPPO_EVIDENCE_SHIP_SINCE_DAYS",qy="AGENTHIPPO_EVIDENCE_SHIP_DRAIN_TIMEOUT_SEC",Pl="AGENTHIPPO_EVIDENCE_ALLOW_INSECURE_URL",Ff=30,Vf=30,ML=/(^|_)(input|output|result|prompt|completion|content|text|messages?)(_|$)|preview$/i,Wf={enabled:!1,disabledReason:"not-configured",consecutiveFailures:0,recordsStaged:0,recordsShipped:0,recordsSkippedTooOld:0,filesSkippedTooOld:0,writeFailures:0,contentCapture:!1};function Yy(){return{...Wf,writeFailures:(0,Wy.getSessionEventWriterStats)().failed}}function wo(t){Wf={...Wf,...t}}function Kf(t){return["1","true","yes","on"].includes((t??"").trim().toLowerCase())}function Jy(t){return Kf(t[Pl])||Kf(t.EVIDENCE_ALLOW_INSECURE_URL)}var GL=new Set(["localhost","127.0.0.1","::1","[::1]","0.0.0.0"]);function Xy(t,e=process.env){let n;try{n=new URL(t)}catch{return{error:`${ha} is not a valid URL: ${JSON.stringify(t)}`}}if(n.protocol==="https:")return{url:n.toString().replace(/\/$/,"")};if(n.protocol!=="http:")return{error:`${ha} must be https (got ${n.protocol.replace(":","")})`};if(GL.has(n.hostname))return{url:n.toString().replace(/\/$/,"")};if(Jy(e)){let r=Kf(e[Pl])?Pl:"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:`${ha} 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 ${Pl}=1 (or EVIDENCE_ALLOW_INSECURE_URL=1) if the network is genuinely private.`}}function UL(t,e,n,r=process.env){if(r[Ol]==="0"||r[Ol]?.toLowerCase()==="false"){console.warn(`
532
551
  ############################################################
533
552
  ## EVIDENCE SHIPPING IS DISABLED ##
534
553
  ## ${Ol}=${r[Ol]}
535
554
  ## Session evidence stays on local disk and is lost when ##
536
555
  ## this instance goes away. Unset to re-enable. ##
537
556
  ############################################################
538
- `),wo({enabled:!1,disabledReason:"disabled-by-env"});return}let s=r[ha]?.trim(),i=r[xy]?.trim();if(!s||!i){(s||i)&&console.warn(`[evidence-ship] disabled \u2014 ${s?xy:ha} is not set (the other half of the pair is)`),wo({enabled:!1,disabledReason:"not-configured"});return}let o=Xy(s,r);if("error"in o){console.error(`[evidence-ship] DISABLED \u2014 ${o.error}`),wo({enabled:!1,disabledReason:"invalid-url"});return}let a=Math.max(15,Number(r[L0]??60)||60),c=Math.max(1,Number(r[Ky]??Ff)||Ff),l=Math.max(1,Number(r[qy]??Vf)||Vf);return{evidenceUrl:o.url,shipToken:i,instanceId:t,sessionsDir:e,stateDir:n,intervalSec:a,sinceDays:c,drainTimeoutSec:l,allowInsecure:Jy(r)}}function H0(t){return{sha256:(0,Vy.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function zy(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(!M0.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=H0(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 By(){return{version:1,files:{},pending:{staged:0,shipped:0,skippedRecords:0,skippedFiles:0}}}function Fy(t){let e=0;for(let n of t.split(`
539
- `))n.trim()&&e++;return e}function j0(t){let e=Di.join(t.stateDir,".evidence-ship-cursor.json"),n=Di.join(t.stateDir,".evidence-stage-cursor.json"),r=Di.join(t.stateDir,"evidence-staging","sessions"),s=t.logger?.info??(()=>{}),i=t.logger?.warn??(()=>{}),o=t.sinceDays??Ff,a=t.intervalSec??60,c=(t.drainTimeoutSec??Vf)*1e3,l=(0,D0.isContentCaptureEnabled)(),d=t.allowInsecure===!0,u=!1,f=!1,p,g=0,m,h,w,_=0,E={staged:0,shipped:0,skippedRecords:0,skippedFiles:0};wo({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 O=()=>(h||(h=import("@agenthippo-ai/evidence-ship").then(({createShipper:P})=>P({serverUrl:t.evidenceUrl,token:t.shipToken,instanceId:t.instanceId,source:"serve",sinceDays:o,cursorFile:e,captureContent:l,allowInsecure:d,heartbeat:!1,log:v=>s(v),error:v=>i(v)}))),h),T=async()=>{if(w)return w;try{let P=await rr.promises.readFile(n,"utf8"),v=JSON.parse(P);w={version:1,files:v.files??{},windowFrom:v.windowFrom,pending:v.pending??By().pending}}catch{w=By()}return w},L=async()=>{if(w)try{await rr.promises.mkdir(Di.dirname(n),{recursive:!0}),await rr.promises.writeFile(n,JSON.stringify(w,null,1))}catch(P){i(`[evidence-ship] could not persist stage cursor: ${P instanceof Error?P.message:String(P)}`)}},A=async()=>{let P=await T(),v=Date.now(),F=v-o*864e5,B=0,re;try{re=(await rr.promises.readdir(t.sessionsDir)).filter(te=>te.endsWith(".jsonl"))}catch{return 0}await rr.promises.mkdir(r,{recursive:!0});let X=[];for(let te of re){if(te.startsWith("_evidence-loss"))continue;let Pe=Di.join(t.sessionsDir,te),Ge;try{Ge=await rr.promises.stat(Pe)}catch{continue}if(Ge.mtimeMs<F){let Ze=P.files[te];if(!Ze?.lostReported){let Zt=0;try{Zt=Fy(await rr.promises.readFile(Pe,"utf8"))}catch{}E.skippedFiles++,E.skippedRecords+=Zt,P.pending.skippedFiles++,P.pending.skippedRecords+=Zt,P.files[te]={size:Ge.size,sha256:"",stagedAt:0,stagedMtimeMs:Ze?.stagedMtimeMs??0,lostReported:!0},i(`[evidence-ship] EVIDENCE PERMANENTLY SKIPPED: ${te} last changed ${new Date(Ge.mtimeMs).toISOString()}, older than the ${o}-day ship window \u2014 ${Zt} record(s) will never be shipped. Raise ${Ky} before the next restart to recover a backlog this old.`),X.push(JSON.stringify({session_id:"_evidence-loss",request_id:te,timestamp:v,event_type:"evidence_skipped",payload:{reason:"older_than_ship_window",file:te,file_mtime_ms:Ge.mtimeMs,file_bytes:Ge.size,records:Zt,since_days:o,instance_id:t.instanceId,permanent:!0}}))}continue}let xe;try{xe=await rr.promises.readFile(Pe,"utf8")}catch(Ze){i(`[evidence-ship] cannot read ${te}: ${Ze instanceof Error?Ze.message:String(Ze)}`);continue}let Mt=(0,Vy.createHash)("sha256").update(xe,"utf8").digest("hex"),Et=P.files[te];if(Et&&Et.sha256===Mt&&Et.size===xe.length)continue;let hr=xe.split(`
557
+ `),wo({enabled:!1,disabledReason:"disabled-by-env"});return}let s=r[ha]?.trim(),i=r[xy]?.trim();if(!s||!i){(s||i)&&console.warn(`[evidence-ship] disabled \u2014 ${s?xy:ha} is not set (the other half of the pair is)`),wo({enabled:!1,disabledReason:"not-configured"});return}let o=Xy(s,r);if("error"in o){console.error(`[evidence-ship] DISABLED \u2014 ${o.error}`),wo({enabled:!1,disabledReason:"invalid-url"});return}let a=Math.max(15,Number(r[LL]??60)||60),c=Math.max(1,Number(r[Ky]??Ff)||Ff),l=Math.max(1,Number(r[qy]??Vf)||Vf);return{evidenceUrl:o.url,shipToken:i,instanceId:t,sessionsDir:e,stateDir:n,intervalSec:a,sinceDays:c,drainTimeoutSec:l,allowInsecure:Jy(r)}}function HL(t){return{sha256:(0,Vy.createHash)("sha256").update(t,"utf8").digest("hex"),length:Buffer.byteLength(t,"utf8")}}function zy(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(!ML.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=HL(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 By(){return{version:1,files:{},pending:{staged:0,shipped:0,skippedRecords:0,skippedFiles:0}}}function Fy(t){let e=0;for(let n of t.split(`
558
+ `))n.trim()&&e++;return e}function jL(t){let e=Di.join(t.stateDir,".evidence-ship-cursor.json"),n=Di.join(t.stateDir,".evidence-stage-cursor.json"),r=Di.join(t.stateDir,"evidence-staging","sessions"),s=t.logger?.info??(()=>{}),i=t.logger?.warn??(()=>{}),o=t.sinceDays??Ff,a=t.intervalSec??60,c=(t.drainTimeoutSec??Vf)*1e3,l=(0,DL.isContentCaptureEnabled)(),d=t.allowInsecure===!0,u=!1,f=!1,p,g=0,m,h,w,_=0,E={staged:0,shipped:0,skippedRecords:0,skippedFiles:0};wo({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 O=()=>(h||(h=import("@agenthippo-ai/evidence-ship").then(({createShipper:I})=>I({serverUrl:t.evidenceUrl,token:t.shipToken,instanceId:t.instanceId,source:"serve",sinceDays:o,cursorFile:e,captureContent:l,allowInsecure:d,heartbeat:!1,log:v=>s(v),error:v=>i(v)}))),h),T=async()=>{if(w)return w;try{let I=await rr.promises.readFile(n,"utf8"),v=JSON.parse(I);w={version:1,files:v.files??{},windowFrom:v.windowFrom,pending:v.pending??By().pending}}catch{w=By()}return w},L=async()=>{if(w)try{await rr.promises.mkdir(Di.dirname(n),{recursive:!0}),await rr.promises.writeFile(n,JSON.stringify(w,null,1))}catch(I){i(`[evidence-ship] could not persist stage cursor: ${I instanceof Error?I.message:String(I)}`)}},A=async()=>{let I=await T(),v=Date.now(),F=v-o*864e5,B=0,re;try{re=(await rr.promises.readdir(t.sessionsDir)).filter(te=>te.endsWith(".jsonl"))}catch{return 0}await rr.promises.mkdir(r,{recursive:!0});let X=[];for(let te of re){if(te.startsWith("_evidence-loss"))continue;let Ie=Di.join(t.sessionsDir,te),Ge;try{Ge=await rr.promises.stat(Ie)}catch{continue}if(Ge.mtimeMs<F){let Ze=I.files[te];if(!Ze?.lostReported){let Zt=0;try{Zt=Fy(await rr.promises.readFile(Ie,"utf8"))}catch{}E.skippedFiles++,E.skippedRecords+=Zt,I.pending.skippedFiles++,I.pending.skippedRecords+=Zt,I.files[te]={size:Ge.size,sha256:"",stagedAt:0,stagedMtimeMs:Ze?.stagedMtimeMs??0,lostReported:!0},i(`[evidence-ship] EVIDENCE PERMANENTLY SKIPPED: ${te} last changed ${new Date(Ge.mtimeMs).toISOString()}, older than the ${o}-day ship window \u2014 ${Zt} record(s) will never be shipped. Raise ${Ky} before the next restart to recover a backlog this old.`),X.push(JSON.stringify({session_id:"_evidence-loss",request_id:te,timestamp:v,event_type:"evidence_skipped",payload:{reason:"older_than_ship_window",file:te,file_mtime_ms:Ge.mtimeMs,file_bytes:Ge.size,records:Zt,since_days:o,instance_id:t.instanceId,permanent:!0}}))}continue}let xe;try{xe=await rr.promises.readFile(Ie,"utf8")}catch(Ze){i(`[evidence-ship] cannot read ${te}: ${Ze instanceof Error?Ze.message:String(Ze)}`);continue}let Mt=(0,Vy.createHash)("sha256").update(xe,"utf8").digest("hex"),Et=I.files[te];if(Et&&Et.sha256===Mt&&Et.size===xe.length)continue;let hr=xe.split(`
540
559
  `).map(Ze=>Ze.trim()?zy(Ze,l):Ze).join(`
541
- `),Be=Di.join(r,te);await rr.promises.writeFile(Be,hr);let it=Math.max(Date.now(),(Et?.stagedMtimeMs??0)+1e3),On=it/1e3;await rr.promises.utimes(Be,On,On);let mr=Fy(hr);B+=mr,P.files[te]={size:xe.length,sha256:Mt,stagedAt:v,stagedMtimeMs:it}}if(X.length>0){let te=Di.join(r,"evidence-loss.jsonl");await rr.promises.appendFile(te,`${X.join(`
560
+ `),Be=Di.join(r,te);await rr.promises.writeFile(Be,hr);let it=Math.max(Date.now(),(Et?.stagedMtimeMs??0)+1e3),On=it/1e3;await rr.promises.utimes(Be,On,On);let mr=Fy(hr);B+=mr,I.files[te]={size:xe.length,sha256:Mt,stagedAt:v,stagedMtimeMs:it}}if(X.length>0){let te=Di.join(r,"evidence-loss.jsonl");await rr.promises.appendFile(te,`${X.join(`
542
561
  `)}
543
- `);let Pe=Date.now()/1e3;await rr.promises.utimes(te,Pe,Pe),B+=X.length}return E.staged+=B,P.pending.staged+=B,P.windowFrom===void 0&&(P.windowFrom=v),await L(),B},I=async()=>{let P=await T(),v=Date.now(),F=(0,Wy.getSessionEventWriterStats)(),B={kind:"session_ship_heartbeat",instance_id:t.instanceId,wire:"agenthippo/session-ship/1",window_from_ms:P.windowFrom??v,window_to_ms:v,interval_sec:a,since_days:o,records_staged:P.pending.staged,records_shipped:P.pending.shipped,records_skipped_too_old:P.pending.skippedRecords,files_skipped_too_old:P.pending.skippedFiles,evidence_write_failures:F.failed,evidence_writes:F.written,consecutive_ship_failures:g,content_capture:l,totals:{...E}},re=1;try{({INGEST_WIRE_VERSION:re}=await import("@agenthippo-ai/evidence-ship"))}catch{}let X=JSON.stringify(B),te=await fetch(`${t.evidenceUrl.replace(/\/$/,"")}/ingest/batch`,{method:"POST",headers:{authorization:`Bearer ${t.shipToken}`,"content-type":"application/json","X-Evidence-Ingest-Version":String(re)},body:JSON.stringify({instance_id:t.instanceId,kind:"heartbeat",name:"heartbeat.json",content_gzip_b64:(0,$0.gzipSync)(Buffer.from(X)).toString("base64")})});if(!te.ok)throw new Error(`heartbeat HTTP ${te.status}`);return P.windowFrom=v,P.pending={staged:0,shipped:0,skippedRecords:0,skippedFiles:0},wo({lastHeartbeatAt:v}),await L(),!0},b=async()=>{if(!(u||f)){f=!0;try{let P=await A();_+=P;try{if(await(await O()).drain({sessions:r,heartbeat:!1})){let B=await T();B.pending.shipped+=_,E.shipped+=_,_=0,p=Date.now(),g=0}else g++,i(`[evidence-ship] drain failed (${g} in a row); ${_} record(s) still unshipped`)}catch(v){g++,i(`[evidence-ship] ${v instanceof Error?v.message:String(v)}`)}}catch(P){g++,i(`[evidence-ship] ${P instanceof Error?P.message:String(P)}`)}finally{try{await I()}catch(P){i(`[evidence-ship] heartbeat failed: ${P instanceof Error?P.message:String(P)}`)}f=!1,wo({lastOkAt:p,consecutiveFailures:g,recordsStaged:E.staged,recordsShipped:E.shipped,recordsSkippedTooOld:E.skippedRecords,filesSkippedTooOld:E.skippedFiles})}}};b(),m=setInterval(()=>void b(),a*1e3),m.unref?.(),s(`[evidence-ship] enabled \u2192 ${t.evidenceUrl} (every ${a}s, ${o}-day window, content capture ${l?"ON":"off"})`);let N=()=>{u=!0,m&&clearInterval(m)};return{stop:N,async flush(){N();let P=Date.now()+c;for(;f&&Date.now()<P;)await new Promise(v=>setTimeout(v,50));if(f){i(`[evidence-ship] FINAL DRAIN ABANDONED after ${Math.round(c/1e3)}s \u2014 a ship was still in flight. ${_} staged record(s) plus anything written since are lost if this state dir is ephemeral. Raise ${qy} if this recurs.`);return}u=!1;try{await b()}finally{u=!0}_>0&&i(`[evidence-ship] final drain finished with ${_} record(s) still unshipped`)},lastOkAt:()=>p,status:()=>Yy()}}});var Zy=S(sr=>{"use strict";Object.defineProperty(sr,"__esModule",{value:!0});sr.PROTOCOL_VERSION=sr.DEFAULT_GATEWAY_OPERATOR_SCOPES=sr.GATEWAY_CLIENT_CAPS=sr.GATEWAY_CLIENT_MODES=sr.GATEWAY_CLIENT_IDS=void 0;sr.GATEWAY_CLIENT_IDS={GATEWAY_CLIENT:"gateway-client"};sr.GATEWAY_CLIENT_MODES={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",AGENT_BACKEND:"agent-backend",NODE:"node",PROBE:"probe",TEST:"test"};sr.GATEWAY_CLIENT_CAPS={TOOL_EVENTS:"tool-events"};sr.DEFAULT_GATEWAY_OPERATOR_SCOPES=["operator.admin","operator.read","operator.write","operator.approvals","operator.pairing"];sr.PROTOCOL_VERSION=3});var Pl=S(ir=>{"use strict";Object.defineProperty(ir,"__esModule",{value:!0});ir.GatewayClient=ir.MAX_GATEWAY_MESSAGE_CHARS=ir.MAX_GATEWAY_FRAME_BYTES=void 0;ir.createAgentIDEGatewayClient=V0;ir.createEphemeralGatewayClient=W0;var x0=require("events"),zs=Zy();ir.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})();ir.MAX_GATEWAY_MESSAGE_CHARS=256*1024;function B0(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 F0(t){let e=typeof t?.code=="number"?t.code:void 0;return e!==void 0&&e!==1e3&&e!==1001}var ma=class extends x0.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:zs.PROTOCOL_VERSION,maxProtocol:zs.PROTOCOL_VERSION,client:e,caps:[zs.GATEWAY_CLIENT_CAPS.TOOL_EVENTS],role:"operator",scopes:[...zs.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,F0(s)&&this.emit("error",new Error(B0(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>ir.MAX_GATEWAY_FRAME_BYTES){this.emit("error",new Error(`Gateway frame of ${n} bytes exceeds the ${ir.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}};ir.GatewayClient=ma;function V0(t,e,n="1.0.0"){let r=new ma({url:t,token:e,reconnectInterval:5e3,maxReconnectAttempts:10}),s={id:zs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo IDE",version:n,platform:process.platform,mode:zs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}function W0(t,e,n="1.0.0"){let r=new ma({url:t,token:e}),s={id:zs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo CLI",version:n,platform:process.platform,mode:zs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}});var Xf=S(Bt=>{"use strict";var K0=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]})),q0=Bt&&Bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yf=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"&&K0(n,e,r[s]);return q0(n,e),n}})();Object.defineProperty(Bt,"__esModule",{value:!0});Bt.GATEWAY_OUTBOUND_RPC_METHOD=void 0;Bt.stageLocalMediaIfNeeded=ew;Bt.buildGatewayOutboundSendArgs=tw;Bt.buildGatewaySendParams=Jf;Bt.buildGatewayRpcCommand=qf;Bt.sendGatewayOutboundMessage=aL;var Y0=require("child_process"),J0=require("crypto"),So=Yf(require("fs")),X0=Yf(require("os")),$r=Yf(require("path")),z0=br(),Q0=Pl(),Z0=18789;Bt.GATEWAY_OUTBOUND_RPC_METHOD="send";function eL(t){return t?.trim()||process.env.AGENTHIPPO_GATEWAY_CLI?.trim()||"hippoclaw"}var tL=".openclaw",nL=[".clawdbot",".moldbot",".moltbot"];function rL(){let t=X0.homedir(),e=process.env.OPENCLAW_STATE_DIR?.trim()||process.env.CLAWDBOT_STATE_DIR?.trim();if(e)return e==="~"||e.startsWith("~/")||e.startsWith("~\\")?$r.join(t,e.slice(1)):$r.resolve(e);let n=$r.join(t,tL);if(So.existsSync(n))return n;for(let r of nL){let s=$r.join(t,r);if(So.existsSync(s))return s}return n}function sL(t){return/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||t.startsWith("data:")}function ew(t){let e=t?.trim();if(!e||sL(e))return t;let n;try{n=So.realpathSync(e)}catch{return e}let r=$r.join(rL(),"media"),s=$r.resolve(r);try{s=So.realpathSync(r)}catch{}let i=$r.relative(s,n);if(i&&!i.startsWith("..")&&!$r.isAbsolute(i))return n;let o=$r.extname(n),a=$r.basename(n,o),c=(0,J0.createHash)("sha256").update(n).digest("hex").slice(0,8),l=$r.join(r,`${a}-${c}${o}`);return So.mkdirSync(r,{recursive:!0}),So.copyFileSync(n,l),l}function tw(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 Jf(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 qf(t,e,n){return[Bt.GATEWAY_OUTBOUND_RPC_METHOD,JSON.stringify(Jf(t,e,n))]}async function iL(t,e,n,r){let s=process.env.OPENCLAW_GATEWAY_URL?.trim()||`ws://127.0.0.1:${Z0}`,i=r?.trim()||(0,z0.readOpenClawGatewayToken)(),{client:o,clientInfo:a}=(0,Q0.createEphemeralGatewayClient)(s,i);await o.connect(a);try{let c=await o.request(Bt.GATEWAY_OUTBOUND_RPC_METHOD,Jf(t,e,n),6e4);return{stdout:JSON.stringify(c),stderr:""}}finally{o.close()}}function oL(t,e){let n=(0,Y0.spawnSync)(t,e,{encoding:"utf-8",env:process.env});return{stdout:(n.stdout??"").trim(),stderr:(n.stderr??"").trim(),exitCode:n.status}}async function aL(t,e){let n=eL(e.cli);if(e.dryRun)return{ok:!0,via:"dry-run",command:qf(t,e.message,e.media),stdout:"",stderr:"",exitCode:0};let r=ew(e.media),s=tw(t,e.message,r),i=[n,...s],o=qf(t,e.message,r);try{let a=await iL(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=oL(n,s);if(l.exitCode===0)return{ok:!0,via:"hippoclaw",command:i,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode};let d=l.stderr||l.stdout||"unknown error";return{ok:!1,via:"gateway-rpc",command:o,stdout:l.stdout,stderr:`Gateway RPC failed: ${c}
544
- HippoClaw CLI fallback failed (exit ${l.exitCode??"unknown"}): ${d}`.trim(),exitCode:l.exitCode}}}});var lw=S(qe=>{"use strict";var cL=qe&&qe.__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]})),lL=qe&&qe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),nw=qe&&qe.__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"&&cL(n,e,r[s]);return lL(n,e),n}})();Object.defineProperty(qe,"__esModule",{value:!0});qe.isAwsCliAvailable=pL;qe.resolveS3StateConfig=gL;qe.resolveRestoreBootMode=hL;qe.safeSessionId=Rl;qe.sessionRemoteUri=zf;qe.shardBelongsToSession=Qf;qe.hasLocalSessionState=rw;qe.listSessionShardFiles=sw;qe.stageSessionPushDir=iw;qe.mergeSessionStagingIntoState=ow;qe.restoreState=_L;qe.pushState=aw;qe.pushSessionState=cw;qe.ensureSessionLocal=yL;qe.clearRestoreAttemptCache=wL;qe.makeStatePusher=SL;qe.providerSessionShardName=AL;var uL=require("crypto"),dL=require("child_process"),zt=nw(require("fs/promises")),An=nw(require("path")),fL=require("util"),Ea=(0,fL.promisify)(dL.execFile),Nl=new Set;async function pL(){try{return await Ea("aws",["--version"]),!0}catch{return!1}}function gL(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 hL(t=process.env){return t.AGENTHIPPO_STATE_RESTORE_BOOT?.trim().toLowerCase()==="none"?"none":"all"}function Rl(t){return t.trim().replace(/[<>:"/\\|?*\x00-\x1F]+/g,"_").replace(/\.\./g,"_").slice(0,160)||"session"}function zf(t,e){return`${t.uri}/sessions/${Rl(e)}`}function Cl(t,e,n){let r=["s3","sync",e,n,"--no-progress"];return t.endpoint&&r.push("--endpoint-url",t.endpoint),r}function mL(t,e){return`${An.resolve(t)}\0${e}`}function Qf(t,e,n){if(n?.chatSessionId&&n.chatSessionId===e)return!0;let r=t.split(":");return r.length>=2&&r[1]===e}async function rw(t,e){let n=An.join(t,"provider-sessions"),r;try{r=await zt.readdir(n)}catch{return!1}for(let s of r)if(s.endsWith(".json"))try{let i=await zt.readFile(An.join(n,s),"utf8"),o=JSON.parse(i);if(typeof o.key=="string"&&Qf(o.key,e,o.value))return!0}catch{}return!1}async function sw(t,e){let n=An.join(t,"provider-sessions"),r;try{r=await zt.readdir(n)}catch{return[]}let s=[];for(let i of r)if(i.endsWith(".json"))try{let o=await zt.readFile(An.join(n,i),"utf8"),a=JSON.parse(o);typeof a.key=="string"&&Qf(a.key,e,a.value)&&s.push(i)}catch{}return s}async function EL(t){try{return await zt.access(t),!0}catch{return!1}}async function iw(t,e,n){await zt.rm(n,{recursive:!0,force:!0}),await zt.mkdir(n,{recursive:!0});let r=await sw(t,e),s=An.join(n,"provider-sessions");if(r.length>0){await zt.mkdir(s,{recursive:!0});for(let i of r)await zt.copyFile(An.join(t,"provider-sessions",i),An.join(s,i))}return r.length>0}async function ow(t,e){let n=An.join(t,"provider-sessions");if(await EL(n)){let r=An.join(e,"provider-sessions");await zt.mkdir(r,{recursive:!0});for(let s of await zt.readdir(n))s.endsWith(".json")&&await zt.copyFile(An.join(n,s),An.join(r,s))}}async function _L(t,e,n){try{await Ea("aws",Cl(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 aw(t,e,n){try{await Ea("aws",Cl(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 cw(t,e,n,r){let s=Rl(n),i=An.join(e,".push-staging",s);try{if(!await iw(e,n,i)){r?.(`State push skipped for session ${s}: nothing local`);return}let a=zf(t,n);await Ea("aws",Cl(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 zt.rm(i,{recursive:!0,force:!0}).catch(()=>{})}}async function yL(t,e,n,r){let s=mL(e,n);if(Nl.has(s))return;if(await rw(e,n)){Nl.add(s);return}let i=Rl(n),o=An.join(e,".restore-staging",i);try{await zt.rm(o,{recursive:!0,force:!0}),await zt.mkdir(o,{recursive:!0});let a=zf(t,n);await Ea("aws",Cl(t,a,o)),await ow(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{Nl.add(s),await zt.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}function wL(){Nl.clear()}function SL(t,e,n,r=1e3){let s=null,i=!1,o=null,a=new Set,c=!1,l=()=>{i=!0;let f=[...a],p=c;return a.clear(),c=!1,o=(async()=>{p&&await aw(t,e,n);for(let g of f)await cw(t,e,g,n)})().catch(g=>{console.error(`[state-sync] push batch failed: ${g instanceof Error?g.message:String(g)}`)}).finally(()=>{i=!1,o=null,(a.size>0||c)&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))}),o};return{schedule:f=>{f?.trim()?a.add(f.trim()):c=!0,!i&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))},flush:async()=>{s&&(clearTimeout(s),s=null),o&&await o,(a.size>0||c)&&(await l(),o&&await o)}}}function AL(t){return`${(0,uL.createHash)("sha256").update(t).digest("hex").slice(0,40)}.json`}});var uw=S(Jr=>{"use strict";Object.defineProperty(Jr,"__esModule",{value:!0});Jr.CLI_GATEWAY_AGENT_PREFIX=void 0;Jr.resolveCliGatewayAgentId=vL;Jr.isCliGatewayAgentId=OL;var TL=qn();Jr.CLI_GATEWAY_AGENT_PREFIX="agenthippo-cli";function bL(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,32)||"unnamed"}function vL(t){let e=(t??"").trim().toLowerCase();return!e||e===TL.AGENT_CONSTANTS.DEFAULT_AGENT_ID?Jr.CLI_GATEWAY_AGENT_PREFIX:`${Jr.CLI_GATEWAY_AGENT_PREFIX}-${bL(e)}`}function OL(t){let e=(t??"").trim().toLowerCase();return e===Jr.CLI_GATEWAY_AGENT_PREFIX||e.startsWith(`${Jr.CLI_GATEWAY_AGENT_PREFIX}-`)}});var tp=S(Os=>{"use strict";Object.defineProperty(Os,"__esModule",{value:!0});Os.fetchMeetAgentChannelContext=dw;Os.mapChannelsStatusToMeetAgentRows=ep;Os.parseChannelBindSpecs=RL;Os.applyAgentChannelBindingsViaConfigPatch=LL;Os.fetchMeetAgentChannelRows=ML;Os.waitForChannelsLive=UL;Os.resolvePublishedGatewayChannelIds=HL;var Zf={probe:!1,timeoutMs:1e4};async function dw(t){let e=await t("channels.status",Zf);return{rows:ep(e),statusPayload:e}}function Qs(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function ep(t){let e=Qs(t);if(!e)return[];let n=Array.isArray(e.channelOrder)?e.channelOrder:null,r=Qs(e.channelLabels)??{},s=Qs(e.channels)??{},i=Qs(e.channelAccounts)??{},o=Qs(e.channelDefaultAccountId)??{},a=n&&n.length>0?n:[...Object.keys(s)].sort((l,d)=>l.localeCompare(d)),c=[];for(let l of a){let d=typeof r[l]=="string"?r[l]:l,u=i[l],f=Array.isArray(u)?u:[],p=f.length>0?f.map(E=>typeof E.accountId=="string"?E.accountId:"default"):[typeof o[l]=="string"?o[l]:"default"],g=Qs(s[l]),m=g&&typeof g.connected=="boolean"?g.connected:g?.running===!0,h=f.some(E=>typeof E.connected=="boolean"&&E.connected||E.running===!0),w=m||h,_=g?.configured===!0||f.some(E=>E.configured===!0&&E.enabled!==!1)||w;c.push({id:l,label:d,connected:w,enabled:_,accounts:p})}return c}function IL(t){let e=Qs(t);if(!e)return{};let n=Qs(e.channelDefaultAccountId)??{},r={};for(let[s,i]of Object.entries(n))typeof i=="string"&&i.trim()&&(r[s]=i.trim());return r}function PL(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 NL(t){return typeof t!="string"||!t.trim()?"default":t.trim().toLowerCase()}function RL(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 CL(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 kL(t){let e=CL(t);return!!(e&&e.includes(":"))}function $L(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=NL(i.accountId);return o===e.trim().toLowerCase()&&a===n.trim().toLowerCase()}function DL(t){let e=t.agentId.trim().toLowerCase(),n=i=>t.channelAccountOverrides?.[i]??t.channelDefaultAccountId[i]??"default",r=t.existingBindings.filter(i=>{if(kL(i)||PL(i,e))return!1;for(let o of t.selectedChannelIds){let a=n(o);if($L(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 LL(t,e){let n=e.statusPayload??await t("channels.status",Zf),r=IL(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=DL({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 ML(t){let{rows:e}=await dw(t);return e}var GL=t=>new Promise(e=>setTimeout(e,t));async function UL(t,e,n={}){let r=[...new Set(e.map(f=>f.trim().toLowerCase()).filter(Boolean))];if(r.length===0)return{ready:!0,live:[],pending:[],polls:0,timedOut:!1};let s=n.timeoutMs??8e3,i=n.intervalMs??400,o=n.sleep??GL,a=n.now??Date.now,c=a(),l=0,d=[],u=[...r];for(;;){l++;let f;try{let g=await t("channels.status",Zf);f=ep(g)}catch{f=[]}let p=new Set(f.filter(g=>g.connected).map(g=>g.id.trim().toLowerCase()));if(d=r.filter(g=>p.has(g)),u=r.filter(g=>!p.has(g)),u.length===0)return{ready:!0,live:d,pending:u,polls:l,timedOut:!1};if(a()-c>=s)return{ready:!1,live:d,pending:u,polls:l,timedOut:!0};await o(i)}}function HL(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 _w=S(Qt=>{"use strict";var pw=Qt&&Qt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Qt,"__esModule",{value:!0});Qt.GatewayBridge=Qt.MAX_GATEWAY_ID_CHARS=void 0;Qt.isIdeThreadCompositeRouteKey=gw;Qt.parseIdeThreadIdFromCompositeRouteKey=FL;Qt.findOversizedRunField=hw;Qt.buildIdeSessionRouteKey=mw;Qt.extractRouteLabelFromGatewaySessionKey=Ew;Qt.looksLikeGatewayChannelRouteKey=WL;Qt.createGatewayBridge=KL;var jL=require("events"),np=Pl(),xL=pw(require("node:os")),rp=pw(require("node:path")),BL=cl(),fw=Ac(),Ao="::sid:";function gw(t){return!!t?.includes(Ao)}function FL(t){if(!t||!gw(t))return;let e=t.lastIndexOf(Ao),n=t.slice(e+Ao.length).trim();return n.length>0?n:void 0}Qt.MAX_GATEWAY_ID_CHARS=512;var VL=["agentId","sessionKey","sessionId","channel","accountId","target","threadId","groupId","senderUsername","senderName","senderId"];function hw(t){let e=t;for(let n of VL){let r=e[n];if(r!=null&&(typeof r!="string"||r.length>Qt.MAX_GATEWAY_ID_CHARS))return n}}function mw(t,e){let n=t?.trim(),r=e?.trim();return n&&r?`${n}${Ao}${r}`:n||r}function Ew(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 WL(t){let e=t&&t.includes(Ao)?t.slice(0,t.lastIndexOf(Ao)):t,r=(e?Ew(e)??e:void 0)?.split(":").filter(Boolean)??[];return r.length<2?!1:["channel","chat","dm","group","thread","user"].includes(r[1].trim().toLowerCase())}var kl=class extends jL.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,np.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=rp.default.join(xL.default.homedir(),".openclaw");return e==="main"?rp.default.join(n,"workspace"):rp.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,fw.resolveGatewaySessionDirId)({gatewaySessionKey:a});if(!c)return;let l=(0,fw.getGatewayOutboundFilePath)(o,c),d=e.agentId?.trim()||n;(0,BL.upsertGatewayOutboundHandle)(l,d,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>np.MAX_GATEWAY_MESSAGE_CHARS){this.client.respond(e.id,void 0,!1,{code:"MESSAGE_TOO_LARGE",message:`message exceeds ${np.MAX_GATEWAY_MESSAGE_CHARS} characters`});return}let r=hw(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=mw(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 d=this.client,u="",f="",p=0,g=!1,m=150,h=o,w=()=>{u!==f&&(f=u,p=Date.now(),d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"delta",text:u}))},_={async thinking(){g||(w(),g=!0,d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"thinking"}))},async text(T){g=!1,u+=T,Date.now()-p>=m&&w()},async toolStart(T){w(),d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:T,toolState:"start"})},async toolEnd(T){d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:T,toolState:"end"})},async progress(T){d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:T})},async question(T){return d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:`Question: ${T.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(T){u+=`
562
+ `);let Ie=Date.now()/1e3;await rr.promises.utimes(te,Ie,Ie),B+=X.length}return E.staged+=B,I.pending.staged+=B,I.windowFrom===void 0&&(I.windowFrom=v),await L(),B},P=async()=>{let I=await T(),v=Date.now(),F=(0,Wy.getSessionEventWriterStats)(),B={kind:"session_ship_heartbeat",instance_id:t.instanceId,wire:"agenthippo/session-ship/1",window_from_ms:I.windowFrom??v,window_to_ms:v,interval_sec:a,since_days:o,records_staged:I.pending.staged,records_shipped:I.pending.shipped,records_skipped_too_old:I.pending.skippedRecords,files_skipped_too_old:I.pending.skippedFiles,evidence_write_failures:F.failed,evidence_writes:F.written,consecutive_ship_failures:g,content_capture:l,totals:{...E}},re=1;try{({INGEST_WIRE_VERSION:re}=await import("@agenthippo-ai/evidence-ship"))}catch{}let X=JSON.stringify(B),te=await fetch(`${t.evidenceUrl.replace(/\/$/,"")}/ingest/batch`,{method:"POST",headers:{authorization:`Bearer ${t.shipToken}`,"content-type":"application/json","X-Evidence-Ingest-Version":String(re)},body:JSON.stringify({instance_id:t.instanceId,kind:"heartbeat",name:"heartbeat.json",content_gzip_b64:(0,$L.gzipSync)(Buffer.from(X)).toString("base64")})});if(!te.ok)throw new Error(`heartbeat HTTP ${te.status}`);return I.windowFrom=v,I.pending={staged:0,shipped:0,skippedRecords:0,skippedFiles:0},wo({lastHeartbeatAt:v}),await L(),!0},b=async()=>{if(!(u||f)){f=!0;try{let I=await A();_+=I;try{if(await(await O()).drain({sessions:r,heartbeat:!1})){let B=await T();B.pending.shipped+=_,E.shipped+=_,_=0,p=Date.now(),g=0}else g++,i(`[evidence-ship] drain failed (${g} in a row); ${_} record(s) still unshipped`)}catch(v){g++,i(`[evidence-ship] ${v instanceof Error?v.message:String(v)}`)}}catch(I){g++,i(`[evidence-ship] ${I instanceof Error?I.message:String(I)}`)}finally{try{await P()}catch(I){i(`[evidence-ship] heartbeat failed: ${I instanceof Error?I.message:String(I)}`)}f=!1,wo({lastOkAt:p,consecutiveFailures:g,recordsStaged:E.staged,recordsShipped:E.shipped,recordsSkippedTooOld:E.skippedRecords,filesSkippedTooOld:E.skippedFiles})}}};b(),m=setInterval(()=>void b(),a*1e3),m.unref?.(),s(`[evidence-ship] enabled \u2192 ${t.evidenceUrl} (every ${a}s, ${o}-day window, content capture ${l?"ON":"off"})`);let N=()=>{u=!0,m&&clearInterval(m)};return{stop:N,async flush(){N();let I=Date.now()+c;for(;f&&Date.now()<I;)await new Promise(v=>setTimeout(v,50));if(f){i(`[evidence-ship] FINAL DRAIN ABANDONED after ${Math.round(c/1e3)}s \u2014 a ship was still in flight. ${_} staged record(s) plus anything written since are lost if this state dir is ephemeral. Raise ${qy} if this recurs.`);return}u=!1;try{await b()}finally{u=!0}_>0&&i(`[evidence-ship] final drain finished with ${_} record(s) still unshipped`)},lastOkAt:()=>p,status:()=>Yy()}}});var Zy=S(sr=>{"use strict";Object.defineProperty(sr,"__esModule",{value:!0});sr.PROTOCOL_VERSION=sr.DEFAULT_GATEWAY_OPERATOR_SCOPES=sr.GATEWAY_CLIENT_CAPS=sr.GATEWAY_CLIENT_MODES=sr.GATEWAY_CLIENT_IDS=void 0;sr.GATEWAY_CLIENT_IDS={GATEWAY_CLIENT:"gateway-client"};sr.GATEWAY_CLIENT_MODES={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",AGENT_BACKEND:"agent-backend",NODE:"node",PROBE:"probe",TEST:"test"};sr.GATEWAY_CLIENT_CAPS={TOOL_EVENTS:"tool-events"};sr.DEFAULT_GATEWAY_OPERATOR_SCOPES=["operator.admin","operator.read","operator.write","operator.approvals","operator.pairing"];sr.PROTOCOL_VERSION=3});var Il=S(ir=>{"use strict";Object.defineProperty(ir,"__esModule",{value:!0});ir.GatewayClient=ir.MAX_GATEWAY_MESSAGE_CHARS=ir.MAX_GATEWAY_FRAME_BYTES=void 0;ir.createAgentIDEGatewayClient=VL;ir.createEphemeralGatewayClient=WL;var xL=require("events"),zs=Zy();ir.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})();ir.MAX_GATEWAY_MESSAGE_CHARS=256*1024;function BL(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 FL(t){let e=typeof t?.code=="number"?t.code:void 0;return e!==void 0&&e!==1e3&&e!==1001}var ma=class extends xL.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:zs.PROTOCOL_VERSION,maxProtocol:zs.PROTOCOL_VERSION,client:e,caps:[zs.GATEWAY_CLIENT_CAPS.TOOL_EVENTS],role:"operator",scopes:[...zs.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,FL(s)&&this.emit("error",new Error(BL(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>ir.MAX_GATEWAY_FRAME_BYTES){this.emit("error",new Error(`Gateway frame of ${n} bytes exceeds the ${ir.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}};ir.GatewayClient=ma;function VL(t,e,n="1.0.0"){let r=new ma({url:t,token:e,reconnectInterval:5e3,maxReconnectAttempts:10}),s={id:zs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo IDE",version:n,platform:process.platform,mode:zs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}function WL(t,e,n="1.0.0"){let r=new ma({url:t,token:e}),s={id:zs.GATEWAY_CLIENT_IDS.GATEWAY_CLIENT,displayName:"AgentHippo CLI",version:n,platform:process.platform,mode:zs.GATEWAY_CLIENT_MODES.AGENT_BACKEND};return{client:r,clientInfo:s}}});var Xf=S(Bt=>{"use strict";var KL=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]})),qL=Bt&&Bt.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yf=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"&&KL(n,e,r[s]);return qL(n,e),n}})();Object.defineProperty(Bt,"__esModule",{value:!0});Bt.GATEWAY_OUTBOUND_RPC_METHOD=void 0;Bt.stageLocalMediaIfNeeded=ew;Bt.buildGatewayOutboundSendArgs=tw;Bt.buildGatewaySendParams=Jf;Bt.buildGatewayRpcCommand=qf;Bt.sendGatewayOutboundMessage=a0;var YL=require("child_process"),JL=require("crypto"),So=Yf(require("fs")),XL=Yf(require("os")),$r=Yf(require("path")),zL=br(),QL=Il(),ZL=18789;Bt.GATEWAY_OUTBOUND_RPC_METHOD="send";function e0(t){return t?.trim()||process.env.AGENTHIPPO_GATEWAY_CLI?.trim()||"hippoclaw"}var t0=".openclaw",n0=[".clawdbot",".moldbot",".moltbot"];function r0(){let t=XL.homedir(),e=process.env.OPENCLAW_STATE_DIR?.trim()||process.env.CLAWDBOT_STATE_DIR?.trim();if(e)return e==="~"||e.startsWith("~/")||e.startsWith("~\\")?$r.join(t,e.slice(1)):$r.resolve(e);let n=$r.join(t,t0);if(So.existsSync(n))return n;for(let r of n0){let s=$r.join(t,r);if(So.existsSync(s))return s}return n}function s0(t){return/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||t.startsWith("data:")}function ew(t){let e=t?.trim();if(!e||s0(e))return t;let n;try{n=So.realpathSync(e)}catch{return e}let r=$r.join(r0(),"media"),s=$r.resolve(r);try{s=So.realpathSync(r)}catch{}let i=$r.relative(s,n);if(i&&!i.startsWith("..")&&!$r.isAbsolute(i))return n;let o=$r.extname(n),a=$r.basename(n,o),c=(0,JL.createHash)("sha256").update(n).digest("hex").slice(0,8),l=$r.join(r,`${a}-${c}${o}`);return So.mkdirSync(r,{recursive:!0}),So.copyFileSync(n,l),l}function tw(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 Jf(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 qf(t,e,n){return[Bt.GATEWAY_OUTBOUND_RPC_METHOD,JSON.stringify(Jf(t,e,n))]}async function i0(t,e,n,r){let s=process.env.OPENCLAW_GATEWAY_URL?.trim()||`ws://127.0.0.1:${ZL}`,i=r?.trim()||(0,zL.readOpenClawGatewayToken)(),{client:o,clientInfo:a}=(0,QL.createEphemeralGatewayClient)(s,i);await o.connect(a);try{let c=await o.request(Bt.GATEWAY_OUTBOUND_RPC_METHOD,Jf(t,e,n),6e4);return{stdout:JSON.stringify(c),stderr:""}}finally{o.close()}}function o0(t,e){let n=(0,YL.spawnSync)(t,e,{encoding:"utf-8",env:process.env});return{stdout:(n.stdout??"").trim(),stderr:(n.stderr??"").trim(),exitCode:n.status}}async function a0(t,e){let n=e0(e.cli);if(e.dryRun)return{ok:!0,via:"dry-run",command:qf(t,e.message,e.media),stdout:"",stderr:"",exitCode:0};let r=ew(e.media),s=tw(t,e.message,r),i=[n,...s],o=qf(t,e.message,r);try{let a=await i0(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=o0(n,s);if(l.exitCode===0)return{ok:!0,via:"hippoclaw",command:i,stdout:l.stdout,stderr:l.stderr,exitCode:l.exitCode};let d=l.stderr||l.stdout||"unknown error";return{ok:!1,via:"gateway-rpc",command:o,stdout:l.stdout,stderr:`Gateway RPC failed: ${c}
563
+ HippoClaw CLI fallback failed (exit ${l.exitCode??"unknown"}): ${d}`.trim(),exitCode:l.exitCode}}}});var lw=S(qe=>{"use strict";var c0=qe&&qe.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),l0=qe&&qe.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),nw=qe&&qe.__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"&&c0(n,e,r[s]);return l0(n,e),n}})();Object.defineProperty(qe,"__esModule",{value:!0});qe.isAwsCliAvailable=p0;qe.resolveS3StateConfig=g0;qe.resolveRestoreBootMode=h0;qe.safeSessionId=Rl;qe.sessionRemoteUri=zf;qe.shardBelongsToSession=Qf;qe.hasLocalSessionState=rw;qe.listSessionShardFiles=sw;qe.stageSessionPushDir=iw;qe.mergeSessionStagingIntoState=ow;qe.restoreState=_0;qe.pushState=aw;qe.pushSessionState=cw;qe.ensureSessionLocal=y0;qe.clearRestoreAttemptCache=w0;qe.makeStatePusher=S0;qe.providerSessionShardName=A0;var u0=require("crypto"),d0=require("child_process"),zt=nw(require("fs/promises")),An=nw(require("path")),f0=require("util"),Ea=(0,f0.promisify)(d0.execFile),Nl=new Set;async function p0(){try{return await Ea("aws",["--version"]),!0}catch{return!1}}function g0(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 h0(t=process.env){return t.AGENTHIPPO_STATE_RESTORE_BOOT?.trim().toLowerCase()==="none"?"none":"all"}function Rl(t){return t.trim().replace(/[<>:"/\\|?*\x00-\x1F]+/g,"_").replace(/\.\./g,"_").slice(0,160)||"session"}function zf(t,e){return`${t.uri}/sessions/${Rl(e)}`}function Cl(t,e,n){let r=["s3","sync",e,n,"--no-progress"];return t.endpoint&&r.push("--endpoint-url",t.endpoint),r}function m0(t,e){return`${An.resolve(t)}\0${e}`}function Qf(t,e,n){if(n?.chatSessionId&&n.chatSessionId===e)return!0;let r=t.split(":");return r.length>=2&&r[1]===e}async function rw(t,e){let n=An.join(t,"provider-sessions"),r;try{r=await zt.readdir(n)}catch{return!1}for(let s of r)if(s.endsWith(".json"))try{let i=await zt.readFile(An.join(n,s),"utf8"),o=JSON.parse(i);if(typeof o.key=="string"&&Qf(o.key,e,o.value))return!0}catch{}return!1}async function sw(t,e){let n=An.join(t,"provider-sessions"),r;try{r=await zt.readdir(n)}catch{return[]}let s=[];for(let i of r)if(i.endsWith(".json"))try{let o=await zt.readFile(An.join(n,i),"utf8"),a=JSON.parse(o);typeof a.key=="string"&&Qf(a.key,e,a.value)&&s.push(i)}catch{}return s}async function E0(t){try{return await zt.access(t),!0}catch{return!1}}async function iw(t,e,n){await zt.rm(n,{recursive:!0,force:!0}),await zt.mkdir(n,{recursive:!0});let r=await sw(t,e),s=An.join(n,"provider-sessions");if(r.length>0){await zt.mkdir(s,{recursive:!0});for(let i of r)await zt.copyFile(An.join(t,"provider-sessions",i),An.join(s,i))}return r.length>0}async function ow(t,e){let n=An.join(t,"provider-sessions");if(await E0(n)){let r=An.join(e,"provider-sessions");await zt.mkdir(r,{recursive:!0});for(let s of await zt.readdir(n))s.endsWith(".json")&&await zt.copyFile(An.join(n,s),An.join(r,s))}}async function _0(t,e,n){try{await Ea("aws",Cl(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 aw(t,e,n){try{await Ea("aws",Cl(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 cw(t,e,n,r){let s=Rl(n),i=An.join(e,".push-staging",s);try{if(!await iw(e,n,i)){r?.(`State push skipped for session ${s}: nothing local`);return}let a=zf(t,n);await Ea("aws",Cl(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 zt.rm(i,{recursive:!0,force:!0}).catch(()=>{})}}async function y0(t,e,n,r){let s=m0(e,n);if(Nl.has(s))return;if(await rw(e,n)){Nl.add(s);return}let i=Rl(n),o=An.join(e,".restore-staging",i);try{await zt.rm(o,{recursive:!0,force:!0}),await zt.mkdir(o,{recursive:!0});let a=zf(t,n);await Ea("aws",Cl(t,a,o)),await ow(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{Nl.add(s),await zt.rm(o,{recursive:!0,force:!0}).catch(()=>{})}}function w0(){Nl.clear()}function S0(t,e,n,r=1e3){let s=null,i=!1,o=null,a=new Set,c=!1,l=()=>{i=!0;let f=[...a],p=c;return a.clear(),c=!1,o=(async()=>{p&&await aw(t,e,n);for(let g of f)await cw(t,e,g,n)})().catch(g=>{console.error(`[state-sync] push batch failed: ${g instanceof Error?g.message:String(g)}`)}).finally(()=>{i=!1,o=null,(a.size>0||c)&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))}),o};return{schedule:f=>{f?.trim()?a.add(f.trim()):c=!0,!i&&(s||(s=setTimeout(()=>{s=null,l()},r),s.unref?.()))},flush:async()=>{s&&(clearTimeout(s),s=null),o&&await o,(a.size>0||c)&&(await l(),o&&await o)}}}function A0(t){return`${(0,u0.createHash)("sha256").update(t).digest("hex").slice(0,40)}.json`}});var uw=S(Jr=>{"use strict";Object.defineProperty(Jr,"__esModule",{value:!0});Jr.CLI_GATEWAY_AGENT_PREFIX=void 0;Jr.resolveCliGatewayAgentId=v0;Jr.isCliGatewayAgentId=O0;var T0=qn();Jr.CLI_GATEWAY_AGENT_PREFIX="agenthippo-cli";function b0(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,32)||"unnamed"}function v0(t){let e=(t??"").trim().toLowerCase();return!e||e===T0.AGENT_CONSTANTS.DEFAULT_AGENT_ID?Jr.CLI_GATEWAY_AGENT_PREFIX:`${Jr.CLI_GATEWAY_AGENT_PREFIX}-${b0(e)}`}function O0(t){let e=(t??"").trim().toLowerCase();return e===Jr.CLI_GATEWAY_AGENT_PREFIX||e.startsWith(`${Jr.CLI_GATEWAY_AGENT_PREFIX}-`)}});var tp=S(Os=>{"use strict";Object.defineProperty(Os,"__esModule",{value:!0});Os.fetchMeetAgentChannelContext=dw;Os.mapChannelsStatusToMeetAgentRows=ep;Os.parseChannelBindSpecs=R0;Os.applyAgentChannelBindingsViaConfigPatch=L0;Os.fetchMeetAgentChannelRows=M0;Os.waitForChannelsLive=U0;Os.resolvePublishedGatewayChannelIds=H0;var Zf={probe:!1,timeoutMs:1e4};async function dw(t){let e=await t("channels.status",Zf);return{rows:ep(e),statusPayload:e}}function Qs(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function ep(t){let e=Qs(t);if(!e)return[];let n=Array.isArray(e.channelOrder)?e.channelOrder:null,r=Qs(e.channelLabels)??{},s=Qs(e.channels)??{},i=Qs(e.channelAccounts)??{},o=Qs(e.channelDefaultAccountId)??{},a=n&&n.length>0?n:[...Object.keys(s)].sort((l,d)=>l.localeCompare(d)),c=[];for(let l of a){let d=typeof r[l]=="string"?r[l]:l,u=i[l],f=Array.isArray(u)?u:[],p=f.length>0?f.map(E=>typeof E.accountId=="string"?E.accountId:"default"):[typeof o[l]=="string"?o[l]:"default"],g=Qs(s[l]),m=g&&typeof g.connected=="boolean"?g.connected:g?.running===!0,h=f.some(E=>typeof E.connected=="boolean"&&E.connected||E.running===!0),w=m||h,_=g?.configured===!0||f.some(E=>E.configured===!0&&E.enabled!==!1)||w;c.push({id:l,label:d,connected:w,enabled:_,accounts:p})}return c}function P0(t){let e=Qs(t);if(!e)return{};let n=Qs(e.channelDefaultAccountId)??{},r={};for(let[s,i]of Object.entries(n))typeof i=="string"&&i.trim()&&(r[s]=i.trim());return r}function I0(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 N0(t){return typeof t!="string"||!t.trim()?"default":t.trim().toLowerCase()}function R0(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 C0(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 k0(t){let e=C0(t);return!!(e&&e.includes(":"))}function $0(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=N0(i.accountId);return o===e.trim().toLowerCase()&&a===n.trim().toLowerCase()}function D0(t){let e=t.agentId.trim().toLowerCase(),n=i=>t.channelAccountOverrides?.[i]??t.channelDefaultAccountId[i]??"default",r=t.existingBindings.filter(i=>{if(k0(i)||I0(i,e))return!1;for(let o of t.selectedChannelIds){let a=n(o);if($0(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 L0(t,e){let n=e.statusPayload??await t("channels.status",Zf),r=P0(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=D0({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 M0(t){let{rows:e}=await dw(t);return e}var G0=t=>new Promise(e=>setTimeout(e,t));async function U0(t,e,n={}){let r=[...new Set(e.map(f=>f.trim().toLowerCase()).filter(Boolean))];if(r.length===0)return{ready:!0,live:[],pending:[],polls:0,timedOut:!1};let s=n.timeoutMs??8e3,i=n.intervalMs??400,o=n.sleep??G0,a=n.now??Date.now,c=a(),l=0,d=[],u=[...r];for(;;){l++;let f;try{let g=await t("channels.status",Zf);f=ep(g)}catch{f=[]}let p=new Set(f.filter(g=>g.connected).map(g=>g.id.trim().toLowerCase()));if(d=r.filter(g=>p.has(g)),u=r.filter(g=>!p.has(g)),u.length===0)return{ready:!0,live:d,pending:u,polls:l,timedOut:!1};if(a()-c>=s)return{ready:!1,live:d,pending:u,polls:l,timedOut:!0};await o(i)}}function H0(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 _w=S(Qt=>{"use strict";var pw=Qt&&Qt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Qt,"__esModule",{value:!0});Qt.GatewayBridge=Qt.MAX_GATEWAY_ID_CHARS=void 0;Qt.isIdeThreadCompositeRouteKey=gw;Qt.parseIdeThreadIdFromCompositeRouteKey=F0;Qt.findOversizedRunField=hw;Qt.buildIdeSessionRouteKey=mw;Qt.extractRouteLabelFromGatewaySessionKey=Ew;Qt.looksLikeGatewayChannelRouteKey=W0;Qt.createGatewayBridge=K0;var j0=require("events"),np=Il(),x0=pw(require("node:os")),rp=pw(require("node:path")),B0=cl(),fw=Ac(),Ao="::sid:";function gw(t){return!!t?.includes(Ao)}function F0(t){if(!t||!gw(t))return;let e=t.lastIndexOf(Ao),n=t.slice(e+Ao.length).trim();return n.length>0?n:void 0}Qt.MAX_GATEWAY_ID_CHARS=512;var V0=["agentId","sessionKey","sessionId","channel","accountId","target","threadId","groupId","senderUsername","senderName","senderId"];function hw(t){let e=t;for(let n of V0){let r=e[n];if(r!=null&&(typeof r!="string"||r.length>Qt.MAX_GATEWAY_ID_CHARS))return n}}function mw(t,e){let n=t?.trim(),r=e?.trim();return n&&r?`${n}${Ao}${r}`:n||r}function Ew(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 W0(t){let e=t&&t.includes(Ao)?t.slice(0,t.lastIndexOf(Ao)):t,r=(e?Ew(e)??e:void 0)?.split(":").filter(Boolean)??[];return r.length<2?!1:["channel","chat","dm","group","thread","user"].includes(r[1].trim().toLowerCase())}var kl=class extends j0.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,np.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=rp.default.join(x0.default.homedir(),".openclaw");return e==="main"?rp.default.join(n,"workspace"):rp.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,fw.resolveGatewaySessionDirId)({gatewaySessionKey:a});if(!c)return;let l=(0,fw.getGatewayOutboundFilePath)(o,c),d=e.agentId?.trim()||n;(0,B0.upsertGatewayOutboundHandle)(l,d,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>np.MAX_GATEWAY_MESSAGE_CHARS){this.client.respond(e.id,void 0,!1,{code:"MESSAGE_TOO_LARGE",message:`message exceeds ${np.MAX_GATEWAY_MESSAGE_CHARS} characters`});return}let r=hw(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=mw(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 d=this.client,u="",f="",p=0,g=!1,m=150,h=o,w=()=>{u!==f&&(f=u,p=Date.now(),d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"delta",text:u}))},_={async thinking(){g||(w(),g=!0,d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"thinking"}))},async text(T){g=!1,u+=T,Date.now()-p>=m&&w()},async toolStart(T){w(),d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:T,toolState:"start"})},async toolEnd(T){d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"tool",toolName:T,toolState:"end"})},async progress(T){d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:T})},async question(T){return d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"progress",message:`Question: ${T.prompt}`}),{selected:[],freeText:null,declined:!0}},async error(T){u+=`
545
564
  [Error: ${T}]`,d.sendEvent("agent.stream",{runId:a,agentId:s,sessionKey:h,state:"error",message:T})},async done(){}},E=await i.messageHandler(n.message,{engineId:l,sessionId:o,gatewaySessionKey:n.sessionKey,workspaceRoot:i.workspace,emitter:_,peerInfo:n.senderUsername||n.senderName||n.senderId||n.channel?{senderUsername:n.senderUsername,senderName:n.senderName,senderId:n.senderId,channel:n.channel}:void 0});if(!E.success&&E.error)throw new Error(E.error);this.log(`Agent ${s} completed: fullText.len=${u?.length||0}`),u||this.log(`WARNING: Agent ${s} produced empty response!`),w();let O={text:u,runId:n.idempotencyKey};this.client.respond(e.id,O,!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,d={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+=`
546
- [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,f=await n.chatUIHandler(r.message,i,u,d,{params:r,runId:s,agentId:o}),p=c||f;this.log(`Agent ${o} (Chat UI) completed: response.len=${p.length}`),p||this.log(`WARNING: Agent ${o} (Chat UI) produced empty response!`);let g={text:p,runId:r.idempotencyKey};this.client.respond(e.id,g,!0),this.emit("agent.response",{agentId:o,message:r.message,response:p})}catch(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)}};Qt.GatewayBridge=kl;function KL(t){return new kl(t)}});var $w=S(bn=>{"use strict";var qL=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]})),YL=bn&&bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sa=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"&&qL(n,e,r[s]);return YL(n,e),n}})();Object.defineProperty(bn,"__esModule",{value:!0});bn.resolvePackEngineModel=op;bn.engineUnavailableReason=Pw;bn.serveCommand=iM;bn.resolveGatewaySessionKey=Nw;bn.runGatewayTurn=Rw;bn.runBridgeTurn=Cw;var yw=Sa(require("crypto")),fn=Sa(require("fs")),ww=Sa(require("os")),JL=Sa(require("http")),Tn=Sa(require("path")),Sw=require("node:crypto"),XL=uy(),_a=Oi(),Hn=mo(),$l=Rf(),zL=Df(),Li=Eo(),QL=aa(),Aw=bl(),Tw=Sy(),Dl=Py(),bw=Dy(),Xr=Hf(),ZL=Ri(),jn=bi(),Is=vi(),C=Xt(),eM=Bf(),sp=Qy(),he=Ir(),Ml=ps(),Ll=Eo(),tM=Zi(),ut=Ni(),vw=br(),nM=Xf(),Ow=ro(),ya=hi(),Zs=lw(),rM=uw(),ip=tp(),sM=Bs(),wa="-".repeat(62);function op(t,e){let n=(e.engine||t.spec.engine||(0,Is.getDefaultConfig)().engine).trim().toLowerCase(),r=["claude","codex"].includes(n)?void 0:(0,sM.tryResolveCustomEngineManifest)(e.workspace,n)?.model?.defaultModel,s=e.model||t.spec.model||r||(0,Is.getEnvDefaultModel)()||(0,Is.getDefaultConfig)().model;return{engine:n,model:(0,jn.resolveModelAlias)(s)}}function Pw(t,e){if(!(0,Is.hasCredentialForEngine)(t,e.apiConfig))return`no usable API key for engine "${t}" (${t==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"} or the LiteLLM proxy)`;if(!e.engineRunsInSandbox&&t==="claude"&&!e.claudeCodePath)return"Claude Code CLI not found on this host";if(!e.engineRunsInSandbox&&t==="codex"&&!e.codexPath)return"Codex CLI not found on this host"}async function iM(t){process.env.AGENTHIPPO_SERVE="1";let e=(0,Is.getApiConfig)();e.useLiteLLM&&!e.litellmApiKey&&console.warn(`${C.COLORS.yellow}Warning:${C.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 jn.ConsoleLogger("[Sync]"):new jn.NoOpLogger;try{n=await(0,Is.loadAgentPack)(t.agent,t.workspace)}catch(y){console.error(`Error: ${y instanceof Error?y.message:y}`),process.exit(1)}let s=n.manifest.metadata.name,i=(0,rM.resolveCliGatewayAgentId)(s),o=op(n.manifest,t),a=o.engine,c=o.model,l=n.manifest.spec.cheapModel?.trim(),d=l?(0,jn.resolveModelAlias)(l):void 0,u=n.manifest.spec.effort?.trim()||void 0;if(!(0,Is.hasCredentialForEngine)(a,e)){console.error(`Error: No usable API key for engine "${a}". Set ${a==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}, or configure the LiteLLM proxy (AGENTHIPPO_LITELLM_API_KEY + AGENTHIPPO_LITELLM_BASE_URL).`);for(let R of(0,C.getLiteLLMQuickstartHintLines)())console.error(R);process.exit(1)}let f=t.verbose?new jn.ConsoleLogger("[Server]"):new jn.NoOpLogger,p=n.packPath,g=n.manifest.metadata.version??"0.0.0",m,h=await(0,Hn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL}),w=(y,R="pack")=>{for(let ee of y.warnings)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${ee}`);y.status==="unavailable"&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${R} trust root is configured but unusable: ${y.reason}`)};w(h);let _=(0,Hn.createPackVerifier)(),E={ok:!1,kind:"no-pack",reason:"not verified"},O=(y,R)=>(E=_.refresh({packDir:y,pack:s,packVersion:R,keys:h.keys}),m=E.ok?E.claims.digest:void 0,f.info(E.ok?`[Pack] signature verified for ${s}`:`[Pack] unverified \u2014 ${E.reason}`),E),T=y=>{if(y.ok)return"";let R=h.status==="unavailable"&&y.kind==="no-trust-root"?"trust-root-unavailable":y.kind;return(0,Hn.describePackRefusal)({kind:R,detail:R==="trust-root-unavailable"?h.reason??y.reason:y.reason,pack:s,packVersion:g,packDir:p,trustRootHint:h.url?`Trust root: ${h.url} (${h.reason??"unavailable"})`:h.reason})};O(p,g);let L=!!t.allowUnsignedPack||(0,Hn.allowUnsignedPackFromEnv)();E.ok||(L||(console.error(`${C.COLORS.red}Error: ${T(E)}${C.COLORS.reset}`),process.exit(1)),console.warn(wa),console.warn(`${C.COLORS.yellow}!! RUNNING AN UNVERIFIED PACK \u2014 signature checking is DISABLED on this instance.${C.COLORS.reset}`),console.warn(`${C.COLORS.yellow}!! ${E.reason}${C.COLORS.reset}`),console.warn(`${C.COLORS.yellow}!! Whatever is in ${p} will be executed, verified by nobody.${C.COLORS.reset}`),console.warn(`${C.COLORS.yellow}!! This is a LOCAL DEVELOPMENT setting (AGENTHIPPO_ALLOW_UNSIGNED_PACK). Do not ship it.${C.COLORS.reset}`),console.warn(wa));let A=(0,C.findBundledBasePromptsDir)();await(0,jn.syncPackToWorkspace)(t.workspace,n.packPath,s,a,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=${a}`);let{dir:I,ephemeral:b}=(0,he.resolveStateDir)(t.stateDir),N=(0,he.resolveBindHost)(t.host);for(let y of(0,he.identityHeaderAdvice)(process.env,N))console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`);let P=(0,he.tenantIsolationAdvice)({sandbox:t.sandbox,sharedWorkspace:!!t.sharedWorkspace,workspace:t.workspace,stateDir:I});if(P.level==="refuse"){for(let y of P.lines)console.error(`${C.COLORS.red}Error:${C.COLORS.reset} ${y}`);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 y of P.lines)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`);let v=(0,he.resolveAnalyticsSessionsDir)(I,b),F=new Ow.SessionEventWriter(v),B=y=>R=>F.append(y,(0,ya.generateRequestId)(),"warrant_denied",{reason:R}),re=(0,ut.resolveDataPlaneConfig)(n.manifest.spec,n.packPath),X=(0,ut.resolveEdgeDataPlane)(),te=X?new ut.EdgeDataPlane(X):null,Pe=te?null:(0,ut.resolveRemoteDataPlane)(),Ge=Pe?new ut.RemoteDataPlane(Pe):null,xe=re&&!Ge&&!te||t.gatewayBridge?new ut.TurnRegistry:null,Mt=(y,R,ee)=>F.append(y,(0,ya.generateRequestId)(),R,{...ee,agent:{pack:s,version:g,digest:m??null}}),Et=null,hr=null;if(te)process.env[ut.DATA_MCP_URL_ENV]=te.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 ${te.url}; turn nonces are minted at the edge, serve holds no registration credential`);else if(Ge)process.env[ut.DATA_MCP_URL_ENV]=Ge.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,console.log(`OK: Data plane SIDECAR \u2014 gateway ${Ge.url}; base credentials stay in the connector container, not here`);else if(re)try{Et=await ut.DataPlane.start(re,{logger:t.verbose?new jn.ConsoleLogger("[DataPlane]"):new jn.NoOpLogger,audit:Mt,registry:xe??void 0}),process.env[ut.DATA_MCP_URL_ENV]=Et.url,console.log(`OK: Data gateway (provider=${Et.broker.provider.name}) on loopback \u2014 connector: ${re.connectorPath}`);let y=Et.broker.provider;y instanceof ut.StoredGrantProvider&&(hr=(0,ut.createConnectHandler)({provider:y,browserUser:R=>(0,he.resolveUserId)(R.headers,void 0),audit:Mt}),console.log(y.connectBaseUrl?`OK: Personal connections \u2014 consent pages at ${y.connectBaseUrl}/connect/ (route it through the identity edge)`:`${C.COLORS.yellow}Warning:${C.COLORS.reset} provider=stored-grant without AGENTHIPPO_CONNECT_BASE_URL \u2014 users cannot connect accounts`),y.cfg.ticketOnly&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} AGENTHIPPO_CONNECT_TICKET_ONLY=1 \u2014 connect links are accepted without a verified browser identity. Single-user development only.`))}catch(y){console.error(`${C.COLORS.red}Error: failed to start the data-plane gateway:${C.COLORS.reset} ${y instanceof Error?y.message:y}`),process.exit(1)}let Be=(0,vw.readOpenClawGatewayToken)();delete process.env.OPENCLAW_GATEWAY_TOKEN;let it=null,On=async y=>{if(te){let V=y.edgeNonce?.trim();if(!V)return console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} edge data plane active but no ${ut.TURN_NONCE_HEADER} header on this turn \u2014 data tools will fail closed (check the edge route's forward_auth)`),null;let ne=te.adoptTurn(V),at={...ne.env};return it&&(at[ut.EGRESS_URL_ENV]=it.url),{nonce:ne.nonce,env:at,release:ne.release}}if(Ge){let V=await Ge.registerTurn({...y,agent:{pack:s,version:g,digest:m}}),ne={...V.env};return it&&(ne[ut.EGRESS_URL_ENV]=it.url),{nonce:V.nonce,env:ne,release:V.release}}if(!xe)return null;let{nonce:R,release:ee}=xe.register(y),ae={[ut.TURN_NONCE_ENV]:R};return Et&&(ae[ut.DATA_MCP_URL_ENV]=Et.url),it&&(ae[ut.EGRESS_URL_ENV]=it.url),{nonce:R,env:ae,release:ee}},mr=y=>{if(!te)return;let R=y[ut.TURN_NONCE_HEADER];return Array.isArray(R)?R[0]:R},Ze=new Map,Zt=600*1e3,ii=1e4,Hr=new Map,Z=30*1e3,oi=300*1e3,D=(y,R)=>{if(Hr.size>=ii&&!Hr.has(y)){let ee=Hr.keys().next();ee.done||Hr.delete(ee.value)}Hr.set(y,Date.now()+R)},se=async(y,R)=>{let ee=R[ut.ASSERTION_HEADER],ae=(Array.isArray(ee)?ee[0]:ee)?.trim();if(!ae||!e.baseUrl)return;let V=Ze.get(y);if(V!==void 0&&V>Date.now())return;let ne=Hr.get(y);if(ne!==void 0&&ne>Date.now()||(await Ce.get())?.billUsers!==!0)return;let at=e.baseUrl.replace(/\/+$/,""),nn=at.endsWith("/v1")?`${at}/credits`:`${at}/v1/credits`;try{let He=await fetch(nn,{headers:{Authorization:`Bearer ${ae}`},signal:AbortSignal.timeout(5e3)});if(He.ok){let fs=await He.json().catch(()=>{});if(fs!==void 0&&(fs.enabled===!1||typeof fs.email=="string"&&fs.email.trim().toLowerCase()===y.trim().toLowerCase())){if(Ze.size>=ii&&!Ze.has(y)){let Hs=Ze.keys().next();Hs.done||Ze.delete(Hs.value)}Ze.set(y,Date.now()+Zt)}else D(y,oi),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} billUsers is on but the assertion's account (${fs?.email??"unknown"}) does not match this turn's user \u2014 the turn may be refused as identity-not-billable`)}else D(y,He.status>=500?Z:oi),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} billUsers is on but the gateway did not open a credit account for this turn's user (GET ${nn} \u2192 ${He.status}) \u2014 the turn may be refused as identity-not-billable`)}catch(He){D(y,Z),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} billUsers is on but the credit-account check failed (${He instanceof Error?He.message:String(He)}) \u2014 the turn may be refused as identity-not-billable`)}},ie=new he.TurnLimiter(t.maxTurnsPerSession??0),we=Number(process.env.AGENTHIPPO_SERVE_RATE_LIMIT??120),en=new he.RateLimiter(Number.isFinite(we)?we:120),Y=(0,he.createTurnGateFromEnv)(),It=(0,he.createRejectionWarner)(),tn;if(t.wwwDir?.trim()){let y=Tn.join(Tn.resolve(t.wwwDir.trim()),"index.html");try{tn=fn.readFileSync(y,"utf8")}catch{console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} --www-dir set but unreadable: ${y}`)}}b&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} Session state is in a tmpdir (ephemeral). Pass --state-dir or set AGENTHIPPO_HOME to persist sessions across restarts.`);let me=(0,Zs.resolveS3StateConfig)(),Gt=(0,Zs.resolveRestoreBootMode)();me&&(await(0,Zs.isAwsCliAvailable)()||(console.error(`${C.COLORS.red}Error: AGENTHIPPO_STATE_S3_URI is set but the \`aws\` CLI was not found.${C.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)),Gt==="all"?(console.log(`State sync: boot-restore from ${me.uri} \u2026`),await(0,Zs.restoreState)(me,I,y=>console.log(` ${y}`))):console.log(`State sync: restore-on-miss from ${me.uri} (boot restore disabled)`));let Pt=me?(0,Zs.makeStatePusher)(me,I,t.verbose?y=>console.error(y):void 0):null,In=t.verbose?y=>console.error(y):void 0,pn=async y=>{me&&await(0,Zs.ensureSessionLocal)(me,I,y,In)},ls=(0,C.findClaudeCodePath)(),Wi=(0,C.findCodexPath)(),Ki=t.sandbox==="container";if(!Ki&&a==="claude"&&!ls){console.error(`${C.COLORS.red}Error: Claude Code CLI not found.${C.COLORS.reset}`);let y=(0,_a.getUnsupportedClaudePlatformHint)();y&&console.error(` ${y}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),process.exit(1)}!Ki&&a==="codex"&&!Wi&&(console.error(`${C.COLORS.red}Error: Codex CLI not found.${C.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),process.exit(1));let Ls=y=>Pw(y,{apiConfig:e,engineRunsInSandbox:Ki,claudeCodePath:ls,codexPath:Wi}),Mo=new jn.AutoApprovePermissionHandler,qi={fileAccess:(0,Is.getFileAccess)(n)},ai,Go=!1,Yi=y=>{let R=(0,Li.policyVersion)(y);Go&&R===ai||(Go=!0,ai=R,F.append("serve",(0,ya.generateRequestId)(),"policy_applied",{instance_id:us,policy_version:R??null,pack_digest:m??null,engine_version:(0,_a.installedEngineVersion)(a)??null,tier:t.sandbox==="container"?2:t.sandbox?0:null,enabled:y?.enabled??null,pinned_version:y?.version??null,caps:y?.caps??null,deny_count:y?.deny?.length??0}))},Uo,Er=Tn.join(I,"packs"),_u=async(y,R)=>(await(0,zL.downloadFromStore)({type:"pack",slug:y,version:R})).map(ae=>({path:ae.path,content:ae.content})),Ji=async y=>{if(!t.pullPacks||!y||y===g)return;let R=async ne=>{try{return op((await(0,Is.loadAgentPack)(ne,t.workspace)).manifest,t)}catch{return}},ee=Tn.join(Er,y),ae=fn.existsSync(Tn.join(ee,"agent.yaml"))?await R(ee):void 0;if(ae){let ne=Ls(ae.engine);if(ne){console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} cannot converge to ${s}@${y}: it runs engine "${ae.engine}" \u2014 ${ne}. Still serving @${g} on ${a}.`);return}}let V=await(0,$l.reconcilePinnedPack)({pack:s,currentVersion:g,pinnedVersion:y,packsRoot:Er,download:_u,publicKeysByKid:h.keys,logger:{info:ne=>f.info(ne),warn:ne=>f.info(ne)}});if(V.ok){if(!ae){ae=await R(V.packDir);let ne=ae?Ls(ae.engine):"its manifest is unreadable";if(ne){(0,$l.promoteCurrent)(Er,Tn.join(Er,g)),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} cannot converge to ${s}@${y}: ${ae?`it runs engine "${ae.engine}" \u2014 `:""}${ne}. Still serving @${g} on ${a}.`);return}}g=V.version,p=V.packDir,O(p,g),(ae.engine!==a||ae.model!==c)&&(f.info(`[Pack] ${s}@${g}: engine ${a} \u2192 ${ae.engine}, model ${c} \u2192 ${ae.model} (new sandboxes; running ones drain)`),a=ae.engine,c=ae.model);try{await(0,jn.syncPackToWorkspace)(t.workspace,p,s,a,r,A)}catch(ne){console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} workspace sync for ${s}@${g} failed: ${ne instanceof Error?ne.message:String(ne)}`)}f.info(`[Pack] now serving ${s}@${g} (engine ${a}, model ${c}) from ${V.packDir}`);return}console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} cannot converge to ${s}@${y}: ${V.reason}. Still serving @${g}.`)},ci=(0,Xr.loadWarrantKeypair)(f),li,us=(()=>{try{let y=Tn.join((0,he.resolveStateDir)(t.stateDir).dir,"instance-id");if(fn.existsSync(y))return fn.readFileSync(y,"utf-8").trim();let R=`${ww.hostname()}-${yw.randomBytes(4).toString("hex")}`;return fn.mkdirSync(Tn.dirname(y),{recursive:!0}),fn.writeFileSync(y,R),R}catch{return`${ww.hostname()}-${yw.randomBytes(4).toString("hex")}`}})(),Ho={get:()=>n?.manifest.metadata.version},J=(0,Li.resolveLeasePollSeconds)(t.leasePollSeconds),U=await(0,Hn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});U.explicitlyConfigured&&w(U,"lease");let Ee=(0,Hn.checkTrustRootSeparation)(U,h);for(let y of Ee.warnings)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} [TrustRoot] ${y}`);Ee.fatal&&(console.error(`Error: [TrustRoot] ${Ee.fatal}`),process.exit(1));let Ne=!1,ot=()=>{let y=(0,Hn.selectLeaseSigningKeys)(U,h);return y.packFallback&&!Ne&&(Ne=!0,console.warn(`${C.COLORS.yellow}Warning:${C.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 ${Hn.LEASE_JWKS_URL_ENV}=https://<plane>/.well-known/jwks.json?purpose=lease-signing (or ${Hn.LEASE_SIGNING_KEYS_ENV} with inline {"<kid>":"<public PEM>"} for an air-gapped install).`+(U.reason?` The derived lease trust root is unusable: ${U.reason}`:""))),y.keys},Se=(()=>{if(t.staticLeaseFile)try{let y=(0,QL.parseLease)(JSON.parse(fn.readFileSync(t.staticLeaseFile,"utf-8")));if(!y.ok)throw new Error(y.reason);for(let R of y.warnings)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} [Lease] --static-lease: ${R}`);return y.lease}catch(y){console.error(`Error: --static-lease ${t.staticLeaseFile} is not a usable lease: ${y instanceof Error?y.message:y}`),process.exit(1)}})(),Ve=Tn.join(I,"lease.json"),Kt={load:()=>{if(!fn.existsSync(Ve))return;let y=JSON.parse(fn.readFileSync(Ve,"utf-8"));if(y&&typeof y=="object"&&typeof y.body=="string"&&typeof y.lastGoodAt=="number")return y},save:y=>{fn.mkdirSync(Tn.dirname(Ve),{recursive:!0});let R=`${Ve}.tmp`;fn.writeFileSync(R,JSON.stringify(y)),fn.renameSync(R,Ve)}},Ce=(0,Li.createLeaseSource)({url:process.env.AGENTHIPPO_LEASE_URL,staticLease:Se,persistence:Kt,identity:()=>({instance:us,pack:s,version:Ho.get(),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,sandboxes:li?.sandboxes().length,engine:a,engineversion:(0,_a.installedEngineVersion)(a),...t.model?{model:t.model}:{},...process.env.AGENTHIPPO_ADVERTISED_URL?.trim()?{url:process.env.AGENTHIPPO_ADVERTISED_URL.trim()}:{},...process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()?{"enroll-token":process.env.AGENTHIPPO_ENROLL_TOKEN.trim()}:{}}),cacheSeconds:(0,Li.leaseCacheSecondsFor)(J),signingKeys:()=>ot(),requireSignedLease:t.requireSignedLease,instanceId:us,...t.leaseMaxStalenessSeconds!==void 0?{maxStalenessSeconds:t.leaseMaxStalenessSeconds}:{},logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}),_t=async()=>{if(h.status!=="configured"){let y=await(0,Hn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});y.status==="configured"&&(h=y,w(y),f.info(`[Pack] signing keys now available (${Object.keys(y.keys).length}); re-verifying`),O(p,g))}if(U.status!=="configured"){let y=await(0,Hn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});y.status==="configured"&&(U=y,y.explicitlyConfigured&&w(y,"lease"),f.info(`[Lease] lease-signing keys now available (${Object.keys(y.keys).length})`))}};Ce.get().then(Yi).catch(()=>{});{let y=J*1e3;setInterval(()=>{Ce.get().then(Yi).catch(()=>{}),_t().catch(()=>{})},y).unref?.()}if(t.pullPacks){fn.mkdirSync(Er,{recursive:!0});let y=Tn.join(Er,g);fn.existsSync(y)||fn.cpSync(n.packPath,y,{recursive:!0}),(0,$l.promoteCurrent)(Er,y),p=Tn.join(Er,$l.CURRENT_LINK),await Ji((await Ce.get())?.version),O(p,g)}if(Ho.get=()=>g,Uo=(0,eM.createPackRunner)({storagePath:I,analyticsSessionsDir:v,packId:s,packVersion:g,provenance:()=>({policyVersion:ai,packDigest:m,engineVersion:(0,_a.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:us}),workspaceRoot:t.workspace,credentials:{apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey},logger:f,permissionHandler:Mo,claudeCheapModel:d,effort:u,omitGatewayToken:!0}),t.pullPacks){let y=J*1e3;setInterval(()=>{Ce.get().then(ee=>Ji(ee?.version)).catch(()=>{})},y).unref?.()}let Ae=!!t.sharedWorkspace,Ue=t.sandboxScope==="user"?"user":"session",At=t.sandbox==="container"?{readonly:[`${p}:${Dl.SANDBOX_PACK_DIR}`],writable:[`${t.workspace}:${Dl.SANDBOX_WORKSPACE_DIR}`]}:void 0;At&&Ae&&console.warn(`${C.COLORS.yellow}Warning:${C.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 Ms;At&&t.sandboxImage&&(await(0,Xr.alignSandboxWorkspaceOwnership)({exec:Xr.dockerExec,image:t.sandboxImage,writable:At.writable,logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}),Ms=await(0,Xr.resolveSandboxImageUser)(Xr.dockerExec,t.sandboxImage));let Gs=y=>(0,Xr.ensureSandboxStateDir)(Tn.join(I,"sandbox-state",(0,Zs.safeSessionId)(y)),Ms),Re=async y=>{if(!At)return{readonly:[],writable:[]};if(Ae)return At;let R=(0,Xr.ensureSandboxStateDir)(Tn.join(I,"sandbox-workspace",(0,Zs.safeSessionId)(y)),Ms);return{readonly:At.readonly,writable:[`${R}:${Dl.SANDBOX_WORKSPACE_DIR}`]}},Wn=(y,R,ee)=>{if((0,Hn.resolveRequireSignedPack)({lease:y?.requireSignedPack,localRequire:t.requireSignedPack,localAllowUnsigned:L})){let V=_.verify({packDir:p,pack:s,packVersion:g,keys:h.keys});if(V!==E&&(E=V,m=V.ok?V.claims.digest:void 0),!V.ok)throw new Li.LeaseDeniedError(T(V))}(0,Li.assertAdmitted)(y,{pack:s,version:g,image:t.sandboxImage,sessionKey:R,userHash:he.userNamespaceHash,userId:ee})},yt=t.sandbox?(0,XL.createSandboxRunner)({driver:t.sandbox==="container"?new Dl.ContainerSandboxDriver({exec:Xr.dockerExec,socketOwner:Ms,logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}):new bw.ProcessSandboxDriver({command:process.execPath,args:[...(0,Xr.sandboxScriptArg)(),"sandbox","--agent",p,"--stdio","--state-dir",I,"--workspace",t.workspace],namespaceIsolation:(0,bw.namespaceIsolationFromEnv)(),logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}),image:t.sandboxImage??"",tier:t.sandbox==="container"?2:0,...At?{fs:At,fsFor:Re,stateDirFor:Gs}:{},routes:[...process.env.AGENTHIPPO_DATA_MCP_URL?[{kind:"data",target:process.env.AGENTHIPPO_DATA_MCP_URL}]:[],...e.baseUrl?[{kind:"inference",target:e.baseUrl}]:[]],limits:{ttlSeconds:t.sandboxTtlSeconds??1800},env:Object.fromEntries(["AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_SERVE"].filter(y=>process.env[y]).map(y=>[y,process.env[y]])),provenanceEnv:()=>(0,vw.buildProvenanceEnv)({policyVersion:ai,packDigest:m,engineVersion:(0,_a.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:us}),admit:async({sessionKey:y})=>{let R=await Ce.get();Wn(R,y)},inferenceBaseUrl:e.baseUrl,mintModelToken:async(y,R)=>{let ee=(0,Ml.currentCredential)()?.userId?.trim()||`anon:${R}`,ae=await Ce.get(),V=ae?.budget,ne=V===void 0?void 0:V.scope==="user"?`user:${ee}`:`session:${R}`;return(0,Xr.mintSandboxInferenceWarrant)(ci,{user:ee,pack:s,packVersion:g,sandboxId:y,tier:t.sandbox==="container"?2:0,ttlSeconds:(0,ZL.warrantTtlFromEnv)(),...ae?.billUsers===!0?{billing:"user"}:{},...ne?{budgetKey:ne}:{},...V?.windowSeconds?{budgetWindowSeconds:V.windowSeconds}:{}})},logger:f,runtime:{logger:f,editTracker:void 0,configProvider:void 0,permissionHandler:Mo}}):void 0;li=yt??void 0;let Kn=y=>typeof y=="number"&&Number.isFinite(y)&&y>0?y:void 0,ds={...(0,Aw.capsFromEnv)(),...Kn(t.maxTurnsPerSession)!==void 0?{maxTurnsPerSession:t.maxTurnsPerSession}:{},...Kn(t.maxSessionSeconds)!==void 0?{maxSessionSeconds:t.maxSessionSeconds}:{},...Kn(t.maxConcurrentSandboxes)!==void 0?{maxConcurrentSandboxes:t.maxConcurrentSandboxes}:{},...t.capOnBreach?{onBreach:t.capOnBreach}:{}},Ug=ds.maxTurnsPerSession!==void 0||ds.maxSessionSeconds!==void 0||ds.maxConcurrentSandboxes!==void 0,QA={sandboxes:()=>[],destroySession:async()=>{},revokeRoute:async()=>{},supportsInFlightTermination:!1},jo=!!(yt||process.env.AGENTHIPPO_LEASE_URL||Ug)?(0,Tw.createGovernor)({caps:(0,Aw.mergeCaps)((await Ce.get())?.caps,ds),sandboxes:yt??QA,getLease:()=>Ce.get(),pollSeconds:J,pack:s,userHash:he.userNamespaceHash,...yt?{}:{admitPack:(y,R)=>{try{return Wn(R,y),{allowed:!0}}catch(ee){return{allowed:!1,reason:ee instanceof Error?ee.message:String(ee)}}}},logger:f,audit:(y,R)=>Mt(String(R.sessionKey??"instance"),y,R)}):void 0;Ug&&!yt&&console.warn(`${C.COLORS.yellow}Warning:${C.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 Hg=yt??Uo,xo=jo?(0,Tw.withGovernor)(Hg,jo):Hg;if(jo){jo.start();let y=jo.policy(),R=(0,Li.effectiveKillLatencySeconds)(J);f.info(`[Serve] control plane: caps turns=${y.maxTurnsPerSession??"\u221E"} session=${y.maxSessionSeconds??"\u221E"}s sandboxes=${y.maxConcurrentSandboxes??"\u221E"} onBreach=${y.onBreach??"revoke-inference"}; lease poll ${J}s (worst-case kill latency ${R}s; an admin refresh is immediate)`),yt||f.info("[Serve] no sandbox driver: a deny rule with mode=kill takes effect as DRAIN \u2014 the in-flight turn finishes and only the next one is refused.");let ee=Ce.status();process.env.AGENTHIPPO_LEASE_URL&&!ee.requireSignedLease&&f.info("[Serve] lease signature is NOT required \u2014 set --require-signed-lease (or lease.requireSignedLease) once the control plane signs leases.")}let Us=(0,he.resolveServiceIdentity)();Us.error&&(console.error(`${C.COLORS.red}Error:${C.COLORS.reset} ${Us.error}`),process.exit(1)),Us.warning&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${Us.warning}`);let yu=!!process.env.AGENTHIPPO_LEASE_URL,ZA=async()=>{if(!Us.identity)return;let y=(0,Ll.resolveAllowServiceTurns)({lease:(await Ce.get())?.allowServiceTurns,managed:yu});if(!y.allowed){Mt("service-turn","service_turn_denied",{identity:(0,tM.hashIdentity)(Us.identity),gate:y.gate,detail:(0,Ll.describeServiceTurnGate)(y.gate)});return}return Us.identity};if(Us.identity){let y=(0,Ll.resolveAllowServiceTurns)({lease:void 0,managed:yu});f.info(`[Serve] unattended runs: identity configured (${he.SERVICE_USER_ENV}); `+(yu?"the control plane decides per turn via lease.allowServiceTurns \u2014 absent means deny":(0,Ll.describeServiceTurnGate)(y.gate)))}yt&&(f.info(`[Serve] sandbox mode: ${t.sandbox} (tier ${t.sandbox==="container"?2:0}) \u2014 engines run in per-session sandboxes`),e.baseUrl||console.warn(`${C.COLORS.yellow}Warning:${C.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 La=null,Ma=!1,Bo,jg=JL.createServer(async(y,R)=>{let ee=(0,he.corsHeaders)();for(let[ae,V]of Object.entries(ee))R.setHeader(ae,V);if(y.method==="OPTIONS"){R.writeHead(204),R.end();return}try{if(y.method==="GET"&&y.url==="/health"){let V={status:"ok"};V.evidence_ship_enabled=!!Bo;let ne=Bo?.lastOkAt();ne!==void 0&&(V.evidence_ship_last_ok_at=new Date(ne).toISOString());let at=(0,sp.getEvidenceShipStatus)();V.evidence_ship_disabled_reason=at.disabledReason??null,V.evidence_ship_consecutive_failures=at.consecutiveFailures,V.evidence_records_staged=at.recordsStaged,V.evidence_records_shipped=at.recordsShipped,V.evidence_records_skipped_too_old=at.recordsSkippedTooOld,V.evidence_files_skipped_too_old=at.filesSkippedTooOld,V.evidence_content_capture=at.contentCapture,at.lastHeartbeatAt!==void 0&&(V.evidence_ship_last_heartbeat_at=new Date(at.lastHeartbeatAt).toISOString());let nn=(0,Ow.getSessionEventWriterStats)();V.evidence_writes_ok=nn.written,V.evidence_writes_failed=nn.failed,nn.lastError&&(V.evidence_write_last_error={at:new Date(nn.lastError.at).toISOString(),event_type:nn.lastError.eventType,message:nn.lastError.message});let He=Ce.status();V.lease_configured=!!process.env.AGENTHIPPO_LEASE_URL,V.lease_signed=He.signed,V.lease_signature_required=He.requireSignedLease,V.lease_staleness_seconds=He.stalenessSeconds??null,V.lease_fail_closed=He.failClosed,V.pack_signature_ok=E.ok,V.pack_signature_required=(0,Hn.resolveRequireSignedPack)({localRequire:t.requireSignedPack,localAllowUnsigned:L}),V.pack_trust_root=h.status,V.lease_trust_root=U.status,V.lease_trust_root_source=U.explicitlyConfigured?"lease":"pack-fallback",V.kill_in_flight_supported=!!yt,R.writeHead(200,{"Content-Type":"application/json"}),R.end(JSON.stringify(V));return}if(y.method==="GET"&&y.url==="/ready"){R.writeHead(Ma?200:503,{"Content-Type":"application/json"}),R.end(JSON.stringify({ready:Ma,inflight:Y.inflight,queued:Y.queued,max:Y.max}));return}let ae=y.url?.split("?")[0]??"";if(hr&&ae.startsWith("/connect/")&&await hr(y,R))return;if(y.method==="GET"&&tn&&(ae==="/"||ae==="/index.html")){R.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),R.end(tn);return}if(y.method==="POST"&&ae==="/v1/chat"){let V=await Iw(y),ne=(0,he.resolveUserId)(y.headers,V),at=(0,he.resolveDataToken)(y.headers),nn=(0,he.resolveUserId)(y.headers,void 0)??(0,he.clientIp)(y);if(!en.tryConsume(nn)){R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(en.retryAfterSeconds(nn))}),R.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:fs,rejected:Xi}=(0,he.resolveServeSessionKey)(V.session_id,ne,Ue);if(Xi){F.append("unverified",(0,ya.generateRequestId)(),"warrant_denied",{reason:Xi}),R.writeHead(403,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"verified user identity required"}));return}let Hs=await Y.acquire();if(!Hs){It(`TurnGate: rejecting /v1/chat (inflight=${Y.inflight} queued=${Y.queued} max=${Y.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 ui=null;try{if(!ie.tryConsume(He)){R.writeHead(429,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await pn(He),ne?.trim()&&(ui=await On({userId:ne.trim(),sessionKey:He,inboundToken:at,edgeNonce:mr(y.headers)}),await se(ne.trim(),y.headers));let eT=await(0,Ml.runWithCredential)({userId:ne,dataToken:at},()=>oM(xo,V,He,fs,a,c,t.workspace,qi,ne,ui?.env),{onDenied:B(He)});R.writeHead(200,{"Content-Type":"application/json"}),R.end(JSON.stringify(eT)),Pt?.schedule(He)}finally{await ui?.release(),Hs()}return}if(y.method==="POST"&&ae==="/v1/chat/stream"){let V=await Iw(y),ne=(0,he.resolveUserId)(y.headers,V),at=(0,he.resolveDataToken)(y.headers),nn=(0,he.resolveUserId)(y.headers,void 0)??(0,he.clientIp)(y);if(!en.tryConsume(nn)){R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(en.retryAfterSeconds(nn))}),R.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:fs,rejected:Xi}=(0,he.resolveServeSessionKey)(V.session_id,ne,Ue);if(Xi){F.append("unverified",(0,ya.generateRequestId)(),"warrant_denied",{reason:Xi}),R.writeHead(403,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"verified user identity required"}));return}let Hs=await Y.acquire();if(!Hs){It(`TurnGate: rejecting /v1/chat/stream (inflight=${Y.inflight} queued=${Y.queued} max=${Y.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 ui=null;try{if(!ie.tryConsume(He)){R.writeHead(429,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await pn(He),ne?.trim()&&(ui=await On({userId:ne.trim(),sessionKey:He,inboundToken:at,edgeNonce:mr(y.headers)}),await se(ne.trim(),y.headers)),await(0,Ml.runWithCredential)({userId:ne,dataToken:at},async()=>{R.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),await lM(xo,V,He,fs,a,c,t.workspace,qi,R,ne,ui?.env)},{onDenied:B(He)}),Pt?.schedule(He)}finally{await ui?.release(),Hs()}return}R.writeHead(404,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Not found"}))}catch(ae){if(ae?.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:",ae),R.headersSent||R.writeHead(500,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:ae instanceof Error?ae.message:"Internal error"}))}});jg.listen(t.port,N,()=>{(async()=>{console.log(""),console.log(wa),console.log("Agent Hippo Server"),console.log(wa),console.log(`Host: ${N}`),console.log(`Port: ${t.port}`),console.log(`Engine: ${a}`),console.log(`Model: ${c}`),d&&console.log(`Cheap: ${d}`),console.log(`Workspace: ${t.workspace}`),n&&(console.log(`Pack: ${n.manifest.metadata.name}@${n.manifest.metadata.version}`),console.log(`Gateway: ${i}`)),console.log(wa),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 y=(0,sp.resolveSessionShipConfig)(us,v,I);y&&(Bo=(0,sp.startSessionShipper)({...y,logger:{info:ee=>f.info(ee),warn:ee=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${ee}`)}}));let R=t.bind?.trim();if(R)try{await cM(i,R,Be)}catch(ee){console.error(`${C.COLORS.yellow}Warning:${C.COLORS.reset} Failed to bind channels: ${ee instanceof Error?ee.message:String(ee)}`)}if(t.gatewayBridge){if(xe)try{it=await(0,ut.startEgressBroker)({registry:xe,workspaceRoot:t.workspace,agentId:n.manifest.metadata.name,send:async(ee,ae,V)=>{let ne=await(0,nM.sendGatewayOutboundMessage)(ee,{message:ae,media:V,token:Be});return{ok:ne.ok,via:ne.via,stdout:ne.stdout,stderr:ne.stderr}},logger:t.verbose?new jn.ConsoleLogger("[Egress]"):new jn.NoOpLogger,audit:Mt}),process.env[ut.EGRESS_URL_ENV]=it.url,console.log("OK: Egress broker on loopback \u2014 gateway token stays broker-side; agent sends via turn nonce")}catch(ee){console.error(`${C.COLORS.red}Error:${C.COLORS.reset} Egress broker failed to start: ${ee instanceof Error?ee.message:String(ee)}`),process.exit(1)}try{La=await aM({gatewayAgentId:i,packName:n.manifest.metadata.name,workspace:t.workspace,registerTurn:On,brokerGatewayToken:Be,engine:a,defaultModel:c,current:()=>({engine:a,defaultModel:c}),runner:xo,permissions:qi,turnGate:Y,rateLimiter:en,turnLimiter:ie,warnGateReject:It,prepareSession:pn,sandboxScope:Ue,onTurnComplete:ee=>Pt?.schedule(ee),logWarrantDenied:B,serviceUserIfPermitted:ZA})}catch(ee){console.error(`${C.COLORS.yellow}Warning:${C.COLORS.reset} Gateway bridge failed: ${ee instanceof Error?ee.message:String(ee)}`)}}Ma=!0})()});let xg=!1,Bg=()=>{xg||(xg=!0,Ma=!1,console.log(`
547
- Shutting down...`),(async()=>{if(Pt)try{await Pt.flush()}catch{}if(La){try{await La.unregisterAgent(i)}catch{}La=null}if(Et)try{await Et.close()}catch{}if(it)try{await it.close()}catch{}if(Bo)try{await Bo.flush()}catch{}jg.close(()=>{xo.dispose(),process.exit(0)}),setTimeout(()=>{xo.dispose(),process.exit(0)},1e4).unref()})())};process.on("SIGINT",Bg),process.on("SIGTERM",Bg)}async function Iw(t){let e=await(0,he.readBodyWithCap)(t);try{return JSON.parse(e)}catch{throw new Error("Invalid JSON")}}async function oM(t,e,n,r,s,i,o,a,c,l){let d=await t.run({engineId:kw(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:c,permissions:a,turnEnv:l});return{success:d.success,text:d.text,thinking:d.thinking||void 0,tool_calls:d.toolCalls,error:d.error}}function Nw(t,e,n="session",r=!1){if(r&&e){let a=`gateway-${e}`;return{sessionKey:`${a}--${(0,Sw.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,Sw.randomUUID)()}`;return{sessionKey:o,sandboxKey:o,outboundKey:o,durable:!1}}async function Rw(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 aM(t){let{GatewayBridge:e}=await Promise.resolve().then(()=>Pn(_w())),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)=>Cw(t,o,a)}),console.log(`${C.COLORS.green}\u2713${C.COLORS.reset} Gateway bridge: registered "${t.gatewayAgentId}" at ${r}`),console.log(`${C.COLORS.dim} Gateway outbound routes: ${t.workspace}/.agent-hippo/sessions/<sessionKey>/gateway-outbound.json${C.COLORS.reset}`),console.log(`${C.COLORS.dim} openclaw agent --agent ${t.gatewayAgentId} --message "\u2026"${C.COLORS.reset}`),i}async function Cw(t,e,n){let r=t.current?.()??{engine:t.engine,defaultModel:t.defaultModel},s=n.engineId?.trim().toLowerCase(),i=s==="custom"?r.engine:s||r.engine,o=(0,he.peerToUserId)(n.peerInfo),a=o?void 0:await t.serviceUserIfPermitted?.(),c=o??a,{sessionKey:l,sandboxKey:d,outboundKey:u,durable:f}=Nw(n,c,t.sandboxScope,!!a);return Rw({rateLimiter:t.rateLimiter,turnLimiter:t.turnLimiter,turnGate:t.turnGate,warnGateReject:t.warnGateReject,rlKey:c??"gateway",sessionKey:l,trackSession:f,emitter:n.emitter,run:async()=>{f&&await t.prepareSession(l);let p=c?.trim()?await t.registerTurn({userId:c.trim(),sessionKey:l,egressStoreKey:u}):null;try{let g=await(0,Ml.runWithCredential)({userId:c},()=>t.runner.run({engineId:i,modelId:r.defaultModel,message:e,workspaceRoot:t.workspace,sessionId:l,sandboxKey:d,gatewaySessionKey:u,analyticsUserId:c,emitter:n.emitter,permissions:t.permissions,turnEnv:p?.env}),{onDenied:t.logWarrantDenied(l)});return f&&t.onTurnComplete?.(l),{success:g.success,error:g.error}}finally{await p?.release()}}})}async function cM(t,e,n){let{createAgentIDEGatewayClient:r}=await Promise.resolve().then(()=>Pn(Pl())),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,d;if(e.trim()==="*"){let f=await(0,ip.fetchMeetAgentChannelContext)(o.request.bind(o));c=f.rows.map(p=>p.id),d=f.statusPayload}else{let f=(0,ip.parseChannelBindSpecs)(e);c=f.map(p=>p.channelId),l=Object.fromEntries(f.filter(p=>p.accountId).map(p=>[p.channelId,p.accountId])),Object.keys(l).length===0&&(l=void 0)}if(c.length===0){console.log(`${C.COLORS.yellow}Warning:${C.COLORS.reset} No channels to bind.`);return}let u=await(0,ip.applyAgentChannelBindingsViaConfigPatch)(o.request.bind(o),{agentId:t,selectedChannelIds:c,channelAccountOverrides:l,statusPayload:d});console.log(u?`${C.COLORS.green}\u2713${C.COLORS.reset} Bound ${t} to: ${c.join(", ")}`:`${C.COLORS.dim}Slack already bound to ${t}; skipped config.patch${C.COLORS.reset}`)}finally{o.close()}}async function lM(t,e,n,r,s,i,o,a,c,l,d){let u=!1,f=(m,h)=>{u||c.writableEnded||c.write(`data: ${JSON.stringify({type:m,...h})}
565
+ [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,f=await n.chatUIHandler(r.message,i,u,d,{params:r,runId:s,agentId:o}),p=c||f;this.log(`Agent ${o} (Chat UI) completed: response.len=${p.length}`),p||this.log(`WARNING: Agent ${o} (Chat UI) produced empty response!`);let g={text:p,runId:r.idempotencyKey};this.client.respond(e.id,g,!0),this.emit("agent.response",{agentId:o,message:r.message,response:p})}catch(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)}};Qt.GatewayBridge=kl;function K0(t){return new kl(t)}});var $w=S(bn=>{"use strict";var q0=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]})),Y0=bn&&bn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Sa=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"&&q0(n,e,r[s]);return Y0(n,e),n}})();Object.defineProperty(bn,"__esModule",{value:!0});bn.resolvePackEngineModel=op;bn.engineUnavailableReason=Iw;bn.serveCommand=iM;bn.resolveGatewaySessionKey=Nw;bn.runGatewayTurn=Rw;bn.runBridgeTurn=Cw;var yw=Sa(require("crypto")),fn=Sa(require("fs")),ww=Sa(require("os")),J0=Sa(require("http")),Tn=Sa(require("path")),Sw=require("node:crypto"),X0=uy(),_a=Oi(),Hn=mo(),$l=Rf(),z0=Df(),Li=Eo(),Q0=aa(),Aw=bl(),Tw=Sy(),Dl=Iy(),bw=Dy(),Xr=Hf(),Z0=Ri(),jn=bi(),Ps=vi(),C=Xt(),eM=Bf(),sp=Qy(),he=Pr(),Ml=ps(),Ll=Eo(),tM=Zi(),ut=Ni(),vw=br(),nM=Xf(),Ow=ro(),ya=hi(),Zs=lw(),rM=uw(),ip=tp(),sM=Bs(),wa="-".repeat(62);function op(t,e){let n=(e.engine||t.spec.engine||(0,Ps.getDefaultConfig)().engine).trim().toLowerCase(),r=["claude","codex"].includes(n)?void 0:(0,sM.tryResolveCustomEngineManifest)(e.workspace,n)?.model?.defaultModel,s=e.model||t.spec.model||r||(0,Ps.getEnvDefaultModel)()||(0,Ps.getDefaultConfig)().model;return{engine:n,model:(0,jn.resolveModelAlias)(s)}}function Iw(t,e){if(!(0,Ps.hasCredentialForEngine)(t,e.apiConfig))return`no usable API key for engine "${t}" (${t==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"} or the LiteLLM proxy)`;if(!e.engineRunsInSandbox&&t==="claude"&&!e.claudeCodePath)return"Claude Code CLI not found on this host";if(!e.engineRunsInSandbox&&t==="codex"&&!e.codexPath)return"Codex CLI not found on this host"}async function iM(t){process.env.AGENTHIPPO_SERVE="1";let e=(0,Ps.getApiConfig)();e.useLiteLLM&&!e.litellmApiKey&&console.warn(`${C.COLORS.yellow}Warning:${C.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 jn.ConsoleLogger("[Sync]"):new jn.NoOpLogger;try{n=await(0,Ps.loadAgentPack)(t.agent,t.workspace)}catch(y){console.error(`Error: ${y instanceof Error?y.message:y}`),process.exit(1)}let s=n.manifest.metadata.name,i=(0,rM.resolveCliGatewayAgentId)(s),o=op(n.manifest,t),a=o.engine,c=o.model,l=n.manifest.spec.cheapModel?.trim(),d=l?(0,jn.resolveModelAlias)(l):void 0,u=n.manifest.spec.effort?.trim()||void 0;if(!(0,Ps.hasCredentialForEngine)(a,e)){console.error(`Error: No usable API key for engine "${a}". Set ${a==="claude"?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}, or configure the LiteLLM proxy (AGENTHIPPO_LITELLM_API_KEY + AGENTHIPPO_LITELLM_BASE_URL).`);for(let R of(0,C.getLiteLLMQuickstartHintLines)())console.error(R);process.exit(1)}let f=t.verbose?new jn.ConsoleLogger("[Server]"):new jn.NoOpLogger,p=n.packPath,g=n.manifest.metadata.version??"0.0.0",m,h=await(0,Hn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL}),w=(y,R="pack")=>{for(let ee of y.warnings)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${ee}`);y.status==="unavailable"&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${R} trust root is configured but unusable: ${y.reason}`)};w(h);let _=(0,Hn.createPackVerifier)(),E={ok:!1,kind:"no-pack",reason:"not verified"},O=(y,R)=>(E=_.refresh({packDir:y,pack:s,packVersion:R,keys:h.keys}),m=E.ok?E.claims.digest:void 0,f.info(E.ok?`[Pack] signature verified for ${s}`:`[Pack] unverified \u2014 ${E.reason}`),E),T=y=>{if(y.ok)return"";let R=h.status==="unavailable"&&y.kind==="no-trust-root"?"trust-root-unavailable":y.kind;return(0,Hn.describePackRefusal)({kind:R,detail:R==="trust-root-unavailable"?h.reason??y.reason:y.reason,pack:s,packVersion:g,packDir:p,trustRootHint:h.url?`Trust root: ${h.url} (${h.reason??"unavailable"})`:h.reason})};O(p,g);let L=!!t.allowUnsignedPack||(0,Hn.allowUnsignedPackFromEnv)();E.ok||(L||(console.error(`${C.COLORS.red}Error: ${T(E)}${C.COLORS.reset}`),process.exit(1)),console.warn(wa),console.warn(`${C.COLORS.yellow}!! RUNNING AN UNVERIFIED PACK \u2014 signature checking is DISABLED on this instance.${C.COLORS.reset}`),console.warn(`${C.COLORS.yellow}!! ${E.reason}${C.COLORS.reset}`),console.warn(`${C.COLORS.yellow}!! Whatever is in ${p} will be executed, verified by nobody.${C.COLORS.reset}`),console.warn(`${C.COLORS.yellow}!! This is a LOCAL DEVELOPMENT setting (AGENTHIPPO_ALLOW_UNSIGNED_PACK). Do not ship it.${C.COLORS.reset}`),console.warn(wa));let A=(0,C.findBundledBasePromptsDir)();await(0,jn.syncPackToWorkspace)(t.workspace,n.packPath,s,a,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=${a}`);let{dir:P,ephemeral:b}=(0,he.resolveStateDir)(t.stateDir),N=(0,he.resolveBindHost)(t.host);for(let y of(0,he.identityHeaderAdvice)(process.env,N))console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`);let I=(0,he.tenantIsolationAdvice)({sandbox:t.sandbox,sharedWorkspace:!!t.sharedWorkspace,workspace:t.workspace,stateDir:P});if(I.level==="refuse"){for(let y of I.lines)console.error(`${C.COLORS.red}Error:${C.COLORS.reset} ${y}`);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 y of I.lines)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`);let v=(0,he.resolveAnalyticsSessionsDir)(P,b),F=new Ow.SessionEventWriter(v),B=y=>R=>F.append(y,(0,ya.generateRequestId)(),"warrant_denied",{reason:R}),re=(0,ut.resolveDataPlaneConfig)(n.manifest.spec,n.packPath),X=(0,ut.resolveEdgeDataPlane)(),te=X?new ut.EdgeDataPlane(X):null,Ie=te?null:(0,ut.resolveRemoteDataPlane)(),Ge=Ie?new ut.RemoteDataPlane(Ie):null,xe=re&&!Ge&&!te||t.gatewayBridge?new ut.TurnRegistry:null,Mt=(y,R,ee)=>F.append(y,(0,ya.generateRequestId)(),R,{...ee,agent:{pack:s,version:g,digest:m??null}}),Et=null,hr=null;if(te)process.env[ut.DATA_MCP_URL_ENV]=te.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 ${te.url}; turn nonces are minted at the edge, serve holds no registration credential`);else if(Ge)process.env[ut.DATA_MCP_URL_ENV]=Ge.url,delete process.env.AGENTHIPPO_DATA_PLANE_TOKEN,console.log(`OK: Data plane SIDECAR \u2014 gateway ${Ge.url}; base credentials stay in the connector container, not here`);else if(re)try{Et=await ut.DataPlane.start(re,{logger:t.verbose?new jn.ConsoleLogger("[DataPlane]"):new jn.NoOpLogger,audit:Mt,registry:xe??void 0}),process.env[ut.DATA_MCP_URL_ENV]=Et.url,console.log(`OK: Data gateway (provider=${Et.broker.provider.name}) on loopback \u2014 connector: ${re.connectorPath}`);let y=Et.broker.provider;y instanceof ut.StoredGrantProvider&&(hr=(0,ut.createConnectHandler)({provider:y,browserUser:R=>(0,he.resolveUserId)(R.headers,void 0),audit:Mt}),console.log(y.connectBaseUrl?`OK: Personal connections \u2014 consent pages at ${y.connectBaseUrl}/connect/ (route it through the identity edge)`:`${C.COLORS.yellow}Warning:${C.COLORS.reset} provider=stored-grant without AGENTHIPPO_CONNECT_BASE_URL \u2014 users cannot connect accounts`),y.cfg.ticketOnly&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} AGENTHIPPO_CONNECT_TICKET_ONLY=1 \u2014 connect links are accepted without a verified browser identity. Single-user development only.`))}catch(y){console.error(`${C.COLORS.red}Error: failed to start the data-plane gateway:${C.COLORS.reset} ${y instanceof Error?y.message:y}`),process.exit(1)}let Be=(0,vw.readOpenClawGatewayToken)();delete process.env.OPENCLAW_GATEWAY_TOKEN;let it=null,On=async y=>{if(te){let V=y.edgeNonce?.trim();if(!V)return console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} edge data plane active but no ${ut.TURN_NONCE_HEADER} header on this turn \u2014 data tools will fail closed (check the edge route's forward_auth)`),null;let ne=te.adoptTurn(V),at={...ne.env};return it&&(at[ut.EGRESS_URL_ENV]=it.url),{nonce:ne.nonce,env:at,release:ne.release}}if(Ge){let V=await Ge.registerTurn({...y,agent:{pack:s,version:g,digest:m}}),ne={...V.env};return it&&(ne[ut.EGRESS_URL_ENV]=it.url),{nonce:V.nonce,env:ne,release:V.release}}if(!xe)return null;let{nonce:R,release:ee}=xe.register(y),ae={[ut.TURN_NONCE_ENV]:R};return Et&&(ae[ut.DATA_MCP_URL_ENV]=Et.url),it&&(ae[ut.EGRESS_URL_ENV]=it.url),{nonce:R,env:ae,release:ee}},mr=y=>{if(!te)return;let R=y[ut.TURN_NONCE_HEADER];return Array.isArray(R)?R[0]:R},Ze=new Map,Zt=600*1e3,ii=1e4,Hr=new Map,Z=30*1e3,oi=300*1e3,D=(y,R)=>{if(Hr.size>=ii&&!Hr.has(y)){let ee=Hr.keys().next();ee.done||Hr.delete(ee.value)}Hr.set(y,Date.now()+R)},se=async(y,R)=>{let ee=R[ut.ASSERTION_HEADER],ae=(Array.isArray(ee)?ee[0]:ee)?.trim();if(!ae||!e.baseUrl)return;let V=Ze.get(y);if(V!==void 0&&V>Date.now())return;let ne=Hr.get(y);if(ne!==void 0&&ne>Date.now()||(await Ce.get())?.billUsers!==!0)return;let at=e.baseUrl.replace(/\/+$/,""),nn=at.endsWith("/v1")?`${at}/credits`:`${at}/v1/credits`;try{let He=await fetch(nn,{headers:{Authorization:`Bearer ${ae}`},signal:AbortSignal.timeout(5e3)});if(He.ok){let fs=await He.json().catch(()=>{});if(fs!==void 0&&(fs.enabled===!1||typeof fs.email=="string"&&fs.email.trim().toLowerCase()===y.trim().toLowerCase())){if(Ze.size>=ii&&!Ze.has(y)){let Hs=Ze.keys().next();Hs.done||Ze.delete(Hs.value)}Ze.set(y,Date.now()+Zt)}else D(y,oi),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} billUsers is on but the assertion's account (${fs?.email??"unknown"}) does not match this turn's user \u2014 the turn may be refused as identity-not-billable`)}else D(y,He.status>=500?Z:oi),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} billUsers is on but the gateway did not open a credit account for this turn's user (GET ${nn} \u2192 ${He.status}) \u2014 the turn may be refused as identity-not-billable`)}catch(He){D(y,Z),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} billUsers is on but the credit-account check failed (${He instanceof Error?He.message:String(He)}) \u2014 the turn may be refused as identity-not-billable`)}},ie=new he.TurnLimiter(t.maxTurnsPerSession??0),we=Number(process.env.AGENTHIPPO_SERVE_RATE_LIMIT??120),en=new he.RateLimiter(Number.isFinite(we)?we:120),Y=(0,he.createTurnGateFromEnv)(),Pt=(0,he.createRejectionWarner)(),tn;if(t.wwwDir?.trim()){let y=Tn.join(Tn.resolve(t.wwwDir.trim()),"index.html");try{tn=fn.readFileSync(y,"utf8")}catch{console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} --www-dir set but unreadable: ${y}`)}}b&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} Session state is in a tmpdir (ephemeral). Pass --state-dir or set AGENTHIPPO_HOME to persist sessions across restarts.`);let me=(0,Zs.resolveS3StateConfig)(),Gt=(0,Zs.resolveRestoreBootMode)();me&&(await(0,Zs.isAwsCliAvailable)()||(console.error(`${C.COLORS.red}Error: AGENTHIPPO_STATE_S3_URI is set but the \`aws\` CLI was not found.${C.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)),Gt==="all"?(console.log(`State sync: boot-restore from ${me.uri} \u2026`),await(0,Zs.restoreState)(me,P,y=>console.log(` ${y}`))):console.log(`State sync: restore-on-miss from ${me.uri} (boot restore disabled)`));let It=me?(0,Zs.makeStatePusher)(me,P,t.verbose?y=>console.error(y):void 0):null,Pn=t.verbose?y=>console.error(y):void 0,pn=async y=>{me&&await(0,Zs.ensureSessionLocal)(me,P,y,Pn)},ls=(0,C.findClaudeCodePath)(),Wi=(0,C.findCodexPath)(),Ki=t.sandbox==="container";if(!Ki&&a==="claude"&&!ls){console.error(`${C.COLORS.red}Error: Claude Code CLI not found.${C.COLORS.reset}`);let y=(0,_a.getUnsupportedClaudePlatformHint)();y&&console.error(` ${y}`),console.error(" Install: npm install -g @anthropic-ai/claude-code"),console.error(" Or set CLAUDE_CODE_PATH environment variable"),process.exit(1)}!Ki&&a==="codex"&&!Wi&&(console.error(`${C.COLORS.red}Error: Codex CLI not found.${C.COLORS.reset}`),console.error(" Install: npm install -g @openai/codex"),console.error(" Or set CODEX_PATH environment variable"),process.exit(1));let Ls=y=>Iw(y,{apiConfig:e,engineRunsInSandbox:Ki,claudeCodePath:ls,codexPath:Wi}),Mo=new jn.AutoApprovePermissionHandler,qi={fileAccess:(0,Ps.getFileAccess)(n)},ai,Go=!1,Yi=y=>{let R=(0,Li.policyVersion)(y);Go&&R===ai||(Go=!0,ai=R,F.append("serve",(0,ya.generateRequestId)(),"policy_applied",{instance_id:us,policy_version:R??null,pack_digest:m??null,engine_version:(0,_a.installedEngineVersion)(a)??null,tier:t.sandbox==="container"?2:t.sandbox?0:null,enabled:y?.enabled??null,pinned_version:y?.version??null,caps:y?.caps??null,deny_count:y?.deny?.length??0}))},Uo,Er=Tn.join(P,"packs"),_u=async(y,R)=>(await(0,z0.downloadFromStore)({type:"pack",slug:y,version:R})).map(ae=>({path:ae.path,content:ae.content})),Ji=async y=>{if(!t.pullPacks||!y||y===g)return;let R=async ne=>{try{return op((await(0,Ps.loadAgentPack)(ne,t.workspace)).manifest,t)}catch{return}},ee=Tn.join(Er,y),ae=fn.existsSync(Tn.join(ee,"agent.yaml"))?await R(ee):void 0;if(ae){let ne=Ls(ae.engine);if(ne){console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} cannot converge to ${s}@${y}: it runs engine "${ae.engine}" \u2014 ${ne}. Still serving @${g} on ${a}.`);return}}let V=await(0,$l.reconcilePinnedPack)({pack:s,currentVersion:g,pinnedVersion:y,packsRoot:Er,download:_u,publicKeysByKid:h.keys,logger:{info:ne=>f.info(ne),warn:ne=>f.info(ne)}});if(V.ok){if(!ae){ae=await R(V.packDir);let ne=ae?Ls(ae.engine):"its manifest is unreadable";if(ne){(0,$l.promoteCurrent)(Er,Tn.join(Er,g)),console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} cannot converge to ${s}@${y}: ${ae?`it runs engine "${ae.engine}" \u2014 `:""}${ne}. Still serving @${g} on ${a}.`);return}}g=V.version,p=V.packDir,O(p,g),(ae.engine!==a||ae.model!==c)&&(f.info(`[Pack] ${s}@${g}: engine ${a} \u2192 ${ae.engine}, model ${c} \u2192 ${ae.model} (new sandboxes; running ones drain)`),a=ae.engine,c=ae.model);try{await(0,jn.syncPackToWorkspace)(t.workspace,p,s,a,r,A)}catch(ne){console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} workspace sync for ${s}@${g} failed: ${ne instanceof Error?ne.message:String(ne)}`)}f.info(`[Pack] now serving ${s}@${g} (engine ${a}, model ${c}) from ${V.packDir}`);return}console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} cannot converge to ${s}@${y}: ${V.reason}. Still serving @${g}.`)},ci=(0,Xr.loadWarrantKeypair)(f),li,us=(()=>{try{let y=Tn.join((0,he.resolveStateDir)(t.stateDir).dir,"instance-id");if(fn.existsSync(y))return fn.readFileSync(y,"utf-8").trim();let R=`${ww.hostname()}-${yw.randomBytes(4).toString("hex")}`;return fn.mkdirSync(Tn.dirname(y),{recursive:!0}),fn.writeFileSync(y,R),R}catch{return`${ww.hostname()}-${yw.randomBytes(4).toString("hex")}`}})(),Ho={get:()=>n?.manifest.metadata.version},J=(0,Li.resolveLeasePollSeconds)(t.leasePollSeconds),U=await(0,Hn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});U.explicitlyConfigured&&w(U,"lease");let Ee=(0,Hn.checkTrustRootSeparation)(U,h);for(let y of Ee.warnings)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} [TrustRoot] ${y}`);Ee.fatal&&(console.error(`Error: [TrustRoot] ${Ee.fatal}`),process.exit(1));let Ne=!1,ot=()=>{let y=(0,Hn.selectLeaseSigningKeys)(U,h);return y.packFallback&&!Ne&&(Ne=!0,console.warn(`${C.COLORS.yellow}Warning:${C.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 ${Hn.LEASE_JWKS_URL_ENV}=https://<plane>/.well-known/jwks.json?purpose=lease-signing (or ${Hn.LEASE_SIGNING_KEYS_ENV} with inline {"<kid>":"<public PEM>"} for an air-gapped install).`+(U.reason?` The derived lease trust root is unusable: ${U.reason}`:""))),y.keys},Se=(()=>{if(t.staticLeaseFile)try{let y=(0,Q0.parseLease)(JSON.parse(fn.readFileSync(t.staticLeaseFile,"utf-8")));if(!y.ok)throw new Error(y.reason);for(let R of y.warnings)console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} [Lease] --static-lease: ${R}`);return y.lease}catch(y){console.error(`Error: --static-lease ${t.staticLeaseFile} is not a usable lease: ${y instanceof Error?y.message:y}`),process.exit(1)}})(),Ve=Tn.join(P,"lease.json"),Kt={load:()=>{if(!fn.existsSync(Ve))return;let y=JSON.parse(fn.readFileSync(Ve,"utf-8"));if(y&&typeof y=="object"&&typeof y.body=="string"&&typeof y.lastGoodAt=="number")return y},save:y=>{fn.mkdirSync(Tn.dirname(Ve),{recursive:!0});let R=`${Ve}.tmp`;fn.writeFileSync(R,JSON.stringify(y)),fn.renameSync(R,Ve)}},Ce=(0,Li.createLeaseSource)({url:process.env.AGENTHIPPO_LEASE_URL,staticLease:Se,persistence:Kt,identity:()=>({instance:us,pack:s,version:Ho.get(),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,sandboxes:li?.sandboxes().length,engine:a,engineversion:(0,_a.installedEngineVersion)(a),...t.model?{model:t.model}:{},...process.env.AGENTHIPPO_ADVERTISED_URL?.trim()?{url:process.env.AGENTHIPPO_ADVERTISED_URL.trim()}:{},...process.env.AGENTHIPPO_ENROLL_TOKEN?.trim()?{"enroll-token":process.env.AGENTHIPPO_ENROLL_TOKEN.trim()}:{}}),cacheSeconds:(0,Li.leaseCacheSecondsFor)(J),signingKeys:()=>ot(),requireSignedLease:t.requireSignedLease,instanceId:us,...t.leaseMaxStalenessSeconds!==void 0?{maxStalenessSeconds:t.leaseMaxStalenessSeconds}:{},logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}),_t=async()=>{if(h.status!=="configured"){let y=await(0,Hn.loadPackTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});y.status==="configured"&&(h=y,w(y),f.info(`[Pack] signing keys now available (${Object.keys(y.keys).length}); re-verifying`),O(p,g))}if(U.status!=="configured"){let y=await(0,Hn.loadLeaseTrustRoot)({leaseUrl:process.env.AGENTHIPPO_LEASE_URL});y.status==="configured"&&(U=y,y.explicitlyConfigured&&w(y,"lease"),f.info(`[Lease] lease-signing keys now available (${Object.keys(y.keys).length})`))}};Ce.get().then(Yi).catch(()=>{});{let y=J*1e3;setInterval(()=>{Ce.get().then(Yi).catch(()=>{}),_t().catch(()=>{})},y).unref?.()}if(t.pullPacks){fn.mkdirSync(Er,{recursive:!0});let y=Tn.join(Er,g);fn.existsSync(y)||fn.cpSync(n.packPath,y,{recursive:!0}),(0,$l.promoteCurrent)(Er,y),p=Tn.join(Er,$l.CURRENT_LINK),await Ji((await Ce.get())?.version),O(p,g)}if(Ho.get=()=>g,Uo=(0,eM.createPackRunner)({storagePath:P,analyticsSessionsDir:v,packId:s,packVersion:g,provenance:()=>({policyVersion:ai,packDigest:m,engineVersion:(0,_a.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:us}),workspaceRoot:t.workspace,credentials:{apiKey:e.apiKey,baseUrl:e.baseUrl,useLiteLLM:e.useLiteLLM,litellmApiKey:e.litellmApiKey,openaiApiKey:e.openaiApiKey,anthropicApiKey:e.anthropicApiKey},logger:f,permissionHandler:Mo,claudeCheapModel:d,effort:u,omitGatewayToken:!0}),t.pullPacks){let y=J*1e3;setInterval(()=>{Ce.get().then(ee=>Ji(ee?.version)).catch(()=>{})},y).unref?.()}let Ae=!!t.sharedWorkspace,Ue=t.sandboxScope==="user"?"user":"session",At=t.sandbox==="container"?{readonly:[`${p}:${Dl.SANDBOX_PACK_DIR}`],writable:[`${t.workspace}:${Dl.SANDBOX_WORKSPACE_DIR}`]}:void 0;At&&Ae&&console.warn(`${C.COLORS.yellow}Warning:${C.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 Ms;At&&t.sandboxImage&&(await(0,Xr.alignSandboxWorkspaceOwnership)({exec:Xr.dockerExec,image:t.sandboxImage,writable:At.writable,logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}),Ms=await(0,Xr.resolveSandboxImageUser)(Xr.dockerExec,t.sandboxImage));let Gs=y=>(0,Xr.ensureSandboxStateDir)(Tn.join(P,"sandbox-state",(0,Zs.safeSessionId)(y)),Ms),Re=async y=>{if(!At)return{readonly:[],writable:[]};if(Ae)return At;let R=(0,Xr.ensureSandboxStateDir)(Tn.join(P,"sandbox-workspace",(0,Zs.safeSessionId)(y)),Ms);return{readonly:At.readonly,writable:[`${R}:${Dl.SANDBOX_WORKSPACE_DIR}`]}},Wn=(y,R,ee)=>{if((0,Hn.resolveRequireSignedPack)({lease:y?.requireSignedPack,localRequire:t.requireSignedPack,localAllowUnsigned:L})){let V=_.verify({packDir:p,pack:s,packVersion:g,keys:h.keys});if(V!==E&&(E=V,m=V.ok?V.claims.digest:void 0),!V.ok)throw new Li.LeaseDeniedError(T(V))}(0,Li.assertAdmitted)(y,{pack:s,version:g,image:t.sandboxImage,sessionKey:R,userHash:he.userNamespaceHash,userId:ee})},yt=t.sandbox?(0,X0.createSandboxRunner)({driver:t.sandbox==="container"?new Dl.ContainerSandboxDriver({exec:Xr.dockerExec,socketOwner:Ms,logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}):new bw.ProcessSandboxDriver({command:process.execPath,args:[...(0,Xr.sandboxScriptArg)(),"sandbox","--agent",p,"--stdio","--state-dir",P,"--workspace",t.workspace],namespaceIsolation:(0,bw.namespaceIsolationFromEnv)(),logger:{info:y=>f.info(y),warn:y=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${y}`)}}),image:t.sandboxImage??"",tier:t.sandbox==="container"?2:0,...At?{fs:At,fsFor:Re,stateDirFor:Gs}:{},routes:[...process.env.AGENTHIPPO_DATA_MCP_URL?[{kind:"data",target:process.env.AGENTHIPPO_DATA_MCP_URL}]:[],...e.baseUrl?[{kind:"inference",target:e.baseUrl}]:[]],limits:{ttlSeconds:t.sandboxTtlSeconds??1800},env:Object.fromEntries(["AGENTHIPPO_DATA_MCP_URL","AGENTHIPPO_SERVE"].filter(y=>process.env[y]).map(y=>[y,process.env[y]])),provenanceEnv:()=>(0,vw.buildProvenanceEnv)({policyVersion:ai,packDigest:m,engineVersion:(0,_a.installedEngineVersion)(a),tier:t.sandbox==="container"?2:t.sandbox?0:void 0,instanceId:us}),admit:async({sessionKey:y})=>{let R=await Ce.get();Wn(R,y)},inferenceBaseUrl:e.baseUrl,mintModelToken:async(y,R)=>{let ee=(0,Ml.currentCredential)()?.userId?.trim()||`anon:${R}`,ae=await Ce.get(),V=ae?.budget,ne=V===void 0?void 0:V.scope==="user"?`user:${ee}`:`session:${R}`;return(0,Xr.mintSandboxInferenceWarrant)(ci,{user:ee,pack:s,packVersion:g,sandboxId:y,tier:t.sandbox==="container"?2:0,ttlSeconds:(0,Z0.warrantTtlFromEnv)(),...ae?.billUsers===!0?{billing:"user"}:{},...ne?{budgetKey:ne}:{},...V?.windowSeconds?{budgetWindowSeconds:V.windowSeconds}:{}})},logger:f,runtime:{logger:f,editTracker:void 0,configProvider:void 0,permissionHandler:Mo}}):void 0;li=yt??void 0;let Kn=y=>typeof y=="number"&&Number.isFinite(y)&&y>0?y:void 0,ds={...(0,Aw.capsFromEnv)(),...Kn(t.maxTurnsPerSession)!==void 0?{maxTurnsPerSession:t.maxTurnsPerSession}:{},...Kn(t.maxSessionSeconds)!==void 0?{maxSessionSeconds:t.maxSessionSeconds}:{},...Kn(t.maxConcurrentSandboxes)!==void 0?{maxConcurrentSandboxes:t.maxConcurrentSandboxes}:{},...t.capOnBreach?{onBreach:t.capOnBreach}:{}},Ug=ds.maxTurnsPerSession!==void 0||ds.maxSessionSeconds!==void 0||ds.maxConcurrentSandboxes!==void 0,QA={sandboxes:()=>[],destroySession:async()=>{},revokeRoute:async()=>{},supportsInFlightTermination:!1},jo=!!(yt||process.env.AGENTHIPPO_LEASE_URL||Ug)?(0,Tw.createGovernor)({caps:(0,Aw.mergeCaps)((await Ce.get())?.caps,ds),sandboxes:yt??QA,getLease:()=>Ce.get(),pollSeconds:J,pack:s,userHash:he.userNamespaceHash,...yt?{}:{admitPack:(y,R)=>{try{return Wn(R,y),{allowed:!0}}catch(ee){return{allowed:!1,reason:ee instanceof Error?ee.message:String(ee)}}}},logger:f,audit:(y,R)=>Mt(String(R.sessionKey??"instance"),y,R)}):void 0;Ug&&!yt&&console.warn(`${C.COLORS.yellow}Warning:${C.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 Hg=yt??Uo,xo=jo?(0,Tw.withGovernor)(Hg,jo):Hg;if(jo){jo.start();let y=jo.policy(),R=(0,Li.effectiveKillLatencySeconds)(J);f.info(`[Serve] control plane: caps turns=${y.maxTurnsPerSession??"\u221E"} session=${y.maxSessionSeconds??"\u221E"}s sandboxes=${y.maxConcurrentSandboxes??"\u221E"} onBreach=${y.onBreach??"revoke-inference"}; lease poll ${J}s (worst-case kill latency ${R}s; an admin refresh is immediate)`),yt||f.info("[Serve] no sandbox driver: a deny rule with mode=kill takes effect as DRAIN \u2014 the in-flight turn finishes and only the next one is refused.");let ee=Ce.status();process.env.AGENTHIPPO_LEASE_URL&&!ee.requireSignedLease&&f.info("[Serve] lease signature is NOT required \u2014 set --require-signed-lease (or lease.requireSignedLease) once the control plane signs leases.")}let Us=(0,he.resolveServiceIdentity)();Us.error&&(console.error(`${C.COLORS.red}Error:${C.COLORS.reset} ${Us.error}`),process.exit(1)),Us.warning&&console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${Us.warning}`);let yu=!!process.env.AGENTHIPPO_LEASE_URL,ZA=async()=>{if(!Us.identity)return;let y=(0,Ll.resolveAllowServiceTurns)({lease:(await Ce.get())?.allowServiceTurns,managed:yu});if(!y.allowed){Mt("service-turn","service_turn_denied",{identity:(0,tM.hashIdentity)(Us.identity),gate:y.gate,detail:(0,Ll.describeServiceTurnGate)(y.gate)});return}return Us.identity};if(Us.identity){let y=(0,Ll.resolveAllowServiceTurns)({lease:void 0,managed:yu});f.info(`[Serve] unattended runs: identity configured (${he.SERVICE_USER_ENV}); `+(yu?"the control plane decides per turn via lease.allowServiceTurns \u2014 absent means deny":(0,Ll.describeServiceTurnGate)(y.gate)))}yt&&(f.info(`[Serve] sandbox mode: ${t.sandbox} (tier ${t.sandbox==="container"?2:0}) \u2014 engines run in per-session sandboxes`),e.baseUrl||console.warn(`${C.COLORS.yellow}Warning:${C.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 La=null,Ma=!1,Bo,jg=J0.createServer(async(y,R)=>{let ee=(0,he.corsHeaders)();for(let[ae,V]of Object.entries(ee))R.setHeader(ae,V);if(y.method==="OPTIONS"){R.writeHead(204),R.end();return}try{if(y.method==="GET"&&y.url==="/health"){let V={status:"ok"};V.evidence_ship_enabled=!!Bo;let ne=Bo?.lastOkAt();ne!==void 0&&(V.evidence_ship_last_ok_at=new Date(ne).toISOString());let at=(0,sp.getEvidenceShipStatus)();V.evidence_ship_disabled_reason=at.disabledReason??null,V.evidence_ship_consecutive_failures=at.consecutiveFailures,V.evidence_records_staged=at.recordsStaged,V.evidence_records_shipped=at.recordsShipped,V.evidence_records_skipped_too_old=at.recordsSkippedTooOld,V.evidence_files_skipped_too_old=at.filesSkippedTooOld,V.evidence_content_capture=at.contentCapture,at.lastHeartbeatAt!==void 0&&(V.evidence_ship_last_heartbeat_at=new Date(at.lastHeartbeatAt).toISOString());let nn=(0,Ow.getSessionEventWriterStats)();V.evidence_writes_ok=nn.written,V.evidence_writes_failed=nn.failed,nn.lastError&&(V.evidence_write_last_error={at:new Date(nn.lastError.at).toISOString(),event_type:nn.lastError.eventType,message:nn.lastError.message});let He=Ce.status();V.lease_configured=!!process.env.AGENTHIPPO_LEASE_URL,V.lease_signed=He.signed,V.lease_signature_required=He.requireSignedLease,V.lease_staleness_seconds=He.stalenessSeconds??null,V.lease_fail_closed=He.failClosed,V.pack_signature_ok=E.ok,V.pack_signature_required=(0,Hn.resolveRequireSignedPack)({localRequire:t.requireSignedPack,localAllowUnsigned:L}),V.pack_trust_root=h.status,V.lease_trust_root=U.status,V.lease_trust_root_source=U.explicitlyConfigured?"lease":"pack-fallback",V.kill_in_flight_supported=!!yt,R.writeHead(200,{"Content-Type":"application/json"}),R.end(JSON.stringify(V));return}if(y.method==="GET"&&y.url==="/ready"){R.writeHead(Ma?200:503,{"Content-Type":"application/json"}),R.end(JSON.stringify({ready:Ma,inflight:Y.inflight,queued:Y.queued,max:Y.max}));return}let ae=y.url?.split("?")[0]??"";if(hr&&ae.startsWith("/connect/")&&await hr(y,R))return;if(y.method==="GET"&&tn&&(ae==="/"||ae==="/index.html")){R.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),R.end(tn);return}if(y.method==="POST"&&ae==="/v1/chat"){let V=await Pw(y),ne=(0,he.resolveUserId)(y.headers,V),at=(0,he.resolveDataToken)(y.headers),nn=(0,he.resolveUserId)(y.headers,void 0)??(0,he.clientIp)(y);if(!en.tryConsume(nn)){R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(en.retryAfterSeconds(nn))}),R.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:fs,rejected:Xi}=(0,he.resolveServeSessionKey)(V.session_id,ne,Ue);if(Xi){F.append("unverified",(0,ya.generateRequestId)(),"warrant_denied",{reason:Xi}),R.writeHead(403,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"verified user identity required"}));return}let Hs=await Y.acquire();if(!Hs){Pt(`TurnGate: rejecting /v1/chat (inflight=${Y.inflight} queued=${Y.queued} max=${Y.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 ui=null;try{if(!ie.tryConsume(He)){R.writeHead(429,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await pn(He),ne?.trim()&&(ui=await On({userId:ne.trim(),sessionKey:He,inboundToken:at,edgeNonce:mr(y.headers)}),await se(ne.trim(),y.headers));let eT=await(0,Ml.runWithCredential)({userId:ne,dataToken:at},()=>oM(xo,V,He,fs,a,c,t.workspace,qi,ne,ui?.env),{onDenied:B(He)});R.writeHead(200,{"Content-Type":"application/json"}),R.end(JSON.stringify(eT)),It?.schedule(He)}finally{await ui?.release(),Hs()}return}if(y.method==="POST"&&ae==="/v1/chat/stream"){let V=await Pw(y),ne=(0,he.resolveUserId)(y.headers,V),at=(0,he.resolveDataToken)(y.headers),nn=(0,he.resolveUserId)(y.headers,void 0)??(0,he.clientIp)(y);if(!en.tryConsume(nn)){R.writeHead(429,{"Content-Type":"application/json","Retry-After":String(en.retryAfterSeconds(nn))}),R.end(JSON.stringify({error:"Rate limit exceeded"}));return}let{sessionKey:He,sandboxKey:fs,rejected:Xi}=(0,he.resolveServeSessionKey)(V.session_id,ne,Ue);if(Xi){F.append("unverified",(0,ya.generateRequestId)(),"warrant_denied",{reason:Xi}),R.writeHead(403,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"verified user identity required"}));return}let Hs=await Y.acquire();if(!Hs){Pt(`TurnGate: rejecting /v1/chat/stream (inflight=${Y.inflight} queued=${Y.queued} max=${Y.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 ui=null;try{if(!ie.tryConsume(He)){R.writeHead(429,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Per-session turn limit reached"}));return}await pn(He),ne?.trim()&&(ui=await On({userId:ne.trim(),sessionKey:He,inboundToken:at,edgeNonce:mr(y.headers)}),await se(ne.trim(),y.headers)),await(0,Ml.runWithCredential)({userId:ne,dataToken:at},async()=>{R.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),await lM(xo,V,He,fs,a,c,t.workspace,qi,R,ne,ui?.env)},{onDenied:B(He)}),It?.schedule(He)}finally{await ui?.release(),Hs()}return}R.writeHead(404,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:"Not found"}))}catch(ae){if(ae?.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:",ae),R.headersSent||R.writeHead(500,{"Content-Type":"application/json"}),R.end(JSON.stringify({error:ae instanceof Error?ae.message:"Internal error"}))}});jg.listen(t.port,N,()=>{(async()=>{console.log(""),console.log(wa),console.log("Agent Hippo Server"),console.log(wa),console.log(`Host: ${N}`),console.log(`Port: ${t.port}`),console.log(`Engine: ${a}`),console.log(`Model: ${c}`),d&&console.log(`Cheap: ${d}`),console.log(`Workspace: ${t.workspace}`),n&&(console.log(`Pack: ${n.manifest.metadata.name}@${n.manifest.metadata.version}`),console.log(`Gateway: ${i}`)),console.log(wa),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 y=(0,sp.resolveSessionShipConfig)(us,v,P);y&&(Bo=(0,sp.startSessionShipper)({...y,logger:{info:ee=>f.info(ee),warn:ee=>console.warn(`${C.COLORS.yellow}Warning:${C.COLORS.reset} ${ee}`)}}));let R=t.bind?.trim();if(R)try{await cM(i,R,Be)}catch(ee){console.error(`${C.COLORS.yellow}Warning:${C.COLORS.reset} Failed to bind channels: ${ee instanceof Error?ee.message:String(ee)}`)}if(t.gatewayBridge){if(xe)try{it=await(0,ut.startEgressBroker)({registry:xe,workspaceRoot:t.workspace,agentId:n.manifest.metadata.name,send:async(ee,ae,V)=>{let ne=await(0,nM.sendGatewayOutboundMessage)(ee,{message:ae,media:V,token:Be});return{ok:ne.ok,via:ne.via,stdout:ne.stdout,stderr:ne.stderr}},logger:t.verbose?new jn.ConsoleLogger("[Egress]"):new jn.NoOpLogger,audit:Mt}),process.env[ut.EGRESS_URL_ENV]=it.url,console.log("OK: Egress broker on loopback \u2014 gateway token stays broker-side; agent sends via turn nonce")}catch(ee){console.error(`${C.COLORS.red}Error:${C.COLORS.reset} Egress broker failed to start: ${ee instanceof Error?ee.message:String(ee)}`),process.exit(1)}try{La=await aM({gatewayAgentId:i,packName:n.manifest.metadata.name,workspace:t.workspace,registerTurn:On,brokerGatewayToken:Be,engine:a,defaultModel:c,current:()=>({engine:a,defaultModel:c}),runner:xo,permissions:qi,turnGate:Y,rateLimiter:en,turnLimiter:ie,warnGateReject:Pt,prepareSession:pn,sandboxScope:Ue,onTurnComplete:ee=>It?.schedule(ee),logWarrantDenied:B,serviceUserIfPermitted:ZA})}catch(ee){console.error(`${C.COLORS.yellow}Warning:${C.COLORS.reset} Gateway bridge failed: ${ee instanceof Error?ee.message:String(ee)}`)}}Ma=!0})()});let xg=!1,Bg=()=>{xg||(xg=!0,Ma=!1,console.log(`
566
+ Shutting down...`),(async()=>{if(It)try{await It.flush()}catch{}if(La){try{await La.unregisterAgent(i)}catch{}La=null}if(Et)try{await Et.close()}catch{}if(it)try{await it.close()}catch{}if(Bo)try{await Bo.flush()}catch{}jg.close(()=>{xo.dispose(),process.exit(0)}),setTimeout(()=>{xo.dispose(),process.exit(0)},1e4).unref()})())};process.on("SIGINT",Bg),process.on("SIGTERM",Bg)}async function Pw(t){let e=await(0,he.readBodyWithCap)(t);try{return JSON.parse(e)}catch{throw new Error("Invalid JSON")}}async function oM(t,e,n,r,s,i,o,a,c,l){let d=await t.run({engineId:kw(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:c,permissions:a,turnEnv:l});return{success:d.success,text:d.text,thinking:d.thinking||void 0,tool_calls:d.toolCalls,error:d.error}}function Nw(t,e,n="session",r=!1){if(r&&e){let a=`gateway-${e}`;return{sessionKey:`${a}--${(0,Sw.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,Sw.randomUUID)()}`;return{sessionKey:o,sandboxKey:o,outboundKey:o,durable:!1}}async function Rw(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 aM(t){let{GatewayBridge:e}=await Promise.resolve().then(()=>In(_w())),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)=>Cw(t,o,a)}),console.log(`${C.COLORS.green}\u2713${C.COLORS.reset} Gateway bridge: registered "${t.gatewayAgentId}" at ${r}`),console.log(`${C.COLORS.dim} Gateway outbound routes: ${t.workspace}/.agent-hippo/sessions/<sessionKey>/gateway-outbound.json${C.COLORS.reset}`),console.log(`${C.COLORS.dim} openclaw agent --agent ${t.gatewayAgentId} --message "\u2026"${C.COLORS.reset}`),i}async function Cw(t,e,n){let r=t.current?.()??{engine:t.engine,defaultModel:t.defaultModel},s=n.engineId?.trim().toLowerCase(),i=s==="custom"?r.engine:s||r.engine,o=(0,he.peerToUserId)(n.peerInfo),a=o?void 0:await t.serviceUserIfPermitted?.(),c=o??a,{sessionKey:l,sandboxKey:d,outboundKey:u,durable:f}=Nw(n,c,t.sandboxScope,!!a);return Rw({rateLimiter:t.rateLimiter,turnLimiter:t.turnLimiter,turnGate:t.turnGate,warnGateReject:t.warnGateReject,rlKey:c??"gateway",sessionKey:l,trackSession:f,emitter:n.emitter,run:async()=>{f&&await t.prepareSession(l);let p=c?.trim()?await t.registerTurn({userId:c.trim(),sessionKey:l,egressStoreKey:u}):null;try{let g=await(0,Ml.runWithCredential)({userId:c},()=>t.runner.run({engineId:i,modelId:r.defaultModel,message:e,workspaceRoot:t.workspace,sessionId:l,sandboxKey:d,gatewaySessionKey:u,analyticsUserId:c,emitter:n.emitter,permissions:t.permissions,turnEnv:p?.env}),{onDenied:t.logWarrantDenied(l)});return f&&t.onTurnComplete?.(l),{success:g.success,error:g.error}}finally{await p?.release()}}})}async function cM(t,e,n){let{createAgentIDEGatewayClient:r}=await Promise.resolve().then(()=>In(Il())),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,d;if(e.trim()==="*"){let f=await(0,ip.fetchMeetAgentChannelContext)(o.request.bind(o));c=f.rows.map(p=>p.id),d=f.statusPayload}else{let f=(0,ip.parseChannelBindSpecs)(e);c=f.map(p=>p.channelId),l=Object.fromEntries(f.filter(p=>p.accountId).map(p=>[p.channelId,p.accountId])),Object.keys(l).length===0&&(l=void 0)}if(c.length===0){console.log(`${C.COLORS.yellow}Warning:${C.COLORS.reset} No channels to bind.`);return}let u=await(0,ip.applyAgentChannelBindingsViaConfigPatch)(o.request.bind(o),{agentId:t,selectedChannelIds:c,channelAccountOverrides:l,statusPayload:d});console.log(u?`${C.COLORS.green}\u2713${C.COLORS.reset} Bound ${t} to: ${c.join(", ")}`:`${C.COLORS.dim}Slack already bound to ${t}; skipped config.patch${C.COLORS.reset}`)}finally{o.close()}}async function lM(t,e,n,r,s,i,o,a,c,l,d){let u=!1,f=(m,h)=>{u||c.writableEnded||c.write(`data: ${JSON.stringify({type:m,...h})}
548
567
 
549
- `)},p=()=>{u||(u=!0,c.end())},g={async thinking(m){f("thinking",{delta:m})},async text(m){f("text",{delta:m})},async toolStart(m,h,w){f("tool_start",{name:m,input:h,tool_call_id:w})},async toolEnd(m,h,w,_){f("tool_end",{name:m,tool_call_id:h,result:w,is_error:_})},async progress(m){f("progress",{message:m})},async question(m){return f("question",{payload:m}),{selected:[],freeText:null,declined:!0}},async error(m){f("error",{message:m})},async done(){f("done",{}),p()}};try{let m=await t.run({engineId:kw(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:l,emitter:g,permissions:a,turnEnv:d});!m.success&&!u&&f("error",{message:m.error??"refused by policy"}),u||(f("done",{}),p())}catch(m){f("error",{message:m instanceof Error?m.message:"Unknown error"}),p()}}function kw(t,e){let n=t?.trim().toLowerCase();return!n||n==="custom"?e:n}});var ap=S(or=>{"use strict";var uM=or&&or.__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]})),dM=or&&or.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),fM=or&&or.__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"&&uM(n,e,r[s]);return dM(n,e),n}})();Object.defineProperty(or,"__esModule",{value:!0});or.signJwt=pM;or.verifyJwt=gM;or.extractBearerToken=hM;or.looksLikeJwt=mM;var Lw=fM(require("crypto"));function Dw(t){return(typeof t=="string"?Buffer.from(t,"utf8"):t).toString("base64url")}function pM(t,e,n){let r={alg:"HS256",typ:"JWT"},s=Math.floor(Date.now()/1e3),i={...t,iat:s,exp:s+n},o=Dw(JSON.stringify(r)),a=Dw(JSON.stringify(i)),c=Lw.createHmac("sha256",e).update(`${o}.${a}`).digest("base64url");return`${o}.${a}.${c}`}function gM(t,e){let n=t.split(".");if(n.length!==3)return;let[r,s,i]=n,o=Lw.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 hM(t){return t?.trim()&&/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||void 0}function mM(t){return t.split(".").length===3}});var Mw=S(zr=>{"use strict";var EM=zr&&zr.__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=zr&&zr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),up=zr&&zr.__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"&&EM(n,e,r[s]);return _M(n,e),n}})();Object.defineProperty(zr,"__esModule",{value:!0});zr.AuthBrokerStore=void 0;var cp=up(require("crypto")),To=up(require("fs")),yM=up(require("path")),wM=ra(),SM=ap(),lp=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(!To.existsSync(e))return;let n=To.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=yM.dirname(this.persistPath);To.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{To.writeFileSync(i,JSON.stringify(s,null,2),"utf8"),To.renameSync(i,this.persistPath)}catch(o){try{To.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,wM.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_${cp.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=cp.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=cp.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,SM.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"}}:{}}}};zr.AuthBrokerStore=lp});var Hw=S(Dr=>{"use strict";var AM=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]})),TM=Dr&&Dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bM=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"&&AM(n,e,r[s]);return TM(n,e),n}})();Object.defineProperty(Dr,"__esModule",{value:!0});Dr.generateCodeVerifier=vM;Dr.codeChallengeFromVerifier=Uw;Dr.verifyPkceChallenge=OM;var dp=bM(require("crypto")),Gw="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";function vM(t=64){let e=dp.randomBytes(t),n="";for(let r=0;r<t;r++)n+=Gw[e[r]%Gw.length];return n}function Uw(t){return dp.createHash("sha256").update(t).digest("base64url")}function OM(t,e){let n=Buffer.from(Uw(t)),r=Buffer.from(e);return n.length===r.length&&dp.timingSafeEqual(n,r)}});var fp=S(ar=>{"use strict";Object.defineProperty(ar,"__esModule",{value:!0});ar.AUTH_CALLBACK_PATH=ar.AUTH_EXTENSION_AUTHORITY=ar.AUTH_SCOPES=ar.AUTH_CLIENT_ID=ar.AUTH_PROVIDER_ID=void 0;ar.AUTH_PROVIDER_ID="agenthippo";ar.AUTH_CLIENT_ID="agenthippo-ide";ar.AUTH_SCOPES=["openid","profile","email","agenthippo:ide"];ar.AUTH_EXTENSION_AUTHORITY="agenthippo.agenthippo";ar.AUTH_CALLBACK_PATH="/auth/callback"});var xw=S(bo=>{"use strict";Object.defineProperty(bo,"__esModule",{value:!0});bo.parseAuthCallback=jw;bo.parseAuthCallbackFromText=IM;bo.isAuthCallbackParts=PM;bo.parseAuthCallbackFromLoopbackUrl=NM;var Gl=fp();function jw(t,e){if(t.authority!==Gl.AUTH_EXTENSION_AUTHORITY||t.path!==Gl.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 IM(t,e){let n=t.trim();if(n)try{let r=new URL(n);return jw({authority:r.host,path:r.pathname,query:r.search.replace(/^\?/,"")},e)}catch{return}}function PM(t,e){return t===Gl.AUTH_EXTENSION_AUTHORITY&&e===Gl.AUTH_CALLBACK_PATH}function NM(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 Ww=S(xn=>{"use strict";var RM=xn&&xn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),CM=xn&&xn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),mp=xn&&xn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&RM(n,e,r[s]);return CM(n,e),n}})();Object.defineProperty(xn,"__esModule",{value:!0});xn.hasTrustedProxyProof=void 0;xn.isAllowedRedirectUri=Fw;xn.createAuthBrokerServer=Vw;xn.startAuthBrokerServer=BM;var kM=mp(require("http")),$M=mp(require("crypto")),Ta=require("url"),DM=mp(require("path")),Aa=ra(),LM=Mw(),MM=Hw(),Ul=ap(),Hl=fp(),GM=xw(),pp=Ir();function Fw(t){let e;try{e=new Ta.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,GM.isAuthCallbackParts)(e.host,e.pathname)}var UM=Ir();Object.defineProperty(xn,"hasTrustedProxyProof",{enumerable:!0,get:function(){return UM.hasTrustedProxyProof}});function be(t,e,n){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(n))}function HM(t){let e=t.indexOf("@");return e<=0?t:`${t[0]}***@${t.slice(e+1)}`}var jM=64*1024;async function gp(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>jM){let i=new Error("Request body too large");throw i.status=413,i}e.push(s)}return Buffer.concat(e).toString("utf8")}function hp(t){let e=new URLSearchParams(t),n={};for(let[r,s]of e.entries())n[r]=s;return n}function Bw(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 xM(t,e,n){try{let r=new Ta.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 Vw(t){let e=t??(0,Aa.loadAuthBrokerConfig)();if(!e.devMode&&e.jwtSecret===Aa.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.
568
+ `)},p=()=>{u||(u=!0,c.end())},g={async thinking(m){f("thinking",{delta:m})},async text(m){f("text",{delta:m})},async toolStart(m,h,w){f("tool_start",{name:m,input:h,tool_call_id:w})},async toolEnd(m,h,w,_){f("tool_end",{name:m,tool_call_id:h,result:w,is_error:_})},async progress(m){f("progress",{message:m})},async question(m){return f("question",{payload:m}),{selected:[],freeText:null,declined:!0}},async error(m){f("error",{message:m})},async done(){f("done",{}),p()}};try{let m=await t.run({engineId:kw(e.engine,s),modelId:e.model||i,message:e.message,workspaceRoot:o,sessionId:n,sandboxKey:r,analyticsUserId:l,emitter:g,permissions:a,turnEnv:d});!m.success&&!u&&f("error",{message:m.error??"refused by policy"}),u||(f("done",{}),p())}catch(m){f("error",{message:m instanceof Error?m.message:"Unknown error"}),p()}}function kw(t,e){let n=t?.trim().toLowerCase();return!n||n==="custom"?e:n}});var ap=S(or=>{"use strict";var uM=or&&or.__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]})),dM=or&&or.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),fM=or&&or.__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"&&uM(n,e,r[s]);return dM(n,e),n}})();Object.defineProperty(or,"__esModule",{value:!0});or.signJwt=pM;or.verifyJwt=gM;or.extractBearerToken=hM;or.looksLikeJwt=mM;var Lw=fM(require("crypto"));function Dw(t){return(typeof t=="string"?Buffer.from(t,"utf8"):t).toString("base64url")}function pM(t,e,n){let r={alg:"HS256",typ:"JWT"},s=Math.floor(Date.now()/1e3),i={...t,iat:s,exp:s+n},o=Dw(JSON.stringify(r)),a=Dw(JSON.stringify(i)),c=Lw.createHmac("sha256",e).update(`${o}.${a}`).digest("base64url");return`${o}.${a}.${c}`}function gM(t,e){let n=t.split(".");if(n.length!==3)return;let[r,s,i]=n,o=Lw.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 hM(t){return t?.trim()&&/^Bearer\s+(.+)$/i.exec(t.trim())?.[1]?.trim()||void 0}function mM(t){return t.split(".").length===3}});var Mw=S(zr=>{"use strict";var EM=zr&&zr.__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=zr&&zr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),up=zr&&zr.__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"&&EM(n,e,r[s]);return _M(n,e),n}})();Object.defineProperty(zr,"__esModule",{value:!0});zr.AuthBrokerStore=void 0;var cp=up(require("crypto")),To=up(require("fs")),yM=up(require("path")),wM=ra(),SM=ap(),lp=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(!To.existsSync(e))return;let n=To.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=yM.dirname(this.persistPath);To.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{To.writeFileSync(i,JSON.stringify(s,null,2),"utf8"),To.renameSync(i,this.persistPath)}catch(o){try{To.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,wM.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_${cp.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=cp.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=cp.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,SM.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"}}:{}}}};zr.AuthBrokerStore=lp});var Hw=S(Dr=>{"use strict";var AM=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]})),TM=Dr&&Dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),bM=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"&&AM(n,e,r[s]);return TM(n,e),n}})();Object.defineProperty(Dr,"__esModule",{value:!0});Dr.generateCodeVerifier=vM;Dr.codeChallengeFromVerifier=Uw;Dr.verifyPkceChallenge=OM;var dp=bM(require("crypto")),Gw="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";function vM(t=64){let e=dp.randomBytes(t),n="";for(let r=0;r<t;r++)n+=Gw[e[r]%Gw.length];return n}function Uw(t){return dp.createHash("sha256").update(t).digest("base64url")}function OM(t,e){let n=Buffer.from(Uw(t)),r=Buffer.from(e);return n.length===r.length&&dp.timingSafeEqual(n,r)}});var fp=S(ar=>{"use strict";Object.defineProperty(ar,"__esModule",{value:!0});ar.AUTH_CALLBACK_PATH=ar.AUTH_EXTENSION_AUTHORITY=ar.AUTH_SCOPES=ar.AUTH_CLIENT_ID=ar.AUTH_PROVIDER_ID=void 0;ar.AUTH_PROVIDER_ID="agenthippo";ar.AUTH_CLIENT_ID="agenthippo-ide";ar.AUTH_SCOPES=["openid","profile","email","agenthippo:ide"];ar.AUTH_EXTENSION_AUTHORITY="agenthippo.agenthippo";ar.AUTH_CALLBACK_PATH="/auth/callback"});var xw=S(bo=>{"use strict";Object.defineProperty(bo,"__esModule",{value:!0});bo.parseAuthCallback=jw;bo.parseAuthCallbackFromText=PM;bo.isAuthCallbackParts=IM;bo.parseAuthCallbackFromLoopbackUrl=NM;var Gl=fp();function jw(t,e){if(t.authority!==Gl.AUTH_EXTENSION_AUTHORITY||t.path!==Gl.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 PM(t,e){let n=t.trim();if(n)try{let r=new URL(n);return jw({authority:r.host,path:r.pathname,query:r.search.replace(/^\?/,"")},e)}catch{return}}function IM(t,e){return t===Gl.AUTH_EXTENSION_AUTHORITY&&e===Gl.AUTH_CALLBACK_PATH}function NM(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 Ww=S(xn=>{"use strict";var RM=xn&&xn.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),CM=xn&&xn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),mp=xn&&xn.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&RM(n,e,r[s]);return CM(n,e),n}})();Object.defineProperty(xn,"__esModule",{value:!0});xn.hasTrustedProxyProof=void 0;xn.isAllowedRedirectUri=Fw;xn.createAuthBrokerServer=Vw;xn.startAuthBrokerServer=BM;var kM=mp(require("http")),$M=mp(require("crypto")),Ta=require("url"),DM=mp(require("path")),Aa=ra(),LM=Mw(),MM=Hw(),Ul=ap(),Hl=fp(),GM=xw(),pp=Pr();function Fw(t){let e;try{e=new Ta.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,GM.isAuthCallbackParts)(e.host,e.pathname)}var UM=Pr();Object.defineProperty(xn,"hasTrustedProxyProof",{enumerable:!0,get:function(){return UM.hasTrustedProxyProof}});function be(t,e,n){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(n))}function HM(t){let e=t.indexOf("@");return e<=0?t:`${t[0]}***@${t.slice(e+1)}`}var jM=64*1024;async function gp(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>jM){let i=new Error("Request body too large");throw i.status=413,i}e.push(s)}return Buffer.concat(e).toString("utf8")}function hp(t){let e=new URLSearchParams(t),n={};for(let[r,s]of e.entries())n[r]=s;return n}function Bw(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 xM(t,e,n){try{let r=new Ta.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 Vw(t){let e=t??(0,Aa.loadAuthBrokerConfig)();if(!e.devMode&&e.jwtSecret===Aa.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.
550
569
  1. Generate one: openssl rand -hex 32
551
570
  2. Set it here: AGENTHIPPO_AUTH_PROXY_SECRET=<secret>
552
571
  3. Have the proxy send it, e.g. in the Caddyfile:
553
572
  header_up ${Aa.AUTH_PROXY_SECRET_HEADER} {env.AGENTHIPPO_AUTH_PROXY_SECRET}
554
- 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?DM.join(e.dataDir,"auth-store.json"):void 0,r=new LM.AuthBrokerStore(e,n),s=new pp.RateLimiter(e.rateLimitPerMin),i=(m,h={})=>{let w=Object.entries(h).filter(([,_])=>_!==void 0&&_!=="").map(([_,E])=>{let O=!e.logPii&&typeof E=="string"&&E.includes("@")?HM(E):E;return`${_}=${O}`}).join(" ");console.log(`[auth-broker] ${m}${w?" "+w:""}`)},o=1e4,a=2048,c=new Map,l=5e3,d=0;function u(m){let h=(0,Ul.extractBearerToken)(m.headers.authorization)||Bw(m.headers.cookie,e.cookieName);if(!h)return;let w=$M.createHash("sha256").update(h).digest("hex"),_=c.get(w);if(_){if(_.exp>Date.now())return _.user;c.delete(w)}let E=(0,Ul.verifyJwt)(h,e.jwtSecret);if(!E?.sub||!E.email)return;let O=r.getUser(String(E.sub));if(!O){let T=typeof E.team_id=="string"&&E.team_id?E.team_id:void 0;O={id:String(E.sub),email:String(E.email),displayName:typeof E.name=="string"&&E.name?E.name:String(E.email),teamId:T??(e.teamConfigured?e.team.id:void 0)}}if(E.exp){let T=Math.min(E.exp*1e3,Date.now()+o);if(c.size>=a){let L=Date.now();for(let[A,I]of c)I.exp<L&&c.delete(A);c.size>=a&&c.clear()}c.set(w,{user:O,exp:T})}return O}let f=m=>{let h=(m.headers["x-auth-request-email"]||"").trim().toLowerCase();if(h)return e.devMode||!e.proxySecret&&e.trustProxyHeadersUnverified||(0,pp.hasTrustedProxyProof)(m.headers,e.proxySecret)?h:null},p=(m,h,w)=>{i("proxy_header.unverified",{ip:h,path:w}),be(m,401,{error:"unauthorized",error_description:`X-Auth-Request-Email was present without a valid ${Aa.AUTH_PROXY_SECRET_HEADER} header. Only the trusted reverse proxy may assert an identity to this broker.`})},g=kM.createServer(async(m,h)=>{try{let w=m.headers.host||`127.0.0.1:${e.port}`,_=new Ta.URL(m.url||"/",`http://${w}`),E=_.pathname,O=(0,pp.clientIp)(m),T=()=>s.tryConsume(O)?!1:(i("rate_limited",{ip:O,path:E}),h.writeHead(429,{"Content-Type":"application/json","Retry-After":String(s.retryAfterSeconds(O))}),h.end(JSON.stringify({error:"rate_limited"})),!0);if(m.method==="GET"&&(E==="/health"||E==="/api/ide/health")){be(h,200,{status:"ok",service:"auth-broker"});return}if(m.method==="GET"&&E==="/oauth/authorize"){if(T())return;let A=_.searchParams.get("client_id")||"",I=_.searchParams.get("redirect_uri")||"",b=_.searchParams.get("code_challenge")||"",N=_.searchParams.get("state")||"",P=_.searchParams.get("login_hint")||_.searchParams.get("email")||"";if(A!==Hl.AUTH_CLIENT_ID||!I||!b){i("authorize.invalid_request",{client_id:A}),be(h,400,{error:"invalid_request"});return}if(!Fw(I)){i("authorize.invalid_redirect_uri",{client_id:A}),be(h,400,{error:"invalid_request",error_description:"redirect_uri not allowed"});return}if(e.devMode&&P){let X=r.upsertUser(P),te=r.createAuthCode({userId:X.id,clientId:A,redirectUri:I,codeChallenge:b});i("authorize.dev",{user:X.email});let Pe=new Ta.URL(I);Pe.searchParams.set("code",te),N&&Pe.searchParams.set("state",N),h.writeHead(302,{Location:Pe.toString()}),h.end();return}let v=f(m);if(v===null){p(h,O,E);return}if(!v){be(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let F=r.upsertUser(v),B=r.createAuthCode({userId:F.id,clientId:A,redirectUri:I,codeChallenge:b});i("authorize.signin",{user:F.email});let re=new Ta.URL(I);re.searchParams.set("code",B),N&&re.searchParams.set("state",N),h.writeHead(302,{Location:re.toString()}),h.end();return}if(m.method==="GET"&&E==="/oauth/browser-login"){if(T())return;let A=f(m);if(A===null){p(h,O,E);return}if(!A){be(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let I=r.upsertUser(A),b=r.issueTokens(I,Hl.AUTH_CLIENT_ID,"openid profile email agenthippo:ide");i("browser.login",{user:I.email});let N=e.publicBaseUrl.startsWith("https"),P=[`${e.cookieName}=${b.accessToken}`,"Path=/","HttpOnly","SameSite=Lax",...N?["Secure"]:[],...e.cookieDomain?[`Domain=${e.cookieDomain}`]:[],`Max-Age=${b.expiresIn}`],v=xM(_.searchParams.get("return_to")||"",e.cookieDomain,e.publicBaseUrl||"/");h.writeHead(302,{"Set-Cookie":P.join("; "),Location:v}),h.end();return}if(m.method==="POST"&&E==="/oauth/dev/login"){if(T())return;if(!e.devMode){be(h,404,{error:"not_found"});return}let A=await gp(m),I=A.trim().startsWith("{")?JSON.parse(A):hp(A),b=I.email?.trim(),N=I.code_challenge?.trim(),P=I.redirect_uri?.trim(),v=I.client_id?.trim()||Hl.AUTH_CLIENT_ID;if(!b||!N||!P){be(h,400,{error:"invalid_request"});return}let F=r.upsertUser(b),B=r.createAuthCode({userId:F.id,clientId:v,redirectUri:P,codeChallenge:N});i("dev.login",{user:F.email}),be(h,200,{code:B});return}if(m.method==="POST"&&E==="/oauth/token"){if(T())return;let A=await gp(m),I=hp(A),b=I.grant_type,N=I.client_id||Hl.AUTH_CLIENT_ID,P=I.scope||"openid profile email agenthippo:ide";if(b==="authorization_code"){let v=I.code,F=I.code_verifier,B=I.redirect_uri;if(!v||!F||!B){be(h,400,{error:"invalid_request"});return}let re=r.consumeAuthCode(v);if(!re||re.clientId!==N||re.redirectUri!==B){be(h,400,{error:"invalid_grant"});return}if(!(0,MM.verifyPkceChallenge)(F,re.codeChallenge)){be(h,400,{error:"invalid_grant",error_description:"PKCE verification failed"});return}let X=r.getUser(re.userId);if(!X){be(h,400,{error:"invalid_grant"});return}let te=r.issueTokens(X,N,P);i("token.signin",{user:X.email,client_id:N}),be(h,200,{access_token:te.accessToken,refresh_token:te.refreshToken,token_type:"Bearer",expires_in:te.expiresIn,scope:P});return}if(b==="refresh_token"){let v=I.refresh_token;if(!v){be(h,400,{error:"invalid_request"});return}let F=r.consumeRefreshToken(v);if(!F||F.clientId!==N){i("token.refresh.invalid_grant"),be(h,400,{error:"invalid_grant"});return}let B=r.getUser(F.userId);if(!B){be(h,400,{error:"invalid_grant"});return}let re=r.issueTokens(B,N,P);i("token.refresh",{user:B.email}),be(h,200,{access_token:re.accessToken,refresh_token:re.refreshToken,token_type:"Bearer",expires_in:re.expiresIn,scope:P});return}be(h,400,{error:"unsupported_grant_type"});return}if(m.method==="POST"&&E==="/oauth/introspect"){if(!u(m)){i("introspect.unauthorized"),be(h,401,{error:"unauthorized"});return}let A=await gp(m),b=hp(A).token;if(!b){be(h,400,{error:"invalid_request"});return}let N=(0,Ul.verifyJwt)(b,e.jwtSecret);if(!N?.sub){be(h,200,{active:!1});return}be(h,200,{active:!0,sub:N.sub,email:N.email,team_id:N.team_id,scope:N.scope,exp:N.exp});return}let L=u(m);if(m.method==="GET"&&E==="/api/ide/me"){if(!L){let I=Date.now();I-d>l&&(d=I,i("me.unauthorized")),be(h,401,{error:"unauthorized"});return}h.setHeader("X-Agent-User",L.email||L.id);let A=(0,Ul.extractBearerToken)(m.headers.authorization)||Bw(m.headers.cookie,e.cookieName);A&&h.setHeader("X-Agent-User-Assertion",A),be(h,200,r.buildMe(L));return}if(m.method==="GET"&&E==="/api/ide/bootstrap"){if(!L){be(h,401,{error:"unauthorized"});return}be(h,200,r.buildBootstrap(L));return}if(m.method==="POST"&&E==="/api/ide/signout"){L&&(r.revokeRefreshTokensForUser(L.id),i("signout",{user:L.email})),be(h,200,{ok:!0});return}be(h,404,{error:"not_found"})}catch(w){let _=w.status;if(_===413){be(h,413,{error:"request_entity_too_large"});return}if(_===403){i("forbidden",{reason:"email_domain"}),be(h,403,{error:"forbidden",error_description:"email domain not allowed"});return}console.error("[auth-broker] internal error",w),be(h,500,{error:"server_error"})}});return{server:g,baseUrl:e.publicBaseUrl,store:r,config:e,close:()=>new Promise((m,h)=>{g.close(w=>w?h(w):m())})}}async function BM(t){let e=Vw(t),n=(0,Aa.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 Kw=S(Ep=>{"use strict";Object.defineProperty(Ep,"__esModule",{value:!0});Ep.authBrokerCommand=WM;var FM=ra(),VM=Ww();async function WM(){let t=(0,FM.loadAuthBrokerConfig)(),e=await(0,VM.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 yp=S(Lr=>{"use strict";Object.defineProperty(Lr,"__esModule",{value:!0});Lr.EDGE_AGENT_PORT=void 0;Lr.renderIdentityLayer=_p;Lr.renderSidecarEdgeCaddyfile=KM;Lr.renderSidecarFedCaddyfile=qM;var qw=[" # 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 _p(t){let{mode:e,authBrokerAddr:n,healthProxy:r,agentProxy:s}=t,i=t.oauth2ProxyAddr??"",o=t.catchallBody??s,a=t.turnRegistration,c=a?[" # Turn registration \u2014 after identity: X-Agent-User (set above) names the user the"," # sidecar mints the nonce for. Only POST chat turns match; others pass through."," # X-Agent-User-Assertion (also set above) rides along as the turn's inboundToken:"," # without it `passthrough` fails closed on every call and an RFC 8693 `exchange`"," # provider has no subject_token.",` forward_auth @turnStart ${a.connectorAddr} {`," uri /edge/turn"," copy_headers X-Agent-Turn-Nonce",` header_up Authorization "Bearer {$${a.tokenEnvVar}}"`," }"]:[],l=f=>f.map(p=>p.trim()?` ${p}`:p),d=(f,p)=>a?[" route {",...l(f),...c,...l(p)," }"]:[...f,...p],u=[];if(u.push(" # Hygiene: never let a client-supplied nonce or assertion header through. The trusted"," # values are set from the verified /api/ide/me response below, never from the client \u2014"," # a forged assertion would ride as the turn's inboundToken."," request_header -X-Agent-Turn-Nonce"," request_header -X-Agent-User-Assertion"),e==="self-issued"&&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=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...qw," }"," }"," # Federated SSO (A\u2032): browsers from other subdomains land here to stamp the shared cookie."," # Same oauth2-proxy gate as authorize; must precede the generic /oauth/* handle."," handle /oauth/browser-login {",` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...qw," }"," }"," # 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 {",...d([` 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 {",...d([` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email>X-Agent-User"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }"],o)," }");else{let f=t.idpUrl?.trim()||"",p=f?` redir * "${f}/oauth/browser-login?return_to=https://{http.request.host}{http.request.uri_escaped}" 302`:' respond "Unauthorized" 401';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 {",...d([` 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}Lr.EDGE_AGENT_PORT=8090;function KM(){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} {",..._p({mode:"self-issued",oauth2ProxyAddr:"localhost:4180",authBrokerAddr:"localhost:9780",healthProxy:[` reverse_proxy localhost:${Lr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${Lr.EDGE_AGENT_PORT}`]}),"}",""].join(`
573
+ 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?DM.join(e.dataDir,"auth-store.json"):void 0,r=new LM.AuthBrokerStore(e,n),s=new pp.RateLimiter(e.rateLimitPerMin),i=(m,h={})=>{let w=Object.entries(h).filter(([,_])=>_!==void 0&&_!=="").map(([_,E])=>{let O=!e.logPii&&typeof E=="string"&&E.includes("@")?HM(E):E;return`${_}=${O}`}).join(" ");console.log(`[auth-broker] ${m}${w?" "+w:""}`)},o=1e4,a=2048,c=new Map,l=5e3,d=0;function u(m){let h=(0,Ul.extractBearerToken)(m.headers.authorization)||Bw(m.headers.cookie,e.cookieName);if(!h)return;let w=$M.createHash("sha256").update(h).digest("hex"),_=c.get(w);if(_){if(_.exp>Date.now())return _.user;c.delete(w)}let E=(0,Ul.verifyJwt)(h,e.jwtSecret);if(!E?.sub||!E.email)return;let O=r.getUser(String(E.sub));if(!O){let T=typeof E.team_id=="string"&&E.team_id?E.team_id:void 0;O={id:String(E.sub),email:String(E.email),displayName:typeof E.name=="string"&&E.name?E.name:String(E.email),teamId:T??(e.teamConfigured?e.team.id:void 0)}}if(E.exp){let T=Math.min(E.exp*1e3,Date.now()+o);if(c.size>=a){let L=Date.now();for(let[A,P]of c)P.exp<L&&c.delete(A);c.size>=a&&c.clear()}c.set(w,{user:O,exp:T})}return O}let f=m=>{let h=(m.headers["x-auth-request-email"]||"").trim().toLowerCase();if(h)return e.devMode||!e.proxySecret&&e.trustProxyHeadersUnverified||(0,pp.hasTrustedProxyProof)(m.headers,e.proxySecret)?h:null},p=(m,h,w)=>{i("proxy_header.unverified",{ip:h,path:w}),be(m,401,{error:"unauthorized",error_description:`X-Auth-Request-Email was present without a valid ${Aa.AUTH_PROXY_SECRET_HEADER} header. Only the trusted reverse proxy may assert an identity to this broker.`})},g=kM.createServer(async(m,h)=>{try{let w=m.headers.host||`127.0.0.1:${e.port}`,_=new Ta.URL(m.url||"/",`http://${w}`),E=_.pathname,O=(0,pp.clientIp)(m),T=()=>s.tryConsume(O)?!1:(i("rate_limited",{ip:O,path:E}),h.writeHead(429,{"Content-Type":"application/json","Retry-After":String(s.retryAfterSeconds(O))}),h.end(JSON.stringify({error:"rate_limited"})),!0);if(m.method==="GET"&&(E==="/health"||E==="/api/ide/health")){be(h,200,{status:"ok",service:"auth-broker"});return}if(m.method==="GET"&&E==="/oauth/authorize"){if(T())return;let A=_.searchParams.get("client_id")||"",P=_.searchParams.get("redirect_uri")||"",b=_.searchParams.get("code_challenge")||"",N=_.searchParams.get("state")||"",I=_.searchParams.get("login_hint")||_.searchParams.get("email")||"";if(A!==Hl.AUTH_CLIENT_ID||!P||!b){i("authorize.invalid_request",{client_id:A}),be(h,400,{error:"invalid_request"});return}if(!Fw(P)){i("authorize.invalid_redirect_uri",{client_id:A}),be(h,400,{error:"invalid_request",error_description:"redirect_uri not allowed"});return}if(e.devMode&&I){let X=r.upsertUser(I),te=r.createAuthCode({userId:X.id,clientId:A,redirectUri:P,codeChallenge:b});i("authorize.dev",{user:X.email});let Ie=new Ta.URL(P);Ie.searchParams.set("code",te),N&&Ie.searchParams.set("state",N),h.writeHead(302,{Location:Ie.toString()}),h.end();return}let v=f(m);if(v===null){p(h,O,E);return}if(!v){be(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let F=r.upsertUser(v),B=r.createAuthCode({userId:F.id,clientId:A,redirectUri:P,codeChallenge:b});i("authorize.signin",{user:F.email});let re=new Ta.URL(P);re.searchParams.set("code",B),N&&re.searchParams.set("state",N),h.writeHead(302,{Location:re.toString()}),h.end();return}if(m.method==="GET"&&E==="/oauth/browser-login"){if(T())return;let A=f(m);if(A===null){p(h,O,E);return}if(!A){be(h,401,{error:"unauthorized",error_description:"No authenticated user (missing X-Auth-Request-Email)"});return}let P=r.upsertUser(A),b=r.issueTokens(P,Hl.AUTH_CLIENT_ID,"openid profile email agenthippo:ide");i("browser.login",{user:P.email});let N=e.publicBaseUrl.startsWith("https"),I=[`${e.cookieName}=${b.accessToken}`,"Path=/","HttpOnly","SameSite=Lax",...N?["Secure"]:[],...e.cookieDomain?[`Domain=${e.cookieDomain}`]:[],`Max-Age=${b.expiresIn}`],v=xM(_.searchParams.get("return_to")||"",e.cookieDomain,e.publicBaseUrl||"/");h.writeHead(302,{"Set-Cookie":I.join("; "),Location:v}),h.end();return}if(m.method==="POST"&&E==="/oauth/dev/login"){if(T())return;if(!e.devMode){be(h,404,{error:"not_found"});return}let A=await gp(m),P=A.trim().startsWith("{")?JSON.parse(A):hp(A),b=P.email?.trim(),N=P.code_challenge?.trim(),I=P.redirect_uri?.trim(),v=P.client_id?.trim()||Hl.AUTH_CLIENT_ID;if(!b||!N||!I){be(h,400,{error:"invalid_request"});return}let F=r.upsertUser(b),B=r.createAuthCode({userId:F.id,clientId:v,redirectUri:I,codeChallenge:N});i("dev.login",{user:F.email}),be(h,200,{code:B});return}if(m.method==="POST"&&E==="/oauth/token"){if(T())return;let A=await gp(m),P=hp(A),b=P.grant_type,N=P.client_id||Hl.AUTH_CLIENT_ID,I=P.scope||"openid profile email agenthippo:ide";if(b==="authorization_code"){let v=P.code,F=P.code_verifier,B=P.redirect_uri;if(!v||!F||!B){be(h,400,{error:"invalid_request"});return}let re=r.consumeAuthCode(v);if(!re||re.clientId!==N||re.redirectUri!==B){be(h,400,{error:"invalid_grant"});return}if(!(0,MM.verifyPkceChallenge)(F,re.codeChallenge)){be(h,400,{error:"invalid_grant",error_description:"PKCE verification failed"});return}let X=r.getUser(re.userId);if(!X){be(h,400,{error:"invalid_grant"});return}let te=r.issueTokens(X,N,I);i("token.signin",{user:X.email,client_id:N}),be(h,200,{access_token:te.accessToken,refresh_token:te.refreshToken,token_type:"Bearer",expires_in:te.expiresIn,scope:I});return}if(b==="refresh_token"){let v=P.refresh_token;if(!v){be(h,400,{error:"invalid_request"});return}let F=r.consumeRefreshToken(v);if(!F||F.clientId!==N){i("token.refresh.invalid_grant"),be(h,400,{error:"invalid_grant"});return}let B=r.getUser(F.userId);if(!B){be(h,400,{error:"invalid_grant"});return}let re=r.issueTokens(B,N,I);i("token.refresh",{user:B.email}),be(h,200,{access_token:re.accessToken,refresh_token:re.refreshToken,token_type:"Bearer",expires_in:re.expiresIn,scope:I});return}be(h,400,{error:"unsupported_grant_type"});return}if(m.method==="POST"&&E==="/oauth/introspect"){if(!u(m)){i("introspect.unauthorized"),be(h,401,{error:"unauthorized"});return}let A=await gp(m),b=hp(A).token;if(!b){be(h,400,{error:"invalid_request"});return}let N=(0,Ul.verifyJwt)(b,e.jwtSecret);if(!N?.sub){be(h,200,{active:!1});return}be(h,200,{active:!0,sub:N.sub,email:N.email,team_id:N.team_id,scope:N.scope,exp:N.exp});return}let L=u(m);if(m.method==="GET"&&E==="/api/ide/me"){if(!L){let P=Date.now();P-d>l&&(d=P,i("me.unauthorized")),be(h,401,{error:"unauthorized"});return}h.setHeader("X-Agent-User",L.email||L.id);let A=(0,Ul.extractBearerToken)(m.headers.authorization)||Bw(m.headers.cookie,e.cookieName);A&&h.setHeader("X-Agent-User-Assertion",A),be(h,200,r.buildMe(L));return}if(m.method==="GET"&&E==="/api/ide/bootstrap"){if(!L){be(h,401,{error:"unauthorized"});return}be(h,200,r.buildBootstrap(L));return}if(m.method==="POST"&&E==="/api/ide/signout"){L&&(r.revokeRefreshTokensForUser(L.id),i("signout",{user:L.email})),be(h,200,{ok:!0});return}be(h,404,{error:"not_found"})}catch(w){let _=w.status;if(_===413){be(h,413,{error:"request_entity_too_large"});return}if(_===403){i("forbidden",{reason:"email_domain"}),be(h,403,{error:"forbidden",error_description:"email domain not allowed"});return}console.error("[auth-broker] internal error",w),be(h,500,{error:"server_error"})}});return{server:g,baseUrl:e.publicBaseUrl,store:r,config:e,close:()=>new Promise((m,h)=>{g.close(w=>w?h(w):m())})}}async function BM(t){let e=Vw(t),n=(0,Aa.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 Kw=S(Ep=>{"use strict";Object.defineProperty(Ep,"__esModule",{value:!0});Ep.authBrokerCommand=WM;var FM=ra(),VM=Ww();async function WM(){let t=(0,FM.loadAuthBrokerConfig)(),e=await(0,VM.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 yp=S(Lr=>{"use strict";Object.defineProperty(Lr,"__esModule",{value:!0});Lr.EDGE_AGENT_PORT=void 0;Lr.renderIdentityLayer=_p;Lr.renderSidecarEdgeCaddyfile=KM;Lr.renderSidecarFedCaddyfile=qM;var qw=[" # 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 _p(t){let{mode:e,authBrokerAddr:n,healthProxy:r,agentProxy:s}=t,i=t.oauth2ProxyAddr??"",o=t.catchallBody??s,a=t.turnRegistration,c=a?[" # Turn registration \u2014 after identity: X-Agent-User (set above) names the user the"," # sidecar mints the nonce for. Only POST chat turns match; others pass through."," # X-Agent-User-Assertion (also set above) rides along as the turn's inboundToken:"," # without it `passthrough` fails closed on every call and an RFC 8693 `exchange`"," # provider has no subject_token.",` forward_auth @turnStart ${a.connectorAddr} {`," uri /edge/turn"," copy_headers X-Agent-Turn-Nonce",` header_up Authorization "Bearer {$${a.tokenEnvVar}}"`," }"]:[],l=f=>f.map(p=>p.trim()?` ${p}`:p),d=(f,p)=>a?[" route {",...l(f),...c,...l(p)," }"]:[...f,...p],u=[];if(u.push(" # Hygiene: never let a client-supplied nonce or assertion header through. The trusted"," # values are set from the verified /api/ide/me response below, never from the client \u2014"," # a forged assertion would ride as the turn's inboundToken."," request_header -X-Agent-Turn-Nonce"," request_header -X-Agent-User-Assertion"),e==="self-issued"&&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=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...qw," }"," }"," # Federated SSO (A\u2032): browsers from other subdomains land here to stamp the shared cookie."," # Same oauth2-proxy gate as authorize; must precede the generic /oauth/* handle."," handle /oauth/browser-login {",` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }",` reverse_proxy ${n} {`," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}",...qw," }"," }"," # 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 {",...d([` 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 {",...d([` forward_auth ${i} {`," uri /oauth2/auth"," copy_headers X-Auth-Request-Email>X-Agent-User"," header_up X-Forwarded-Proto https"," header_up X-Forwarded-Host {http.request.host}"," @unauth status 401"," handle_response @unauth {",' redir * "/oauth2/sign_in?rd=https://{http.request.host}{http.request.uri_escaped}"'," }"," }"],o)," }");else{let f=t.idpUrl?.trim()||"",p=f?` redir * "${f}/oauth/browser-login?return_to=https://{http.request.host}{http.request.uri_escaped}" 302`:' respond "Unauthorized" 401';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 {",...d([` 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}Lr.EDGE_AGENT_PORT=8090;function KM(){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} {",..._p({mode:"self-issued",oauth2ProxyAddr:"localhost:4180",authBrokerAddr:"localhost:9780",healthProxy:[` reverse_proxy localhost:${Lr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${Lr.EDGE_AGENT_PORT}`]}),"}",""].join(`
555
574
  `)}function qM(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} {",..._p({mode:"federated",authBrokerAddr:"localhost:9780",idpUrl:e,healthProxy:[` reverse_proxy localhost:${Lr.EDGE_AGENT_PORT}`],agentProxy:[` reverse_proxy localhost:${Lr.EDGE_AGENT_PORT}`]}),"}",""].join(`
556
- `)}});var vp=S(z=>{"use strict";var YM=z&&z.__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]})),JM=z&&z.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yw=z&&z.__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"&&YM(n,e,r[s]);return JM(n,e),n}})();Object.defineProperty(z,"__esModule",{value:!0});z.DEPLOY_PUBLIC_HOSTNAME=z.DEFAULT_DEPLOY_PUBLIC_HOSTNAME=z.AGENTHIPPO_HIPPOCLAW_NPM=z.AGENTHIPPO_LITELLM_IMAGE_TAG=z.AGENTHIPPO_RUNTIME_IMAGE_TAG=z.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK=z.AGENTHIPPO_CLI_NPM_PACKAGE=z.AGENTHIPPO_IMAGE_REGISTRY=z.DEPLOY_TARGETS=void 0;z.isDeployTarget=XM;z.resolveCliReleaseVersion=wp;z.resolveAgentHippoCliNpmVersion=zw;z.agenthippoImage=Ns;z.defaultRuntimeImage=zM;z.packAttributionBody=Qw;z.packAttributionComment=Sp;z.withPackAttribution=Zw;z.serveCmdArgs=Mi;z.resolveDeployPublicHostname=Ap;z.scanEnvRefs=eG;z.renderEnvExample=eS;z.renderAuthEnvExample=tS;z.renderAuthBrokerDockerfile=Tp;z.renderChannelsDockerfile=nS;z.isSecretLikeBasename=tG;z.dataPlaneTokenEnvVar=lS;z.renderTarget=bG;var vo=Yw(require("fs")),Oo=Yw(require("path")),jl=Ir(),mt=yp();z.DEPLOY_TARGETS=["vm","compose","cloudrun","databricks-app","spcs","cloudflare","aws-ecs","azure-container-apps"];function XM(t){return z.DEPLOY_TARGETS.includes(t)}z.AGENTHIPPO_IMAGE_REGISTRY="ghcr.io/agenthippoai";z.AGENTHIPPO_CLI_NPM_PACKAGE="@agenthippo-ai/agenthippo";z.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK="latest";function Jw(){try{return Wc()}catch{try{let t=Oo.join(__dirname,"..","..","package.json");if(vo.existsSync(t))return JSON.parse(vo.readFileSync(t,"utf8"))}catch{}return}}function Xw(t){let e=Jw()?.agenthippo?.[t]?.trim();if(!e)throw new Error(`extensions/agentide/package.json agenthippo.${t} is missing`);return e}function wp(){let t=Jw()?.version?.trim();if(t&&t!=="0.0.0"&&t!=="dev")return t;try{let e=Oo.join(__dirname,"..","..","..","..","package.json");if(vo.existsSync(e)){let n=JSON.parse(vo.readFileSync(e,"utf8")).version?.trim();if(n&&n!=="0.0.0"&&n!=="dev")return n}}catch{}}function zw(){return wp()??z.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK}z.AGENTHIPPO_RUNTIME_IMAGE_TAG=wp()??"dev";z.AGENTHIPPO_LITELLM_IMAGE_TAG=Xw("litellmImageTag");z.AGENTHIPPO_HIPPOCLAW_NPM=Xw("hippoclawNpm");function Ns(t,e){let n=t==="runtime"?z.AGENTHIPPO_RUNTIME_IMAGE_TAG:z.AGENTHIPPO_LITELLM_IMAGE_TAG;return`${z.AGENTHIPPO_IMAGE_REGISTRY}/${t}:${n}${e?`-${e}`:""}`}function zM(t){return t.trim().toLowerCase()==="cursor"?Ns("runtime","cursor"):Ns("runtime")}function Qw(t){return`Generated from Agent Pack ${t.packName}@${t.packVersion} \u2014 packs.agenthippo.ai`}function Sp(t,e="hash"){let n=Qw(t);return e==="html"?`<!-- ${n} -->`:e==="sql"?`-- ${n}`:`# ${n}`}function Zw(t,e,n){if(n.slice(0,400).includes("packs.agenthippo.ai"))return n;let s=Oo.basename(e),i=Oo.extname(s).toLowerCase();if(i===".json"||i===".jsonc"||s==="wrangler.toml"||s==="package.json")return n;let a=Sp(t,i===".html"||i===".md"?"html":i===".sql"?"sql":"hash");if(n.startsWith("#!")){let c=n.indexOf(`
575
+ `)}});var vp=S(z=>{"use strict";var YM=z&&z.__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]})),JM=z&&z.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yw=z&&z.__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"&&YM(n,e,r[s]);return JM(n,e),n}})();Object.defineProperty(z,"__esModule",{value:!0});z.DEPLOY_PUBLIC_HOSTNAME=z.DEFAULT_DEPLOY_PUBLIC_HOSTNAME=z.AGENTHIPPO_HIPPOCLAW_NPM=z.AGENTHIPPO_LITELLM_IMAGE_TAG=z.AGENTHIPPO_RUNTIME_IMAGE_TAG=z.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK=z.AGENTHIPPO_CLI_NPM_PACKAGE=z.AGENTHIPPO_IMAGE_REGISTRY=z.DEPLOY_TARGETS=void 0;z.isDeployTarget=XM;z.resolveCliReleaseVersion=wp;z.resolveAgentHippoCliNpmVersion=zw;z.agenthippoImage=Ns;z.defaultRuntimeImage=zM;z.packAttributionBody=Qw;z.packAttributionComment=Sp;z.withPackAttribution=Zw;z.serveCmdArgs=Mi;z.resolveDeployPublicHostname=Ap;z.scanEnvRefs=eG;z.renderEnvExample=eS;z.renderAuthEnvExample=tS;z.renderAuthBrokerDockerfile=Tp;z.renderChannelsDockerfile=nS;z.isSecretLikeBasename=tG;z.dataPlaneTokenEnvVar=lS;z.renderTarget=bG;var vo=Yw(require("fs")),Oo=Yw(require("path")),jl=Pr(),mt=yp();z.DEPLOY_TARGETS=["vm","compose","cloudrun","databricks-app","spcs","cloudflare","aws-ecs","azure-container-apps"];function XM(t){return z.DEPLOY_TARGETS.includes(t)}z.AGENTHIPPO_IMAGE_REGISTRY="ghcr.io/agenthippoai";z.AGENTHIPPO_CLI_NPM_PACKAGE="@agenthippo-ai/agenthippo";z.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK="latest";function Jw(){try{return Wc()}catch{try{let t=Oo.join(__dirname,"..","..","package.json");if(vo.existsSync(t))return JSON.parse(vo.readFileSync(t,"utf8"))}catch{}return}}function Xw(t){let e=Jw()?.agenthippo?.[t]?.trim();if(!e)throw new Error(`extensions/agentide/package.json agenthippo.${t} is missing`);return e}function wp(){let t=Jw()?.version?.trim();if(t&&t!=="0.0.0"&&t!=="dev")return t;try{let e=Oo.join(__dirname,"..","..","..","..","package.json");if(vo.existsSync(e)){let n=JSON.parse(vo.readFileSync(e,"utf8")).version?.trim();if(n&&n!=="0.0.0"&&n!=="dev")return n}}catch{}}function zw(){return wp()??z.AGENTHIPPO_CLI_NPM_VERSION_FALLBACK}z.AGENTHIPPO_RUNTIME_IMAGE_TAG=wp()??"dev";z.AGENTHIPPO_LITELLM_IMAGE_TAG=Xw("litellmImageTag");z.AGENTHIPPO_HIPPOCLAW_NPM=Xw("hippoclawNpm");function Ns(t,e){let n=t==="runtime"?z.AGENTHIPPO_RUNTIME_IMAGE_TAG:z.AGENTHIPPO_LITELLM_IMAGE_TAG;return`${z.AGENTHIPPO_IMAGE_REGISTRY}/${t}:${n}${e?`-${e}`:""}`}function zM(t){return t.trim().toLowerCase()==="cursor"?Ns("runtime","cursor"):Ns("runtime")}function Qw(t){return`Generated from Agent Pack ${t.packName}@${t.packVersion} \u2014 packs.agenthippo.ai`}function Sp(t,e="hash"){let n=Qw(t);return e==="html"?`<!-- ${n} -->`:e==="sql"?`-- ${n}`:`# ${n}`}function Zw(t,e,n){if(n.slice(0,400).includes("packs.agenthippo.ai"))return n;let s=Oo.basename(e),i=Oo.extname(s).toLowerCase();if(i===".json"||i===".jsonc"||s==="wrangler.toml"||s==="package.json")return n;let a=Sp(t,i===".html"||i===".md"?"html":i===".sql"?"sql":"hash");if(n.startsWith("#!")){let c=n.indexOf(`
557
576
  `);return c===-1?`${n}
558
577
  ${a}
559
578
  `:`${n.slice(0,c+1)}${a}
@@ -586,14 +605,14 @@ ${n}`}function Mi(t,e){let n=["serve","--agent","/app/pack","--workspace","/stat
586
605
  `)}}function Gi(t){let e=(t||"").toLowerCase();return e==="ah-auto"?"AGENTHIPPO_GATEWAY_KEY":e.includes("codex")?"OPENAI_CODEX_API_KEY":e.includes("gpt")||e.includes("openai")?"OPENAI_API_KEY":e.includes("claude")||e.includes("anthropic")?"ANTHROPIC_API_KEY":"OPENAI_API_KEY"}function va(t){return(t||"").trim().toLowerCase()==="ah-auto"}var dS="https://gateway.agenthippo.ai/v1";function bp(t){return t.modelRouting==="gateway"}function fS(t){if(t.engine.trim().toLowerCase()==="cursor")return"api2.cursor.sh";if(va(t.model))return"gateway.agenthippo.ai";let e=(t.model||"").toLowerCase();return e.includes("codex")||e.includes("gpt")||e.includes("openai")?"api.openai.com":"api.anthropic.com"}function cr(t){let e=bp(t)?".":" \u2014 and, if the LiteLLM gateway/Spotlight sidecar is enabled, its own outbound is the same host.";return[`**Egress:** this container only needs outbound access to \`${fS(t)}:443\` (your model provider)${e}`,"Restrict egress to this allowlist if your org requires it.",""]}function oG(t,e,n,r,s){let i=[`\`${Gi(t.model)}\` (or the pack's configured provider key) \u2014 your model provider credential`],o=["**agent container** \u2014 can reach your model provider and read/write its own state volume. Never holds the JWT signing secret or any OAuth client secret (`.env` vs `.env.auth` split)."];return n?(i.push("`AGENTHIPPO_AUTH_JWT_SECRET` \u2014 signs/verifies IDE bootstrap tokens (auth-broker only, never the agent)"),o.push("**auth-broker** \u2014 holds the JWT signing secret"+(r?" (shared with the central IdP)":"")+"; mints/verifies IDE tokens. Does not hold model provider credentials."),r||(i.push("`OAUTH2_PROXY_CLIENT_SECRET` + `OAUTH2_PROXY_COOKIE_SECRET` \u2014 this deployment's own Google OAuth client (oauth2-proxy only, never the agent)"),o.push("**oauth2-proxy** \u2014 holds this deployment's Google OAuth client secret; terminates the Google login flow. Does not hold the JWT signing secret or model credentials."))):s&&o.push("**this deployment holds no auth secrets at all** \u2014 identity is verified entirely by the org IdP's own auth-broker (see `agent-route.caddy`); nothing here signs or stores a JWT secret."),[`# Data & access summary \u2014 ${t.packName} (${e}${t.ingress?` / ${t.ingress}`:""})`,"","Generated by `agenthippo deploy init` \u2014 answers the questions a security review asks first.","","## Secrets",...i.map(a=>`- ${a}`),"","## Egress",`- Outbound network access is needed only to \`${fS(t)}:443\` (your model provider).`,...n&&r?["- API/Bearer requests are verified locally against the shared JWT secret \u2014 no network call to the central IdP per request. The one-time browser login flow (unauthenticated visitors) does redirect to the central IdP's public URL to sign in."]:[],...n&&!r?["- Google SSO calls `accounts.google.com` during login only (oauth2-proxy); no other third party is contacted per request."]:[],...s?["- Identity is verified via the org IdP's own auth-broker over the shared private docker network (`agenthippo-idp-colocate`), not a public network call. The one-time browser login flow (unauthenticated visitors) still redirects to the central IdP's public URL to sign in."]:[],"","## Blast radius per component",...o.map(a=>`- ${a}`),""].join(`
587
606
  `)}function aG(t){let e=Gi(t.model);return["# Cloud Run multi-container: agent (ingress) + LiteLLM + Spotlight OTEL collector.","# Generated by `agenthippo deploy init`. Deploy with `bash deploy/cloudrun-deploy.sh`","# (it substitutes ${...} and runs `gcloud run services replace`). Traces land in the GCS","# /state volume at /state/analytics/traces \u2014 query with query-analytics.sh (DuckDB).","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:"," # Sidecars need CPU between requests (the collector flushes async); no scale-to-zero throttle.",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"'," # Start order: collector \u2192 litellm \u2192 agent, so traces are never dropped on cold start.",` run.googleapis.com/container-dependencies: '{"litellm":["otel-collector"],"agent":["litellm"]}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," # Ingress container \u2014 the ONLY one with a port. Routes the engine through LiteLLM."," - name: agent"," image: ${IMAGE}"," ports:"," - name: http1",` containerPort: ${t.port}`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',' - { name: AGENTHIPPO_IDENTITY_HEADER, value: "${IDENTITY_HEADER_VALUE}" }',xl()," - { name: AGENTHIPPO_LITELLM_BASE_URL, value: http://localhost:4443 }"," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }"," volumeMounts:"," - { name: state, mountPath: /state }"," # LiteLLM gateway sidecar \u2014 exports every call to the collector (Spotlight cost/latency/tokens)."," - name: litellm"," image: ${LITELLM_IMAGE}"," env:"," - { name: OTEL_EXPORTER, value: otlp_http }"," - { name: OTEL_EXPORTER_OTLP_ENDPOINT, value: http://localhost:4318 }"," - name: LITELLM_MASTER_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }",` # Upstream provider key for ${t.model||"this model"} (matches the gateway's os.environ/${e} ref).`," # Other models need their own key var \u2014 rename to match your model map.",` - name: ${e}`," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"," # Spotlight OTEL collector sidecar \u2014 writes JSONL traces into the shared /state volume."," - name: otel-collector"," image: otel/opentelemetry-collector-contrib:0.118.0",' args: ["--config=/etc/otel/config.yaml"]'," env:"," - { name: AGENT_HOME_DIR, value: /state }"," volumeMounts:"," - { name: otel-config, mountPath: /etc/otel, readOnly: true }"," - { name: state, mountPath: /state }"," volumes:"," - name: state"," csi:"," driver: gcsfuse.run.googleapis.com"," volumeAttributes:"," bucketName: ${STATE_BUCKET}"," - name: otel-config"," secret:"," secretName: ${SERVICE}-otel-config"," items:"," - { key: latest, path: config.yaml }",""].join(`
588
607
  `)}function Qr(){return["# Anchor to the staging root (parent of deploy/) \u2014 this script runs from any cwd.",'cd "$(dirname "$0")/.."']}function pS(){return["# Ingress: corp SSO via IAP (forwards X-Goog-Authenticated-User-Email \u2192 user_id).","# --iap is beta-track only on `gcloud run`; public access on an existing service is","# controlled via the run.invoker IAM binding (no --no-allow-unauthenticated on","# `services update`). So: enable IAP on the beta track, strip any allUsers invoker","# binding (keeps the service private), and grant IAP-secured Web User to each","# principal in IAP_MEMBERS (space-separated, e.g.","# IAP_MEMBERS='user:you@corp.com serviceAccount:sa@project.iam.gserviceaccount.com'","# ). Omit IAP_MEMBERS to rely on bindings you manage out-of-band.",'if [[ "${ENABLE_IAP:-1}" == "1" ]]; then',' gcloud beta run services update "$SERVICE" --region "$REGION" --iap',' gcloud run services remove-iam-policy-binding "$SERVICE" --region "$REGION" \\'," --member=allUsers --role=roles/run.invoker >/dev/null 2>&1 || true"," for m in ${IAP_MEMBERS:-}; do"," gcloud beta iap web add-iam-policy-binding \\",' --resource-type=cloud-run --service="$SERVICE" --region="$REGION" \\',' --member="$m" --role=roles/iap.httpsResourceAccessor'," done","fi"]}function cG(t){return["#!/usr/bin/env bash",`# Cloud Run + Spotlight: agent + LiteLLM + OTEL collector sidecars (engine: ${t.engine}${t.model?`, model ${t.model}`:""}).`,"# Traces persist in the GCS /state bucket; query with query-analytics.sh (DuckDB).","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:-${Ns("agenthippo-litellm")}}"`,'STATE_BUCKET="${STATE_BUCKET:?set STATE_BUCKET=your-gcs-bucket (gcloud storage buckets create gs://...)}"',"# LITELLM_KEY = the proxy key the agent presents to LiteLLM (and LiteLLM master key).",'LITELLM_KEY="${LITELLM_KEY:?set LITELLM_KEY=<litellm proxy key>}"',`# PROVIDER_KEY = upstream key the gateway uses for ${t.model||"your model"} (gateway reads ${Gi(t.model)}).`,'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',"","# 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: Spotlight collector config + the LiteLLM proxy key.",'ensure_secret() { gcloud secrets describe "$1" >/dev/null 2>&1 || gcloud secrets create "$1" --replication-policy=automatic; }','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=-','ensure_secret "${SERVICE}-provider-key"; printf %s "$PROVIDER_KEY" | gcloud secrets versions add "${SERVICE}-provider-key" --data-file=-',"","# IAP (finalized below) forwards X-Goog-Authenticated-User-Email; pin serve to trust ONLY","# that header so an authenticated caller cannot impersonate another user via a spoofed","# X-Agent-User header. Skipped when ENABLE_IAP=0 (first-deploy bootstrap) since IAP never","# sets the header then.",'IDENTITY_HEADER_VALUE=""','[[ "${ENABLE_IAP:-1}" == "1" ]] && IDENTITY_HEADER_VALUE="x-goog-authenticated-user-email" || true',"","# Render the multi-container template for this project (sed \u2014 no gettext dependency) and deploy.",'RENDERED="$(mktemp)"','sed -e "s|\\${SERVICE}|${SERVICE}|g" -e "s|\\${IMAGE}|${IMAGE}|g" \\',' -e "s|\\${LITELLM_IMAGE}|${LITELLM_IMAGE}|g" -e "s|\\${STATE_BUCKET}|${STATE_BUCKET}|g" \\',' -e "s|\\${IDENTITY_HEADER_VALUE}|${IDENTITY_HEADER_VALUE}|g" \\',' deploy/service.yaml > "$RENDERED"','gcloud run services replace "$RENDERED" --region "$REGION"',"",...pS(),"","# 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 "${SERVICE}-otel-config" "${SERVICE}-litellm-key"; do gcloud secrets add-iam-policy-binding "$s" --member="serviceAccount:$SA" --role=roles/secretmanager.secretAccessor; done',""].join(`
589
- `)}function lG(t){let e=t.engine.trim().toLowerCase()==="cursor",n=Gi(t.model),r=Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}).map(o=>`"${o.replace(/"/g,'\\"')}"`).join(", "),i=["# Cloud Run + AgentHippo edge (Option B): Caddy (ingress) + oauth2-proxy + auth-broker","# + agent (+ LiteLLM + OTEL collector for Spotlight). No IAP \u2014 Caddy gates via SSO,","# so the IDE hits the public hostname directly with its AgentHippo Bearer token.","# Generated by `agenthippo deploy init --target cloudrun --ingress edge`.","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"',` run.googleapis.com/container-dependencies: '${e?'{"caddy":["agent","oauth2-proxy","auth-broker"]}':'{"caddy":["agent","oauth2-proxy","auth-broker"],"agent":["litellm"],"litellm":["otel-collector"]}'}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," # Ingress \u2014 the ONLY container with a port. SSO edge for browsers + IDE Bearer."," - name: caddy"," image: caddy:2.11-alpine"," ports:"," - name: http1",` containerPort: ${t.port}`," volumeMounts:"," - { name: caddy-config, mountPath: /etc/caddy, readOnly: true }"," # Auth broker \u2014 validates IDE Bearer JWTs (/api/ide/me) + IDE sign-in (/oauth/*)."," # Reuses the agent runtime image (the `agenthippo` CLI ships `auth-broker`)."," - name: auth-broker"," image: ${IMAGE}",' args: ["auth-broker"]'," env:",' - { name: AGENTHIPPO_AUTH_PORT, value: "9780" }'," - { name: AGENTHIPPO_AUTH_DATA_DIR, value: /data }"," - { name: AGENTHIPPO_AUTH_PUBLIC_URL, value: https://${PUBLIC_HOSTNAME} }"," - { name: AGENTHIPPO_AUTH_ALLOWED_DOMAINS, value: ${ALLOWED_DOMAINS} }"," - name: AGENTHIPPO_AUTH_JWT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-auth-jwt-secret, key: latest }"," # oauth2-proxy \u2014 Google SSO for browser clients (provider=google)."," - name: oauth2-proxy"," image: quay.io/oauth2-proxy/oauth2-proxy:v7.7.1"," env:"," - { name: OAUTH2_PROXY_HTTP_ADDRESS, value: 0.0.0.0:4180 }"," - { name: OAUTH2_PROXY_UPSTREAMS, value: file:///dev/null }",' - { name: OAUTH2_PROXY_SET_XAUTHREQUEST, value: "true" }',' - { name: OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER, value: "true" }',' - { name: OAUTH2_PROXY_SKIP_PROVIDER_BUTTON, value: "true" }',' - { name: OAUTH2_PROXY_REVERSE_PROXY, value: "true" }'," - { name: OAUTH2_PROXY_WHITELIST_DOMAINS, value: ${PUBLIC_HOSTNAME} }"," - { name: OAUTH2_PROXY_PROVIDER, value: google }"," - { name: OAUTH2_PROXY_EMAIL_DOMAINS, value: ${ALLOWED_DOMAINS} }"," - { name: OAUTH2_PROXY_REDIRECT_URL, value: https://${PUBLIC_HOSTNAME}/oauth2/callback }"," - name: OAUTH2_PROXY_CLIENT_ID"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-oauth-client-id, key: latest }"," - name: OAUTH2_PROXY_CLIENT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-oauth-client-secret, key: latest }"," - name: OAUTH2_PROXY_COOKIE_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-oauth-cookie-secret, key: latest }"," # Agent \u2014 serves www + /v1/* on localhost (NOT ingress). Routed through LiteLLM."," - name: agent"," image: ${IMAGE}",` args: [${r}]`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',xl(),...e?[" - { name: AGENTHIPPO_CUSTOM_ENGINES_DIR, value: /engines }"," - name: CURSOR_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"]:[" - { name: AGENTHIPPO_LITELLM_BASE_URL, value: http://localhost:4443 }"," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }"]," volumeMounts:"," - { name: state, mountPath: /state }",...Ps(mt.EDGE_AGENT_PORT,!0),...Mr("2000m","2Gi")];return e||i.push(" # LiteLLM gateway sidecar \u2014 exports every call to the collector (Spotlight)."," - name: litellm"," image: ${LITELLM_IMAGE}"," env:"," - { name: OTEL_EXPORTER, value: otlp_http }"," - { name: OTEL_EXPORTER_OTLP_ENDPOINT, value: http://localhost:4318 }"," - name: LITELLM_MASTER_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }",` # Upstream provider key for ${t.model||"this model"} (matches the gateway's os.environ/${n} ref).`,` - name: ${n}`," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }",...Ps(4443),...Mr("1000m","1Gi")," # Spotlight OTEL collector sidecar \u2014 writes JSONL traces into the shared /state volume."," - name: otel-collector"," image: otel/opentelemetry-collector-contrib:0.118.0",' args: ["--config=/etc/otel/config.yaml"]'," env:"," - { name: AGENT_HOME_DIR, value: /state }"," volumeMounts:"," - { name: otel-config, mountPath: /etc/otel, readOnly: true }"," - { name: state, mountPath: /state }",...Ps(4318),...Mr("1000m","512Mi")),i.push(" volumes:"," - name: state"," csi:"," driver: gcsfuse.run.googleapis.com"," volumeAttributes:"," bucketName: ${STATE_BUCKET}"," - name: caddy-config"," secret:"," secretName: ${SERVICE}-caddyfile"," items:"," - { key: latest, path: Caddyfile }"),e||i.push(" - name: otel-config"," secret:"," secretName: ${SERVICE}-otel-config"," items:"," - { key: latest, path: config.yaml }"),i.push(""),i.join(`
608
+ `)}function lG(t){let e=t.engine.trim().toLowerCase()==="cursor",n=Gi(t.model),r=Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}).map(o=>`"${o.replace(/"/g,'\\"')}"`).join(", "),i=["# Cloud Run + AgentHippo edge (Option B): Caddy (ingress) + oauth2-proxy + auth-broker","# + agent (+ LiteLLM + OTEL collector for Spotlight). No IAP \u2014 Caddy gates via SSO,","# so the IDE hits the public hostname directly with its AgentHippo Bearer token.","# Generated by `agenthippo deploy init --target cloudrun --ingress edge`.","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"',` run.googleapis.com/container-dependencies: '${e?'{"caddy":["agent","oauth2-proxy","auth-broker"]}':'{"caddy":["agent","oauth2-proxy","auth-broker"],"agent":["litellm"],"litellm":["otel-collector"]}'}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," # Ingress \u2014 the ONLY container with a port. SSO edge for browsers + IDE Bearer."," - name: caddy"," image: caddy:2.11-alpine"," ports:"," - name: http1",` containerPort: ${t.port}`," volumeMounts:"," - { name: caddy-config, mountPath: /etc/caddy, readOnly: true }"," # Auth broker \u2014 validates IDE Bearer JWTs (/api/ide/me) + IDE sign-in (/oauth/*)."," # Reuses the agent runtime image (the `agenthippo` CLI ships `auth-broker`)."," - name: auth-broker"," image: ${IMAGE}",' args: ["auth-broker"]'," env:",' - { name: AGENTHIPPO_AUTH_PORT, value: "9780" }'," - { name: AGENTHIPPO_AUTH_DATA_DIR, value: /data }"," - { name: AGENTHIPPO_AUTH_PUBLIC_URL, value: https://${PUBLIC_HOSTNAME} }"," - { name: AGENTHIPPO_AUTH_ALLOWED_DOMAINS, value: ${ALLOWED_DOMAINS} }"," - name: AGENTHIPPO_AUTH_JWT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-auth-jwt-secret, key: latest }"," # oauth2-proxy \u2014 Google SSO for browser clients (provider=google)."," - name: oauth2-proxy"," image: quay.io/oauth2-proxy/oauth2-proxy:v7.7.1"," env:"," - { name: OAUTH2_PROXY_HTTP_ADDRESS, value: 0.0.0.0:4180 }"," - { name: OAUTH2_PROXY_UPSTREAMS, value: file:///dev/null }",' - { name: OAUTH2_PROXY_SET_XAUTHREQUEST, value: "true" }',' - { name: OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER, value: "true" }',' - { name: OAUTH2_PROXY_SKIP_PROVIDER_BUTTON, value: "true" }',' - { name: OAUTH2_PROXY_REVERSE_PROXY, value: "true" }'," - { name: OAUTH2_PROXY_WHITELIST_DOMAINS, value: ${PUBLIC_HOSTNAME} }"," - { name: OAUTH2_PROXY_PROVIDER, value: google }"," - { name: OAUTH2_PROXY_EMAIL_DOMAINS, value: ${ALLOWED_DOMAINS} }"," - { name: OAUTH2_PROXY_REDIRECT_URL, value: https://${PUBLIC_HOSTNAME}/oauth2/callback }"," - name: OAUTH2_PROXY_CLIENT_ID"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-oauth-client-id, key: latest }"," - name: OAUTH2_PROXY_CLIENT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-oauth-client-secret, key: latest }"," - name: OAUTH2_PROXY_COOKIE_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-oauth-cookie-secret, key: latest }"," # Agent \u2014 serves www + /v1/* on localhost (NOT ingress). Routed through LiteLLM."," - name: agent"," image: ${IMAGE}",` args: [${r}]`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',xl(),...e?[" - { name: AGENTHIPPO_CUSTOM_ENGINES_DIR, value: /engines }"," - name: CURSOR_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"]:[" - { name: AGENTHIPPO_LITELLM_BASE_URL, value: http://localhost:4443 }"," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }"]," volumeMounts:"," - { name: state, mountPath: /state }",...Is(mt.EDGE_AGENT_PORT,!0),...Mr("2000m","2Gi")];return e||i.push(" # LiteLLM gateway sidecar \u2014 exports every call to the collector (Spotlight)."," - name: litellm"," image: ${LITELLM_IMAGE}"," env:"," - { name: OTEL_EXPORTER, value: otlp_http }"," - { name: OTEL_EXPORTER_OTLP_ENDPOINT, value: http://localhost:4318 }"," - name: LITELLM_MASTER_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }",` # Upstream provider key for ${t.model||"this model"} (matches the gateway's os.environ/${n} ref).`,` - name: ${n}`," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }",...Is(4443),...Mr("1000m","1Gi")," # Spotlight OTEL collector sidecar \u2014 writes JSONL traces into the shared /state volume."," - name: otel-collector"," image: otel/opentelemetry-collector-contrib:0.118.0",' args: ["--config=/etc/otel/config.yaml"]'," env:"," - { name: AGENT_HOME_DIR, value: /state }"," volumeMounts:"," - { name: otel-config, mountPath: /etc/otel, readOnly: true }"," - { name: state, mountPath: /state }",...Is(4318),...Mr("1000m","512Mi")),i.push(" volumes:"," - name: state"," csi:"," driver: gcsfuse.run.googleapis.com"," volumeAttributes:"," bucketName: ${STATE_BUCKET}"," - name: caddy-config"," secret:"," secretName: ${SERVICE}-caddyfile"," items:"," - { key: latest, path: Caddyfile }"),e||i.push(" - name: otel-config"," secret:"," secretName: ${SERVICE}-otel-config"," items:"," - { key: latest, path: config.yaml }"),i.push(""),i.join(`
590
609
  `)}function uG(t){let e=t.engine.trim().toLowerCase()==="cursor",n=t.model?.trim()?`, model ${t.model.trim()}`:"",r=["#!/usr/bin/env bash","# Cloud Run + AgentHippo edge (Option B): Caddy + oauth2-proxy + auth-broker front the agent.",`# Engine: ${t.engine}${n}. No IAP \u2014 Caddy gates via SSO (Google for browsers, AgentHippo JWT for IDE).`,"# 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:-${Ns("agenthippo-litellm")}}"`,"# Public hostname (custom domain mapped to the service) + the Google Workspace domain allowed by SSO.",'PUBLIC_HOSTNAME="${PUBLIC_HOSTNAME:?set PUBLIC_HOSTNAME=your.edge.hostname (gcloud run domain-mappings create --service $SERVICE --domain ...)}"','ALLOWED_DOMAINS="${ALLOWED_DOMAINS:?set ALLOWED_DOMAINS=yourworkspace.com (oauth2-proxy email domain + broker allowed domains)}"','STATE_BUCKET="${STATE_BUCKET:?set STATE_BUCKET=your-gcs-bucket (gcloud storage buckets create gs://...)}"',"# Edge secrets (from .env.auth): Google OAuth client + cookie secret + AgentHippo JWT signing key.",'OAUTH_CLIENT_ID="${OAUTH_CLIENT_ID:?set OAUTH_CLIENT_ID=<google oauth web client id>}"','OAUTH_CLIENT_SECRET="${OAUTH_CLIENT_SECRET:?set OAUTH_CLIENT_SECRET=<google oauth web client secret>}"','OAUTH_COOKIE_SECRET="${OAUTH_COOKIE_SECRET:?set OAUTH_COOKIE_SECRET=$(openssl rand -base64 32 | head -c 32)}"','AUTH_JWT_SECRET="${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET=$(openssl rand -hex 32)}"',...e?['PROVIDER_KEY="${PROVIDER_KEY:?set PROVIDER_KEY=<cursor api key>}"']:["# 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: edge config + provider/litellm keys.",'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}-oauth-client-id"; printf %s "$OAUTH_CLIENT_ID" | gcloud secrets versions add "${SERVICE}-oauth-client-id" --data-file=-','ensure_secret "${SERVICE}-oauth-client-secret"; printf %s "$OAUTH_CLIENT_SECRET" | gcloud secrets versions add "${SERVICE}-oauth-client-secret" --data-file=-','ensure_secret "${SERVICE}-oauth-cookie-secret"; printf %s "$OAUTH_COOKIE_SECRET" | gcloud secrets versions add "${SERVICE}-oauth-cookie-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 for this project (sed \u2014 no gettext dependency) and deploy.",'RENDERED="$(mktemp)"','sed -e "s|\\${SERVICE}|${SERVICE}|g" -e "s|\\${IMAGE}|${IMAGE}|g" \\',' -e "s|\\${LITELLM_IMAGE}|${LITELLM_IMAGE}|g" -e "s|\\${STATE_BUCKET}|${STATE_BUCKET}|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 itself must allow public ingress (allUsers invoker).","# Without this, Cloud Run 403s before Caddy ever sees the request to run SSO.",'gcloud run services add-iam-policy-binding "$SERVICE" --region "$REGION" \\'," --member=allUsers --role=roles/run.invoker >/dev/null 2>&1 || true","",'# Map the custom domain (once): gcloud run domain-mappings create --service "$SERVICE" --region "$REGION" --domain "$PUBLIC_HOSTNAME"',"# Then add the CNAME Cloud Run prints to your DNS. Google OAuth Web client must list","# https://$PUBLIC_HOSTNAME as an authorized origin + https://$PUBLIC_HOSTNAME/oauth2/callback as a redirect.","","# 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 "${SERVICE}-caddyfile" "${SERVICE}-auth-jwt-secret" "${SERVICE}-oauth-client-id" "${SERVICE}-oauth-client-secret" "${SERVICE}-oauth-cookie-secret" "${SERVICE}-provider-key"; do','# gcloud secrets add-iam-policy-binding "$s" --member="serviceAccount:$SA" --role=roles/secretmanager.secretAccessor',"# done",""),r.join(`
591
610
  `)}function dG(t){let e=!!t.gatewayChannels?.trim(),n=t.engine.trim().toLowerCase()==="cursor";if(t.ingress==="edge")return fG(t,e,n);if(t.ingress==="edge-fed")return EG(t,e,n);if(!n)return{Dockerfile:Bn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":Rs(t.packName),"service.yaml":aG(t),"otel-collector.yaml":Bl,"cloudrun-deploy.sh":cG(t),"README.md":[`# Deploy: ${t.packName} \u2014 Cloud Run + Spotlight (multi-container)`,"",`Engine: **${t.engine}**${t.model?`, model: **${t.model}**`:""}. Runtime base: \`${t.image}\`.`,"","Three sidecars share the pod's localhost (Cloud Run multi-container):","- **agent** (ingress) \u2192 routes the engine to `http://localhost:4443`","- **litellm** gateway \u2192 exports OTLP to `http://localhost:4318`","- **otel-collector** \u2192 writes JSONL traces to the GCS `/state` volume (`/state/analytics/traces`).","","```bash","gcloud storage buckets create gs://<your-state-bucket> # once","export STATE_BUCKET=<your-state-bucket> LITELLM_KEY=<litellm proxy key>","bash deploy/cloudrun-deploy.sh # builds linux/amd64, creates secrets, `gcloud run services replace service.yaml`","```","","`service.yaml` is the multi-container template (checked in so the wiring is reviewable);","the deploy script substitutes `${SERVICE} ${IMAGE} ${STATE_BUCKET} ${LITELLM_IMAGE}`.","Provider creds (Anthropic key / Vertex ADC / OpenAI \u2026) go on the **litellm** sidecar, not the agent.","",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; traces + sessions persist on the GCS `/state` volume.","","**Spotlight:** once traffic flows, query the GCS-backed traces with `query-analytics.sh` (DuckDB) against `/state/analytics/traces`.","","**Lean alternative (no Spotlight):** a single-container deploy that calls a provider directly","(or an external LiteLLM) \u2014 set `AGENTHIPPO_LITELLM_BASE_URL` to your endpoint and drop the sidecars.","",...cr(t)].join(`
592
611
  `)};let r=e?" --min-instances 1 --max-instances 1 --no-cpu-throttling \\":" --min-instances 0 --max-instances 1 \\",s=n?"AGENTHIPPO_NO_AUTO_INSTALL=1,AGENTHIPPO_HOME=/state,AGENTHIPPO_CUSTOM_ENGINES_DIR=/engines":"CLAUDE_CODE_USE_VERTEX=1,AGENTHIPPO_NO_AUTO_INSTALL=1,AGENTHIPPO_HOME=/state",i=n?"CURSOR_API_KEY=agenthippo-cursor-key:latest":void 0,o=t.model?.trim()?`, model ${t.model.trim()}`:"",a=["#!/usr/bin/env bash","# T1-generic: Cloud Run with built-in IAP (corp SSO, no load balancer).",`# Engine: ${t.engine}${o}. IAP forwards X-Goog-Authenticated-User-Email \u2192 user_id.`,"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"',"# Q1: durable state. Cloud Run local disk is ephemeral (wiped on scale-to-zero),","# so mount a GCS bucket at /state \u2014 sessions/provider-sessions/analytics survive.",'STATE_BUCKET="${STATE_BUCKET:?set STATE_BUCKET=your-gcs-bucket (gcloud storage buckets create gs://...)}"',"",'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',"","# Build from pack root; Dockerfile is deploy/Dockerfile (not pack root \u2014 gcloud --source . misses it).","# 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"',"","# IAP (when enabled below) forwards X-Goog-Authenticated-User-Email; pin serve to trust","# ONLY that header so an authenticated caller cannot impersonate another user via a","# spoofed X-Agent-User header. Skipped when ENABLE_IAP=0 (first-deploy bootstrap) since","# IAP never sets the header then \u2014 pinning to an absent header would make every request","# anonymous instead of leaving body-supplied identity usable during bootstrap.",'IDENTITY_ENV=""','[[ "${ENABLE_IAP:-1}" == "1" ]] && IDENTITY_ENV=",AGENTHIPPO_IDENTITY_HEADER=x-goog-authenticated-user-email" || true',"","# Deploy private (no --allow-unauthenticated). IAP + role grants are applied below on the beta track.",'gcloud run deploy "$SERVICE" \\',' --image "$IMAGE" \\'," --no-allow-unauthenticated \\",` --port ${t.port} \\`,r," --timeout 3600 \\",' --add-volume name=state,type=cloud-storage,bucket="$STATE_BUCKET" \\'," --add-volume-mount volume=state,mount-path=/state \\",` --set-env-vars "${s}\${IDENTITY_ENV}" \\`,...i?[` --set-secrets ${i} \\`]:[],' --region "$REGION"',"",...pS(),"","# Notes:",e?"# - INBOUND channel (1b): pinned min=max=1 + CPU-always-on so the socket stays alive (can't scale to zero).":"# - No inbound channel (1a): scales to zero; state on the GCS volume survives the instance dying.","# - GCS-FUSE adds latency on session read/write vs local disk; fine for chat, watch for heavy I/O.",n?`# - Cursor engine: CURSOR_API_KEY secret + ${Ns("runtime","cursor")} base (AGENTHIPPO_CUSTOM_ENGINES_DIR=/engines).`:"# - Vertex path = keyless Claude on your existing GCP entitlement; swap for ANTHROPIC_API_KEY if preferred.","# - First deploy without IAP org setup: ENABLE_IAP=0 bash deploy/cloudrun-deploy.sh",""].join(`
593
612
  `),c=n?["2. `gcloud secrets create agenthippo-cursor-key --data-file=-` (paste your `CURSOR_API_KEY`).","3. Grant Cloud Run access: `gcloud secrets add-iam-policy-binding agenthippo-cursor-key --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com --role=roles/secretmanager.secretAccessor`.","4. `bash deploy/cloudrun-deploy.sh` \u2014 builds linux/amd64, pushes to Artifact Registry, deploys with GCS /state."]:["2. `bash deploy/cloudrun-deploy.sh` \u2014 builds linux/amd64, pushes to Artifact Registry, deploys with `--iap` + GCS /state."];return{Dockerfile:Bn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":Rs(t.packName),"cloudrun-deploy.sh":a,"README.md":[`# Deploy: ${t.packName} \u2014 Cloud Run (T1-generic)`,"",`Engine: **${t.engine}**${t.model?`, model: **${t.model}**`:""}. Runtime base: \`${t.image}\`.`,"","1. `gcloud storage buckets create gs://<your-state-bucket>` then `export STATE_BUCKET=<your-state-bucket>`.",...c,"","SSO + ingress: built-in IAP (`X-Goog-Authenticated-User-Email`). **Q1:** `/state` is a mounted GCS bucket.",t.gatewayChannels?"**Inbound channel (1b):** pinned single always-on instance (no scale-to-zero).":"**No inbound channel (1a):** scales to zero; state persists on GCS.","","**Browser:** open the service URL \u2192 Google login \u2192 chat UI at `/` (same as vm `deploy/www/index.html`).","","**Verify** (smoke test via local proxy \u2014 bypasses IAP auth for direct testing):","```bash",`gcloud run services proxy ${t.packName} --region "\${REGION:-us-central1}" &`,"PROXY=http://127.0.0.1:8080",'curl -s "$PROXY/ready"','curl -s -XPOST "$PROXY/v1/chat" \\',' -H "X-Goog-Authenticated-User-Email: accounts.google.com:you@corp.com" \\',' -H "Content-Type: application/json" \\',` -d '{"message":"Reply with exactly: CLOUDRUN_OK","session_id":"cr-1"}'`,"```","",...cr(t)].join(`
594
613
  `)}}function fG(t,e,n){let r=n?"Caddy (ingress) + oauth2-proxy + auth-broker + agent.":"Caddy (ingress) + oauth2-proxy + auth-broker + agent + LiteLLM + OTEL collector (Spotlight).",s={Dockerfile:Bn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":Rs(t.packName),Caddyfile:(0,mt.renderSidecarEdgeCaddyfile)(),"service.yaml":lG(t),"cloudrun-deploy.sh":uG(t)};return n||(s["otel-collector.yaml"]=Bl),s["README.md"]=[`# Deploy: ${t.packName} \u2014 Cloud Run + AgentHippo edge (Option B)`,"",`Engine: **${t.engine}**${t.model?`, model: **${t.model}**`:""}. Runtime base: \`${t.image}\`.`,"",`${r} Sidecars share the pod's localhost (Cloud Run multi-container):`,"- **caddy** (ingress, the only port) \u2192 SSO edge: oauth2-proxy for browsers, auth-broker for IDE Bearer",`- **agent** \u2192 serves www + /v1/* on localhost:${mt.EDGE_AGENT_PORT} (NOT ingress)`,"- **auth-broker** \u2192 validates IDE AgentHippo JWTs (`/api/ide/me`) + IDE sign-in (`/oauth/*`)","- **oauth2-proxy** \u2192 Google SSO for browser clients (`provider=google`)",...n?[]:["- **litellm** gateway \u2192 exports OTLP to `http://localhost:4318`","- **otel-collector** \u2192 writes JSONL traces to the GCS `/state` volume"],"","**No IAP** \u2014 Caddy is the gate, so the IDE points `spec.remote.url` straight at","`https://$PUBLIC_HOSTNAME` and the existing AgentHippo SSO flow works (same as `remote-vm`).","Cloud Run itself is public (`allUsers` invoker) so traffic can reach Caddy to be authed.","","```bash","gcloud storage buckets create gs://<state-bucket> # once","cp deploy/.env.example deploy/.env && cp deploy/.env.auth.example deploy/.env.auth # fill both","export PUBLIC_HOSTNAME=<your.edge.hostname> ALLOWED_DOMAINS=<yourworkspace.com>","export OAUTH_CLIENT_ID=\u2026 OAUTH_CLIENT_SECRET=\u2026 OAUTH_COOKIE_SECRET=\u2026 AUTH_JWT_SECRET=\u2026",...n?["export PROVIDER_KEY=<cursor api key>"]:["export LITELLM_KEY=\u2026 PROVIDER_KEY=\u2026 STATE_BUCKET=<state-bucket>"],"bash deploy/cloudrun-deploy.sh # builds linux/amd64, upserts secrets, `gcloud run services replace`",'gcloud run domain-mappings create --service "$SERVICE" --region "${REGION:-us-central1}" --domain "$PUBLIC_HOSTNAME" # once',"```","","Google OAuth Web client (for oauth2-proxy): authorized origin `https://$PUBLIC_HOSTNAME`,","redirect `https://$PUBLIC_HOSTNAME/oauth2/callback`. Restrict to your Workspace domain via","`ALLOWED_DOMAINS` (oauth2-proxy `email_domains` + broker `allowed_domains`).","","`service.yaml` placeholders (`${SERVICE} ${IMAGE} ${LITELLM_IMAGE} ${STATE_BUCKET} ${PUBLIC_HOSTNAME} ${ALLOWED_DOMAINS}`)","are substituted by the deploy script. The Caddyfile is stored in Secret Manager (`${SERVICE}-caddyfile`).","",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; traces + sessions persist on the GCS `/state` volume.","",...cr(t)].join(`
595
- `),s}function Ps(t,e=!1){return e?[" startupProbe:"," failureThreshold: 48"," periodSeconds: 5"," tcpSocket:",` port: ${t}`," timeoutSeconds: 3"]:[" startupProbe:"," failureThreshold: 30"," periodSeconds: 5"," tcpSocket:",` port: ${t}`," timeoutSeconds: 3"]}function Mr(t,e){return[" resources:"," limits:",` cpu: ${t}`,` memory: ${e}`]}function pG(t){let e=t.engine.trim().toLowerCase()==="cursor",n=Gi(t.model),r=Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}).map(c=>`"${c.replace(/"/g,'\\"')}"`).join(", "),s=(t.cookieDomain||".agenthippo.ai").trim(),i=(t.idpUrl||"https://auth.agenthippo.ai").trim().replace(/\/+$/,""),a=["# Cloud Run + AgentHippo federated edge (A\u2032): Caddy (ingress) + auth-broker + agent","# (+ LiteLLM + OTEL collector for Spotlight). No oauth2-proxy \u2014 Google login happens once","# at the central IdP; this agent verifies the shared .agenthippo.ai AgentHippo JWT.","# Generated by `agenthippo deploy init --target cloudrun --ingress edge-fed`.","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"',` run.googleapis.com/container-dependencies: '${e?'{"caddy":["agent","auth-broker"]}':'{"caddy":["agent","auth-broker"],"agent":["litellm"],"litellm":["otel-collector"]}'}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," # Ingress \u2014 the ONLY container with a port. Verifies the shared JWT (no Google here)."," - name: caddy"," image: caddy:2.11-alpine"," ports:"," - name: http1",` containerPort: ${t.port}`," volumeMounts:"," - { name: caddy-config, mountPath: /etc/caddy, readOnly: true }",...Mr("1000m","512Mi")," # Auth broker \u2014 verifies IDE Bearer JWTs AND the federated .agenthippo.ai cookie (/api/ide/me)."," # Same shared AGENTHIPPO_AUTH_JWT_SECRET as the central IdP so its tokens verify here."," - name: auth-broker"," image: ${IMAGE}",' args: ["auth-broker"]'," env:",' - { name: AGENTHIPPO_AUTH_PORT, value: "9780" }'," - { name: AGENTHIPPO_AUTH_DATA_DIR, value: /data }"," - { name: AGENTHIPPO_AUTH_PUBLIC_URL, value: https://${PUBLIC_HOSTNAME} }"," - { name: AGENTHIPPO_AUTH_ALLOWED_DOMAINS, value: ${ALLOWED_DOMAINS} }",` - { name: AGENTHIPPO_AUTH_COOKIE_DOMAIN, value: "${s}" }`,` - { name: AGENTHIPPO_AUTH_IDP_URL, value: "${i}" }`,' - { name: AGENTHIPPO_AUTH_COOKIE_NAME, value: "ah_token" }'," - name: AGENTHIPPO_AUTH_JWT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-auth-jwt-secret, key: latest }",...Ps(9780),...Mr("1000m","512Mi")," # Agent \u2014 serves www + /v1/* on localhost (NOT ingress). Routed through LiteLLM."," - name: agent"," image: ${IMAGE}",` args: [${r}]`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',xl(),...e?[" - { name: AGENTHIPPO_CUSTOM_ENGINES_DIR, value: /engines }"," - name: CURSOR_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"]:[" - { name: AGENTHIPPO_LITELLM_BASE_URL, value: http://localhost:4443 }"," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }"]," volumeMounts:"," - { name: state, mountPath: /state }",...Ps(mt.EDGE_AGENT_PORT,!0),...Mr("2000m","2Gi")];return e||a.push(" # LiteLLM gateway sidecar \u2014 exports every call to the collector (Spotlight)."," - name: litellm"," image: ${LITELLM_IMAGE}"," env:"," - { name: OTEL_EXPORTER, value: otlp_http }"," - { name: OTEL_EXPORTER_OTLP_ENDPOINT, value: http://localhost:4318 }"," - name: LITELLM_MASTER_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }",va(t.model)?" # ah-auto \u2192 gateway.agenthippo.ai (AGENTHIPPO_GATEWAY_KEY = ahgw_\u2026 service key).":` # Upstream provider key for ${t.model||"this model"} (matches os.environ/${n}).`,` - name: ${n}`," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }",...Ps(4443),...Mr("1000m","1Gi")," # Spotlight OTEL collector sidecar \u2014 writes JSONL traces into the shared /state volume."," - name: otel-collector"," image: otel/opentelemetry-collector-contrib:0.118.0",' args: ["--config=/etc/otel/config.yaml"]'," env:"," - { name: AGENT_HOME_DIR, value: /state }"," volumeMounts:"," - { name: otel-config, mountPath: /etc/otel, readOnly: true }"," - { name: state, mountPath: /state }",...Ps(4318),...Mr("1000m","512Mi")),a.push(" volumes:"," # In-memory state (matches the working spotlight deploy \u2014 no GCS SA perms needed)."," - name: state"," emptyDir:"," medium: Memory"," sizeLimit: 1Gi"," - name: caddy-config"," secret:"," secretName: ${SERVICE}-caddyfile"," items:"," - { key: latest, path: Caddyfile }"),e||a.push(" - name: otel-config"," secret:"," secretName: ${SERVICE}-otel-config"," items:"," - { key: latest, path: config.yaml }"),a.push(""),a.join(`
596
- `)}function gG(t){let e=Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}).map(i=>`"${i.replace(/"/g,'\\"')}"`).join(", "),n=(t.cookieDomain||".agenthippo.ai").trim(),r=(t.idpUrl||"https://auth.agenthippo.ai").trim().replace(/\/+$/,"");return["# Cloud Run + AgentHippo federated edge (A\u2032) \u2014 gateway-direct (lean):","# Caddy (ingress) + auth-broker + agent. No LiteLLM/OTEL sidecars.","# Agent routes ah-auto (and other gateway models) to gateway.agenthippo.ai directly.","# Generated by `agenthippo deploy init --target cloudrun --ingress edge-fed --model-routing gateway`.","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"',` run.googleapis.com/container-dependencies: '{"caddy":["agent","auth-broker"]}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," - name: caddy"," image: caddy:2.11-alpine"," ports:"," - name: http1",` containerPort: ${t.port}`," volumeMounts:"," - { name: caddy-config, mountPath: /etc/caddy, readOnly: true }",...Mr("1000m","512Mi")," - name: auth-broker"," image: ${IMAGE}",' args: ["auth-broker"]'," env:",' - { name: AGENTHIPPO_AUTH_PORT, value: "9780" }'," - { name: AGENTHIPPO_AUTH_DATA_DIR, value: /data }"," - { name: AGENTHIPPO_AUTH_PUBLIC_URL, value: https://${PUBLIC_HOSTNAME} }"," - { name: AGENTHIPPO_AUTH_ALLOWED_DOMAINS, value: ${ALLOWED_DOMAINS} }",` - { name: AGENTHIPPO_AUTH_COOKIE_DOMAIN, value: "${n}" }`,` - { name: AGENTHIPPO_AUTH_IDP_URL, value: "${r}" }`,' - { name: AGENTHIPPO_AUTH_COOKIE_NAME, value: "ah_token" }'," - name: AGENTHIPPO_AUTH_JWT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-auth-jwt-secret, key: latest }",...Ps(9780),...Mr("1000m","512Mi")," - name: agent"," image: ${IMAGE}",` args: [${e}]`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',xl(),` - { name: AGENTHIPPO_LITELLM_BASE_URL, value: "${dS}" }`," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"," volumeMounts:"," - { name: state, mountPath: /state }",...Ps(mt.EDGE_AGENT_PORT,!0),...Mr("2000m","2Gi")," volumes:"," - name: state"," emptyDir:"," medium: Memory"," sizeLimit: 1Gi"," - name: caddy-config"," secret:"," secretName: ${SERVICE}-caddyfile"," items:"," - { key: latest, path: Caddyfile }",""].join(`
614
+ `),s}function Is(t,e=!1){return e?[" startupProbe:"," failureThreshold: 48"," periodSeconds: 5"," tcpSocket:",` port: ${t}`," timeoutSeconds: 3"]:[" startupProbe:"," failureThreshold: 30"," periodSeconds: 5"," tcpSocket:",` port: ${t}`," timeoutSeconds: 3"]}function Mr(t,e){return[" resources:"," limits:",` cpu: ${t}`,` memory: ${e}`]}function pG(t){let e=t.engine.trim().toLowerCase()==="cursor",n=Gi(t.model),r=Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}).map(c=>`"${c.replace(/"/g,'\\"')}"`).join(", "),s=(t.cookieDomain||".agenthippo.ai").trim(),i=(t.idpUrl||"https://auth.agenthippo.ai").trim().replace(/\/+$/,""),a=["# Cloud Run + AgentHippo federated edge (A\u2032): Caddy (ingress) + auth-broker + agent","# (+ LiteLLM + OTEL collector for Spotlight). No oauth2-proxy \u2014 Google login happens once","# at the central IdP; this agent verifies the shared .agenthippo.ai AgentHippo JWT.","# Generated by `agenthippo deploy init --target cloudrun --ingress edge-fed`.","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"',` run.googleapis.com/container-dependencies: '${e?'{"caddy":["agent","auth-broker"]}':'{"caddy":["agent","auth-broker"],"agent":["litellm"],"litellm":["otel-collector"]}'}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," # Ingress \u2014 the ONLY container with a port. Verifies the shared JWT (no Google here)."," - name: caddy"," image: caddy:2.11-alpine"," ports:"," - name: http1",` containerPort: ${t.port}`," volumeMounts:"," - { name: caddy-config, mountPath: /etc/caddy, readOnly: true }",...Mr("1000m","512Mi")," # Auth broker \u2014 verifies IDE Bearer JWTs AND the federated .agenthippo.ai cookie (/api/ide/me)."," # Same shared AGENTHIPPO_AUTH_JWT_SECRET as the central IdP so its tokens verify here."," - name: auth-broker"," image: ${IMAGE}",' args: ["auth-broker"]'," env:",' - { name: AGENTHIPPO_AUTH_PORT, value: "9780" }'," - { name: AGENTHIPPO_AUTH_DATA_DIR, value: /data }"," - { name: AGENTHIPPO_AUTH_PUBLIC_URL, value: https://${PUBLIC_HOSTNAME} }"," - { name: AGENTHIPPO_AUTH_ALLOWED_DOMAINS, value: ${ALLOWED_DOMAINS} }",` - { name: AGENTHIPPO_AUTH_COOKIE_DOMAIN, value: "${s}" }`,` - { name: AGENTHIPPO_AUTH_IDP_URL, value: "${i}" }`,' - { name: AGENTHIPPO_AUTH_COOKIE_NAME, value: "ah_token" }'," - name: AGENTHIPPO_AUTH_JWT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-auth-jwt-secret, key: latest }",...Is(9780),...Mr("1000m","512Mi")," # Agent \u2014 serves www + /v1/* on localhost (NOT ingress). Routed through LiteLLM."," - name: agent"," image: ${IMAGE}",` args: [${r}]`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',xl(),...e?[" - { name: AGENTHIPPO_CUSTOM_ENGINES_DIR, value: /engines }"," - name: CURSOR_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"]:[" - { name: AGENTHIPPO_LITELLM_BASE_URL, value: http://localhost:4443 }"," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }"]," volumeMounts:"," - { name: state, mountPath: /state }",...Is(mt.EDGE_AGENT_PORT,!0),...Mr("2000m","2Gi")];return e||a.push(" # LiteLLM gateway sidecar \u2014 exports every call to the collector (Spotlight)."," - name: litellm"," image: ${LITELLM_IMAGE}"," env:"," - { name: OTEL_EXPORTER, value: otlp_http }"," - { name: OTEL_EXPORTER_OTLP_ENDPOINT, value: http://localhost:4318 }"," - name: LITELLM_MASTER_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-litellm-key, key: latest }",va(t.model)?" # ah-auto \u2192 gateway.agenthippo.ai (AGENTHIPPO_GATEWAY_KEY = ahgw_\u2026 service key).":` # Upstream provider key for ${t.model||"this model"} (matches os.environ/${n}).`,` - name: ${n}`," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }",...Is(4443),...Mr("1000m","1Gi")," # Spotlight OTEL collector sidecar \u2014 writes JSONL traces into the shared /state volume."," - name: otel-collector"," image: otel/opentelemetry-collector-contrib:0.118.0",' args: ["--config=/etc/otel/config.yaml"]'," env:"," - { name: AGENT_HOME_DIR, value: /state }"," volumeMounts:"," - { name: otel-config, mountPath: /etc/otel, readOnly: true }"," - { name: state, mountPath: /state }",...Is(4318),...Mr("1000m","512Mi")),a.push(" volumes:"," # In-memory state (matches the working spotlight deploy \u2014 no GCS SA perms needed)."," - name: state"," emptyDir:"," medium: Memory"," sizeLimit: 1Gi"," - name: caddy-config"," secret:"," secretName: ${SERVICE}-caddyfile"," items:"," - { key: latest, path: Caddyfile }"),e||a.push(" - name: otel-config"," secret:"," secretName: ${SERVICE}-otel-config"," items:"," - { key: latest, path: config.yaml }"),a.push(""),a.join(`
615
+ `)}function gG(t){let e=Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}).map(i=>`"${i.replace(/"/g,'\\"')}"`).join(", "),n=(t.cookieDomain||".agenthippo.ai").trim(),r=(t.idpUrl||"https://auth.agenthippo.ai").trim().replace(/\/+$/,"");return["# Cloud Run + AgentHippo federated edge (A\u2032) \u2014 gateway-direct (lean):","# Caddy (ingress) + auth-broker + agent. No LiteLLM/OTEL sidecars.","# Agent routes ah-auto (and other gateway models) to gateway.agenthippo.ai directly.","# Generated by `agenthippo deploy init --target cloudrun --ingress edge-fed --model-routing gateway`.","apiVersion: serving.knative.dev/v1","kind: Service","metadata:"," name: ${SERVICE}","spec:"," template:"," metadata:"," annotations:",' run.googleapis.com/cpu-throttling: "false"',' run.googleapis.com/startup-cpu-boost: "true"',` run.googleapis.com/container-dependencies: '{"caddy":["agent","auth-broker"]}'`,' autoscaling.knative.dev/maxScale: "1"',...t.gatewayChannels?.trim()?[' autoscaling.knative.dev/minScale: "1"']:[]," spec:"," timeoutSeconds: 3600"," containers:"," - name: caddy"," image: caddy:2.11-alpine"," ports:"," - name: http1",` containerPort: ${t.port}`," volumeMounts:"," - { name: caddy-config, mountPath: /etc/caddy, readOnly: true }",...Mr("1000m","512Mi")," - name: auth-broker"," image: ${IMAGE}",' args: ["auth-broker"]'," env:",' - { name: AGENTHIPPO_AUTH_PORT, value: "9780" }'," - { name: AGENTHIPPO_AUTH_DATA_DIR, value: /data }"," - { name: AGENTHIPPO_AUTH_PUBLIC_URL, value: https://${PUBLIC_HOSTNAME} }"," - { name: AGENTHIPPO_AUTH_ALLOWED_DOMAINS, value: ${ALLOWED_DOMAINS} }",` - { name: AGENTHIPPO_AUTH_COOKIE_DOMAIN, value: "${n}" }`,` - { name: AGENTHIPPO_AUTH_IDP_URL, value: "${r}" }`,' - { name: AGENTHIPPO_AUTH_COOKIE_NAME, value: "ah_token" }'," - name: AGENTHIPPO_AUTH_JWT_SECRET"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-auth-jwt-secret, key: latest }",...Is(9780),...Mr("1000m","512Mi")," - name: agent"," image: ${IMAGE}",` args: [${e}]`," env:"," - { name: AGENTHIPPO_HOME, value: /state }",' - { name: AGENTHIPPO_NO_AUTO_INSTALL, value: "1" }',xl(),` - { name: AGENTHIPPO_LITELLM_BASE_URL, value: "${dS}" }`," - name: AGENTHIPPO_LITELLM_API_KEY"," valueFrom:"," secretKeyRef: { name: ${SERVICE}-provider-key, key: latest }"," volumeMounts:"," - { name: state, mountPath: /state }",...Is(mt.EDGE_AGENT_PORT,!0),...Mr("2000m","2Gi")," volumes:"," - name: state"," emptyDir:"," medium: Memory"," sizeLimit: 1Gi"," - name: caddy-config"," secret:"," secretName: ${SERVICE}-caddyfile"," items:"," - { key: latest, path: Caddyfile }",""].join(`
597
616
  `)}function hG(t){let e=t.model?.trim()?`, model ${t.model.trim()}`:"",n=va(t.model)?'PROVIDER_KEY="${PROVIDER_KEY:?set PROVIDER_KEY=<ahgw_\u2026 from create-gateway-key on gateway host>}"':'PROVIDER_KEY="${PROVIDER_KEY:?set PROVIDER_KEY=<gateway service key or provider key>}"';return["#!/usr/bin/env bash","# Cloud Run + AgentHippo federated edge (A\u2032) \u2014 gateway-direct (lean).",`# Engine: ${t.engine}${e}. Caddy + auth-broker + agent only \u2014 agent calls`,"# gateway.agenthippo.ai directly (no in-pod LiteLLM/OTEL sidecars). Same model routing","# as colocated agents on hippopennyg.","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"','PUBLIC_HOSTNAME="${PUBLIC_HOSTNAME:?set PUBLIC_HOSTNAME=<subdomain>.agenthippo.ai}"','ALLOWED_DOMAINS="${ALLOWED_DOMAINS:-agenthippo.ai}"','AUTH_JWT_SECRET="${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET=<copy from auth.agenthippo.ai>}"',n,"",'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',"",'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"',"",'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=-',"",'RENDERED="$(mktemp)"','sed -e "s|\\${SERVICE}|${SERVICE}|g" -e "s|\\${IMAGE}|${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"',"",'gcloud run services add-iam-policy-binding "$SERVICE" --region "$REGION" \\'," --member=allUsers --role=roles/run.invoker >/dev/null 2>&1 || true","",'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",""].join(`
598
617
  `)}function mG(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:-${Ns("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>}"']:va(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(`
599
618
  `)}function EG(t,e,n){let r=bp(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:Bn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":Rs(t.packName),Caddyfile:(0,mt.renderSidecarFedCaddyfile)(t.idpUrl),"service.yaml":r?gG(t):pG(t),"cloudrun-deploy.sh":r?hG(t):mG(t)};return!n&&!r&&(o["otel-collector.yaml"]=Bl),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:${mt.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 \`${dS}\` 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>"]:va(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).","",...cr(t)].join(`
@@ -618,45 +637,45 @@ ${n}`}function Mi(t,e){let n=["serve","--agent","/app/pack","--workspace","/stat
618
637
  `)}}let i=[{name:"caddy",image:"caddy:2.11-alpine",env:[{name:"PORT",value:String(s)},{name:"AGENTHIPPO_PUBLIC_HOSTNAME",value:t.publicHostname}],resources:{cpu:.25,memory:"0.5Gi"}},...e?[]:[{name:"oauth2-proxy",image:"quay.io/oauth2-proxy/oauth2-proxy:v7.7.1",env:[{name:"OAUTH2_PROXY_HTTP_ADDRESS",value:"0.0.0.0:4180"},{name:"OAUTH2_PROXY_UPSTREAMS",value:"file:///dev/null"},{name:"OAUTH2_PROXY_SET_XAUTHREQUEST",value:"true"},{name:"OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER",value:"true"},{name:"OAUTH2_PROXY_SKIP_PROVIDER_BUTTON",value:"true"},{name:"OAUTH2_PROXY_REVERSE_PROXY",value:"true"},{name:"OAUTH2_PROXY_CLIENT_ID",secretRef:"oauth-client-id"},{name:"OAUTH2_PROXY_CLIENT_SECRET",secretRef:"oauth-client-secret"},{name:"OAUTH2_PROXY_COOKIE_SECRET",secretRef:"oauth-cookie-secret"}],resources:{cpu:.25,memory:"0.5Gi"}}],{name:"auth-broker",image:"${IMAGE}",command:["agenthippo","auth-broker"],env:[{name:"AGENTHIPPO_AUTH_PORT",value:"9780"},{name:"AGENTHIPPO_AUTH_JWT_SECRET",secretRef:"auth-jwt-secret"},...e?[{name:"AGENTHIPPO_AUTH_COOKIE_DOMAIN",value:t.cookieDomain||""},{name:"AGENTHIPPO_AUTH_IDP_URL",value:t.idpUrl||""}]:[]],resources:{cpu:.25,memory:"0.5Gi"}},{name:"agent",image:"${IMAGE}",command:Mi(t,{wwwDir:"/app/pack/deploy/www",port:mt.EDGE_AGENT_PORT}),env:[{name:"AGENTHIPPO_NO_AUTO_INSTALL",value:"1"},{name:r,secretRef:"provider-key"}],resources:{cpu:.5,memory:"1Gi"}}],o={properties:{configuration:{ingress:{external:!0,targetPort:s},secrets:[{name:"auth-jwt-secret",value:"${AUTH_JWT_SECRET}"},{name:"provider-key",value:"${PROVIDER_KEY}"},...e?[]:[{name:"oauth-client-id",value:"${OAUTH_CLIENT_ID}"},{name:"oauth-client-secret",value:"${OAUTH_CLIENT_SECRET}"},{name:"oauth-cookie-secret",value:"${OAUTH_COOKIE_SECRET}"}]]},template:{containers:i}}},a=['AUTH_JWT_SECRET="${AUTH_JWT_SECRET:?set AUTH_JWT_SECRET}"',`PROVIDER_KEY="\${PROVIDER_KEY:?set PROVIDER_KEY \u2014 your ${r}}"`,...e?[]:['OAUTH_CLIENT_ID="${OAUTH_CLIENT_ID:?set OAUTH_CLIENT_ID}"','OAUTH_CLIENT_SECRET="${OAUTH_CLIENT_SECRET:?set OAUTH_CLIENT_SECRET}"','OAUTH_COOKIE_SECRET="${OAUTH_COOKIE_SECRET:?set OAUTH_COOKIE_SECRET}"']],c=["#!/usr/bin/env bash",`# Azure Container Apps + AgentHippo edge (${e?"edge-fed: federated identity, no oauth2-proxy":"edge: self-issued"}).`,"# Container Apps environments provide built-in ingress + TLS \u2014 no separate load balancer.","set -euo pipefail",...Qr(),'SERVICE="'+t.packName+'"','RESOURCE_GROUP="${RESOURCE_GROUP:?set RESOURCE_GROUP}"','ENVIRONMENT="${CONTAINERAPPS_ENVIRONMENT:?set CONTAINERAPPS_ENVIRONMENT \u2014 az containerapp env create (one-time)}"','ACR_NAME="${ACR_NAME:?set ACR_NAME \u2014 an Azure Container Registry (one-time: az acr create)}"','IMAGE="${ACR_NAME}.azurecr.io/${SERVICE}:latest"',"","# auth-broker reuses the agent image (CLI ships `auth-broker`). Builds in ACR.",'az acr build --registry "$ACR_NAME" --image "${SERVICE}:latest" --file deploy/Dockerfile .',"",...a,'SPEC_JSON="$(sed -e "s|\\${IMAGE}|${IMAGE}|g" -e "s|\\${AUTH_JWT_SECRET}|${AUTH_JWT_SECRET}|g" \\',' -e "s|\\${PROVIDER_KEY}|${PROVIDER_KEY}|g" \\',...e?[]:[' -e "s|\\${OAUTH_CLIENT_ID}|${OAUTH_CLIENT_ID}|g" -e "s|\\${OAUTH_CLIENT_SECRET}|${OAUTH_CLIENT_SECRET}|g" \\',' -e "s|\\${OAUTH_COOKIE_SECRET}|${OAUTH_COOKIE_SECRET}|g" \\'],' deploy/containerapp.json)"','echo "$SPEC_JSON" > /tmp/${SERVICE}-containerapp.json',"","# `--yaml` also accepts JSON (JSON is valid YAML) \u2014 kept as .json so it's reviewable","# alongside the other checked-in templates without a format switch.",'az containerapp show --name "$SERVICE" --resource-group "$RESOURCE_GROUP" >/dev/null 2>&1 \\',' && az containerapp update --name "$SERVICE" --resource-group "$RESOURCE_GROUP" \\'," --yaml /tmp/${SERVICE}-containerapp.json >/dev/null \\",' || az containerapp create --name "$SERVICE" --resource-group "$RESOURCE_GROUP" \\',' --environment "$ENVIRONMENT" --yaml /tmp/${SERVICE}-containerapp.json >/dev/null','echo "Deployed $SERVICE behind the AgentHippo edge in $ENVIRONMENT"',""].join(`
619
638
  `);return{Dockerfile:Bn(t,{wwwDir:"/app/pack/deploy/www"}),"www/index.html":Rs(t.packName),Caddyfile:e?(0,mt.renderSidecarFedCaddyfile)(t.idpUrl):(0,mt.renderSidecarEdgeCaddyfile)(),"containerapp.json":JSON.stringify(o,null,2)+`
620
639
  `,"deploy.sh":c,"README.md":[`# Deploy: ${t.packName} \u2014 Azure Container Apps + AgentHippo edge (${e?"edge-fed":"edge"})`,"",`Engine: **${t.engine}**${t.model?`, model: **${t.model}**`:""}.`,"","One Container App, containers share the replica's localhost \u2014 the same sidecar shape","Cloud Run/ECS Fargate use, so the Caddyfile is identical:","- **caddy** (ingress, the only published port) \u2192 "+(e?"verifies the shared AgentHippo JWT":"SSO edge: oauth2-proxy for browsers, auth-broker for IDE Bearer"),`- **agent** \u2192 serves www + /v1/* on localhost:${mt.EDGE_AGENT_PORT} (not published)`,"- **auth-broker** \u2192 validates IDE AgentHippo JWTs (`/api/ide/me`)"+(e?" against the shared IdP secret":""),...e?[]:["- **oauth2-proxy** \u2192 Google SSO for browser clients"],"","Built-in ingress + TLS termination \u2014 no separate load balancer to stand up.","","```bash","export RESOURCE_GROUP=<rg> CONTAINERAPPS_ENVIRONMENT=<env> ACR_NAME=<registry>",...a.map(l=>"export "+l.split("=")[0]+"=<...>"),"bash deploy/deploy.sh","```","","> \u26A0\uFE0F Newer and far less exercised than the Cloud Run target \u2014 read `deploy.sh` before","> running it against a real account.","",...cr(t)].join(`
621
- `)}}var TG={vm:sG,compose:iG,cloudrun:dG,"databricks-app":_G,spcs:yG,cloudflare:wG,"aws-ecs":SG,"azure-container-apps":AG};function bG(t,e){let n=TG[t](e),r=e.ingress==="edge-fed",s=!!e.colocate&&r&&(t==="vm"||t==="compose"),i=bp(e)&&t==="cloudrun"&&r,o=!s&&(t==="vm"||t==="compose"||(t==="cloudrun"||t==="aws-ecs"||t==="azure-container-apps")&&(e.ingress==="edge"||r)),a=Object.keys(n).some(d=>d==="Dockerfile"||d.endsWith("/Dockerfile")),c={...n,...a?{".dockerignore":nG()}:{},".env.example":eS(e.envVars,{edge:o,engine:e.engine,hostname:e.publicHostname,gatewayDirect:i}),...o?{".env.auth.example":tS({hostname:e.publicHostname,fed:r,idpUrl:e.idpUrl,cookieDomain:e.cookieDomain})}:{},"DATA-ACCESS.md":oG(e,t,o,r,s)},l={};for(let[d,u]of Object.entries(c))l[d]=Zw(e,d,u);return l}});var gS=S(Zr=>{"use strict";Object.defineProperty(Zr,"__esModule",{value:!0});Zr.BLUEPRINTS=Zr.BLUEPRINT_IDS=void 0;Zr.isBlueprintId=vG;Zr.resolveBlueprint=OG;Zr.BLUEPRINT_IDS=["sandbox","prospect-demo","team-pilot","regulated-air-gapped","enterprise-fleet"];function vG(t){return Zr.BLUEPRINT_IDS.includes(t)}Zr.BLUEPRINTS={sandbox:{id:"sandbox",description:"Internal test, no external users \u2014 no edge, no SSO, no host port beyond localhost.",targets:["vm"]},"prospect-demo":{id:"prospect-demo",description:"Throwaway public demo for a prospect \u2014 Cloudflare Tunnel + a throwaway Google OAuth client.",targets:["vm","compose"]},"team-pilot":{id:"team-pilot",description:"Single-agent pilot. Rides the customer platform's own identity when one exists (GCP IAP, Databricks workspace SSO, Snowflake network, Cloudflare Access); falls back to a self-issued edge (own Caddy + oauth2-proxy + Google client) on vm/compose/aws-ecs/azure-container-apps, which have no platform-native option yet.",targets:["cloudrun","databricks-app","spcs","cloudflare","vm","compose","aws-ecs","azure-container-apps"]},"regulated-air-gapped":{id:"regulated-air-gapped",description:"VPN/localhost only, no tunnel, no external telemetry \u2014 the highest-scrutiny buyer profile. Currently generator-identical to sandbox; the distinction is buyer framing, not yet enforced posture.",targets:["vm"]},"enterprise-fleet":{id:"enterprise-fleet",description:"Federated identity against a central IdP (enterprise-deploy/idp/) for a growing fleet of agents. Same-host colocation (no edge of its own) is available for vm/compose via the raw `--ingress edge-fed --colocate` flag \u2014 not yet encoded as a blueprint variant.",targets:["cloudrun","vm","compose","aws-ecs","azure-container-apps"]}};function OG(t,e){let n=Zr.BLUEPRINTS[t],r=e??n.targets[0];if(!n.targets.includes(r))throw new Error(`Blueprint "${t}" does not support --platform ${r}. Supported: ${n.targets.join(", ")}.`);switch(t){case"sandbox":case"regulated-air-gapped":return{target:r};case"prospect-demo":return{target:r,ingress:"edge"};case"enterprise-fleet":return{target:r,ingress:"edge-fed"};case"team-pilot":return r==="cloudrun"?{target:r,ingress:"iap"}:r==="databricks-app"||r==="spcs"||r==="cloudflare"?{target:r}:{target:r,ingress:"edge"}}}});var mS=S(ns=>{"use strict";var IG=ns&&ns.__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]})),PG=ns&&ns.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Ip=ns&&ns.__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"&&IG(n,e,r[s]);return PG(n,e),n}})();Object.defineProperty(ns,"__esModule",{value:!0});ns.copyPackToStaging=hS;ns.deployCommand=$G;var ts=Ip(require("fs")),Ft=Ip(require("path")),NG=Ip(require("js-yaml")),es=vp(),Op=gS(),lr=Xt(),RG=8080;function CG(t){let e=Ft.join(t,"agent.yaml");if(!ts.existsSync(e))throw new Error(`No agent.yaml in ${t} \u2014 point deploy init at a pack directory.`);let n=NG.load(ts.readFileSync(e,"utf8")),r=n?.metadata?.name?.trim();if(!r)throw new Error(`agent.yaml is missing metadata.name in ${t}`);let s=n?.metadata?.version?.trim();if(!s)throw new Error(`agent.yaml is missing metadata.version in ${t}`);let i=n?.spec?.model?.trim();return{name:r,version:s,engine:n?.spec?.engine?.trim()||"claude",...i?{model:i}:{}}}var kG=new Set([".git","node_modules","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".venv","venv",".next",".turbo",".cache","dist","build",".DS_Store",".idea",".vscode"]);function hS(t,e){let n=[],r=Ft.resolve(e);return ts.cpSync(t,e,{recursive:!0,force:!0,dereference:!0,preserveTimestamps:!0,filter:s=>{let i=Ft.relative(t,s);if(!i)return!0;if(s===r||s.startsWith(r+Ft.sep))return!1;let o=Ft.basename(s);if(i==="deploy"||i.startsWith("deploy"+Ft.sep)||i==="deploy-out"||i.startsWith("deploy-out"+Ft.sep)||kG.has(o)||o.startsWith(".nfs"))return!1;try{if(ts.lstatSync(s).isSymbolicLink()&&!ts.existsSync(s))return n.push(i),!1}catch{return!1}return!(o===".env"||o===".env.local"||o===".env.production"||o.endsWith(".log")||(0,es.isSecretLikeBasename)(o))}}),n}async function $G(t,e,n){t!=="init"&&(console.error(`Unknown deploy action "${t}". Supported: init`),process.exit(1));let r=n.target,s=n.ingress;if(n.blueprint){if(!(0,Op.isBlueprintId)(n.blueprint)){console.error(`Unknown --blueprint "${n.blueprint}". Supported: ${Object.keys(Op.BLUEPRINTS).join(", ")}`),process.exit(1);return}if(n.platform&&!(0,es.isDeployTarget)(n.platform)){console.error(`Unknown --platform "${n.platform}". Supported: ${es.DEPLOY_TARGETS.join(", ")}`),process.exit(1);return}try{let f=(0,Op.resolveBlueprint)(n.blueprint,n.platform);r=f.target,s=f.ingress}catch(f){console.error(`Error: ${f instanceof Error?f.message:f}`),process.exit(1);return}}let i=Ft.resolve(n.packdir||e||process.cwd()),o=r==="all"?[...es.DEPLOY_TARGETS]:[r];for(let f of o)(0,es.isDeployTarget)(f)||(console.error(`Unknown --target "${f}". Supported: ${es.DEPLOY_TARGETS.join(", ")}, all`),process.exit(1));let a;try{a=CG(i)}catch(f){console.error(`Error: ${f instanceof Error?f.message:f}`),process.exit(1);return}let c=(0,es.scanEnvRefs)(i),l=n.gateway?.trim();if(l)for(let f of["OPENCLAW_GATEWAY_TOKEN","SLACK_BOT_TOKEN","SLACK_APP_TOKEN"])c.includes(f)||c.push(f);let d=n.modelRouting==="gateway"?"gateway":n.modelRouting==="sidecar"?"sidecar":void 0;n.modelRouting&&n.modelRouting!=="gateway"&&n.modelRouting!=="sidecar"&&(console.error(`Unknown --model-routing "${n.modelRouting}". Supported: sidecar, gateway`),process.exit(1));let u={packName:a.name,packVersion:a.version,image:n.image||(0,es.defaultRuntimeImage)(a.engine),port:n.port||RG,engine:a.engine,model:a.model,envVars:c,gatewayChannels:l,publicHostname:(0,es.resolveDeployPublicHostname)(n.hostname),ingress:s,idpUrl:n.idpUrl,cookieDomain:n.cookieDomain,colocate:n.colocate,modelRouting:d,edgeTurnConnector:n.edgeTurnConnector?.trim()||void 0};for(let f of o){let p=d==="gateway"?"-gateway":"",g=n.out?o.length>1?Ft.join(Ft.resolve(n.out),f+p):Ft.resolve(n.out):Ft.join(process.cwd(),"deploy-out",`${a.name}-${f}${p}`);ts.mkdirSync(g,{recursive:!0});let m=hS(i,g);if(m.length>0){let E=m.slice(0,3).join(", ");console.log(` ${lr.COLORS.yellow}\u26A0 ${m.length} broken symlink(s) skipped (not staged \u2014 the image would have no content for these). Sample: ${E}${m.length>3?", \u2026":""}${lr.COLORS.reset}`)}ts.mkdirSync(Ft.join(g,"deploy"),{recursive:!0});let h=(0,es.renderTarget)(f,u),w=[],_=[];for(let[E,O]of Object.entries(h)){let T=E===".dockerignore"?Ft.join(g,".dockerignore"):Ft.join(g,"deploy",E);if(ts.existsSync(T)&&!n.force){_.push(E);continue}ts.mkdirSync(Ft.dirname(T),{recursive:!0}),ts.writeFileSync(T,O),w.push(E)}console.log(`${lr.COLORS.green}\u2713${lr.COLORS.reset} ${f} \u2192 ${Ft.relative(process.cwd(),g)||"."}`);for(let E of w)console.log(` ${lr.COLORS.dim}+ ${E}${lr.COLORS.reset}`);for(let E of _)console.log(` ${lr.COLORS.yellow}\u2022 ${E} (exists; --force to overwrite)${lr.COLORS.reset}`)}c.length>0&&console.log(`
622
- ${lr.COLORS.dim}Scanned pack secrets into .env.example: ${c.join(", ")}${lr.COLORS.reset}`),console.log("\nNext: cd into the staging dir above, `cp deploy/.env.example deploy/.env`, then run the command in deploy/README.md (scripts anchor themselves to the staging root)."),console.log(`${lr.COLORS.dim}Tip: run deploy init from the pack's parent directory \u2014 not from inside the pack (default deploy-out/ inside the pack copies into itself and fails).${lr.COLORS.reset}`)}});var _S=S(Pp=>{"use strict";Object.defineProperty(Pp,"__esModule",{value:!0});Pp.renderIdpArtifacts=UG;var DG=yp(),ES=vp();function LG(t){if(t.cookieDomain?.trim())return t.cookieDomain.trim();let e=t.hostname.split(".");return e.length>2?`.${e.slice(-2).join(".")}`:`.${t.hostname}`}function MG(){return["# Central IdP.","#","# ./run.sh","#","# Env split (matches `agenthippo deploy init`):","# ~/.agent-hippo/.env (+ optional ./.env) \u2014 hostname only","# ~/.agent-hippo/.env.auth (+ optional ./.env.auth) \u2014 JWT/OAuth; broker + oauth2-proxy ONLY","# Profiles: edge (SSO stack), tunnel (Cloudflare \u2192 Caddy)","# Org identity infra only \u2014 no agent runs here. Per-agent edges are generated separately","# by `agenthippo deploy init` and deployed on their own host/service.","services:"," oauth2-proxy:",' profiles: ["edge"]'," image: quay.io/oauth2-proxy/oauth2-proxy:v7.7.1"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," - path: ${HOME}/.agent-hippo/.env.auth"," required: false"," - path: .env.auth"," required: false"," environment:"," OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:4180"," OAUTH2_PROXY_UPSTREAMS: file:///dev/null",' OAUTH2_PROXY_SET_XAUTHREQUEST: "true"',' OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER: "true"',' OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true"',' OAUTH2_PROXY_REVERSE_PROXY: "true"'," # Absolute post-login redirects (rd=https://<host>/\u2026) are only honoured for whitelisted",' # hosts. The Caddyfile uses absolute rd so an IDE redirect_uri containing "//" inside'," # the authorize query is not rejected by the oauth2-proxy relative-URL validator."," OAUTH2_PROXY_WHITELIST_DOMAINS: ${OAUTH2_PROXY_WHITELIST_DOMAINS:-${AGENTHIPPO_PUBLIC_HOSTNAME}}",' expose: ["4180"]',""," auth-broker:",' profiles: ["edge"]'," build:"," context: ."," dockerfile: Dockerfile.auth-broker"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," - path: ${HOME}/.agent-hippo/.env.auth"," required: false"," - path: .env.auth"," required: false"," environment:",' AGENTHIPPO_AUTH_PORT: "9780"'," AGENTHIPPO_AUTH_DATA_DIR: /data"," # The broker now defaults to binding 127.0.0.1 and REFUSES a public bind unless told"," # otherwise. Here it must listen on the container interface, because Caddy reaches it"," # as `auth-broker:9780` over the compose network \u2014 a loopback bind makes it unreachable."," # Safe: the port is `expose`d, never published to the host, so the only thing that can"," # dial it is another service on this network.",' AGENTHIPPO_AUTH_BIND: "0.0.0.0"',' AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND: "1"'," # Shared secret proving an X-Auth-Request-Email came from THIS Caddy. Without it the"," # broker treats that header as unverified and 401s the forward_auth-gated routes."," # No default on purpose: compose FAILS to start rather than silently running with an"," # empty secret on both sides, which would accept every caller. Put it in ./.env.",' AGENTHIPPO_AUTH_PROXY_SECRET: "${AGENTHIPPO_AUTH_PROXY_SECRET:?set AGENTHIPPO_AUTH_PROXY_SECRET in .env (openssl rand -hex 32)}"'," # Proxy hops in front of the broker: 1 = Caddy only (edge profile), 2 = Cloudflare"," # Tunnel \u2192 Caddy (run.sh sets 2; at 1 the rate limiter would key every tunnel"," # client on cloudflared's IP \u2014 one shared bucket)."," AGENTHIPPO_XFF_TRUSTED_HOPS: ${AGENTHIPPO_XFF_TRUSTED_HOPS:-1}",' volumes: ["auth-broker-data:/data"]',' expose: ["9780"]',""," caddy:",' profiles: ["edge"]'," image: caddy:2.11-alpine"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," # With the tunnel profile, set AGENTHIPPO_CADDY_BIND=127.0.0.1 so a public-IP host"," # cannot be hit directly on 80/443, bypassing Cloudflare."," # Bare-metal / BYO nginx or ALB already on 80/443? Set AGENTHIPPO_CADDY_HTTP_PORT /"," # AGENTHIPPO_CADDY_HTTPS_PORT to alternate host ports and point your own reverse proxy"," # at them \u2014 the container still listens on 80 internally, only the host mapping moves."," ports:",' - "${AGENTHIPPO_CADDY_BIND:-0.0.0.0}:${AGENTHIPPO_CADDY_HTTP_PORT:-80}:80"',' - "${AGENTHIPPO_CADDY_BIND:-0.0.0.0}:${AGENTHIPPO_CADDY_HTTPS_PORT:-443}:443"'," environment:"," # Caddy stamps this on the two broker hops that forward a verified X-Auth-Request-Email"," # (/oauth/authorize, /oauth/browser-login). Same value the broker checks; same fail-closed"," # rule \u2014 compose refuses to start rather than send an empty secret.",' AGENTHIPPO_AUTH_PROXY_SECRET: "${AGENTHIPPO_AUTH_PROXY_SECRET:?set AGENTHIPPO_AUTH_PROXY_SECRET in .env (openssl rand -hex 32)}"'," volumes:"," - ./Caddyfile:/etc/caddy/Caddyfile:ro"," # Colocated agents (deploy init --colocate) drop a route snippet here \u2014 see Caddyfile."," - ./agents:/etc/caddy/agents:ro"," networks: [default, colocate]"," depends_on: [oauth2-proxy, auth-broker]",""," cloudflared:",' profiles: ["tunnel"]'," image: cloudflare/cloudflared:2024.12.2"," restart: unless-stopped"," command: tunnel --config /etc/cloudflared/config.yml run"," volumes:"," - ./cloudflared.yml:/etc/cloudflared/config.yml:ro"," # Set by run.sh from its argument (./run.sh /path/to/tunnel-credentials.json);"," # falls back to the conventional location for a direct `docker compose` invocation."," - ${AGENTHIPPO_TUNNEL_CREDENTIALS:-${HOME}/.agent-hippo/tunnel-credentials.json}:/etc/cloudflared/credentials.json:ro"," depends_on: [caddy]","","volumes:"," auth-broker-data:","","networks:"," default:",` # Stable, explicitly-named network (not the implicit "idp_default") so a colocated agent's`," # own compose project can join it reliably regardless of which directory `docker compose`"," # runs from. Only Caddy needs it \u2014 its per-agent snippets `reverse_proxy` straight to the"," # agent container by name; auth-broker is reached over the (already-shared) default network."," colocate:"," name: agenthippo-idp-colocate",""].join(`
640
+ `)}}var TG={vm:sG,compose:iG,cloudrun:dG,"databricks-app":_G,spcs:yG,cloudflare:wG,"aws-ecs":SG,"azure-container-apps":AG};function bG(t,e){let n=TG[t](e),r=e.ingress==="edge-fed",s=!!e.colocate&&r&&(t==="vm"||t==="compose"),i=bp(e)&&t==="cloudrun"&&r,o=!s&&(t==="vm"||t==="compose"||(t==="cloudrun"||t==="aws-ecs"||t==="azure-container-apps")&&(e.ingress==="edge"||r)),a=Object.keys(n).some(d=>d==="Dockerfile"||d.endsWith("/Dockerfile")),c={...n,...a?{".dockerignore":nG()}:{},".env.example":eS(e.envVars,{edge:o,engine:e.engine,hostname:e.publicHostname,gatewayDirect:i}),...o?{".env.auth.example":tS({hostname:e.publicHostname,fed:r,idpUrl:e.idpUrl,cookieDomain:e.cookieDomain})}:{},"DATA-ACCESS.md":oG(e,t,o,r,s)},l={};for(let[d,u]of Object.entries(c))l[d]=Zw(e,d,u);return l}});var gS=S(Zr=>{"use strict";Object.defineProperty(Zr,"__esModule",{value:!0});Zr.BLUEPRINTS=Zr.BLUEPRINT_IDS=void 0;Zr.isBlueprintId=vG;Zr.resolveBlueprint=OG;Zr.BLUEPRINT_IDS=["sandbox","prospect-demo","team-pilot","regulated-air-gapped","enterprise-fleet"];function vG(t){return Zr.BLUEPRINT_IDS.includes(t)}Zr.BLUEPRINTS={sandbox:{id:"sandbox",description:"Internal test, no external users \u2014 no edge, no SSO, no host port beyond localhost.",targets:["vm"]},"prospect-demo":{id:"prospect-demo",description:"Throwaway public demo for a prospect \u2014 Cloudflare Tunnel + a throwaway Google OAuth client.",targets:["vm","compose"]},"team-pilot":{id:"team-pilot",description:"Single-agent pilot. Rides the customer platform's own identity when one exists (GCP IAP, Databricks workspace SSO, Snowflake network, Cloudflare Access); falls back to a self-issued edge (own Caddy + oauth2-proxy + Google client) on vm/compose/aws-ecs/azure-container-apps, which have no platform-native option yet.",targets:["cloudrun","databricks-app","spcs","cloudflare","vm","compose","aws-ecs","azure-container-apps"]},"regulated-air-gapped":{id:"regulated-air-gapped",description:"VPN/localhost only, no tunnel, no external telemetry \u2014 the highest-scrutiny buyer profile. Currently generator-identical to sandbox; the distinction is buyer framing, not yet enforced posture.",targets:["vm"]},"enterprise-fleet":{id:"enterprise-fleet",description:"Federated identity against a central IdP (enterprise-deploy/idp/) for a growing fleet of agents. Same-host colocation (no edge of its own) is available for vm/compose via the raw `--ingress edge-fed --colocate` flag \u2014 not yet encoded as a blueprint variant.",targets:["cloudrun","vm","compose","aws-ecs","azure-container-apps"]}};function OG(t,e){let n=Zr.BLUEPRINTS[t],r=e??n.targets[0];if(!n.targets.includes(r))throw new Error(`Blueprint "${t}" does not support --platform ${r}. Supported: ${n.targets.join(", ")}.`);switch(t){case"sandbox":case"regulated-air-gapped":return{target:r};case"prospect-demo":return{target:r,ingress:"edge"};case"enterprise-fleet":return{target:r,ingress:"edge-fed"};case"team-pilot":return r==="cloudrun"?{target:r,ingress:"iap"}:r==="databricks-app"||r==="spcs"||r==="cloudflare"?{target:r}:{target:r,ingress:"edge"}}}});var mS=S(ns=>{"use strict";var PG=ns&&ns.__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]})),IG=ns&&ns.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Pp=ns&&ns.__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"&&PG(n,e,r[s]);return IG(n,e),n}})();Object.defineProperty(ns,"__esModule",{value:!0});ns.copyPackToStaging=hS;ns.deployCommand=$G;var ts=Pp(require("fs")),Ft=Pp(require("path")),NG=Pp(require("js-yaml")),es=vp(),Op=gS(),lr=Xt(),RG=8080;function CG(t){let e=Ft.join(t,"agent.yaml");if(!ts.existsSync(e))throw new Error(`No agent.yaml in ${t} \u2014 point deploy init at a pack directory.`);let n=NG.load(ts.readFileSync(e,"utf8")),r=n?.metadata?.name?.trim();if(!r)throw new Error(`agent.yaml is missing metadata.name in ${t}`);let s=n?.metadata?.version?.trim();if(!s)throw new Error(`agent.yaml is missing metadata.version in ${t}`);let i=n?.spec?.model?.trim();return{name:r,version:s,engine:n?.spec?.engine?.trim()||"claude",...i?{model:i}:{}}}var kG=new Set([".git","node_modules","__pycache__",".pytest_cache",".mypy_cache",".ruff_cache",".venv","venv",".next",".turbo",".cache","dist","build",".DS_Store",".idea",".vscode"]);function hS(t,e){let n=[],r=Ft.resolve(e);return ts.cpSync(t,e,{recursive:!0,force:!0,dereference:!0,preserveTimestamps:!0,filter:s=>{let i=Ft.relative(t,s);if(!i)return!0;if(s===r||s.startsWith(r+Ft.sep))return!1;let o=Ft.basename(s);if(i==="deploy"||i.startsWith("deploy"+Ft.sep)||i==="deploy-out"||i.startsWith("deploy-out"+Ft.sep)||kG.has(o)||o.startsWith(".nfs"))return!1;try{if(ts.lstatSync(s).isSymbolicLink()&&!ts.existsSync(s))return n.push(i),!1}catch{return!1}return!(o===".env"||o===".env.local"||o===".env.production"||o.endsWith(".log")||(0,es.isSecretLikeBasename)(o))}}),n}async function $G(t,e,n){t!=="init"&&(console.error(`Unknown deploy action "${t}". Supported: init`),process.exit(1));let r=n.target,s=n.ingress;if(n.blueprint){if(!(0,Op.isBlueprintId)(n.blueprint)){console.error(`Unknown --blueprint "${n.blueprint}". Supported: ${Object.keys(Op.BLUEPRINTS).join(", ")}`),process.exit(1);return}if(n.platform&&!(0,es.isDeployTarget)(n.platform)){console.error(`Unknown --platform "${n.platform}". Supported: ${es.DEPLOY_TARGETS.join(", ")}`),process.exit(1);return}try{let f=(0,Op.resolveBlueprint)(n.blueprint,n.platform);r=f.target,s=f.ingress}catch(f){console.error(`Error: ${f instanceof Error?f.message:f}`),process.exit(1);return}}let i=Ft.resolve(n.packdir||e||process.cwd()),o=r==="all"?[...es.DEPLOY_TARGETS]:[r];for(let f of o)(0,es.isDeployTarget)(f)||(console.error(`Unknown --target "${f}". Supported: ${es.DEPLOY_TARGETS.join(", ")}, all`),process.exit(1));let a;try{a=CG(i)}catch(f){console.error(`Error: ${f instanceof Error?f.message:f}`),process.exit(1);return}let c=(0,es.scanEnvRefs)(i),l=n.gateway?.trim();if(l)for(let f of["OPENCLAW_GATEWAY_TOKEN","SLACK_BOT_TOKEN","SLACK_APP_TOKEN"])c.includes(f)||c.push(f);let d=n.modelRouting==="gateway"?"gateway":n.modelRouting==="sidecar"?"sidecar":void 0;n.modelRouting&&n.modelRouting!=="gateway"&&n.modelRouting!=="sidecar"&&(console.error(`Unknown --model-routing "${n.modelRouting}". Supported: sidecar, gateway`),process.exit(1));let u={packName:a.name,packVersion:a.version,image:n.image||(0,es.defaultRuntimeImage)(a.engine),port:n.port||RG,engine:a.engine,model:a.model,envVars:c,gatewayChannels:l,publicHostname:(0,es.resolveDeployPublicHostname)(n.hostname),ingress:s,idpUrl:n.idpUrl,cookieDomain:n.cookieDomain,colocate:n.colocate,modelRouting:d,edgeTurnConnector:n.edgeTurnConnector?.trim()||void 0};for(let f of o){let p=d==="gateway"?"-gateway":"",g=n.out?o.length>1?Ft.join(Ft.resolve(n.out),f+p):Ft.resolve(n.out):Ft.join(process.cwd(),"deploy-out",`${a.name}-${f}${p}`);ts.mkdirSync(g,{recursive:!0});let m=hS(i,g);if(m.length>0){let E=m.slice(0,3).join(", ");console.log(` ${lr.COLORS.yellow}\u26A0 ${m.length} broken symlink(s) skipped (not staged \u2014 the image would have no content for these). Sample: ${E}${m.length>3?", \u2026":""}${lr.COLORS.reset}`)}ts.mkdirSync(Ft.join(g,"deploy"),{recursive:!0});let h=(0,es.renderTarget)(f,u),w=[],_=[];for(let[E,O]of Object.entries(h)){let T=E===".dockerignore"?Ft.join(g,".dockerignore"):Ft.join(g,"deploy",E);if(ts.existsSync(T)&&!n.force){_.push(E);continue}ts.mkdirSync(Ft.dirname(T),{recursive:!0}),ts.writeFileSync(T,O),w.push(E)}console.log(`${lr.COLORS.green}\u2713${lr.COLORS.reset} ${f} \u2192 ${Ft.relative(process.cwd(),g)||"."}`);for(let E of w)console.log(` ${lr.COLORS.dim}+ ${E}${lr.COLORS.reset}`);for(let E of _)console.log(` ${lr.COLORS.yellow}\u2022 ${E} (exists; --force to overwrite)${lr.COLORS.reset}`)}c.length>0&&console.log(`
641
+ ${lr.COLORS.dim}Scanned pack secrets into .env.example: ${c.join(", ")}${lr.COLORS.reset}`),console.log("\nNext: cd into the staging dir above, `cp deploy/.env.example deploy/.env`, then run the command in deploy/README.md (scripts anchor themselves to the staging root)."),console.log(`${lr.COLORS.dim}Tip: run deploy init from the pack's parent directory \u2014 not from inside the pack (default deploy-out/ inside the pack copies into itself and fails).${lr.COLORS.reset}`)}});var _S=S(Ip=>{"use strict";Object.defineProperty(Ip,"__esModule",{value:!0});Ip.renderIdpArtifacts=UG;var DG=yp(),ES=vp();function LG(t){if(t.cookieDomain?.trim())return t.cookieDomain.trim();let e=t.hostname.split(".");return e.length>2?`.${e.slice(-2).join(".")}`:`.${t.hostname}`}function MG(){return["# Central IdP.","#","# ./run.sh","#","# Env split (matches `agenthippo deploy init`):","# ~/.agent-hippo/.env (+ optional ./.env) \u2014 hostname only","# ~/.agent-hippo/.env.auth (+ optional ./.env.auth) \u2014 JWT/OAuth; broker + oauth2-proxy ONLY","# Profiles: edge (SSO stack), tunnel (Cloudflare \u2192 Caddy)","# Org identity infra only \u2014 no agent runs here. Per-agent edges are generated separately","# by `agenthippo deploy init` and deployed on their own host/service.","services:"," oauth2-proxy:",' profiles: ["edge"]'," image: quay.io/oauth2-proxy/oauth2-proxy:v7.7.1"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," - path: ${HOME}/.agent-hippo/.env.auth"," required: false"," - path: .env.auth"," required: false"," environment:"," OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:4180"," OAUTH2_PROXY_UPSTREAMS: file:///dev/null",' OAUTH2_PROXY_SET_XAUTHREQUEST: "true"',' OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER: "true"',' OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true"',' OAUTH2_PROXY_REVERSE_PROXY: "true"'," # Absolute post-login redirects (rd=https://<host>/\u2026) are only honoured for whitelisted",' # hosts. The Caddyfile uses absolute rd so an IDE redirect_uri containing "//" inside'," # the authorize query is not rejected by the oauth2-proxy relative-URL validator."," OAUTH2_PROXY_WHITELIST_DOMAINS: ${OAUTH2_PROXY_WHITELIST_DOMAINS:-${AGENTHIPPO_PUBLIC_HOSTNAME}}",' expose: ["4180"]',""," auth-broker:",' profiles: ["edge"]'," build:"," context: ."," dockerfile: Dockerfile.auth-broker"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," - path: ${HOME}/.agent-hippo/.env.auth"," required: false"," - path: .env.auth"," required: false"," environment:",' AGENTHIPPO_AUTH_PORT: "9780"'," AGENTHIPPO_AUTH_DATA_DIR: /data"," # The broker now defaults to binding 127.0.0.1 and REFUSES a public bind unless told"," # otherwise. Here it must listen on the container interface, because Caddy reaches it"," # as `auth-broker:9780` over the compose network \u2014 a loopback bind makes it unreachable."," # Safe: the port is `expose`d, never published to the host, so the only thing that can"," # dial it is another service on this network.",' AGENTHIPPO_AUTH_BIND: "0.0.0.0"',' AGENTHIPPO_AUTH_ALLOW_PUBLIC_BIND: "1"'," # Shared secret proving an X-Auth-Request-Email came from THIS Caddy. Without it the"," # broker treats that header as unverified and 401s the forward_auth-gated routes."," # No default on purpose: compose FAILS to start rather than silently running with an"," # empty secret on both sides, which would accept every caller. Put it in ./.env.",' AGENTHIPPO_AUTH_PROXY_SECRET: "${AGENTHIPPO_AUTH_PROXY_SECRET:?set AGENTHIPPO_AUTH_PROXY_SECRET in .env (openssl rand -hex 32)}"'," # Proxy hops in front of the broker: 1 = Caddy only (edge profile), 2 = Cloudflare"," # Tunnel \u2192 Caddy (run.sh sets 2; at 1 the rate limiter would key every tunnel"," # client on cloudflared's IP \u2014 one shared bucket)."," AGENTHIPPO_XFF_TRUSTED_HOPS: ${AGENTHIPPO_XFF_TRUSTED_HOPS:-1}",' volumes: ["auth-broker-data:/data"]',' expose: ["9780"]',""," caddy:",' profiles: ["edge"]'," image: caddy:2.11-alpine"," env_file:"," - path: ${HOME}/.agent-hippo/.env"," required: false"," - path: .env"," required: false"," # With the tunnel profile, set AGENTHIPPO_CADDY_BIND=127.0.0.1 so a public-IP host"," # cannot be hit directly on 80/443, bypassing Cloudflare."," # Bare-metal / BYO nginx or ALB already on 80/443? Set AGENTHIPPO_CADDY_HTTP_PORT /"," # AGENTHIPPO_CADDY_HTTPS_PORT to alternate host ports and point your own reverse proxy"," # at them \u2014 the container still listens on 80 internally, only the host mapping moves."," ports:",' - "${AGENTHIPPO_CADDY_BIND:-0.0.0.0}:${AGENTHIPPO_CADDY_HTTP_PORT:-80}:80"',' - "${AGENTHIPPO_CADDY_BIND:-0.0.0.0}:${AGENTHIPPO_CADDY_HTTPS_PORT:-443}:443"'," environment:"," # Caddy stamps this on the two broker hops that forward a verified X-Auth-Request-Email"," # (/oauth/authorize, /oauth/browser-login). Same value the broker checks; same fail-closed"," # rule \u2014 compose refuses to start rather than send an empty secret.",' AGENTHIPPO_AUTH_PROXY_SECRET: "${AGENTHIPPO_AUTH_PROXY_SECRET:?set AGENTHIPPO_AUTH_PROXY_SECRET in .env (openssl rand -hex 32)}"'," volumes:"," - ./Caddyfile:/etc/caddy/Caddyfile:ro"," # Colocated agents (deploy init --colocate) drop a route snippet here \u2014 see Caddyfile."," - ./agents:/etc/caddy/agents:ro"," networks: [default, colocate]"," depends_on: [oauth2-proxy, auth-broker]",""," cloudflared:",' profiles: ["tunnel"]'," image: cloudflare/cloudflared:2024.12.2"," restart: unless-stopped"," command: tunnel --config /etc/cloudflared/config.yml run"," volumes:"," - ./cloudflared.yml:/etc/cloudflared/config.yml:ro"," # Set by run.sh from its argument (./run.sh /path/to/tunnel-credentials.json);"," # falls back to the conventional location for a direct `docker compose` invocation."," - ${AGENTHIPPO_TUNNEL_CREDENTIALS:-${HOME}/.agent-hippo/tunnel-credentials.json}:/etc/cloudflared/credentials.json:ro"," depends_on: [caddy]","","volumes:"," auth-broker-data:","","networks:"," default:",` # Stable, explicitly-named network (not the implicit "idp_default") so a colocated agent's`," # own compose project can join it reliably regardless of which directory `docker compose`"," # runs from. Only Caddy needs it \u2014 its per-agent snippets `reverse_proxy` straight to the"," # agent container by name; auth-broker is reached over the (already-shared) default network."," colocate:"," name: agenthippo-idp-colocate",""].join(`
623
642
  `)}function GG(){return["# SSO edge + Cloudflare Tunnel. Set AGENTHIPPO_PUBLIC_HOSTNAME in .env (Caddy reads it below).","# TLS terminates at Cloudflare; origin listens on HTTP only.","{"," auto_https off","}","","# Same-host colocation: agents deployed with `deploy init --ingress edge-fed --colocate`","# on THIS host ship a route snippet instead of their own Caddy/oauth2-proxy/auth-broker.","# Drop it in ./agents/<name>.caddy (mounted in docker-compose.yml) and","# `docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile` to pick it up \u2014","# no rebuild, no restart of the IdP itself.","import agents/*.caddy","","http://{$AGENTHIPPO_PUBLIC_HOSTNAME} {",...(0,DG.renderIdentityLayer)({mode:"self-issued",oauth2ProxyAddr:"oauth2-proxy:4180",authBrokerAddr:"auth-broker:9780",healthProxy:[" reverse_proxy auth-broker:9780"],agentProxy:[' respond "not_found" 404'],catchallBody:[' respond "AgentHippo IdP" 200']}),"}",""].join(`
624
643
  `)}function UG(t){let e=LG(t);return{"docker-compose.yml":MG(),"Dockerfile.auth-broker":(0,ES.renderAuthBrokerDockerfile)(),Caddyfile:GG(),".env.example":["# Caddy hostname for the central IdP. No agent runs on this stack \u2014 auth secrets:","# see .env.auth.example \u2192 ~/.agent-hippo/.env.auth (broker + oauth2-proxy only).","",`AGENTHIPPO_PUBLIC_HOSTNAME=${t.hostname}`,"","# REQUIRED. Shared secret between Caddy and auth-broker, proving that an","# X-Auth-Request-Email reached the broker through this Caddy rather than from a client","# that merely found the port. The broker 401s that header without a matching secret, and","# docker compose refuses to start if this is unset \u2014 an empty secret on both sides would","# accept everyone. It lives HERE (not .env.auth) because Caddy needs it too, and Caddy","# must not be handed the OAuth client secret or the JWT signing key.","# openssl rand -hex 32","AGENTHIPPO_AUTH_PROXY_SECRET=","","# Proxy hops / Caddy bind (optional; run.sh sets XFF hops=2 for tunnel)","# AGENTHIPPO_XFF_TRUSTED_HOPS=1","# AGENTHIPPO_CADDY_BIND=0.0.0.0","","# Bare metal / BYO nginx or ALB already on 80/443? Rebind Caddy to alternate host ports","# and point your reverse proxy at them (container still listens on 80 internally):","# AGENTHIPPO_CADDY_HTTP_PORT=8080","# AGENTHIPPO_CADDY_HTTPS_PORT=8443",""].join(`
625
644
  `),".env.auth.example":(0,ES.renderAuthEnvExample)({hostname:t.hostname,fed:!1,cookieDomain:e}),"cloudflared.yml.example":["# Copy to cloudflared.yml; the credentials JSON lives in ~/.agent-hippo/ (never in the repo).","# cloudflared tunnel create agenthippo-auth","# cp ~/.cloudflared/<tunnel-id>.json ~/.agent-hippo/tunnel-credentials.json",`# cloudflared tunnel route dns agenthippo-auth ${t.hostname}`,"tunnel: REPLACE_WITH_TUNNEL_ID","credentials-file: /etc/cloudflared/credentials.json","ingress:",` - hostname: ${t.hostname}`," service: http://caddy:80"," - service: http_status:404",""].join(`
626
645
  `),"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(`
627
646
  `),"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(`
628
647
  `),"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(`
629
- `)}}});var wS=S(Cs=>{"use strict";var HG=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]})),jG=Cs&&Cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yS=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"&&HG(n,e,r[s]);return jG(n,e),n}})();Object.defineProperty(Cs,"__esModule",{value:!0});Cs.idpCommand=BG;var Fl=yS(require("fs")),Oa=yS(require("path")),xG=_S(),Io=Xt();async function BG(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=Oa.resolve(e.out||"./enterprise-deploy/idp");Fl.mkdirSync(n,{recursive:!0});let r={hostname:e.hostname.trim(),cookieDomain:e.cookieDomain},s=(0,xG.renderIdpArtifacts)(r),i=[],o=[];for(let[a,c]of Object.entries(s)){let l=Oa.join(n,a);if(Fl.existsSync(l)&&!e.force){o.push(a);continue}Fl.mkdirSync(Oa.dirname(l),{recursive:!0}),Fl.writeFileSync(l,c),i.push(a)}console.log(`${Io.COLORS.green}\u2713${Io.COLORS.reset} idp \u2192 ${Oa.relative(process.cwd(),n)||"."}`);for(let a of i)console.log(` ${Io.COLORS.dim}+ ${a}${Io.COLORS.reset}`);for(let a of o)console.log(` ${Io.COLORS.yellow}\u2022 ${a} (exists; --force to overwrite)${Io.COLORS.reset}`);console.log(`Next: cd ${Oa.relative(process.cwd(),n)||"."}, cp .env.example ~/.agent-hippo/.env, cp .env.auth.example ~/.agent-hippo/.env.auth (fill in), then ./run.sh`)}});var TS=S(Np=>{"use strict";Object.defineProperty(Np,"__esModule",{value:!0});Np.grantsCommand=FG;var SS=Ni(),AS=Xt();function Vl(t){console.error(`${AS.COLORS.red}Error:${AS.COLORS.reset} ${t}`),process.exit(1)}async function FG(t,e){let n;try{n=new SS.StoredGrantProvider((0,SS.readStoredGrantConfig)(process.env))}catch(r){Vl(r instanceof Error?r.message:String(r))}if(t==="list"){let r=await n.cfg.store.list();console.log(JSON.stringify(r.map(s=>"error"in s?s:{user:s.userId,google:s.grants.google?{email:s.grants.google.email,scopes:s.grants.google.scopes,connected_at:s.grants.google.connectedAt}:null,banks:(s.grants.plaid?.items??[]).map(i=>({institution:i.institution,item_id:i.itemId,env:i.env,connected_at:i.connectedAt,...i.replacedBy?{replaced_by:i.replacedBy}:{}}))}),null,2));return}if(t==="revoke"){let r=e.user?.trim();r||Vl("revoke needs --user <verified user id>"),e.service&&e.service!=="google"&&e.service!=="bank"&&Vl("--service must be google or bank");let s=e.service?[e.service]:["google","bank"],i={};for(let o of s)try{i[o]=await n.revoke(r,o,o==="bank"?e.bank:void 0)}catch(a){i[o]={ok:!1,disconnected:[],failed:[{error:a instanceof Error?a.message:String(a)}]}}console.log(JSON.stringify(i,null,2)),Object.values(i).some(o=>!o.ok)&&(process.exitCode=1);return}Vl(`unknown action "${t}" (use: list | revoke --user <id> [--service google|bank] [--bank <name>])`)}});var kp=S(Vn=>{"use strict";var VG=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]})),WG=Vn&&Vn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),KG=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"&&VG(n,e,r[s]);return WG(n,e),n}})();Object.defineProperty(Vn,"__esModule",{value:!0});Vn.discoverPublishableEngines=OS;Vn.resolveEngineSourceDir=nU;Vn.validateEngineForPublish=rU;Vn.collectEngineFiles=sU;Vn.isValidPublishVersion=iU;var qG=require("child_process"),ei=require("fs"),Fn=KG(require("path")),YG=require("util"),JG=et(),Ui=on(),XG=ac(),zG=(0,YG.promisify)(qG.execFile),Wl="engine.manifest.json",QG=new Set([".git",".hg",".svn",".DS_Store","node_modules","dist","coverage",".turbo",".cache",".pnpm-store","Thumbs.db"]),ZG=[["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 bS(t){return!!(QG.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function Rp(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")||Fn.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 vS(t){let e=Fn.join(t,Wl),n=await ei.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=Rp(r.entry),i=Fn.join(t,s);if(!await(0,Ui.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"&&Rp(o.dir),typeof o.rulesFile=="string"&&Rp(o.rulesFile))}return{manifest:r,manifestPath:e,entryPath:i}}async function Cp(t,e=""){let n=Fn.join(t,e),r=await ei.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(bS(i.name))continue;let o=e?Fn.join(e,i.name):i.name,a=Fn.join(t,o);i.isDirectory()?s.push(...await Cp(t,o)):i.isFile()&&s.push({rel:o.replace(/\\/g,"/"),abs:a})}return s}async function eU(t){let e=[];for(let n of t){if((await ei.promises.stat(n.abs)).size>5*1024*1024)continue;let s=await ei.promises.readFile(n.abs);if(s.includes(0))continue;let i=s.toString("utf8");for(let[o,a]of ZG)a.test(i)&&e.push(`${n.rel}: ${o}`)}return e}async function tU(t){let e=Fn.join(t,"package.json");if(await(0,Ui.pathExists)(e))try{let n=JSON.parse(await ei.promises.readFile(e,"utf-8"));if(n.version&&/^\d+\.\d+\.\d+/.test(n.version))return n.version}catch{return}}async function OS(t){let e=[];t?.trim()&&e.push({root:Fn.join(Fn.resolve(t),JG.AGENTIDE_DIR_NAME,"engines"),label:"workspace"}),e.push({root:(0,XG.getDefaultCustomEnginesInstallRoot)(),label:"home"});let n=new Map;for(let{root:r,label:s}of e){if(!await(0,Ui.pathExists)(r))continue;let i=await ei.promises.readdir(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||bS(o.name))continue;let a=Fn.join(r,o.name),c=Fn.join(a,Wl);if(await(0,Ui.pathExists)(c))try{let{manifest:l}=await vS(a),d=l.id;if(n.has(d))continue;n.set(d,{id:d,displayName:typeof l.displayName=="string"?l.displayName:d,sourceDir:a,sourceLabel:s})}catch{}}}return[...n.values()].sort((r,s)=>r.id.localeCompare(s.id))}async function nU(t,e){return(await OS(e)).find(r=>r.id===t)?.sourceDir}async function rU(t,e){let n=[],r=[];if(!await(0,Ui.pathExists)(t))return{valid:!1,errors:[`Engine directory not found: ${t}`],warnings:r};let s,i;try{({manifest:s,entryPath:i}=await vS(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=Fn.join(t,"package.json");await(0,Ui.pathExists)(a)&&!await(0,Ui.pathExists)(Fn.join(t,"package-lock.json"))&&n.push("package.json present but package-lock.json is missing");let c=await Cp(t);c.some(u=>u.rel===Wl)||n.push(`Missing ${Wl} in publishable files`);let l=await eU(c);l.length>0&&n.push(`Possible secrets found:
648
+ `)}}});var wS=S(Cs=>{"use strict";var HG=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]})),jG=Cs&&Cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yS=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"&&HG(n,e,r[s]);return jG(n,e),n}})();Object.defineProperty(Cs,"__esModule",{value:!0});Cs.idpCommand=BG;var Fl=yS(require("fs")),Oa=yS(require("path")),xG=_S(),Po=Xt();async function BG(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=Oa.resolve(e.out||"./enterprise-deploy/idp");Fl.mkdirSync(n,{recursive:!0});let r={hostname:e.hostname.trim(),cookieDomain:e.cookieDomain},s=(0,xG.renderIdpArtifacts)(r),i=[],o=[];for(let[a,c]of Object.entries(s)){let l=Oa.join(n,a);if(Fl.existsSync(l)&&!e.force){o.push(a);continue}Fl.mkdirSync(Oa.dirname(l),{recursive:!0}),Fl.writeFileSync(l,c),i.push(a)}console.log(`${Po.COLORS.green}\u2713${Po.COLORS.reset} idp \u2192 ${Oa.relative(process.cwd(),n)||"."}`);for(let a of i)console.log(` ${Po.COLORS.dim}+ ${a}${Po.COLORS.reset}`);for(let a of o)console.log(` ${Po.COLORS.yellow}\u2022 ${a} (exists; --force to overwrite)${Po.COLORS.reset}`);console.log(`Next: cd ${Oa.relative(process.cwd(),n)||"."}, cp .env.example ~/.agent-hippo/.env, cp .env.auth.example ~/.agent-hippo/.env.auth (fill in), then ./run.sh`)}});var TS=S(Np=>{"use strict";Object.defineProperty(Np,"__esModule",{value:!0});Np.grantsCommand=FG;var SS=Ni(),AS=Xt();function Vl(t){console.error(`${AS.COLORS.red}Error:${AS.COLORS.reset} ${t}`),process.exit(1)}async function FG(t,e){let n;try{n=new SS.StoredGrantProvider((0,SS.readStoredGrantConfig)(process.env))}catch(r){Vl(r instanceof Error?r.message:String(r))}if(t==="list"){let r=await n.cfg.store.list();console.log(JSON.stringify(r.map(s=>"error"in s?s:{user:s.userId,google:s.grants.google?{email:s.grants.google.email,scopes:s.grants.google.scopes,connected_at:s.grants.google.connectedAt}:null,banks:(s.grants.plaid?.items??[]).map(i=>({institution:i.institution,item_id:i.itemId,env:i.env,connected_at:i.connectedAt,...i.replacedBy?{replaced_by:i.replacedBy}:{}}))}),null,2));return}if(t==="revoke"){let r=e.user?.trim();r||Vl("revoke needs --user <verified user id>"),e.service&&e.service!=="google"&&e.service!=="bank"&&Vl("--service must be google or bank");let s=e.service?[e.service]:["google","bank"],i={};for(let o of s)try{i[o]=await n.revoke(r,o,o==="bank"?e.bank:void 0)}catch(a){i[o]={ok:!1,disconnected:[],failed:[{error:a instanceof Error?a.message:String(a)}]}}console.log(JSON.stringify(i,null,2)),Object.values(i).some(o=>!o.ok)&&(process.exitCode=1);return}Vl(`unknown action "${t}" (use: list | revoke --user <id> [--service google|bank] [--bank <name>])`)}});var kp=S(Vn=>{"use strict";var VG=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]})),WG=Vn&&Vn.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),KG=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"&&VG(n,e,r[s]);return WG(n,e),n}})();Object.defineProperty(Vn,"__esModule",{value:!0});Vn.discoverPublishableEngines=OS;Vn.resolveEngineSourceDir=nU;Vn.validateEngineForPublish=rU;Vn.collectEngineFiles=sU;Vn.isValidPublishVersion=iU;var qG=require("child_process"),ei=require("fs"),Fn=KG(require("path")),YG=require("util"),JG=et(),Ui=on(),XG=ac(),zG=(0,YG.promisify)(qG.execFile),Wl="engine.manifest.json",QG=new Set([".git",".hg",".svn",".DS_Store","node_modules","dist","coverage",".turbo",".cache",".pnpm-store","Thumbs.db"]),ZG=[["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 bS(t){return!!(QG.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function Rp(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")||Fn.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 vS(t){let e=Fn.join(t,Wl),n=await ei.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=Rp(r.entry),i=Fn.join(t,s);if(!await(0,Ui.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"&&Rp(o.dir),typeof o.rulesFile=="string"&&Rp(o.rulesFile))}return{manifest:r,manifestPath:e,entryPath:i}}async function Cp(t,e=""){let n=Fn.join(t,e),r=await ei.promises.readdir(n,{withFileTypes:!0}),s=[];for(let i of r){if(bS(i.name))continue;let o=e?Fn.join(e,i.name):i.name,a=Fn.join(t,o);i.isDirectory()?s.push(...await Cp(t,o)):i.isFile()&&s.push({rel:o.replace(/\\/g,"/"),abs:a})}return s}async function eU(t){let e=[];for(let n of t){if((await ei.promises.stat(n.abs)).size>5*1024*1024)continue;let s=await ei.promises.readFile(n.abs);if(s.includes(0))continue;let i=s.toString("utf8");for(let[o,a]of ZG)a.test(i)&&e.push(`${n.rel}: ${o}`)}return e}async function tU(t){let e=Fn.join(t,"package.json");if(await(0,Ui.pathExists)(e))try{let n=JSON.parse(await ei.promises.readFile(e,"utf-8"));if(n.version&&/^\d+\.\d+\.\d+/.test(n.version))return n.version}catch{return}}async function OS(t){let e=[];t?.trim()&&e.push({root:Fn.join(Fn.resolve(t),JG.AGENTIDE_DIR_NAME,"engines"),label:"workspace"}),e.push({root:(0,XG.getDefaultCustomEnginesInstallRoot)(),label:"home"});let n=new Map;for(let{root:r,label:s}of e){if(!await(0,Ui.pathExists)(r))continue;let i=await ei.promises.readdir(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory()||bS(o.name))continue;let a=Fn.join(r,o.name),c=Fn.join(a,Wl);if(await(0,Ui.pathExists)(c))try{let{manifest:l}=await vS(a),d=l.id;if(n.has(d))continue;n.set(d,{id:d,displayName:typeof l.displayName=="string"?l.displayName:d,sourceDir:a,sourceLabel:s})}catch{}}}return[...n.values()].sort((r,s)=>r.id.localeCompare(s.id))}async function nU(t,e){return(await OS(e)).find(r=>r.id===t)?.sourceDir}async function rU(t,e){let n=[],r=[];if(!await(0,Ui.pathExists)(t))return{valid:!1,errors:[`Engine directory not found: ${t}`],warnings:r};let s,i;try{({manifest:s,entryPath:i}=await vS(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=Fn.join(t,"package.json");await(0,Ui.pathExists)(a)&&!await(0,Ui.pathExists)(Fn.join(t,"package-lock.json"))&&n.push("package.json present but package-lock.json is missing");let c=await Cp(t);c.some(u=>u.rel===Wl)||n.push(`Missing ${Wl} in publishable files`);let l=await eU(c);l.length>0&&n.push(`Possible secrets found:
630
649
  ${l.map(u=>` - ${u}`).join(`
631
- `)}`);try{await zG(process.execPath,["--check",i],{windowsHide:!0})}catch(u){let f=u instanceof Error?u.message:String(u);n.push(`engine entry failed node --check: ${f}`)}s.description||r.push("Consider adding description to engine.manifest.json");let d=await tU(t);return d||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:d}:void 0}}async function sU(t){let e=await Cp(t),n=[];for(let r of e){if((await ei.promises.stat(r.abs)).size>5*1024*1024)throw new Error(`File too large to publish (>5MB): ${r.rel}`);let i=await ei.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 iU(t){return/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t.trim())}});var kS=S(Ie=>{"use strict";Object.defineProperty(Ie,"__esModule",{value:!0});Ie.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE=Ie.VIEW_EXPORT_SNAPSHOT_MESSAGE=Ie.WORKFLOWS_SIDECAR_SCRIPTS=Ie.WORKFLOWS_RUN_SCRIPT=Ie.WORKFLOWS_VIEW_ID=Ie.FLEET_WIDGET_SCRIPT=void 0;Ie.createDefaultWorkflowsView=IS;Ie.viewRunsFleetWidget=PS;Ie.resolveRefreshOnNavigate=Lp;Ie.resolveGalleryLayout=NS;Ie.resolvePreserveFleetIframe=RS;Ie.shouldPreserveFleetIframe=aU;Ie.buildViewExportSnapshotMessages=lU;Ie.shouldRunScriptsOnNavigation=uU;Ie.normalizeDashboardViewId=Ia;Ie.formatDisplayNameForAllocatedViewId=dU;Ie.createDefaultDashboardViewsConfig=CS;Ie.resolveMergedActiveViewId=Dp;Ie.mergeDashboardViewsConfigs=fU;Ie.FLEET_WIDGET_SCRIPT="agent-fleet-widget.js";Ie.WORKFLOWS_VIEW_ID="workflows";Ie.WORKFLOWS_RUN_SCRIPT="workflows-widget.cjs";Ie.WORKFLOWS_SIDECAR_SCRIPTS=["workflows-collector.cjs","workflows-daemon.mjs","fleet-workflow.sh"];function IS(){return{id:Ie.WORKFLOWS_VIEW_ID,name:"Workflows",scope:"global",scripts:[Ie.WORKFLOWS_RUN_SCRIPT],bundledScripts:Ie.WORKFLOWS_SIDECAR_SCRIPTS,system:!0,refreshOnNavigate:"always",layout:"fleet-dashboard",preserveFleetIframe:!0}}Ie.VIEW_EXPORT_SNAPSHOT_MESSAGE="viewExportSnapshot";Ie.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE="requestViewExportSnapshot";function oU(t){return t.trim().replace(/^.*[/\\]/,"").toLowerCase()}function PS(t){return t.scripts.some(e=>oU(e)===Ie.FLEET_WIDGET_SCRIPT)}function Lp(t){return t.refreshOnNavigate==="always"||t.refreshOnNavigate==="when-empty"?t.refreshOnNavigate:PS(t)?"always":"when-empty"}function NS(t){return t.layout==="fleet-dashboard"||t.layout==="gallery"?t.layout:Lp(t)==="always"?"fleet-dashboard":"gallery"}function RS(t){return t.preserveFleetIframe===!1?!1:t.preserveFleetIframe===!0?!0:NS(t)==="fleet-dashboard"}function aU(t){return RS(t)}var cU=192*1024,$p=100;function lU(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<=cU)return[{payload:t,meta:n}];let s={...t,sessions:[]},i=Math.max(1,Math.ceil(e.length/$p)),o=`${Date.now()}-${e.length}-${r}`,a=[];for(let c=0;c<i;c+=1)a.push({payload:{...s,sessions:e.slice(c*$p,(c+1)*$p)},meta:{...n,chunkedSessions:!0,chunkIndex:c,chunkCount:i,snapshotId:o}});return a}function uU(t,e){return Lp(t)==="always"?!0:!e.some(n=>n==="chart")}function Ia(t,e="global"){return(t??e).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||e}function dU(t,e,n=Ia){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 CS(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},IS()]}}function Dp(t,e,n,r){let s=r?.preferWorkspaceScopeFallback===!0,i=e?Ia(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 fU(t,e,n=CS()){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=Ia(e.activeViewId,n.activeViewId);return{activeViewId:Dp(i,a,n,{preferWorkspaceScopeFallback:!0}),views:i}}let o=Ia(r.activeViewId,n.activeViewId);return{activeViewId:Dp(i,o,n,{preferWorkspaceScopeFallback:!1}),views:i}}});var Mp=S(Pa=>{"use strict";Object.defineProperty(Pa,"__esModule",{value:!0});Pa.normalizeSpotlightViewId=gU;Pa.parseSpotlightYamlRecord=hU;Pa.dumpSpotlightYaml=mU;var pU=kS();function gU(t,e="view"){return(0,pU.normalizeDashboardViewId)(t,e)}function hU(t){let n=require("js-yaml").load(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function mU(t){return require("js-yaml").dump(t,{lineWidth:120,noRefs:!0})}});var jp=S(ur=>{"use strict";var EU=ur&&ur.__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]})),_U=ur&&ur.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yU=ur&&ur.__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"&&EU(n,e,r[s]);return _U(n,e),n}})();Object.defineProperty(ur,"__esModule",{value:!0});ur.resolveViewPublishVersionFromParsed=$S;ur.discoverPublishableViews=DU;ur.validateViewForPublish=LU;ur.collectViewFiles=MU;var ks=require("fs"),Dt=yU(require("path")),wU=et(),Up=kp(),rs=on(),SU=Xo(),Po=Mp();function $S(t){if(t){if(typeof t.version=="string"&&t.version.trim()){let e=t.version.trim().replace(/^v/,"");if((0,Up.isValidPublishVersion)(e))return e}if(typeof t.semver=="string"&&t.semver.trim()){let e=t.semver.trim().replace(/^v/,"");if((0,Up.isValidPublishVersion)(e))return e}}}var DS=new Set(["global","workspace","fleet","workflows","default"]),LS="view.yaml",AU="panel-entry.yaml",TU=new Set(["charts","reports","exports","panel-state","assets","images"]),MS=["assets","images","charts","reports","exports"],Hp="manifest.json",bU=new Set([".png",".jpg",".jpeg",".gif",".webp",".pdf",".ico",".woff",".woff2"]),vU=new Set([...TU,"node_modules",".git",".hg",".svn",".DS_Store","__pycache__",".turbo",".cache"]),GS=new Set([".DS_Store","Thumbs.db"]),OU=[["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/]],IU=1024*1024,PU=10*1024*1024;function US(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Dt.basename(e.trim())):[]}function Kl(t){let e=new Set,n=[];for(let r of t){let s=Dt.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function NU(t){let e=[];return t?.trim()&&e.push({root:Dt.join(t.trim(),wU.AGENTIDE_DIR_NAME,"analytics"),label:"workspace"}),e.push({root:Dt.join((0,SU.getAgentideHome)(),"analytics"),label:"home"}),e}function RU(t){return Dt.join(t,"panel","views.yaml")}async function CU(t){try{let e=await ks.promises.readFile(t,"utf-8"),n=(0,Po.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,Po.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,d=Kl(US(o.scripts)),u=o.system===!0;s.push({id:a,name:l,scope:c,scripts:d,system:u})}return s}catch{return[]}}async function HS(t){let e=Dt.join(t,LS);try{let n=await ks.promises.readFile(e,"utf-8"),r=(0,Po.parseSpotlightYamlRecord)(n);if(!r)return;let s=(0,Po.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:$S(r),scope:i,tags:Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):void 0,scripts:Kl(US(r.scripts))}}catch{return}}async function kU(t){let e=[];for(let n of t)for(let[r,s]of OU)s.test(n.content)&&e.push(`${n.rel}: possible ${r}`);return e}function jS(t,e){return!!(GS.has(t)||t.startsWith(".")&&t!=="."||e&&vU.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function xS(t,e){return!!(GS.has(t)||t.startsWith(".")||e&&(t==="node_modules"||t==="__pycache__")||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function BS(t){let e=Dt.extname(t).toLowerCase();return bU.has(e)}async function Gp(t,e){let n=await ks.promises.readFile(t);return n.includes(0)||BS(e)?{path:e,content:n.toString("base64"),encoding:"base64"}:{path:e,content:n.toString("utf-8"),encoding:"utf-8"}}async function $U(t){let e=0;for(let n of MS){let r=Dt.join(t,n);if(!await(0,rs.pathExists)(r))continue;async function s(i){let o=await ks.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(xS(a.name,a.isDirectory()))continue;let c=Dt.join(i,a.name);if(a.isDirectory()){await s(c);continue}e++}}await s(r)}return await(0,rs.pathExists)(Dt.join(t,Hp))&&e++,e}async function FS(t,e){for(let r of MS){let s=Dt.join(t,r);await(0,rs.pathExists)(s)&&await ql(s,r,xS,e)}let n=Dt.join(t,Hp);if(await(0,rs.pathExists)(n)){let r=await ks.promises.stat(n);await e(n,Hp,r.size)}}async function ql(t,e,n,r){let s=await ks.promises.readdir(t,{withFileTypes:!0});for(let i of s){if(n(i.name,i.isDirectory()))continue;let o=Dt.join(t,i.name),a=e?`${e}/${i.name}`:i.name;if(i.isDirectory()){await ql(o,a,n,r);continue}let c=await ks.promises.stat(o);await r(o,a,c.size)}}async function DU(t){let e=new Map;for(let{root:n,label:r}of NU(t)){let s=RU(n);if(!await(0,rs.pathExists)(s))continue;let i=await CU(s);for(let o of i){if(o.system||DS.has(o.id)||e.has(o.id))continue;let a=Dt.join(n,"views",o.id),c=await HS(a),l=Kl(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 LU(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}"`),DS.has(t.id)&&s.push(`View id "${t.id}" is reserved for built-in Spotlight views`),!await(0,rs.pathExists)(t.viewRoot))return s.push(`View directory not found: ${t.viewRoot}`),{valid:!1,errors:s,warnings:i};let o=await HS(t.viewRoot),a=Kl(o?.scripts.length?o.scripts:t.scripts),c=n==="full"?await $U(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=Dt.join(t.viewRoot,"scripts");for(let m of a){let h=Dt.join(l,m);await(0,rs.pathExists)(h)||s.push(`Missing script file: scripts/${m}`)}let d=[],u=0;async function f(m,h,w){if(w===void 0&&(w=(await ks.promises.stat(m)).size),w>IU){s.push(`File too large (>1MB): ${h}`);return}if(u+=w,u>PU){s.push("Total bundle size exceeds 10MB");return}if(BS(h))return;let _=await ks.promises.readFile(m);d.push({rel:h,content:_.toString("utf-8")})}await(0,rs.pathExists)(l)&&await ql(l,"scripts",jS,f),n==="full"&&await FS(t.viewRoot,f);let p=await kU(d);p.length>0&&s.push(`Possible secrets found:
650
+ `)}`);try{await zG(process.execPath,["--check",i],{windowsHide:!0})}catch(u){let f=u instanceof Error?u.message:String(u);n.push(`engine entry failed node --check: ${f}`)}s.description||r.push("Consider adding description to engine.manifest.json");let d=await tU(t);return d||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:d}:void 0}}async function sU(t){let e=await Cp(t),n=[];for(let r of e){if((await ei.promises.stat(r.abs)).size>5*1024*1024)throw new Error(`File too large to publish (>5MB): ${r.rel}`);let i=await ei.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 iU(t){return/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t.trim())}});var kS=S(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0});Pe.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE=Pe.VIEW_EXPORT_SNAPSHOT_MESSAGE=Pe.WORKFLOWS_SIDECAR_SCRIPTS=Pe.WORKFLOWS_RUN_SCRIPT=Pe.WORKFLOWS_VIEW_ID=Pe.FLEET_WIDGET_SCRIPT=void 0;Pe.createDefaultWorkflowsView=PS;Pe.viewRunsFleetWidget=IS;Pe.resolveRefreshOnNavigate=Lp;Pe.resolveGalleryLayout=NS;Pe.resolvePreserveFleetIframe=RS;Pe.shouldPreserveFleetIframe=aU;Pe.buildViewExportSnapshotMessages=lU;Pe.shouldRunScriptsOnNavigation=uU;Pe.normalizeDashboardViewId=Pa;Pe.formatDisplayNameForAllocatedViewId=dU;Pe.createDefaultDashboardViewsConfig=CS;Pe.resolveMergedActiveViewId=Dp;Pe.mergeDashboardViewsConfigs=fU;Pe.FLEET_WIDGET_SCRIPT="agent-fleet-widget.js";Pe.WORKFLOWS_VIEW_ID="workflows";Pe.WORKFLOWS_RUN_SCRIPT="workflows-widget.cjs";Pe.WORKFLOWS_SIDECAR_SCRIPTS=["workflows-collector.cjs","workflows-daemon.mjs","fleet-workflow.sh"];function PS(){return{id:Pe.WORKFLOWS_VIEW_ID,name:"Workflows",scope:"global",scripts:[Pe.WORKFLOWS_RUN_SCRIPT],bundledScripts:Pe.WORKFLOWS_SIDECAR_SCRIPTS,system:!0,refreshOnNavigate:"always",layout:"fleet-dashboard",preserveFleetIframe:!0}}Pe.VIEW_EXPORT_SNAPSHOT_MESSAGE="viewExportSnapshot";Pe.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE="requestViewExportSnapshot";function oU(t){return t.trim().replace(/^.*[/\\]/,"").toLowerCase()}function IS(t){return t.scripts.some(e=>oU(e)===Pe.FLEET_WIDGET_SCRIPT)}function Lp(t){return t.refreshOnNavigate==="always"||t.refreshOnNavigate==="when-empty"?t.refreshOnNavigate:IS(t)?"always":"when-empty"}function NS(t){return t.layout==="fleet-dashboard"||t.layout==="gallery"?t.layout:Lp(t)==="always"?"fleet-dashboard":"gallery"}function RS(t){return t.preserveFleetIframe===!1?!1:t.preserveFleetIframe===!0?!0:NS(t)==="fleet-dashboard"}function aU(t){return RS(t)}var cU=192*1024,$p=100;function lU(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<=cU)return[{payload:t,meta:n}];let s={...t,sessions:[]},i=Math.max(1,Math.ceil(e.length/$p)),o=`${Date.now()}-${e.length}-${r}`,a=[];for(let c=0;c<i;c+=1)a.push({payload:{...s,sessions:e.slice(c*$p,(c+1)*$p)},meta:{...n,chunkedSessions:!0,chunkIndex:c,chunkCount:i,snapshotId:o}});return a}function uU(t,e){return Lp(t)==="always"?!0:!e.some(n=>n==="chart")}function Pa(t,e="global"){return(t??e).trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||e}function dU(t,e,n=Pa){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 CS(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},PS()]}}function Dp(t,e,n,r){let s=r?.preferWorkspaceScopeFallback===!0,i=e?Pa(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 fU(t,e,n=CS()){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=Pa(e.activeViewId,n.activeViewId);return{activeViewId:Dp(i,a,n,{preferWorkspaceScopeFallback:!0}),views:i}}let o=Pa(r.activeViewId,n.activeViewId);return{activeViewId:Dp(i,o,n,{preferWorkspaceScopeFallback:!1}),views:i}}});var Mp=S(Ia=>{"use strict";Object.defineProperty(Ia,"__esModule",{value:!0});Ia.normalizeSpotlightViewId=gU;Ia.parseSpotlightYamlRecord=hU;Ia.dumpSpotlightYaml=mU;var pU=kS();function gU(t,e="view"){return(0,pU.normalizeDashboardViewId)(t,e)}function hU(t){let n=require("js-yaml").load(t);return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function mU(t){return require("js-yaml").dump(t,{lineWidth:120,noRefs:!0})}});var jp=S(ur=>{"use strict";var EU=ur&&ur.__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]})),_U=ur&&ur.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),yU=ur&&ur.__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"&&EU(n,e,r[s]);return _U(n,e),n}})();Object.defineProperty(ur,"__esModule",{value:!0});ur.resolveViewPublishVersionFromParsed=$S;ur.discoverPublishableViews=DU;ur.validateViewForPublish=LU;ur.collectViewFiles=MU;var ks=require("fs"),Dt=yU(require("path")),wU=et(),Up=kp(),rs=on(),SU=Xo(),Io=Mp();function $S(t){if(t){if(typeof t.version=="string"&&t.version.trim()){let e=t.version.trim().replace(/^v/,"");if((0,Up.isValidPublishVersion)(e))return e}if(typeof t.semver=="string"&&t.semver.trim()){let e=t.semver.trim().replace(/^v/,"");if((0,Up.isValidPublishVersion)(e))return e}}}var DS=new Set(["global","workspace","fleet","workflows","default"]),LS="view.yaml",AU="panel-entry.yaml",TU=new Set(["charts","reports","exports","panel-state","assets","images"]),MS=["assets","images","charts","reports","exports"],Hp="manifest.json",bU=new Set([".png",".jpg",".jpeg",".gif",".webp",".pdf",".ico",".woff",".woff2"]),vU=new Set([...TU,"node_modules",".git",".hg",".svn",".DS_Store","__pycache__",".turbo",".cache"]),GS=new Set([".DS_Store","Thumbs.db"]),OU=[["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/]],PU=1024*1024,IU=10*1024*1024;function US(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Dt.basename(e.trim())):[]}function Kl(t){let e=new Set,n=[];for(let r of t){let s=Dt.basename(r.trim());!s||e.has(s)||(e.add(s),n.push(s))}return n}function NU(t){let e=[];return t?.trim()&&e.push({root:Dt.join(t.trim(),wU.AGENTIDE_DIR_NAME,"analytics"),label:"workspace"}),e.push({root:Dt.join((0,SU.getAgentideHome)(),"analytics"),label:"home"}),e}function RU(t){return Dt.join(t,"panel","views.yaml")}async function CU(t){try{let e=await ks.promises.readFile(t,"utf-8"),n=(0,Io.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,Io.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,d=Kl(US(o.scripts)),u=o.system===!0;s.push({id:a,name:l,scope:c,scripts:d,system:u})}return s}catch{return[]}}async function HS(t){let e=Dt.join(t,LS);try{let n=await ks.promises.readFile(e,"utf-8"),r=(0,Io.parseSpotlightYamlRecord)(n);if(!r)return;let s=(0,Io.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:$S(r),scope:i,tags:Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):void 0,scripts:Kl(US(r.scripts))}}catch{return}}async function kU(t){let e=[];for(let n of t)for(let[r,s]of OU)s.test(n.content)&&e.push(`${n.rel}: possible ${r}`);return e}function jS(t,e){return!!(GS.has(t)||t.startsWith(".")&&t!=="."||e&&vU.has(t)||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function xS(t,e){return!!(GS.has(t)||t.startsWith(".")||e&&(t==="node_modules"||t==="__pycache__")||/^\.env(?:\.|$)/.test(t)||/\.log$/i.test(t))}function BS(t){let e=Dt.extname(t).toLowerCase();return bU.has(e)}async function Gp(t,e){let n=await ks.promises.readFile(t);return n.includes(0)||BS(e)?{path:e,content:n.toString("base64"),encoding:"base64"}:{path:e,content:n.toString("utf-8"),encoding:"utf-8"}}async function $U(t){let e=0;for(let n of MS){let r=Dt.join(t,n);if(!await(0,rs.pathExists)(r))continue;async function s(i){let o=await ks.promises.readdir(i,{withFileTypes:!0});for(let a of o){if(xS(a.name,a.isDirectory()))continue;let c=Dt.join(i,a.name);if(a.isDirectory()){await s(c);continue}e++}}await s(r)}return await(0,rs.pathExists)(Dt.join(t,Hp))&&e++,e}async function FS(t,e){for(let r of MS){let s=Dt.join(t,r);await(0,rs.pathExists)(s)&&await ql(s,r,xS,e)}let n=Dt.join(t,Hp);if(await(0,rs.pathExists)(n)){let r=await ks.promises.stat(n);await e(n,Hp,r.size)}}async function ql(t,e,n,r){let s=await ks.promises.readdir(t,{withFileTypes:!0});for(let i of s){if(n(i.name,i.isDirectory()))continue;let o=Dt.join(t,i.name),a=e?`${e}/${i.name}`:i.name;if(i.isDirectory()){await ql(o,a,n,r);continue}let c=await ks.promises.stat(o);await r(o,a,c.size)}}async function DU(t){let e=new Map;for(let{root:n,label:r}of NU(t)){let s=RU(n);if(!await(0,rs.pathExists)(s))continue;let i=await CU(s);for(let o of i){if(o.system||DS.has(o.id)||e.has(o.id))continue;let a=Dt.join(n,"views",o.id),c=await HS(a),l=Kl(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 LU(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}"`),DS.has(t.id)&&s.push(`View id "${t.id}" is reserved for built-in Spotlight views`),!await(0,rs.pathExists)(t.viewRoot))return s.push(`View directory not found: ${t.viewRoot}`),{valid:!1,errors:s,warnings:i};let o=await HS(t.viewRoot),a=Kl(o?.scripts.length?o.scripts:t.scripts),c=n==="full"?await $U(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=Dt.join(t.viewRoot,"scripts");for(let m of a){let h=Dt.join(l,m);await(0,rs.pathExists)(h)||s.push(`Missing script file: scripts/${m}`)}let d=[],u=0;async function f(m,h,w){if(w===void 0&&(w=(await ks.promises.stat(m)).size),w>PU){s.push(`File too large (>1MB): ${h}`);return}if(u+=w,u>IU){s.push("Total bundle size exceeds 10MB");return}if(BS(h))return;let _=await ks.promises.readFile(m);d.push({rel:h,content:_.toString("utf-8")})}await(0,rs.pathExists)(l)&&await ql(l,"scripts",jS,f),n==="full"&&await FS(t.viewRoot,f);let p=await kU(d);p.length>0&&s.push(`Possible secrets found:
632
651
  ${p.map(m=>` - ${m}`).join(`
633
- `)}`);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 MU(t,e,n,r="scripts-only"){if(!(0,Up.isValidPublishVersion)(e.replace(/^v/,"")))throw new Error(`Invalid publish version: ${e}`);let s=[],i=Dt.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:LS,content:(0,Po.dumpSpotlightYaml)(a),encoding:"utf-8"}),s.push({path:AU,content:(0,Po.dumpSpotlightYaml)({id:t.id,name:n.name,scope:n.scope,scripts:n.scripts}),encoding:"utf-8"});let c=Dt.join(t.viewRoot,"README.md");return await(0,rs.pathExists)(c)&&s.push(await Gp(c,"README.md")),await(0,rs.pathExists)(i)&&await ql(i,"scripts",jS,async(l,d)=>{s.push(await Gp(l,d))}),r==="full"&&await FS(t.viewRoot,async(l,d)=>{s.push(await Gp(l,d))}),s}});var WS=S(dr=>{"use strict";var GU=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]})),UU=dr&&dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),HU=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"&&GU(n,e,r[s]);return UU(n,e),n}})();Object.defineProperty(dr,"__esModule",{value:!0});dr.installSpotlightViewFromFiles=FU;dr.listInstalledSpotlightViews=VU;dr.setActiveSpotlightView=WU;dr.isSpotlightViewInstalled=KU;var vn=require("fs"),Ot=HU(require("path")),Fp=et(),Yl=on(),Vp=Xo(),Bp=jp(),Vt=Mp();function xp(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Ot.basename(e.trim())):[]}function VS(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 jU(t,e){if(t==="workspace"){if(!e?.trim())throw new Error("Workspace-scoped views require an open workspace folder");return Ot.join(e.trim(),Fp.AGENTIDE_DIR_NAME,"analytics")}return Ot.join((0,Vp.getAgentideHome)(),"analytics")}function xU(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 BU(t,e,n){await vn.promises.mkdir(Ot.dirname(t),{recursive:!0});let r;try{let c=await vn.promises.readFile(t,"utf-8");r=(0,Vt.parseSpotlightYamlRecord)(c)??{version:1,activeViewId:"global",views:[]}}catch{r={version:1,activeViewId:"global",views:[]}}let s=Array.isArray(r.views)?[...r.views]:[],i=(0,Vt.normalizeSpotlightViewId)(e.id),o=s.findIndex(c=>{if(!c||typeof c!="object")return!1;let l=c;return(0,Vt.normalizeSpotlightViewId)(typeof l.id=="string"?l.id:void 0)===i}),a={id:i,name:e.name,scope:e.scope,scripts:VS(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 vn.promises.writeFile(t,(0,Vt.dumpSpotlightYaml)(r),"utf-8")}async function FU(t,e){let n=xU(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,Vt.parseSpotlightYamlRecord)(r.toString("utf-8")),o=(0,Vt.parseSpotlightYamlRecord)(s.toString("utf-8"));if(!i||!o)throw new Error("Invalid view.yaml or panel-entry.yaml in store bundle");let a=(0,Vt.normalizeSpotlightViewId)(typeof i.id=="string"?i.id:e.slug,e.slug);if(a!==(0,Vt.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,d=VS(xp(i.scripts).length?xp(i.scripts):xp(o.scripts)),u=jU(c,e.workspaceRoot),f=Ot.join(u,"views",a),p=Ot.join(u,"panel","views.yaml"),g=Ot.join(f,"scripts");if(!e.overwrite&&await(0,Yl.pathExists)(f))throw new Error(`Spotlight view "${a}" already exists at ${f}`);e.overwrite&&await vn.promises.rm(f,{recursive:!0,force:!0}),await vn.promises.mkdir(g,{recursive:!0});let m=["scripts/","assets/","images/","charts/","reports/","exports/"],h=new Set(["manifest.json","README.md"]),w=new Set(["view.yaml","panel-entry.yaml"]);for(let[T,L]of n.entries()){if(w.has(T)||!h.has(T)&&!m.some(b=>T.startsWith(b)))continue;let A=Ot.resolve(f),I=Ot.resolve(A,T);if(!I.startsWith(A+Ot.sep))throw new Error(`Store bundle entry "${T}" escapes the install directory`);await vn.promises.mkdir(Ot.dirname(I),{recursive:!0}),await vn.promises.writeFile(I,L)}let _=new Date().toISOString(),E=(0,Bp.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0",O={version:E,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:_,updatedAt:_,scripts:d,storeVersion:E};if(Array.isArray(i.tags)&&(O.tags=i.tags.filter(T=>typeof T=="string")),await vn.promises.writeFile(Ot.join(f,"view.yaml"),(0,Vt.dumpSpotlightYaml)(O),"utf-8"),await BU(p,{id:a,name:l,scope:c,scripts:d},!!e.overwrite),e.activate){let T;try{let L=await vn.promises.readFile(p,"utf-8");T=(0,Vt.parseSpotlightYamlRecord)(L)??{}}catch{T={version:1,views:[]}}T.activeViewId=a,typeof T.version!="number"&&(T.version=1),await vn.promises.writeFile(p,(0,Vt.dumpSpotlightYaml)(T),"utf-8")}return e.logger&&(0,Yl.logInfo)(e.logger,`[Spotlight] Installed view "${a}" to ${f}`),{id:a,scope:c,installDir:f,viewsConfigPath:p,version:(0,Bp.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0"}}async function VU(t){let e=[],n=new Set;async function r(s){let i=Ot.join(s,"views");if(!await(0,Yl.pathExists)(i))return;let o=await vn.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=Ot.join(i,a.name,"view.yaml");try{let d=await vn.promises.readFile(l,"utf-8"),u=(0,Vt.parseSpotlightYamlRecord)(d);if(!u)continue;let f=(0,Vt.normalizeSpotlightViewId)(typeof u.id=="string"?u.id:a.name,a.name),p=u.scope==="workspace"?"workspace":"global";n.add(c),e.push({slug:f,displayName:typeof u.name=="string"&&u.name.trim()?u.name.trim():f,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,Bp.resolveViewPublishVersionFromParsed)(u)??"local",scope:p})}catch{}}}return await r(Ot.join((0,Vp.getAgentideHome)(),"analytics")),t?.trim()&&await r(Ot.join(t.trim(),Fp.AGENTIDE_DIR_NAME,"analytics")),e.sort((s,i)=>s.slug.localeCompare(i.slug))}async function WU(t,e){let n=(0,Vt.normalizeSpotlightViewId)(e,e),r;try{let s=await vn.promises.readFile(t,"utf-8");r=(0,Vt.parseSpotlightYamlRecord)(s)??{version:1,views:[]}}catch{r={version:1,views:[]}}r.activeViewId=n,typeof r.version!="number"&&(r.version=1),await vn.promises.writeFile(t,(0,Vt.dumpSpotlightYaml)(r),"utf-8")}async function KU(t,e){let n=(0,Vt.normalizeSpotlightViewId)(t,t);for(let r of[Ot.join((0,Vp.getAgentideHome)(),"analytics","views",n,"view.yaml"),e?.trim()?Ot.join(e.trim(),Fp.AGENTIDE_DIR_NAME,"analytics","views",n,"view.yaml"):""].filter(Boolean))if(await(0,Yl.pathExists)(r))return!0;return!1}});var Zp=S(Gr=>{"use strict";var qU=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]})),YU=Gr&&Gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yp=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"&&qU(n,e,r[s]);return YU(n,e),n}})();Object.defineProperty(Gr,"__esModule",{value:!0});Gr.storeCommand=ZU;Gr.installFromStore=YS;Gr.resolvePublishBundleMode=JS;var No=Yp(require("fs/promises")),Hi=Yp(require("path")),KS=Yp(require("os")),JU=require("zlib"),Jl=et(),XU=Rf(),qS=$f(),ti=Al(),Jp=ac(),Na=kp(),zU=Df(),Wp=jp();function Ro(){let t=process.env.AGENTHIPPO_STORE_REPO,e=ti.DEFAULT_STORE_OWNER,n=ti.DEFAULT_STORE_REPO;if(t){let r=t.split("/");r.length===2&&(e=r[0],n=r[1])}return{owner:e,repo:n,defaultBranch:ti.DEFAULT_STORE_BRANCH,paths:ti.STORE_PATHS}}function QU(){if(process.env.AGENTHIPPO_STORE_URL)return process.env.AGENTHIPPO_STORE_URL;let t=Ro();return`https://${t.owner}.github.io/${t.repo}/store-index.json`}function Xp(){return process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN}async function zp(t,e={}){let n=Xp(),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 ni={appendLine:t=>{process.env.VERBOSE==="1"&&console.error(t)}};async function ZU(t){switch(t.verbose&&(process.env.VERBOSE="1"),t.action){case"search":await eH(t);break;case"install":await YS(t);break;case"publish":await tH(t);break;case"uninstall":case"remove":await sH(t);break;case"info":await iH(t);break;case"list":await oH(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 fr=ti.STORE_ICONS;async function eH(t){let e=t.query?.toLowerCase()||"",n=t.limit||20,r=t.type,s=await Qp(),i=new qS.LocalRegistry,o=new Set((await i.listPacks()).map(g=>g.slug)),a=await i.listSkills(),c=await i.listMcp(),l=await zS(),d=new Map(a.map(g=>[g.slug,g.installedTo||[]])),u=new Map(c.map(g=>[g.slug,g.installedTo||[]])),f=s.artifacts.filter(g=>r&&g.type!==r?!1:e?[g.slug,g.displayName,g.description,...g.tags||[]].join(" ").toLowerCase().includes(e):!0);f.sort((g,m)=>{let h=g.slug.toLowerCase()===e,w=m.slug.toLowerCase()===e;return h&&!w?-1:!h&&w?1:g.slug.localeCompare(m.slug)}),f=f.slice(0,n);let p=f.map(g=>{let m=!1,h;return g.type==="pack"?m=o.has(g.slug):g.type==="skill"?(h=d.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?fr.local:fr.remote,w=g.isLocal?` ${fr.installed}`:"";if(console.log(` ${h} ${g.type}/${g.slug} ${m}${w}`),g.description){let _=g.description.length>60?g.description.slice(0,57)+"...":g.description;console.log(` ${_}`)}g.installedTo&&g.installedTo.length>0&&console.log(` Installed to: ${g.installedTo.join(", ")}`)}console.log(""),console.log(`Legend: ${fr.local} Local ${fr.remote} Remote ${fr.installed} Installed`),console.log(""),console.log("Install with:"),console.log(" agenthippo store install <type>/<slug>"),console.log("")}async function YS(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=Xl(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 d=await qp(n,r);d.length>0?(o=d.find(f=>!f.isPrerelease)?.version||d[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 d=await Kp(n,r,o);d.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let{installSpotlightViewFromFiles:u}=await Promise.resolve().then(()=>Pn(WS())),f=await u(d.map(p=>({path:p.path,content:p.content})),{slug:r,version:o,overwrite:!!t.force,workspaceRoot:i,logger:ni});console.log(""),console.log(`\u2713 Installed view/${f.id} to:`),console.log(` ${f.installDir}`),console.log(` Panel config: ${f.viewsConfigPath}`),console.log("");return}if(n==="engine"){console.log(" Downloading...");let d=await Kp(n,r,o);d.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let u=await(0,Jp.installCustomEngineFromFiles)(d,{slug:r,version:o,overwrite:!!t.force,logger:ni});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=Hi.join(i,Jl.AGENTIDE_DIR_NAME,"agents",a,"skills",r);break;case"pack":c=t.installDir?Hi.resolve(t.installDir):Hi.join(KS.homedir(),Jl.AGENTIDE_DIR_NAME,"agents",r,o);break;case"mcp":c=Hi.join(i,Jl.AGENTIDE_DIR_NAME,"agents",a,"mcp",r);break}try{await No.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 No.rm(c,{recursive:!0,force:!0})}catch{}console.log(" Downloading...");let l=await Kp(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 No.mkdir(c,{recursive:!0});for(let d of l){let u=(0,XU.safeJoin)(c,d.path);u||(console.error(`Error: refusing install \u2014 artifact path escapes destination (${d.path})`),process.exit(1)),await No.mkdir(Hi.dirname(u),{recursive:!0}),await No.writeFile(u,d.content)}if(n==="pack"&&!t.installDir){let d=Hi.join(KS.homedir(),Jl.AGENTIDE_DIR_NAME,"agents",r);await No.writeFile(Hi.join(d,"current.txt"),o)}console.log(""),console.log(`\u2713 Installed ${n}/${r} to:`),console.log(` ${c}`),console.log("")}function JS(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 tH(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=Xl(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)),Xp()||(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 nH(t,r,s);return}await rH(t,r,s)}async function nH(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=Ro();console.log(` Target store: ${c.owner}/${c.repo}`),console.log(` Version tag: engines/${e}/v${o}`),console.log(` Files: ${a.length}`),await XS({options:t,type:"engine",slug:e,version:o,files:a,installHint:`agenthippo store install engine/${e}`})}async function rH(t,e,n){let r=t.workspace||process.cwd(),s=JS(t),i=await(0,Wp.discoverPublishableViews)(r),o=i.find(f=>f.id===e);if(!o){if(console.error(`Error: Spotlight view "${e}" not found.`),console.log("Register a user view in .agent-hippo/analytics/panel/views.yaml (non-system id)."),i.length>0){console.log(""),console.log("Publishable views:");for(let f of i)console.log(` - view/${f.id} (${f.sourceLabel}, ${f.scope})`)}process.exit(1)}console.log(`Publishing view/${e} from ${o.viewRoot}...`),console.log(` Bundle: ${s==="full"?"full (scripts + assets + charts/reports/exports + manifest.json)":"scripts only"}`);let a=await(0,Wp.validateViewForPublish)(o,{expectedId:e,mode:s});if(!a.valid){console.error(`Error: Cannot publish view/${e}`);for(let f of a.errors)console.error(` - ${f}`);process.exit(1)}for(let f of a.warnings)console.log(` Warning: ${f}`);a.metadata||(console.error("Error: Validation succeeded but metadata is missing."),process.exit(1));let c=n||t.version||a.metadata.publishVersion;c||(console.error("Error: Publish version required."),console.log("Pass a version: agenthippo store publish view/<slug>@1.0.0"),console.log("Or add version to view.yaml (e.g. version: 1.0.0)."),process.exit(1)),c=c.replace(/^v/,""),(0,Na.isValidPublishVersion)(c)||(console.error(`Error: Invalid version "${c}". Use semver (e.g., 1.0.0).`),process.exit(1));let l=await(0,Wp.collectViewFiles)(o,c,a.metadata,s),d=Ro(),u=l.filter(f=>f.encoding==="base64").length;console.log(` Target store: ${d.owner}/${d.repo}`),console.log(` Version tag: spotlight/${e}/v${c}`),console.log(` Files: ${l.length}${u>0?` (${u} binary)`:""}`),await XS({options:t,type:"view",slug:e,version:c,files:l,bundle:s,installHint:`agenthippo store install view/${e}`})}async function XS(t){let{options:e,type:n,slug:r,version:s,files:i,bundle:o,installHint:a}=t;try{let c=await(0,zU.publishToStore)({type:n,slug:r,version:s,files:i},ni);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 sH(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}=Xl(t.query);e!=="engine"&&(console.error(`Error: store uninstall currently supports custom engines only, got ${e}/${n}`),process.exit(1));let r=await(0,Jp.uninstallCustomEngine)(n,{logger:ni});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 iH(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store info <type>/<slug>"),process.exit(1));let e=Xl(t.query),r=(await Qp()).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 qp(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 qp(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 oH(t){let e=await Qp(),n=t.type,r=new qS.LocalRegistry,s=new Set((await r.listPacks()).map(p=>p.slug)),i=await r.listSkills(),o=await r.listMcp(),a=await zS(),c=new Map(i.map(p=>[p.slug,p.installedTo||[]])),l=new Map(o.map(p=>[p.slug,p.installedTo||[]])),d=e.artifacts;n&&(d=d.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=d.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 ${d.length} artifact(s):`),console.log("");let f={};for(let p of d)f[p.type]=f[p.type]||[],f[p.type].push(p);for(let p of["pack","skill","mcp","engine"]){let g=f[p]||[];if(g.length!==0){console.log(`${p}s (${g.length}):`);for(let m of g){let h=m.latestVersion?` v${m.latestVersion}`:"",w=u(m),_=w?fr.local:fr.remote,E=w?` ${fr.installed}`:"";console.log(` ${_} ${m.slug}${h}${E}`)}console.log("")}}console.log(`Legend: ${fr.local} Local ${fr.remote} Remote ${fr.installed} Installed`),console.log("")}function Xl(t){try{return(0,ti.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 zS(){return new Set((await(0,Jp.listInstalledCustomEngines)()).map(t=>t.id))}async function Qp(){let t=QU();ni.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(Xp()&&(e.status===403||e.status===404)){ni.appendLine("[Store] GitHub Pages not available, trying API with auth...");let r=Ro(),s=`https://api.github.com/repos/${r.owner}/${r.repo}/contents/dist/store-index.json`;if(e=await zp(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 qp(t,e){let n=Ro(),s=`${(0,ti.getStorePath)(t)}/${e}/v`,i=`https://api.github.com/repos/${n.owner}/${n.repo}/git/refs/tags`;ni.appendLine(`[Store] Listing versions for ${t}/${e}`);let o=await zp(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 d=l.replace("refs/tags/","");if(d.startsWith(s)){let u=d.slice(s.length-1);c.push({version:u.replace(/^v/,""),tagName:d,isPrerelease:/-(alpha|beta|rc|pre)/.test(u)})}}return c.sort((l,d)=>d.version.localeCompare(l.version,void 0,{numeric:!0}))}async function Kp(t,e,n){let r=Ro(),s=(0,ti.getStorePath)(t),i;n==="main"||n==="latest"?i=r.defaultBranch:i=`${s}/${e}/v${n.replace(/^v/,"")}`,ni.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 zp(a);if(!c.ok)throw new Error(`Failed to download: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer()),d=(0,JU.gunzipSync)(l),u=aH(d),f=`${s}/${e}/`,p=[];for(let[g,m]of u){let h=g.indexOf("/");if(h===-1)continue;let w=g.slice(h+1);if(w.startsWith(f)){let _=w.slice(f.length);_&&p.push({path:_,content:m})}}return p}function aH(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 QS=S(eg=>{"use strict";Object.defineProperty(eg,"__esModule",{value:!0});eg.parsePackInstallRef=cH;function cH(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 eA=S($s=>{"use strict";var lH=$s&&$s.__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]})),uH=$s&&$s.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ZS=$s&&$s.__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"&&lH(n,e,r[s]);return uH(n,e),n}})();Object.defineProperty($s,"__esModule",{value:!0});$s.packCommand=gH;var Co=ZS(require("fs")),Ql=ZS(require("path")),ko=vi(),zl=et(),dH=Ri(),pr=mo(),fH=Zp(),pH=QS(),tg="-".repeat(62);async function gH(t){let e=t.workspace;switch(t.action){case"list":await mH(e);break;case"validate":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack validate <name>"),process.exit(1)),await EH(t.name,e);break;case"info":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack info <name>"),process.exit(1)),await _H(t.name,e);break;case"sign":await wH(t);break;case"verify":await SH(t);break;case"digest":await AH(t);break;case"keygen":yH(t);break;case"install":await hH(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 hH(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,pH.parsePackInstallRef)(t.name);await(0,fH.installFromStore)({action:"install",query:`pack/${n}${r?`@${r}`:""}`,workspace:t.workspace,version:r,force:t.force,installDir:Ql.resolve(e),verbose:t.verbose})}async function mH(t){let e=(0,ko.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}/${zl.AGENTIDE_DIR_NAME}/agents/`),console.log(` User library: ~/${zl.AGENTIDE_DIR_NAME}/agents/`),console.log(""),console.log("Create a pack with:"),console.log(` mkdir -p ~/${zl.AGENTIDE_DIR_NAME}/agents/my-agent/1.0.0`),console.log(` echo "1.0.0" > ~/${zl.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 EH(t,e){console.log(`Validating pack: ${t}`),console.log("");let n=(0,ko.resolvePackPath)(t,e);n||(console.error(`Error: Pack not found: ${t}`),process.exit(1));let r=[],s=[],i=Ql.join(n,"agent.yaml");Co.existsSync(i)?console.log(" OK: agent.yaml exists"):r.push("Missing agent.yaml");try{let o=await(0,ko.loadAgentPack)(t,e);console.log(` OK: metadata.name: ${o.manifest.metadata.name}`),console.log(` OK: metadata.version: ${o.manifest.metadata.version}`),console.log(` OK: spec.engine: ${o.manifest.spec.engine}`),o.manifest.spec.model?console.log(` OK: spec.model: ${o.manifest.spec.model}`):s.push("spec.model not specified, will use default"),o.manifest.spec.cheapModel&&console.log(` OK: spec.cheapModel: ${o.manifest.spec.cheapModel}`),o.manifest.spec.effort&&console.log(` OK: spec.effort: ${o.manifest.spec.effort}`);let a=Ql.join(n,"AGENTS.md");if(Co.existsSync(a)){let c=Co.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 _H(t,e){try{let n=await(0,ko.loadAgentPack)(t,e);if(console.log(""),console.log(tg),console.log(`Agent: ${n.manifest.metadata.name}`),console.log(tg),console.log(`Version: ${n.manifest.metadata.version}`),n.manifest.metadata.description&&console.log(`Description: ${n.manifest.metadata.description}`),n.manifest.metadata.author&&console.log(`Author: ${n.manifest.metadata.author}`),console.log(`Engine: ${n.manifest.spec.engine}`),n.manifest.spec.model&&console.log(`Model: ${n.manifest.spec.model}`),n.manifest.spec.cheapModel&&console.log(`Cheap Model: ${n.manifest.spec.cheapModel}`),n.manifest.spec.effort&&console.log(`Effort: ${n.manifest.spec.effort}`),console.log(`Path: ${n.packPath}`),n.manifest.spec.permissions&&(console.log(""),console.log("Permissions:"),console.log(` File Access: ${n.manifest.spec.permissions.fileAccess||"default"}`)),n.manifest.spec.mcpServers&&n.manifest.spec.mcpServers.length>0){console.log(""),console.log("MCP Servers:");for(let r of n.manifest.spec.mcpServers)console.log(` - ${r.name}`)}console.log(tg),console.log("")}catch(n){console.error(`Error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function ng(t,e){t||(console.error("Error: pack name or path required"),process.exit(1));let n=(0,ko.resolvePackPath)(t,e);n||(console.error(`Error: pack not found: ${t}`),process.exit(1));let r=await(0,ko.loadAgentPack)(n,e);return{packPath:r.packPath,name:r.manifest.metadata.name,version:r.manifest.metadata.version??"0.0.0"}}function yH(t){let e=t.kid||`sign-${new Date().toISOString().slice(0,10)}`,n=(0,dH.generateWarrantKeypair)(e),r=t.output;r?(Co.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 wH(t){let{packPath:e,name:n,version:r}=await ng(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=Co.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,pr.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 ${Ql.join(e,pr.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 SH(t){let{packPath:e,name:n,version:r}=await ng(t.name,t.workspace),s=(0,pr.readPackSignature)(e);s||(console.error(`UNSIGNED: no ${pr.PACK_SIGNATURE_FILE} at ${e}`),console.error((0,pr.describePackRefusal)({kind:"unsigned",detail:`no ${pr.PACK_SIGNATURE_FILE}`,pack:n,packVersion:r,packDir:e})),process.exit(1));let i={};if(t.keys)try{i=JSON.parse(Co.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,pr.loadPackTrustRoot)({env:t.jwks?{...process.env,[pr.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,pr.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,pr.verifyPack)(s,i,{packDir:e,pack:n,packVersion:r});o.ok||(console.error(`INVALID: ${o.reason}`),console.error((0,pr.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 AH(t){let{packPath:e,name:n,version:r}=await ng(t.name,t.workspace);console.log(`${(0,pr.computePackDigest)(e)} ${n}@${r}`)}});var nA=S(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.parseStrictJsonConfig=tA;Ra.collectMissingChannelEnvSecrets=bH;Ra.disableChannelsInConfigText=vH;var TH=8;function ji(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function tA(t){try{return JSON.parse(t)}catch{return}}function rg(t,e,n){if(!(n>TH)){if(Array.isArray(t)){for(let r of t)rg(r,e,n+1);return}if(ji(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))rg(r,e,n+1)}}}function bH(t,e){if(!ji(t)||!ji(t.channels))return[];let n=[];for(let[r,s]of Object.entries(t.channels)){if(!ji(s)||s.enabled===!1)continue;let i=new Set;rg(s,i,0);let o=[...i].filter(a=>!e[a]?.trim()).sort();o.length&&n.push({channel:r,envVars:o})}return n}function vH(t,e){let n=tA(t);if(!(!ji(n)||!ji(n.channels))){for(let r of e){let s=n.channels[r];ji(s)&&(s.enabled=!1)}return`${JSON.stringify(n,null,2)}
634
- `}}});var sA=S(Zl=>{"use strict";Object.defineProperty(Zl,"__esModule",{value:!0});Zl.quoteWindowsCommandLineArg=rA;Zl.buildWindowsArgumentLine=OH;function rA(t){return t.length===0?'""':/[ \t"]/u.test(t)?`"${t.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\+)$/g,"$1$1")}"`:t}function OH(t){return t.map(e=>rA(e)).join(" ")}});var iA=S(sg=>{"use strict";Object.defineProperty(sg,"__esModule",{value:!0});sg.isGatewayScopeAuthError=IH;function IH(t){let e=t.toLowerCase();return e.includes("missing scope")||e.includes("operator.admin")}});var oA=S(gr=>{"use strict";Object.defineProperty(gr,"__esModule",{value:!0});gr.ANYWHERE_INSTALL_SOURCE_FORMS=gr.ANYWHERE_CONFIG_TEMPLATE_ENV=gr.ANYWHERE_SETUP_SCRIPT_ENV=gr.ANYWHERE_INSTALL_SOURCE_ENV=void 0;gr.validateAnywhereInstallSource=$H;gr.ANYWHERE_INSTALL_SOURCE_ENV="AH_INSTALL_SOURCE";gr.ANYWHERE_SETUP_SCRIPT_ENV="AH_SETUP_SCRIPT";gr.ANYWHERE_CONFIG_TEMPLATE_ENV="AH_CONFIG_TEMPLATE";var PH=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:@[a-zA-Z0-9^~*><=][a-zA-Z0-9.^~*+><=|_-]*)?$/,NH=/^github:[A-Za-z0-9][A-Za-z0-9._-]*\/[A-Za-z0-9][A-Za-z0-9._-]*(?:#[A-Za-z0-9._/-]+)?$/,RH=/^https:\/\/[A-Za-z0-9._-]+(?::\d+)?\/[A-Za-z0-9._~!$'()*+,;=:@%/-]*\.(?:tgz|tar\.gz)$/,CH=/^(?:\.{1,2})?\/[^\0<>"'`;|&$\n\r]*$/,kH=/^[A-Za-z]:[\\/][^\0<>"'`;|&$\n\r]*$/;gr.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 $H(t){let e=r=>({ok:!1,reason:`${r} \u2014 ${gr.ANYWHERE_INSTALL_SOURCE_FORMS}`}),n=t.trim();return n?n!==t?e("it has leading or trailing whitespace"):PH.test(n)||NH.test(n)||RH.test(n)||CH.test(n)||kH.test(n)?{ok:!0}:e("it is not one of the accepted forms"):e("it is empty")}});var OA=S(G=>{"use strict";var DH=G&&G.__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]})),LH=G&&G.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cu=G&&G.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&DH(n,e,r[s]);return LH(n,e),n}})();Object.defineProperty(G,"__esModule",{value:!0});G.GatewayLifecycleManager=G.validateAnywhereInstallSource=G.ANYWHERE_SETUP_SCRIPT_ENV=G.ANYWHERE_INSTALL_SOURCE_ENV=G.ANYWHERE_CONFIG_TEMPLATE_ENV=G.AGENT_ANYWHERE_LABEL=void 0;G.detectGateway=ru;var $=cu(require("vscode")),su=require("child_process"),ig=require("crypto"),hA=require("util"),H=cu(require("fs")),q=cu(require("path")),os=cu(require("os")),ve=Xo(),og=Ba(),ag=nA(),MH=sA(),GH=iA(),cg=tp(),lg=et(),Wt=(0,hA.promisify)(su.exec),UH=(0,hA.promisify)(su.execFile),pe=process.platform==="win32",mA=process.platform==="darwin";function aA(t,e){if(e)for(let n of e.split(q.delimiter)){let r=n.trim();r.length>0&&t.add(r)}}function HH(){let t=new Set,e=os.homedir();aA(t,"/usr/bin:/bin:/usr/sbin:/sbin"),aA(t,process.env.PATH);let n=[q.join(e,".local","bin"),q.join(e,"Library","pnpm"),q.join(e,".local","share","pnpm"),q.join(e,".npm-global","bin"),q.join(e,".volta","bin"),q.join(e,".fnm"),q.join(e,".asdf","shims"),"/opt/homebrew/bin","/usr/local/bin"];for(let i of n)H.existsSync(i)&&t.add(i);let r=process.env.NVM_DIR||q.join(e,".nvm"),s=q.join(r,"versions","node");if(H.existsSync(s))try{let i=H.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort().reverse().slice(0,8);for(let o of i){let a=q.join(s,o,"bin");H.existsSync(a)&&t.add(a)}}catch{}return Array.from(t).join(q.delimiter)}function eu(){return mA&&H.existsSync("/bin/zsh")?"/bin/zsh":"/bin/bash"}function tu(t){return mA?["-lic",t]:["-lc",t]}function ug(){if(!pe)return{...process.env,PATH:HH(),npm_config_script_shell:"/bin/sh"}}G.AGENT_ANYWHERE_LABEL="Agent Anywhere";var $o=`${G.AGENT_ANYWHERE_LABEL} Setup`,xi=`${G.AGENT_ANYWHERE_LABEL} Uninstall`,Bi=18789,dg=q.join(os.homedir(),".openclaw","gateway.log"),cA="Open Gateway Log";function jH(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}function xH(t){try{if(!H.existsSync(t))return;let n=H.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=jH(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 Ca(t){let e=xH(t),n=e?`${G.AGENT_ANYWHERE_LABEL}: Gateway failed to start. ${e}`:`${G.AGENT_ANYWHERE_LABEL}: Gateway failed to start.`;if(await $.window.showErrorMessage(n,cA)===cA)try{let s=await $.workspace.openTextDocument($.Uri.file(t));await $.window.showTextDocument(s,{preview:!1})}catch(s){let i=s instanceof Error?s.message:String(s);$.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not open gateway log (${i}). Path: ${t}`)}}var BH=3e4,FH=pe?75e3:2e4,VH=3e4,lu=ve.PID_FILES.gateway(),ss="hippoclaw",Sg=["@agenthippo-ai/hippoclaw","openclaw"],Ag=q.join(os.homedir(),".agenthippo","gateway"),iu=q.join(Ag,"install.json"),gg=q.join(Ag,"install-status.json"),Tg=pe?q.join(process.env.LOCALAPPDATA||q.join(os.homedir(),"AppData","Local"),"AgentHippo","bin"):q.join(os.homedir(),".local","bin"),EA=q.join(Tg,pe?"hippoclaw.cmd":"hippoclaw"),hg=q.join(Tg,pe?"openclaw.cmd":"openclaw"),mg=pe?"REM Managed by Agent Anywhere":"# Managed by Agent Anywhere",St=oA();Object.defineProperty(G,"ANYWHERE_CONFIG_TEMPLATE_ENV",{enumerable:!0,get:function(){return St.ANYWHERE_CONFIG_TEMPLATE_ENV}});Object.defineProperty(G,"ANYWHERE_INSTALL_SOURCE_ENV",{enumerable:!0,get:function(){return St.ANYWHERE_INSTALL_SOURCE_ENV}});Object.defineProperty(G,"ANYWHERE_SETUP_SCRIPT_ENV",{enumerable:!0,get:function(){return St.ANYWHERE_SETUP_SCRIPT_ENV}});Object.defineProperty(G,"validateAnywhereInstallSource",{enumerable:!0,get:function(){return St.validateAnywhereInstallSource}});function WH(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 lA=[["npmInstallComplete","npm install complete"],["wrapperExists","wrapper exists"],["configExists","config exists"],["distExists","dist exists"],["webUiExists","web UI exists"],["finalCheckPassed","final check passed"]];function is(t){return t.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()}function _A(t,e){let n=is(t),r=is(e);return n===r||n.startsWith(`${r}/`)}function Fi(){try{if(!H.existsSync(iu))return;let t=H.readFileSync(iu,"utf8").replace(/^/,"");return JSON.parse(t)}catch{return}}function KH(t){H.mkdirSync(Ag,{recursive:!0}),H.writeFileSync(iu,JSON.stringify(t,null,2),"utf8")}function bg(t){let e=t?.packageRoot;if(!(!e||!H.existsSync(e)))try{return H.realpathSync(e)}catch{return e}}function qH(t){if(!t)return;let e=Fi();return!e?.entryScriptPath&&!e?.cliPath?t:(e.wrapperPath||e.openclawWrapperPath)&&[e.wrapperPath,e.openclawWrapperPath].some(n=>n&&is(t)===is(n))&&(e.entryScriptPath&&H.existsSync(e.entryScriptPath)||e.cliPath&&H.existsSync(e.cliPath))?e.entryScriptPath&&H.existsSync(e.entryScriptPath)?e.entryScriptPath:e.cliPath:t}function yA(t){if(!t)return;let e=Fi();return e?.cliPath&&[e.wrapperPath,e.openclawWrapperPath,e.entryScriptPath].some(n=>n&&is(t)===is(n))&&H.existsSync(e.cliPath)?e.cliPath:t}function wA(t){for(let e of[t?.wrapperPath,t?.openclawWrapperPath,t?.cliPath])if(e&&H.existsSync(e))return e}function SA(t){let e=t?.nodePath;if(!(!e||!H.existsSync(e)))return e}function YH(t){let e=t?.entryScriptPath;if(!(!e||!H.existsSync(e)))return e}async function Eg(t,e){let n=e??Fi(),r=t??wA(n)??await vA(),s=yA(r)??r;if(!s||!H.existsSync(s))return;let i=bg(n)??vg(s);if(!i)return;let o=SA(n)??XH(s),a=YH(n)??JH(i);if(!(!o||!a))return{launcherPath:s,packageRoot:i,nodePath:o,entryScriptPath:a}}function AA(t){try{return H.existsSync(t)?H.readFileSync(t,"utf8").includes(mg):!1}catch{return!1}}function uA(t,e,n){H.mkdirSync(q.dirname(n),{recursive:!0});let r=pe?`@echo off\r
652
+ `)}`);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 MU(t,e,n,r="scripts-only"){if(!(0,Up.isValidPublishVersion)(e.replace(/^v/,"")))throw new Error(`Invalid publish version: ${e}`);let s=[],i=Dt.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:LS,content:(0,Io.dumpSpotlightYaml)(a),encoding:"utf-8"}),s.push({path:AU,content:(0,Io.dumpSpotlightYaml)({id:t.id,name:n.name,scope:n.scope,scripts:n.scripts}),encoding:"utf-8"});let c=Dt.join(t.viewRoot,"README.md");return await(0,rs.pathExists)(c)&&s.push(await Gp(c,"README.md")),await(0,rs.pathExists)(i)&&await ql(i,"scripts",jS,async(l,d)=>{s.push(await Gp(l,d))}),r==="full"&&await FS(t.viewRoot,async(l,d)=>{s.push(await Gp(l,d))}),s}});var WS=S(dr=>{"use strict";var GU=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]})),UU=dr&&dr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),HU=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"&&GU(n,e,r[s]);return UU(n,e),n}})();Object.defineProperty(dr,"__esModule",{value:!0});dr.installSpotlightViewFromFiles=FU;dr.listInstalledSpotlightViews=VU;dr.setActiveSpotlightView=WU;dr.isSpotlightViewInstalled=KU;var vn=require("fs"),Ot=HU(require("path")),Fp=et(),Yl=on(),Vp=Xo(),Bp=jp(),Vt=Mp();function xp(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.trim().length>0).map(e=>Ot.basename(e.trim())):[]}function VS(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 jU(t,e){if(t==="workspace"){if(!e?.trim())throw new Error("Workspace-scoped views require an open workspace folder");return Ot.join(e.trim(),Fp.AGENTIDE_DIR_NAME,"analytics")}return Ot.join((0,Vp.getAgentideHome)(),"analytics")}function xU(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 BU(t,e,n){await vn.promises.mkdir(Ot.dirname(t),{recursive:!0});let r;try{let c=await vn.promises.readFile(t,"utf-8");r=(0,Vt.parseSpotlightYamlRecord)(c)??{version:1,activeViewId:"global",views:[]}}catch{r={version:1,activeViewId:"global",views:[]}}let s=Array.isArray(r.views)?[...r.views]:[],i=(0,Vt.normalizeSpotlightViewId)(e.id),o=s.findIndex(c=>{if(!c||typeof c!="object")return!1;let l=c;return(0,Vt.normalizeSpotlightViewId)(typeof l.id=="string"?l.id:void 0)===i}),a={id:i,name:e.name,scope:e.scope,scripts:VS(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 vn.promises.writeFile(t,(0,Vt.dumpSpotlightYaml)(r),"utf-8")}async function FU(t,e){let n=xU(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,Vt.parseSpotlightYamlRecord)(r.toString("utf-8")),o=(0,Vt.parseSpotlightYamlRecord)(s.toString("utf-8"));if(!i||!o)throw new Error("Invalid view.yaml or panel-entry.yaml in store bundle");let a=(0,Vt.normalizeSpotlightViewId)(typeof i.id=="string"?i.id:e.slug,e.slug);if(a!==(0,Vt.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,d=VS(xp(i.scripts).length?xp(i.scripts):xp(o.scripts)),u=jU(c,e.workspaceRoot),f=Ot.join(u,"views",a),p=Ot.join(u,"panel","views.yaml"),g=Ot.join(f,"scripts");if(!e.overwrite&&await(0,Yl.pathExists)(f))throw new Error(`Spotlight view "${a}" already exists at ${f}`);e.overwrite&&await vn.promises.rm(f,{recursive:!0,force:!0}),await vn.promises.mkdir(g,{recursive:!0});let m=["scripts/","assets/","images/","charts/","reports/","exports/"],h=new Set(["manifest.json","README.md"]),w=new Set(["view.yaml","panel-entry.yaml"]);for(let[T,L]of n.entries()){if(w.has(T)||!h.has(T)&&!m.some(b=>T.startsWith(b)))continue;let A=Ot.resolve(f),P=Ot.resolve(A,T);if(!P.startsWith(A+Ot.sep))throw new Error(`Store bundle entry "${T}" escapes the install directory`);await vn.promises.mkdir(Ot.dirname(P),{recursive:!0}),await vn.promises.writeFile(P,L)}let _=new Date().toISOString(),E=(0,Bp.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0",O={version:E,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:_,updatedAt:_,scripts:d,storeVersion:E};if(Array.isArray(i.tags)&&(O.tags=i.tags.filter(T=>typeof T=="string")),await vn.promises.writeFile(Ot.join(f,"view.yaml"),(0,Vt.dumpSpotlightYaml)(O),"utf-8"),await BU(p,{id:a,name:l,scope:c,scripts:d},!!e.overwrite),e.activate){let T;try{let L=await vn.promises.readFile(p,"utf-8");T=(0,Vt.parseSpotlightYamlRecord)(L)??{}}catch{T={version:1,views:[]}}T.activeViewId=a,typeof T.version!="number"&&(T.version=1),await vn.promises.writeFile(p,(0,Vt.dumpSpotlightYaml)(T),"utf-8")}return e.logger&&(0,Yl.logInfo)(e.logger,`[Spotlight] Installed view "${a}" to ${f}`),{id:a,scope:c,installDir:f,viewsConfigPath:p,version:(0,Bp.resolveViewPublishVersionFromParsed)(i)??e.version??"1.0.0"}}async function VU(t){let e=[],n=new Set;async function r(s){let i=Ot.join(s,"views");if(!await(0,Yl.pathExists)(i))return;let o=await vn.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=Ot.join(i,a.name,"view.yaml");try{let d=await vn.promises.readFile(l,"utf-8"),u=(0,Vt.parseSpotlightYamlRecord)(d);if(!u)continue;let f=(0,Vt.normalizeSpotlightViewId)(typeof u.id=="string"?u.id:a.name,a.name),p=u.scope==="workspace"?"workspace":"global";n.add(c),e.push({slug:f,displayName:typeof u.name=="string"&&u.name.trim()?u.name.trim():f,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,Bp.resolveViewPublishVersionFromParsed)(u)??"local",scope:p})}catch{}}}return await r(Ot.join((0,Vp.getAgentideHome)(),"analytics")),t?.trim()&&await r(Ot.join(t.trim(),Fp.AGENTIDE_DIR_NAME,"analytics")),e.sort((s,i)=>s.slug.localeCompare(i.slug))}async function WU(t,e){let n=(0,Vt.normalizeSpotlightViewId)(e,e),r;try{let s=await vn.promises.readFile(t,"utf-8");r=(0,Vt.parseSpotlightYamlRecord)(s)??{version:1,views:[]}}catch{r={version:1,views:[]}}r.activeViewId=n,typeof r.version!="number"&&(r.version=1),await vn.promises.writeFile(t,(0,Vt.dumpSpotlightYaml)(r),"utf-8")}async function KU(t,e){let n=(0,Vt.normalizeSpotlightViewId)(t,t);for(let r of[Ot.join((0,Vp.getAgentideHome)(),"analytics","views",n,"view.yaml"),e?.trim()?Ot.join(e.trim(),Fp.AGENTIDE_DIR_NAME,"analytics","views",n,"view.yaml"):""].filter(Boolean))if(await(0,Yl.pathExists)(r))return!0;return!1}});var Zp=S(Gr=>{"use strict";var qU=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]})),YU=Gr&&Gr.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Yp=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"&&qU(n,e,r[s]);return YU(n,e),n}})();Object.defineProperty(Gr,"__esModule",{value:!0});Gr.storeCommand=ZU;Gr.installFromStore=YS;Gr.resolvePublishBundleMode=JS;var No=Yp(require("fs/promises")),Hi=Yp(require("path")),KS=Yp(require("os")),JU=require("zlib"),Jl=et(),XU=Rf(),qS=$f(),ti=Al(),Jp=ac(),Na=kp(),zU=Df(),Wp=jp();function Ro(){let t=process.env.AGENTHIPPO_STORE_REPO,e=ti.DEFAULT_STORE_OWNER,n=ti.DEFAULT_STORE_REPO;if(t){let r=t.split("/");r.length===2&&(e=r[0],n=r[1])}return{owner:e,repo:n,defaultBranch:ti.DEFAULT_STORE_BRANCH,paths:ti.STORE_PATHS}}function QU(){if(process.env.AGENTHIPPO_STORE_URL)return process.env.AGENTHIPPO_STORE_URL;let t=Ro();return`https://${t.owner}.github.io/${t.repo}/store-index.json`}function Xp(){return process.env.GITHUB_TOKEN||process.env.GH_TOKEN||process.env.AGENTHIPPO_GITHUB_TOKEN}async function zp(t,e={}){let n=Xp(),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 ni={appendLine:t=>{process.env.VERBOSE==="1"&&console.error(t)}};async function ZU(t){switch(t.verbose&&(process.env.VERBOSE="1"),t.action){case"search":await eH(t);break;case"install":await YS(t);break;case"publish":await tH(t);break;case"uninstall":case"remove":await sH(t);break;case"info":await iH(t);break;case"list":await oH(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 fr=ti.STORE_ICONS;async function eH(t){let e=t.query?.toLowerCase()||"",n=t.limit||20,r=t.type,s=await Qp(),i=new qS.LocalRegistry,o=new Set((await i.listPacks()).map(g=>g.slug)),a=await i.listSkills(),c=await i.listMcp(),l=await zS(),d=new Map(a.map(g=>[g.slug,g.installedTo||[]])),u=new Map(c.map(g=>[g.slug,g.installedTo||[]])),f=s.artifacts.filter(g=>r&&g.type!==r?!1:e?[g.slug,g.displayName,g.description,...g.tags||[]].join(" ").toLowerCase().includes(e):!0);f.sort((g,m)=>{let h=g.slug.toLowerCase()===e,w=m.slug.toLowerCase()===e;return h&&!w?-1:!h&&w?1:g.slug.localeCompare(m.slug)}),f=f.slice(0,n);let p=f.map(g=>{let m=!1,h;return g.type==="pack"?m=o.has(g.slug):g.type==="skill"?(h=d.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?fr.local:fr.remote,w=g.isLocal?` ${fr.installed}`:"";if(console.log(` ${h} ${g.type}/${g.slug} ${m}${w}`),g.description){let _=g.description.length>60?g.description.slice(0,57)+"...":g.description;console.log(` ${_}`)}g.installedTo&&g.installedTo.length>0&&console.log(` Installed to: ${g.installedTo.join(", ")}`)}console.log(""),console.log(`Legend: ${fr.local} Local ${fr.remote} Remote ${fr.installed} Installed`),console.log(""),console.log("Install with:"),console.log(" agenthippo store install <type>/<slug>"),console.log("")}async function YS(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=Xl(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 d=await qp(n,r);d.length>0?(o=d.find(f=>!f.isPrerelease)?.version||d[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 d=await Kp(n,r,o);d.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let{installSpotlightViewFromFiles:u}=await Promise.resolve().then(()=>In(WS())),f=await u(d.map(p=>({path:p.path,content:p.content})),{slug:r,version:o,overwrite:!!t.force,workspaceRoot:i,logger:ni});console.log(""),console.log(`\u2713 Installed view/${f.id} to:`),console.log(` ${f.installDir}`),console.log(` Panel config: ${f.viewsConfigPath}`),console.log("");return}if(n==="engine"){console.log(" Downloading...");let d=await Kp(n,r,o);d.length===0&&(console.error(`Error: No files found for ${n}/${r}`),process.exit(1));let u=await(0,Jp.installCustomEngineFromFiles)(d,{slug:r,version:o,overwrite:!!t.force,logger:ni});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=Hi.join(i,Jl.AGENTIDE_DIR_NAME,"agents",a,"skills",r);break;case"pack":c=t.installDir?Hi.resolve(t.installDir):Hi.join(KS.homedir(),Jl.AGENTIDE_DIR_NAME,"agents",r,o);break;case"mcp":c=Hi.join(i,Jl.AGENTIDE_DIR_NAME,"agents",a,"mcp",r);break}try{await No.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 No.rm(c,{recursive:!0,force:!0})}catch{}console.log(" Downloading...");let l=await Kp(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 No.mkdir(c,{recursive:!0});for(let d of l){let u=(0,XU.safeJoin)(c,d.path);u||(console.error(`Error: refusing install \u2014 artifact path escapes destination (${d.path})`),process.exit(1)),await No.mkdir(Hi.dirname(u),{recursive:!0}),await No.writeFile(u,d.content)}if(n==="pack"&&!t.installDir){let d=Hi.join(KS.homedir(),Jl.AGENTIDE_DIR_NAME,"agents",r);await No.writeFile(Hi.join(d,"current.txt"),o)}console.log(""),console.log(`\u2713 Installed ${n}/${r} to:`),console.log(` ${c}`),console.log("")}function JS(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 tH(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=Xl(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)),Xp()||(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 nH(t,r,s);return}await rH(t,r,s)}async function nH(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=Ro();console.log(` Target store: ${c.owner}/${c.repo}`),console.log(` Version tag: engines/${e}/v${o}`),console.log(` Files: ${a.length}`),await XS({options:t,type:"engine",slug:e,version:o,files:a,installHint:`agenthippo store install engine/${e}`})}async function rH(t,e,n){let r=t.workspace||process.cwd(),s=JS(t),i=await(0,Wp.discoverPublishableViews)(r),o=i.find(f=>f.id===e);if(!o){if(console.error(`Error: Spotlight view "${e}" not found.`),console.log("Register a user view in .agent-hippo/analytics/panel/views.yaml (non-system id)."),i.length>0){console.log(""),console.log("Publishable views:");for(let f of i)console.log(` - view/${f.id} (${f.sourceLabel}, ${f.scope})`)}process.exit(1)}console.log(`Publishing view/${e} from ${o.viewRoot}...`),console.log(` Bundle: ${s==="full"?"full (scripts + assets + charts/reports/exports + manifest.json)":"scripts only"}`);let a=await(0,Wp.validateViewForPublish)(o,{expectedId:e,mode:s});if(!a.valid){console.error(`Error: Cannot publish view/${e}`);for(let f of a.errors)console.error(` - ${f}`);process.exit(1)}for(let f of a.warnings)console.log(` Warning: ${f}`);a.metadata||(console.error("Error: Validation succeeded but metadata is missing."),process.exit(1));let c=n||t.version||a.metadata.publishVersion;c||(console.error("Error: Publish version required."),console.log("Pass a version: agenthippo store publish view/<slug>@1.0.0"),console.log("Or add version to view.yaml (e.g. version: 1.0.0)."),process.exit(1)),c=c.replace(/^v/,""),(0,Na.isValidPublishVersion)(c)||(console.error(`Error: Invalid version "${c}". Use semver (e.g., 1.0.0).`),process.exit(1));let l=await(0,Wp.collectViewFiles)(o,c,a.metadata,s),d=Ro(),u=l.filter(f=>f.encoding==="base64").length;console.log(` Target store: ${d.owner}/${d.repo}`),console.log(` Version tag: spotlight/${e}/v${c}`),console.log(` Files: ${l.length}${u>0?` (${u} binary)`:""}`),await XS({options:t,type:"view",slug:e,version:c,files:l,bundle:s,installHint:`agenthippo store install view/${e}`})}async function XS(t){let{options:e,type:n,slug:r,version:s,files:i,bundle:o,installHint:a}=t;try{let c=await(0,zU.publishToStore)({type:n,slug:r,version:s,files:i},ni);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 sH(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}=Xl(t.query);e!=="engine"&&(console.error(`Error: store uninstall currently supports custom engines only, got ${e}/${n}`),process.exit(1));let r=await(0,Jp.uninstallCustomEngine)(n,{logger:ni});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 iH(t){t.query||(console.error("Error: Artifact reference required."),console.log("Usage: agenthippo store info <type>/<slug>"),process.exit(1));let e=Xl(t.query),r=(await Qp()).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 qp(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 qp(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 oH(t){let e=await Qp(),n=t.type,r=new qS.LocalRegistry,s=new Set((await r.listPacks()).map(p=>p.slug)),i=await r.listSkills(),o=await r.listMcp(),a=await zS(),c=new Map(i.map(p=>[p.slug,p.installedTo||[]])),l=new Map(o.map(p=>[p.slug,p.installedTo||[]])),d=e.artifacts;n&&(d=d.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=d.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 ${d.length} artifact(s):`),console.log("");let f={};for(let p of d)f[p.type]=f[p.type]||[],f[p.type].push(p);for(let p of["pack","skill","mcp","engine"]){let g=f[p]||[];if(g.length!==0){console.log(`${p}s (${g.length}):`);for(let m of g){let h=m.latestVersion?` v${m.latestVersion}`:"",w=u(m),_=w?fr.local:fr.remote,E=w?` ${fr.installed}`:"";console.log(` ${_} ${m.slug}${h}${E}`)}console.log("")}}console.log(`Legend: ${fr.local} Local ${fr.remote} Remote ${fr.installed} Installed`),console.log("")}function Xl(t){try{return(0,ti.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 zS(){return new Set((await(0,Jp.listInstalledCustomEngines)()).map(t=>t.id))}async function Qp(){let t=QU();ni.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(Xp()&&(e.status===403||e.status===404)){ni.appendLine("[Store] GitHub Pages not available, trying API with auth...");let r=Ro(),s=`https://api.github.com/repos/${r.owner}/${r.repo}/contents/dist/store-index.json`;if(e=await zp(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 qp(t,e){let n=Ro(),s=`${(0,ti.getStorePath)(t)}/${e}/v`,i=`https://api.github.com/repos/${n.owner}/${n.repo}/git/refs/tags`;ni.appendLine(`[Store] Listing versions for ${t}/${e}`);let o=await zp(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 d=l.replace("refs/tags/","");if(d.startsWith(s)){let u=d.slice(s.length-1);c.push({version:u.replace(/^v/,""),tagName:d,isPrerelease:/-(alpha|beta|rc|pre)/.test(u)})}}return c.sort((l,d)=>d.version.localeCompare(l.version,void 0,{numeric:!0}))}async function Kp(t,e,n){let r=Ro(),s=(0,ti.getStorePath)(t),i;n==="main"||n==="latest"?i=r.defaultBranch:i=`${s}/${e}/v${n.replace(/^v/,"")}`,ni.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 zp(a);if(!c.ok)throw new Error(`Failed to download: ${c.status} ${c.statusText}`);let l=Buffer.from(await c.arrayBuffer()),d=(0,JU.gunzipSync)(l),u=aH(d),f=`${s}/${e}/`,p=[];for(let[g,m]of u){let h=g.indexOf("/");if(h===-1)continue;let w=g.slice(h+1);if(w.startsWith(f)){let _=w.slice(f.length);_&&p.push({path:_,content:m})}}return p}function aH(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 QS=S(eg=>{"use strict";Object.defineProperty(eg,"__esModule",{value:!0});eg.parsePackInstallRef=cH;function cH(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 eA=S($s=>{"use strict";var lH=$s&&$s.__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]})),uH=$s&&$s.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),ZS=$s&&$s.__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"&&lH(n,e,r[s]);return uH(n,e),n}})();Object.defineProperty($s,"__esModule",{value:!0});$s.packCommand=gH;var Co=ZS(require("fs")),Ql=ZS(require("path")),ko=vi(),zl=et(),dH=Ri(),pr=mo(),fH=Zp(),pH=QS(),tg="-".repeat(62);async function gH(t){let e=t.workspace;switch(t.action){case"list":await mH(e);break;case"validate":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack validate <name>"),process.exit(1)),await EH(t.name,e);break;case"info":t.name||(console.error("Error: Pack name required. Usage: agenthippo pack info <name>"),process.exit(1)),await _H(t.name,e);break;case"sign":await wH(t);break;case"verify":await SH(t);break;case"digest":await AH(t);break;case"keygen":yH(t);break;case"install":await hH(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 hH(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,pH.parsePackInstallRef)(t.name);await(0,fH.installFromStore)({action:"install",query:`pack/${n}${r?`@${r}`:""}`,workspace:t.workspace,version:r,force:t.force,installDir:Ql.resolve(e),verbose:t.verbose})}async function mH(t){let e=(0,ko.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}/${zl.AGENTIDE_DIR_NAME}/agents/`),console.log(` User library: ~/${zl.AGENTIDE_DIR_NAME}/agents/`),console.log(""),console.log("Create a pack with:"),console.log(` mkdir -p ~/${zl.AGENTIDE_DIR_NAME}/agents/my-agent/1.0.0`),console.log(` echo "1.0.0" > ~/${zl.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 EH(t,e){console.log(`Validating pack: ${t}`),console.log("");let n=(0,ko.resolvePackPath)(t,e);n||(console.error(`Error: Pack not found: ${t}`),process.exit(1));let r=[],s=[],i=Ql.join(n,"agent.yaml");Co.existsSync(i)?console.log(" OK: agent.yaml exists"):r.push("Missing agent.yaml");try{let o=await(0,ko.loadAgentPack)(t,e);console.log(` OK: metadata.name: ${o.manifest.metadata.name}`),console.log(` OK: metadata.version: ${o.manifest.metadata.version}`),console.log(` OK: spec.engine: ${o.manifest.spec.engine}`),o.manifest.spec.model?console.log(` OK: spec.model: ${o.manifest.spec.model}`):s.push("spec.model not specified, will use default"),o.manifest.spec.cheapModel&&console.log(` OK: spec.cheapModel: ${o.manifest.spec.cheapModel}`),o.manifest.spec.effort&&console.log(` OK: spec.effort: ${o.manifest.spec.effort}`);let a=Ql.join(n,"AGENTS.md");if(Co.existsSync(a)){let c=Co.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 _H(t,e){try{let n=await(0,ko.loadAgentPack)(t,e);if(console.log(""),console.log(tg),console.log(`Agent: ${n.manifest.metadata.name}`),console.log(tg),console.log(`Version: ${n.manifest.metadata.version}`),n.manifest.metadata.description&&console.log(`Description: ${n.manifest.metadata.description}`),n.manifest.metadata.author&&console.log(`Author: ${n.manifest.metadata.author}`),console.log(`Engine: ${n.manifest.spec.engine}`),n.manifest.spec.model&&console.log(`Model: ${n.manifest.spec.model}`),n.manifest.spec.cheapModel&&console.log(`Cheap Model: ${n.manifest.spec.cheapModel}`),n.manifest.spec.effort&&console.log(`Effort: ${n.manifest.spec.effort}`),console.log(`Path: ${n.packPath}`),n.manifest.spec.permissions&&(console.log(""),console.log("Permissions:"),console.log(` File Access: ${n.manifest.spec.permissions.fileAccess||"default"}`)),n.manifest.spec.mcpServers&&n.manifest.spec.mcpServers.length>0){console.log(""),console.log("MCP Servers:");for(let r of n.manifest.spec.mcpServers)console.log(` - ${r.name}`)}console.log(tg),console.log("")}catch(n){console.error(`Error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function ng(t,e){t||(console.error("Error: pack name or path required"),process.exit(1));let n=(0,ko.resolvePackPath)(t,e);n||(console.error(`Error: pack not found: ${t}`),process.exit(1));let r=await(0,ko.loadAgentPack)(n,e);return{packPath:r.packPath,name:r.manifest.metadata.name,version:r.manifest.metadata.version??"0.0.0"}}function yH(t){let e=t.kid||`sign-${new Date().toISOString().slice(0,10)}`,n=(0,dH.generateWarrantKeypair)(e),r=t.output;r?(Co.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 wH(t){let{packPath:e,name:n,version:r}=await ng(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=Co.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,pr.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 ${Ql.join(e,pr.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 SH(t){let{packPath:e,name:n,version:r}=await ng(t.name,t.workspace),s=(0,pr.readPackSignature)(e);s||(console.error(`UNSIGNED: no ${pr.PACK_SIGNATURE_FILE} at ${e}`),console.error((0,pr.describePackRefusal)({kind:"unsigned",detail:`no ${pr.PACK_SIGNATURE_FILE}`,pack:n,packVersion:r,packDir:e})),process.exit(1));let i={};if(t.keys)try{i=JSON.parse(Co.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,pr.loadPackTrustRoot)({env:t.jwks?{...process.env,[pr.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,pr.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,pr.verifyPack)(s,i,{packDir:e,pack:n,packVersion:r});o.ok||(console.error(`INVALID: ${o.reason}`),console.error((0,pr.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 AH(t){let{packPath:e,name:n,version:r}=await ng(t.name,t.workspace);console.log(`${(0,pr.computePackDigest)(e)} ${n}@${r}`)}});var nA=S(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.parseStrictJsonConfig=tA;Ra.collectMissingChannelEnvSecrets=bH;Ra.disableChannelsInConfigText=vH;var TH=8;function ji(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function tA(t){try{return JSON.parse(t)}catch{return}}function rg(t,e,n){if(!(n>TH)){if(Array.isArray(t)){for(let r of t)rg(r,e,n+1);return}if(ji(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))rg(r,e,n+1)}}}function bH(t,e){if(!ji(t)||!ji(t.channels))return[];let n=[];for(let[r,s]of Object.entries(t.channels)){if(!ji(s)||s.enabled===!1)continue;let i=new Set;rg(s,i,0);let o=[...i].filter(a=>!e[a]?.trim()).sort();o.length&&n.push({channel:r,envVars:o})}return n}function vH(t,e){let n=tA(t);if(!(!ji(n)||!ji(n.channels))){for(let r of e){let s=n.channels[r];ji(s)&&(s.enabled=!1)}return`${JSON.stringify(n,null,2)}
653
+ `}}});var sA=S(Zl=>{"use strict";Object.defineProperty(Zl,"__esModule",{value:!0});Zl.quoteWindowsCommandLineArg=rA;Zl.buildWindowsArgumentLine=OH;function rA(t){return t.length===0?'""':/[ \t"]/u.test(t)?`"${t.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\+)$/g,"$1$1")}"`:t}function OH(t){return t.map(e=>rA(e)).join(" ")}});var iA=S(sg=>{"use strict";Object.defineProperty(sg,"__esModule",{value:!0});sg.isGatewayScopeAuthError=PH;function PH(t){let e=t.toLowerCase();return e.includes("missing scope")||e.includes("operator.admin")}});var oA=S(gr=>{"use strict";Object.defineProperty(gr,"__esModule",{value:!0});gr.ANYWHERE_INSTALL_SOURCE_FORMS=gr.ANYWHERE_CONFIG_TEMPLATE_ENV=gr.ANYWHERE_SETUP_SCRIPT_ENV=gr.ANYWHERE_INSTALL_SOURCE_ENV=void 0;gr.validateAnywhereInstallSource=$H;gr.ANYWHERE_INSTALL_SOURCE_ENV="AH_INSTALL_SOURCE";gr.ANYWHERE_SETUP_SCRIPT_ENV="AH_SETUP_SCRIPT";gr.ANYWHERE_CONFIG_TEMPLATE_ENV="AH_CONFIG_TEMPLATE";var IH=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*(?:@[a-zA-Z0-9^~*><=][a-zA-Z0-9.^~*+><=|_-]*)?$/,NH=/^github:[A-Za-z0-9][A-Za-z0-9._-]*\/[A-Za-z0-9][A-Za-z0-9._-]*(?:#[A-Za-z0-9._/-]+)?$/,RH=/^https:\/\/[A-Za-z0-9._-]+(?::\d+)?\/[A-Za-z0-9._~!$'()*+,;=:@%/-]*\.(?:tgz|tar\.gz)$/,CH=/^(?:\.{1,2})?\/[^\0<>"'`;|&$\n\r]*$/,kH=/^[A-Za-z]:[\\/][^\0<>"'`;|&$\n\r]*$/;gr.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 $H(t){let e=r=>({ok:!1,reason:`${r} \u2014 ${gr.ANYWHERE_INSTALL_SOURCE_FORMS}`}),n=t.trim();return n?n!==t?e("it has leading or trailing whitespace"):IH.test(n)||NH.test(n)||RH.test(n)||CH.test(n)||kH.test(n)?{ok:!0}:e("it is not one of the accepted forms"):e("it is empty")}});var OA=S(G=>{"use strict";var DH=G&&G.__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]})),LH=G&&G.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),cu=G&&G.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&DH(n,e,r[s]);return LH(n,e),n}})();Object.defineProperty(G,"__esModule",{value:!0});G.GatewayLifecycleManager=G.validateAnywhereInstallSource=G.ANYWHERE_SETUP_SCRIPT_ENV=G.ANYWHERE_INSTALL_SOURCE_ENV=G.ANYWHERE_CONFIG_TEMPLATE_ENV=G.AGENT_ANYWHERE_LABEL=void 0;G.detectGateway=ru;var $=cu(require("vscode")),su=require("child_process"),ig=require("crypto"),hA=require("util"),H=cu(require("fs")),q=cu(require("path")),os=cu(require("os")),ve=Xo(),og=Ba(),ag=nA(),MH=sA(),GH=iA(),cg=tp(),lg=et(),Wt=(0,hA.promisify)(su.exec),UH=(0,hA.promisify)(su.execFile),pe=process.platform==="win32",mA=process.platform==="darwin";function aA(t,e){if(e)for(let n of e.split(q.delimiter)){let r=n.trim();r.length>0&&t.add(r)}}function HH(){let t=new Set,e=os.homedir();aA(t,"/usr/bin:/bin:/usr/sbin:/sbin"),aA(t,process.env.PATH);let n=[q.join(e,".local","bin"),q.join(e,"Library","pnpm"),q.join(e,".local","share","pnpm"),q.join(e,".npm-global","bin"),q.join(e,".volta","bin"),q.join(e,".fnm"),q.join(e,".asdf","shims"),"/opt/homebrew/bin","/usr/local/bin"];for(let i of n)H.existsSync(i)&&t.add(i);let r=process.env.NVM_DIR||q.join(e,".nvm"),s=q.join(r,"versions","node");if(H.existsSync(s))try{let i=H.readdirSync(s,{withFileTypes:!0}).filter(o=>o.isDirectory()).map(o=>o.name).sort().reverse().slice(0,8);for(let o of i){let a=q.join(s,o,"bin");H.existsSync(a)&&t.add(a)}}catch{}return Array.from(t).join(q.delimiter)}function eu(){return mA&&H.existsSync("/bin/zsh")?"/bin/zsh":"/bin/bash"}function tu(t){return mA?["-lic",t]:["-lc",t]}function ug(){if(!pe)return{...process.env,PATH:HH(),npm_config_script_shell:"/bin/sh"}}G.AGENT_ANYWHERE_LABEL="Agent Anywhere";var $o=`${G.AGENT_ANYWHERE_LABEL} Setup`,xi=`${G.AGENT_ANYWHERE_LABEL} Uninstall`,Bi=18789,dg=q.join(os.homedir(),".openclaw","gateway.log"),cA="Open Gateway Log";function jH(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}function xH(t){try{if(!H.existsSync(t))return;let n=H.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=jH(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 Ca(t){let e=xH(t),n=e?`${G.AGENT_ANYWHERE_LABEL}: Gateway failed to start. ${e}`:`${G.AGENT_ANYWHERE_LABEL}: Gateway failed to start.`;if(await $.window.showErrorMessage(n,cA)===cA)try{let s=await $.workspace.openTextDocument($.Uri.file(t));await $.window.showTextDocument(s,{preview:!1})}catch(s){let i=s instanceof Error?s.message:String(s);$.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not open gateway log (${i}). Path: ${t}`)}}var BH=3e4,FH=pe?75e3:2e4,VH=3e4,lu=ve.PID_FILES.gateway(),ss="hippoclaw",Sg=["@agenthippo-ai/hippoclaw","openclaw"],Ag=q.join(os.homedir(),".agenthippo","gateway"),iu=q.join(Ag,"install.json"),gg=q.join(Ag,"install-status.json"),Tg=pe?q.join(process.env.LOCALAPPDATA||q.join(os.homedir(),"AppData","Local"),"AgentHippo","bin"):q.join(os.homedir(),".local","bin"),EA=q.join(Tg,pe?"hippoclaw.cmd":"hippoclaw"),hg=q.join(Tg,pe?"openclaw.cmd":"openclaw"),mg=pe?"REM Managed by Agent Anywhere":"# Managed by Agent Anywhere",St=oA();Object.defineProperty(G,"ANYWHERE_CONFIG_TEMPLATE_ENV",{enumerable:!0,get:function(){return St.ANYWHERE_CONFIG_TEMPLATE_ENV}});Object.defineProperty(G,"ANYWHERE_INSTALL_SOURCE_ENV",{enumerable:!0,get:function(){return St.ANYWHERE_INSTALL_SOURCE_ENV}});Object.defineProperty(G,"ANYWHERE_SETUP_SCRIPT_ENV",{enumerable:!0,get:function(){return St.ANYWHERE_SETUP_SCRIPT_ENV}});Object.defineProperty(G,"validateAnywhereInstallSource",{enumerable:!0,get:function(){return St.validateAnywhereInstallSource}});function WH(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 lA=[["npmInstallComplete","npm install complete"],["wrapperExists","wrapper exists"],["configExists","config exists"],["distExists","dist exists"],["webUiExists","web UI exists"],["finalCheckPassed","final check passed"]];function is(t){return t.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()}function _A(t,e){let n=is(t),r=is(e);return n===r||n.startsWith(`${r}/`)}function Fi(){try{if(!H.existsSync(iu))return;let t=H.readFileSync(iu,"utf8").replace(/^/,"");return JSON.parse(t)}catch{return}}function KH(t){H.mkdirSync(Ag,{recursive:!0}),H.writeFileSync(iu,JSON.stringify(t,null,2),"utf8")}function bg(t){let e=t?.packageRoot;if(!(!e||!H.existsSync(e)))try{return H.realpathSync(e)}catch{return e}}function qH(t){if(!t)return;let e=Fi();return!e?.entryScriptPath&&!e?.cliPath?t:(e.wrapperPath||e.openclawWrapperPath)&&[e.wrapperPath,e.openclawWrapperPath].some(n=>n&&is(t)===is(n))&&(e.entryScriptPath&&H.existsSync(e.entryScriptPath)||e.cliPath&&H.existsSync(e.cliPath))?e.entryScriptPath&&H.existsSync(e.entryScriptPath)?e.entryScriptPath:e.cliPath:t}function yA(t){if(!t)return;let e=Fi();return e?.cliPath&&[e.wrapperPath,e.openclawWrapperPath,e.entryScriptPath].some(n=>n&&is(t)===is(n))&&H.existsSync(e.cliPath)?e.cliPath:t}function wA(t){for(let e of[t?.wrapperPath,t?.openclawWrapperPath,t?.cliPath])if(e&&H.existsSync(e))return e}function SA(t){let e=t?.nodePath;if(!(!e||!H.existsSync(e)))return e}function YH(t){let e=t?.entryScriptPath;if(!(!e||!H.existsSync(e)))return e}async function Eg(t,e){let n=e??Fi(),r=t??wA(n)??await vA(),s=yA(r)??r;if(!s||!H.existsSync(s))return;let i=bg(n)??vg(s);if(!i)return;let o=SA(n)??XH(s),a=YH(n)??JH(i);if(!(!o||!a))return{launcherPath:s,packageRoot:i,nodePath:o,entryScriptPath:a}}function AA(t){try{return H.existsSync(t)?H.readFileSync(t,"utf8").includes(mg):!1}catch{return!1}}function uA(t,e,n){H.mkdirSync(q.dirname(n),{recursive:!0});let r=pe?`@echo off\r
635
654
  ${mg}\r
636
655
  "${t}" "${e}" %*\r
637
656
  `:`#!/bin/sh
638
657
  ${mg}
639
658
  exec "${t}" "${e}" "$@"
640
659
  `;return H.writeFileSync(n,r,pe?"ascii":"utf8"),pe||H.chmodSync(n,493),n}function JH(t){if(t)try{let e=q.join(t,"package.json");if(!H.existsSync(e))return;let n=JSON.parse(H.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=q.resolve(t,o);if(H.existsSync(a))return a}}catch{}}function XH(t){let e=yA(t)??t;if(e){let n=q.join(q.dirname(e),pe?"node.exe":"node");if(H.existsSync(n))return n}for(let n of(0,ve.getCommonBinaryPaths)("node"))if(H.existsSync(n))return n}function dA(){for(let t of[EA,hg])if(AA(t))try{H.rmSync(t,{force:!0})}catch{}try{H.rmSync(iu,{force:!0})}catch{}}function TA(t,e){if(H.existsSync(e))try{t.add(H.realpathSync(e))}catch{t.add(e)}}function fA(t,e){for(let n of Sg)TA(t,q.join(e,n))}function zH(){let t=os.homedir(),e=process.env.NVM_DIR||q.join(t,".nvm"),n=q.join(e,"versions","node");if(!H.existsSync(n))return[];let r=[];try{for(let s of H.readdirSync(n,{withFileTypes:!0}))s.isDirectory()&&r.push(...Sg.map(i=>q.join(n,s.name,"lib","node_modules",i)))}catch{}return r}async function ka(){let t=new Set,e=Fi(),n=bg(e);n&&H.existsSync(n)&&t.add(n);let r=q.join(os.homedir(),".agenthippo","tools","node");if(H.existsSync(r))try{let s=H.readdirSync(r,{withFileTypes:!0});for(let i of s)if(i.isDirectory())for(let o of Sg){let a=q.join(r,i.name,...pe?["node_modules"]:["lib","node_modules"],o);if(H.existsSync(a))try{t.add(H.realpathSync(a))}catch{t.add(a)}}}catch{}fA(t,q.join(os.homedir(),".npm-global",...pe?["node_modules"]:["lib","node_modules"]));for(let s of zH())TA(t,s);try{let{stdout:s}=await Wt("npm root -g",{timeout:3e3}),i=s.trim();i&&fA(t,i)}catch{}return Array.from(t)}function vg(t){try{let e=qH(t)??t,n=H.realpathSync(e),r=q.dirname(n);for(let s=0;s<8;s++){if(H.existsSync(q.join(r,"package.json")))return r;let i=q.dirname(r);if(i===r)break;r=i}}catch{}}async function _g(t,e){let n=e??await ka();if(n.length===0)return!1;let r=vg(t);return r?n.some(s=>_A(r,s)):!1}async function QH(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(pe)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 Wt(`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 Wt(`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 Wt(`ps -p ${s} -o command=`,{timeout:3e3}),o=i.trim();o&&r.push(o)}catch{}return r}catch{return[]}}async function ou(t,e){let n=await ka();if(n.length===0)return!1;let r=!1,s="";if(e&&(r=await _g(e,n),r))try{s=H.realpathSync(e)}catch{s=e}let i=await QH(t);if(i.length===0)return!1;let o=Fi(),a=SA(o),c=[...i];a&&c.push(a);let l=n.map(u=>is(u));a&&l.push(is(q.dirname(a)));let d=s?is(s):"";for(let u of c){let f=is(u);if(f.includes(ss)&&r||d&&f.includes(d)||l.some(p=>f.includes(p)))return!0}return!1}async function ru(t=Bi){let[e,n]=await Promise.all([(0,ve.probePort)(t),ka()]),r=await vA(n),s;if(r)try{let{stdout:a}=await Wt(`"${r}" --version`,{timeout:3e3});s=a.trim().split(`
641
- `)[0]}catch{}let i=!!r&&!!s,o=e?await ou(t,r):!1;return{installed:i,binaryPath:r,version:s,running:o,port:t}}async function bA(t,e){try{if(pe){let n=await Eg(t);if(n){e("Running gateway stop via managed node runtime..."),await UH(n.nodePath,[n.entryScriptPath,"gateway","stop"],{timeout:2e4,windowsHide:!0});return}}e(`Running ${q.basename(t)} gateway stop (CLI)...`),await Wt(`"${t}" gateway stop`,{timeout:2e4,windowsHide:!0})}catch{}}function ZH(){try{if(!H.existsSync(gg))return;let t=H.readFileSync(gg,"utf8").replace(/^\uFEFF/,"");return JSON.parse(t)}catch{return}}function ej(t){return t?.phase==="complete"&&t.steps?.finalCheckPassed===!0}function tj(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=lA.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/lA.length*100))}}function nu(t){return t.replace(/'/g,"''")}async function Do(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(pe)try{let{stdout:e}=await Wt(`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 Wt(`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 au(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,ve.probePort)(t),a=r.filter(c=>(0,ve.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,ve.probePort)(t)&&r.every(o=>!(0,ve.isProcessRunning)(o))}function pA(t,e,n){if(e&&e>0)try{process.kill(-e,n);return}catch{}try{t.kill(n)}catch{}}async function yg(t){if(!(!Number.isFinite(t)||t<1||t>65535)){if(pe){try{let{stdout:e}=await Wt(`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 Wt(`taskkill /F /T /PID ${r}`,{timeout:5e3}).catch(()=>{})}catch{}return}try{let{stdout:e}=await Wt(`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 Wt(`kill ${i}`,{timeout:3e3}).catch(()=>{});await new Promise(i=>setTimeout(i,800));let{stdout:r}=await Wt(`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 Wt(`kill -9 ${i}`,{timeout:3e3}).catch(()=>{})}catch{}}}async function gA(t,e,n){let r=await Do(t);if(e&&(await bA(e,n),await au(t,r)))return!0;n(`Stopping listener(s) on port ${t}...`),await yg(t);let s=[...r];return t!==Bi&&await(0,ve.probePort)(Bi)&&(s.push(...await Do(Bi)),n(`Stopping listener(s) on port ${Bi} (default gateway port)...`),await yg(Bi)),au(t,s)}async function nj(t,e,n){await(0,ve.writePidFile)(lu,t,e,n)}async function fg(){await(0,ve.removePidFile)(lu)}async function pg(t){let e=await(0,ve.checkPidFileWithCleanup)(lu);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,ve.probePort)(s)||!await ou(s,r)?null:{installed:!0,binaryPath:r,running:!0,port:s}}async function vA(t){let e=t??await ka();return rj(e)}async function rj(t){let e=Fi(),n=bg(e),r=wA(e);if(n&&r&&H.existsSync(r)&&(t.length===0||t.some(a=>_A(n,a))))return r;let s=await(0,ve.findBinaryCached)(ss,(0,ve.getCommonBinaryPaths)(ss));if(s&&await _g(s,t))return s;let i=pe?`${ss}.cmd`:ss;for(let o of t){let a=pe?q.dirname(q.dirname(o)):q.dirname(q.dirname(q.dirname(o))),c=pe?q.join(a,i):q.join(a,"bin",i);if(H.existsSync(c)&&await _g(c,t))return c}}var wg=class{outputChannel;process=null;healthCheckTimer=null;_status="not-installed";_bridgeConnected=!1;_lastDetection=null;_bridgeRef=null;_gatewayInstallInProgress=!1;_installProgressMessage;_installSetupTerminal=null;_gatewayUninstallInProgress=!1;_uninstallSetupTerminal=null;_startInFlight=null;_lastStartInProgressNoticeAt=0;_hasConfiguredChannelsCache;disposables=[];statusBarItem;_onStatusChange=new $.EventEmitter;onStatusChange=this._onStatusChange.event;setBridgeRef(e){this._bridgeRef=e}constructor(e,n){this.outputChannel=e,this.statusBarItem=$.window.createStatusBarItem($.StatusBarAlignment.Right,100),this.statusBarItem.command="agentide.anywhere.toggle",this.statusBarItem.name=G.AGENT_ANYWHERE_LABEL,$.commands.executeCommand("setContext","agentide.anywhere.connected",this._bridgeConnected),this.disposables.push($.window.onDidCloseTerminal(r=>{this._installSetupTerminal===r&&(this._installSetupTerminal=null,this._gatewayInstallInProgress&&this.reconcileInstallProgressState()),this._uninstallSetupTerminal===r&&(this._uninstallSetupTerminal=null,this._gatewayUninstallInProgress&&this.reconcileUninstallProgressState())})),this.registerCommands(),this.registerConfigWatcher(),this.initializeLazy()}setInstallProgressFlag(e,n){this._gatewayInstallInProgress!==e&&(this._gatewayInstallInProgress=e,this.log(`Install flag -> ${e?"true":`false (${n})`}`))}get status(){return this._status}get lastDetection(){return this._lastDetection}async initializeLazy(){if(this.getConfig("hidden",!1)){this.statusBarItem.hide();return}if(!this.getConfig("enabled",!1)){this.updateStatusBar("not-installed"),this.statusBarItem.show();return}let r=this.getGatewayPort(),s=await pg(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,lg.toSettingsDisplayKey)("agentide.anywhere.autoStart")} = true)`),await this.start())}registerCommands(){this.disposables.push($.commands.registerCommand("agentide.anywhere.toggle",()=>this.toggle()),$.commands.registerCommand("agentide.anywhere.install",()=>this.install()),$.commands.registerCommand("agentide.anywhere.uninstall",()=>this.uninstall()),$.commands.registerCommand("agentide.anywhere.start",()=>this.start()),$.commands.registerCommand("agentide.anywhere.stop",()=>this.stop()),$.commands.registerCommand("agentide.anywhere.status",()=>this.showStatus()),$.commands.registerCommand("agentide.anywhere.openConfig",()=>this.openConfig()),$.commands.registerCommand("agentide.anywhere.connect",()=>this.connectBridge()),$.commands.registerCommand("agentide.anywhere.disconnect",()=>this.disconnectBridge()),$.commands.registerCommand("agentide.anywhere.openWebUI",()=>this.openWebUI()),$.commands.registerCommand("agentide.anywhere.detect",()=>this.detect()),$.commands.registerCommand("agentide.anywhere.meetAgent",()=>this.showMeetAgentPicker()))}setBridgeConnected(e){this._bridgeConnected=e,$.commands.executeCommand("setContext","agentide.anywhere.connected",e)}registerConfigWatcher(){this.disposables.push($.workspace.onDidChangeConfiguration(e=>{e.affectsConfiguration("agentide.anywhere")&&this.initializeLazy()}))}async toggle(){if(!this.getConfig("hidden",!1)){if(this._gatewayInstallInProgress){await this.showGatewayInstallInProgressPrompt();return}if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting");let n=Date.now();n-this._lastStartInProgressNoticeAt>4e3&&(this._lastStartInProgressNoticeAt=n,$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Starting gateway... please wait.`));return}switch(this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._status){case"error":{this._lastDetection?.installed===!0?await this.showDisconnectedQuickMenu():await this.showNotInstalledQuickMenu();break}case"starting":case"stopping":$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Operation in progress...`);break;case"running":this._bridgeConnected?await this.showConnectedQuickMenu():await this.showDisconnectedQuickMenu();break;case"installed":await this.showDisconnectedQuickMenu();break;case"not-installed":default:{if(this._lastDetection?.installed===!0){await this.showDisconnectedQuickMenu();break}await this.showNotInstalledQuickMenu();break}}}}queueBackgroundDetect(e){this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||setTimeout(()=>{this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||this.detect().catch(n=>{this.log(`Background detect failed after ${e}: ${n instanceof Error?n.message:String(n)}`)})},100)}async showConnectedQuickMenu(){let n=this._hasConfiguredChannelsCache??await this.refreshHasConfiguredChannels()?"Meet at...":"Web UI",r=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL} is running (bridge: connected).`,n,"Disconnect","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening connected menu"),this.refreshHasConfiguredChannels(),await r){case"Meet at...":await this.showMeetAgentPicker();break;case"Web UI":await this.openWebUI();break;case"Disconnect":await this.disconnectBridge();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showDisconnectedQuickMenu(){let e=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Disconnected.`,"Connect","Reinstall","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening disconnected menu"),await e){case"Connect":await this.start(),this._status==="running"&&(await this.connectBridge(),this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._bridgeConnected&&await this.showConnectedQuickMenu());break;case"Reinstall":await this.install();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showGatewayInstallInProgressPrompt(){await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Install in progress. Follow the "${G.AGENT_ANYWHERE_LABEL} Setup" terminal; when it finishes, status updates automatically.`,"Show Setup Terminal","OK")==="Show Setup Terminal"&&(this.revealInstallSetupTerminal()||await this.showMissingInstallSetupTerminalPrompt())}async showMissingInstallSetupTerminalPrompt(){(await this.reconcileInstallProgressState())?.installed?$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Install completed. Status has been refreshed.`):$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Setup terminal is no longer available. Install did not complete; run Install again to relaunch setup.`)}async showGatewayUninstallInProgressPrompt(){await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Uninstall in progress. Follow the "${xi}" terminal; when it finishes, status updates automatically.`,"Show Uninstall Terminal","OK")==="Show Uninstall Terminal"&&(this.revealUninstallSetupTerminal()||await this.showMissingUninstallSetupTerminalPrompt())}async showMissingUninstallSetupTerminalPrompt(){let e=await this.reconcileUninstallProgressState();e&&!e.installed&&!e.running?$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Uninstall completed. Status has been refreshed.`):$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Uninstall terminal is no longer available. Uninstall may still be running or did not complete; run Status to confirm.`)}revealInstallSetupTerminal(){let e=this._installSetupTerminal??$.window.terminals.find(n=>n.name===$o||n.name.startsWith(`${$o} `))??null;return e?(this._installSetupTerminal=e,e.show(),!0):!1}revealUninstallSetupTerminal(){let e=this._uninstallSetupTerminal??$.window.terminals.find(n=>n.name===xi||n.name.startsWith(`${xi} `))??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,ve.clearBinaryCache)(ss),(0,ve.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 ZH()}getInstallProgressSummary(e){return tj(e)}async detectGatewayState(e){return ru(e)}async detectGatewayFastState(e){return pg(e)}async probeGatewayPort(e){return(0,ve.probePort)(e)}isStartedGatewayProcessAlive(e){return e!==void 0&&(0,ve.isProcessRunning)(e)}getStartupTimeoutMs(){return FH}getStartupCheckIntervalMs(){return 500}getStartupLaunchGraceMs(){return pe?15e3:0}getUninstallInitialDelayMs(){return pe?2e3:3e3}getUninstallVerificationTimeoutMs(){return pe?15e3:9e4}getUninstallCheckIntervalMs(){return pe?1e3:4e3}async sleep(e){await new Promise(n=>setTimeout(n,e))}isWindowsLaunch(){return pe}async stopExistingGatewayBeforeStart(e){await bA(e,n=>this.log(n))}getGatewayLockPathForConfig(){let e=(0,ig.createHash)("sha256").update(this.configPath).digest("hex").slice(0,8);return q.join(os.tmpdir(),"openclaw",`gateway.${e}.lock`)}async removeStaleGatewayLockBeforeStart(e){if(!pe)return;let n=this.getGatewayLockPathForConfig();if(!H.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 H.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<VH){this.log(`Gateway lock is only ${Math.round(r/1e3)}s old; not removing (possible concurrent start still binding).`);return}try{H.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 nj(e,n,r)}async reconcileUninstallProgressState(){if(!this._gatewayUninstallInProgress)return this._lastDetection;if(this.revealUninstallSetupTerminal())return this._lastDetection;let e=await ru(this.getGatewayPort());return this._lastDetection=e,this._gatewayUninstallInProgress=!1,e.running?this.setStatus("running"):e.installed?this.setStatus("installed"):this.setStatus("not-installed"),e}async showNotInstalledQuickMenu(){let e=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Reach your AgentHippo IDE or CLI agents from WhatsApp, Telegram, Slack, Discord, and more - right from your phone or any messaging app. This will also install OpenClaw fork on your computer.`,"Install","Ask Agent Hippo");switch(this.queueBackgroundDetect("opening not-installed menu"),await e){case"Install":await this.install();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showMaintenanceQuickMenu(){let e=this._status==="running"||this._status==="installed"||this._lastDetection?.installed===!0,r=[...this._status==="running"&&this._hasConfiguredChannelsCache===!0?["Web UI"]:[],"Config","Reset auth","Reset mappings",...e?["Restart"]:[],"Uninstall"],s=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: More options`,...r);switch(this.queueBackgroundDetect("opening maintenance menu"),await s){case"Web UI":await this.openWebUI();break;case"Config":await this.openConfig();break;case"Reset auth":await this.resetAuth();break;case"Reset mappings":await $.commands.executeCommand("agentide.gateway.resetMappings");break;case"Restart":await this.restartGateway();break;case"Uninstall":await this.uninstall();break}}async refreshHasConfiguredChannels(){let e=this._bridgeRef;if(!e?.request)return this._hasConfiguredChannelsCache??!1;try{let{rows:n}=await(0,cg.fetchMeetAgentChannelContext)(e.request.bind(e));this._hasConfiguredChannelsCache=n.length>0}catch(n){this.log(`channels.status probe failed (non-fatal): ${n instanceof Error?n.message:String(n)}`),this._hasConfiguredChannelsCache??=!1}return this._hasConfiguredChannelsCache}async openAskAgentHippoChat(){await $.commands.executeCommand("workbench.action.chat.newChat",{agentMode:!0}),await $.commands.executeCommand("workbench.action.chat.open",{mode:"agent",query:"use openclaw skill as needed.",isPartialQuery:!0})}async showMeetAgentPicker(e){if(!this._bridgeRef?.request){$.window.showWarningMessage("Not connected to gateway.");return}let n=this._bridgeRef.request.bind(this._bridgeRef),r=!1,s=async(i,o)=>{try{return await n(i,o)}catch(a){let c=a instanceof Error?a.message:String(a);if(!r&&(0,GH.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,cg.fetchMeetAgentChannelContext)(s);if(this.log(`Meet Agent: got ${i?.length??0} channel(s): ${i?.map(g=>g.id).join(", ")??"none"}`),!i||i.length===0){let g=await $.window.showInformationMessage("No messaging channels (Telegram, WhatsApp, etc.) are configured. You can chat with your agent in the Gateway Web UI, or set up channels in OpenClaw config.","Open Web UI","Open Config");g==="Open Web UI"?await this.openWebUI():g==="Open Config"&&await this.openConfig();return}let a=e??await this.getFirstRegisteredAgentId();if(!a){$.window.showWarningMessage("No agent registered with the gateway.");return}let l=(await s("agents.list")).external?.find(g=>g.id.toLowerCase()===a.toLowerCase()),d=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:d.has(g.id.toLowerCase())})),f=await $.window.showQuickPick(u,{canPickMany:!0,title:`Meet ${a} at...`,placeHolder:"Select channels where people can reach this agent"});if(!f)return;let p=f.map(g=>g.channelId);if(await(0,cg.applyAgentChannelBindingsViaConfigPatch)(s,{agentId:a,selectedChannelIds:p,statusPayload:o}),p.length===0)$.window.showInformationMessage(`${a}: all channel bindings removed.`);else{let g=f.map(m=>m.label).join(", ");$.window.showInformationMessage(`${a} can now be reached at: ${g}`)}}catch(i){this.log(`Meet Agent picker failed: ${i}`),$.window.showErrorMessage(`Failed to configure channels: ${i instanceof Error?i.message:String(i)}`)}}async getFirstRegisteredAgentId(){if(this._bridgeRef?.request)try{return(await this._bridgeRef.request("agents.list")).external?.[0]?.id}catch{return}}async detect(){let e=this.getGatewayPort(),r=await ru(e);return this._gatewayInstallInProgress||this._gatewayUninstallInProgress?(this._lastDetection=r,r):this._startInFlight&&this._status==="starting"?(this._lastDetection=r,r):(!r.running&&r.installed&&(await this.hasGlobalNpmOpenclawTree()||(r={...r,installed:!1})),this._lastDetection=r,r.running?this.setStatus("running"):r.installed?this.setStatus("installed"):this.setStatus("not-installed"),r)}async install(){let e=this.getConfig("installSource",""),n=this.getGatewayPort();if(!e)return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Install source not configured. Set "${(0,lg.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in settings.`),!1;let r=(0,St.validateAnywhereInstallSource)(e);if(!r.ok)return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Refusing to install from "${e}" \u2014 ${r.reason}. Fix "${(0,lg.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in your user settings.`),this.log(`Rejected installSource (${r.reason}): ${e}`),!1;if(this._gatewayInstallInProgress)return await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Install is already in progress. Watch the "${G.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,ve.clearBinaryCache)(ss),(0,ve.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=pe?"setup-gateway.ps1":"setup-gateway.sh",a=[q.join(__dirname,"..","..","scripts","gateway",i),q.join(__dirname,"..","scripts","gateway",i)].find(h=>H.existsSync(h)),l=[q.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5"),q.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5")].find(h=>H.existsSync(h)),d,u={...ug(),[St.ANYWHERE_INSTALL_SOURCE_ENV]:e,...a?{[St.ANYWHERE_SETUP_SCRIPT_ENV]:a}:{},...l?{[St.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}};if(a&&pe){let h=[`-Source $env:${St.ANYWHERE_INSTALL_SOURCE_ENV}`];l&&h.push(`-ConfigTemplate $env:${St.ANYWHERE_CONFIG_TEMPLATE_ENV}`);let w=`& $env:${St.ANYWHERE_SETUP_SCRIPT_ENV} ${h.join(" ")}; Write-Host ""; Write-Host "You can close this window."`;d={name:$o,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",w],env:{[St.ANYWHERE_INSTALL_SOURCE_ENV]:e,[St.ANYWHERE_SETUP_SCRIPT_ENV]:a,...l?{[St.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}}}}else if(a){let h=[`--source "$${St.ANYWHERE_INSTALL_SOURCE_ENV}"`];l&&h.push(`--config-template "$${St.ANYWHERE_CONFIG_TEMPLATE_ENV}"`);let _=`${`bash "$${St.ANYWHERE_SETUP_SCRIPT_ENV}" ${h.join(" ")}`}; echo ""; echo "Press Enter to close..."; read`;d={name:$o,shellPath:eu(),shellArgs:tu(_),env:u}}else{this.log("Setup script not found, falling back to npm install");let w=`${`npm install -g "$${St.ANYWHERE_INSTALL_SOURCE_ENV}"`}; echo ""; echo "Press Enter to close..."; read`;d=pe?{name:$o,shellPath:"cmd.exe",shellArgs:["/c",`npm install -g "%${St.ANYWHERE_INSTALL_SOURCE_ENV}%" && echo. && echo Setup complete. && pause`],env:{[St.ANYWHERE_INSTALL_SOURCE_ENV]:e}}:{name:$o,shellPath:eu(),shellArgs:tu(w),env:u}}try{H.rmSync(gg,{force:!0})}catch{}this._installProgressMessage="Launching setup...",this.updateStatusBar("starting");let f=$.window.createTerminal(d);this._installSetupTerminal=f,f.show();let p=WH(e)?10*6e4:12e4;this.log(`Waiting up to ${Math.round(p/6e4)} minute(s) for gateway install completion...`);let g=pe&&!!a;return await $.window.withProgress({location:$.ProgressLocation.Window,title:`${G.AGENT_ANYWHERE_LABEL}: Installing gateway...`,cancellable:!1},async h=>{let w=Date.now()+p,_=0;for(;Date.now()<w;){if(!this._gatewayInstallInProgress)return this.log("Gateway install wait aborted \u2014 setup terminal closed before completion was detected"),!1;let E=this.readInstallStatusSnapshot(),O=this.getInstallProgressSummary(E);this._installProgressMessage=O.message,this.updateStatusBar("starting");let T=Math.max(0,O.percent-_);if(h.report({message:O.message,increment:T}),_=Math.max(_,O.percent),E?.phase==="failed")return this.log(`Gateway install failed: ${E.lastError||E.message||"unknown error"}`),!1;(0,ve.clearBinaryCache)(ss),(0,ve.clearBinaryCache)("openclaw");let L=await this.detectGatewayState(n);if(this._lastDetection=L,g?ej(E)&&L.installed:L.installed)return this.log("Gateway installed successfully"),await this.ensureManagedGatewayWrapperState(L.binaryPath),await this.ensureWebUIBuilt(L.binaryPath),this.writeStarterConfig(),await $.workspace.getConfiguration("agentide.anywhere").update("enabled",!0,$.ConfigurationTarget.Global),L.running?(this.finishInstallUiState("running","success"),h.report({message:`Install complete. Gateway is running on port ${n}.`,increment:Math.max(0,100-_)})):(this.finishInstallUiState("installed","success"),h.report({message:"Install complete. Gateway is installed. Click Agent Anywhere to start.",increment:Math.max(0,100-_)})),$.window.showInformationMessage(L.running?`${G.AGENT_ANYWHERE_LABEL}: Installed and running. Open the config to add your channels or use the status bar to connect.`:`${G.AGENT_ANYWHERE_LABEL}: Installed. Open the config to add your channels, then click Agent Anywhere to start.`,"Open Config").then(async b=>{b==="Open Config"&&await this.openConfig()}),!0;await new Promise(I=>setTimeout(I,1e3))}return!1})?!0:(this.log("Gateway install timed out or failed"),this.finishInstallUiState("error","failure"),!1)}catch(s){return this.log(`Install failed: ${s instanceof Error?s.message:String(s)}`),this.finishInstallUiState("error","failure"),!1}finally{this._gatewayInstallInProgress&&(this.setInstallProgressFlag(!1,"finally"),this._installProgressMessage=void 0),this.updateStatusBar(this._status)}}async uninstall(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}await this.stop();let e=pe?"setup-gateway.ps1":"setup-gateway.sh",r=[q.join(__dirname,"..","scripts","gateway",e),q.join(__dirname,"..","..","scripts","gateway",e)].find(i=>H.existsSync(i)),s;if(r&&pe){let i=`& "${r}" -Uninstall; Write-Host ""; Write-Host "You can close this window."`;s={name:xi,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:xi,shellPath:eu(),shellArgs:tu(o),env:ug()}}else{let i="npm uninstall -g openclaw",o=`${i}; echo ""; echo "Press Enter to close..."; read`;s=pe?{name:xi,shellPath:"cmd.exe",shellArgs:["/c",`${i} && echo. && pause`]}:{name:xi,shellPath:eu(),shellArgs:tu(o),env:ug()}}this._gatewayUninstallInProgress=!0,this.setStatus("stopping");try{let i=$.window.createTerminal(s);this._uninstallSetupTerminal=i,i.show(),this.log("Gateway uninstall started in terminal"),(0,ve.clearBinaryCache)(ss),(0,ve.clearBinaryCache)("openclaw"),await this.sleep(this.getUninstallInitialDelayMs());let o=Date.now()+this.getUninstallVerificationTimeoutMs(),a,c=!0;for(;Date.now()<o;){(0,ve.clearBinaryCache)(ss),(0,ve.clearBinaryCache)("openclaw");let l=await this.detectGatewayState(this.getGatewayPort());if(a=l,this._lastDetection=l,c=await this.hasGlobalNpmOpenclawTree(),!c&&!l.running){dA(),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){dA(),this.setStatus("not-installed"),this.log("Global OpenClaw package removed (or no longer detected).");return}await this.sleep(this.getUninstallCheckIntervalMs())}!c&&a?.running?$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Managed package was removed, but the gateway listener still appears to be running. Finish the terminal command or run Status.`):$.window.showWarningMessage(`${G.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 q.join(os.homedir(),".openclaw","openclaw.json")}writeStarterConfig(){let e=q.dirname(this.configPath);if(H.existsSync(this.configPath)){this.log("Config already exists, skipping starter config");return}let r=[q.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5"),q.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5")].find(o=>H.existsSync(o));if(!r){this.log("Starter config template not found, skipping");return}H.mkdirSync(e,{recursive:!0,mode:448});let s=H.readFileSync(r,"utf-8"),i=`ah-${(0,ig.randomBytes)(24).toString("hex")}`;s=s.replace("__GENERATED_TOKEN__",i),H.writeFileSync(this.configPath,s,{encoding:"utf-8",mode:pe?void 0:384}),this.log(`Wrote starter config to ${this.configPath}`)}async openConfig(){H.existsSync(this.configPath)||this.writeStarterConfig();let e=await $.workspace.openTextDocument(this.configPath);await $.window.showTextDocument(e)}async preflightChannelSecrets(e){let n;try{n=H.readFileSync(this.configPath,"utf-8")}catch{return"continue"}let r=(0,ag.parseStrictJsonConfig)(n);if(r===void 0)return"continue";let s=(0,ag.collectMissingChannelEnvSecrets)(r,e);if(s.length===0)return"continue";let i=(0,og.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",d=await $.window.showErrorMessage(`${G.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(d===c){let u=(0,ag.disableChannelsInConfigText)(n,s.map(p=>p.channel));if(!u)return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath}. Set "enabled": false on the ${o} channel manually, then start again.`),"abort";let f=`${this.configPath}.bak-missing-secrets`;try{H.copyFileSync(this.configPath,f),H.writeFileSync(this.configPath,u,{encoding:"utf-8",mode:pe?void 0:384})}catch(p){let g=p instanceof Error?p.message:String(p);return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath} (${g}).`),"abort"}return this.log(`Disabled channels missing secrets: ${o} (backup: ${f})`),$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Disabled the ${o} channel (backup: ${q.basename(f)}). To re-enable: add ${a.join(", ")} to ${i}, set "enabled": true in the config, then restart the gateway.`),"continue"}return d===l&&await this.openEnvFileWithSecretStubs(i,a),"abort"}async openEnvFileWithSecretStubs(e,n){try{let r="";try{r=H.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(`
660
+ `)[0]}catch{}let i=!!r&&!!s,o=e?await ou(t,r):!1;return{installed:i,binaryPath:r,version:s,running:o,port:t}}async function bA(t,e){try{if(pe){let n=await Eg(t);if(n){e("Running gateway stop via managed node runtime..."),await UH(n.nodePath,[n.entryScriptPath,"gateway","stop"],{timeout:2e4,windowsHide:!0});return}}e(`Running ${q.basename(t)} gateway stop (CLI)...`),await Wt(`"${t}" gateway stop`,{timeout:2e4,windowsHide:!0})}catch{}}function ZH(){try{if(!H.existsSync(gg))return;let t=H.readFileSync(gg,"utf8").replace(/^\uFEFF/,"");return JSON.parse(t)}catch{return}}function ej(t){return t?.phase==="complete"&&t.steps?.finalCheckPassed===!0}function tj(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=lA.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/lA.length*100))}}function nu(t){return t.replace(/'/g,"''")}async function Do(t){if(!Number.isFinite(t)||t<1||t>65535)return[];if(pe)try{let{stdout:e}=await Wt(`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 Wt(`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 au(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,ve.probePort)(t),a=r.filter(c=>(0,ve.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,ve.probePort)(t)&&r.every(o=>!(0,ve.isProcessRunning)(o))}function pA(t,e,n){if(e&&e>0)try{process.kill(-e,n);return}catch{}try{t.kill(n)}catch{}}async function yg(t){if(!(!Number.isFinite(t)||t<1||t>65535)){if(pe){try{let{stdout:e}=await Wt(`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 Wt(`taskkill /F /T /PID ${r}`,{timeout:5e3}).catch(()=>{})}catch{}return}try{let{stdout:e}=await Wt(`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 Wt(`kill ${i}`,{timeout:3e3}).catch(()=>{});await new Promise(i=>setTimeout(i,800));let{stdout:r}=await Wt(`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 Wt(`kill -9 ${i}`,{timeout:3e3}).catch(()=>{})}catch{}}}async function gA(t,e,n){let r=await Do(t);if(e&&(await bA(e,n),await au(t,r)))return!0;n(`Stopping listener(s) on port ${t}...`),await yg(t);let s=[...r];return t!==Bi&&await(0,ve.probePort)(Bi)&&(s.push(...await Do(Bi)),n(`Stopping listener(s) on port ${Bi} (default gateway port)...`),await yg(Bi)),au(t,s)}async function nj(t,e,n){await(0,ve.writePidFile)(lu,t,e,n)}async function fg(){await(0,ve.removePidFile)(lu)}async function pg(t){let e=await(0,ve.checkPidFileWithCleanup)(lu);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,ve.probePort)(s)||!await ou(s,r)?null:{installed:!0,binaryPath:r,running:!0,port:s}}async function vA(t){let e=t??await ka();return rj(e)}async function rj(t){let e=Fi(),n=bg(e),r=wA(e);if(n&&r&&H.existsSync(r)&&(t.length===0||t.some(a=>_A(n,a))))return r;let s=await(0,ve.findBinaryCached)(ss,(0,ve.getCommonBinaryPaths)(ss));if(s&&await _g(s,t))return s;let i=pe?`${ss}.cmd`:ss;for(let o of t){let a=pe?q.dirname(q.dirname(o)):q.dirname(q.dirname(q.dirname(o))),c=pe?q.join(a,i):q.join(a,"bin",i);if(H.existsSync(c)&&await _g(c,t))return c}}var wg=class{outputChannel;process=null;healthCheckTimer=null;_status="not-installed";_bridgeConnected=!1;_lastDetection=null;_bridgeRef=null;_gatewayInstallInProgress=!1;_installProgressMessage;_installSetupTerminal=null;_gatewayUninstallInProgress=!1;_uninstallSetupTerminal=null;_startInFlight=null;_lastStartInProgressNoticeAt=0;_hasConfiguredChannelsCache;disposables=[];statusBarItem;_onStatusChange=new $.EventEmitter;onStatusChange=this._onStatusChange.event;setBridgeRef(e){this._bridgeRef=e}constructor(e,n){this.outputChannel=e,this.statusBarItem=$.window.createStatusBarItem($.StatusBarAlignment.Right,100),this.statusBarItem.command="agentide.anywhere.toggle",this.statusBarItem.name=G.AGENT_ANYWHERE_LABEL,$.commands.executeCommand("setContext","agentide.anywhere.connected",this._bridgeConnected),this.disposables.push($.window.onDidCloseTerminal(r=>{this._installSetupTerminal===r&&(this._installSetupTerminal=null,this._gatewayInstallInProgress&&this.reconcileInstallProgressState()),this._uninstallSetupTerminal===r&&(this._uninstallSetupTerminal=null,this._gatewayUninstallInProgress&&this.reconcileUninstallProgressState())})),this.registerCommands(),this.registerConfigWatcher(),this.initializeLazy()}setInstallProgressFlag(e,n){this._gatewayInstallInProgress!==e&&(this._gatewayInstallInProgress=e,this.log(`Install flag -> ${e?"true":`false (${n})`}`))}get status(){return this._status}get lastDetection(){return this._lastDetection}async initializeLazy(){if(this.getConfig("hidden",!1)){this.statusBarItem.hide();return}if(!this.getConfig("enabled",!1)){this.updateStatusBar("not-installed"),this.statusBarItem.show();return}let r=this.getGatewayPort(),s=await pg(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,lg.toSettingsDisplayKey)("agentide.anywhere.autoStart")} = true)`),await this.start())}registerCommands(){this.disposables.push($.commands.registerCommand("agentide.anywhere.toggle",()=>this.toggle()),$.commands.registerCommand("agentide.anywhere.install",()=>this.install()),$.commands.registerCommand("agentide.anywhere.uninstall",()=>this.uninstall()),$.commands.registerCommand("agentide.anywhere.start",()=>this.start()),$.commands.registerCommand("agentide.anywhere.stop",()=>this.stop()),$.commands.registerCommand("agentide.anywhere.status",()=>this.showStatus()),$.commands.registerCommand("agentide.anywhere.openConfig",()=>this.openConfig()),$.commands.registerCommand("agentide.anywhere.connect",()=>this.connectBridge()),$.commands.registerCommand("agentide.anywhere.disconnect",()=>this.disconnectBridge()),$.commands.registerCommand("agentide.anywhere.openWebUI",()=>this.openWebUI()),$.commands.registerCommand("agentide.anywhere.detect",()=>this.detect()),$.commands.registerCommand("agentide.anywhere.meetAgent",()=>this.showMeetAgentPicker()))}setBridgeConnected(e){this._bridgeConnected=e,$.commands.executeCommand("setContext","agentide.anywhere.connected",e)}registerConfigWatcher(){this.disposables.push($.workspace.onDidChangeConfiguration(e=>{e.affectsConfiguration("agentide.anywhere")&&this.initializeLazy()}))}async toggle(){if(!this.getConfig("hidden",!1)){if(this._gatewayInstallInProgress){await this.showGatewayInstallInProgressPrompt();return}if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting");let n=Date.now();n-this._lastStartInProgressNoticeAt>4e3&&(this._lastStartInProgressNoticeAt=n,$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Starting gateway... please wait.`));return}switch(this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._status){case"error":{this._lastDetection?.installed===!0?await this.showDisconnectedQuickMenu():await this.showNotInstalledQuickMenu();break}case"starting":case"stopping":$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Operation in progress...`);break;case"running":this._bridgeConnected?await this.showConnectedQuickMenu():await this.showDisconnectedQuickMenu();break;case"installed":await this.showDisconnectedQuickMenu();break;case"not-installed":default:{if(this._lastDetection?.installed===!0){await this.showDisconnectedQuickMenu();break}await this.showNotInstalledQuickMenu();break}}}}queueBackgroundDetect(e){this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||setTimeout(()=>{this._gatewayInstallInProgress||this._gatewayUninstallInProgress||this._startInFlight||this._status==="starting"||this._status==="stopping"||this.detect().catch(n=>{this.log(`Background detect failed after ${e}: ${n instanceof Error?n.message:String(n)}`)})},100)}async showConnectedQuickMenu(){let n=this._hasConfiguredChannelsCache??await this.refreshHasConfiguredChannels()?"Meet at...":"Web UI",r=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL} is running (bridge: connected).`,n,"Disconnect","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening connected menu"),this.refreshHasConfiguredChannels(),await r){case"Meet at...":await this.showMeetAgentPicker();break;case"Web UI":await this.openWebUI();break;case"Disconnect":await this.disconnectBridge();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showDisconnectedQuickMenu(){let e=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Disconnected.`,"Connect","Reinstall","Ask Agent Hippo","More");switch(this.queueBackgroundDetect("opening disconnected menu"),await e){case"Connect":await this.start(),this._status==="running"&&(await this.connectBridge(),this.setBridgeConnected(this._bridgeRef?.isConnected??!1),this._bridgeConnected&&await this.showConnectedQuickMenu());break;case"Reinstall":await this.install();break;case"More":await this.showMaintenanceQuickMenu();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showGatewayInstallInProgressPrompt(){await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Install in progress. Follow the "${G.AGENT_ANYWHERE_LABEL} Setup" terminal; when it finishes, status updates automatically.`,"Show Setup Terminal","OK")==="Show Setup Terminal"&&(this.revealInstallSetupTerminal()||await this.showMissingInstallSetupTerminalPrompt())}async showMissingInstallSetupTerminalPrompt(){(await this.reconcileInstallProgressState())?.installed?$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Install completed. Status has been refreshed.`):$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Setup terminal is no longer available. Install did not complete; run Install again to relaunch setup.`)}async showGatewayUninstallInProgressPrompt(){await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Uninstall in progress. Follow the "${xi}" terminal; when it finishes, status updates automatically.`,"Show Uninstall Terminal","OK")==="Show Uninstall Terminal"&&(this.revealUninstallSetupTerminal()||await this.showMissingUninstallSetupTerminalPrompt())}async showMissingUninstallSetupTerminalPrompt(){let e=await this.reconcileUninstallProgressState();e&&!e.installed&&!e.running?$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Uninstall completed. Status has been refreshed.`):$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Uninstall terminal is no longer available. Uninstall may still be running or did not complete; run Status to confirm.`)}revealInstallSetupTerminal(){let e=this._installSetupTerminal??$.window.terminals.find(n=>n.name===$o||n.name.startsWith(`${$o} `))??null;return e?(this._installSetupTerminal=e,e.show(),!0):!1}revealUninstallSetupTerminal(){let e=this._uninstallSetupTerminal??$.window.terminals.find(n=>n.name===xi||n.name.startsWith(`${xi} `))??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,ve.clearBinaryCache)(ss),(0,ve.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 ZH()}getInstallProgressSummary(e){return tj(e)}async detectGatewayState(e){return ru(e)}async detectGatewayFastState(e){return pg(e)}async probeGatewayPort(e){return(0,ve.probePort)(e)}isStartedGatewayProcessAlive(e){return e!==void 0&&(0,ve.isProcessRunning)(e)}getStartupTimeoutMs(){return FH}getStartupCheckIntervalMs(){return 500}getStartupLaunchGraceMs(){return pe?15e3:0}getUninstallInitialDelayMs(){return pe?2e3:3e3}getUninstallVerificationTimeoutMs(){return pe?15e3:9e4}getUninstallCheckIntervalMs(){return pe?1e3:4e3}async sleep(e){await new Promise(n=>setTimeout(n,e))}isWindowsLaunch(){return pe}async stopExistingGatewayBeforeStart(e){await bA(e,n=>this.log(n))}getGatewayLockPathForConfig(){let e=(0,ig.createHash)("sha256").update(this.configPath).digest("hex").slice(0,8);return q.join(os.tmpdir(),"openclaw",`gateway.${e}.lock`)}async removeStaleGatewayLockBeforeStart(e){if(!pe)return;let n=this.getGatewayLockPathForConfig();if(!H.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 H.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<VH){this.log(`Gateway lock is only ${Math.round(r/1e3)}s old; not removing (possible concurrent start still binding).`);return}try{H.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 nj(e,n,r)}async reconcileUninstallProgressState(){if(!this._gatewayUninstallInProgress)return this._lastDetection;if(this.revealUninstallSetupTerminal())return this._lastDetection;let e=await ru(this.getGatewayPort());return this._lastDetection=e,this._gatewayUninstallInProgress=!1,e.running?this.setStatus("running"):e.installed?this.setStatus("installed"):this.setStatus("not-installed"),e}async showNotInstalledQuickMenu(){let e=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Reach your AgentHippo IDE or CLI agents from WhatsApp, Telegram, Slack, Discord, and more - right from your phone or any messaging app. This will also install OpenClaw fork on your computer.`,"Install","Ask Agent Hippo");switch(this.queueBackgroundDetect("opening not-installed menu"),await e){case"Install":await this.install();break;case"Ask Agent Hippo":await this.openAskAgentHippoChat();break}}async showMaintenanceQuickMenu(){let e=this._status==="running"||this._status==="installed"||this._lastDetection?.installed===!0,r=[...this._status==="running"&&this._hasConfiguredChannelsCache===!0?["Web UI"]:[],"Config","Reset auth","Reset mappings",...e?["Restart"]:[],"Uninstall"],s=$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: More options`,...r);switch(this.queueBackgroundDetect("opening maintenance menu"),await s){case"Web UI":await this.openWebUI();break;case"Config":await this.openConfig();break;case"Reset auth":await this.resetAuth();break;case"Reset mappings":await $.commands.executeCommand("agentide.gateway.resetMappings");break;case"Restart":await this.restartGateway();break;case"Uninstall":await this.uninstall();break}}async refreshHasConfiguredChannels(){let e=this._bridgeRef;if(!e?.request)return this._hasConfiguredChannelsCache??!1;try{let{rows:n}=await(0,cg.fetchMeetAgentChannelContext)(e.request.bind(e));this._hasConfiguredChannelsCache=n.length>0}catch(n){this.log(`channels.status probe failed (non-fatal): ${n instanceof Error?n.message:String(n)}`),this._hasConfiguredChannelsCache??=!1}return this._hasConfiguredChannelsCache}async openAskAgentHippoChat(){await $.commands.executeCommand("workbench.action.chat.newChat",{agentMode:!0}),await $.commands.executeCommand("workbench.action.chat.open",{mode:"agent",query:"use openclaw skill as needed.",isPartialQuery:!0})}async showMeetAgentPicker(e){if(!this._bridgeRef?.request){$.window.showWarningMessage("Not connected to gateway.");return}let n=this._bridgeRef.request.bind(this._bridgeRef),r=!1,s=async(i,o)=>{try{return await n(i,o)}catch(a){let c=a instanceof Error?a.message:String(a);if(!r&&(0,GH.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,cg.fetchMeetAgentChannelContext)(s);if(this.log(`Meet Agent: got ${i?.length??0} channel(s): ${i?.map(g=>g.id).join(", ")??"none"}`),!i||i.length===0){let g=await $.window.showInformationMessage("No messaging channels (Telegram, WhatsApp, etc.) are configured. You can chat with your agent in the Gateway Web UI, or set up channels in OpenClaw config.","Open Web UI","Open Config");g==="Open Web UI"?await this.openWebUI():g==="Open Config"&&await this.openConfig();return}let a=e??await this.getFirstRegisteredAgentId();if(!a){$.window.showWarningMessage("No agent registered with the gateway.");return}let l=(await s("agents.list")).external?.find(g=>g.id.toLowerCase()===a.toLowerCase()),d=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:d.has(g.id.toLowerCase())})),f=await $.window.showQuickPick(u,{canPickMany:!0,title:`Meet ${a} at...`,placeHolder:"Select channels where people can reach this agent"});if(!f)return;let p=f.map(g=>g.channelId);if(await(0,cg.applyAgentChannelBindingsViaConfigPatch)(s,{agentId:a,selectedChannelIds:p,statusPayload:o}),p.length===0)$.window.showInformationMessage(`${a}: all channel bindings removed.`);else{let g=f.map(m=>m.label).join(", ");$.window.showInformationMessage(`${a} can now be reached at: ${g}`)}}catch(i){this.log(`Meet Agent picker failed: ${i}`),$.window.showErrorMessage(`Failed to configure channels: ${i instanceof Error?i.message:String(i)}`)}}async getFirstRegisteredAgentId(){if(this._bridgeRef?.request)try{return(await this._bridgeRef.request("agents.list")).external?.[0]?.id}catch{return}}async detect(){let e=this.getGatewayPort(),r=await ru(e);return this._gatewayInstallInProgress||this._gatewayUninstallInProgress?(this._lastDetection=r,r):this._startInFlight&&this._status==="starting"?(this._lastDetection=r,r):(!r.running&&r.installed&&(await this.hasGlobalNpmOpenclawTree()||(r={...r,installed:!1})),this._lastDetection=r,r.running?this.setStatus("running"):r.installed?this.setStatus("installed"):this.setStatus("not-installed"),r)}async install(){let e=this.getConfig("installSource",""),n=this.getGatewayPort();if(!e)return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Install source not configured. Set "${(0,lg.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in settings.`),!1;let r=(0,St.validateAnywhereInstallSource)(e);if(!r.ok)return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Refusing to install from "${e}" \u2014 ${r.reason}. Fix "${(0,lg.toSettingsDisplayKey)("agentide.anywhere.installSource")}" in your user settings.`),this.log(`Rejected installSource (${r.reason}): ${e}`),!1;if(this._gatewayInstallInProgress)return await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Install is already in progress. Watch the "${G.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,ve.clearBinaryCache)(ss),(0,ve.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=pe?"setup-gateway.ps1":"setup-gateway.sh",a=[q.join(__dirname,"..","..","scripts","gateway",i),q.join(__dirname,"..","scripts","gateway",i)].find(h=>H.existsSync(h)),l=[q.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5"),q.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5")].find(h=>H.existsSync(h)),d,u={...ug(),[St.ANYWHERE_INSTALL_SOURCE_ENV]:e,...a?{[St.ANYWHERE_SETUP_SCRIPT_ENV]:a}:{},...l?{[St.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}};if(a&&pe){let h=[`-Source $env:${St.ANYWHERE_INSTALL_SOURCE_ENV}`];l&&h.push(`-ConfigTemplate $env:${St.ANYWHERE_CONFIG_TEMPLATE_ENV}`);let w=`& $env:${St.ANYWHERE_SETUP_SCRIPT_ENV} ${h.join(" ")}; Write-Host ""; Write-Host "You can close this window."`;d={name:$o,shellPath:"powershell.exe",shellArgs:["-NoProfile","-NoExit","-ExecutionPolicy","Bypass","-Command",w],env:{[St.ANYWHERE_INSTALL_SOURCE_ENV]:e,[St.ANYWHERE_SETUP_SCRIPT_ENV]:a,...l?{[St.ANYWHERE_CONFIG_TEMPLATE_ENV]:l}:{}}}}else if(a){let h=[`--source "$${St.ANYWHERE_INSTALL_SOURCE_ENV}"`];l&&h.push(`--config-template "$${St.ANYWHERE_CONFIG_TEMPLATE_ENV}"`);let _=`${`bash "$${St.ANYWHERE_SETUP_SCRIPT_ENV}" ${h.join(" ")}`}; echo ""; echo "Press Enter to close..."; read`;d={name:$o,shellPath:eu(),shellArgs:tu(_),env:u}}else{this.log("Setup script not found, falling back to npm install");let w=`${`npm install -g "$${St.ANYWHERE_INSTALL_SOURCE_ENV}"`}; echo ""; echo "Press Enter to close..."; read`;d=pe?{name:$o,shellPath:"cmd.exe",shellArgs:["/c",`npm install -g "%${St.ANYWHERE_INSTALL_SOURCE_ENV}%" && echo. && echo Setup complete. && pause`],env:{[St.ANYWHERE_INSTALL_SOURCE_ENV]:e}}:{name:$o,shellPath:eu(),shellArgs:tu(w),env:u}}try{H.rmSync(gg,{force:!0})}catch{}this._installProgressMessage="Launching setup...",this.updateStatusBar("starting");let f=$.window.createTerminal(d);this._installSetupTerminal=f,f.show();let p=WH(e)?10*6e4:12e4;this.log(`Waiting up to ${Math.round(p/6e4)} minute(s) for gateway install completion...`);let g=pe&&!!a;return await $.window.withProgress({location:$.ProgressLocation.Window,title:`${G.AGENT_ANYWHERE_LABEL}: Installing gateway...`,cancellable:!1},async h=>{let w=Date.now()+p,_=0;for(;Date.now()<w;){if(!this._gatewayInstallInProgress)return this.log("Gateway install wait aborted \u2014 setup terminal closed before completion was detected"),!1;let E=this.readInstallStatusSnapshot(),O=this.getInstallProgressSummary(E);this._installProgressMessage=O.message,this.updateStatusBar("starting");let T=Math.max(0,O.percent-_);if(h.report({message:O.message,increment:T}),_=Math.max(_,O.percent),E?.phase==="failed")return this.log(`Gateway install failed: ${E.lastError||E.message||"unknown error"}`),!1;(0,ve.clearBinaryCache)(ss),(0,ve.clearBinaryCache)("openclaw");let L=await this.detectGatewayState(n);if(this._lastDetection=L,g?ej(E)&&L.installed:L.installed)return this.log("Gateway installed successfully"),await this.ensureManagedGatewayWrapperState(L.binaryPath),await this.ensureWebUIBuilt(L.binaryPath),this.writeStarterConfig(),await $.workspace.getConfiguration("agentide.anywhere").update("enabled",!0,$.ConfigurationTarget.Global),L.running?(this.finishInstallUiState("running","success"),h.report({message:`Install complete. Gateway is running on port ${n}.`,increment:Math.max(0,100-_)})):(this.finishInstallUiState("installed","success"),h.report({message:"Install complete. Gateway is installed. Click Agent Anywhere to start.",increment:Math.max(0,100-_)})),$.window.showInformationMessage(L.running?`${G.AGENT_ANYWHERE_LABEL}: Installed and running. Open the config to add your channels or use the status bar to connect.`:`${G.AGENT_ANYWHERE_LABEL}: Installed. Open the config to add your channels, then click Agent Anywhere to start.`,"Open Config").then(async b=>{b==="Open Config"&&await this.openConfig()}),!0;await new Promise(P=>setTimeout(P,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=pe?"setup-gateway.ps1":"setup-gateway.sh",r=[q.join(__dirname,"..","scripts","gateway",e),q.join(__dirname,"..","..","scripts","gateway",e)].find(i=>H.existsSync(i)),s;if(r&&pe){let i=`& "${r}" -Uninstall; Write-Host ""; Write-Host "You can close this window."`;s={name:xi,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:xi,shellPath:eu(),shellArgs:tu(o),env:ug()}}else{let i="npm uninstall -g openclaw",o=`${i}; echo ""; echo "Press Enter to close..."; read`;s=pe?{name:xi,shellPath:"cmd.exe",shellArgs:["/c",`${i} && echo. && pause`]}:{name:xi,shellPath:eu(),shellArgs:tu(o),env:ug()}}this._gatewayUninstallInProgress=!0,this.setStatus("stopping");try{let i=$.window.createTerminal(s);this._uninstallSetupTerminal=i,i.show(),this.log("Gateway uninstall started in terminal"),(0,ve.clearBinaryCache)(ss),(0,ve.clearBinaryCache)("openclaw"),await this.sleep(this.getUninstallInitialDelayMs());let o=Date.now()+this.getUninstallVerificationTimeoutMs(),a,c=!0;for(;Date.now()<o;){(0,ve.clearBinaryCache)(ss),(0,ve.clearBinaryCache)("openclaw");let l=await this.detectGatewayState(this.getGatewayPort());if(a=l,this._lastDetection=l,c=await this.hasGlobalNpmOpenclawTree(),!c&&!l.running){dA(),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){dA(),this.setStatus("not-installed"),this.log("Global OpenClaw package removed (or no longer detected).");return}await this.sleep(this.getUninstallCheckIntervalMs())}!c&&a?.running?$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Managed package was removed, but the gateway listener still appears to be running. Finish the terminal command or run Status.`):$.window.showWarningMessage(`${G.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 q.join(os.homedir(),".openclaw","openclaw.json")}writeStarterConfig(){let e=q.dirname(this.configPath);if(H.existsSync(this.configPath)){this.log("Config already exists, skipping starter config");return}let r=[q.join(__dirname,"..","base-prompts","gateway","openclaw-starter.json5"),q.join(__dirname,"..","..","base-prompts","gateway","openclaw-starter.json5")].find(o=>H.existsSync(o));if(!r){this.log("Starter config template not found, skipping");return}H.mkdirSync(e,{recursive:!0,mode:448});let s=H.readFileSync(r,"utf-8"),i=`ah-${(0,ig.randomBytes)(24).toString("hex")}`;s=s.replace("__GENERATED_TOKEN__",i),H.writeFileSync(this.configPath,s,{encoding:"utf-8",mode:pe?void 0:384}),this.log(`Wrote starter config to ${this.configPath}`)}async openConfig(){H.existsSync(this.configPath)||this.writeStarterConfig();let e=await $.workspace.openTextDocument(this.configPath);await $.window.showTextDocument(e)}async preflightChannelSecrets(e){let n;try{n=H.readFileSync(this.configPath,"utf-8")}catch{return"continue"}let r=(0,ag.parseStrictJsonConfig)(n);if(r===void 0)return"continue";let s=(0,ag.collectMissingChannelEnvSecrets)(r,e);if(s.length===0)return"continue";let i=(0,og.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",d=await $.window.showErrorMessage(`${G.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(d===c){let u=(0,ag.disableChannelsInConfigText)(n,s.map(p=>p.channel));if(!u)return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath}. Set "enabled": false on the ${o} channel manually, then start again.`),"abort";let f=`${this.configPath}.bak-missing-secrets`;try{H.copyFileSync(this.configPath,f),H.writeFileSync(this.configPath,u,{encoding:"utf-8",mode:pe?void 0:384})}catch(p){let g=p instanceof Error?p.message:String(p);return $.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not update ${this.configPath} (${g}).`),"abort"}return this.log(`Disabled channels missing secrets: ${o} (backup: ${f})`),$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Disabled the ${o} channel (backup: ${q.basename(f)}). To re-enable: add ${a.join(", ")} to ${i}, set "enabled": true in the config, then restart the gateway.`),"continue"}return d===l&&await this.openEnvFileWithSecretStubs(i,a),"abort"}async openEnvFileWithSecretStubs(e,n){try{let r="";try{r=H.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(`
642
661
  `)?`
643
662
  `:"",a=[`# Added by ${G.AGENT_ANYWHERE_LABEL} \u2014 fill in, then start the gateway again.`,...s.map(c=>`${c}=`)].join(`
644
663
  `);H.writeFileSync(e,`${r}${o}${a}
645
- `,{encoding:"utf-8",mode:pe?void 0:384})}let i=await $.workspace.openTextDocument($.Uri.file(e));await $.window.showTextDocument(i,{preview:!1})}catch(r){let s=r instanceof Error?r.message:String(r);$.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not open ${e} (${s}).`)}}async startGatewayViaHiddenWindowsProcess(e,n,r,s,i){let o=(0,MH.buildWindowsArgumentLine)(n),a=o.length>0?` -ArgumentList '${nu(o)}'`:"",c=[`$proc = Start-Process -FilePath '${nu(e)}' -WindowStyle Hidden${a} -RedirectStandardOutput '${nu(r)}' -RedirectStandardError '${nu(s)}' -PassThru`,"Write-Output $proc.Id"].join("; ");return new Promise(l=>{let d="",u="",f=(0,su.spawn)("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-Command",c],{windowsHide:!0,env:i});f.stdout.on("data",p=>{d+=p.toString()}),f.stderr.on("data",p=>{u+=p.toString()}),f.once("error",p=>{this.log(`Gateway hidden Windows launcher failed to spawn: ${p}`),l(void 0)}),f.once("exit",p=>{if(p!==0){let m=u.trim()||d.trim();this.log(`Gateway hidden Windows launcher exited with code ${p}${m?`: ${m}`:""}`),l(void 0);return}let g=parseInt(d.trim(),10);if(!Number.isNaN(g)){this.log(`Gateway hidden Windows process started (PID: ${g})`),l(g);return}this.log("Gateway hidden Windows launcher did not return a PID"),l(void 0)})})}async start(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting"),await this._startInFlight;return}this.setStatus("starting");let e=this.doStart();this._startInFlight=e;try{await e}finally{this._startInFlight===e&&(this._startInFlight=null)}}async doStart(){let e=this.getGatewayPort(),n=await this.detectGatewayFastState(e);if(n?.running){this.log("Gateway already running (fast check)"),this._lastDetection=n,this.setStatus("running");return}let r=await this.detect(),s=await this.probeGatewayPort(e);if(!r.installed){if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}await $.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Gateway is not installed.`,"Install Now")==="Install Now"?await this.install():this.setStatus("not-installed");return}if(r.running){this.log("Gateway already running"),this.setStatus("running");return}if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}if(!r.binaryPath){this.setStatus("error"),$.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Gateway binary not found. Try reinstalling.`);return}let i=r.binaryPath;if(await this.probeGatewayPort(e)&&await ou(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,d=this.isWindowsLaunch();if(d){let h=await this.resolveWindowsManagedGatewayLaunchRuntime(i);if(!h){this.setStatus("installed"),await $.window.showWarningMessage(`${G.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=q.dirname(dg);H.mkdirSync(u,{recursive:!0});let f=dg,p=q.join(u,"gateway.error.log");this.log(`Starting gateway: ${a} ${c.join(" ")}`),this.log(`Gateway log: ${f}`);let g=await(0,og.readGatewayChildProcessEnv)();g.OPENCLAW_NO_RESPAWN="1";for(let h of og.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(d){if(m=await this.startGatewayViaHiddenWindowsProcess(a,c,f,p,g),this.process=null,!m){this.setStatus("error"),await Ca(f);return}}else{let h=H.openSync(f,"a");this.process=(0,su.spawn)(a,c,{stdio:["ignore",h,h],detached:!0,env:g,shell:l,windowsHide:!0}),H.closeSync(h),this.process.unref(),this.process.on("exit",w=>{this.log(`Gateway process exited with code ${w}`),this.process=null,fg(),!this._startInFlight&&this.setStatus(w!==0&&w!==null?"error":"installed")})}await $.window.withProgress({location:$.ProgressLocation.Window,title:`${G.AGENT_ANYWHERE_LABEL}: Starting gateway...`},async h=>{try{let w=Date.now(),_=this.getStartupTimeoutMs(),E=this.getStartupLaunchGraceMs(),O=this.getStartupCheckIntervalMs(),T=0,L=0,A=!1,I=!1,b=this.process?.pid??m;for(;;){if(await this.probeGatewayPort(e)){this.setStatus("running"),this.log(`Gateway started and ready (${T}ms)`);let Pe=this.process?.pid??m;Pe&&(await this.writeGatewayPidRecord(Pe,e,i),this.log(`PID file written: ${lu}`)),this.startHealthChecks(e),h.report({message:"Ready!",increment:100});return}let N=this.isStartedGatewayProcessAlive(b);b&&N&&(A=!0),T=Date.now()-w;let P=T<_,v=b!==void 0&&N&&A&&T<_+E,F=!N&&(A||this.process===null);if(b&&F&&!d){this.setStatus("error"),this.log(`Gateway process exited before opening port ${e}`),await Ca(f);return}if(b&&A&&!N&&d&&!I&&(I=!0,this.log(`Gateway launch process exited before opening port ${e}; continuing to wait for port readiness`)),!P&&!v)break;let B=Math.max(_+(v?E:0),1),re=Math.min(90,Math.floor(T/B*100)),X=Math.max(0,re-L);L=re;let te=b!==void 0?N?`Gateway launched (PID ${b}), waiting for port ${e}...`:"Waiting for gateway process to initialize...":`Waiting for port ${e}...`;h.report({message:te,increment:X}),await this.sleep(O)}this.setStatus("error"),this.log(`Gateway failed to start within timeout (pid=${b??"n/a"}, alive=${b!==void 0?this.isStartedGatewayProcessAlive(b):!1})`),await Ca(f)}catch{this.setStatus("error"),this.log("Gateway failed to start"),await Ca(f)}})}async stop(){if(this.stopHealthChecks(),await this.disconnectBridge(),this.process){this.setStatus("stopping"),this.log("Stopping gateway...");let r=this.getGatewayPort(),s=this.process.pid,i=await Do(r),o=[...new Set([s,...i].filter(l=>typeof l=="number"&&l>0))];pe&&s?await Wt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):pA(this.process,s,"SIGTERM"),!await new Promise(l=>{let d=setTimeout(()=>l(!1),5e3);this.process?.once("exit",()=>{clearTimeout(d),l(!0)})})&&this.process&&(this.log("Forcefully killing gateway..."),pe&&s?await Wt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):pA(this.process,s,"SIGKILL")),this.process=null,await fg();let c=await au(r,o);c||(this.log("Gateway port still held after process exit; reaping listener(s)..."),await yg(r),c=await au(r,[...o,...await Do(r)])),c?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not free gateway port after stop"),$.window.showWarningMessage(`${G.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 gA(e.port,e.binaryPath,r=>this.log(r));await fg(),n?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not stop gateway process"),$.window.showWarningMessage(`${G.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,ve.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(`
664
+ `,{encoding:"utf-8",mode:pe?void 0:384})}let i=await $.workspace.openTextDocument($.Uri.file(e));await $.window.showTextDocument(i,{preview:!1})}catch(r){let s=r instanceof Error?r.message:String(r);$.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Could not open ${e} (${s}).`)}}async startGatewayViaHiddenWindowsProcess(e,n,r,s,i){let o=(0,MH.buildWindowsArgumentLine)(n),a=o.length>0?` -ArgumentList '${nu(o)}'`:"",c=[`$proc = Start-Process -FilePath '${nu(e)}' -WindowStyle Hidden${a} -RedirectStandardOutput '${nu(r)}' -RedirectStandardError '${nu(s)}' -PassThru`,"Write-Output $proc.Id"].join("; ");return new Promise(l=>{let d="",u="",f=(0,su.spawn)("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-Command",c],{windowsHide:!0,env:i});f.stdout.on("data",p=>{d+=p.toString()}),f.stderr.on("data",p=>{u+=p.toString()}),f.once("error",p=>{this.log(`Gateway hidden Windows launcher failed to spawn: ${p}`),l(void 0)}),f.once("exit",p=>{if(p!==0){let m=u.trim()||d.trim();this.log(`Gateway hidden Windows launcher exited with code ${p}${m?`: ${m}`:""}`),l(void 0);return}let g=parseInt(d.trim(),10);if(!Number.isNaN(g)){this.log(`Gateway hidden Windows process started (PID: ${g})`),l(g);return}this.log("Gateway hidden Windows launcher did not return a PID"),l(void 0)})})}async start(){if(this._gatewayUninstallInProgress){await this.showGatewayUninstallInProgressPrompt();return}if(this._startInFlight){this.setStatus("starting"),await this._startInFlight;return}this.setStatus("starting");let e=this.doStart();this._startInFlight=e;try{await e}finally{this._startInFlight===e&&(this._startInFlight=null)}}async doStart(){let e=this.getGatewayPort(),n=await this.detectGatewayFastState(e);if(n?.running){this.log("Gateway already running (fast check)"),this._lastDetection=n,this.setStatus("running");return}let r=await this.detect(),s=await this.probeGatewayPort(e);if(!r.installed){if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}await $.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Gateway is not installed.`,"Install Now")==="Install Now"?await this.install():this.setStatus("not-installed");return}if(r.running){this.log("Gateway already running"),this.setStatus("running");return}if(s&&(!await this.promptNonManagedPortTakeover(e,"start")||await this.probeGatewayPort(e))){this.setStatus("error");return}if(!r.binaryPath){this.setStatus("error"),$.window.showErrorMessage(`${G.AGENT_ANYWHERE_LABEL}: Gateway binary not found. Try reinstalling.`);return}let i=r.binaryPath;if(await this.probeGatewayPort(e)&&await ou(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,d=this.isWindowsLaunch();if(d){let h=await this.resolveWindowsManagedGatewayLaunchRuntime(i);if(!h){this.setStatus("installed"),await $.window.showWarningMessage(`${G.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=q.dirname(dg);H.mkdirSync(u,{recursive:!0});let f=dg,p=q.join(u,"gateway.error.log");this.log(`Starting gateway: ${a} ${c.join(" ")}`),this.log(`Gateway log: ${f}`);let g=await(0,og.readGatewayChildProcessEnv)();g.OPENCLAW_NO_RESPAWN="1";for(let h of og.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(d){if(m=await this.startGatewayViaHiddenWindowsProcess(a,c,f,p,g),this.process=null,!m){this.setStatus("error"),await Ca(f);return}}else{let h=H.openSync(f,"a");this.process=(0,su.spawn)(a,c,{stdio:["ignore",h,h],detached:!0,env:g,shell:l,windowsHide:!0}),H.closeSync(h),this.process.unref(),this.process.on("exit",w=>{this.log(`Gateway process exited with code ${w}`),this.process=null,fg(),!this._startInFlight&&this.setStatus(w!==0&&w!==null?"error":"installed")})}await $.window.withProgress({location:$.ProgressLocation.Window,title:`${G.AGENT_ANYWHERE_LABEL}: Starting gateway...`},async h=>{try{let w=Date.now(),_=this.getStartupTimeoutMs(),E=this.getStartupLaunchGraceMs(),O=this.getStartupCheckIntervalMs(),T=0,L=0,A=!1,P=!1,b=this.process?.pid??m;for(;;){if(await this.probeGatewayPort(e)){this.setStatus("running"),this.log(`Gateway started and ready (${T}ms)`);let Ie=this.process?.pid??m;Ie&&(await this.writeGatewayPidRecord(Ie,e,i),this.log(`PID file written: ${lu}`)),this.startHealthChecks(e),h.report({message:"Ready!",increment:100});return}let N=this.isStartedGatewayProcessAlive(b);b&&N&&(A=!0),T=Date.now()-w;let I=T<_,v=b!==void 0&&N&&A&&T<_+E,F=!N&&(A||this.process===null);if(b&&F&&!d){this.setStatus("error"),this.log(`Gateway process exited before opening port ${e}`),await Ca(f);return}if(b&&A&&!N&&d&&!P&&(P=!0,this.log(`Gateway launch process exited before opening port ${e}; continuing to wait for port readiness`)),!I&&!v)break;let B=Math.max(_+(v?E:0),1),re=Math.min(90,Math.floor(T/B*100)),X=Math.max(0,re-L);L=re;let te=b!==void 0?N?`Gateway launched (PID ${b}), waiting for port ${e}...`:"Waiting for gateway process to initialize...":`Waiting for port ${e}...`;h.report({message:te,increment:X}),await this.sleep(O)}this.setStatus("error"),this.log(`Gateway failed to start within timeout (pid=${b??"n/a"}, alive=${b!==void 0?this.isStartedGatewayProcessAlive(b):!1})`),await Ca(f)}catch{this.setStatus("error"),this.log("Gateway failed to start"),await Ca(f)}})}async stop(){if(this.stopHealthChecks(),await this.disconnectBridge(),this.process){this.setStatus("stopping"),this.log("Stopping gateway...");let r=this.getGatewayPort(),s=this.process.pid,i=await Do(r),o=[...new Set([s,...i].filter(l=>typeof l=="number"&&l>0))];pe&&s?await Wt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):pA(this.process,s,"SIGTERM"),!await new Promise(l=>{let d=setTimeout(()=>l(!1),5e3);this.process?.once("exit",()=>{clearTimeout(d),l(!0)})})&&this.process&&(this.log("Forcefully killing gateway..."),pe&&s?await Wt(`taskkill /F /T /PID ${s}`,{timeout:5e3}).catch(()=>{}):pA(this.process,s,"SIGKILL")),this.process=null,await fg();let c=await au(r,o);c||(this.log("Gateway port still held after process exit; reaping listener(s)..."),await yg(r),c=await au(r,[...o,...await Do(r)])),c?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not free gateway port after stop"),$.window.showWarningMessage(`${G.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 gA(e.port,e.binaryPath,r=>this.log(r));await fg(),n?(this.setStatus("installed"),this.log("Gateway stopped")):(this.setStatus("running"),this.log("Could not stop gateway process"),$.window.showWarningMessage(`${G.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,ve.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(`
646
665
  `);if(!n.installed){await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}
647
666
  ${o}`,"Set Up")==="Set Up"&&await this.install();return}if(!n.running){switch(await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}
648
667
  ${o}`,"Connect","Config","Uninstall")){case"Connect":await this.start(),this._status==="running"&&await this.connectBridge();break;case"Config":await this.openConfig();break;case"Uninstall":await this.uninstall();break}return}switch(await $.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}
649
668
  ${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{H.existsSync(this.configPath)||this.writeStarterConfig();let n=H.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,ig.randomBytes)(24).toString("hex")}`;r.gateway.auth.token=s,H.writeFileSync(this.configPath,`${JSON.stringify(r,null,2)}
650
- `,{encoding:"utf-8",mode:pe?void 0:384}),await $.workspace.getConfiguration("agentide.gateway").update("token",s,$.ConfigurationTarget.Global),await this.restartGateway(),$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Auth reset; gateway restarted. If you use the Web UI, paste the new token in Control UI settings.`)}catch(e){this.log(`Failed to reset auth: ${e instanceof Error?e.message:String(e)}`),$.window.showErrorMessage(`${G.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,ve.probePort)(e)&&!await ou(e,this._lastDetection?.binaryPath)&&(!await this.promptNonManagedPortTakeover(e,"connect")||await(0,ve.probePort)(e))){this._status==="running"&&this.setStatus("installed");return}let n=this._status==="running";if(!n){let c=await pg(e);c?.running&&(n=!0,this._lastDetection=c,this.setStatus("running"))}if(!n){let c=await this.detect();if(!c.running){if(!c.installed){await $.window.showInformationMessage(`${G.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 Ca(dg);return}}}let r=$.workspace.getConfiguration("agentide.gateway"),s=r.get("url","").trim();s||(s=`ws://127.0.0.1:${e}`,await r.update("url",s,$.ConfigurationTarget.Global));let i=/127\.0\.0\.1|localhost|\[::1\]/i.test(s),o=this.readGatewayToken();o&&i&&(await r.update("token",o,$.ConfigurationTarget.Global),this.log("Gateway token applied from openclaw.json (user scope)")),await this._bridgeRef.connect(),this.setBridgeConnected(this._bridgeRef.isConnected),await(0,ve.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,ve.probePort)(e))){await $.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Gateway is not running. Start it first to use the web UI.`,"Start Now")==="Start Now"&&await this.start();return}let r=($.workspace.getConfiguration("agentide.gateway").get("token")??"").trim(),s=this.readGatewayToken()??(r||void 0),i=s?`#token=${encodeURIComponent(s)}`:"",o=`http://127.0.0.1:${e}/${i}`;await $.env.openExternal($.Uri.parse(o))}startHealthChecks(e){this.stopHealthChecks(),this.healthCheckTimer=setInterval(async()=>{await(0,ve.probePort)(e)||(this.log("Health check failed -- gateway is no longer running"),this.stopHealthChecks(),this.process=null,this.setStatus("installed"))},BH)}stopHealthChecks(){this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null)}async ensureWebUIBuilt(e){if(e)try{let n=vg(e);if(!n)return;let r=q.join(n,"dist","control-ui","index.html");if(H.existsSync(r))return;this.log("Web UI not built - building now..."),await Wt(pe?"pnpm.cmd ui:build":"pnpm ui:build",{cwd:n,timeout:6e4,env:{...process.env},...pe?{shell:"cmd.exe"}:{}}),this.log("Web UI built successfully")}catch(n){this.log(`Web UI build failed (non-fatal): ${n instanceof Error?n.message:String(n)}`)}}async promptNonManagedPortTakeover(e,n){let r=n==="connect"?"connect Agent Anywhere":"start Agent Anywhere";if(await $.window.showWarningMessage(`${G.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 Do(e));if(!await gA(e,void 0,a=>this.log(a))){let a=await Do(e);return i.size>0&&a.some(l=>!i.has(l))?$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Port ${e} is held by a self-restarting gateway service. Run \`openclaw daemon uninstall\` to remove it, then try again.`):$.window.showErrorMessage(`${G.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=Fi(),s=await Eg(e,r);if(!s)return;let{launcherPath:i,packageRoot:o,nodePath:a,entryScriptPath:c}=s,l=uA(a,c,EA),d;return(n||AA(hg))&&(d=uA(a,c,hg)),KH({...r,nodePath:a,cliPath:i,entryScriptPath:c,packageRoot:o,wrapperPath:l,wrapperDir:Tg,openclawWrapperPath:d,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(!pe)return;await this.ensureManagedGatewayWrapperState(e);let n=await Eg(e);if(n)return{nodePath:n.nodePath,entryScriptPath:n.entryScriptPath}}readGatewayToken(){try{if(!H.existsSync(this.configPath))return;let n=H.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayInstallInProgress?`${G.AGENT_ANYWHERE_LABEL}: ${this._installProgressMessage??"Installing... (see Setup terminal)"}`:`${G.AGENT_ANYWHERE_LABEL}: Starting...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"running":this._bridgeConnected?(this.statusBarItem.text=`$(broadcast) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.AGENT_ANYWHERE_LABEL}: Connected (click for options)`,this.statusBarItem.color=new $.ThemeColor("testing.iconPassed")):(this.statusBarItem.text=`$(debug-disconnect) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayUninstallInProgress?`${G.AGENT_ANYWHERE_LABEL}: Uninstalling... (see Uninstall terminal)`:`${G.AGENT_ANYWHERE_LABEL}: Stopping...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"error":this.statusBarItem.text=`$(warning) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.AGENT_ANYWHERE_LABEL}: Error (click for details)`,this.statusBarItem.color=new $.ThemeColor("errorForeground"),this.statusBarItem.backgroundColor=void 0;break}this.statusBarItem.show()}getConfig(e,n){return $.workspace.getConfiguration("agentide.anywhere").get(e,n)}async hasGlobalNpmOpenclawTree(){return(await ka()).length>0}readGatewayPortFromOpenclawJson(){try{if(!H.existsSync(this.configPath))return;let n=H.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(`[${G.AGENT_ANYWHERE_LABEL}] ${e}`)}dispose(){this.stopHealthChecks(),this.process=null,this.statusBarItem.dispose(),this._onStatusChange.dispose();for(let e of this.disposables)e.dispose()}};G.GatewayLifecycleManager=wg});var PA=S(Og=>{"use strict";Object.defineProperty(Og,"__esModule",{value:!0});Og.anywhereCommand=ij;var uu=OA(),as=Xt(),sj=18789;async function ij(t){switch(t.action?.trim().toLowerCase()){case"status":case"detect":await oj(t);return;case"help":case"usage":case"":case void 0:IA();return;default:console.error(`${as.COLORS.red}Error:${as.COLORS.reset} Unsupported action "${t.action}".`),IA(),process.exitCode=1;return}}async function oj(t){let e=t.port??sj;try{let n=await(0,uu.detectGateway)(e),r=n.running?"Running":n.installed?"Installed":"Not installed",s=n.running?as.COLORS.green:n.installed?as.COLORS.yellow:as.COLORS.red;console.log(`${s}${uu.AGENT_ANYWHERE_LABEL}:${as.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(`${as.COLORS.dim}Install via the Agent Anywhere UI inside ${uu.AGENT_ANYWHERE_LABEL} in VS Code.${as.COLORS.reset}`)}catch(n){console.error(`${as.COLORS.red}Error:${as.COLORS.reset} ${n instanceof Error?n.message:String(n)}`),process.exitCode=1}}function IA(){console.log([`${uu.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(`
651
- `))}});var kA=S(cs=>{"use strict";var aj=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]})),cj=cs&&cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lj=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"&&aj(n,e,r[s]);return cj(n,e),n}})();Object.defineProperty(cs,"__esModule",{value:!0});cs.gatewaySendCommand=gj;cs.gatewayListCommand=hj;var uj=require("fs/promises"),dj=lj(require("path")),du=cl(),fj=Xf(),dt=Xt();function RA(t){let e=t.trim();return e||(console.error("Error: --outbound is required"),process.exit(1)),dj.resolve(e)}async function CA(t){try{await(0,uj.access)(t)}catch{console.error(`Error: gateway outbound file not found: ${t}`),process.exit(1)}}async function pj(t,e,n){let r=n.message.trim();r||(console.error("Error: --message is required"),process.exit(1)),n.dryRun&&(console.log(`${dt.COLORS.dim}Dry run (egress broker):${dt.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(`${dt.COLORS.red}\u2717${dt.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(`${dt.COLORS.green}\u2713${dt.COLORS.reset} Sent (via egress broker${o.via?`, ${o.via}`:""})`):(console.error(`${dt.COLORS.red}\u2717${dt.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 gj(t){let e=process.env.AGENTHIPPO_EGRESS_URL?.trim(),n=process.env.AGENTHIPPO_TURN_NONCE?.trim();if(e&&n){await pj(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=RA(t.outbound);await CA(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,du.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,fj.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(`${dt.COLORS.dim}Dry run:${dt.COLORS.reset} ${a.command.join(" ")}`);else if(a.ok){let c=a.via==="hippoclaw"?" (via hippoclaw CLI fallback)":"";console.log(`${dt.COLORS.green}\u2713${dt.COLORS.reset} Sent via ${o.channel}:${o.target}${c}`),a.stdout&&console.log(a.stdout)}else console.error(`${dt.COLORS.red}\u2717${dt.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 NA(t,e){let n=t.label?` (${t.label})`:"",r=t.threadId?` thread=${t.threadId}`:"",s=t.inboundCount>1?` \xD7${t.inboundCount}`:"";return`${e?`${dt.COLORS.green}*${dt.COLORS.reset} `:" "}${t.agentId}${n}: ${t.channel} \u2192 ${t.target}${r}${s}`}async function hj(t){let e=RA(t.outbound);await CA(e);let n=await(0,du.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(`${dt.COLORS.dim}${e}${dt.COLORS.reset}`);for(let i of s.sort()){let o=n.targetsByAgent[i]??[],a=n.lastByAgent[i],c=a?(0,du.buildGatewayOutboundHandleKey)(a.target,a.threadId):void 0;if(o.length===0&&a){console.log(NA(a,!0));continue}console.log(`${dt.COLORS.dim}${i}:${dt.COLORS.reset}`);for(let l of o){let d=(0,du.buildGatewayOutboundHandleKey)(l.target,l.threadId);console.log(NA(l,d===c))}o.length>1&&a&&console.log(`${dt.COLORS.dim} * = last inbound (default for gateway send without --target)${dt.COLORS.reset}`)}}});var GA=S(Ye=>{"use strict";var mj=Ye&&Ye.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Ej=Ye&&Ye.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_j=Ye&&Ye.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&mj(n,e,r[s]);return Ej(n,e),n}})();Object.defineProperty(Ye,"__esModule",{value:!0});Ye.ControlCliError=Ye.CONTROL_KEY_ENV=Ye.CONTROL_URL_ENV=void 0;Ye.resolveControlConnection=fu;Ye.registerAgent=DA;Ye.listAgents=LA;Ye.downloadBundle=Pg;Ye.controlRegisterCommand=bj;Ye.controlListCommand=vj;Ye.controlBundleCommand=Oj;var yj=require("child_process"),Lo=require("fs/promises"),Vi=_j(require("path")),wj=require("util"),Fe=Xt(),$A=(0,wj.promisify)(yj.execFile);Ye.CONTROL_URL_ENV="AGENTHIPPO_CONTROL_URL";Ye.CONTROL_KEY_ENV="AGENTHIPPO_CONTROL_KEY";var Sj=3e4,Lt=class extends Error{};Ye.ControlCliError=Lt;var Aj=new Set(["localhost","127.0.0.1","[::1]"]);function fu(t,e=process.env){let n=(t??e[Ye.CONTROL_URL_ENV]??"").trim();if(!n)throw new Lt(`no control plane URL: pass --url, or set ${Ye.CONTROL_URL_ENV} (e.g. in ~/.agent-hippo/.env).`);let r;try{r=new URL(n)}catch{throw new Lt(`'${n}' is not a URL (expected e.g. https://control.example.com).`)}if(r.protocol!=="https:"&&!(r.protocol==="http:"&&Aj.has(r.hostname)))throw new Lt(`refusing to send an API key to ${r.origin}: use https (plain http is accepted for localhost only).`);let s=(e[Ye.CONTROL_KEY_ENV]??"").trim();if(!s)throw new Lt(`no API key: set ${Ye.CONTROL_KEY_ENV} (e.g. in ~/.agent-hippo/.env). Mint one in the control console \u2014 the "API key" button.`);return{url:r.origin,key:s}}async function Ig(t,e,n,r){let s;try{s=await fetch(`${t.url}${n}`,{method:e,headers:{authorization:`Bearer ${t.key}`,...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),redirect:"manual",signal:AbortSignal.timeout(Sj)})}catch(i){throw new Lt(`could not reach ${t.url}: ${i instanceof Error?i.message:String(i)}`)}if(s.status>=300&&s.status<400)throw new Lt(`${t.url} redirected ${n} (HTTP ${s.status}) instead of answering it. That is the plane's edge putting SSO in front of the CLI lane: its reverse proxy needs to route /api/cli/* around SSO (the \`@cli\` block in the control plane's Caddyfile). Ask the plane operator \u2014 nothing on this machine can fix it.`);if(!s.ok){let i=`HTTP ${s.status}`;try{i=String((await s.json()).error??i)}catch{}throw new Lt(i)}return s}async function DA(t,e){return await(await Ig(t,"POST","/api/cli/deployments",{name:e.name,...e.id?{id:e.id}:{},...e.pack?{pack:e.pack}:{}})).json()}async function LA(t){return await(await Ig(t,"GET","/api/cli/deployments")).json()}async function Pg(t,e,n){let r=Vi.resolve(n.dir),s=Vi.join(r,e),i=Vi.join(r,`${e}-bundle.tar.gz`),o=async l=>(0,Lo.stat)(l).then(()=>!0,()=>!1),a=n.extract?s:i;if(!n.force&&await o(a))throw new Lt(`${a} already exists \u2014 pass --force to overwrite it, or --dir to unpack somewhere else.`);let c=await Ig(t,"GET",`/api/cli/deployments/${encodeURIComponent(e)}/bundle`);if(await(0,Lo.mkdir)(r,{recursive:!0}),await(0,Lo.writeFile)(i,Buffer.from(await c.arrayBuffer()),{mode:384}),await(0,Lo.chmod)(i,384),!n.extract)return{path:i,extracted:!1};try{let l=Vi.basename(i),{stdout:d}=await $A("tar",["-tzf",l],{cwd:r,maxBuffer:8*1024*1024}),u=d.split(`
669
+ `,{encoding:"utf-8",mode:pe?void 0:384}),await $.workspace.getConfiguration("agentide.gateway").update("token",s,$.ConfigurationTarget.Global),await this.restartGateway(),$.window.showInformationMessage(`${G.AGENT_ANYWHERE_LABEL}: Auth reset; gateway restarted. If you use the Web UI, paste the new token in Control UI settings.`)}catch(e){this.log(`Failed to reset auth: ${e instanceof Error?e.message:String(e)}`),$.window.showErrorMessage(`${G.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,ve.probePort)(e)&&!await ou(e,this._lastDetection?.binaryPath)&&(!await this.promptNonManagedPortTakeover(e,"connect")||await(0,ve.probePort)(e))){this._status==="running"&&this.setStatus("installed");return}let n=this._status==="running";if(!n){let c=await pg(e);c?.running&&(n=!0,this._lastDetection=c,this.setStatus("running"))}if(!n){let c=await this.detect();if(!c.running){if(!c.installed){await $.window.showInformationMessage(`${G.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 Ca(dg);return}}}let r=$.workspace.getConfiguration("agentide.gateway"),s=r.get("url","").trim();s||(s=`ws://127.0.0.1:${e}`,await r.update("url",s,$.ConfigurationTarget.Global));let i=/127\.0\.0\.1|localhost|\[::1\]/i.test(s),o=this.readGatewayToken();o&&i&&(await r.update("token",o,$.ConfigurationTarget.Global),this.log("Gateway token applied from openclaw.json (user scope)")),await this._bridgeRef.connect(),this.setBridgeConnected(this._bridgeRef.isConnected),await(0,ve.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,ve.probePort)(e))){await $.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Gateway is not running. Start it first to use the web UI.`,"Start Now")==="Start Now"&&await this.start();return}let r=($.workspace.getConfiguration("agentide.gateway").get("token")??"").trim(),s=this.readGatewayToken()??(r||void 0),i=s?`#token=${encodeURIComponent(s)}`:"",o=`http://127.0.0.1:${e}/${i}`;await $.env.openExternal($.Uri.parse(o))}startHealthChecks(e){this.stopHealthChecks(),this.healthCheckTimer=setInterval(async()=>{await(0,ve.probePort)(e)||(this.log("Health check failed -- gateway is no longer running"),this.stopHealthChecks(),this.process=null,this.setStatus("installed"))},BH)}stopHealthChecks(){this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null)}async ensureWebUIBuilt(e){if(e)try{let n=vg(e);if(!n)return;let r=q.join(n,"dist","control-ui","index.html");if(H.existsSync(r))return;this.log("Web UI not built - building now..."),await Wt(pe?"pnpm.cmd ui:build":"pnpm ui:build",{cwd:n,timeout:6e4,env:{...process.env},...pe?{shell:"cmd.exe"}:{}}),this.log("Web UI built successfully")}catch(n){this.log(`Web UI build failed (non-fatal): ${n instanceof Error?n.message:String(n)}`)}}async promptNonManagedPortTakeover(e,n){let r=n==="connect"?"connect Agent Anywhere":"start Agent Anywhere";if(await $.window.showWarningMessage(`${G.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 Do(e));if(!await gA(e,void 0,a=>this.log(a))){let a=await Do(e);return i.size>0&&a.some(l=>!i.has(l))?$.window.showWarningMessage(`${G.AGENT_ANYWHERE_LABEL}: Port ${e} is held by a self-restarting gateway service. Run \`openclaw daemon uninstall\` to remove it, then try again.`):$.window.showErrorMessage(`${G.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=Fi(),s=await Eg(e,r);if(!s)return;let{launcherPath:i,packageRoot:o,nodePath:a,entryScriptPath:c}=s,l=uA(a,c,EA),d;return(n||AA(hg))&&(d=uA(a,c,hg)),KH({...r,nodePath:a,cliPath:i,entryScriptPath:c,packageRoot:o,wrapperPath:l,wrapperDir:Tg,openclawWrapperPath:d,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(!pe)return;await this.ensureManagedGatewayWrapperState(e);let n=await Eg(e);if(n)return{nodePath:n.nodePath,entryScriptPath:n.entryScriptPath}}readGatewayToken(){try{if(!H.existsSync(this.configPath))return;let n=H.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayInstallInProgress?`${G.AGENT_ANYWHERE_LABEL}: ${this._installProgressMessage??"Installing... (see Setup terminal)"}`:`${G.AGENT_ANYWHERE_LABEL}: Starting...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"running":this._bridgeConnected?(this.statusBarItem.text=`$(broadcast) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.AGENT_ANYWHERE_LABEL}: Connected (click for options)`,this.statusBarItem.color=new $.ThemeColor("testing.iconPassed")):(this.statusBarItem.text=`$(debug-disconnect) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.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) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=this._gatewayUninstallInProgress?`${G.AGENT_ANYWHERE_LABEL}: Uninstalling... (see Uninstall terminal)`:`${G.AGENT_ANYWHERE_LABEL}: Stopping...`,this.statusBarItem.color=void 0,this.statusBarItem.backgroundColor=void 0;break;case"error":this.statusBarItem.text=`$(warning) ${G.AGENT_ANYWHERE_LABEL}`,this.statusBarItem.tooltip=`${G.AGENT_ANYWHERE_LABEL}: Error (click for details)`,this.statusBarItem.color=new $.ThemeColor("errorForeground"),this.statusBarItem.backgroundColor=void 0;break}this.statusBarItem.show()}getConfig(e,n){return $.workspace.getConfiguration("agentide.anywhere").get(e,n)}async hasGlobalNpmOpenclawTree(){return(await ka()).length>0}readGatewayPortFromOpenclawJson(){try{if(!H.existsSync(this.configPath))return;let n=H.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(`[${G.AGENT_ANYWHERE_LABEL}] ${e}`)}dispose(){this.stopHealthChecks(),this.process=null,this.statusBarItem.dispose(),this._onStatusChange.dispose();for(let e of this.disposables)e.dispose()}};G.GatewayLifecycleManager=wg});var IA=S(Og=>{"use strict";Object.defineProperty(Og,"__esModule",{value:!0});Og.anywhereCommand=ij;var uu=OA(),as=Xt(),sj=18789;async function ij(t){switch(t.action?.trim().toLowerCase()){case"status":case"detect":await oj(t);return;case"help":case"usage":case"":case void 0:PA();return;default:console.error(`${as.COLORS.red}Error:${as.COLORS.reset} Unsupported action "${t.action}".`),PA(),process.exitCode=1;return}}async function oj(t){let e=t.port??sj;try{let n=await(0,uu.detectGateway)(e),r=n.running?"Running":n.installed?"Installed":"Not installed",s=n.running?as.COLORS.green:n.installed?as.COLORS.yellow:as.COLORS.red;console.log(`${s}${uu.AGENT_ANYWHERE_LABEL}:${as.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(`${as.COLORS.dim}Install via the Agent Anywhere UI inside ${uu.AGENT_ANYWHERE_LABEL} in VS Code.${as.COLORS.reset}`)}catch(n){console.error(`${as.COLORS.red}Error:${as.COLORS.reset} ${n instanceof Error?n.message:String(n)}`),process.exitCode=1}}function PA(){console.log([`${uu.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(`
670
+ `))}});var kA=S(cs=>{"use strict";var aj=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]})),cj=cs&&cs.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),lj=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"&&aj(n,e,r[s]);return cj(n,e),n}})();Object.defineProperty(cs,"__esModule",{value:!0});cs.gatewaySendCommand=gj;cs.gatewayListCommand=hj;var uj=require("fs/promises"),dj=lj(require("path")),du=cl(),fj=Xf(),dt=Xt();function RA(t){let e=t.trim();return e||(console.error("Error: --outbound is required"),process.exit(1)),dj.resolve(e)}async function CA(t){try{await(0,uj.access)(t)}catch{console.error(`Error: gateway outbound file not found: ${t}`),process.exit(1)}}async function pj(t,e,n){let r=n.message.trim();r||(console.error("Error: --message is required"),process.exit(1)),n.dryRun&&(console.log(`${dt.COLORS.dim}Dry run (egress broker):${dt.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(`${dt.COLORS.red}\u2717${dt.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(`${dt.COLORS.green}\u2713${dt.COLORS.reset} Sent (via egress broker${o.via?`, ${o.via}`:""})`):(console.error(`${dt.COLORS.red}\u2717${dt.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 gj(t){let e=process.env.AGENTHIPPO_EGRESS_URL?.trim(),n=process.env.AGENTHIPPO_TURN_NONCE?.trim();if(e&&n){await pj(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=RA(t.outbound);await CA(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,du.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,fj.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(`${dt.COLORS.dim}Dry run:${dt.COLORS.reset} ${a.command.join(" ")}`);else if(a.ok){let c=a.via==="hippoclaw"?" (via hippoclaw CLI fallback)":"";console.log(`${dt.COLORS.green}\u2713${dt.COLORS.reset} Sent via ${o.channel}:${o.target}${c}`),a.stdout&&console.log(a.stdout)}else console.error(`${dt.COLORS.red}\u2717${dt.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 NA(t,e){let n=t.label?` (${t.label})`:"",r=t.threadId?` thread=${t.threadId}`:"",s=t.inboundCount>1?` \xD7${t.inboundCount}`:"";return`${e?`${dt.COLORS.green}*${dt.COLORS.reset} `:" "}${t.agentId}${n}: ${t.channel} \u2192 ${t.target}${r}${s}`}async function hj(t){let e=RA(t.outbound);await CA(e);let n=await(0,du.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(`${dt.COLORS.dim}${e}${dt.COLORS.reset}`);for(let i of s.sort()){let o=n.targetsByAgent[i]??[],a=n.lastByAgent[i],c=a?(0,du.buildGatewayOutboundHandleKey)(a.target,a.threadId):void 0;if(o.length===0&&a){console.log(NA(a,!0));continue}console.log(`${dt.COLORS.dim}${i}:${dt.COLORS.reset}`);for(let l of o){let d=(0,du.buildGatewayOutboundHandleKey)(l.target,l.threadId);console.log(NA(l,d===c))}o.length>1&&a&&console.log(`${dt.COLORS.dim} * = last inbound (default for gateway send without --target)${dt.COLORS.reset}`)}}});var GA=S(Ye=>{"use strict";var mj=Ye&&Ye.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var s=Object.getOwnPropertyDescriptor(e,n);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,s)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),Ej=Ye&&Ye.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),_j=Ye&&Ye.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(r[r.length]=s);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),s=0;s<r.length;s++)r[s]!=="default"&&mj(n,e,r[s]);return Ej(n,e),n}})();Object.defineProperty(Ye,"__esModule",{value:!0});Ye.ControlCliError=Ye.CONTROL_KEY_ENV=Ye.CONTROL_URL_ENV=void 0;Ye.resolveControlConnection=fu;Ye.registerAgent=DA;Ye.listAgents=LA;Ye.downloadBundle=Ig;Ye.controlRegisterCommand=bj;Ye.controlListCommand=vj;Ye.controlBundleCommand=Oj;var yj=require("child_process"),Lo=require("fs/promises"),Vi=_j(require("path")),wj=require("util"),Fe=Xt(),$A=(0,wj.promisify)(yj.execFile);Ye.CONTROL_URL_ENV="AGENTHIPPO_CONTROL_URL";Ye.CONTROL_KEY_ENV="AGENTHIPPO_CONTROL_KEY";var Sj=3e4,Lt=class extends Error{};Ye.ControlCliError=Lt;var Aj=new Set(["localhost","127.0.0.1","[::1]"]);function fu(t,e=process.env){let n=(t??e[Ye.CONTROL_URL_ENV]??"").trim();if(!n)throw new Lt(`no control plane URL: pass --url, or set ${Ye.CONTROL_URL_ENV} (e.g. in ~/.agent-hippo/.env).`);let r;try{r=new URL(n)}catch{throw new Lt(`'${n}' is not a URL (expected e.g. https://control.example.com).`)}if(r.protocol!=="https:"&&!(r.protocol==="http:"&&Aj.has(r.hostname)))throw new Lt(`refusing to send an API key to ${r.origin}: use https (plain http is accepted for localhost only).`);let s=(e[Ye.CONTROL_KEY_ENV]??"").trim();if(!s)throw new Lt(`no API key: set ${Ye.CONTROL_KEY_ENV} (e.g. in ~/.agent-hippo/.env). Mint one in the control console \u2014 the "API key" button.`);return{url:r.origin,key:s}}async function Pg(t,e,n,r){let s;try{s=await fetch(`${t.url}${n}`,{method:e,headers:{authorization:`Bearer ${t.key}`,...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),redirect:"manual",signal:AbortSignal.timeout(Sj)})}catch(i){throw new Lt(`could not reach ${t.url}: ${i instanceof Error?i.message:String(i)}`)}if(s.status>=300&&s.status<400)throw new Lt(`${t.url} redirected ${n} (HTTP ${s.status}) instead of answering it. That is the plane's edge putting SSO in front of the CLI lane: its reverse proxy needs to route /api/cli/* around SSO (the \`@cli\` block in the control plane's Caddyfile). Ask the plane operator \u2014 nothing on this machine can fix it.`);if(!s.ok){let i=`HTTP ${s.status}`;try{i=String((await s.json()).error??i)}catch{}throw new Lt(i)}return s}async function DA(t,e){return await(await Pg(t,"POST","/api/cli/deployments",{name:e.name,...e.id?{id:e.id}:{},...e.pack?{pack:e.pack}:{}})).json()}async function LA(t){return await(await Pg(t,"GET","/api/cli/deployments")).json()}async function Ig(t,e,n){let r=Vi.resolve(n.dir),s=Vi.join(r,e),i=Vi.join(r,`${e}-bundle.tar.gz`),o=async l=>(0,Lo.stat)(l).then(()=>!0,()=>!1),a=n.extract?s:i;if(!n.force&&await o(a))throw new Lt(`${a} already exists \u2014 pass --force to overwrite it, or --dir to unpack somewhere else.`);let c=await Pg(t,"GET",`/api/cli/deployments/${encodeURIComponent(e)}/bundle`);if(await(0,Lo.mkdir)(r,{recursive:!0}),await(0,Lo.writeFile)(i,Buffer.from(await c.arrayBuffer()),{mode:384}),await(0,Lo.chmod)(i,384),!n.extract)return{path:i,extracted:!1};try{let l=Vi.basename(i),{stdout:d}=await $A("tar",["-tzf",l],{cwd:r,maxBuffer:8*1024*1024}),u=d.split(`
652
671
  `).map(f=>f.trim()).filter(Boolean).find(f=>f!==`${e}/`&&(!f.startsWith(`${e}/`)||f.split("/").includes("..")));if(u)throw new Lt(`refusing to unpack the bundle: it contains '${u}', which is outside ${e}/.`);await $A("tar",["-xzf",l,"-C","."],{cwd:r})}catch(l){throw l instanceof Lt?(await(0,Lo.rm)(i,{force:!0}),l):new Lt(`downloaded ${i} but could not unpack it (${l instanceof Error?l.message.split(`
653
672
  `)[0]:String(l)}). Unpack it yourself: tar -xzf ${i}`)}return await(0,Lo.rm)(i,{force:!0}),{path:s,extracted:!0}}async function Ng(t,e){try{await e()}catch(n){if(!(n instanceof Lt))throw n;t?console.log(JSON.stringify({ok:!1,error:n.message})):console.error(`${Fe.COLORS.red}Error:${Fe.COLORS.reset} ${n.message}`),process.exit(1)}}var Tj=t=>`${t.agentsOwned} of ${t.maxAgents} allowed agents${t.group?` (group: ${t.group})`:""}`;function MA(t){let e=Vi.relative(process.cwd(),t.path),n=e&&!e.startsWith("..")&&!Vi.isAbsolute(e)?e:t.path;t.extracted?(console.log(` bundle: ${n}${Vi.sep}`),console.log(`
654
673
  ${Fe.COLORS.dim}Next, on the agent VM (or from here with AGENT_VM=user@vm):${Fe.COLORS.reset}`),console.log(` cd ${n} && ./bootstrap.sh [path-to-your-pack]`)):(console.log(` bundle: ${n}`),console.log(`
655
- ${Fe.COLORS.dim}It embeds this agent's enroll token \u2014 treat it as a secret. Unpack with:${Fe.COLORS.reset} tar -xzf ${n}`))}async function bj(t){await Ng(t.json,async()=>{let e=t.name.trim();if(!e)throw new Lt("--name is required");let n=fu(t.url),r=await DA(n,{name:e,id:t.id,pack:t.pack}),s;if(t.bundle)try{s=await Pg(n,r.id,{dir:t.dir,extract:t.extract,force:t.force})}catch(i){throw i instanceof Lt?new Lt(`registered '${r.id}', but fetching its bundle failed: ${i.message}
674
+ ${Fe.COLORS.dim}It embeds this agent's enroll token \u2014 treat it as a secret. Unpack with:${Fe.COLORS.reset} tar -xzf ${n}`))}async function bj(t){await Ng(t.json,async()=>{let e=t.name.trim();if(!e)throw new Lt("--name is required");let n=fu(t.url),r=await DA(n,{name:e,id:t.id,pack:t.pack}),s;if(t.bundle)try{s=await Ig(n,r.id,{dir:t.dir,extract:t.extract,force:t.force})}catch(i){throw i instanceof Lt?new Lt(`registered '${r.id}', but fetching its bundle failed: ${i.message}
656
675
  Do NOT register again \u2014 fetch it with: agenthippo control bundle ${r.id}`):i}if(t.json){console.log(JSON.stringify({ok:!0,...r,...s?{bundlePath:s.path,extracted:s.extracted}:{}}));return}console.log(`${Fe.COLORS.green}\u2713${Fe.COLORS.reset} Registered ${Fe.COLORS.cyan}${r.name}${Fe.COLORS.reset}`),console.log(` id: ${r.id}`),r.owner&&console.log(` owner: ${r.owner}`),s?MA(s):(console.log(` enroll token (set as AGENTHIPPO_ENROLL_TOKEN on the agent): ${r.enrollToken??"(none returned)"}`),console.log(`
657
- ${Fe.COLORS.dim}Fetch the setup bundle later with:${Fe.COLORS.reset} agenthippo control bundle ${r.id}`))})}async function vj(t){await Ng(t.json,async()=>{let e=await LA(fu(t.url));if(t.json){console.log(JSON.stringify({ok:!0,...e}));return}if(console.log(`${Fe.COLORS.cyan}${e.owner}${Fe.COLORS.reset} \u2014 ${Tj(e.limit)}`),e.deployments.length===0){console.log(`${Fe.COLORS.dim} no agents yet \u2014 register one with: agenthippo control register --name "My Agent"${Fe.COLORS.reset}`);return}let n=Math.max(...e.deployments.map(r=>String(r.id).length));for(let r of e.deployments){let s=r.enabled===1?`${Fe.COLORS.green}serving${Fe.COLORS.reset}`:`${Fe.COLORS.yellow}stopped${Fe.COLORS.reset}`;console.log(` ${String(r.id).padEnd(n)} ${s} ${Fe.COLORS.dim}${String(r.name)}${Fe.COLORS.reset}`)}})}async function Oj(t){await Ng(t.json,async()=>{let e=fu(t.url),n=await Pg(e,t.id,{dir:t.dir,extract:t.extract,force:t.force});if(t.json){console.log(JSON.stringify({ok:!0,id:t.id,bundlePath:n.path,extracted:n.extracted}));return}console.log(`${Fe.COLORS.green}\u2713${Fe.COLORS.reset} Bundle for ${Fe.COLORS.cyan}${t.id}${Fe.COLORS.reset}`),MA(n)})}});var UA=S(Ds=>{"use strict";var Ij=Ds&&Ds.__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]})),Pj=Ds&&Ds.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Nj=Ds&&Ds.__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"&&Ij(n,e,r[s]);return Pj(n,e),n}})();Object.defineProperty(Ds,"__esModule",{value:!0});Ds.probeCustomEngineCommand=Lj;var Rj=Nj(require("node:path")),Cj=Pd(),kj=Bs(),$j=["in-process","node-subprocess"];function Dj(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 Lj(t){let e=t.engine.trim(),n=Rj.resolve(t.workspace),r=(0,kj.resolveCustomEngineManifest)(n,e),s=Dj(t.strategy),i=s==="all"?$j:[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,Cj.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 HA=S(Rg=>{"use strict";Object.defineProperty(Rg,"__esModule",{value:!0});Rg.conformanceCommand=Wj;var Mj=require("node:child_process"),Gj=require("node:util"),Uj=Hf(),pu=Eo(),ri=Ri(),Hj=(0,Gj.promisify)(Mj.execFile);async function hu(t,e){try{let{stdout:n}=await Hj(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 jj(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 hu(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=d=>d.replace(/^[A-Z_]*=ahc_\S*$/gm,""),o=d=>s.filter(([,u])=>u.test(i(d))).map(([u])=>u),a=o(r.out),c=await hu(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 d=/=ahc_/.test(r.out);return{name:e,status:"pass",detail:d?"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 xj(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 hu(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 hu(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 Bj(){let t="cost-cap",e="sk-conformance-upstream-key",n=(0,ri.generateWarrantKeypair)("conformance-cost-cap"),r={[n.kid]:n.publicKeyPem},s=(0,Uj.mintSandboxInferenceWarrant)(n,{user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2}),i=(0,ri.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-A"}).ok,o=(0,ri.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 Fj(){let t="warrant-integrity",e=(0,ri.generateWarrantKeypair)("conformance"),n={[e.kid]:e.publicKeyPem},r=(0,ri.mintWarrant)({user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2,aud:"data"},e),s=(0,ri.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-A"}),i=(0,ri.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-B"}),o=(0,ri.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 Vj(){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:gu(()=>(0,pu.assertAdmitted)(n,{pack:"probe",version:"1.0.0",nowSeconds:e})),otherVersionRefused:!gu(()=>(0,pu.assertAdmitted)(n,{pack:"probe",version:"1.0.1",nowSeconds:e})),killSwitchRefuses:!gu(()=>(0,pu.assertAdmitted)({...n,enabled:!1},{pack:"probe",version:"1.0.0",nowSeconds:e})),expiredRefused:!gu(()=>(0,pu.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 gu(t){try{return t(),!0}catch{return!1}}async function Wj(t){let e=a=>c=>({...c,kind:a}),n=[e("deployment")(await jj(t)),e("deployment")(await xj(t)),e("algorithm")(Bj()),e("algorithm")(Fj()),e("algorithm")(Vj())],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(`
676
+ ${Fe.COLORS.dim}Fetch the setup bundle later with:${Fe.COLORS.reset} agenthippo control bundle ${r.id}`))})}async function vj(t){await Ng(t.json,async()=>{let e=await LA(fu(t.url));if(t.json){console.log(JSON.stringify({ok:!0,...e}));return}if(console.log(`${Fe.COLORS.cyan}${e.owner}${Fe.COLORS.reset} \u2014 ${Tj(e.limit)}`),e.deployments.length===0){console.log(`${Fe.COLORS.dim} no agents yet \u2014 register one with: agenthippo control register --name "My Agent"${Fe.COLORS.reset}`);return}let n=Math.max(...e.deployments.map(r=>String(r.id).length));for(let r of e.deployments){let s=r.enabled===1?`${Fe.COLORS.green}serving${Fe.COLORS.reset}`:`${Fe.COLORS.yellow}stopped${Fe.COLORS.reset}`;console.log(` ${String(r.id).padEnd(n)} ${s} ${Fe.COLORS.dim}${String(r.name)}${Fe.COLORS.reset}`)}})}async function Oj(t){await Ng(t.json,async()=>{let e=fu(t.url),n=await Ig(e,t.id,{dir:t.dir,extract:t.extract,force:t.force});if(t.json){console.log(JSON.stringify({ok:!0,id:t.id,bundlePath:n.path,extracted:n.extracted}));return}console.log(`${Fe.COLORS.green}\u2713${Fe.COLORS.reset} Bundle for ${Fe.COLORS.cyan}${t.id}${Fe.COLORS.reset}`),MA(n)})}});var UA=S(Ds=>{"use strict";var Pj=Ds&&Ds.__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]})),Ij=Ds&&Ds.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Nj=Ds&&Ds.__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"&&Pj(n,e,r[s]);return Ij(n,e),n}})();Object.defineProperty(Ds,"__esModule",{value:!0});Ds.probeCustomEngineCommand=Lj;var Rj=Nj(require("node:path")),Cj=Id(),kj=Bs(),$j=["in-process","node-subprocess"];function Dj(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 Lj(t){let e=t.engine.trim(),n=Rj.resolve(t.workspace),r=(0,kj.resolveCustomEngineManifest)(n,e),s=Dj(t.strategy),i=s==="all"?$j:[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,Cj.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 HA=S(Rg=>{"use strict";Object.defineProperty(Rg,"__esModule",{value:!0});Rg.conformanceCommand=Wj;var Mj=require("node:child_process"),Gj=require("node:util"),Uj=Hf(),pu=Eo(),ri=Ri(),Hj=(0,Gj.promisify)(Mj.execFile);async function hu(t,e){try{let{stdout:n}=await Hj(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 jj(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 hu(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=d=>d.replace(/^[A-Z_]*=ahc_\S*$/gm,""),o=d=>s.filter(([,u])=>u.test(i(d))).map(([u])=>u),a=o(r.out),c=await hu(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 d=/=ahc_/.test(r.out);return{name:e,status:"pass",detail:d?"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 xj(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 hu(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 hu(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 Bj(){let t="cost-cap",e="sk-conformance-upstream-key",n=(0,ri.generateWarrantKeypair)("conformance-cost-cap"),r={[n.kid]:n.publicKeyPem},s=(0,Uj.mintSandboxInferenceWarrant)(n,{user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2}),i=(0,ri.verifyWarrant)(s,r,{audience:"inference",channelSandboxId:"sandbox-A"}).ok,o=(0,ri.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 Fj(){let t="warrant-integrity",e=(0,ri.generateWarrantKeypair)("conformance"),n={[e.kid]:e.publicKeyPem},r=(0,ri.mintWarrant)({user:"probe@corp.com",pack:"probe",packVersion:"0.0.0",sandboxId:"sandbox-A",tier:2,aud:"data"},e),s=(0,ri.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-A"}),i=(0,ri.verifyWarrant)(r,n,{audience:"data",channelSandboxId:"sandbox-B"}),o=(0,ri.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 Vj(){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:gu(()=>(0,pu.assertAdmitted)(n,{pack:"probe",version:"1.0.0",nowSeconds:e})),otherVersionRefused:!gu(()=>(0,pu.assertAdmitted)(n,{pack:"probe",version:"1.0.1",nowSeconds:e})),killSwitchRefuses:!gu(()=>(0,pu.assertAdmitted)({...n,enabled:!1},{pack:"probe",version:"1.0.0",nowSeconds:e})),expiredRefused:!gu(()=>(0,pu.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 gu(t){try{return t(),!0}catch{return!1}}async function Wj(t){let e=a=>c=>({...c,kind:a}),n=[e("deployment")(await jj(t)),e("deployment")(await xj(t)),e("algorithm")(Bj()),e("algorithm")(Fj()),e("algorithm")(Vj())],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(`
658
677
  AgentHippo conformance
659
678
  `);let a=c=>{let l=c.status==="pass"?"PASS":c.status==="fail"?"FAIL":"SKIP";console.log(` ${l} ${c.name}
660
679
  ${c.detail}`)};if(console.log("THIS DEPLOYMENT (probes a running sandbox)"),r.forEach(a),console.log(`
661
- 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 jA=S($g=>{"use strict";Object.defineProperty($g,"__esModule",{value:!0});$g.startRunnerHost=Yj;var Cg=vf(),Kj=1e3*60*5,qj={selected:[],freeText:null,declined:!0};function Yj(t){let e=d=>{t.output.write((0,Cg.encodeRunnerFrame)(d))},n=new Map,r="",s=!1,i=setInterval(()=>{try{t.engine.onMaintenance(t.logger??Xj())}catch(d){t.logger?.warn(`[Runner] maintenance failed: ${kg(d)}`)}},t.maintenanceIntervalMs??Kj);typeof i.unref=="function"&&i.unref();let o=()=>{},a=new Promise(d=>{o=()=>{if(!s){s=!0,clearInterval(i);for(let u of n.values())u.abort();n.clear(),d()}},t.input.on("data",u=>{r+=typeof u=="string"?u:u.toString("utf8");let{lines:f,rest:p}=(0,Cg.splitFrames)(r);r=p;for(let g of f){let m=(0,Cg.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: ${kg(u)}`),o()})});async function c(d){if(d.type==="abort"){n.get(d.id)?.abort();return}await l(d.id,d.message,d.options)}async function l(d,u,f){if(n.has(d)){e({type:"failed",id:d,message:`duplicate run id ${d}`});return}let p=new AbortController;n.set(d,p);let g=Jj(e,d);try{await t.engine.stream(u,f,g,t.runtime,p.signal);let m=t.nativeSessionId?.();e({type:"result",id:d,...m?{nativeSessionId:m}:{}})}catch(m){let h=p.signal.aborted?"aborted":kg(m);e({type:"failed",id:d,message:h})}finally{n.delete(d)}}return e({type:"ready",demux:!0}),{done:a,close:()=>o()}}function Jj(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}),qj},async error(r){n({type:"error",message:r})},async done(){n({type:"done"})}}}function kg(t){return t instanceof Error?t.message:String(t)}function Xj(){return{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}});var WA=S(Ur=>{"use strict";var zj=Ur&&Ur.__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]})),Qj=Ur&&Ur.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Mg=Ur&&Ur.__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"&&zj(n,e,r[s]);return Qj(n,e),n}})();Object.defineProperty(Ur,"__esModule",{value:!0});Ur.resolveSandboxWorkspace=FA;Ur.isForeignWorkspace=VA;Ur.sandboxCommand=ox;var $a=Mg(require("fs")),Zj=Mg(require("net")),mu=Mg(require("path")),Dg=bi(),ex=Xt(),xA=vi(),tx=Bf(),nx=Oi(),rx=Ir(),sx=br(),BA=jA();function FA(t,e){return e}function VA(t,e){return t?mu.resolve(t)!==mu.resolve(e):!1}var Lg=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,tx.createPackRunner)({storagePath:this.defaults.storagePath,analyticsSessionsDir:this.defaults.analyticsSessionsDir,packId:this.defaults.packId,packVersion:this.defaults.packVersion,provenance:()=>(0,sx.readProvenanceEnvFromProcess)(),workspaceRoot:this.defaults.workspace,credentials:{baseUrl:e.baseUrl,litellmApiKey:e.modelToken,useLiteLLM:!!e.baseUrl},claudeCheapModel:this.defaults.claudeCheapModel,effort:this.defaults.effort,omitGatewayToken:!0}),this.builtWith=n,this.runner)}async stream(e,n,r,s,i){let o=n,a=o.workspaceRoot,c=FA(a,this.defaults.workspace);VA(a,c)&&!this.warnedWorkspace&&(this.warnedWorkspace=!0,console.warn(`[sandbox] ignoring workspaceRoot ${a} from the wire \u2014 this sandbox works in ${c}`));try{$a.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),d=o,u=d.permissions??(d.fileAccess?{fileAccess:d.fileAccess}:{fileAccess:this.defaults.fileAccess}),f=await l.run({engineId:o.engineId??this.defaults.engineId,modelId:o.modelId??this.defaults.modelId,message:e,workspaceRoot:c,additionalDirectories:o.additionalDirectories,sessionId:o.sessionId,modelToken:o.modelToken,permissions:u,analyticsUserId:o.analyticsUserId,engineHomeUserKey:o.engineHomeUserKey,turnEnv:o.turnEnv,gatewaySessionKey:o.gatewaySessionKey,emitter:r,signal:i});if(!f.success&&f.error)throw new Error(f.error)}onMaintenance(){}dispose(){this.runner?.dispose()}};function ix(){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 ox(t){await(0,nx.ensureDeps)(!1);let e=t.stateDir??"/state",n=t.workspace??mu.join(e,"workspace");$a.mkdirSync(n,{recursive:!0});let r=await(0,xA.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=mu.join(e,"home");$a.mkdirSync(i,{recursive:!0}),process.env.HOME=i;let o=n;await(0,Dg.syncPackToWorkspace)(o,r.packPath,s.name,s.engine,console,(0,ex.findBundledBasePromptsDir)()),console.log(`[sandbox] pack ${s.name}@${s.version??"?"} synced into ${o} (engine ${s.engine})`),ix();let a=r.manifest.spec?.cheapModel?.trim(),c=new Lg({storagePath:e,analyticsSessionsDir:(0,rx.resolveAnalyticsSessionsDir)(e,!1),packId:s.name,packVersion:s.version,engineId:s.engine,modelId:(0,Dg.resolveModelAlias)(r.manifest.spec?.model?.trim()||"ah-auto"),claudeCheapModel:a?(0,Dg.resolveModelAlias)(a):void 0,effort:r.manifest.spec?.effort?.trim()||void 0,fileAccess:(0,xA.getFileAccess)(r),workspace:o}),l={logger:console};if(t.stdio){await(0,BA.startRunnerHost)({engine:c,runtime:l,input:process.stdin,output:{write:p=>process.stdout.write(p)},nativeSessionId:()=>c.nativeSessionId}).done;return}let d=t.socket;if(!d)throw new Error("sandbox requires --socket <path> or --stdio");try{$a.unlinkSync(d)}catch{}let u=Zj.createServer(f=>{(0,BA.startRunnerHost)({engine:c,runtime:l,input:f,output:{write:p=>f.write(p)},nativeSessionId:()=>c.nativeSessionId})});try{await new Promise((f,p)=>{u.once("error",p),u.listen(d,()=>f())})}catch(f){console.error(`[sandbox] FATAL: cannot listen at ${d}: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}try{$a.chmodSync(d,432)}catch{}console.log(`[sandbox] ${t.sandboxId??"sandbox"} listening on ${d} (pack ${s.name}@${s.version??"?"})`),await new Promise(f=>{let p=()=>{u.close(()=>f()),c.dispose()};process.once("SIGTERM",p),process.once("SIGINT",p),u.once("close",()=>f())})}});Object.defineProperty(exports,"__esModule",{value:!0});var KA=require("module"),ax=KA.prototype.require;KA.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{}}:ax.apply(this,arguments)};var qA=require("commander"),cx=ey(),YA=ry(),lx=$w(),ux=yf(),dx=Kw(),fx=mS(),px=wS(),gx=TS(),hx=eA(),mx=Zp(),Ex=PA(),JA=kA(),si=GA(),_x=UA(),Da=Oi(),Eu=et(),yx=Ba(),XA=bl();function wx(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 ${XA.DEPRECATED_CAP_SPELLINGS["--max-concurrent-cells"]}. Honouring it for now.`),n}function Sx(){try{return Wc().version??"dev"}catch{return"dev"}}var Ax=Sx(),Tx=[`${Eu.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)"," AGENTHIPPO_CONTROL_URL Control plane URL (control commands)"," AGENTHIPPO_CONTROL_KEY Your control API key, minted in the control console (control commands)","","Quickstart:",` AGENTHIPPO_LITELLM_BASE_URL="http://localhost:4000" AGENTHIPPO_LITELLM_API_KEY="dummy" AGENTHIPPO_DEFAULT_MODEL="litellm/gpt-5.5" AGENTHIPPO_DEFAULT_ENGINE="codex" ${Eu.AGENTIDE_CLI_NAME} ask "Reply with exactly: CLI_TEST_OK"`,"","Agent Packs:",` Loaded from ~/${Eu.AGENTIDE_DIR_NAME}/agents/<name>/ or absolute/relative paths.`," Pack permissions control filesystem access scope."].join(`
662
- `),Me=new qA.Command;Me.hook("preAction",async(t,e)=>{e?.name()!=="sandbox"&&await(0,yx.mergeAgentHomeEnvIntoProcessEnv)()});Me.name(Eu.AGENTIDE_CLI_NAME).description(Tx).version(Ax);Me.option("-v, --verbose","Enable verbose logging").option("--config <path>","Path to config file");Me.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=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,cx.chatCommand)({agent:t.agent,engine:t.engine,model:t.model,workspace:t.workspace,verbose:e})});Me.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=Me.opts().verbose;await(0,Da.ensureDeps)(n);let r=t.join(" ");await(0,YA.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})});Me.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=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,YA.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})});Me.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 qA.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=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,lx.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:wx(t),capOnBreach:(()=>{let n=(0,XA.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})});Me.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(()=>Pn(HA())),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});Me.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(()=>Pn(WA()));await e({agent:t.agent,socket:t.socket,stdio:!!t.stdio,workspace:t.workspace,stateDir:t.stateDir,sandboxId:t.sandboxId})});Me.command("data-plane").description("Run the connector as a sidecar (holds the backend base credential; the agent container does not)").requiredOption("-a, --agent <name>","Agent pack (reads spec.dataPlane connector + provider)").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("--gateway-port <port>","Port the engine dials (nonce-auth MCP)","9090").option("--control-port <port>","Port serve dials to register turns (bearer-auth)","9091").option("--connect-port <port>","provider=stored-grant: port for the /connect/* consent pages, proxied by the identity edge").option("--host <address>","Bind address (default 0.0.0.0 for the pod network)").option("--state-dir <path>","Where data-plane audit events are written. Same precedence as serve: --state-dir, then AGENTHIPPO_HOME, then tmpdir").action(async t=>{let e=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,ux.dataPlaneSidecarCommand)({agent:t.agent,workspace:t.workspace,gatewayPort:parseInt(t.gatewayPort,10),controlPort:parseInt(t.controlPort,10),connectPort:t.connectPort!==void 0?parseInt(t.connectPort,10):void 0,host:t.host,stateDir:t.stateDir,verbose:e})});Me.command("auth-broker").description("Start the AgentHippo auth broker (OAuth + IDE bootstrap API)").action(async()=>{await(0,dx.authBrokerCommand)()});Me.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,fx.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})});Me.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,px.idpCommand)(t,{hostname:e.hostname,cookieDomain:e.cookieDomain,out:e.out,force:!!e.force})});Me.command("grants <action>").description("Personal-account grants of a stored-grant data plane: list (who connected what, no tokens) | revoke --user <id> (offboarding)").option("--user <id>","Verified user id to revoke").option("--service <service>","google | bank (default: both)").option("--bank <name>","Only this bank link (name or item_id) with --service bank").action(async(t,e)=>{await(0,gx.grantsCommand)(t,{user:e.user,service:e.service,bank:e.bank})});Me.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,hx.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:Me.opts().verbose})});Me.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,mx.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:Me.opts().verbose})});var zA=Me.command("gateway").description("Gateway outbound messaging");zA.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,JA.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})});zA.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,JA.gatewayListCommand)({outbound:t.outbound,agent:t.agent,json:!!t.json})});var Gg=Me.command("control").description(`Register agents on a control plane from the terminal (needs ${si.CONTROL_URL_ENV} and ${si.CONTROL_KEY_ENV}; mint the key in the control console)`);Gg.command("register").description("Register a new agent, then download and unpack its setup bundle").requiredOption("-n, --name <name>","Agent name (its id is derived from this)").option("--id <id>","Exact agent id instead of one derived from the name").option("--pack <pack>","Pack name, when you already know it (bootstrap.sh reports it otherwise)").option("--url <url>",`Control plane URL (default: ${si.CONTROL_URL_ENV})`).option("-d, --dir <path>","Where to put the bundle",process.cwd()).option("--no-bundle","Only register; print the enroll token instead of fetching the bundle").option("--no-extract","Keep the bundle as a .tar.gz instead of unpacking it").option("-f, --force","Overwrite an existing bundle directory").option("--json","Output as JSON").action(async t=>{await(0,si.controlRegisterCommand)({name:t.name,id:t.id,pack:t.pack,url:t.url,dir:t.dir,bundle:t.bundle!==!1,extract:t.extract!==!1,force:!!t.force,json:!!t.json})});Gg.command("list").description("List your agents on the control plane, and how much of your allowance they use").option("--url <url>",`Control plane URL (default: ${si.CONTROL_URL_ENV})`).option("--json","Output as JSON").action(async t=>{await(0,si.controlListCommand)({url:t.url,json:!!t.json})});Gg.command("bundle <id>").description("Download (again) the setup bundle of an agent you own").option("--url <url>",`Control plane URL (default: ${si.CONTROL_URL_ENV})`).option("-d, --dir <path>","Where to put the bundle",process.cwd()).option("--no-extract","Keep the bundle as a .tar.gz instead of unpacking it").option("-f, --force","Overwrite an existing bundle directory").option("--json","Output as JSON").action(async(t,e)=>{await(0,si.controlBundleCommand)({id:t,url:e.url,dir:e.dir,extract:e.extract!==!1,force:!!e.force,json:!!e.json})});Me.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,Ex.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})});Me.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,_x.probeCustomEngineCommand)({engine:t.engine,workspace:t.workspace,strategy:t.strategy})});Me.parseAsync();
680
+ 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 jA=S($g=>{"use strict";Object.defineProperty($g,"__esModule",{value:!0});$g.startRunnerHost=Yj;var Cg=vf(),Kj=1e3*60*5,qj={selected:[],freeText:null,declined:!0};function Yj(t){let e=d=>{t.output.write((0,Cg.encodeRunnerFrame)(d))},n=new Map,r="",s=!1,i=setInterval(()=>{try{t.engine.onMaintenance(t.logger??Xj())}catch(d){t.logger?.warn(`[Runner] maintenance failed: ${kg(d)}`)}},t.maintenanceIntervalMs??Kj);typeof i.unref=="function"&&i.unref();let o=()=>{},a=new Promise(d=>{o=()=>{if(!s){s=!0,clearInterval(i);for(let u of n.values())u.abort();n.clear(),d()}},t.input.on("data",u=>{r+=typeof u=="string"?u:u.toString("utf8");let{lines:f,rest:p}=(0,Cg.splitFrames)(r);r=p;for(let g of f){let m=(0,Cg.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: ${kg(u)}`),o()})});async function c(d){if(d.type==="abort"){n.get(d.id)?.abort();return}await l(d.id,d.message,d.options)}async function l(d,u,f){if(n.has(d)){e({type:"failed",id:d,message:`duplicate run id ${d}`});return}let p=new AbortController;n.set(d,p);let g=Jj(e,d);try{await t.engine.stream(u,f,g,t.runtime,p.signal);let m=t.nativeSessionId?.();e({type:"result",id:d,...m?{nativeSessionId:m}:{}})}catch(m){let h=p.signal.aborted?"aborted":kg(m);e({type:"failed",id:d,message:h})}finally{n.delete(d)}}return e({type:"ready",demux:!0}),{done:a,close:()=>o()}}function Jj(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}),qj},async error(r){n({type:"error",message:r})},async done(){n({type:"done"})}}}function kg(t){return t instanceof Error?t.message:String(t)}function Xj(){return{info:()=>{},warn:()=>{},error:()=>{},debug:()=>{}}}});var WA=S(Ur=>{"use strict";var zj=Ur&&Ur.__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]})),Qj=Ur&&Ur.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),Mg=Ur&&Ur.__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"&&zj(n,e,r[s]);return Qj(n,e),n}})();Object.defineProperty(Ur,"__esModule",{value:!0});Ur.resolveSandboxWorkspace=FA;Ur.isForeignWorkspace=VA;Ur.sandboxCommand=ox;var $a=Mg(require("fs")),Zj=Mg(require("net")),mu=Mg(require("path")),Dg=bi(),ex=Xt(),xA=vi(),tx=Bf(),nx=Oi(),rx=Pr(),sx=br(),BA=jA();function FA(t,e){return e}function VA(t,e){return t?mu.resolve(t)!==mu.resolve(e):!1}var Lg=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,tx.createPackRunner)({storagePath:this.defaults.storagePath,analyticsSessionsDir:this.defaults.analyticsSessionsDir,packId:this.defaults.packId,packVersion:this.defaults.packVersion,provenance:()=>(0,sx.readProvenanceEnvFromProcess)(),workspaceRoot:this.defaults.workspace,credentials:{baseUrl:e.baseUrl,litellmApiKey:e.modelToken,useLiteLLM:!!e.baseUrl},claudeCheapModel:this.defaults.claudeCheapModel,effort:this.defaults.effort,omitGatewayToken:!0}),this.builtWith=n,this.runner)}async stream(e,n,r,s,i){let o=n,a=o.workspaceRoot,c=FA(a,this.defaults.workspace);VA(a,c)&&!this.warnedWorkspace&&(this.warnedWorkspace=!0,console.warn(`[sandbox] ignoring workspaceRoot ${a} from the wire \u2014 this sandbox works in ${c}`));try{$a.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),d=o,u=d.permissions??(d.fileAccess?{fileAccess:d.fileAccess}:{fileAccess:this.defaults.fileAccess}),f=await l.run({engineId:o.engineId??this.defaults.engineId,modelId:o.modelId??this.defaults.modelId,message:e,workspaceRoot:c,additionalDirectories:o.additionalDirectories,sessionId:o.sessionId,modelToken:o.modelToken,permissions:u,analyticsUserId:o.analyticsUserId,engineHomeUserKey:o.engineHomeUserKey,turnEnv:o.turnEnv,gatewaySessionKey:o.gatewaySessionKey,emitter:r,signal:i});if(!f.success&&f.error)throw new Error(f.error)}onMaintenance(){}dispose(){this.runner?.dispose()}};function ix(){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 ox(t){await(0,nx.ensureDeps)(!1);let e=t.stateDir??"/state",n=t.workspace??mu.join(e,"workspace");$a.mkdirSync(n,{recursive:!0});let r=await(0,xA.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=mu.join(e,"home");$a.mkdirSync(i,{recursive:!0}),process.env.HOME=i;let o=n;await(0,Dg.syncPackToWorkspace)(o,r.packPath,s.name,s.engine,console,(0,ex.findBundledBasePromptsDir)()),console.log(`[sandbox] pack ${s.name}@${s.version??"?"} synced into ${o} (engine ${s.engine})`),ix();let a=r.manifest.spec?.cheapModel?.trim(),c=new Lg({storagePath:e,analyticsSessionsDir:(0,rx.resolveAnalyticsSessionsDir)(e,!1),packId:s.name,packVersion:s.version,engineId:s.engine,modelId:(0,Dg.resolveModelAlias)(r.manifest.spec?.model?.trim()||"ah-auto"),claudeCheapModel:a?(0,Dg.resolveModelAlias)(a):void 0,effort:r.manifest.spec?.effort?.trim()||void 0,fileAccess:(0,xA.getFileAccess)(r),workspace:o}),l={logger:console};if(t.stdio){await(0,BA.startRunnerHost)({engine:c,runtime:l,input:process.stdin,output:{write:p=>process.stdout.write(p)},nativeSessionId:()=>c.nativeSessionId}).done;return}let d=t.socket;if(!d)throw new Error("sandbox requires --socket <path> or --stdio");try{$a.unlinkSync(d)}catch{}let u=Zj.createServer(f=>{(0,BA.startRunnerHost)({engine:c,runtime:l,input:f,output:{write:p=>f.write(p)},nativeSessionId:()=>c.nativeSessionId})});try{await new Promise((f,p)=>{u.once("error",p),u.listen(d,()=>f())})}catch(f){console.error(`[sandbox] FATAL: cannot listen at ${d}: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}try{$a.chmodSync(d,432)}catch{}console.log(`[sandbox] ${t.sandboxId??"sandbox"} listening on ${d} (pack ${s.name}@${s.version??"?"})`),await new Promise(f=>{let p=()=>{u.close(()=>f()),c.dispose()};process.once("SIGTERM",p),process.once("SIGINT",p),u.once("close",()=>f())})}});Object.defineProperty(exports,"__esModule",{value:!0});var KA=require("module"),ax=KA.prototype.require;KA.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{}}:ax.apply(this,arguments)};var qA=require("commander"),cx=ey(),YA=ry(),lx=$w(),ux=yf(),dx=Kw(),fx=mS(),px=wS(),gx=TS(),hx=eA(),mx=Zp(),Ex=IA(),JA=kA(),si=GA(),_x=UA(),Da=Oi(),Eu=et(),yx=Ba(),XA=bl();function wx(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 ${XA.DEPRECATED_CAP_SPELLINGS["--max-concurrent-cells"]}. Honouring it for now.`),n}function Sx(){try{return Wc().version??"dev"}catch{return"dev"}}var Ax=Sx(),Tx=[`${Eu.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)"," AGENTHIPPO_CONTROL_URL Control plane URL (control commands)"," AGENTHIPPO_CONTROL_KEY Your control API key, minted in the control console (control commands)","","Quickstart:",` AGENTHIPPO_LITELLM_BASE_URL="http://localhost:4000" AGENTHIPPO_LITELLM_API_KEY="dummy" AGENTHIPPO_DEFAULT_MODEL="litellm/gpt-5.5" AGENTHIPPO_DEFAULT_ENGINE="codex" ${Eu.AGENTIDE_CLI_NAME} ask "Reply with exactly: CLI_TEST_OK"`,"","Agent Packs:",` Loaded from ~/${Eu.AGENTIDE_DIR_NAME}/agents/<name>/ or absolute/relative paths.`," Pack permissions control filesystem access scope."].join(`
681
+ `),Me=new qA.Command;Me.hook("preAction",async(t,e)=>{e?.name()!=="sandbox"&&await(0,yx.mergeAgentHomeEnvIntoProcessEnv)()});Me.name(Eu.AGENTIDE_CLI_NAME).description(Tx).version(Ax);Me.option("-v, --verbose","Enable verbose logging").option("--config <path>","Path to config file");Me.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=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,cx.chatCommand)({agent:t.agent,engine:t.engine,model:t.model,workspace:t.workspace,verbose:e})});Me.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=Me.opts().verbose;await(0,Da.ensureDeps)(n);let r=t.join(" ");await(0,YA.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})});Me.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=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,YA.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})});Me.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 qA.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=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,lx.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:wx(t),capOnBreach:(()=>{let n=(0,XA.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})});Me.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(()=>In(HA())),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});Me.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(()=>In(WA()));await e({agent:t.agent,socket:t.socket,stdio:!!t.stdio,workspace:t.workspace,stateDir:t.stateDir,sandboxId:t.sandboxId})});Me.command("data-plane").description("Run the connector as a sidecar (holds the backend base credential; the agent container does not)").requiredOption("-a, --agent <name>","Agent pack (reads spec.dataPlane connector + provider)").option("-w, --workspace <path>","Workspace directory",process.cwd()).option("--gateway-port <port>","Port the engine dials (nonce-auth MCP)","9090").option("--control-port <port>","Port serve dials to register turns (bearer-auth)","9091").option("--connect-port <port>","provider=stored-grant: port for the /connect/* consent pages, proxied by the identity edge").option("--host <address>","Bind address (default 0.0.0.0 for the pod network)").option("--state-dir <path>","Where data-plane audit events are written. Same precedence as serve: --state-dir, then AGENTHIPPO_HOME, then tmpdir").action(async t=>{let e=Me.opts().verbose;await(0,Da.ensureDeps)(e),await(0,ux.dataPlaneSidecarCommand)({agent:t.agent,workspace:t.workspace,gatewayPort:parseInt(t.gatewayPort,10),controlPort:parseInt(t.controlPort,10),connectPort:t.connectPort!==void 0?parseInt(t.connectPort,10):void 0,host:t.host,stateDir:t.stateDir,verbose:e})});Me.command("auth-broker").description("Start the AgentHippo auth broker (OAuth + IDE bootstrap API)").action(async()=>{await(0,dx.authBrokerCommand)()});Me.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,fx.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})});Me.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,px.idpCommand)(t,{hostname:e.hostname,cookieDomain:e.cookieDomain,out:e.out,force:!!e.force})});Me.command("grants <action>").description("Personal-account grants of a stored-grant data plane: list (who connected what, no tokens) | revoke --user <id> (offboarding)").option("--user <id>","Verified user id to revoke").option("--service <service>","google | bank (default: both)").option("--bank <name>","Only this bank link (name or item_id) with --service bank").action(async(t,e)=>{await(0,gx.grantsCommand)(t,{user:e.user,service:e.service,bank:e.bank})});Me.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,hx.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:Me.opts().verbose})});Me.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,mx.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:Me.opts().verbose})});var zA=Me.command("gateway").description("Gateway outbound messaging");zA.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,JA.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})});zA.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,JA.gatewayListCommand)({outbound:t.outbound,agent:t.agent,json:!!t.json})});var Gg=Me.command("control").description(`Register agents on a control plane from the terminal (needs ${si.CONTROL_URL_ENV} and ${si.CONTROL_KEY_ENV}; mint the key in the control console)`);Gg.command("register").description("Register a new agent, then download and unpack its setup bundle").requiredOption("-n, --name <name>","Agent name (its id is derived from this)").option("--id <id>","Exact agent id instead of one derived from the name").option("--pack <pack>","Pack name, when you already know it (bootstrap.sh reports it otherwise)").option("--url <url>",`Control plane URL (default: ${si.CONTROL_URL_ENV})`).option("-d, --dir <path>","Where to put the bundle",process.cwd()).option("--no-bundle","Only register; print the enroll token instead of fetching the bundle").option("--no-extract","Keep the bundle as a .tar.gz instead of unpacking it").option("-f, --force","Overwrite an existing bundle directory").option("--json","Output as JSON").action(async t=>{await(0,si.controlRegisterCommand)({name:t.name,id:t.id,pack:t.pack,url:t.url,dir:t.dir,bundle:t.bundle!==!1,extract:t.extract!==!1,force:!!t.force,json:!!t.json})});Gg.command("list").description("List your agents on the control plane, and how much of your allowance they use").option("--url <url>",`Control plane URL (default: ${si.CONTROL_URL_ENV})`).option("--json","Output as JSON").action(async t=>{await(0,si.controlListCommand)({url:t.url,json:!!t.json})});Gg.command("bundle <id>").description("Download (again) the setup bundle of an agent you own").option("--url <url>",`Control plane URL (default: ${si.CONTROL_URL_ENV})`).option("-d, --dir <path>","Where to put the bundle",process.cwd()).option("--no-extract","Keep the bundle as a .tar.gz instead of unpacking it").option("-f, --force","Overwrite an existing bundle directory").option("--json","Output as JSON").action(async(t,e)=>{await(0,si.controlBundleCommand)({id:t,url:e.url,dir:e.dir,extract:e.extract!==!1,force:!!e.force,json:!!e.json})});Me.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,Ex.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})});Me.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,_x.probeCustomEngineCommand)({engine:t.engine,workspace:t.workspace,strategy:t.strategy})});Me.parseAsync();