@qoder-ai/qoder-agent-sdk 1.0.22 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,34 +1,34 @@
1
- var Tr=Object.defineProperty;var Er=(s,e)=>{for(var t in e)Tr(s,t,{get:e[t],enumerable:!0})};import{spawn as nn}from"child_process";import{createInterface as on}from"readline";var _r=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],Mr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Re=2e3,Dt=5e3;var Ot="1.0.22";var L=41,xt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","WebFetch","WebSearch","Write"],It=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Cr="QODER_FEATURE_TASKS";function jt(s){let e=s[Cr];if(e!=="0"&&e!=="false")return[...xt];let t=new Set(It);return xt.flatMap(r=>r===It[0]?["TodoWrite"]:t.has(r)?[]:[r])}import{chmod as Ut,mkdtemp as qr,rm as Ft,writeFile as $r}from"fs/promises";import{existsSync as Me,mkdtempSync as Lr,readFileSync as Qr,rmSync as zr,writeFileSync as Hr}from"fs";import{homedir as Br,tmpdir as qt}from"os";import{dirname as Wt,join as I}from"path";import{fileURLToPath as Wr}from"url";var Ar=/^[A-Za-z0-9_-]{1,64}$/,xr=new Set(["mcp_list","mcp_get","mcp_call"]);function Ve(s,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${s}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Ar.test(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(xr.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Ge(s,e){let t={};for(let r of e)Ve(s,r),(r.exposedName!==void 0||r.alwaysLoad===!0)&&(t[r.name]={...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function Ye(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=Ge(s,t);return{...n,...o?{toolOverrides:o}:{}}}function Nt(s){let e={};for(let[t,r]of Object.entries(s)){if(r.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let n=r.tools??[],o=n.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=Ye(t,r,n)}return e}var Ir="global",Dr=Ir==="cn",y=Dr?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Kt=y.accessTokenEnv,Te=y.serviceAccountEnv;function Or(s){return{type:"accessToken",accessToken:s}}function jr(s=Kt){return{type:"accessToken",accessToken:{envVar:s}}}function Nr(){return{type:"qodercli"}}function Kr(s){let e=s.serviceAccountKey!==void 0,t=typeof s.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...s}}function Ur(s=Te){return{type:"serviceAccount",serviceAccountKey:{envVar:s}}}function Fr(s){return{type:"jobToken",fetchJobToken:s}}var $t="QODER_AGENT_SDK_ENTRYPOINT",Lt="QODER_AGENT_SDK_VERSION",Qt="QODER_SDK_AUTH_PAYLOAD_FILE",Jr="sdk-ts",Vr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],Gr=Wr(import.meta.url),zt=Wt(Gr),Ee=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},_e=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function Jt(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function X(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=Yr();if(s)return s;let e=Xr();if(Me(e))return e;let t=Zr();return t||y.cliCommands[0]}function Yr(){for(let s of Vt())for(let e of y.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=I(s,"dist","_bundled",t);if(Me(r))return r}return null}function Xr(){for(let s of Vt())for(let e of y.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=[I(s,"node_modules",".bin",t),I(s,"..","..",".bin",t)];for(let n of r)if(Me(n))return n}return y.cliCommands[0]}function Zr(){let s=process.env[y.cliHomeEnv]??Br();for(let e of y.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=I(s,y.configDirName,"local",t);if(Me(r))return r}return null}function Vt(){let s=[I(zt,".."),I(zt,"..","..")];return[...new Set(s)]}function en(){return{allow:[],ask:[],deny:[]}}function Ht(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function tn(s,e){if(e.startsWith("mcp__"))return e;let t=Ht(s),r=e==="*"?"*":Ht(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function Bt(s,e){if(e.length===0)return;let t=new Set(s);for(let r of e)t.has(r)||(s.push(r),t.add(r))}function sn(s){let e=s??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},r=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...r,enabled:!0}}}}var Y=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,r="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=r}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{zr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Wt(this.authPayloadPath);try{await Ft(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);delete t[$t],delete t[Lt],delete t[Qt];for(let r of this.serviceAccountCredentialEnvVars())rn(t,r);if(t[$t]=Jr,t[Lt]=Ot,this.authPayloadPath&&(t[Qt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Vr)t[r]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Te];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let r=t.tools??jt(t.env??process.env);if(Array.isArray(r)?e.push("--tools",r.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let n=this.buildSettingsArg();if(n!==void 0&&e.push("--settings",n),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let r={...e??{}};this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t);let n=this.applyFileCheckpointingSetting(r);return Object.keys(n).length>0?JSON.stringify(n):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?sn(e):e}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let r=e.general!==null&&typeof e.general=="object"?e.general:{},n=this.toQoderDefaultPermissionMode(t.defaultMode);n!==void 0&&r.defaultPermissionMode===void 0&&(r.defaultPermissionMode=n),e.general=r}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let r=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},n=Array.isArray(r.additionalDirectories)?[...r.additionalDirectories]:[];Bt(n,t),r.additionalDirectories=n,e.permissions=r}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[r,n]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[r]??n.tools??[];t[r]=Ye(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=en(),t=new Map;for(let[r,n]of Object.entries(this.options.mcpToolPolicies??{}))n.length>0&&t.set(r,n);for(let[r,n]of Object.entries(this.options.mcpServers??{})){let o=n.tools;Array.isArray(o)&&o.length>0&&t.set(r,[...t.get(r)??[],...o])}for(let[r,n]of t)for(let o of n){let i=tn(r,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let r=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=r;for(let n of["allow","ask","deny"]){let o=Array.isArray(r[n])?[...r[n]]:[];Bt(o,t[n]),r[n]=o}}readSettingsFile(e){let t=Qr(e,"utf8").trim();if(!t)return{};let r=JSON.parse(t);if(r===null||typeof r!="object"||Array.isArray(r))throw new Error("Settings file must contain a JSON object.");return r}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Lr(I(qt(),"qoder-agent-sdk-settings-"));let t=I(this.generatedSettingsDir,"settings.json");return Hr(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await qr(I(qt(),"qoder-sdk-auth-"));try{await Ut(r,448);let n=I(r,"payload.json");return await $r(n,JSON.stringify(t),{mode:384}),await Ut(n,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${n}`),n}catch(n){throw await Ft(r,{recursive:!0,force:!0}).catch(()=>{}),n}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,r=typeof e.fetchServiceAccountToken=="function";if(t===r)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return r?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,r=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!r)throw new _e(t);return r}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,r=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!r)throw new Ee(t);return r}};function rn(s,e){if(process.platform!=="win32"){delete s[e];return}let t=e.toLowerCase();for(let r of Object.keys(s))r.toLowerCase()===t&&delete s[r]}function Ce(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var Gt=8192,Z=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},ee=class s{static default=new s;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(Ce(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let r=e.env,{command:n,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${n} ${o.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:n,args:o,cwd:this.options.cwd,env:r,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,c)=>{this.ready=!1,a===L&&this.fireAuthExpired();let u=this.createProcessExitError(a,c);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})})}else this.process=nn(n,o,{cwd:this.options.cwd,env:r,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===L&&this.fireAuthExpired();let c=this.createProcessExitError(i,a);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let c=a.trim();c&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${c}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
1
+ var qn=Object.defineProperty;var Ln=(r,e)=>{for(var t in e)qn(r,t,{get:e[t],enumerable:!0})};import{spawn as ws}from"child_process";import{createInterface as vs}from"readline";var $n=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],Qn=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],_e=2e3,Ut=5e3;var qt="1.0.24";var L=41,Kt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","WebFetch","WebSearch","Write"],Ft=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Bn="QODER_FEATURE_TASKS";function Lt(r){let e=r[Bn];if(e!=="0"&&e!=="false")return[...Kt];let t=new Set(Ft);return Kt.flatMap(n=>n===Ft[0]?["TodoWrite"]:t.has(n)?[]:[n])}import{chmod as Wt,mkdtemp as ts,rm as Ht,writeFile as rs}from"fs/promises";import{existsSync as xe,mkdtempSync as ns,readFileSync as ss,rmSync as os,writeFileSync as is}from"fs";import{homedir as as,tmpdir as Gt}from"os";import{dirname as tr,join as D}from"path";import{fileURLToPath as us}from"url";var zn=/^[A-Za-z0-9_-]{1,64}$/,Wn=new Set(["mcp_list","mcp_get","mcp_call"]);function et(r,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${r}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!zn.test(e.exposedName))throw new Error(`MCP tool "${r}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Wn.has(e.exposedName))throw new Error(`MCP tool "${r}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function tt(r,e){let t={};for(let n of e)et(r,n),(n.exposedName!==void 0||n.alwaysLoad===!0)&&(t[n.name]={...n.exposedName!==void 0?{exposedName:n.exposedName}:{},...n.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function rt(r,e,t=e.tools??[]){let{tools:n,...s}=e,o=tt(r,t);return{...s,...o?{toolOverrides:o}:{}}}function $t(r){let e={};for(let[t,n]of Object.entries(r)){if(n.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let s=n.tools??[],o=s.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=rt(t,n,s)}return e}var Hn="global",Gn=Hn==="cn",w=Gn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Qt=w.accessTokenEnv,Me=w.serviceAccountEnv;function Jn(r){return{type:"accessToken",accessToken:r}}function Vn(r=Qt){return{type:"accessToken",accessToken:{envVar:r}}}function Yn(){return{type:"qodercli"}}function Xn(r){let e=r.serviceAccountKey!==void 0,t=typeof r.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...r}}function Zn(r=Me){return{type:"serviceAccount",serviceAccountKey:{envVar:r}}}function es(r){return{type:"jobToken",fetchJobToken:r}}var Bt=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function zt(r){if(r===null||typeof r!="object"||Array.isArray(r))throw new TypeError("securityScan must be an object.");let e=new Set(Bt),t=Object.keys(r).filter(n=>!e.has(n));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let n of Bt){let s=r[n];if(s!==void 0&&typeof s!="boolean")throw new TypeError(`securityScan.${n} must be a boolean.`)}return{l1StaticCheck:r.l1StaticCheck??!1,l2LightweightScan:r.l2LightweightScan??!1,l3DeepScan:r.l3DeepScan??!1}}var Jt="QODER_AGENT_SDK_ENTRYPOINT",Vt="QODER_AGENT_SDK_VERSION",Yt="QODER_SDK_AUTH_PAYLOAD_FILE",cs="sdk-ts",ds=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],ls=us(import.meta.url),Xt=tr(ls),Ce=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ae=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function rr(r){return/\.(js|mjs|tsx?|jsx)$/.test(r)}function X(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let r=ps();if(r)return r;let e=ms();if(xe(e))return e;let t=fs();return t||w.cliCommands[0]}function ps(){for(let r of nr())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,n=D(r,"dist","_bundled",t);if(xe(n))return n}return null}function ms(){for(let r of nr())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,n=[D(r,"node_modules",".bin",t),D(r,"..","..",".bin",t)];for(let s of n)if(xe(s))return s}return w.cliCommands[0]}function fs(){let r=process.env[w.cliHomeEnv]??as();for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,n=D(r,w.configDirName,"local",t);if(xe(n))return n}return null}function nr(){let r=[D(Xt,".."),D(Xt,"..","..")];return[...new Set(r)]}function gs(){return{allow:[],ask:[],deny:[]}}function Zt(r){return r.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function hs(r,e){if(e.startsWith("mcp__"))return e;let t=Zt(r),n=e==="*"?"*":Zt(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${r}" and tool "${e}"`);return`mcp__${t}__${n}`}function er(r,e){if(e.length===0)return;let t=new Set(r);for(let n of e)t.has(n)||(r.push(n),t.add(n))}function ys(r){let e=r??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},n=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...n,enabled:!0}}}}var Y=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,n="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=n}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{os(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=tr(this.authPayloadPath);try{await Ht(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[n,s]of Object.entries(e))s!==void 0&&(t[n]=s);delete t[Jt],delete t[Vt],delete t[Yt];for(let n of this.serviceAccountCredentialEnvVars())Ss(t,n);if(t[Jt]=cs,t[Vt]=qt,this.authPayloadPath&&(t[Yt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of ds)t[n]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Me];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let n=t.tools??Lt(t.env??process.env);if(Array.isArray(n)?e.push("--tools",n.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let s=this.buildSettingsArg();if(s!==void 0&&e.push("--settings",s),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let n={...e??{}};this.applySettingsCompatibility(n),this.applyAdditionalDirectories(n),this.applyMcpPolicyRules(n,t),this.applySecurityScanSetting(n);let s=this.applyFileCheckpointingSetting(n);return Object.keys(s).length>0?JSON.stringify(s):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?ys(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=zt(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let n=e.general!==null&&typeof e.general=="object"?e.general:{},s=this.toQoderDefaultPermissionMode(t.defaultMode);s!==void 0&&n.defaultPermissionMode===void 0&&(n.defaultPermissionMode=s),e.general=n}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},s=Array.isArray(n.additionalDirectories)?[...n.additionalDirectories]:[];er(s,t),n.additionalDirectories=s,e.permissions=n}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[n,s]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[n]??s.tools??[];t[n]=rt(n,s,o)}return t}collectMcpPolicyPermissionRules(){let e=gs(),t=new Map;for(let[n,s]of Object.entries(this.options.mcpToolPolicies??{}))s.length>0&&t.set(n,s);for(let[n,s]of Object.entries(this.options.mcpServers??{})){let o=s.tools;Array.isArray(o)&&o.length>0&&t.set(n,[...t.get(n)??[],...o])}for(let[n,s]of t)for(let o of s){let i=hs(n,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=n;for(let s of["allow","ask","deny"]){let o=Array.isArray(n[s])?[...n[s]]:[];er(o,t[s]),n[s]=o}}readSettingsFile(e){let t=ss(e,"utf8").trim();if(!t)return{};let n=JSON.parse(t);if(n===null||typeof n!="object"||Array.isArray(n))throw new Error("Settings file must contain a JSON object.");return n}writeGeneratedSettingsFile(e){this.generatedSettingsDir=ns(D(Gt(),"qoder-agent-sdk-settings-"));let t=D(this.generatedSettingsDir,"settings.json");return is(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await ts(D(Gt(),"qoder-sdk-auth-"));try{await Wt(n,448);let s=D(n,"payload.json");return await rs(s,JSON.stringify(t),{mode:384}),await Wt(s,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${s}`),s}catch(s){throw await Ht(n,{recursive:!0,force:!0}).catch(()=>{}),s}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,n=typeof e.fetchServiceAccountToken=="function";if(t===n)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return n?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,n=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!n)throw new Ae(t);return n}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,n=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!n)throw new Ce(t);return n}};function Ss(r,e){if(process.platform!=="win32"){delete r[e];return}let t=e.toLowerCase();for(let n of Object.keys(r))n.toLowerCase()===t&&delete r[n]}function Ie(r,e){let t={...r};for(let[n,s]of Object.entries(e))s!==void 0&&(t[n]=s);return t}var sr=8192,Z=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},ee=class r{static default=new r;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new r(Ie(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let n=e.env,{command:s,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${s} ${o.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:s,args:o,cwd:this.options.cwd,env:n,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,u)=>{this.ready=!1,a===L&&this.fireAuthExpired();let c=this.createProcessExitError(a,u);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})})}else this.process=ws(s,o,{cwd:this.options.cwd,env:n,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===L&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
2
2
  `)?e:e+`
3
- `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=on({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let n=r.trim();if(n)try{yield JSON.parse(n)}catch{}}this.closed||await this.waitForProcessExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let r=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!r)return;let n=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??Re,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},Dt);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>Gt&&(this.stderrTail=this.stderrTail.slice(-Gt))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",n=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new Z(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==L){if(e!==0&&e!==null)return new Z(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new Z(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,r)=>{let n=(i,a)=>{e.off("error",o);let c=this.createProcessExitError(i,a);c?(this.processExitError=c,r(c)):t()},o=i=>{e.off("exit",n);let a=this.createSpawnError(i);this.processExitError=a,r(a)};e.once("exit",n),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??X();if(Jt(t)){let r=this.options.executable??"node",n=this.options.executableArgs??[];return{command:r,commandArgs:[...n,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function an(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var Xe=an();function Yt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function Ae(s,e){return s.create(e)}import{existsSync as Ie}from"fs";import{createInterface as _n}from"readline";import{dirname as Mn,join as Q}from"path";import{fileURLToPath as Cn}from"url";import{Worker as An}from"worker_threads";import{createHash as cn}from"node:crypto";import{existsSync as un}from"node:fs";import{chmod as dn,lstat as ln,mkdir as fe,readFile as Xt,readdir as pn,readlink as fn,rename as gn,rm as xe,stat as mn,symlink as hn,writeFile as Zt}from"node:fs/promises";import{tmpdir as yn,userInfo as Sn}from"node:os";import{basename as es,dirname as te,join as D,relative as vn}from"node:path";var wn="QODER_WORKER_RUNTIME_ASSET_ROOT",ts=/(^|[\\/])app\.asar([\\/]|$)/,et=".qoder-worker-runtime-ready";function ss(s){return ts.test(s)}function tt(s){return ss(s)?s.replace(ts,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function rs(s,e={}){let t=tt(s);if(!e.forceMaterialize&&t){let c=te(t);if(un(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ze(t,c,!1,te(s))}if(!(e.forceMaterialize||ss(s))){let c=te(s);return Ze(s,c,!1)}let n=te(s),o=await kn(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=vn(n,s)||es(s),a=D(o,i);return Ze(a,o,!0,n)}function Ze(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[wn]:e}}}async function kn(s,e,t){let r=await bn(s,e),n=t.cacheDir??Tn(),o=D(n,r),i=D(o,et);if(await os(i)===r)return o;let a=D(n,`.setup-${r}-${process.pid}-${Date.now()}`);await fe(n,{recursive:!0,mode:448}),await xe(a,{recursive:!0,force:!0}),await xe(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await fe(a,{recursive:!0,mode:448}),await ns(s,a),await Zt(D(a,et),r,{mode:384}),await Rn(a,o,r),o}catch(c){throw await xe(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function bn(s,e){let t=cn("sha256");t.update("qoder-worker-runtime-v1\0");let r=await is(D(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await mn(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ns(s,e){let t=await pn(s,{withFileTypes:!0});await fe(e,{recursive:!0,mode:448});for(let r of t){let n=D(s,r.name),o=D(e,r.name);if(r.isDirectory()){await ns(n,o);continue}if(r.isSymbolicLink()){await fe(te(o),{recursive:!0,mode:448}),await hn(await fn(n),o);continue}if(!r.isFile())continue;let i=await Pn(n);await fe(te(o),{recursive:!0,mode:448}),await Zt(o,await Xt(n),{mode:i}),process.platform!=="win32"&&await dn(o,i)}}async function Pn(s){let e=((await ln(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=es(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Rn(s,e,t){try{await gn(s,e)}catch(r){if(await os(D(e,et))===t){await xe(s,{recursive:!0,force:!0});return}throw r}}async function os(s){let e=await is(s);return e?e.toString("utf8"):null}async function is(s){try{return await Xt(s)}catch{return null}}function Tn(){let s=En(Sn().username||process.env.USER||process.env.USERNAME||"user");return D(yn(),`qoder-sdk-worker-runtime-${s}`)}function En(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var as=8192,xn="QODER_WORKER_CWD",In=new Set(["--mcp-config","--settings"]),Dn=Cn(import.meta.url),st=Mn(Dn),z=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},se=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new rt(Ce(this.options,e))}},rt=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=nt(this.options.pathToQoderWorkerRuntime),r;try{r=await rs(t,{diagnostics:this.diagnostics})}catch(a){throw new z(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!Ie(n))throw new z(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[xn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${On(e.args)}`),this.worker=new An(n,{argv:e.args,env:i,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:{...this.options.workerData??{},qoderWorkerRuntime:{cwd:o,runtimeRoot:r.runtimeRoot,materialized:r.materialized}}}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===L&&this.fireAuthExpired();let c=this.createWorkerExitError(a);c&&(this.workerExitError=c),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let c=a.toString();this.appendStderr(c),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(c),this.options.stderr==="inherit"&&process.stderr.write(c);let u=c.trim();u&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${u}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
3
+ `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=vs({input:e,crlfDelay:1/0});try{for await(let n of t){if(this.closed)break;let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}this.closed||await this.waitForProcessExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let n=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!n)return;let s=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??_e,i=setTimeout(()=>{if(s()){n("SIGTERM");let a=setTimeout(()=>{s()&&n("SIGKILL")},Ut);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>sr&&(this.stderrTail=this.stderrTail.slice(-sr))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",s=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new Z(s,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==L){if(e!==0&&e!==null)return new Z(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new Z(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,n)=>{let s=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,n(u)):t()},o=i=>{e.off("exit",s);let a=this.createSpawnError(i);this.processExitError=a,n(a)};e.once("exit",s),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??X();if(rr(t)){let n=this.options.executable??"node",s=this.options.executableArgs??[];return{command:n,commandArgs:[...s,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function ks(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ge=ks();function or(r){return typeof r=="object"&&r!==null&&typeof r.create=="function"}function Oe(r,e){return r.create(e)}import{existsSync as Ws}from"fs";import{createInterface as Hs}from"readline";import{Worker as Gs}from"worker_threads";import{createHash as bs}from"node:crypto";import{existsSync as Rs}from"node:fs";import{chmod as Ts,lstat as Ps,mkdir as he,readFile as ir,readdir as Es,readlink as _s,rename as Ms,rm as De,stat as Cs,symlink as As,writeFile as ar}from"node:fs/promises";import{tmpdir as xs,userInfo as Is}from"node:os";import{basename as ur,dirname as te,join as j,relative as Os}from"node:path";var Ds="QODER_WORKER_RUNTIME_ASSET_ROOT",cr=/(^|[\\/])app\.asar([\\/]|$)/,st=".qoder-worker-runtime-ready";function dr(r){return cr.test(r)}function ot(r){return dr(r)?r.replace(cr,(e,t,n)=>`${t}app.asar.unpacked${n}`):null}async function je(r,e={}){let t=ot(r);if(!e.forceMaterialize&&t){let u=te(t);if(Rs(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),nt(t,u,!1,te(r))}if(!(e.forceMaterialize||dr(r))){let u=te(r);return nt(r,u,!1)}let s=te(r),o=await js(s,r,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=Os(s,r)||ur(r),a=j(o,i);return nt(a,o,!0,s)}function nt(r,e,t,n){return{runtimePath:r,runtimeRoot:e,materialized:t,sourceRuntimeRoot:n,env:{[Ds]:e}}}async function js(r,e,t){let n=await Ns(r,e),s=t.cacheDir??Us(),o=j(s,n),i=j(o,st);if(await pr(i)===n)return o;let a=j(s,`.setup-${n}-${process.pid}-${Date.now()}`);await he(s,{recursive:!0,mode:448}),await De(a,{recursive:!0,force:!0}),await De(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${r} -> ${o}`);try{return await he(a,{recursive:!0,mode:448}),await lr(r,a),await ar(j(a,st),n,{mode:384}),await Fs(a,o,n),o}catch(u){throw await De(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Ns(r,e){let t=bs("sha256");t.update("qoder-worker-runtime-v1\0");let n=await mr(j(r,"runtime-info.json"));if(n)t.update(n);else{t.update(e);let s=await Cs(e).catch(()=>null);s&&t.update(`${s.size}\0${s.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function lr(r,e){let t=await Es(r,{withFileTypes:!0});await he(e,{recursive:!0,mode:448});for(let n of t){let s=j(r,n.name),o=j(e,n.name);if(n.isDirectory()){await lr(s,o);continue}if(n.isSymbolicLink()){await he(te(o),{recursive:!0,mode:448}),await As(await _s(s),o);continue}if(!n.isFile())continue;let i=await Ks(s);await he(te(o),{recursive:!0,mode:448}),await ar(o,await ir(s),{mode:i}),process.platform!=="win32"&&await Ts(o,i)}}async function Ks(r){let e=((await Ps(r)).mode||420)&511;if(process.platform==="win32")return e||420;let t=ur(r);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Fs(r,e,t){try{await Ms(r,e)}catch(n){if(await pr(j(e,st))===t){await De(r,{recursive:!0,force:!0});return}throw n}}async function pr(r){let e=await mr(r);return e?e.toString("utf8"):null}async function mr(r){try{return await ir(r)}catch{return null}}function Us(){let r=qs(Is().username||process.env.USER||process.env.USERNAME||"user");return j(xs(),`qoder-sdk-worker-runtime-${r}`)}function qs(r){return r.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Ls="QODER_WORKER_CWD";function Ne(r,e){return{env:{...e.env,[Ls]:e.cwd,...r.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:r.runtimeRoot,materialized:r.materialized}}}}import{existsSync as it}from"node:fs";import{dirname as $s,join as $}from"node:path";import{fileURLToPath as Qs}from"node:url";var Bs=Qs(import.meta.url),at=$s(Bs);function re(r){if(r)return r;let e=[];for(let t of zs())e.push($(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),$(t,"dist","_worker","qoder-worker-runtime.mjs"),$(t,"_worker","qoder-worker-runtime.obf.mjs"),$(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(it(t))return t;return e[0]??$(at,"..","_worker","qoder-worker-runtime.obf.mjs")}function fr(r){let e=re(r);if(it(e))return!0;let t=ot(e);return t!==null&&it(t)}function zs(){let r=[$(at,".."),$(at,"..","..")];return[...new Set(r)]}var gr=8192,Js=new Set(["--mcp-config","--settings"]),Q=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},ne=class r{static default=new r;options;constructor(e={}){this.options={...e}}create(e){return new ut(Ie(this.options,e))}},ut=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=re(this.options.pathToQoderWorkerRuntime),n;try{n=await je(t,{diagnostics:this.diagnostics})}catch(a){throw new Q(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let s=n.runtimePath;if(!Ws(s))throw new Q(`Qoder worker runtime not found: ${s}`);let o=this.options.cwd??process.cwd(),i=Ne(n,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${s}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Vs(e.args)}`),this.worker=new Gs(s,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===L&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
4
4
  `)?e:e+`
5
- `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=_n({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let n=r.trim();if(n)try{yield JSON.parse(n)}catch{}}this.closed||await this.waitForWorkerExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??Re;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>as&&(this.stderrTail=this.stderrTail.slice(-as))}createWorkerError(e){return new z(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===L))return new z(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,r)=>{let n=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,r(a)):t()},o=i=>{if(e.off("exit",n),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,r(a)};e.once("exit",n),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function nt(s){if(s)return s;let e=[];for(let t of Nn())e.push(Q(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),Q(t,"dist","_worker","qoder-worker-runtime.mjs"),Q(t,"_worker","qoder-worker-runtime.obf.mjs"),Q(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Ie(t))return t;return e[0]??Q(st,"..","_worker","qoder-worker-runtime.obf.mjs")}function On(s){let e=[];for(let t=0;t<s.length;t+=1){let r=s[t];e.push(r),In.has(r)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function jn(s){let e=nt(s);if(Ie(e))return!0;let t=tt(e);return t!==null&&Ie(t)}function Nn(){let s=[Q(st,".."),Q(st,"..","..")];return[...new Set(s)]}var De=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as Kn,mkdirSync as Un}from"fs";import{dirname as Fn}from"path";var qn="QODER_AGENT_SDK_DEBUG";function $n(s){return s.debugFile?!0:s.debug===!0||Qn(process.env[qn])}function Ln(s){if(s.debugFile)return s.debugFile}function Qn(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var Oe=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=$n(e),this.debugFile=Ln(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let r=this.formatLine(e,t),n=this.debugFile;if(n){this.writeToFile(n,r);return}this.writeToStderr(r)}get filePath(){return this.debugFile}writeToFile(e,t){try{Un(Fn(e),{recursive:!0}),Kn(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let r=new Date().toISOString(),n=this.formatError(t);return`${r} ${e}${n}
5
+ `;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=Hs({input:e,crlfDelay:1/0});try{for await(let n of t){if(this.closed)break;let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}this.closed||await this.waitForWorkerExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??_e;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>gr&&(this.stderrTail=this.stderrTail.slice(-gr))}createWorkerError(e){return new Q(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===L))return new Q(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,n)=>{let s=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,n(a)):t()},o=i=>{if(e.off("exit",s),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,n(a)};e.once("exit",s),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Vs(r){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t];e.push(n),Js.has(n)&&t+1<r.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}var Ke=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as Ys,mkdirSync as Xs}from"fs";import{dirname as Zs}from"path";var eo="QODER_AGENT_SDK_DEBUG";function to(r){return r.debugFile?!0:r.debug===!0||no(process.env[eo])}function ro(r){if(r.debugFile)return r.debugFile}function no(r){if(r===void 0)return!1;let e=r.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var Fe=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=to(e),this.debugFile=ro(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let n=this.formatLine(e,t),s=this.debugFile;if(s){this.writeToFile(s,n);return}this.writeToStderr(n)}get filePath(){return this.debugFile}writeToFile(e,t){try{Xs(Zs(e),{recursive:!0}),Ys(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let n=new Date().toISOString(),s=this.formatError(t);return`${n} ${e}${s}
6
6
  `}formatError(e){if(e===void 0)return"";if(e instanceof Error)return`
7
- ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var re=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var j=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ge=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},me=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},he=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var ot="1.2.0";function cs(s,e,t,r){return new Promise((n,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(c){o(c);return}n({jsonrpc:"2.0"});return}let a=`${s}:${e.id}`;r.set(a,{resolve:n,reject:o}),t.onmessage?t.onmessage(e):(r.delete(a),o(new Error(`No message handler registered for MCP server "${s}"`)))})}function us(s,e,t){if("id"in e&&e.id!==null){let r=`${s}:${e.id}`,n=t.get(r);if(n)return n.resolve(e),t.delete(r),!0}return!1}function ds(s,e,t){let r=0,n=`${s}:`,o=Array.from(t.entries());for(let i of o){let[a,c]=i;a.startsWith(n)&&(c.reject(e),t.delete(a),r++)}return r}import{randomUUID as zn}from"crypto";function fs(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var Hn=500,Bn=1024*1024,Wn=6e4,Jn=[200,800],je=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=Vn(e.filePath),r=Gn(e.entries),n=ps(t),o=this.states.get(n);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(n,o)),o.entries.push(...r),o.bytes+=Xn(r),(this.options.flushMode==="eager"||o.entries.length>=Hn||o.bytes>=Bn)&&this.drain(o)}async flush(){for(let e of this.states.values())this.drain(e);await Promise.all([...this.states.values()].map(e=>e.tail))}drain(e){if(e.entries.length===0)return;let t=e.entries;e.entries=[],e.bytes=0,e.tail=e.tail.then(async()=>{try{await Zn(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??Wn,retryDelaysMs:this.options.retryDelaysMs??Jn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${ps(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:zn(),session_id:e.key.sessionId})}})}};function Vn(s){let e=s.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),r=e.slice(t+1);if(t<0||r.length<2)throw new Error(`Invalid transcript mirror path: ${s}`);let n=r[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(r[1]);if(r.length===2&&o)return{projectKey:n,sessionId:ls(o[1])};let i=ls(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let u=a.join("/");return Yn(u),{projectKey:n,sessionId:i,subpath:u}}function Gn(s){return s.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function ls(s){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s))throw new Error(`Invalid transcript session id: ${s}`);return s}function Yn(s){let e=s.split("/");if(!s||s.includes("\0")||/^[a-z]:/i.test(s)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${s}`)}function ps(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function Xn(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Zn(s,e,t,r){for(let n=0;;n++)try{await eo(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof Ne)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function eo(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new Ne(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ne=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function gs(){return Math.random().toString(36).substring(2,15)}function ms(s,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:s,request:t}}function hs(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function ys(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function Ss(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function vs(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function ws(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function ne(s){if(typeof s!="object"||s===null)return;let e=s,t=e.subtype;if(typeof t=="string")return t;let r=e.type;return typeof r=="string"?r:void 0}function ks(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function bs(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function Ps(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function Rs(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function Ts(s){return typeof s=="object"&&s!==null&&s.type==="result"}var to="<synthetic>";function so(s){return s.type!=="assistant"||s.isApiErrorMessage===!0||s.message.model!==to?s:{...s,isApiErrorMessage:!0}}var Ue=class s{static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,u,p,f,d,l,g,v,m,h,k="batched",S,_){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=d??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=S??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=p,this.fetchJobToken=g,this.fetchServiceAccountToken=_,this.diagnostics=u,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=v,this.resolveModelTimeoutMs=m??500,this.inputStream=new re(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new je({store:h,flushMode:k,diagnostics:u,onMirrorError:A=>this.inputStream.enqueue(A)})),this.readLoopPromise=this.readMessages().catch(A=>{this.inputStream.error(A)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let A=this.abortController.signal;A.aborted?this.close().catch(()=>{}):A.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let r=e.replace(/\s+/g," ").trim();return r.length>200?`${r.slice(0,200)}...`:r}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let r=t.text;if(typeof r=="string")return this.normalizeLogPreview(r);let n=this.extractMessagePreview(t.content);if(n)return n;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let r=this.getRecord(e)?.type;return typeof r=="string"&&r?r:"unknown"}getMessageSubtype(e){let r=this.getRecord(e)?.subtype;return typeof r=="string"&&r?r:"none"}getMessageUuid(e){let r=this.getRecord(e)?.uuid;return typeof r=="string"&&r?r:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,n=this.getRecord(t)?.content,o=Array.isArray(n)?n.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(fs(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(Ss(t)){this.handleControlResponse(t);continue}if(vs(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(ws(t)){this.handleControlCancelRequest(t);continue}if(ks(t)||bs(t)||Ps(t)||Rs(t))continue;if(Ts(t)){await this.transcriptMirrorBatcher?.flush();let n=t;this.recordInboundSessionMessage(n),this.resultMessage=n,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(n),this.isSingleTurn&&this.transport.endInput();continue}let r=so(t);if(this.recordInboundSessionMessage(r),r.type==="system"&&r.subtype==="init")try{let n=r;this.validateProtocolHandshake(n),this.cliCapabilities=new Set(n.capabilities??[])}catch(n){throw this.inputStream.error(n),n}this.notifyAuthExpiredIfNeeded(r),this.inputStream.enqueue(r)}}catch(t){e=t}finally{await this.transcriptMirrorBatcher?.flush();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,r]of this.pendingRequests)r.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let r=e.type==="auth_status"&&!!e.error,n=e.type==="assistant"&&e.error==="authentication_failed";!r&&!n||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}async request(e,t){let r=gs(),n=ms(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=ne(n.request)??"unknown",a=Date.now();return new Promise((c,u)=>{let p=null,f=()=>{p&&(clearTimeout(p),p=null)};this.pendingRequests.set(r,{resolve:d=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(d)},reject:d=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,d),u(d)}}),o>0&&Number.isFinite(o)&&(p=setTimeout(()=>{if(this.pendingRequests.has(r)){this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${r} subtype=${i} timeout_ms=${o}`);try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:r})+`
8
- `)}catch(d){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",d)}u(new Error(`Control request "${ne(n.request)??"unknown"}" timed out after ${o}ms`))}},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${r} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(n)+`
9
- `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${r} subtype=${i}`)}catch(d){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,d),u(d)}})}handleControlResponse(e){let t=e.response,r=t.request_id,n=this.pendingRequests.get(r);if(!n){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${r} status=${t.subtype}`);return}if(this.pendingRequests.delete(r),t.subtype==="success")n.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),n.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)ne(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",r)})}async handleControlRequest(e){let t=e.request_id,r=ne(e.request)??"unknown",n=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${r}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=hs(t,i);this.transport.write(JSON.stringify(a)+`
10
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=success duration_ms=${Date.now()-n}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:c}=ao(i),u=ys(t,a,c);this.transport.write(JSON.stringify(u)+`
11
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=error duration_ms=${Date.now()-n}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new j}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=ot;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${r}. Consider upgrading qodercli for the version handshake.`);return}let n=Es(t),o=Es(r);if(!n||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${r}"; skipping handshake.`);return}if(n.major!==o.major)throw new me(t,r);n.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${r}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new j;return new Promise((r,n)=>{let o=()=>{n(new j)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),r(i)},i=>{t.removeEventListener("abort",o),n(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let r=e.request,n=ne(r),o=r;switch(n){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,c=e.request_id,u=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!u?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:u.token}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let c=o.tool_use_id,u=o.permission_suggestions??o.suggestions,p=o.blocked_path,f=o.decision_reason,d=o.title,l=o.display_name,g=o.description,v=o.agent_id,m=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:u,blockedPath:p,decisionReason:f,title:d,displayName:l,description:g,toolUseID:c,agentID:v}),t);if(m.behavior==="deny"&&!m.message)throw new Error("Permission deny result must include a message.");return m.behavior==="allow"?{...m,updatedInput:m.updatedInput??a,toolUseID:c}:{...m,toolUseID:c}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"mcp_message":{let i=o.server_name,a=o.message,c=this.sdkMcpTransports.get(i);if(!c)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(cs(i,a,c,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,c=Promise.resolve(this.resolveModel(i)),u,p=new Promise((v,m)=>{u=setTimeout(()=>{m(new ge(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([c,p]),t)}finally{clearTimeout(u)}let d={type:"get_model_policy",model:typeof f.model=="string"?f.model:f.model.model,parameters:f.parameters};if(typeof f.model!="string"){let{model:v,...m}=f.model;d.custom_model={...m,style:m.style??"openai"}}let l=f.taskId?.trim();l&&(d.task_id=l);let g=f.subTask?.trim();return g&&(d.sub_task=g),d}default:throw new Error(`Unhandled control request subtype: ${n??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,initializeTimeoutMs:s.INITIALIZE_TIMEOUT_MS},t={};for(let[n,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let c=a.hooks.map(u=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,u),p});c.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:c,timeout:a.timeout})}i.length>0&&(t[n]=i)}Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let r=await this.request(e,{timeoutMs:s.INITIALIZE_TIMEOUT_MS});if(r&&typeof r=="object"){let n=r;this.initResponse=n}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,r,n){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,r,{signal:n}),n)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let r of e){if(this.closed)break;t+=1,this.transport.write(JSON.stringify(r)+`
12
- `),this.recordOutboundSessionMessage(r)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&this.transport.endInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(r=>typeof r=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(s.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(s.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new he(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=io(e?.usage),r=oo(e?.session);return!t&&!r?null:{...t??{},...r?{session:r}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let r={type:"rewind_files",user_message_id:e};t?.dryRun&&(r.dry_run=!0);let o=await this.request(r);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let n={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(n.dry_run=!0),await this.request(n)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Nt(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let r=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),n=r?.requiresUserAction===!0,o=typeof r?.authUrl=="string"?r.authUrl:void 0;if(n&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return n?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,r]of this.sdkMcpTransports){try{await r.close()}catch(n){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,n)}ds(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function H(s){return typeof s=="object"&&s!==null}function it(s){return typeof s=="number"&&Number.isFinite(s)}function at(s){return Object.keys(s).length>0}function O(s,e,t){let r=e[t];it(r)&&(s[t]=r)}function oe(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function Ke(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function _s(s){if(!H(s)||Array.isArray(s))return;let e={};return O(e,s,"total"),O(e,s,"used"),O(e,s,"remaining"),O(e,s,"percentage"),oe(e,s,"unit"),at(e)?e:void 0}function ro(s){if(!H(s)||Array.isArray(s))return;let e=_s(s)??{};return oe(e,s,"detailUrl"),at(e)?e:void 0}function no(s){if(!H(s)||Array.isArray(s))return;let e={};return O(e,s,"used"),O(e,s,"cap"),O(e,s,"remaining"),O(e,s,"percentage"),Ke(e,s,"available"),oe(e,s,"unit"),at(e)?e:void 0}function oo(s){if(!H(s)||Array.isArray(s))return;let e=s.total_credits,t=s.model_usage;if(!it(e)||e<0||!H(t)||Array.isArray(t))return;let r={};for(let[n,o]of Object.entries(t)){if(!H(o)||Array.isArray(o))continue;let i=o.credits;it(i)&&i>=0&&(r[n]={credits:i})}return{total_credits:e,model_usage:r}}function io(s){if(!H(s)||Array.isArray(s))return null;let e={};oe(e,s,"userId"),oe(e,s,"userType"),O(e,s,"totalUsagePercentage"),Ke(e,s,"isHighestTier"),O(e,s,"expiresAt"),oe(e,s,"upgradeUrl"),Ke(e,s,"isQuotaExceeded"),Ke(e,s,"isPlanQuotaProrated");let t=_s(s.userQuota);t&&(e.userQuota=t);let r=ro(s.addOnQuota);r&&(e.addOnQuota=r);let n=no(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function ao(s){let e=s instanceof Error?s.message:String(s),t=typeof s=="object"&&s!==null?s.code:void 0,r=typeof t=="string"&&t.length>0?t:void 0,n=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(n){let o=r??n[1];return(!r||r===n[1])&&(e=n[2]||e),{error:e,code:o}}return r?{error:e,code:r}:{error:e}}function Es(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Fe=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Ms}from"crypto";var co="QODER_CLOUD_AGENT_API_BASE",uo="https://api.qoder.com/api/v1/cloud",K={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},lo=1024,Cs=1*1024*1024,As=4*1024*1024,po=8*1024,ut=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},qe=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},dt=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},fo=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Os(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!fo.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(s.auth?.type!=="accessToken")throw new qe;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&ie(t)&&ct(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&ie(r)&&ct(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&ie(r)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let n=!!r&&ie(r);if(!n&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!n){if(!r||!ct(r))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof r.create.environment_id!="string"||r.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function ie(s){return"id"in s&&s.id!==void 0}function ct(s){return"create"in s&&s.create!==void 0}function js(s){return new lt(s)}var lt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Mo();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Ds();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=go(e.options.auth,e.options.env),this.apiBase=mo(),this.inputStream=new re(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(r=>{this.sseConnected.reject(r),this.closed||this.inputStream.error(r)}),this.streamInput(Eo(e.prompt)).catch(r=>{this.closed||this.inputStream.error(r)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let r=To(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:K.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===K.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:K.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&ie(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...yo(n)}});t=xs(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(ie(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:ho(e.create)});return xs(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let r=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==r&&(t=0),t+=1,await _o(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),r=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;r&&t.searchParams.set("after_id",r),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let n=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!n.ok)throw this.handleAuthFailure(n.status),await Is(n);if(!n.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(n.body)}async readSseBody(e){let t=e.getReader(),r=new TextDecoder,n="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){n+=r.decode(),n.length>0&&this.consumeSseLine(n,o);break}n+=r.decode(a,{stream:!0});let c;for(;(c=n.indexOf(`
13
- `))!==-1;){let u=n.slice(0,c);n=n.slice(c+1);let p=u.endsWith("\r")?u.slice(0,-1):u;if(this.consumeSseLine(p,o),this.closed)break}n.length>Cs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Cs} bytes; resetting buffer.`),n="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:wo(t.data.join(`
14
- `))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let r=e.indexOf(":"),n=r===-1?e:e.slice(0,r),o=r===-1?"":e.slice(r+1);switch(o.startsWith(" ")&&(o=o.slice(1)),n){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>As){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${As} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(o),t.dataBytes+=o.length;break}}handleSseEvent(e){if(this.closed)return;let t=M(e.data,"type")??e.event,r=M(e.data,"turn_id"),n={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Ms(),session_id:this.sessionId??M(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(n),!this.isCurrentTurnEvent(r)){this.bufferPendingTurnEvent(e,t,r);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case K.agentMessage:{let r=bo(ye(e.data,"content"));r&&this.assistantTextParts.push(r);return}case K.modelRequestEnd:this.captureUsage(e.data);return;case K.idle:this.idleSeen=!0,this.finishIfIdle();return;case K.error:this.emitErrorResult(e),this.finish();return;case K.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Ds(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let r of t)if(this.isCurrentTurnEvent(r.turnId)&&this.handleCurrentTurnEvent(r.event,r.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,r){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=lo&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:r}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(M(e.data,"error")??M($e(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:Ms(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,r=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return So(r)}captureUsage(e){let t=$e(e,"usage");if(!t)return;this.latestUsage=Po(this.latestUsage,t);let r=R(e,"total_cost_usd")??R(e,"cost_usd")??R(t,"total_cost_usd")??R(t,"cost_usd");r!==void 0&&(this.totalCostUsd+=r);let n=M(e,"model")??M(t,"model");if(n){let o=this.latestModelUsage[n]?.costUSD??0;this.latestModelUsage[n]=Ro(this.latestUsage,o+(r??0))}}async requestJson(e,t){let r=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await Is(r);if(r.status===204)return{};try{return await r.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function go(s,e){if(s?.type!=="accessToken")throw new qe;if(typeof s.accessToken=="string")return s.accessToken;let t=s.accessToken.envVar,r=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!r)throw new ut(t);return r}function mo(){return process.env[co]?.replace(/\/+$/,"")??uo}function ho(s){return pt({name:s.name,model:s.model,system:s.system,description:s.description,tools:s.tools,mcp_servers:s.mcp_servers,skills:s.skills,metadata:s.metadata})}function yo(s){return pt({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>pt({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function pt(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function xs(s,e){let t=M(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function So(s){let e=ko(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:M(t,"id"),turnId:M(t,"turn_id"),type:M(t,"type")}]):[]}async function Is(s){let e=await vo(s,po);return new dt(s.status,e||s.statusText||"unknown error")}async function vo(s,e){if(!s.body)try{return(await s.text()).slice(0,e)}catch{return""}let t=s.body.getReader(),r=new TextDecoder,n=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,n.push(r.decode(a,{stream:!0}))}n.push(r.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return n.join("").slice(0,e)}function wo(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function $e(s,e){let t=ye(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ko(s,e){let t=ye(s,e);return Array.isArray(t)?t:void 0}function M(s,e){let t=ye(s,e);return typeof t=="string"?t:void 0}function R(s,e){let t=ye(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ye(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function bo(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>Ns(t)?t.text:"").filter(Boolean).join("")||void 0}function Po(s,e){let t=$e(e,"cache_creation"),r=$e(e,"server_tool_use");return{...s,cache_creation:{ephemeral_1h_input_tokens:R(t,"ephemeral_1h_input_tokens")??s.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:R(t,"ephemeral_5m_input_tokens")??s.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:R(e,"cache_creation_input_tokens")??s.cache_creation_input_tokens,cache_read_input_tokens:R(e,"cache_read_input_tokens")??s.cache_read_input_tokens,input_tokens:R(e,"input_tokens")??s.input_tokens,output_tokens:R(e,"output_tokens")??s.output_tokens,server_tool_use:{web_fetch_requests:R(r,"web_fetch_requests")??s.server_tool_use.web_fetch_requests,web_search_requests:R(r,"web_search_requests")??s.server_tool_use.web_search_requests}}}function Ro(s,e){return{inputTokens:s.input_tokens,outputTokens:s.output_tokens,cacheReadInputTokens:s.cache_read_input_tokens,cacheCreationInputTokens:s.cache_creation_input_tokens,webSearchRequests:s.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function To(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ns(t)?t.text:JSON.stringify(t)).join(`
15
- `):JSON.stringify(e)}function Ns(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function Eo(s){return typeof s!="string"?s:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:s}]},parent_tool_use_id:null}}()}function Ds(){return{cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},cache_creation_input_tokens:0,cache_read_input_tokens:0,inference_geo:"",input_tokens:0,iterations:[],output_tokens:0,server_tool_use:{web_fetch_requests:0,web_search_requests:0},service_tier:"standard",speed:"standard"}}async function _o(s,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function Mo(){let s,e;return{promise:new Promise((r,n)=>{s=r,e=n}),resolve:s,reject:e}}import{access as No,chmod as Ls,cp as Ko,mkdtemp as Uo,mkdir as Qs,realpath as Fo,rm as Fs,writeFile as qo}from"fs/promises";import{homedir as $o,tmpdir as Lo}from"os";import{dirname as Qo,isAbsolute as zs,join as B,relative as zo,resolve as ft,sep as Ho}from"path";import{homedir as Co}from"os";import{join as Us}from"path";var Ao=y.configDirName,xo=y.cliHomeEnv,Io=y.configDirEnv,Ks=200;function Do(){return process.env[xo]||Co()}function Oo(){let s=process.env[Io];return s||Us(Do(),Ao)}function ae(){return Us(Oo(),"projects")}function jo(s){let e=5381;for(let t=0;t<s.length;t++)e=e*33^s.charCodeAt(t);return e}function T(s){let e=s.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ks)return e;let t=Math.abs(jo(s)).toString(36);return`${e.slice(0,Ks)}-${t}`}var Bo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Wo=6e4;async function Hs(s){if(s.resume===void 0&&!s.continue)return;let e=T(await Go(s.cwd)),t=s.loadTimeoutMs??Wo,r=s.resume!==void 0?s.resume:await Yo(s.store,e,t);if(r===void 0||!Bo.test(r))return;let n={projectKey:e,sessionId:r},o=await qs(s.store,n,t);if(!o)return;let i=s.store.listSubkeys?await gt(s.store.listSubkeys(n),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let u of i){if(!Zo(u)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(u)}`);continue}let p=await qs(s.store,{...n,subpath:u},t);p&&a.push({subpath:u,entries:p})}let c;try{c=await Uo(B(Lo(),"qoder-session-store-")),await Ls(c,448),await Vo(Jo(s.env),c);let u=B(c,"projects",e),p=B(u,r);await Qs(u,{recursive:!0,mode:448}),await $s(B(u,`${r}.jsonl`),o);for(let{subpath:d,entries:l}of a){let g=ei(p,`${d}.jsonl`),v=l.filter(h=>h.type==="agent_metadata"),m=l.filter(h=>h.type!=="agent_metadata");if(m.length>0&&await $s(g,m),v.length>0){let h={...v.at(-1)};delete h.type,await Bs(g.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=c;return{configDir:f,projectKey:e,sessionId:r,cleanup:async()=>{await Fs(f,{recursive:!0,force:!0})}}}catch(u){throw c!==void 0&&await Fs(c,{recursive:!0,force:!0}),u}}function Jo(s){let e=s?.[y.cliHomeEnv]??process.env[y.cliHomeEnv]??$o();return ft(s?.[y.configDirEnv]??process.env[y.configDirEnv]??B(e,y.configDirName))}async function Vo(s,e){for(let t of[".auth","oauth_creds.json"]){let r=B(s,t);try{await No(r),await Ko(r,B(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(n){if(n.code!=="ENOENT")throw n}}}async function Go(s){let e=ft(s??process.cwd());try{return await Fo(e)}catch{return e}}async function Yo(s,e,t){if(!s.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await gt(s.listSessions(e),t,"listSessions");if(!Array.isArray(r))throw new Error("SessionStore listSessions() must return an array");return r.slice().sort((n,o)=>o.mtime-n.mtime)[0]?.sessionId}async function qs(s,e,t){let r=await gt(s.load({...e}),t,"load");if(!(r===null||r.length===0)){if(!Array.isArray(r))throw new Error("SessionStore load() must return an array or null");return r.map((n,o)=>Xo(n,o))}}function Xo(s,e){if(s===null||typeof s!="object"||typeof s.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(s);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function Zo(s){return!(typeof s!="string"||!s||s.includes("\0")||s.includes("\\")||zs(s)||/^[a-z]:/i.test(s)||s.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function ei(s,e){let t=ft(s,e),r=zo(s,t);if(r===""||r===".."||r.startsWith(`..${Ho}`)||zs(r))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function $s(s,e){let t=e.map(r=>JSON.stringify(r)).join(`
16
- `);await Bs(s,t?`${t}
17
- `:"")}async function Bs(s,e){await Qs(Qo(s),{recursive:!0,mode:448}),await qo(s,e,{encoding:"utf8",mode:384}),await Ls(s,384)}async function gt(s,e,t){let r;s.catch(()=>{});try{return await Promise.race([s,new Promise((n,o)=>{r=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{r!==void 0&&clearTimeout(r)}}var ti=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function si(s){let e=s.replace(/\\/g,"/").split("/").at(-1)??"";return ti.test(e)}function Ws(s,e,t=process.env){let r=s.pathToQoderCLIExecutable;return r?si(r)?{transport:"worker",pathToQoderWorkerRuntime:r}:{transport:"process"}:s.executable!==void 0||s.executableArgs!==void 0||s.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}var mt=class extends Error{code="auth_not_configured";constructor(){super("The auth option is required when calling query(); configure options.auth so the SDK can create an auth payload file before spawning qodercli."),this.name="AuthNotConfiguredError"}};function ri(s){if(s.transport!==void 0){if(Yt(s.transport))return s.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let e=Ws(s,Xe);return e.transport==="worker"?new se({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):ee.default}function ht(s){let{prompt:e,options:t={}}=s,r=ri(t),n=new Oe({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");let o=t.auth;if(o==null)throw new mt;if(t.sessionStore&&t.enableFileCheckpointing)throw new Error("sessionStore cannot be combined with enableFileCheckpointing because checkpoint blobs are not part of the SessionStore contract.");if(t.sessionStore&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${y.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(t.sessionStore&&!(r instanceof ee)&&!(r instanceof se))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(t.sessionStore&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(t.sessionStore&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(t.sessionStore&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Os(t),js({prompt:e,options:t,diagnostics:n});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,u=a?()=>{c||(c=!0,Promise.resolve(a()).catch(w=>{n.record("[query] onAuthExpired callback threw:",w)}))}:void 0,p=new Map,f=new Map,d=new Map,l={},g={},v={};if(t.mcpServers)for(let[w,x]of Object.entries(t.mcpServers)){let $=x.tools;if(Array.isArray($)&&$.length>0&&(g[w]=$),x.type==="sdk"&&"instance"in x&&x.instance){let G=x.instance;if(p.set(w,G),$){let Pe=Ge(w,$);Pe&&(v[w]=Pe)}let At=new Fe(Pe=>{us(w,Pe,d)});f.set(w,At),G.connect(At).catch(()=>{})}else l[w]=x}let m=Object.keys(l).length>0,h=Object.keys(g).length>0,k=t.pathToQoderCLIExecutable,S=t.env,_=o?.type==="jobToken"?o.fetchJobToken:void 0,A=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,q={pathToQoderCLIExecutable:k,executable:t.executable,executableArgs:t.executableArgs,env:S,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:o,model:i?void 0:t.model,agent:t.agent,debug:t.debug,diagnostics:n,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:t.sessionStore!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let w=t.allowedTools??[];if(t.skills===void 0)return w.length>0?w:void 0;let x=t.skills==="all"?["Skill"]:t.skills.map(G=>`Skill(${G})`),$=new Set(w);return[...w,...x.filter(G=>!$.has(G))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:m?l:void 0,mcpToolPolicies:h?g:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:u},N=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new De(async()=>{let w=await Hs({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!w)return{transport:Ae(r,{...q,continue:!1})};try{return{transport:Ae(r,{...q,env:{...q.env??process.env,[y.configDirEnv]:w.configDir},continue:!1,resume:w.sessionId}),cleanup:w.cleanup}}catch(x){throw await w.cleanup(),x}}):Ae(r,q);N.initialize().catch(()=>{});let be=typeof e=="string",V=t.systemPrompt,Mt,Ct;if(typeof V=="string")Mt=V;else if(typeof V=="object"&&V!==null&&V.type==="preset"){let w=V;if(w.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(w.preset)}`);Ct=w.append}let Rr={systemPrompt:Mt,appendSystemPrompt:Ct,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},Je=new Ue(N,be,t.canUseTool,t.hooks,t.abortController,p,Rr,t.onElicitation,n,u,t.controlRequestTimeoutMs,f,d,_,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",v,A);if(typeof e=="string"){let w={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Je.streamInput(async function*(){yield w}())}else Je.streamInput(e);return Je}var yt=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},St=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function ni(s={}){let e=s.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(s.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new yt,r=ht({prompt:t,options:s.options}),n;try{return await Promise.race([r.initializationResult(),new Promise((o,i)=>{n=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new St(r,t)}catch(o){throw t.discard(),await r.close(),o}finally{n!==void 0&&clearTimeout(n)}}import{readFile as oi}from"node:fs/promises";import ii from"node:os";import C from"node:path";var ai=["user","project","local"],kt=new Set(["__proto__","constructor","prototype"]),ci=/^[\p{L}\p{N}\p{M}._ -]+$/u,ui=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,di=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),li=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),pi=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function W(s){if(s===null||typeof s!="object"||Array.isArray(s))return!1;let e=Object.getPrototypeOf(s);return e===Object.prototype||e===null}function fi(s){let e=s.charCodeAt(0)===65279?s.slice(1):s,t="",r=!1,n=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let c=e[a],u=e[a+1];if(o){c===`
18
- `||c==="\r"?(o=!1,t+=c):t+=" ";continue}if(i){c==="*"&&u==="/"?(i=!1,t+=" ",a+=1):t+=c===`
19
- `||c==="\r"?c:" ";continue}if(r){t+=c,n?n=!1:c==="\\"?n=!0:c==='"'&&(r=!1);continue}c==='"'?(r=!0,t+=c):c==="/"&&u==="/"?(o=!0,t+=" ",a+=1):c==="/"&&u==="*"?(i=!0,t+=" ",a+=1):t+=c}return t}function gi(s,e){let t;try{t=JSON.parse(fi(s))}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`Unable to parse settings from ${e}: ${n}`)}if(!W(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Le(t)}function ce(s){return Array.isArray(s)?s.map(ce):W(s)?Le(s):s}function Le(s){let e={};for(let[t,r]of Object.entries(s))kt.has(t)||r===void 0||(e[t]=ce(r));return e}function mi(s){let e=s.join(".");if(li.has(e)||s.length===2&&s[0]==="providers")return"shallow";if(pi.has(e))return"union";if(s.length===2&&s[0]==="hooks")return"concat"}function wt(s,e,t=[]){for(let[r,n]of Object.entries(e)){if(kt.has(r)||n===void 0)continue;let o=[...t,r],i=s[r],a=mi(o);if(a==="shallow"&&i&&n){let c={};W(i)&&Object.assign(c,Le(i)),W(n)&&Object.assign(c,Le(n)),s[r]=c;continue}if(Array.isArray(i)){let c=Array.isArray(n)?n:[n];if(a==="concat"){s[r]=[...i.map(ce),...c.map(ce)];continue}if(a==="union"){s[r]=[...new Set([...i,...c])].map(ce);continue}}if(W(i)&&W(n))wt(i,n,o);else if(W(n)){let c={};wt(c,n,o),s[r]=c}else s[r]=ce(n)}}function hi(s){let e=s?.[y.configDirNameEnv];if(e===void 0||e==="")return{user:y.configDirName,project:y.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!ci.test(t)||ui.test(t))throw new Error(`${y.configDirNameEnv} must be a valid directory name`);if(di.has(t.toLowerCase()))throw new Error(`${y.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function vt(s,e){let t;try{t=await oi(e,"utf8")}catch(r){if(r.code==="ENOENT")return;throw r}return{source:s,path:C.resolve(e),settings:gi(t,C.resolve(e))}}async function yi(s={}){let e=C.resolve(s.cwd??process.cwd()),t=process.env,r=hi(t),n=t[y.cliHomeEnv]??t.GEMINI_CLI_HOME,o=n?C.resolve(e,n):ii.homedir(),i=t[y.configDirEnv]?C.resolve(e,t[y.configDirEnv]):C.join(o,r.user),a=C.join(e,r.project),c=new Set(s.settingSources??ai),u=C.resolve(o)===e,p=[];if(c.has("user")){let l=await vt("user",C.join(i,"settings.json"));l&&p.push(l)}if(c.has("project")&&!u){let l=await vt("project",C.join(a,"settings.json"));l&&p.push(l)}if(c.has("local")&&!u){let l=await vt("local",C.join(a,"settings.local.json"));l&&p.push(l)}let f={},d={};for(let l of p){wt(f,l.settings);for(let g of Object.keys(l.settings))kt.has(g)||(d[g]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:f,provenance:d,sources:p}}import{McpServer as Si}from"@modelcontextprotocol/sdk/server/mcp.js";function vi(s){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Si({name:s.name,version:s.version??"1.0.0"},{capabilities:{tools:s.tools&&s.tools.length>0?{}:void 0}}),t=[];if(s.tools&&s.tools.length>0)for(let r of s.tools){if(!r.name||typeof r.name!="string"||r.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${s.name}".`);if(!r.description||typeof r.description!="string")throw new Error(`[createSdkMcpServer] Tool "${r.name}" must have a non-empty description string.`);Ve(s.name,{name:r.name,exposedName:r.exposedName,alwaysLoad:r.alwaysLoad}),(r.exposedName!==void 0||r.alwaysLoad!==void 0||r.permissionPolicy!==void 0)&&t.push({name:r.name,...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r.permissionPolicy!==void 0?{permission_policy:r.permissionPolicy}:{}});try{e.registerTool(r.name,{description:r.description,inputSchema:r.inputSchema,...r.annotations?{annotations:r.annotations}:{}},r.handler)}catch(n){throw n instanceof Error&&n.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${r.name}" in server "${s.name}". Each tool name must be unique within a server.`):n}}return{type:"sdk",name:s.name,instance:e,...t.length>0?{tools:t}:{}}}function wi(s,e,t,r,n){return{name:s,description:e,inputSchema:t,handler:r,annotations:n?.annotations,...n?.exposedName!==void 0?{exposedName:n.exposedName}:{},...n?.alwaysLoad!==void 0?{alwaysLoad:n.alwaysLoad}:{},...n?.permissionPolicy!==void 0?{permissionPolicy:n.permissionPolicy}:{}}}import{readdir as bt,readFile as ze,stat as ue,appendFile as rr,realpath as ki,rm as Js}from"fs/promises";import{basename as bi,join as P,resolve as Vs}from"path";import{execFile as Pi}from"child_process";import{randomUUID as nr}from"crypto";import{promisify as Ri}from"util";var Ti=Ri(Pi),Ei=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,_i=new Set(["user","assistant","system","progress","attachment"]);function E(s){return s!==null&&typeof s=="object"}function J(s){return Ei.test(s)}function Gs(s){let e=[];for(let t of s.split(`
20
- `)){let r=t.trim();if(r)try{let n=JSON.parse(r);E(n)&&typeof n.uuid=="string"&&typeof n.type=="string"&&_i.has(n.type)&&e.push(n)}catch{}}return e}function Ys(s,e){let t;for(let r of s.split(`
21
- `)){let n=r.trim();if(n)try{let o=JSON.parse(n);if(!E(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function Qe(s){if(!E(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}var Mi=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Ci(s){return typeof s=="string"&&Mi.has(s)?s:void 0}function Pt(s){if(s.type!=="user")return;let e=Qe(s).filter(o=>E(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(s.toolDenialKind)?s.toolDenialKind:e.length===1?[s.toolDenialKind]:[],r=Array.isArray(s.userFeedback)?s.userFeedback:e.length===1?[s.userFeedback]:[],n=e.flatMap((o,i)=>{let a=Ci(t[i]);if(!a)return[];let c=r[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof c=="string"?{user_feedback:c}:{}}]});return n.length>0?n:void 0}function Se(s){if(s.type!=="assistant"||!E(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function or(s){return s.type!=="user"||!s.parentUuid?!1:Qe(s).some(e=>E(e)&&e.type==="tool_result")}function Ai(s){if(!E(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function xi(s,e){let t=new Map;for(let[r,n]of s){let o=Ai(n);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,n]of s){let o=Ii(n,n.parentUuid,s,t,e);o!==n.parentUuid&&s.set(r,{...n,parentUuid:o})}}function Ii(s,e,t,r,n){if(!e||t.has(e))return e;let o=r.get(e);return!o||o.length===0?e:o.length===1?o[0]:Di(s,o,t)??Oi(s,o,t,n)??e}function Di(s,e,t){if(!or(s))return;let r=Qe(s).filter(o=>E(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(r.length===0)return;let n=e.filter(o=>{let i=t.get(o);return i?Qe(i).some(a=>E(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return n.length===1?n[0]:void 0}function Oi(s,e,t,r){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(r.get(o.uuid)??-1)<(r.get(s.uuid)??-1)).at(-1)?.uuid}function ji(s){for(let e of s.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,r=t?.headUuid,n=t?.anchorUuid,o=t?.tailUuid;if(!r||!n||!o)continue;let i=s.get(r);i&&s.set(r,{...i,parentUuid:n});for(let[a,c]of s)a!==r&&c.parentUuid===n&&s.set(a,{...c,parentUuid:o})}}function Xs(s,e,t){let r=(s.timestamp??"").localeCompare(e.timestamp??"");return r!==0?r:(t.get(s.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function Ni(s,e,t){let r=e.filter(d=>d.type==="assistant");if(r.length===0)return e;let n=new Map,o=0;for(let d of s.keys())n.set(d,o++);let i=new Map;for(let d of r){let l=Se(d);l&&i.set(l,d)}let a=new Map,c=new Map;for(let d of s.values()){let l=Se(d);if(l){let g=a.get(l)??[];g.push(d),a.set(l,g);continue}if(or(d)&&d.parentUuid){let g=c.get(d.parentUuid)??[];g.push(d),c.set(d.parentUuid,g)}}let u=new Set,p=new Map;for(let d of r){let l=Se(d);if(!l||u.has(l))continue;u.add(l);let g=a.get(l)??[d],v=g.filter(b=>!t.has(b.uuid)),m=[];for(let b of g){let N=c.get(b.uuid)??[];for(let be of N)t.has(be.uuid)||m.push(be)}if(v.length===0&&m.length===0)continue;let h=i.get(l);if(!h)continue;let k=[...g].sort((b,N)=>Xs(b,N,n));m.sort((b,N)=>Xs(b,N,n));let S=k.findIndex(b=>b.uuid===h.uuid),_=k.slice(0,Math.max(S,0)).filter(b=>!t.has(b.uuid)),A=k.slice(S+1).filter(b=>!t.has(b.uuid)),q=[..._,...A,...m];for(let b of q)t.add(b.uuid);p.set(h.uuid,q)}if(p.size===0)return e;let f=[];for(let d of e){let l=p.get(d.uuid);if(l){let g=n.get(d.uuid)??Number.MAX_SAFE_INTEGER,v=[],m=[];for(let h of l)(d.type==="assistant"&&h.type==="assistant"&&Se(h)===Se(d)&&(n.get(h.uuid)??Number.MAX_SAFE_INTEGER)<g?v:m).push(h);f.push(...v,d,...m)}else f.push(d)}return f}function Zs(s,e){if(s.length===0)return[];let t=new Map,r=new Map;for(let[c,u]of s.entries())t.set(u.uuid,u),r.set(u.uuid,c);ji(t),xi(t,r);let n;if(e?.leafUuid===null)return[];if(e){let c=t.get(e.leafUuid),u=c?.sessionId??c?.session_id;c&&(u===void 0||u===e.sessionId)&&(n=c)}if(!n){let c=new Set;for(let l of t.values())l.parentUuid&&c.add(l.parentUuid);let u=Array.from(t.values()).filter(l=>!c.has(l.uuid)),p=[];for(let l of u){let g=l,v=new Set;for(;g&&!v.has(g.uuid);){if(v.add(g.uuid),g.type==="user"||g.type==="assistant"){p.push(g);break}g=g.parentUuid?t.get(g.parentUuid):void 0}}if(p.length===0)return[];let f=p.filter(l=>!l.isSidechain&&!l.teamName&&!l.isMeta);n=(f.length>0?f:p).reduce((l,g)=>(r.get(g.uuid)??-1)>(r.get(l.uuid)??-1)?g:l)}let o=[],i=new Set,a=n;for(;a&&!i.has(a.uuid);)i.add(a.uuid),o.push(a),a=a.parentUuid?t.get(a.parentUuid):void 0;return o.reverse(),Ni(t,o,i)}function er(s,e){let t=s.type==="user"||s.type==="assistant",r=e&&s.type==="system";return!(!t&&!r||s.isMeta||s.isSidechain||s.teamName)}function Ki(s){if(!s)return;let e=s.preservedSegment,t={trigger:s.trigger,pre_tokens:s.preTokens??s.pre_tokens,post_tokens:s.postTokens??s.post_tokens,messages_summarized:s.messagesSummarized??s.messages_summarized,duration_ms:s.durationMs??s.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function Rt(s){return s.type==="assistant"&&s.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function tr(s){let e=s.type==="system"?Ki(s.compactMetadata):void 0,t=Pt(s);return{type:s.type,uuid:s.uuid,session_id:s.sessionId??s.session_id??"",message:s.message,parent_tool_use_id:null,parent_agent_id:null,...Rt(s),...t?{tool_result_meta:t}:{},...typeof s.timestamp=="string"&&s.timestamp.length>0?{timestamp:s.timestamp}:{},...s.type==="system"&&s.subtype?{subtype:s.subtype}:{},...e?{compact_metadata:e}:{}}}function sr(s,e){let t=Math.max(0,e?.offset??0),r=e?.limit;return r!==void 0&&r>0?s.slice(t,t+r):t>0?s.slice(t):s}async function He(s){try{return await ki(Vs(s))}catch{return Vs(s)}}async function Ui(s){return T(await He(s))}async function U(s){let e=ae();if(s?.dir){let t=await He(s.dir),r=[P(e,T(t))];if(s.includeWorktrees!==!1)try{let{stdout:n}=await Ti("git",["worktree","list","--porcelain"],{cwd:s.dir}),o=n.split(`
22
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)r.push(P(e,await Ui(i)))}catch{}return r}try{return(await bt(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>P(e,r.name))}catch{return[]}}async function ir(s){try{let[e,t]=await Promise.all([ze(s,"utf-8"),ue(s)]),r=e.trim().split(`
23
- `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return E(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let n=bi(s,".jsonl");return Tt(n,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function ar(s,e){return P(s,e,"subagents")}function cr(s){if(typeof s!="object"||s===null)return!1;let e=s;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function ur(s){let e=[];async function t(r){let n;try{n=await bt(r,{withFileTypes:!0})}catch{return}for(let o of n){let i=P(r,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(s),e}async function Fi(s){try{let e=await ze(s.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function dr(s){if(s.length===0)return[];let e=new Map(s.map(i=>[i.uuid,i])),t=s[s.length-1],r=[],n=new Set,o=t;for(;o&&!n.has(o.uuid);)n.add(o.uuid),r.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return r.reverse()}async function qi(s,e,t){let[r,n]=await Promise.all([ze(s,"utf-8"),Fi(s)]),o=[];for(let p of r.trim().split(`
24
- `).filter(Boolean))try{let f=JSON.parse(p);cr(f)&&o.push(f)}catch{}let a=dr(o).map(p=>{let f=Pt(p);return{type:p.type,uuid:p.uuid,session_id:p.sessionId??e,message:p.message,parent_tool_use_id:n.parentToolUseId,parent_agent_id:n.parentAgentId,...Rt(p),...f?{tool_result_meta:f}:{}}}),c=t?.offset??0,u=t?.limit;return u!==void 0?a.slice(c,c+u):a.slice(c)}async function de(s){return T(await He(s??process.cwd()))}function ve(s,e){return{projectKey:s,sessionId:e}}function $i(s){return s.map(e=>JSON.stringify(e)).join(`
25
- `)}function Li(s){let e=0;for(let t of s){if(typeof t.timestamp!="string")continue;let r=Date.parse(t.timestamp);Number.isFinite(r)&&(e=Math.max(e,r))}return e}function Qi(s){let e=s.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var zi=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function Hi(s){let e=s;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(zi,"");if(r===e)return r;e=r}return e}var Bi=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,Wi=/<command-name>(.*?)<\/command-name>/,Ji=/<bash-input>([\s\S]*?)<\/bash-input>/;function Vi(s){if(s.length<=200)return s;let e=s.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function Gi(s,e){if(s.type!=="user"||s.isMeta===!0||s.isCompactSummary===!0)return;let t=s.message;if(!E(t))return;let r=t.content,n=[];if(typeof r=="string")n.push(r);else if(Array.isArray(r)){for(let o of r)if(E(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&n.push(o.text)}}for(let o of n){let i=o.replaceAll(`
26
- `," ").trim();if(!i)continue;let a=Wi.exec(i);if(a){e.commandFallback??=a[1];continue}let c=Ji.exec(i);if(c)return`! ${c[1].trim()}`;if(!Bi.test(i))return Vi(i)}}function Tt(s,e,t,r={}){if(e.length===0)return;let n,o,i,a,c,u,p,f,d,l,g;for(let k of e){let S=k;if(g??=S.isSidechain===!0,l===void 0&&typeof S.timestamp=="string"){let _=Date.parse(S.timestamp);Number.isFinite(_)&&(l=_)}if(!n){let _={commandFallback:o};n=Gi(S,_),o=_.commandFallback}S.type==="custom-title"&&typeof S.customTitle=="string"&&(i=S.customTitle),S.type==="ai-title"&&typeof S.aiTitle=="string"&&(a=S.aiTitle),typeof S.lastPrompt=="string"&&(c=S.lastPrompt),typeof S.summary=="string"&&(u=S.summary),S.type==="tag"&&(d=typeof S.tag=="string"&&S.tag?S.tag:void 0),typeof S.gitBranch=="string"&&(p=S.gitBranch),f===void 0&&typeof S.cwd=="string"&&(f=S.cwd),S.type==="relocated"&&typeof S.relocatedCwd=="string"&&(f=S.relocatedCwd)}if(g)return;let v=n??o,m=i||a,h=m||c||u||v;if(h)return{sessionId:s,summary:h,lastModified:t??Li(e),fileSize:r.fileSize,customTitle:m,firstPrompt:v,gitBranch:p,cwd:f||r.defaultCwd,tag:d,createdAt:l}}async function lr(s,e,t){let r=ve(await de(t),e),n=await s.load(r);return n?{key:r,entries:n}:void 0}async function Yi(s){if(s?.sessionStore){let u=s.sessionStore;if(!u.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let p=await He(s.dir??process.cwd()),f=T(p),d=(await u.listSessions(f)).slice().sort((m,h)=>h.mtime-m.mtime),l=Math.max(0,s.offset??0),g=s.limit!==void 0&&s.limit>0?d.slice(l,l+s.limit):l>0?d.slice(l):d;return(await Promise.allSettled(g.map(async({sessionId:m,mtime:h})=>{let k=await u.load(ve(f,m));return k?Tt(m,k,h,{defaultCwd:p}):void 0}))).flatMap((m,h)=>{if(m.status==="fulfilled")return m.value?[m.value]:[];let k=g[h];return[{sessionId:k.sessionId,summary:"",lastModified:k.mtime}]})}let e=await U(s),r=(await Promise.all(e.map(async u=>{try{return(await bt(u)).filter(f=>f.endsWith(".jsonl")).map(f=>P(u,f))}catch{return[]}}))).flat(),n=await Promise.all(r.map(ir)),o=new Map;for(let u of n){if(!u)continue;let p=o.get(u.sessionId);(!p||u.lastModified>p.lastModified)&&o.set(u.sessionId,u)}let i=Array.from(o.values()).sort((u,p)=>p.lastModified-u.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function Xi(s,e){if(e?.sessionStore){if(!J(s))return;let r=await lr(e.sessionStore,s,e.dir);return r?Tt(s,r.entries,Qi(r.entries)):void 0}let t=await U(e);for(let r of t){let n=P(r,`${s}.jsonl`),o=await ir(n);if(o)return o}}async function Zi(s,e){if(!J(s))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let n=await lr(e.sessionStore,s,e.dir);if(!n)return[];let o=$i(n.entries),i=Zs(Gs(o),Ys(o,s));return sr(i.filter(a=>er(a,t)).map(tr),e)}let r=await U(e);for(let n of r){let o=P(n,`${s}.jsonl`);try{let i=await ze(o,"utf-8"),c=Zs(Gs(i),Ys(i,s)).filter(u=>er(u,t)).map(tr);return sr(c,e)}catch{continue}}return[]}async function ea(s,e,t){if(!J(s))throw new Error(`Invalid sessionId: ${s}`);let r=e.trim();if(!r)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(ve(await de(t.dir),s),[{type:"custom-title",sessionId:s,customTitle:r,uuid:nr(),timestamp:new Date().toISOString()}]);return}let n=await U(t);for(let o of n){let i=P(o,`${s}.jsonl`);try{await ue(i);let a=JSON.stringify({type:"custom-title",sessionId:s,customTitle:r,timestamp:new Date().toISOString()});await rr(i,a+`
27
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function ta(s,e,t){if(!J(s))throw new Error(`Invalid sessionId: ${s}`);let r=e===null?null:Hi(e).trim();if(r!==null&&!r)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(ve(await de(t.dir),s),[{type:"tag",sessionId:s,tag:r??"",uuid:nr(),timestamp:new Date().toISOString()}]);return}let n=await U(t);for(let o of n){let i=P(o,`${s}.jsonl`);try{await ue(i);let a=JSON.stringify({type:"tag",sessionId:s,tag:r??"",timestamp:new Date().toISOString()});await rr(i,a+`
28
- `);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function sa(s,e){if(e?.sessionStore){if(!J(s))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await de(e.dir),sessionId:s});return Array.from(new Set(r.map(n=>{if(!n.startsWith("subagents/"))return;let o=n.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(n=>n!==void 0)))}let t=await U(e);for(let r of t){let n=P(r,`${s}.jsonl`);try{await ue(n);let o=await ur(ar(r,s));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function ra(s,e,t){if(t?.sessionStore){if(!J(s)||!e)return[];let n=await de(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:n,sessionId:s}),g=`agent-${e}`,v=l.find(m=>m.startsWith("subagents/")&&m.split("/").at(-1)===g);if(!v)return[];o=v}let i=await t.sessionStore.load({projectKey:n,sessionId:s,subpath:o});if(!i)return[];let a=i.filter(cr),c=i.filter(l=>l.type==="agent_metadata").at(-1),u=typeof c?.toolUseId=="string"?c.toolUseId:null,p=typeof c?.parentAgentId=="string"?c.parentAgentId:null,f=dr(a).map(l=>{let g=Pt(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??s,message:l.message,parent_tool_use_id:u,parent_agent_id:p,...Rt(l),...g?{tool_result_meta:g}:{}}}),d=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(d,d+t.limit):f.slice(d)}let r=await U(t);for(let n of r){let o=P(n,`${s}.jsonl`);try{await ue(o);let a=(await ur(ar(n,s))).find(c=>c.agentId===e);return a?await qi(a.filePath,s,t):[]}catch{continue}}return[]}async function na(s,e){if(!J(s))throw new Error(`Invalid sessionId: ${s}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(ve(await de(e.dir),s));return}let t=await U(e);for(let r of t){let n=P(r,`${s}.jsonl`);try{await ue(n),await Promise.all([Js(n,{force:!0}),Js(P(r,s),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${s} not found`)}import{randomUUID as Be}from"crypto";import{readdir as oa,readFile as ia,realpath as aa,stat as pr,writeFile as ca}from"fs/promises";import{dirname as ua,join as Et,resolve as da}from"path";var fr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,la=new Set(["user","assistant","attachment","system","progress"]);async function mr(s){let e=da(s);try{return await aa(e)}catch{return e}}async function pa(s,e){let t=ae();if(e){let n=T(await mr(e)),o=Et(t,n,`${s}.jsonl`);try{if((await pr(o)).size>0)return o}catch{}return}let r;try{r=await oa(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=Et(t,n.name,`${s}.jsonl`);try{if((await pr(o)).size>0)return o}catch{}}}function hr(s,e){let t=[],r=[],n;for(let o of s){if(o===null||typeof o!="object")continue;let i=o;if(typeof i.type=="string"&&la.has(i.type)&&typeof i.uuid=="string"){t.push(i);continue}if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){r.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(n=i.relocatedCwd)}return{transcript:t,contentReplacements:r,relocatedCwd:n}}function fa(s,e){let t=[];for(let r of s.split(`
29
- `))if(r.trim())try{t.push(JSON.parse(r))}catch{}return hr(t,e)}function ga(s){for(let e of s){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let r=t.message;if(r===null||typeof r!="object")continue;let n=r.content;if(typeof n=="string"&&n.trim())return n.trim();if(!Array.isArray(n)||n.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=n.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
30
- `).trim();if(o)return o}}function ma(s){let e,t;for(let r of s){if(r===null||typeof r!="object")continue;let n=r;typeof n.customTitle=="string"&&n.customTitle&&(e=n.customTitle),typeof n.aiTitle=="string"&&n.aiTitle&&(t=n.aiTitle)}return e??t??ga(s)}function gr(s,e,t,r){let n=s.transcript.filter(d=>d.isSidechain!==!0);if(n.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=n.findIndex(l=>l.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);n=n.slice(0,d+1)}let o=new Map(n.map(d=>[d.uuid,Be()])),i=n.filter(d=>d.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(n.map(d=>[d.uuid,d])),c=Be(),u=new Date().toISOString(),p=i.map((d,l)=>{let g=null,v=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;v;){let k=a.get(v);if(!k)break;if(k.type!=="progress"){g=o.get(v)??null;break}v=typeof k.parentUuid=="string"?k.parentUuid:void 0}let m=typeof d.logicalParentUuid=="string"?o.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,h={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(d.uuid),parentUuid:g,logicalParentUuid:m,sessionId:c,timestamp:l===i.length-1?u:typeof d.timestamp=="string"?d.timestamp:u,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete h.teamName,delete h.agentName,delete h.sessionKind,delete h.slug,delete h.sourceToolAssistantUUID,h});s.contentReplacements.length>0&&p.push({type:"content-replacement",sessionId:c,replacements:s.contentReplacements,uuid:Be(),timestamp:u}),s.relocatedCwd&&p.push({type:"relocated",sessionId:c,relocatedCwd:s.relocatedCwd});let f=t.title?.trim();return p.push({type:"custom-title",sessionId:c,customTitle:f||`${ma(r)??"Forked session"} (fork)`,uuid:Be(),timestamp:u}),{sessionId:c,entries:p}}async function ha(s,e={}){if(!fr.test(s))throw new Error(`Invalid sessionId: ${s}`);if(e.upToMessageId&&!fr.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await mr(e.dir??process.cwd()),a=T(i),c=await e.sessionStore.load({projectKey:a,sessionId:s});if(!c?.length)throw new Error(`Session ${s} not found`);let u=gr(hr(c,s),s,e,c);return await e.sessionStore.append({projectKey:a,sessionId:u.sessionId},u.entries),{sessionId:u.sessionId}}let t=await pa(s,e.dir);if(!t)throw new Error(`Session ${s} not found`);let r=await ia(t,"utf8"),n=r.split(`
31
- `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=gr(fa(r,s),s,e,n);return await ca(Et(ua(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
7
+ ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var se=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var A=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ye=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},Se=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},we=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var ct="1.2.0";function hr(r,e,t,n){return new Promise((s,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){o(u);return}s({jsonrpc:"2.0"});return}let a=`${r}:${e.id}`;n.set(a,{resolve:s,reject:o}),t.onmessage?t.onmessage(e):(n.delete(a),o(new Error(`No message handler registered for MCP server "${r}"`)))})}function yr(r,e,t){if("id"in e&&e.id!==null){let n=`${r}:${e.id}`,s=t.get(n);if(s)return s.resolve(e),t.delete(n),!0}return!1}function Sr(r,e,t){let n=0,s=`${r}:`,o=Array.from(t.entries());for(let i of o){let[a,u]=i;a.startsWith(s)&&(u.reject(e),t.delete(a),n++)}return n}import{randomUUID as so}from"crypto";function kr(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var oo=500,io=1024*1024,ao=6e4,uo=[200,800],Ue=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=co(e.filePath),n=lo(e.entries),s=vr(t),o=this.states.get(s);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(s,o)),o.entries.push(...n),o.bytes+=mo(n),(this.options.flushMode==="eager"||o.entries.length>=oo||o.bytes>=io)&&this.drain(o)}async flush(){for(let e of this.states.values())this.drain(e);await Promise.all([...this.states.values()].map(e=>e.tail))}drain(e){if(e.entries.length===0)return;let t=e.entries;e.entries=[],e.bytes=0,e.tail=e.tail.then(async()=>{try{await fo(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??ao,retryDelaysMs:this.options.retryDelaysMs??uo})}catch(n){this.options.diagnostics?.record(`[SessionStore] append failed for ${vr(e.key)}`,n),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:n instanceof Error?n.message:String(n),key:{...e.key},uuid:so(),session_id:e.key.sessionId})}})}};function co(r){let e=r.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),n=e.slice(t+1);if(t<0||n.length<2)throw new Error(`Invalid transcript mirror path: ${r}`);let s=n[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(n[1]);if(n.length===2&&o)return{projectKey:s,sessionId:wr(o[1])};let i=wr(n[1]),a=n.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return po(c),{projectKey:s,sessionId:i,subpath:c}}function lo(r){return r.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function wr(r){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(r))throw new Error(`Invalid transcript session id: ${r}`);return r}function po(r){let e=r.split("/");if(!r||r.includes("\0")||/^[a-z]:/i.test(r)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${r}`)}function vr(r){return JSON.stringify([r.projectKey,r.sessionId,r.subpath??null])}function mo(r){return r.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function fo(r,e,t,n){for(let s=0;;s++)try{await go(r.append({...e},structuredClone(t)),n.appendTimeoutMs);return}catch(o){if(o instanceof qe)throw o;let i=n.retryDelaysMs[s];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function go(r,e){let t;r.catch(()=>{});try{await Promise.race([r,new Promise((n,s)=>{t=setTimeout(()=>s(new qe(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var qe=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function br(){return Math.random().toString(36).substring(2,15)}function Rr(r,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:r,request:t}}function Tr(r,e){return{type:"control_response",response:{subtype:"success",request_id:r,response:e}}}function Pr(r,e,t){return{type:"control_response",response:{subtype:"error",request_id:r,error:e,...t?{code:t}:{}}}}function Er(r){return typeof r=="object"&&r!==null&&r.type==="control_response"}function _r(r){return typeof r=="object"&&r!==null&&r.type==="control_request"}function Mr(r){return typeof r=="object"&&r!==null&&(r.type==="control_cancel_request"||r.type==="control_cancel")}function oe(r){if(typeof r!="object"||r===null)return;let e=r,t=e.subtype;if(typeof t=="string")return t;let n=e.type;return typeof n=="string"?n:void 0}function Cr(r){if(typeof r!="object"||r===null)return!1;let e=r.type;return e==="keepalive"||e==="keep_alive"}function Ar(r){return typeof r=="object"&&r!==null&&r.type==="streamlined_text"}function xr(r){return typeof r=="object"&&r!==null&&r.type==="streamlined_tool_use_summary"}function Ir(r){return typeof r=="object"&&r!==null&&r.type==="post_turn_summary"}function Or(r){return typeof r=="object"&&r!==null&&r.type==="result"}var ho="<synthetic>";function yo(r){return r.type!=="assistant"||r.isApiErrorMessage===!0||r.message.model!==ho?r:{...r,isApiErrorMessage:!0}}var $e=class r{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;memoryEndInputPromise;closePromise;constructor(e,t,n,s,o,i,a,u,c,p,f,d,l,m,S,g,h,k="batched",y,T,P){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=n,this.hooks=s??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=d??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=p,this.fetchJobToken=m,this.fetchServiceAccountToken=T,this.diagnostics=c,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=g??500,this.memoryCallbacks=P,this.inputStream=new se(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Ue({store:h,flushMode:k,diagnostics:c,onMirrorError:C=>this.inputStream.enqueue(C)})),this.readLoopPromise=this.readMessages().catch(C=>{this.inputStream.error(C)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let C=this.abortController.signal;C.aborted?this.close().catch(()=>{}):C.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let n=e.replace(/\s+/g," ").trim();return n.length>200?`${n.slice(0,200)}...`:n}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let n=t.text;if(typeof n=="string")return this.normalizeLogPreview(n);let s=this.extractMessagePreview(t.content);if(s)return s;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let n=this.getRecord(e)?.type;return typeof n=="string"&&n?n:"unknown"}getMessageSubtype(e){let n=this.getRecord(e)?.subtype;return typeof n=="string"&&n?n:"none"}getMessageUuid(e){let n=this.getRecord(e)?.uuid;return typeof n=="string"&&n?n:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,s=this.getRecord(t)?.content,o=Array.isArray(s)?s.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(kr(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(s){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",s)}continue}if(Er(t)){this.handleControlResponse(t);continue}if(_r(t)){this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",s)});continue}if(Mr(t)){this.handleControlCancelRequest(t);continue}if(Cr(t)||Ar(t)||xr(t)||Ir(t))continue;if(Or(t)){await this.transcriptMirrorBatcher?.flush();let s=t;this.recordInboundSessionMessage(s),this.resultMessage=s,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(s),this.isSingleTurn&&this.flushMemoryBeforeEndInput();continue}let n=yo(t);if(this.recordInboundSessionMessage(n),n.type==="system"&&n.subtype==="init")try{let s=n;this.validateProtocolHandshake(s),this.cliCapabilities=new Set(s.capabilities??[])}catch(s){throw this.inputStream.error(s),s}this.dispatchMemoryCallbacks(n),this.notifyAuthExpiredIfNeeded(n),this.inputStream.enqueue(n)}}catch(t){e=t}finally{await this.transcriptMirrorBatcher?.flush();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,n]of this.pendingRequests)n.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let n=e.type==="auth_status"&&!!e.error,s=e.type==="assistant"&&e.error==="authentication_failed";!n&&!s||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(n=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",n)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}flushMemoryBeforeEndInput(){return this.memoryEndInputPromise||(this.memoryEndInputPromise=this.performFlushMemoryBeforeEndInput()),this.memoryEndInputPromise}async performFlushMemoryBeforeEndInput(){try{this.initConfig.memory!==void 0&&await this.flushMemory()}catch(e){this.diagnostics?.record("[QueryRunner] memory flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new A;let n=br(),s=Rr(n,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=oe(s.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let p=null,f=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:n})+`
8
+ `)}catch(m){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",m)}},d=()=>{p&&(clearTimeout(p),p=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(n)&&(d(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${n} subtype=${i}`),f(),c(new A))};this.pendingRequests.set(n,{resolve:m=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(m)},reject:m=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=error duration_ms=${Date.now()-a}`,m),c(m)}}),t?.signal?.addEventListener("abort",l,{once:!0}),o>0&&Number.isFinite(o)&&(p=setTimeout(()=>{this.pendingRequests.has(n)&&(this.pendingRequests.delete(n),d(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${n} subtype=${i} timeout_ms=${o}`),f(),c(new Error(`Control request "${oe(s.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${n} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(s)+`
9
+ `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${n} subtype=${i}`)}catch(m){d(),this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${n} subtype=${i}`,m),c(m)}})}handleControlResponse(e){let t=e.response,n=t.request_id,s=this.pendingRequests.get(n);if(!s){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${n} status=${t.subtype}`);return}if(this.pendingRequests.delete(n),t.subtype==="success")s.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),s.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)oe(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",n)})}async handleControlRequest(e){let t=e.request_id,n=oe(e.request)??"unknown",s=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${n}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=Tr(t,i);this.transport.write(JSON.stringify(a)+`
10
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=success duration_ms=${Date.now()-s}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=bo(i),c=Pr(t,a,u);this.transport.write(JSON.stringify(c)+`
11
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=error duration_ms=${Date.now()-s}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new A}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=ct;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${n}. Consider upgrading qodercli for the version handshake.`);return}let s=Dr(t),o=Dr(n);if(!s||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${n}"; skipping handshake.`);return}if(s.major!==o.major)throw new Se(t,n);s.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${n}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new A;return new Promise((n,s)=>{let o=()=>{s(new A)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),n(i)},i=>{t.removeEventListener("abort",o),s(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let n=e.request,s=oe(n),o=n;switch(s){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,p=o.blocked_path,f=o.decision_reason,d=o.title,l=o.display_name,m=o.description,S=o.agent_id,g=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:p,decisionReason:f,title:d,displayName:l,description:m,toolUseID:u,agentID:S}),t);if(g.behavior==="deny"&&!g.message)throw new Error("Permission deny result must include a message.");return g.behavior==="allow"?{...g,updatedInput:g.updatedInput??a,toolUseID:u}:{...g,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(hr(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,p=new Promise((S,g)=>{c=setTimeout(()=>{g(new ye(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([u,p]),t)}finally{clearTimeout(c)}let d={type:"get_model_policy",model:typeof f.model=="string"?f.model:f.model.model,parameters:f.parameters};if(typeof f.model!="string"){let{model:S,...g}=f.model;d.custom_model={...g,style:g.style??"openai"}}let l=f.taskId?.trim();l&&(d.task_id=l);let m=f.subTask?.trim();return m&&(d.sub_task=m),d}default:throw new Error(`Unhandled control request subtype: ${s??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,initializeTimeoutMs:r.INITIALIZE_TIMEOUT_MS},t={};for(let[s,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,c),p});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[s]=i)}Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let n=await this.request(e,{timeoutMs:r.INITIALIZE_TIMEOUT_MS});if(n&&typeof n=="object"){let s=n;this.initResponse=s,this.cliCapabilities=new Set(s.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,n,s){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,n,{signal:s}),s)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let n of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(n,"custom_context")?n.custom_context:this.initConfig.customContext,i=o===void 0?n:{...n,custom_context:o};o!==void 0&&!this.cliCapabilities?.has(r.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(i)+`
12
+ `),this.recordOutboundSessionMessage(i)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushMemoryBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(n=>typeof n=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new we(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(r.SIDE_QUESTION_CAPABILITY);let n=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(s=>({...s}))}:{}},{timeoutMs:0,signal:t?.signal});return n?.response==null?null:{response:n.response,synthetic:n.synthetic??!1,...n.refusal_fallback?{refusalFallback:{originalModel:n.refusal_fallback.original_model,fallbackModel:n.refusal_fallback.fallback_model,content:n.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=ko(e?.usage),n=vo(e?.session);return!t&&!n?null:{...t??{},...n?{session:n}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let n={type:"rewind_files",user_message_id:e};t?.dryRun&&(n.dry_run=!0);let o=await this.request(n);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let s={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(s.dry_run=!0),await this.request(s)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=$t(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let n=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),s=n?.requiresUserAction===!0,o=typeof n?.authUrl=="string"?n.authUrl:void 0;if(s&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return s?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if(this.initConfig.memory!==void 0&&this.initResponse?.memory?.enabled===!0&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.memoryEndInputPromise??this.flushMemory())}catch(t){this.diagnostics?.record("[QueryRunner] memory flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,n]of this.sdkMcpTransports){try{await n.close()}catch(s){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,s)}Sr(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function B(r){return typeof r=="object"&&r!==null}function dt(r){return typeof r=="number"&&Number.isFinite(r)}function lt(r){return Object.keys(r).length>0}function N(r,e,t){let n=e[t];dt(n)&&(r[t]=n)}function ie(r,e,t){let n=e[t];typeof n=="string"&&(r[t]=n)}function Le(r,e,t){let n=e[t];typeof n=="boolean"&&(r[t]=n)}function jr(r){if(!B(r)||Array.isArray(r))return;let e={};return N(e,r,"total"),N(e,r,"used"),N(e,r,"remaining"),N(e,r,"percentage"),ie(e,r,"unit"),lt(e)?e:void 0}function So(r){if(!B(r)||Array.isArray(r))return;let e=jr(r)??{};return ie(e,r,"detailUrl"),lt(e)?e:void 0}function wo(r){if(!B(r)||Array.isArray(r))return;let e={};return N(e,r,"used"),N(e,r,"cap"),N(e,r,"remaining"),N(e,r,"percentage"),Le(e,r,"available"),ie(e,r,"unit"),lt(e)?e:void 0}function vo(r){if(!B(r)||Array.isArray(r))return;let e=r.total_credits,t=r.model_usage;if(!dt(e)||e<0||!B(t)||Array.isArray(t))return;let n={};for(let[s,o]of Object.entries(t)){if(!B(o)||Array.isArray(o))continue;let i=o.credits;dt(i)&&i>=0&&(n[s]={credits:i})}return{total_credits:e,model_usage:n}}function ko(r){if(!B(r)||Array.isArray(r))return null;let e={};ie(e,r,"userId"),ie(e,r,"userType"),N(e,r,"totalUsagePercentage"),Le(e,r,"isHighestTier"),N(e,r,"expiresAt"),ie(e,r,"upgradeUrl"),Le(e,r,"isQuotaExceeded"),Le(e,r,"isPlanQuotaProrated");let t=jr(r.userQuota);t&&(e.userQuota=t);let n=So(r.addOnQuota);n&&(e.addOnQuota=n);let s=wo(r.orgResourcePackage);return s&&(e.orgResourcePackage=s),e}function bo(r){let e=r instanceof Error?r.message:String(r),t=typeof r=="object"&&r!==null?r.code:void 0,n=typeof t=="string"&&t.length>0?t:void 0,s=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(s){let o=n??s[1];return(!n||n===s[1])&&(e=s[2]||e),{error:e,code:o}}return n?{error:e,code:n}:{error:e}}function Dr(r){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(r);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Qe=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Nr}from"crypto";var Ro="QODER_CLOUD_AGENT_API_BASE",To="https://api.qoder.com/api/v1/cloud",K={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Po=1024,Kr=1*1024*1024,Fr=4*1024*1024,Eo=8*1024,mt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},Be=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},ft=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},_o=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function $r(r){if(!r.experimentalCloudAgent)return;let e=Object.keys(r).filter(o=>r[o]!==void 0&&!_o.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(r.auth?.type!=="accessToken")throw new Be;let{agent:t,session:n}=r.experimentalCloudAgent;if(t&&ae(t)&&pt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&ae(n)&&pt(n))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(n&&ae(n)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let s=!!n&&ae(n);if(!s&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!s){if(!n||!pt(n))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof n.create.environment_id!="string"||n.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function ae(r){return"id"in r&&r.id!==void 0}function pt(r){return"create"in r&&r.create!==void 0}function Qr(r){return new gt(r)}var gt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=$o();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Lr();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=Mo(e.options.auth,e.options.env),this.apiBase=Co(),this.inputStream=new se(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(n=>{this.sseConnected.reject(n),this.closed||this.inputStream.error(n)}),this.streamInput(qo(e.prompt)).catch(n=>{this.closed||this.inputStream.error(n)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let n=Uo(t);this.beginPendingTurn();let s=await this.postSessionEvents([{type:K.userMessage,content:n}]);this.postedMessages+=1,this.activateTurn(s.find(o=>o.type===K.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:K.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&ae(e))t=e.id;else{let n=await this.resolveAgentId(),s=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:n,...xo(s)}});t=Ur(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(ae(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Ao(e.create)});return Ur(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let n=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==n&&(t=0),t+=1,await Lo(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),n=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;n&&t.searchParams.set("after_id",n),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let s=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await qr(s);if(!s.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(s.body)}async readSseBody(e){let t=e.getReader(),n=new TextDecoder,s="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){s+=n.decode(),s.length>0&&this.consumeSseLine(s,o);break}s+=n.decode(a,{stream:!0});let u;for(;(u=s.indexOf(`
13
+ `))!==-1;){let c=s.slice(0,u);s=s.slice(u+1);let p=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(p,o),this.closed)break}s.length>Kr&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Kr} bytes; resetting buffer.`),s="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:Do(t.data.join(`
14
+ `))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let n=e.indexOf(":"),s=n===-1?e:e.slice(0,n),o=n===-1?"":e.slice(n+1);switch(o.startsWith(" ")&&(o=o.slice(1)),s){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>Fr){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Fr} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(o),t.dataBytes+=o.length;break}}handleSseEvent(e){if(this.closed)return;let t=x(e.data,"type")??e.event,n=x(e.data,"turn_id"),s={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Nr(),session_id:this.sessionId??x(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(s),!this.isCurrentTurnEvent(n)){this.bufferPendingTurnEvent(e,t,n);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case K.agentMessage:{let n=No(ve(e.data,"content"));n&&this.assistantTextParts.push(n);return}case K.modelRequestEnd:this.captureUsage(e.data);return;case K.idle:this.idleSeen=!0,this.finishIfIdle();return;case K.error:this.emitErrorResult(e),this.finish();return;case K.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Lr(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let n of t)if(this.isCurrentTurnEvent(n.turnId)&&this.handleCurrentTurnEvent(n.event,n.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,n){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Po&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:n}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(x(e.data,"error")??x(ze(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:Nr(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,n=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return Io(n)}captureUsage(e){let t=ze(e,"usage");if(!t)return;this.latestUsage=Ko(this.latestUsage,t);let n=E(e,"total_cost_usd")??E(e,"cost_usd")??E(t,"total_cost_usd")??E(t,"cost_usd");n!==void 0&&(this.totalCostUsd+=n);let s=x(e,"model")??x(t,"model");if(s){let o=this.latestModelUsage[s]?.costUSD??0;this.latestModelUsage[s]=Fo(this.latestUsage,o+(n??0))}}async requestJson(e,t){let n=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!n.ok)throw this.handleAuthFailure(n.status),await qr(n);if(n.status===204)return{};try{return await n.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Mo(r,e){if(r?.type!=="accessToken")throw new Be;if(typeof r.accessToken=="string")return r.accessToken;let t=r.accessToken.envVar,n=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!n)throw new mt(t);return n}function Co(){return process.env[Ro]?.replace(/\/+$/,"")??To}function Ao(r){return ht({name:r.name,model:r.model,system:r.system,description:r.description,tools:r.tools,mcp_servers:r.mcp_servers,skills:r.skills,metadata:r.metadata})}function xo(r){return ht({title:r.title,environment_id:r.environment_id,resources:r.resources?.map(e=>ht({...e})),vault_ids:r.vault_ids,memory_store_ids:r.memory_store_ids})}function ht(r){return Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0))}function Ur(r,e){let t=x(r,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Io(r){let e=jo(r,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:x(t,"id"),turnId:x(t,"turn_id"),type:x(t,"type")}]):[]}async function qr(r){let e=await Oo(r,Eo);return new ft(r.status,e||r.statusText||"unknown error")}async function Oo(r,e){if(!r.body)try{return(await r.text()).slice(0,e)}catch{return""}let t=r.body.getReader(),n=new TextDecoder,s=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,s.push(n.decode(a,{stream:!0}))}s.push(n.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return s.join("").slice(0,e)}function Do(r){if(r.length===0)return{};try{return JSON.parse(r)}catch{return r}}function ze(r,e){let t=ve(r,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function jo(r,e){let t=ve(r,e);return Array.isArray(t)?t:void 0}function x(r,e){let t=ve(r,e);return typeof t=="string"?t:void 0}function E(r,e){let t=ve(r,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ve(r,e){if(!(r===null||typeof r!="object"||Array.isArray(r)))return r[e]}function No(r){return typeof r=="string"?r:Array.isArray(r)&&r.map(t=>Br(t)?t.text:"").filter(Boolean).join("")||void 0}function Ko(r,e){let t=ze(e,"cache_creation"),n=ze(e,"server_tool_use");return{...r,cache_creation:{ephemeral_1h_input_tokens:E(t,"ephemeral_1h_input_tokens")??r.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:E(t,"ephemeral_5m_input_tokens")??r.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:E(e,"cache_creation_input_tokens")??r.cache_creation_input_tokens,cache_read_input_tokens:E(e,"cache_read_input_tokens")??r.cache_read_input_tokens,input_tokens:E(e,"input_tokens")??r.input_tokens,output_tokens:E(e,"output_tokens")??r.output_tokens,server_tool_use:{web_fetch_requests:E(n,"web_fetch_requests")??r.server_tool_use.web_fetch_requests,web_search_requests:E(n,"web_search_requests")??r.server_tool_use.web_search_requests}}}function Fo(r,e){return{inputTokens:r.input_tokens,outputTokens:r.output_tokens,cacheReadInputTokens:r.cache_read_input_tokens,cacheCreationInputTokens:r.cache_creation_input_tokens,webSearchRequests:r.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function Uo(r){let e=r.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Br(t)?t.text:JSON.stringify(t)).join(`
15
+ `):JSON.stringify(e)}function Br(r){return r!==null&&typeof r=="object"&&"type"in r&&r.type==="text"&&"text"in r&&typeof r.text=="string"}function qo(r){return typeof r!="string"?r:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:r}]},parent_tool_use_id:null}}()}function Lr(){return{cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},cache_creation_input_tokens:0,cache_read_input_tokens:0,inference_geo:"",input_tokens:0,iterations:[],output_tokens:0,server_tool_use:{web_fetch_requests:0,web_search_requests:0},service_tier:"standard",speed:"standard"}}async function Lo(r,e){e.aborted||await new Promise(t=>{let n=setTimeout(t,r);e.addEventListener("abort",()=>{clearTimeout(n),t()},{once:!0})})}function $o(){let r,e;return{promise:new Promise((n,s)=>{r=n,e=s}),resolve:r,reject:e}}import{access as Vo,chmod as Vr,cp as Yo,mkdtemp as Xo,mkdir as Yr,realpath as Zo,rm as Hr,writeFile as ei}from"fs/promises";import{homedir as ti,tmpdir as ri}from"os";import{dirname as ni,isAbsolute as Xr,join as z,relative as si,resolve as yt,sep as oi}from"path";import{homedir as Qo}from"os";import{join as Wr}from"path";var Bo=w.configDirName,zo=w.cliHomeEnv,Wo=w.configDirEnv,zr=200;function Ho(){return process.env[zo]||Qo()}function Go(){let r=process.env[Wo];return r||Wr(Ho(),Bo)}function ue(){return Wr(Go(),"projects")}function Jo(r){let e=5381;for(let t=0;t<r.length;t++)e=e*33^r.charCodeAt(t);return e}function _(r){let e=r.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=zr)return e;let t=Math.abs(Jo(r)).toString(36);return`${e.slice(0,zr)}-${t}`}var ii=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ai=6e4;async function Zr(r){if(r.resume===void 0&&!r.continue)return;let e=_(await di(r.cwd)),t=r.loadTimeoutMs??ai,n=r.resume!==void 0?r.resume:await li(r.store,e,t);if(n===void 0||!ii.test(n))return;let s={projectKey:e,sessionId:n},o=await Gr(r.store,s,t);if(!o)return;let i=r.store.listSubkeys?await St(r.store.listSubkeys(s),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!mi(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let p=await Gr(r.store,{...s,subpath:c},t);p&&a.push({subpath:c,entries:p})}let u;try{u=await Xo(z(ri(),"qoder-session-store-")),await Vr(u,448),await ci(ui(r.env),u);let c=z(u,"projects",e),p=z(c,n);await Yr(c,{recursive:!0,mode:448}),await Jr(z(c,`${n}.jsonl`),o);for(let{subpath:d,entries:l}of a){let m=fi(p,`${d}.jsonl`),S=l.filter(h=>h.type==="agent_metadata"),g=l.filter(h=>h.type!=="agent_metadata");if(g.length>0&&await Jr(m,g),S.length>0){let h={...S.at(-1)};delete h.type,await en(m.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=u;return{configDir:f,projectKey:e,sessionId:n,cleanup:async()=>{await Hr(f,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await Hr(u,{recursive:!0,force:!0}),c}}function ui(r){let e=r?.[w.cliHomeEnv]??process.env[w.cliHomeEnv]??ti();return yt(r?.[w.configDirEnv]??process.env[w.configDirEnv]??z(e,w.configDirName))}async function ci(r,e){for(let t of[".auth","oauth_creds.json"]){let n=z(r,t);try{await Vo(n),await Yo(n,z(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(s){if(s.code!=="ENOENT")throw s}}}async function di(r){let e=yt(r??process.cwd());try{return await Zo(e)}catch{return e}}async function li(r,e,t){if(!r.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let n=await St(r.listSessions(e),t,"listSessions");if(!Array.isArray(n))throw new Error("SessionStore listSessions() must return an array");return n.slice().sort((s,o)=>o.mtime-s.mtime)[0]?.sessionId}async function Gr(r,e,t){let n=await St(r.load({...e}),t,"load");if(!(n===null||n.length===0)){if(!Array.isArray(n))throw new Error("SessionStore load() must return an array or null");return n.map((s,o)=>pi(s,o))}}function pi(r,e){if(r===null||typeof r!="object"||typeof r.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(r);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function mi(r){return!(typeof r!="string"||!r||r.includes("\0")||r.includes("\\")||Xr(r)||/^[a-z]:/i.test(r)||r.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function fi(r,e){let t=yt(r,e),n=si(r,t);if(n===""||n===".."||n.startsWith(`..${oi}`)||Xr(n))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Jr(r,e){let t=e.map(n=>JSON.stringify(n)).join(`
16
+ `);await en(r,t?`${t}
17
+ `:"")}async function en(r,e){await Yr(ni(r),{recursive:!0,mode:448}),await ei(r,e,{encoding:"utf8",mode:384}),await Vr(r,384)}async function St(r,e,t){let n;r.catch(()=>{});try{return await Promise.race([r,new Promise((s,o)=>{n=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{n!==void 0&&clearTimeout(n)}}var gi=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function hi(r){let e=r.replace(/\\/g,"/").split("/").at(-1)??"";return gi.test(e)}function We(r,e,t=process.env){let n=r.pathToQoderCLIExecutable;return n?hi(n)?{transport:"worker",pathToQoderWorkerRuntime:n}:{transport:"process"}:r.executable!==void 0||r.executableArgs!==void 0||r.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}import tn from"node:path";function ce(r,e){if(typeof r!="string"||r.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function ke(r,e){if(r!==void 0&&typeof r!="function")throw new TypeError(`${e} must be a function`)}function yi(r){if(r===void 0)return;if(!Array.isArray(r)||r.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,n]of r.entries()){if(!n||typeof n!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(ce(n.id,`options.memory.generation.roots[${t}].id`),ce(n.path,`options.memory.generation.roots[${t}].path`),e.has(n.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${n.id}"`);if(e.add(n.id),n.access!==void 0&&n.access!=="read"&&n.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(n.indexFile!==void 0){ce(n.indexFile,`options.memory.generation.roots[${t}].indexFile`);let s=n.indexFile.replaceAll("\\","/");if(tn.posix.isAbsolute(s)||tn.win32.isAbsolute(n.indexFile)||s.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Si(r){if(r===void 0)return;if(!Array.isArray(r)||r.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,n]of r.entries()){if(!n||typeof n!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(ce(n.id,`options.memory.consumption.files[${t}].id`),ce(n.path,`options.memory.consumption.files[${t}].path`),e.has(n.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${n.id}"`);if(e.add(n.id),n.required!==void 0&&typeof n.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function rn(r){if(r===void 0)return{};if(!r||typeof r!="object")throw new TypeError("options.memory must be an object");if(r.mode!=="native"&&r.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');let e=new Map;if(r.mode==="native"){let i=Object.keys(r.generation??{}),a=Object.keys(r.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return ke(r.generation?.onResult,"options.memory.generation.onResult"),ke(r.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native"},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:r.generation?.onResult,onConsumptionResult:r.consumption?.onResult}}}let t,n=r.generation;if(n!==void 0){if(!n||typeof n!="object")throw new TypeError("options.memory.generation must be an object");if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");yi(n.roots),n.prompt!==void 0&&ce(n.prompt,"options.memory.generation.prompt"),ke(n.onResult,"options.memory.generation.onResult");let i;if(n.turnComplete!==void 0){let a=n.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if(ke(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(n.turnComplete?.enabled===!0&&n.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:n.enabled??!0,roots:n.roots?.map(a=>({...a})),prompt:n.prompt,turnComplete:i}}let s,o=r.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Si(o.files),o.maxTokens!==void 0&&(!Number.isInteger(o.maxTokens)||o.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(o.overflow!==void 0&&o.overflow!=="truncate"&&o.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(o.failureMode!==void 0&&o.failureMode!=="best_effort"&&o.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');ke(o.onResult,"options.memory.consumption.onResult"),s={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:r.mode,generation:t,consumption:s},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n?.onResult,onConsumptionResult:o?.onResult}}}var wt=class extends Error{code="auth_not_configured";constructor(){super("The auth option is required when calling query(); configure options.auth so the SDK can create an auth payload file before spawning qodercli."),this.name="AuthNotConfiguredError"}};function wi(r){if(r.transport!==void 0){if(or(r.transport))return r.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let e=We(r,ge);return e.transport==="worker"?new ne({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):ee.default}function vt(r){let{prompt:e,options:t={}}=r,n=wi(t),s=new Fe({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");let o=t.auth;if(o==null)throw new wt;if(t.sessionStore&&t.enableFileCheckpointing)throw new Error("sessionStore cannot be combined with enableFileCheckpointing because checkpoint blobs are not part of the SessionStore contract.");if(t.sessionStore&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${w.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(t.sessionStore&&!(n instanceof ee)&&!(n instanceof ne))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(t.sessionStore&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(t.sessionStore&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(t.sessionStore&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return $r(t),Qr({prompt:e,options:t,diagnostics:s});let i=rn(t.memory),a=!!t.resolveModel,u=t.onAuthExpired,c=!1,p=u?()=>{c||(c=!0,Promise.resolve(u()).catch(v=>{s.record("[query] onAuthExpired callback threw:",v)}))}:void 0,f=new Map,d=new Map,l=new Map,m={},S={},g={};if(t.mcpServers)for(let[v,O]of Object.entries(t.mcpServers)){let q=O.tools;if(Array.isArray(q)&&q.length>0&&(S[v]=q),O.type==="sdk"&&"instance"in O&&O.instance){let V=O.instance;if(f.set(v,V),q){let Ee=tt(v,q);Ee&&(g[v]=Ee)}let Nt=new Qe(Ee=>{yr(v,Ee,l)});d.set(v,Nt),V.connect(Nt).catch(()=>{})}else m[v]=O}let h=Object.keys(m).length>0,k=Object.keys(S).length>0,y=t.pathToQoderCLIExecutable,T=t.env,P=o?.type==="jobToken"?o.fetchJobToken:void 0,C=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,b={pathToQoderCLIExecutable:y,executable:t.executable,executableArgs:t.executableArgs,env:T,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:o,model:a?void 0:t.model,agent:t.agent,debug:t.debug,diagnostics:s,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:t.sessionStore!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let v=t.allowedTools??[];if(t.skills===void 0)return v.length>0?v:void 0;let O=t.skills==="all"?["Skill"]:t.skills.map(V=>`Skill(${V})`),q=new Set(v);return[...v,...O.filter(V=>!q.has(V))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:h?m:void 0,mcpToolPolicies:k?S:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,securityScan:t.securityScan,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:p},fe=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new Ke(async()=>{let v=await Zr({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!v)return{transport:Oe(n,{...b,continue:!1})};try{return{transport:Oe(n,{...b,env:{...b.env??process.env,[w.configDirEnv]:v.configDir},continue:!1,resume:v.sessionId}),cleanup:v.cleanup}}catch(O){throw await v.cleanup(),O}}):Oe(n,b);fe.initialize().catch(()=>{});let Fn=typeof e=="string",J=t.systemPrompt,Dt,jt;if(typeof J=="string")Dt=J;else if(typeof J=="object"&&J!==null&&J.type==="preset"){let v=J;if(v.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(v.preset)}`);jt=v.append}let Un={systemPrompt:Dt,appendSystemPrompt:jt,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing,memory:i.config,customContext:t.customContext},Ze=new $e(fe,Fn,t.canUseTool,t.hooks,t.abortController,f,Un,t.onElicitation,s,p,t.controlRequestTimeoutMs,d,l,P,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",g,C,i.callbacks);if(typeof e=="string"){let v={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Ze.streamInput(async function*(){yield v}())}else Ze.streamInput(e);return Ze}var kt=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},bt=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function vi(r={}){let e=r.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(r.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new kt,n=vt({prompt:t,options:r.options}),s;try{return await Promise.race([n.initializationResult(),new Promise((o,i)=>{s=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new bt(n,t)}catch(o){throw t.discard(),await n.close(),o}finally{s!==void 0&&clearTimeout(s)}}import{readFile as ki}from"node:fs/promises";import bi from"node:os";import I from"node:path";var Ri=["user","project","local"],Pt=new Set(["__proto__","constructor","prototype"]),Ti=/^[\p{L}\p{N}\p{M}._ -]+$/u,Pi=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Ei=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),_i=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Mi=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function W(r){if(r===null||typeof r!="object"||Array.isArray(r))return!1;let e=Object.getPrototypeOf(r);return e===Object.prototype||e===null}function Ci(r){let e=r.charCodeAt(0)===65279?r.slice(1):r,t="",n=!1,s=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
18
+ `||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){u==="*"&&c==="/"?(i=!1,t+=" ",a+=1):t+=u===`
19
+ `||u==="\r"?u:" ";continue}if(n){t+=u,s?s=!1:u==="\\"?s=!0:u==='"'&&(n=!1);continue}u==='"'?(n=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Ai(r,e){let t;try{t=JSON.parse(Ci(r))}catch(n){let s=n instanceof Error?n.message:String(n);throw new Error(`Unable to parse settings from ${e}: ${s}`)}if(!W(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return He(t)}function de(r){return Array.isArray(r)?r.map(de):W(r)?He(r):r}function He(r){let e={};for(let[t,n]of Object.entries(r))Pt.has(t)||n===void 0||(e[t]=de(n));return e}function xi(r){let e=r.join(".");if(_i.has(e)||r.length===2&&r[0]==="providers")return"shallow";if(Mi.has(e))return"union";if(r.length===2&&r[0]==="hooks")return"concat"}function Tt(r,e,t=[]){for(let[n,s]of Object.entries(e)){if(Pt.has(n)||s===void 0)continue;let o=[...t,n],i=r[n],a=xi(o);if(a==="shallow"&&i&&s){let u={};W(i)&&Object.assign(u,He(i)),W(s)&&Object.assign(u,He(s)),r[n]=u;continue}if(Array.isArray(i)){let u=Array.isArray(s)?s:[s];if(a==="concat"){r[n]=[...i.map(de),...u.map(de)];continue}if(a==="union"){r[n]=[...new Set([...i,...u])].map(de);continue}}if(W(i)&&W(s))Tt(i,s,o);else if(W(s)){let u={};Tt(u,s,o),r[n]=u}else r[n]=de(s)}}function Ii(r){let e=r?.[w.configDirNameEnv];if(e===void 0||e==="")return{user:w.configDirName,project:w.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!Ti.test(t)||Pi.test(t))throw new Error(`${w.configDirNameEnv} must be a valid directory name`);if(Ei.has(t.toLowerCase()))throw new Error(`${w.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function Rt(r,e){let t;try{t=await ki(e,"utf8")}catch(n){if(n.code==="ENOENT")return;throw n}return{source:r,path:I.resolve(e),settings:Ai(t,I.resolve(e))}}async function Oi(r={}){let e=I.resolve(r.cwd??process.cwd()),t=process.env,n=Ii(t),s=t[w.cliHomeEnv]??t.GEMINI_CLI_HOME,o=s?I.resolve(e,s):bi.homedir(),i=t[w.configDirEnv]?I.resolve(e,t[w.configDirEnv]):I.join(o,n.user),a=I.join(e,n.project),u=new Set(r.settingSources??Ri),c=I.resolve(o)===e,p=[];if(u.has("user")){let l=await Rt("user",I.join(i,"settings.json"));l&&p.push(l)}if(u.has("project")&&!c){let l=await Rt("project",I.join(a,"settings.json"));l&&p.push(l)}if(u.has("local")&&!c){let l=await Rt("local",I.join(a,"settings.local.json"));l&&p.push(l)}let f={},d={};for(let l of p){Tt(f,l.settings);for(let m of Object.keys(l.settings))Pt.has(m)||(d[m]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:f,provenance:d,sources:p}}import{McpServer as Di}from"@modelcontextprotocol/sdk/server/mcp.js";function ji(r){if(!r.name||typeof r.name!="string"||r.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Di({name:r.name,version:r.version??"1.0.0"},{capabilities:{tools:r.tools&&r.tools.length>0?{}:void 0}}),t=[];if(r.tools&&r.tools.length>0)for(let n of r.tools){if(!n.name||typeof n.name!="string"||n.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${r.name}".`);if(!n.description||typeof n.description!="string")throw new Error(`[createSdkMcpServer] Tool "${n.name}" must have a non-empty description string.`);et(r.name,{name:n.name,exposedName:n.exposedName,alwaysLoad:n.alwaysLoad}),(n.exposedName!==void 0||n.alwaysLoad!==void 0||n.permissionPolicy!==void 0)&&t.push({name:n.name,...n.exposedName!==void 0?{exposedName:n.exposedName}:{},...n.alwaysLoad!==void 0?{alwaysLoad:n.alwaysLoad}:{},...n.permissionPolicy!==void 0?{permission_policy:n.permissionPolicy}:{}});try{e.registerTool(n.name,{description:n.description,inputSchema:n.inputSchema,...n.annotations?{annotations:n.annotations}:{}},n.handler)}catch(s){throw s instanceof Error&&s.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${n.name}" in server "${r.name}". Each tool name must be unique within a server.`):s}}return{type:"sdk",name:r.name,instance:e,...t.length>0?{tools:t}:{}}}function Ni(r,e,t,n,s){return{name:r,description:e,inputSchema:t,handler:n,annotations:s?.annotations,...s?.exposedName!==void 0?{exposedName:s.exposedName}:{},...s?.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s?.permissionPolicy!==void 0?{permissionPolicy:s.permissionPolicy}:{}}}import{readdir as Et,readFile as Je,stat as le,appendFile as mn,realpath as Ki,rm as nn}from"fs/promises";import{basename as Fi,join as R,resolve as sn}from"path";import{execFile as Ui}from"child_process";import{randomUUID as fn}from"crypto";import{promisify as qi}from"util";var Li=qi(Ui),$i=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Qi=new Set(["user","assistant","system","progress","attachment"]);function M(r){return r!==null&&typeof r=="object"}function H(r){return $i.test(r)}function on(r){let e=[];for(let t of r.split(`
20
+ `)){let n=t.trim();if(n)try{let s=JSON.parse(n);M(s)&&typeof s.uuid=="string"&&typeof s.type=="string"&&Qi.has(s.type)&&e.push(s)}catch{}}return e}function an(r,e){let t;for(let n of r.split(`
21
+ `)){let s=n.trim();if(s)try{let o=JSON.parse(s);if(!M(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function Ge(r){if(!M(r.message))return[];let e=r.message.content;return Array.isArray(e)?e:[]}var Bi=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function zi(r){return typeof r=="string"&&Bi.has(r)?r:void 0}function _t(r){if(r.type!=="user")return;let e=Ge(r).filter(o=>M(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(r.toolDenialKind)?r.toolDenialKind:e.length===1?[r.toolDenialKind]:[],n=Array.isArray(r.userFeedback)?r.userFeedback:e.length===1?[r.userFeedback]:[],s=e.flatMap((o,i)=>{let a=zi(t[i]);if(!a)return[];let u=n[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return s.length>0?s:void 0}function be(r){if(r.type!=="assistant"||!M(r.message))return;let e=r.message.id;return typeof e=="string"&&e?e:void 0}function gn(r){return r.type!=="user"||!r.parentUuid?!1:Ge(r).some(e=>M(e)&&e.type==="tool_result")}function Wi(r){if(!M(r.message))return null;let e=r.message.id;return typeof e=="string"&&e.length>0?e:null}function Hi(r,e){let t=new Map;for(let[n,s]of r){let o=Wi(s);if(o){let i=t.get(o);i?i.push(n):t.set(o,[n])}}for(let[n,s]of r){let o=Gi(s,s.parentUuid,r,t,e);o!==s.parentUuid&&r.set(n,{...s,parentUuid:o})}}function Gi(r,e,t,n,s){if(!e||t.has(e))return e;let o=n.get(e);return!o||o.length===0?e:o.length===1?o[0]:Ji(r,o,t)??Vi(r,o,t,s)??e}function Ji(r,e,t){if(!gn(r))return;let n=Ge(r).filter(o=>M(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(n.length===0)return;let s=e.filter(o=>{let i=t.get(o);return i?Ge(i).some(a=>M(a)&&a.type==="tool_use"&&n.includes(typeof a.id=="string"?a.id:"")):!1});return s.length===1?s[0]:void 0}function Vi(r,e,t,n){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(n.get(o.uuid)??-1)<(n.get(r.uuid)??-1)).at(-1)?.uuid}function Yi(r){for(let e of r.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,n=t?.headUuid,s=t?.anchorUuid,o=t?.tailUuid;if(!n||!s||!o)continue;let i=r.get(n);i&&r.set(n,{...i,parentUuid:s});for(let[a,u]of r)a!==n&&u.parentUuid===s&&r.set(a,{...u,parentUuid:o})}}function un(r,e,t){let n=(r.timestamp??"").localeCompare(e.timestamp??"");return n!==0?n:(t.get(r.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function Xi(r,e,t){let n=e.filter(d=>d.type==="assistant");if(n.length===0)return e;let s=new Map,o=0;for(let d of r.keys())s.set(d,o++);let i=new Map;for(let d of n){let l=be(d);l&&i.set(l,d)}let a=new Map,u=new Map;for(let d of r.values()){let l=be(d);if(l){let m=a.get(l)??[];m.push(d),a.set(l,m);continue}if(gn(d)&&d.parentUuid){let m=u.get(d.parentUuid)??[];m.push(d),u.set(d.parentUuid,m)}}let c=new Set,p=new Map;for(let d of n){let l=be(d);if(!l||c.has(l))continue;c.add(l);let m=a.get(l)??[d],S=m.filter(b=>!t.has(b.uuid)),g=[];for(let b of m){let G=u.get(b.uuid)??[];for(let fe of G)t.has(fe.uuid)||g.push(fe)}if(S.length===0&&g.length===0)continue;let h=i.get(l);if(!h)continue;let k=[...m].sort((b,G)=>un(b,G,s));g.sort((b,G)=>un(b,G,s));let y=k.findIndex(b=>b.uuid===h.uuid),T=k.slice(0,Math.max(y,0)).filter(b=>!t.has(b.uuid)),P=k.slice(y+1).filter(b=>!t.has(b.uuid)),C=[...T,...P,...g];for(let b of C)t.add(b.uuid);p.set(h.uuid,C)}if(p.size===0)return e;let f=[];for(let d of e){let l=p.get(d.uuid);if(l){let m=s.get(d.uuid)??Number.MAX_SAFE_INTEGER,S=[],g=[];for(let h of l)(d.type==="assistant"&&h.type==="assistant"&&be(h)===be(d)&&(s.get(h.uuid)??Number.MAX_SAFE_INTEGER)<m?S:g).push(h);f.push(...S,d,...g)}else f.push(d)}return f}function cn(r,e){if(r.length===0)return[];let t=new Map,n=new Map;for(let[u,c]of r.entries())t.set(c.uuid,c),n.set(c.uuid,u);Yi(t),Hi(t,n);let s;if(e?.leafUuid===null)return[];if(e){let u=t.get(e.leafUuid),c=u?.sessionId??u?.session_id;u&&(c===void 0||c===e.sessionId)&&(s=u)}if(!s){let u=new Set;for(let l of t.values())l.parentUuid&&u.add(l.parentUuid);let c=Array.from(t.values()).filter(l=>!u.has(l.uuid)),p=[];for(let l of c){let m=l,S=new Set;for(;m&&!S.has(m.uuid);){if(S.add(m.uuid),m.type==="user"||m.type==="assistant"){p.push(m);break}m=m.parentUuid?t.get(m.parentUuid):void 0}}if(p.length===0)return[];let f=p.filter(l=>!l.isSidechain&&!l.teamName&&!l.isMeta);s=(f.length>0?f:p).reduce((l,m)=>(n.get(m.uuid)??-1)>(n.get(l.uuid)??-1)?m:l)}let o=[],i=new Set,a=s;for(;a&&!i.has(a.uuid);)i.add(a.uuid),o.push(a),a=a.parentUuid?t.get(a.parentUuid):void 0;return o.reverse(),Xi(t,o,i)}function dn(r,e){let t=r.type==="user"||r.type==="assistant",n=e&&r.type==="system";return!(!t&&!n||r.isMeta||r.isSidechain||r.teamName)}function Zi(r){if(!r)return;let e=r.preservedSegment,t={trigger:r.trigger,pre_tokens:r.preTokens??r.pre_tokens,post_tokens:r.postTokens??r.post_tokens,messages_summarized:r.messagesSummarized??r.messages_summarized,duration_ms:r.durationMs??r.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function Mt(r){return r.type==="assistant"&&r.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function Ct(r){return r.type==="user"&&r.toolUseResult!==void 0?{tool_use_result:r.toolUseResult}:{}}function ln(r){let e=r.type==="system"?Zi(r.compactMetadata):void 0,t=_t(r);return{type:r.type,uuid:r.uuid,session_id:r.sessionId??r.session_id??"",message:r.message,parent_tool_use_id:null,parent_agent_id:null,...Mt(r),...Ct(r),...t?{tool_result_meta:t}:{},...typeof r.timestamp=="string"&&r.timestamp.length>0?{timestamp:r.timestamp}:{},...r.type==="system"&&r.subtype?{subtype:r.subtype}:{},...e?{compact_metadata:e}:{}}}function pn(r,e){let t=Math.max(0,e?.offset??0),n=e?.limit;return n!==void 0&&n>0?r.slice(t,t+n):t>0?r.slice(t):r}async function Ve(r){try{return await Ki(sn(r))}catch{return sn(r)}}async function ea(r){return _(await Ve(r))}async function F(r){let e=ue();if(r?.dir){let t=await Ve(r.dir),n=[R(e,_(t))];if(r.includeWorktrees!==!1)try{let{stdout:s}=await Li("git",["worktree","list","--porcelain"],{cwd:r.dir}),o=s.split(`
22
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)n.push(R(e,await ea(i)))}catch{}return n}try{return(await Et(e,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>R(e,n.name))}catch{return[]}}async function hn(r){try{let[e,t]=await Promise.all([Je(r,"utf-8"),le(r)]),n=e.trim().split(`
23
+ `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return M(i)?[i]:[]}catch{return[]}});if(n.length===0)return null;let s=Fi(r,".jsonl");return At(s,n,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function yn(r,e){return R(r,e,"subagents")}function Sn(r){if(typeof r!="object"||r===null)return!1;let e=r;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function wn(r){let e=[];async function t(n){let s;try{s=await Et(n,{withFileTypes:!0})}catch{return}for(let o of s){let i=R(n,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(r),e}async function ta(r){try{let e=await Je(r.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function vn(r){if(r.length===0)return[];let e=new Map(r.map(i=>[i.uuid,i])),t=r[r.length-1],n=[],s=new Set,o=t;for(;o&&!s.has(o.uuid);)s.add(o.uuid),n.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return n.reverse()}async function ra(r,e,t){let[n,s]=await Promise.all([Je(r,"utf-8"),ta(r)]),o=[];for(let p of n.trim().split(`
24
+ `).filter(Boolean))try{let f=JSON.parse(p);Sn(f)&&o.push(f)}catch{}let a=vn(o).map(p=>{let f=_t(p);return{type:p.type,uuid:p.uuid,session_id:p.sessionId??e,message:p.message,parent_tool_use_id:s.parentToolUseId,parent_agent_id:s.parentAgentId,...Mt(p),...Ct(p),...f?{tool_result_meta:f}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function pe(r){return _(await Ve(r??process.cwd()))}function Re(r,e){return{projectKey:r,sessionId:e}}function na(r){return r.map(e=>JSON.stringify(e)).join(`
25
+ `)}function sa(r){let e=0;for(let t of r){if(typeof t.timestamp!="string")continue;let n=Date.parse(t.timestamp);Number.isFinite(n)&&(e=Math.max(e,n))}return e}function oa(r){let e=r.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var ia=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function aa(r){let e=r;for(let t=0;t<10;t+=1){let n=e.normalize("NFKC").replace(ia,"");if(n===e)return n;e=n}return e}var ua=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,ca=/<command-name>(.*?)<\/command-name>/,da=/<bash-input>([\s\S]*?)<\/bash-input>/;function la(r){if(r.length<=200)return r;let e=r.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function pa(r,e){if(r.type!=="user"||r.isMeta===!0||r.isCompactSummary===!0)return;let t=r.message;if(!M(t))return;let n=t.content,s=[];if(typeof n=="string")s.push(n);else if(Array.isArray(n)){for(let o of n)if(M(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&s.push(o.text)}}for(let o of s){let i=o.replaceAll(`
26
+ `," ").trim();if(!i)continue;let a=ca.exec(i);if(a){e.commandFallback??=a[1];continue}let u=da.exec(i);if(u)return`! ${u[1].trim()}`;if(!ua.test(i))return la(i)}}function At(r,e,t,n={}){if(e.length===0)return;let s,o,i,a,u,c,p,f,d,l,m;for(let k of e){let y=k;if(m??=y.isSidechain===!0,l===void 0&&typeof y.timestamp=="string"){let T=Date.parse(y.timestamp);Number.isFinite(T)&&(l=T)}if(!s){let T={commandFallback:o};s=pa(y,T),o=T.commandFallback}y.type==="custom-title"&&typeof y.customTitle=="string"&&(i=y.customTitle),y.type==="ai-title"&&typeof y.aiTitle=="string"&&(a=y.aiTitle),typeof y.lastPrompt=="string"&&(u=y.lastPrompt),typeof y.summary=="string"&&(c=y.summary),y.type==="tag"&&(d=typeof y.tag=="string"&&y.tag?y.tag:void 0),typeof y.gitBranch=="string"&&(p=y.gitBranch),f===void 0&&typeof y.cwd=="string"&&(f=y.cwd),y.type==="relocated"&&typeof y.relocatedCwd=="string"&&(f=y.relocatedCwd)}if(m)return;let S=s??o,g=i||a,h=g||u||c||S;if(h)return{sessionId:r,summary:h,lastModified:t??sa(e),fileSize:n.fileSize,customTitle:g,firstPrompt:S,gitBranch:p,cwd:f||n.defaultCwd,tag:d,createdAt:l}}async function kn(r,e,t){let n=Re(await pe(t),e),s=await r.load(n);return s?{key:n,entries:s}:void 0}async function ma(r){if(r?.sessionStore){let c=r.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let p=await Ve(r.dir??process.cwd()),f=_(p),d=(await c.listSessions(f)).slice().sort((g,h)=>h.mtime-g.mtime),l=Math.max(0,r.offset??0),m=r.limit!==void 0&&r.limit>0?d.slice(l,l+r.limit):l>0?d.slice(l):d;return(await Promise.allSettled(m.map(async({sessionId:g,mtime:h})=>{let k=await c.load(Re(f,g));return k?At(g,k,h,{defaultCwd:p}):void 0}))).flatMap((g,h)=>{if(g.status==="fulfilled")return g.value?[g.value]:[];let k=m[h];return[{sessionId:k.sessionId,summary:"",lastModified:k.mtime}]})}let e=await F(r),n=(await Promise.all(e.map(async c=>{try{return(await Et(c)).filter(f=>f.endsWith(".jsonl")).map(f=>R(c,f))}catch{return[]}}))).flat(),s=await Promise.all(n.map(hn)),o=new Map;for(let c of s){if(!c)continue;let p=o.get(c.sessionId);(!p||c.lastModified>p.lastModified)&&o.set(c.sessionId,c)}let i=Array.from(o.values()).sort((c,p)=>p.lastModified-c.lastModified),a=r?.offset??0,u=r?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function fa(r,e){if(e?.sessionStore){if(!H(r))return;let n=await kn(e.sessionStore,r,e.dir);return n?At(r,n.entries,oa(n.entries)):void 0}let t=await F(e);for(let n of t){let s=R(n,`${r}.jsonl`),o=await hn(s);if(o)return o}}async function ga(r,e){if(!H(r))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let s=await kn(e.sessionStore,r,e.dir);if(!s)return[];let o=na(s.entries),i=cn(on(o),an(o,r));return pn(i.filter(a=>dn(a,t)).map(ln),e)}let n=await F(e);for(let s of n){let o=R(s,`${r}.jsonl`);try{let i=await Je(o,"utf-8"),u=cn(on(i),an(i,r)).filter(c=>dn(c,t)).map(ln);return pn(u,e)}catch{continue}}return[]}async function ha(r,e,t){if(!H(r))throw new Error(`Invalid sessionId: ${r}`);let n=e.trim();if(!n)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(Re(await pe(t.dir),r),[{type:"custom-title",sessionId:r,customTitle:n,uuid:fn(),timestamp:new Date().toISOString()}]);return}let s=await F(t);for(let o of s){let i=R(o,`${r}.jsonl`);try{await le(i);let a=JSON.stringify({type:"custom-title",sessionId:r,customTitle:n,timestamp:new Date().toISOString()});await mn(i,a+`
27
+ `);return}catch{continue}}throw new Error(`Session ${r} not found`)}async function ya(r,e,t){if(!H(r))throw new Error(`Invalid sessionId: ${r}`);let n=e===null?null:aa(e).trim();if(n!==null&&!n)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(Re(await pe(t.dir),r),[{type:"tag",sessionId:r,tag:n??"",uuid:fn(),timestamp:new Date().toISOString()}]);return}let s=await F(t);for(let o of s){let i=R(o,`${r}.jsonl`);try{await le(i);let a=JSON.stringify({type:"tag",sessionId:r,tag:n??"",timestamp:new Date().toISOString()});await mn(i,a+`
28
+ `);return}catch{continue}}throw new Error(`Session ${r} not found`)}async function Sa(r,e){if(e?.sessionStore){if(!H(r))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let n=await e.sessionStore.listSubkeys({projectKey:await pe(e.dir),sessionId:r});return Array.from(new Set(n.map(s=>{if(!s.startsWith("subagents/"))return;let o=s.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(s=>s!==void 0)))}let t=await F(e);for(let n of t){let s=R(n,`${r}.jsonl`);try{await le(s);let o=await wn(yn(n,r));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function wa(r,e,t){if(t?.sessionStore){if(!H(r)||!e)return[];let s=await pe(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:s,sessionId:r}),m=`agent-${e}`,S=l.find(g=>g.startsWith("subagents/")&&g.split("/").at(-1)===m);if(!S)return[];o=S}let i=await t.sessionStore.load({projectKey:s,sessionId:r,subpath:o});if(!i)return[];let a=i.filter(Sn),u=i.filter(l=>l.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,p=typeof u?.parentAgentId=="string"?u.parentAgentId:null,f=vn(a).map(l=>{let m=_t(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??r,message:l.message,parent_tool_use_id:c,parent_agent_id:p,...Mt(l),...Ct(l),...m?{tool_result_meta:m}:{}}}),d=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(d,d+t.limit):f.slice(d)}let n=await F(t);for(let s of n){let o=R(s,`${r}.jsonl`);try{await le(o);let a=(await wn(yn(s,r))).find(u=>u.agentId===e);return a?await ra(a.filePath,r,t):[]}catch{continue}}return[]}async function va(r,e){if(!H(r))throw new Error(`Invalid sessionId: ${r}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(Re(await pe(e.dir),r));return}let t=await F(e);for(let n of t){let s=R(n,`${r}.jsonl`);try{await le(s),await Promise.all([nn(s,{force:!0}),nn(R(n,r),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${r} not found`)}import{randomUUID as Ye}from"crypto";import{readdir as ka,readFile as ba,realpath as Ra,stat as bn,writeFile as Ta}from"fs/promises";import{dirname as Pa,join as xt,resolve as Ea}from"path";var Rn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,_a=new Set(["user","assistant","attachment","system","progress"]);async function Pn(r){let e=Ea(r);try{return await Ra(e)}catch{return e}}async function Ma(r,e){let t=ue();if(e){let s=_(await Pn(e)),o=xt(t,s,`${r}.jsonl`);try{if((await bn(o)).size>0)return o}catch{}return}let n;try{n=await ka(t,{withFileTypes:!0})}catch{return}for(let s of n){if(!s.isDirectory()&&!s.isSymbolicLink())continue;let o=xt(t,s.name,`${r}.jsonl`);try{if((await bn(o)).size>0)return o}catch{}}}function En(r,e){let t=[],n=[],s;for(let o of r){if(o===null||typeof o!="object")continue;let i=o;if(typeof i.type=="string"&&_a.has(i.type)&&typeof i.uuid=="string"){t.push(i);continue}if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){n.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(s=i.relocatedCwd)}return{transcript:t,contentReplacements:n,relocatedCwd:s}}function Ca(r,e){let t=[];for(let n of r.split(`
29
+ `))if(n.trim())try{t.push(JSON.parse(n))}catch{}return En(t,e)}function Aa(r){for(let e of r){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let n=t.message;if(n===null||typeof n!="object")continue;let s=n.content;if(typeof s=="string"&&s.trim())return s.trim();if(!Array.isArray(s)||s.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=s.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
30
+ `).trim();if(o)return o}}function xa(r){let e,t;for(let n of r){if(n===null||typeof n!="object")continue;let s=n;typeof s.customTitle=="string"&&s.customTitle&&(e=s.customTitle),typeof s.aiTitle=="string"&&s.aiTitle&&(t=s.aiTitle)}return e??t??Aa(r)}function Tn(r,e,t,n){let s=r.transcript.filter(d=>d.isSidechain!==!0);if(s.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=s.findIndex(l=>l.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);s=s.slice(0,d+1)}let o=new Map(s.map(d=>[d.uuid,Ye()])),i=s.filter(d=>d.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(s.map(d=>[d.uuid,d])),u=Ye(),c=new Date().toISOString(),p=i.map((d,l)=>{let m=null,S=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;S;){let k=a.get(S);if(!k)break;if(k.type!=="progress"){m=o.get(S)??null;break}S=typeof k.parentUuid=="string"?k.parentUuid:void 0}let g=typeof d.logicalParentUuid=="string"?o.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,h={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(d.uuid),parentUuid:m,logicalParentUuid:g,sessionId:u,timestamp:l===i.length-1?c:typeof d.timestamp=="string"?d.timestamp:c,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete h.teamName,delete h.agentName,delete h.sessionKind,delete h.slug,delete h.sourceToolAssistantUUID,h});r.contentReplacements.length>0&&p.push({type:"content-replacement",sessionId:u,replacements:r.contentReplacements,uuid:Ye(),timestamp:c}),r.relocatedCwd&&p.push({type:"relocated",sessionId:u,relocatedCwd:r.relocatedCwd});let f=t.title?.trim();return p.push({type:"custom-title",sessionId:u,customTitle:f||`${xa(n)??"Forked session"} (fork)`,uuid:Ye(),timestamp:c}),{sessionId:u,entries:p}}async function Ia(r,e={}){if(!Rn.test(r))throw new Error(`Invalid sessionId: ${r}`);if(e.upToMessageId&&!Rn.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Pn(e.dir??process.cwd()),a=_(i),u=await e.sessionStore.load({projectKey:a,sessionId:r});if(!u?.length)throw new Error(`Session ${r} not found`);let c=Tn(En(u,r),r,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Ma(r,e.dir);if(!t)throw new Error(`Session ${r} not found`);let n=await ba(t,"utf8"),s=n.split(`
31
+ `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Tn(Ca(n,r),r,e,s);return await Ta(xt(Pa(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
32
32
  `)}
33
- `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function We(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}var _t=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=We(e),n=this.entries.get(r)??[];n.push(...t),this.entries.set(r,n),this.keys.set(r,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(r,o)}async load(e){let t=this.entries.get(We(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[r,n]of this.keys)n.projectKey!==e||n.subpath!==void 0||t.push({sessionId:n.sessionId,mtime:this.modifiedAt.get(r)??0});return t.sort((r,n)=>n.mtime-r.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(We(e));return}for(let[t,r]of this.keys)r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let r of this.keys.values())r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&r.subpath!==void 0&&t.push(r.subpath);return t.sort()}getEntries(e){return[...this.entries.get(We(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as ya}from"fs";import{readdir as wr,readFile as Sa,realpath as va,stat as yr}from"fs/promises";import{basename as Sr,dirname as wa,join as we,relative as ka,resolve as ba,sep as Pa}from"path";import{createInterface as Ra}from"readline";var Ta=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ea=500,_a=1024*1024;async function Ma(s){let e=ba(s);try{return await va(e)}catch{return e}}async function Ca(s,e){let t=ae();if(e){let n=T(await Ma(e)),o=we(t,n,`${s}.jsonl`);try{if((await yr(o)).size>0)return{filePath:o,projectKey:n}}catch{}return}let r;try{r=await wr(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=we(t,n.name,`${s}.jsonl`);try{if((await yr(o)).size>0)return{filePath:o,projectKey:n.name}}catch{}}}async function Aa(s){let e=[];async function t(r){let n;try{n=await wr(r,{withFileTypes:!0})}catch{return}n.sort((o,i)=>o.name.localeCompare(i.name));for(let o of n){let i=we(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(s),e}async function vr(s,e,t,r){let n=Ra({input:ya(s,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of n){if(!a.trim())continue;let c;try{c=JSON.parse(a)}catch(u){console.warn(`importSessionToStore: skipping unparseable line in ${s}: ${String(u)}`);continue}if(c===null||typeof c!="object"){console.warn(`importSessionToStore: skipping non-object line in ${s}`);continue}o.push(c),i+=Buffer.byteLength(a),(o.length>=r||i>=_a)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function xa(s,e,t={}){if(!Ta.test(s))throw new Error(`Invalid sessionId: ${s}`);let r=await Ca(s,t.dir);if(!r)throw new Error(`Session ${s} not found`);let n=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Ea;if(await vr(r.filePath,{projectKey:r.projectKey,sessionId:s},e,n),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=we(o,"subagents");for(let a of await Aa(i)){let u=ka(o,a).split(Pa);u[u.length-1]=Sr(u[u.length-1],".jsonl");let p={projectKey:r.projectKey,sessionId:s,subpath:u.join("/")};await vr(a,p,e,n);let f=we(wa(a),`${Sr(a,".jsonl")}.meta.json`);try{let d=JSON.parse(await Sa(f,"utf8"));await e.append(p,[{type:"agent_metadata",...d}])}catch(d){if(typeof d=="object"&&d!==null&&"code"in d&&d.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(d)}`)}}}import{spawn as Ia}from"child_process";async function Da(s){let e=s?.cliPath??le(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let r=await pe(e,t,s?.env);return JSON.parse(r.stdout).map(o=>({id:o.id,name:o.name,source:o.source,path:o.installPath??o.path,version:o.version??"unknown",scope:o.scope,enabled:o.enabled,canDisable:o.canDisable,displayName:o.displayName,description:o.description,installedAt:o.installedAt,lastUpdated:o.lastUpdated,resources:o.resources}))}async function Oa(s,e){let t=e?.cliPath??le(),r=await pe(t,["plugins","enable",s,"--scope","user"],e?.env);r.exitCode!==0&&ke(r)}async function ja(s,e){let t=e?.cliPath??le(),r=await pe(t,["plugins","disable",s,"--scope","user"],e?.env);r.exitCode!==0&&ke(r)}async function Na(s,e){let t=e?.cliPath??le(),r=await pe(t,["plugins","install",s,"--scope","user","--json"],e?.env);r.exitCode!==0&&ke(r);let n=JSON.parse(r.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function Ka(s,e){let t=e?.cliPath??le(),r=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&r.push("--keep-data");let n=await pe(t,r,e?.env);n.exitCode!==0&&ke(n);let o=JSON.parse(n.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function Ua(s,e){let t=e?.cliPath??le(),r;try{r=await pe(t,["plugins","validate",s,"--json"],e?.env,e?.signal)}catch(o){if(e?.signal?.aborted||o instanceof Error&&o.name==="AbortError")throw new j("Plugin validation was aborted");let i=o instanceof Error?o.message:String(o);throw F("plugin_validation_failed",`Failed to run qodercli plugin validation: ${i}`)}let n;try{n=JSON.parse(r.stdout)}catch{let o=Fa(`${r.stderr}
34
- ${r.stdout}`);throw F(o?"plugin_validation_unsupported":"plugin_validation_protocol_error",o?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(n&&typeof n=="object"&&"ok"in n&&n.schemaVersion!==1)throw F("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(n&&typeof n=="object"&&n.ok===!0&&n.report){let o=n.report;if(qa(o))return o;throw F("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(n&&typeof n=="object"&&n.ok===!1){let o=n.error;if(!o||typeof o!="object"||typeof o.code!="string"||typeof o.message!="string")throw F("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let i=o;throw F(i.code,i.message)}throw r.exitCode!==0&&ke(r),F("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function Fa(s){return/unknown option[^\n]*--json/i.test(s)||/unknown command[^\n]*validate/i.test(s)}function le(){return X()}var kr=3e4;function pe(s,e,t,r){return new Promise((n,o)=>{let i=Ia(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"],signal:r}),a="",c="",u=!1,p=setTimeout(()=>{u||(u=!0,i.kill("SIGTERM"),o(new Error(`qodercli subprocess timed out after ${kr}ms`)))},kr);i.stdout.on("data",f=>{a+=f.toString()}),i.stderr.on("data",f=>{c+=f.toString()}),i.on("error",f=>{u||(u=!0,clearTimeout(p),o(f))}),i.on("close",f=>{u||(u=!0,clearTimeout(p),n({stdout:a,stderr:c,exitCode:f??1}))})})}function ke(s){let e="plugin_operation_failed",t=s.stderr||s.stdout;try{let r=JSON.parse(s.stdout);r.error&&r.code?(e=r.code,t=r.message??t):r.ok===!1&&r.error&&(e=r.error.code??e,t=r.error.message??t)}catch{}throw F(e,t)}function F(s,e){let t=new Error(e);return t.code=s,t}function qa(s){if(!s||typeof s!="object")return!1;let e=s;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(r=>r!==null&&typeof r=="object"&&(r.severity==="error"||r.severity==="warning")&&typeof r.code=="string"&&typeof r.message=="string"&&typeof r.phase=="string"&&t.has(r.phase)&&(r.location===void 0||r.location!==null&&typeof r.location=="object"&&typeof r.location.path=="string"))}import{execFile as $a}from"child_process";function La(){return X()}async function Qa(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??La(),r=e?.timeout??6e4,n=["feedback","-c",s.content,"--json"];if(e?.storageDir&&n.push("--storage-dir",e.storageDir),s.sessionId&&n.push("-s",s.sessionId),s.workdir&&n.push("--workdir",s.workdir),s.email&&n.push("--email",s.email),s.include)for(let o of s.include)n.push("--include",o);if(s.imagePaths)for(let o of s.imagePaths)n.push("--images",o);if(s.callerVersion&&n.push("--caller-version",s.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&n.push("--ide-type",o)}return new Promise(o=>{$a(t,n,{env:e?.env??process.env,timeout:r,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let u=JSON.parse(c);o({success:!!u.success,message:u.success?u.message||"Feedback submitted successfully":u.error||u.message||"Failed to submit feedback",requestId:u.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}var Pr={};Er(Pr,{filterEscalatingDefaultMode:()=>br});var za=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function br(s){let e=s.effective.permissions?.defaultMode;if(!e||!za.has(e))return s.effective;for(let t=s.sources.length-1;t>=0;t-=1){let r=s.sources[t];if(r.settings.permissions?.defaultMode!==void 0){if(r.source==="project"){let{defaultMode:n,...o}=s.effective.permissions??{};return{...s.effective,permissions:o}}return s.effective}}return s.effective}export{j as AbortError,Ee as AuthAccessTokenEnvVarError,_e as AuthServiceAccountEnvVarError,Kt as DEFAULT_ACCESS_TOKEN_ENV_VAR,Xe as DEFAULT_RUNTIME_TRANSPORT,Te as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Mr as EXIT_REASONS,_r as HOOK_EVENTS,_t as InMemorySessionStore,ge as ModelPolicyTimeoutError,ee as ProcessTransport,me as ProtocolVersionMismatchError,Z as QoderCliProcessError,z as QoderWorkerRuntimeError,he as UnsupportedCliCapabilityError,ot as WIRE_PROTOCOL_VERSION,se as WorkerTransport,Or as accessToken,jr as accessTokenFromEnv,Pr as coreTypes,vi as createSdkMcpServer,na as deleteSession,ja as disablePlugin,Oa as enablePlugin,br as filterEscalatingDefaultMode,ha as forkSession,Xi as getSessionInfo,Zi as getSessionMessages,ra as getSubagentMessages,jn as hasResolvableQoderWorkerRuntime,xa as importSessionToStore,Na as installPlugin,Fr as jobToken,Da as listPlugins,Yi as listSessions,sa as listSubagents,Nr as qodercliAuth,ht as query,ea as renameSession,nt as resolveQoderWorkerRuntimePath,yi as resolveSettings,Kr as serviceAccount,Ur as serviceAccountFromEnv,ni as startup,Qa as submitFeedback,ta as tagSession,wi as tool,Ka as uninstallPlugin,Ua as validatePlugin};
33
+ `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Xe(r){return JSON.stringify([r.projectKey,r.sessionId,r.subpath??null])}var It=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let n=Xe(e),s=this.entries.get(n)??[];s.push(...t),this.entries.set(n,s),this.keys.set(n,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(n,o)}async load(e){let t=this.entries.get(Xe(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[n,s]of this.keys)s.projectKey!==e||s.subpath!==void 0||t.push({sessionId:s.sessionId,mtime:this.modifiedAt.get(n)??0});return t.sort((n,s)=>s.mtime-n.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Xe(e));return}for(let[t,n]of this.keys)n.projectKey===e.projectKey&&n.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let n of this.keys.values())n.projectKey===e.projectKey&&n.sessionId===e.sessionId&&n.subpath!==void 0&&t.push(n.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Xe(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as Oa}from"fs";import{readdir as An,readFile as Da,realpath as ja,stat as _n}from"fs/promises";import{basename as Mn,dirname as Na,join as Te,relative as Ka,resolve as Fa,sep as Ua}from"path";import{createInterface as qa}from"readline";var La=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,$a=500,Qa=1024*1024;async function Ba(r){let e=Fa(r);try{return await ja(e)}catch{return e}}async function za(r,e){let t=ue();if(e){let s=_(await Ba(e)),o=Te(t,s,`${r}.jsonl`);try{if((await _n(o)).size>0)return{filePath:o,projectKey:s}}catch{}return}let n;try{n=await An(t,{withFileTypes:!0})}catch{return}for(let s of n){if(!s.isDirectory()&&!s.isSymbolicLink())continue;let o=Te(t,s.name,`${r}.jsonl`);try{if((await _n(o)).size>0)return{filePath:o,projectKey:s.name}}catch{}}}async function Wa(r){let e=[];async function t(n){let s;try{s=await An(n,{withFileTypes:!0})}catch{return}s.sort((o,i)=>o.name.localeCompare(i.name));for(let o of s){let i=Te(n,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(r),e}async function Cn(r,e,t,n){let s=qa({input:Oa(r,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of s){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${r}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${r}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=n||i>=Qa)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Ha(r,e,t={}){if(!La.test(r))throw new Error(`Invalid sessionId: ${r}`);let n=await za(r,t.dir);if(!n)throw new Error(`Session ${r} not found`);let s=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:$a;if(await Cn(n.filePath,{projectKey:n.projectKey,sessionId:r},e,s),t.includeSubagents===!1)return;let o=n.filePath.replace(/\.jsonl$/,""),i=Te(o,"subagents");for(let a of await Wa(i)){let c=Ka(o,a).split(Ua);c[c.length-1]=Mn(c[c.length-1],".jsonl");let p={projectKey:n.projectKey,sessionId:r,subpath:c.join("/")};await Cn(a,p,e,s);let f=Te(Na(a),`${Mn(a,".jsonl")}.meta.json`);try{let d=JSON.parse(await Da(f,"utf8"));await e.append(p,[{type:"agent_metadata",...d}])}catch(d){if(typeof d=="object"&&d!==null&&"code"in d&&d.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(d)}`)}}}import{spawn as Ga}from"node:child_process";import{existsSync as Ja}from"node:fs";import{Worker as Va}from"node:worker_threads";var Ot=3e4;async function xn(r,e={}){let t=We({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ge);return t.transport==="worker"?Xa(r,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Ya(r,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??X()})}function Ya(r,e){return new Promise((t,n)=>{let s=Ga(e.pathToQoderCLIExecutable,r,{cwd:e.cwd,env:In(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,s.kill("SIGTERM"),n(On(e.timeoutMs)))},e.timeoutMs??Ot);s.stdout.on("data",c=>{o+=c.toString()}),s.stderr.on("data",c=>{i+=c.toString()}),s.on("error",c=>{a||(a=!0,clearTimeout(u),n(c))}),s.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function Xa(r,e){eu(e.signal);let t=re(e.pathToQoderWorkerRuntime),n=await je(t);Za(n);let s=e.cwd??process.cwd(),o=In(e.env);delete o.NODE_OPTIONS;let i=Ne(n,{cwd:s,env:o});return new Promise((a,u)=>{let c=new Va(n.runtimePath,{argv:r,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),p="",f="",d=!1,l,m=c.stdout===null,S=c.stderr===null,g=()=>{clearTimeout(T),e.signal?.removeEventListener("abort",y)},h=P=>{d||(d=!0,g(),u(P))},k=()=>{d||l===void 0||!m||!S||(d=!0,g(),a({stdout:p,stderr:f,exitCode:l}))},y=()=>{c.terminate(),h(Dn(e.signal))},T=setTimeout(()=>{c.terminate(),h(On(e.timeoutMs))},e.timeoutMs??Ot);c.stdin?.end(),c.stdout?.on("data",P=>{p+=P.toString()}),c.stdout?.on("end",()=>{m=!0,k()}),c.stderr?.on("data",P=>{f+=P.toString()}),c.stderr?.on("end",()=>{S=!0,k()}),c.once("error",h),c.once("exit",P=>{l=P,k()}),e.signal?.addEventListener("abort",y,{once:!0}),e.signal?.aborted&&y()})}function In(r){let e={...process.env,...r},t={};for(let[n,s]of Object.entries(e))s!==void 0&&(t[n]=s);return t}function Za(r){if(!Ja(r.runtimePath))throw new Error(`Qoder worker runtime not found: ${r.runtimePath}`)}function On(r){return new Error(`qodercli subprocess timed out after ${r??Ot}ms`)}function eu(r){if(r?.aborted)throw Dn(r)}function Dn(r){if(r?.reason instanceof Error)return r.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function tu(r){let e=["plugins","list","--json"];r?.orgId&&e.push("--org-id",r.orgId);let t=await me(e,r);return JSON.parse(t.stdout).map(s=>({id:s.id,name:s.name,source:s.source,path:s.installPath??s.path,version:s.version??"unknown",scope:s.scope,enabled:s.enabled,canDisable:s.canDisable,displayName:s.displayName,description:s.description,installedAt:s.installedAt,lastUpdated:s.lastUpdated,resources:s.resources}))}async function ru(r,e){let t=await me(["plugins","enable",r,"--scope","user"],e);t.exitCode!==0&&Pe(t)}async function nu(r,e){let t=await me(["plugins","disable",r,"--scope","user"],e);t.exitCode!==0&&Pe(t)}async function su(r,e){let t=await me(["plugins","install",r,"--scope","user","--json"],e);t.exitCode!==0&&Pe(t);let n=JSON.parse(t.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function ou(r,e){let t=["plugins","uninstall",r,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let n=await me(t,e);n.exitCode!==0&&Pe(n);let s=JSON.parse(n.stdout);return{pluginId:s.pluginId,fullyRemoved:s.fullyRemoved,reverseDependents:s.reverseDependents??[]}}async function iu(r,e){let t;try{t=await me(["plugins","validate",r,"--json"],e)}catch(s){if(e?.signal?.aborted||s instanceof Error&&s.name==="AbortError")throw new A("Plugin validation was aborted");let o=s instanceof Error?s.message:String(s);throw U("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let n;try{n=JSON.parse(t.stdout)}catch{let s=au(`${t.stderr}
34
+ ${t.stdout}`);throw U(s?"plugin_validation_unsupported":"plugin_validation_protocol_error",s?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(n&&typeof n=="object"&&"ok"in n&&n.schemaVersion!==1)throw U("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(n&&typeof n=="object"&&n.ok===!0&&n.report){let s=n.report;if(cu(s))return s;throw U("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(n&&typeof n=="object"&&n.ok===!1){let s=n.error;if(!s||typeof s!="object"||typeof s.code!="string"||typeof s.message!="string")throw U("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=s;throw U(o.code,o.message)}throw t.exitCode!==0&&Pe(t),U("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function au(r){return/unknown option[^\n]*--json/i.test(r)||/unknown command[^\n]*validate/i.test(r)}var uu=3e4;function me(r,e){return xn(r,{pathToQoderCLIExecutable:e?.cliPath,env:e?.env,signal:e?.signal,timeoutMs:uu})}function Pe(r){let e="plugin_operation_failed",t=r.stderr||r.stdout;try{let n=JSON.parse(r.stdout);n.error&&n.code?(e=n.code,t=n.message??t):n.ok===!1&&n.error&&(e=n.error.code??e,t=n.error.message??t)}catch{}throw U(e,t)}function U(r,e){let t=new Error(e);return t.code=r,t}function cu(r){if(!r||typeof r!="object")return!1;let e=r;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(n=>n!==null&&typeof n=="object"&&(n.severity==="error"||n.severity==="warning")&&typeof n.code=="string"&&typeof n.message=="string"&&typeof n.phase=="string"&&t.has(n.phase)&&(n.location===void 0||n.location!==null&&typeof n.location=="object"&&typeof n.location.path=="string"))}import{execFile as du}from"child_process";function lu(){return X()}async function pu(r,e){if(!r.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??lu(),n=e?.timeout??6e4,s=["feedback","-c",r.content,"--json"];if(e?.storageDir&&s.push("--storage-dir",e.storageDir),r.sessionId&&s.push("-s",r.sessionId),r.workdir&&s.push("--workdir",r.workdir),r.email&&s.push("--email",r.email),r.include)for(let o of r.include)s.push("--include",o);if(r.imagePaths)for(let o of r.imagePaths)s.push("--images",o);if(r.callerVersion&&s.push("--caller-version",r.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&s.push("--ide-type",o)}return new Promise(o=>{du(t,s,{env:e?.env??process.env,timeout:n,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var Kn={};Ln(Kn,{filterEscalatingDefaultMode:()=>jn,isBashToolBackgroundLaunchResult:()=>Nn});var mu=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function jn(r){let e=r.effective.permissions?.defaultMode;if(!e||!mu.has(e))return r.effective;for(let t=r.sources.length-1;t>=0;t-=1){let n=r.sources[t];if(n.settings.permissions?.defaultMode!==void 0){if(n.source==="project"){let{defaultMode:s,...o}=r.effective.permissions??{};return{...r.effective,permissions:o}}return r.effective}}return r.effective}function Nn(r){if(r===null||typeof r!="object"||Array.isArray(r))return!1;let e=r,t=o=>o===void 0||typeof o=="string",n=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,s=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&n(e.totalLines)&&n(e.totalBytes)&&(s===void 0||s==="user"||s==="model"||s==="timeout"||s==="auto")}export{A as AbortError,Ce as AuthAccessTokenEnvVarError,Ae as AuthServiceAccountEnvVarError,Qt as DEFAULT_ACCESS_TOKEN_ENV_VAR,ge as DEFAULT_RUNTIME_TRANSPORT,Me as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Qn as EXIT_REASONS,$n as HOOK_EVENTS,It as InMemorySessionStore,ye as ModelPolicyTimeoutError,ee as ProcessTransport,Se as ProtocolVersionMismatchError,Z as QoderCliProcessError,Q as QoderWorkerRuntimeError,we as UnsupportedCliCapabilityError,ct as WIRE_PROTOCOL_VERSION,ne as WorkerTransport,Jn as accessToken,Vn as accessTokenFromEnv,Kn as coreTypes,ji as createSdkMcpServer,va as deleteSession,nu as disablePlugin,ru as enablePlugin,jn as filterEscalatingDefaultMode,Ia as forkSession,fa as getSessionInfo,ga as getSessionMessages,wa as getSubagentMessages,fr as hasResolvableQoderWorkerRuntime,Ha as importSessionToStore,su as installPlugin,Nn as isBashToolBackgroundLaunchResult,es as jobToken,tu as listPlugins,ma as listSessions,Sa as listSubagents,Yn as qodercliAuth,vt as query,ha as renameSession,re as resolveQoderWorkerRuntimePath,Oi as resolveSettings,Xn as serviceAccount,Zn as serviceAccountFromEnv,vi as startup,pu as submitFeedback,ya as tagSession,Ni as tool,ou as uninstallPlugin,iu as validatePlugin};