@qoder-ai/qoder-agent-sdk 1.0.16 → 1.0.19
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/README.md +48 -44
- package/dist/auth.d.ts +5 -2
- package/dist/core/brand.d.ts +22 -0
- package/dist/core/constants.d.ts +16 -6
- package/dist/core/runtime-launch-options.d.ts +7 -0
- package/dist/core/runtime-selection.d.ts +24 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +26 -26
- package/dist/protocol/common.d.ts +27 -0
- package/dist/protocol/control.d.ts +5 -1
- package/dist/protocol/hooks.d.ts +2 -1
- package/dist/protocol/index.d.ts +1 -1
- package/dist/protocol/index.js +1 -1
- package/dist/protocol/messages.d.ts +6 -0
- package/dist/query/query-runner.d.ts +4 -2
- package/dist/runtime-manifest.json +10 -2
- package/dist/session/transcript-paths.d.ts +3 -3
- package/dist/types/auth.d.ts +27 -2
- package/dist/types/common.d.ts +1 -1
- package/dist/types/control.d.ts +12 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/options.d.ts +14 -1
- package/dist/types/tools.d.ts +58 -2
- package/package.json +4 -55
- package/scripts/postinstall.cjs +127 -135
package/dist/index.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
var nr=Object.defineProperty;var or=(s,e)=>{for(var t in e)nr(s,t,{get:e[t],enumerable:!0})};import{spawn as Mr}from"child_process";import{createInterface as Er}from"readline";var ir=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],ar=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"];var lt="1.0.16";var pt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TodoWrite","WebFetch","WebSearch","Write"];import{chmod as gt,mkdtemp as dr,rm as mt,writeFile as lr}from"fs/promises";import{existsSync as Ue,mkdtempSync as pr,readFileSync as fr,rmSync as gr,writeFileSync as mr}from"fs";import{tmpdir as ht}from"os";import{dirname as bt,join as A}from"path";import{fileURLToPath as hr}from"url";var cr=/^[A-Za-z0-9_-]{1,64}$/,ur=new Set(["mcp_list","mcp_get","mcp_call"]);function De(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(!cr.test(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(ur.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function je(s,e){let t={};for(let r of e)De(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 Ne(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=je(s,t);return{...n,...o?{toolOverrides:o}:{}}}function ft(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]=Ne(t,r,n)}return e}var yt="QODER_AGENT_SDK_ENTRYPOINT",St="QODER_AGENT_SDK_VERSION",wt="QODER_SDK_AUTH_PAYLOAD_FILE",yr="sdk-ts",Sr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],wr=hr(import.meta.url),vt=bt(wr),Ke=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"}};function Rt(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function Tt(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=vr();if(s)return s;let e=kr();return Ue(e)?e:"qodercli"}function vr(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Mt()){let t=A(e,"dist","_bundled",s);if(Ue(t))return t}return null}function kr(){let s=process.platform==="win32"?"qodercli.exe":"qodercli";for(let e of Mt()){let t=[A(e,"node_modules",".bin",s),A(e,"..","..",".bin",s)];for(let r of t)if(Ue(r))return r}return"qodercli"}function Mt(){let s=[A(vt,".."),A(vt,"..","..")];return[...new Set(s)]}function Pr(){return{allow:[],ask:[],deny:[]}}function kt(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function br(s,e){if(e.startsWith("mcp__"))return e;let t=kt(s),r=e==="*"?"*":kt(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function Pt(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 Rr(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 H=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{gr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=bt(this.authPayloadPath);try{await mt(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);if(delete t[yt],delete t[St],delete t[wt],t[yt]=yr,t[St]=lt,this.authPayloadPath&&(t[wt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Sr)t[r]=this.options.proxy;return 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.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??[...pt];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?Rr(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]:[];Pt(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]=Ne(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=Pr(),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=br(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]]:[];Pt(o,t[n]),r[n]=o}}readSettingsFile(e){let t=fr(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=pr(A(ht(),"qoder-agent-sdk-settings-"));let t=A(this.generatedSettingsDir,"settings.json");return mr(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await dr(A(ht(),"qoder-sdk-auth-"));try{await gt(r,448);let n=A(r,"payload.json");return await lr(n,JSON.stringify(t),{mode:384}),await gt(n,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${n}`),n}catch(n){throw await mt(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",hostTokenCallback:!0}}}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 Ke(t);return r}};function fe(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var _r=41,Et=8192,B=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}},W=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 H(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(fe(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;let d=this.createProcessExitError(a,c);d&&(this.processExitError=d),this.cleanupAuthPayload().catch(()=>{})})}else this.process=Mr(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===_r&&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 dr=Object.defineProperty;var lr=(s,e)=>{for(var t in e)dr(s,t,{get:e[t],enumerable:!0})};import{spawn as Qr}from"child_process";import{createInterface as zr}from"readline";var pr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],fr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Se=2e3,St=5e3;var vt="1.0.19";var F=41,ht=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","WebFetch","WebSearch","Write"],yt=["TaskCreate","TaskGet","TaskUpdate","TaskList"],mr="QODER_FEATURE_TASKS";function wt(s){let e=s[mr];if(e!=="0"&&e!=="false")return[...ht];let t=new Set(yt);return ht.flatMap(r=>r===yt[0]?["TodoWrite"]:t.has(r)?[]:[r])}import{chmod as bt,mkdtemp as Tr,rm as Rt,writeFile as Er}from"fs/promises";import{existsSync as Pe,mkdtempSync as _r,readFileSync as Mr,rmSync as Cr,writeFileSync as Ar}from"fs";import{homedir as xr,tmpdir as Tt}from"os";import{dirname as It,join as A}from"path";import{fileURLToPath as Ir}from"url";var gr=/^[A-Za-z0-9_-]{1,64}$/,hr=new Set(["mcp_list","mcp_get","mcp_call"]);function $e(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(!gr.test(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(hr.has(e.exposedName))throw new Error(`MCP tool "${s}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Le(s,e){let t={};for(let r of e)$e(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 Qe(s,e,t=e.tools??[]){let{tools:r,...n}=e,o=Le(s,t);return{...n,...o?{toolOverrides:o}:{}}}function kt(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]=Qe(t,r,n)}return e}var yr="global",Sr=yr==="cn",w=Sr?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",configDirEnv:"QODERCN_CONFIG_DIR",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",configDirEnv:"QODER_CONFIG_DIR",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Pt=w.accessTokenEnv,ve=w.serviceAccountEnv;function vr(s){return{type:"accessToken",accessToken:s}}function wr(s=Pt){return{type:"accessToken",accessToken:{envVar:s}}}function kr(){return{type:"qodercli"}}function Pr(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 br(s=ve){return{type:"serviceAccount",serviceAccountKey:{envVar:s}}}function Rr(s){return{type:"jobToken",fetchJobToken:s}}var Et="QODER_AGENT_SDK_ENTRYPOINT",_t="QODER_AGENT_SDK_VERSION",Mt="QODER_SDK_AUTH_PAYLOAD_FILE",Or="sdk-ts",Dr=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],jr=Ir(import.meta.url),Ct=It(jr),we=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"}},ke=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 Ot(s){return/\.(js|mjs|tsx?|jsx)$/.test(s)}function G(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let s=Nr();if(s)return s;let e=Kr();if(Pe(e))return e;let t=Ur();return t||w.cliCommands[0]}function Nr(){for(let s of Dt())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=A(s,"dist","_bundled",t);if(Pe(r))return r}return null}function Kr(){for(let s of Dt())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=[A(s,"node_modules",".bin",t),A(s,"..","..",".bin",t)];for(let n of r)if(Pe(n))return n}return w.cliCommands[0]}function Ur(){let s=process.env[w.cliHomeEnv]??xr();for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=A(s,w.configDirName,"local",t);if(Pe(r))return r}return null}function Dt(){let s=[A(Ct,".."),A(Ct,"..","..")];return[...new Set(s)]}function Fr(){return{allow:[],ask:[],deny:[]}}function At(s){return s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function qr(s,e){if(e.startsWith("mcp__"))return e;let t=At(s),r=e==="*"?"*":At(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${s}" and tool "${e}"`);return`mcp__${t}__${r}`}function xt(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 $r(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 J=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{Cr(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=It(this.authPayloadPath);try{await Rt(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[Et],delete t[_t],delete t[Mt];for(let r of this.serviceAccountCredentialEnvVars())Lr(t,r);if(t[Et]=Or,t[_t]=vt,this.authPayloadPath&&(t[Mt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let r of Dr)t[r]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[ve];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.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??wt(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?$r(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]:[];xt(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]=Qe(r,n,o)}return t}collectMcpPolicyPermissionRules(){let e=Fr(),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=qr(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]]:[];xt(o,t[n]),r[n]=o}}readSettingsFile(e){let t=Mr(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=_r(A(Tt(),"qoder-agent-sdk-settings-"));let t=A(this.generatedSettingsDir,"settings.json");return Ar(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await Tr(A(Tt(),"qoder-sdk-auth-"));try{await bt(r,448);let n=A(r,"payload.json");return await Er(n,JSON.stringify(t),{mode:384}),await bt(n,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${n}`),n}catch(n){throw await Rt(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 ke(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 we(t);return r}};function Lr(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 be(s,e){let t={...s};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}var jt=8192,V=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}},Y=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 J(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new s(be(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===F&&this.fireAuthExpired();let d=this.createProcessExitError(a,c);d&&(this.processExitError=d),this.cleanupAuthPayload().catch(()=>{})})}else this.process=Qr(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===F&&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(`
|
|
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=Er({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??2e3,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},5e3);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>Et&&(this.stderrTail=this.stderrTail.slice(-Et))}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 B(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==0&&e!==null)return new B(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new B(`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??Tt();if(Rt(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 Cr(){switch("process"){case"worker":return"worker";case"process":return"process"}return"process"}var Fe=Cr();function _t(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function ge(s,e){return s.create(e)}import{existsSync as He}from"fs";import{createInterface as Vr}from"readline";import{dirname as Yr,join as U}from"path";import{fileURLToPath as Xr}from"url";import{Worker as Zr}from"worker_threads";import{createHash as xr}from"node:crypto";import{existsSync as Ir}from"node:fs";import{chmod as Ar,lstat as Or,mkdir as re,readFile as Ct,readdir as Dr,readlink as jr,rename as Nr,rm as me,stat as Kr,symlink as Ur,writeFile as xt}from"node:fs/promises";import{tmpdir as qr,userInfo as Fr}from"node:os";import{basename as It,dirname as J,join as _,relative as $r}from"node:path";var Lr="QODER_WORKER_RUNTIME_ASSET_ROOT",At=/(^|[\\/])app\.asar([\\/]|$)/,Le=".qoder-worker-runtime-ready";function Ot(s){return At.test(s)}function zr(s){return Ot(s)?s.replace(At,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function Dt(s,e={}){let t=zr(s);if(!e.forceMaterialize&&t){let c=J(t);if(Ir(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),$e(t,c,!1,J(s))}if(!(e.forceMaterialize||Ot(s))){let c=J(s);return $e(s,c,!1)}let n=J(s),o=await Qr(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=$r(n,s)||It(s),a=_(o,i);return $e(a,o,!0,n)}function $e(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[Lr]:e}}}async function Qr(s,e,t){let r=await Hr(s,e),n=t.cacheDir??Jr(),o=_(n,r),i=_(o,Le);if(await Nt(i)===r)return o;let a=_(n,`.setup-${r}-${process.pid}-${Date.now()}`);await re(n,{recursive:!0,mode:448}),await me(a,{recursive:!0,force:!0}),await me(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await re(a,{recursive:!0,mode:448}),await jt(s,a),await xt(_(a,Le),r,{mode:384}),await Wr(a,o,r),o}catch(c){throw await me(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function Hr(s,e){let t=xr("sha256");t.update("qoder-worker-runtime-v1\0");let r=await Kt(_(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await Kr(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function jt(s,e){let t=await Dr(s,{withFileTypes:!0});await re(e,{recursive:!0,mode:448});for(let r of t){let n=_(s,r.name),o=_(e,r.name);if(r.isDirectory()){await jt(n,o);continue}if(r.isSymbolicLink()){await re(J(o),{recursive:!0,mode:448}),await Ur(await jr(n),o);continue}if(!r.isFile())continue;let i=await Br(n);await re(J(o),{recursive:!0,mode:448}),await xt(o,await Ct(n),{mode:i}),process.platform!=="win32"&&await Ar(o,i)}}async function Br(s){let e=((await Or(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=It(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Wr(s,e,t){try{await Nr(s,e)}catch(r){if(await Nt(_(e,Le))===t){await me(s,{recursive:!0,force:!0});return}throw r}}async function Nt(s){let e=await Kt(s);return e?e.toString("utf8"):null}async function Kt(s){try{return await Ct(s)}catch{return null}}function Jr(){let s=Gr(Fr().username||process.env.USER||process.env.USERNAME||"user");return _(qr(),`qoder-sdk-worker-runtime-${s}`)}function Gr(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var en=41,Ut=8192,qt="QODER_WORKER_RUNTIME_PATH",tn="QODER_WORKER_CWD",sn=new Set(["--mcp-config","--settings"]),rn=Xr(import.meta.url),ze=Yr(rn),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}},G=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new Qe(fe(this.options,e))}},Qe=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 H(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=Be(this.options.pathToQoderWorkerRuntime),r;try{r=await Dt(t,{diagnostics:this.diagnostics})}catch(a){throw new q(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!He(n))throw new q(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[tn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${nn(e.args)}`),this.worker=new Zr(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===en&&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 d=c.trim();d&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${d}`)}),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=zr({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??Se,i=setTimeout(()=>{if(n()){r("SIGTERM");let a=setTimeout(()=>{n()&&r("SIGKILL")},St);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>jt&&(this.stderrTail=this.stderrTail.slice(-jt))}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 V(n,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==F){if(e!==0&&e!==null)return new V(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new V(`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??G();if(Ot(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 Hr(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ze=Hr();function Nt(s){return typeof s=="object"&&s!==null&&typeof s.create=="function"}function Re(s,e){return s.create(e)}import{existsSync as Ge}from"fs";import{createInterface as fn}from"readline";import{dirname as mn,join as q}from"path";import{fileURLToPath as gn}from"url";import{Worker as hn}from"worker_threads";import{createHash as Br}from"node:crypto";import{existsSync as Wr}from"node:fs";import{chmod as Jr,lstat as Gr,mkdir as ae,readFile as Kt,readdir as Vr,readlink as Yr,rename as Xr,rm as Te,stat as Zr,symlink as en,writeFile as Ut}from"node:fs/promises";import{tmpdir as tn,userInfo as sn}from"node:os";import{basename as Ft,dirname as X,join as x,relative as rn}from"node:path";var nn="QODER_WORKER_RUNTIME_ASSET_ROOT",qt=/(^|[\\/])app\.asar([\\/]|$)/,Be=".qoder-worker-runtime-ready";function $t(s){return qt.test(s)}function on(s){return $t(s)?s.replace(qt,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function Lt(s,e={}){let t=on(s);if(!e.forceMaterialize&&t){let c=X(t);if(Wr(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),He(t,c,!1,X(s))}if(!(e.forceMaterialize||$t(s))){let c=X(s);return He(s,c,!1)}let n=X(s),o=await an(n,s,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=rn(n,s)||Ft(s),a=x(o,i);return He(a,o,!0,n)}function He(s,e,t,r){return{runtimePath:s,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[nn]:e}}}async function an(s,e,t){let r=await cn(s,e),n=t.cacheDir??ln(),o=x(n,r),i=x(o,Be);if(await zt(i)===r)return o;let a=x(n,`.setup-${r}-${process.pid}-${Date.now()}`);await ae(n,{recursive:!0,mode:448}),await Te(a,{recursive:!0,force:!0}),await Te(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${s} -> ${o}`);try{return await ae(a,{recursive:!0,mode:448}),await Qt(s,a),await Ut(x(a,Be),r,{mode:384}),await dn(a,o,r),o}catch(c){throw await Te(a,{recursive:!0,force:!0}).catch(()=>{}),c}}async function cn(s,e){let t=Br("sha256");t.update("qoder-worker-runtime-v1\0");let r=await Ht(x(s,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let n=await Zr(e).catch(()=>null);n&&t.update(`${n.size}\0${n.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function Qt(s,e){let t=await Vr(s,{withFileTypes:!0});await ae(e,{recursive:!0,mode:448});for(let r of t){let n=x(s,r.name),o=x(e,r.name);if(r.isDirectory()){await Qt(n,o);continue}if(r.isSymbolicLink()){await ae(X(o),{recursive:!0,mode:448}),await en(await Yr(n),o);continue}if(!r.isFile())continue;let i=await un(n);await ae(X(o),{recursive:!0,mode:448}),await Ut(o,await Kt(n),{mode:i}),process.platform!=="win32"&&await Jr(o,i)}}async function un(s){let e=((await Gr(s)).mode||420)&511;if(process.platform==="win32")return e||420;let t=Ft(s);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function dn(s,e,t){try{await Xr(s,e)}catch(r){if(await zt(x(e,Be))===t){await Te(s,{recursive:!0,force:!0});return}throw r}}async function zt(s){let e=await Ht(s);return e?e.toString("utf8"):null}async function Ht(s){try{return await Kt(s)}catch{return null}}function ln(){let s=pn(sn().username||process.env.USER||process.env.USERNAME||"user");return x(tn(),`qoder-sdk-worker-runtime-${s}`)}function pn(s){return s.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Bt=8192,Wt="QODER_WORKER_RUNTIME_PATH",yn="QODER_WORKER_CWD",Sn=new Set(["--mcp-config","--settings"]),vn=gn(import.meta.url),We=mn(vn),$=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}},Z=class s{static default=new s;options;constructor(e={}){this.options={...e}}create(e){return new Je(be(this.options,e))}},Je=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 J(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=Ve(this.options.pathToQoderWorkerRuntime),r;try{r=await Lt(t,{diagnostics:this.diagnostics})}catch(a){throw new $(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let n=r.runtimePath;if(!Ge(n))throw new $(`Qoder worker runtime not found: ${n}`);let o=this.options.cwd??process.cwd(),i={...e.env,[yn]:o,...r.env};if(this.diagnostics?.record(`[WorkerTransport] Starting: ${n}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${wn(e.args)}`),this.worker=new hn(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===F&&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 d=c.trim();d&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${d}`)}),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=
|
|
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=fn({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??Se;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>Bt&&(this.stderrTail=this.stderrTail.slice(-Bt))}createWorkerError(e){return new $(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===F))return new $(`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 Ve(s){if(s)return s;if(process.env[Wt])return process.env[Wt];let e=[];for(let t of Pn())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(Ge(t))return t;return e[0]??q(We,"..","_worker","qoder-worker-runtime.obf.mjs")}function wn(s){let e=[];for(let t=0;t<s.length;t+=1){let r=s[t];e.push(r),Sn.has(r)&&t+1<s.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}function kn(s){return Ge(Ve(s))}function Pn(){let s=[q(We,".."),q(We,"..","..")];return[...new Set(s)]}var Ee=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 bn,mkdirSync as Rn}from"fs";import{dirname as Tn}from"path";var En="QODER_AGENT_SDK_DEBUG";function _n(s){return s.debugFile?!0:s.debug===!0||Cn(process.env[En])}function Mn(s){if(s.debugFile)return s.debugFile}function Cn(s){if(s===void 0)return!1;let e=s.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var _e=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=_n(e),this.debugFile=Mn(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{Rn(Tn(e),{recursive:!0}),bn(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}
|
|
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 V=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 F=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ne=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}},oe=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}};var We="1.1.0";function Ft(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 $t(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 Lt(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 mn}from"crypto";function Ht(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,yn=1024*1024,Sn=6e4,wn=[200,800],Se=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=vn(e.filePath),r=kn(e.entries),n=Qt(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+=bn(r),(this.options.flushMode==="eager"||o.entries.length>=hn||o.bytes>=yn)&&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 Rn(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??Sn,retryDelaysMs:this.options.retryDelaysMs??wn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${Qt(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:mn(),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:zt(o[1])};let i=zt(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let d=a.join("/");return Pn(d),{projectKey:n,sessionId:i,subpath:d}}function kn(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 zt(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 Pn(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 Qt(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function bn(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Rn(s,e,t,r){for(let n=0;;n++)try{await Tn(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof we)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function Tn(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new we(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var we=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Bt(){return Math.random().toString(36).substring(2,15)}function Wt(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 Jt(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function Gt(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function Vt(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function Yt(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function Xt(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function Y(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 Zt(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function es(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function ts(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function ss(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function rs(s){return typeof s=="object"&&s!==null&&s.type==="result"}var ke=class s{static INITIALIZE_TIMEOUT_MS=12e4;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;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,d,l,f,u,p,g,S,m,h,v="batched",y){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=u??new Map,this.pendingMcpResponses=p??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=l,this.fetchJobToken=g,this.diagnostics=d,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=m??500,this.inputStream=new V(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Se({store:h,flushMode:v,diagnostics:d,onMirrorError:P=>this.inputStream.enqueue(P)})),this.readLoopPromise=this.readMessages().catch(P=>{this.inputStream.error(P)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let P=this.abortController.signal;P.aborted?this.close().catch(()=>{}):P.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(Ht(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(Vt(t)){this.handleControlResponse(t);continue}if(Yt(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(Xt(t)){this.handleControlCancelRequest(t);continue}if(Zt(t)||es(t)||ts(t)||ss(t))continue;if(rs(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=t;if(this.recordInboundSessionMessage(r),r.type==="system"&&r.subtype==="init")try{this.validateProtocolHandshake(r)}catch(n){throw this.inputStream.error(n),n}if(this.onAuthExpired&&!this.authExpiredFired){let n=!1;(r.type==="auth_status"&&r.error||r.type==="assistant"&&r.error==="authentication_failed")&&(n=!0),n&&(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(i=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",i)}))}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()}}async request(e,t){let r=Bt(),n=Wt(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Y(n.request)??"unknown",a=Date.now();return new Promise((c,d)=>{let l=null,f=()=>{l&&(clearTimeout(l),l=null)};this.pendingRequests.set(r,{resolve:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(u)},reject:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,u),d(u)}}),o>0&&Number.isFinite(o)&&(l=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(u){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",u)}d(new Error(`Control request "${
|
|
9
|
-
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${r} subtype=${i}`)}catch(u){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,u),d(u)}})}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)
|
|
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}=
|
|
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
|
|
12
|
-
`),this.recordOutboundSessionMessage(r)}t>0&&this.hasBidirectionalNeeds()&&await this.waitForFirstResult(),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 setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}hasBidirectionalNeeds(){return this.sdkMcpTransports.size>0||Object.keys(this.hooks).length>0||this.canUseTool!==void 0||this.onElicitation!==void 0||this.fetchJobToken!==void 0||this.resolveModel!==void 0}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)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"});return Cn(e?.usage)}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 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=ft(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)}Lt(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function Pe(s){return typeof s=="object"&&s!==null}function Mn(s){return typeof s=="number"&&Number.isFinite(s)}function Je(s){return Object.keys(s).length>0}function C(s,e,t){let r=e[t];Mn(r)&&(s[t]=r)}function X(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function ve(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function os(s){if(!Pe(s)||Array.isArray(s))return;let e={};return C(e,s,"total"),C(e,s,"used"),C(e,s,"remaining"),C(e,s,"percentage"),X(e,s,"unit"),Je(e)?e:void 0}function En(s){if(!Pe(s)||Array.isArray(s))return;let e=os(s)??{};return X(e,s,"detailUrl"),Je(e)?e:void 0}function _n(s){if(!Pe(s)||Array.isArray(s))return;let e={};return C(e,s,"used"),C(e,s,"cap"),C(e,s,"remaining"),C(e,s,"percentage"),ve(e,s,"available"),X(e,s,"unit"),Je(e)?e:void 0}function Cn(s){if(!Pe(s)||Array.isArray(s))return null;let e={};X(e,s,"userId"),X(e,s,"userType"),C(e,s,"totalUsagePercentage"),ve(e,s,"isHighestTier"),C(e,s,"expiresAt"),X(e,s,"upgradeUrl"),ve(e,s,"isQuotaExceeded"),ve(e,s,"isPlanQuotaProrated");let t=os(s.userQuota);t&&(e.userQuota=t);let r=En(s.addOnQuota);r&&(e.addOnQuota=r);let n=_n(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function xn(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 ns(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var be=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 is}from"crypto";var In="QODER_CLOUD_AGENT_API_BASE",An="https://api.qoder.com/api/v1/cloud",O={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},On=1024,as=1*1024*1024,cs=4*1024*1024,Dn=8*1024,Ve=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"}},Re=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Ye=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}},jn=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function ps(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!jn.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 Re;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&Z(t)&&Ge(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&Z(r)&&Ge(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&Z(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&&Z(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||!Ge(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 Z(s){return"id"in s&&s.id!==void 0}function Ge(s){return"create"in s&&s.create!==void 0}function fs(s){return new Xe(s)}var Xe=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Vn();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=ls();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=Nn(e.options.auth,e.options.env),this.apiBase=Kn(),this.inputStream=new V(()=>{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(Jn(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=Wn(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:O.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===O.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:O.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}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 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&&Z(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...qn(n)}});t=us(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(Z(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Un(e.create)});return us(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 Gn(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 ds(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 d=n.slice(0,c);n=n.slice(c+1);let l=d.endsWith("\r")?d.slice(0,-1):d;if(this.consumeSseLine(l,o),this.closed)break}n.length>
|
|
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>
|
|
15
|
-
`):JSON.stringify(e)}function
|
|
16
|
-
`);await
|
|
17
|
-
`:"")}async function
|
|
18
|
-
`)){let r=t.trim();if(r)try{let n=JSON.parse(r);
|
|
19
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)r.push(b(e,await
|
|
20
|
-
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return
|
|
21
|
-
`).filter(Boolean))try{let f=JSON.parse(l);
|
|
22
|
-
`)}function
|
|
23
|
-
`," ").trim();if(!i)continue;let a=
|
|
24
|
-
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function
|
|
25
|
-
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function
|
|
26
|
-
`))if(r.trim())try{t.push(JSON.parse(r))}catch{}return
|
|
27
|
-
`).trim();if(o)return o}}function
|
|
28
|
-
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=
|
|
7
|
+
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var ee=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 L=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ce=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}},ue=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}};var Ye="1.1.0";function Jt(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 Gt(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 Vt(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 An}from"crypto";function Zt(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 xn=500,In=1024*1024,On=6e4,Dn=[200,800],Me=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=jn(e.filePath),r=Nn(e.entries),n=Xt(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+=Un(r),(this.options.flushMode==="eager"||o.entries.length>=xn||o.bytes>=In)&&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 Fn(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??On,retryDelaysMs:this.options.retryDelaysMs??Dn})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${Xt(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:An(),session_id:e.key.sessionId})}})}};function jn(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:Yt(o[1])};let i=Yt(r[1]),a=r.slice(2),c=a.at(-1);a[a.length-1]=c.endsWith(".jsonl")?c.slice(0,-6):c;let d=a.join("/");return Kn(d),{projectKey:n,sessionId:i,subpath:d}}function Nn(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 Yt(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 Kn(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 Xt(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}function Un(s){return s.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Fn(s,e,t,r){for(let n=0;;n++)try{await qn(s.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof Ce)throw o;let i=r.retryDelaysMs[n];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function qn(s,e){let t;s.catch(()=>{});try{await Promise.race([s,new Promise((r,n)=>{t=setTimeout(()=>n(new Ce(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ce=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function es(){return Math.random().toString(36).substring(2,15)}function ts(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 ss(s,e){return{type:"control_response",response:{subtype:"success",request_id:s,response:e}}}function rs(s,e,t){return{type:"control_response",response:{subtype:"error",request_id:s,error:e,...t?{code:t}:{}}}}function ns(s){return typeof s=="object"&&s!==null&&s.type==="control_response"}function os(s){return typeof s=="object"&&s!==null&&s.type==="control_request"}function is(s){return typeof s=="object"&&s!==null&&(s.type==="control_cancel_request"||s.type==="control_cancel")}function te(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 as(s){if(typeof s!="object"||s===null)return!1;let e=s.type;return e==="keepalive"||e==="keep_alive"}function cs(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_text"}function us(s){return typeof s=="object"&&s!==null&&s.type==="streamlined_tool_use_summary"}function ds(s){return typeof s=="object"&&s!==null&&s.type==="post_turn_summary"}function ls(s){return typeof s=="object"&&s!==null&&s.type==="result"}var xe=class s{static INITIALIZE_TIMEOUT_MS=12e4;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;firstResultReceived=!1;firstResultReceivedResolve;constructor(e,t,r,n,o,i,a,c,d,l,f,u,p,m,S,g,h,k="batched",y,E){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=n??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=u??new Map,this.pendingMcpResponses=p??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=c,this.onAuthExpired=l,this.fetchJobToken=m,this.fetchServiceAccountToken=E,this.diagnostics=d,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=g??500,this.inputStream=new ee(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Me({store:h,flushMode:k,diagnostics:d,onMirrorError:M=>this.inputStream.enqueue(M)})),this.readLoopPromise=this.readMessages().catch(M=>{this.inputStream.error(M)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let M=this.abortController.signal;M.aborted?this.close().catch(()=>{}):M.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(Zt(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(n){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",n)}continue}if(ns(t)){this.handleControlResponse(t);continue}if(os(t)){this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",n)});continue}if(is(t)){this.handleControlCancelRequest(t);continue}if(as(t)||cs(t)||us(t)||ds(t))continue;if(ls(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=t;if(this.recordInboundSessionMessage(r),r.type==="system"&&r.subtype==="init")try{this.validateProtocolHandshake(r)}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=es(),n=ts(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=te(n.request)??"unknown",a=Date.now();return new Promise((c,d)=>{let l=null,f=()=>{l&&(clearTimeout(l),l=null)};this.pendingRequests.set(r,{resolve:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),c(u)},reject:u=>{f(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=error duration_ms=${Date.now()-a}`,u),d(u)}}),o>0&&Number.isFinite(o)&&(l=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(u){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request on timeout:",u)}d(new Error(`Control request "${te(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(u){f(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,u),d(u)}})}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)te(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=te(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=ss(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}=Hn(i),d=rs(t,a,c);this.transport.write(JSON.stringify(d)+`
|
|
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 L}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=Ye;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=ps(t),o=ps(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 ue(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 L;return new Promise((r,n)=>{let o=()=>{n(new L)};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=te(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,d=await this.awaitAbortable(this.fetchJobToken({requestId:c,reason:i,sessionId:a},{signal:t}),t);if(!d?.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:d.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,d=o.permission_suggestions??o.suggestions,l=o.blocked_path,f=o.decision_reason,u=o.title,p=o.display_name,m=o.description,S=o.agent_id,g=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:d,blockedPath:l,decisionReason:f,title:u,displayName:p,description:m,toolUseID:c,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:c}:{...g,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(Jt(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)),d,l=new Promise((p,m)=>{d=setTimeout(()=>{m(new ce(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([c,l]),t)}finally{clearTimeout(d)}let u={type:"get_model_policy",model:typeof f.model=="string"?f.model:f.model.model,parameters:f.parameters};if(typeof f.model!="string"){let{model:p,...m}=f.model;u.custom_model={...m,style:m.style??"openai"}}return u}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(d=>{let l=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(l,d),l});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&&this.hasBidirectionalNeeds()&&await this.waitForFirstResult(),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 setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}hasBidirectionalNeeds(){return this.sdkMcpTransports.size>0||Object.keys(this.hooks).length>0||this.canUseTool!==void 0||this.onElicitation!==void 0||this.fetchJobToken!==void 0||this.fetchServiceAccountToken!==void 0||this.resolveModel!==void 0}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)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=zn(e?.usage),r=Qn(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 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=kt(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)}Vt(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function Q(s){return typeof s=="object"&&s!==null}function Xe(s){return typeof s=="number"&&Number.isFinite(s)}function Ze(s){return Object.keys(s).length>0}function I(s,e,t){let r=e[t];Xe(r)&&(s[t]=r)}function se(s,e,t){let r=e[t];typeof r=="string"&&(s[t]=r)}function Ae(s,e,t){let r=e[t];typeof r=="boolean"&&(s[t]=r)}function fs(s){if(!Q(s)||Array.isArray(s))return;let e={};return I(e,s,"total"),I(e,s,"used"),I(e,s,"remaining"),I(e,s,"percentage"),se(e,s,"unit"),Ze(e)?e:void 0}function $n(s){if(!Q(s)||Array.isArray(s))return;let e=fs(s)??{};return se(e,s,"detailUrl"),Ze(e)?e:void 0}function Ln(s){if(!Q(s)||Array.isArray(s))return;let e={};return I(e,s,"used"),I(e,s,"cap"),I(e,s,"remaining"),I(e,s,"percentage"),Ae(e,s,"available"),se(e,s,"unit"),Ze(e)?e:void 0}function Qn(s){if(!Q(s)||Array.isArray(s))return;let e=s.total_credits,t=s.model_usage;if(!Xe(e)||e<0||!Q(t)||Array.isArray(t))return;let r={};for(let[n,o]of Object.entries(t)){if(!Q(o)||Array.isArray(o))continue;let i=o.credits;Xe(i)&&i>=0&&(r[n]={credits:i})}return{total_credits:e,model_usage:r}}function zn(s){if(!Q(s)||Array.isArray(s))return null;let e={};se(e,s,"userId"),se(e,s,"userType"),I(e,s,"totalUsagePercentage"),Ae(e,s,"isHighestTier"),I(e,s,"expiresAt"),se(e,s,"upgradeUrl"),Ae(e,s,"isQuotaExceeded"),Ae(e,s,"isPlanQuotaProrated");let t=fs(s.userQuota);t&&(e.userQuota=t);let r=$n(s.addOnQuota);r&&(e.addOnQuota=r);let n=Ln(s.orgResourcePackage);return n&&(e.orgResourcePackage=n),e}function Hn(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 ps(s){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(s);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Ie=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 Bn="QODER_CLOUD_AGENT_API_BASE",Wn="https://api.qoder.com/api/v1/cloud",j={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Jn=1024,gs=1*1024*1024,hs=4*1024*1024,Gn=8*1024,tt=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"}},Oe=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},st=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}},Vn=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function ws(s){if(!s.experimentalCloudAgent)return;let e=Object.keys(s).filter(o=>s[o]!==void 0&&!Vn.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 Oe;let{agent:t,session:r}=s.experimentalCloudAgent;if(t&&re(t)&&et(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&re(r)&&et(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&re(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&&re(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||!et(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 re(s){return"id"in s&&s.id!==void 0}function et(s){return"create"in s&&s.create!==void 0}function ks(s){return new rt(s)}var rt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=po();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=vs();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=Yn(e.options.auth,e.options.env),this.apiBase=Xn(),this.inputStream=new ee(()=>{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(uo(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=co(t);this.beginPendingTurn();let n=await this.postSessionEvents([{type:j.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(n.find(o=>o.type===j.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:j.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}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 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&&re(e))t=e.id;else{let r=await this.resolveAgentId(),n=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...eo(n)}});t=ys(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(re(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Zn(e.create)});return ys(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 lo(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 Ss(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 d=n.slice(0,c);n=n.slice(c+1);let l=d.endsWith("\r")?d.slice(0,-1):d;if(this.consumeSseLine(l,o),this.closed)break}n.length>gs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${gs} 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:ro(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>hs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${hs} 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=_(e.data,"type")??e.event,r=_(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??_(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 j.agentMessage:{let r=oo(de(e.data,"content"));r&&this.assistantTextParts.push(r);return}case j.modelRequestEnd:this.captureUsage(e.data);return;case j.idle:this.idleSeen=!0,this.finishIfIdle();return;case j.error:this.emitErrorResult(e),this.finish();return;case j.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=vs(),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>=Jn&&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(_(e.data,"error")??_(De(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 to(r)}captureUsage(e){let t=De(e,"usage");if(!t)return;this.latestUsage=io(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=_(e,"model")??_(t,"model");if(n){let o=this.latestModelUsage[n]?.costUSD??0;this.latestModelUsage[n]=ao(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 Ss(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 Yn(s,e){if(s?.type!=="accessToken")throw new Oe;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 tt(t);return r}function Xn(){return process.env[Bn]?.replace(/\/+$/,"")??Wn}function Zn(s){return nt({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 eo(s){return nt({title:s.title,environment_id:s.environment_id,resources:s.resources?.map(e=>nt({...e})),vault_ids:s.vault_ids,memory_store_ids:s.memory_store_ids})}function nt(s){return Object.fromEntries(Object.entries(s).filter(([,e])=>e!==void 0))}function ys(s,e){let t=_(s,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function to(s){let e=no(s,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:_(t,"id"),turnId:_(t,"turn_id"),type:_(t,"type")}]):[]}async function Ss(s){let e=await so(s,Gn);return new st(s.status,e||s.statusText||"unknown error")}async function so(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 ro(s){if(s.length===0)return{};try{return JSON.parse(s)}catch{return s}}function De(s,e){let t=de(s,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function no(s,e){let t=de(s,e);return Array.isArray(t)?t:void 0}function _(s,e){let t=de(s,e);return typeof t=="string"?t:void 0}function R(s,e){let t=de(s,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function de(s,e){if(!(s===null||typeof s!="object"||Array.isArray(s)))return s[e]}function oo(s){return typeof s=="string"?s:Array.isArray(s)&&s.map(t=>Ps(t)?t.text:"").filter(Boolean).join("")||void 0}function io(s,e){let t=De(e,"cache_creation"),r=De(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 ao(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 co(s){let e=s.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ps(t)?t.text:JSON.stringify(t)).join(`
|
|
15
|
+
`):JSON.stringify(e)}function Ps(s){return s!==null&&typeof s=="object"&&"type"in s&&s.type==="text"&&"text"in s&&typeof s.text=="string"}function uo(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 vs(){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(s,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,s);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function po(){let s,e;return{promise:new Promise((r,n)=>{s=r,e=n}),resolve:s,reject:e}}import{access as wo,chmod as Ms,cp as ko,mkdtemp as Po,mkdir as Cs,realpath as bo,rm as Ts,writeFile as Ro}from"fs/promises";import{homedir as To,tmpdir as Eo}from"os";import{dirname as _o,isAbsolute as As,join as z,relative as Mo,resolve as ot,sep as Co}from"path";import{homedir as fo}from"os";import{join as Rs}from"path";var mo=w.configDirName,go=w.cliHomeEnv,ho=w.configDirEnv,bs=200;function yo(){return process.env[go]||fo()}function So(){let s=process.env[ho];return s||Rs(yo(),mo)}function ne(){return Rs(So(),"projects")}function vo(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<=bs)return e;let t=Math.abs(vo(s)).toString(36);return`${e.slice(0,bs)}-${t}`}var Ao=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,xo=6e4;async function xs(s){if(s.resume===void 0&&!s.continue)return;let e=T(await Do(s.cwd)),t=s.loadTimeoutMs??xo,r=s.resume!==void 0?s.resume:await jo(s.store,e,t);if(r===void 0||!Ao.test(r))return;let n={projectKey:e,sessionId:r},o=await Es(s.store,n,t);if(!o)return;let i=s.store.listSubkeys?await it(s.store.listSubkeys(n),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let d of i){if(!Ko(d)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(d)}`);continue}let l=await Es(s.store,{...n,subpath:d},t);l&&a.push({subpath:d,entries:l})}let c;try{c=await Po(z(Eo(),"qoder-session-store-")),await Ms(c,448),await Oo(Io(s.env),c);let d=z(c,"projects",e),l=z(d,r);await Cs(d,{recursive:!0,mode:448}),await _s(z(d,`${r}.jsonl`),o);for(let{subpath:u,entries:p}of a){let m=Uo(l,`${u}.jsonl`),S=p.filter(h=>h.type==="agent_metadata"),g=p.filter(h=>h.type!=="agent_metadata");if(g.length>0&&await _s(m,g),S.length>0){let h={...S.at(-1)};delete h.type,await Is(m.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=c;return{configDir:f,projectKey:e,sessionId:r,cleanup:async()=>{await Ts(f,{recursive:!0,force:!0})}}}catch(d){throw c!==void 0&&await Ts(c,{recursive:!0,force:!0}),d}}function Io(s){let e=s?.[w.cliHomeEnv]??process.env[w.cliHomeEnv]??To();return ot(s?.[w.configDirEnv]??process.env[w.configDirEnv]??z(e,w.configDirName))}async function Oo(s,e){for(let t of[".auth","oauth_creds.json"]){let r=z(s,t);try{await wo(r),await ko(r,z(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(n){if(n.code!=="ENOENT")throw n}}}async function Do(s){let e=ot(s??process.cwd());try{return await bo(e)}catch{return e}}async function jo(s,e,t){if(!s.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await it(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 Es(s,e,t){let r=await it(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)=>No(n,o))}}function No(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 Ko(s){return!(typeof s!="string"||!s||s.includes("\0")||s.includes("\\")||As(s)||/^[a-z]:/i.test(s)||s.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Uo(s,e){let t=ot(s,e),r=Mo(s,t);if(r===""||r===".."||r.startsWith(`..${Co}`)||As(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 Is(s,t?`${t}
|
|
17
|
+
`:"")}async function Is(s,e){await Cs(_o(s),{recursive:!0,mode:448}),await Ro(s,e,{encoding:"utf8",mode:384}),await Ms(s,384)}async function it(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 Fo=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function qo(s){let e=s.replace(/\\/g,"/").split("/").at(-1)??"";return Fo.test(e)}function Os(s,e,t=process.env){let r=s.pathToQoderCLIExecutable;return r?qo(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"}:t.QODER_WORKER_RUNTIME_PATH?{transport:"worker",pathToQoderWorkerRuntime:t.QODER_WORKER_RUNTIME_PATH}:{transport:e}}var at=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 $o(s){if(s.transport!==void 0){if(Nt(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=Os(s,ze);return e.transport==="worker"?new Z({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):Y.default}function Lo(s){let{prompt:e,options:t={}}=s,r=$o(t),n=new _e({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 at;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&&!(r instanceof Y)&&!(r instanceof Z))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 ws(t),ks({prompt:e,options:t,diagnostics:n});let i=!!t.resolveModel,a=t.onAuthExpired,c=!1,d=a?()=>{c||(c=!0,Promise.resolve(a()).catch(v=>{n.record("[query] onAuthExpired callback threw:",v)}))}:void 0,l=new Map,f=new Map,u=new Map,p={},m={},S={};if(t.mcpServers)for(let[v,C]of Object.entries(t.mcpServers)){let U=C.tools;if(Array.isArray(U)&&U.length>0&&(m[v]=U),C.type==="sdk"&&"instance"in C&&C.instance){let W=C.instance;if(l.set(v,W),U){let ye=Le(v,U);ye&&(S[v]=ye)}let gt=new Ie(ye=>{Gt(v,ye,u)});f.set(v,gt),W.connect(gt).catch(()=>{})}else p[v]=C}let g=Object.keys(p).length>0,h=Object.keys(m).length>0,k=t.pathToQoderCLIExecutable,y=t.env,E=o?.type==="jobToken"?o.fetchJobToken:void 0,M=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,K={pathToQoderCLIExecutable:k,executable:t.executable,executableArgs:t.executableArgs,env:y,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,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 C=t.skills==="all"?["Skill"]:t.skills.map(W=>`Skill(${W})`),U=new Set(v);return[...v,...C.filter(W=>!U.has(W))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:g?p:void 0,mcpToolPolicies:h?m: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:d},D=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new Ee(async()=>{let v=await xs({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!v)return{transport:Re(r,{...K,continue:!1})};try{return{transport:Re(r,{...K,env:{...K.env??process.env,[w.configDirEnv]:v.configDir},continue:!1,resume:v.sessionId}),cleanup:v.cleanup}}catch(C){throw await v.cleanup(),C}}):Re(r,K);D.initialize().catch(()=>{});let he=typeof e=="string",B=t.systemPrompt,ft,mt;if(typeof B=="string")ft=B;else if(typeof B=="object"&&B!==null&&B.type==="preset"){let v=B;if(v.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(v.preset)}`);mt=v.append}let ur={systemPrompt:ft,appendSystemPrompt:mt,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing},qe=new xe(D,he,t.canUseTool,t.hooks,t.abortController,l,ur,t.onElicitation,n,d,t.controlRequestTimeoutMs,f,u,E,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",S,M);if(typeof e=="string"){let v={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};qe.streamInput(async function*(){yield v}())}else qe.streamInput(e);return qe}import{McpServer as Qo}from"@modelcontextprotocol/sdk/server/mcp.js";function zo(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 Qo({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.`);$e(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 Ho(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 ut,readFile as je,stat as oe,appendFile as Ls,realpath as Bo,rm as Ds}from"fs/promises";import{basename as Wo,join as b,resolve as js}from"path";import{execFile as Jo}from"child_process";import{randomUUID as Qs}from"crypto";import{promisify as Go}from"util";var Vo=Go(Jo),Yo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Xo=new Set(["user","assistant","system","progress","attachment"]);function O(s){return s!==null&&typeof s=="object"}function H(s){return Yo.test(s)}function Ns(s){let e=[];for(let t of s.split(`
|
|
18
|
+
`)){let r=t.trim();if(r)try{let n=JSON.parse(r);O(n)&&typeof n.uuid=="string"&&typeof n.type=="string"&&Xo.has(n.type)&&e.push(n)}catch{}}return e}function ct(s){if(!O(s.message))return[];let e=s.message.content;return Array.isArray(e)?e:[]}function le(s){if(s.type!=="assistant"||!O(s.message))return;let e=s.message.id;return typeof e=="string"&&e?e:void 0}function zs(s){return s.type!=="user"||!s.parentUuid?!1:ct(s).some(e=>O(e)&&e.type==="tool_result")}function Zo(s){if(!O(s.message))return null;let e=s.message.id;return typeof e=="string"&&e.length>0?e:null}function ei(s,e){let t=new Map;for(let[r,n]of s){let o=Zo(n);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,n]of s){let o=ti(n,n.parentUuid,s,t,e);o!==n.parentUuid&&s.set(r,{...n,parentUuid:o})}}function ti(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]:si(s,o,t)??ri(s,o,t,n)??e}function si(s,e,t){if(!zs(s))return;let r=ct(s).filter(o=>O(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?ct(i).some(a=>O(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return n.length===1?n[0]:void 0}function ri(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 ni(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 Ks(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 oi(s,e,t){let r=e.filter(u=>u.type==="assistant");if(r.length===0)return e;let n=new Map,o=0;for(let u of s.keys())n.set(u,o++);let i=new Map;for(let u of r){let p=le(u);p&&i.set(p,u)}let a=new Map,c=new Map;for(let u of s.values()){let p=le(u);if(p){let m=a.get(p)??[];m.push(u),a.set(p,m);continue}if(zs(u)&&u.parentUuid){let m=c.get(u.parentUuid)??[];m.push(u),c.set(u.parentUuid,m)}}let d=new Set,l=new Map;for(let u of r){let p=le(u);if(!p||d.has(p))continue;d.add(p);let m=a.get(p)??[u],S=m.filter(P=>!t.has(P.uuid)),g=[];for(let P of m){let D=c.get(P.uuid)??[];for(let he of D)t.has(he.uuid)||g.push(he)}if(S.length===0&&g.length===0)continue;let h=i.get(p);if(!h)continue;let k=[...m].sort((P,D)=>Ks(P,D,n));g.sort((P,D)=>Ks(P,D,n));let y=k.findIndex(P=>P.uuid===h.uuid),E=k.slice(0,Math.max(y,0)).filter(P=>!t.has(P.uuid)),M=k.slice(y+1).filter(P=>!t.has(P.uuid)),K=[...E,...M,...g];for(let P of K)t.add(P.uuid);l.set(h.uuid,K)}if(l.size===0)return e;let f=[];for(let u of e){let p=l.get(u.uuid);if(p){let m=n.get(u.uuid)??Number.MAX_SAFE_INTEGER,S=[],g=[];for(let h of p)(u.type==="assistant"&&h.type==="assistant"&&le(h)===le(u)&&(n.get(h.uuid)??Number.MAX_SAFE_INTEGER)<m?S:g).push(h);f.push(...S,u,...g)}else f.push(u)}return f}function Us(s){if(s.length===0)return[];let e=new Map,t=new Map;for(let[u,p]of s.entries())e.set(p.uuid,p),t.set(p.uuid,u);ni(e),ei(e,t);let r=new Set;for(let u of e.values())u.parentUuid&&r.add(u.parentUuid);let n=Array.from(e.values()).filter(u=>!r.has(u.uuid)),o=[];for(let u of n){let p=u,m=new Set;for(;p&&!m.has(p.uuid);){if(m.add(p.uuid),p.type==="user"||p.type==="assistant"){o.push(p);break}p=p.parentUuid?e.get(p.parentUuid):void 0}}if(o.length===0)return[];let i=o.filter(u=>!u.isSidechain&&!u.teamName&&!u.isMeta),c=(i.length>0?i:o).reduce((u,p)=>(t.get(p.uuid)??-1)>(t.get(u.uuid)??-1)?p:u),d=[],l=new Set,f=c;for(;f&&!l.has(f.uuid);)l.add(f.uuid),d.push(f),f=f.parentUuid?e.get(f.parentUuid):void 0;return d.reverse(),oi(e,d,l)}function Fs(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 ii(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 qs(s){let e=s.type==="system"?ii(s.compactMetadata):void 0;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,...typeof s.timestamp=="string"&&s.timestamp.length>0?{timestamp:s.timestamp}:{},...s.type==="system"&&s.subtype?{subtype:s.subtype}:{},...e?{compact_metadata:e}:{}}}function $s(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 Ne(s){try{return await Bo(js(s))}catch{return js(s)}}async function ai(s){return T(await Ne(s))}async function N(s){let e=ne();if(s?.dir){let t=await Ne(s.dir),r=[b(e,T(t))];if(s.includeWorktrees!==!1)try{let{stdout:n}=await Vo("git",["worktree","list","--porcelain"],{cwd:s.dir}),o=n.split(`
|
|
19
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)r.push(b(e,await ai(i)))}catch{}return r}try{return(await ut(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>b(e,r.name))}catch{return[]}}async function Hs(s){try{let[e,t]=await Promise.all([je(s,"utf-8"),oe(s)]),r=e.trim().split(`
|
|
20
|
+
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return O(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let n=Wo(s,".jsonl");return dt(n,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Bs(s,e){return b(s,e,"subagents")}function Ws(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 Js(s){let e=[];async function t(r){let n;try{n=await ut(r,{withFileTypes:!0})}catch{return}for(let o of n){let i=b(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 ci(s){try{let e=await je(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 Gs(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 ui(s,e,t){let[r,n]=await Promise.all([je(s,"utf-8"),ci(s)]),o=[];for(let l of r.trim().split(`
|
|
21
|
+
`).filter(Boolean))try{let f=JSON.parse(l);Ws(f)&&o.push(f)}catch{}let a=Gs(o).map(l=>({type:l.type,uuid:l.uuid,session_id:l.sessionId??e,message:l.message,parent_tool_use_id:n.parentToolUseId,parent_agent_id:n.parentAgentId})),c=t?.offset??0,d=t?.limit;return d!==void 0?a.slice(c,c+d):a.slice(c)}async function ie(s){return T(await Ne(s??process.cwd()))}function pe(s,e){return{projectKey:s,sessionId:e}}function di(s){return s.map(e=>JSON.stringify(e)).join(`
|
|
22
|
+
`)}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 pi(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 fi=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function mi(s){let e=s;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(fi,"");if(r===e)return r;e=r}return e}var gi=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,hi=/<command-name>(.*?)<\/command-name>/,yi=/<bash-input>([\s\S]*?)<\/bash-input>/;function Si(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 vi(s,e){if(s.type!=="user"||s.isMeta===!0||s.isCompactSummary===!0)return;let t=s.message;if(!O(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(O(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(`
|
|
23
|
+
`," ").trim();if(!i)continue;let a=hi.exec(i);if(a){e.commandFallback??=a[1];continue}let c=yi.exec(i);if(c)return`! ${c[1].trim()}`;if(!gi.test(i))return Si(i)}}function dt(s,e,t,r={}){if(e.length===0)return;let n,o,i,a,c,d,l,f,u,p,m;for(let k of e){let y=k;if(m??=y.isSidechain===!0,p===void 0&&typeof y.timestamp=="string"){let E=Date.parse(y.timestamp);Number.isFinite(E)&&(p=E)}if(!n){let E={commandFallback:o};n=vi(y,E),o=E.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"&&(c=y.lastPrompt),typeof y.summary=="string"&&(d=y.summary),y.type==="tag"&&(u=typeof y.tag=="string"&&y.tag?y.tag:void 0),typeof y.gitBranch=="string"&&(l=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=n??o,g=i||a,h=g||c||d||S;if(h)return{sessionId:s,summary:h,lastModified:t??li(e),fileSize:r.fileSize,customTitle:g,firstPrompt:S,gitBranch:l,cwd:f||r.defaultCwd,tag:u,createdAt:p}}async function Vs(s,e,t){let r=pe(await ie(t),e),n=await s.load(r);return n?{key:r,entries:n}:void 0}async function wi(s){if(s?.sessionStore){let d=s.sessionStore;if(!d.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let l=await Ne(s.dir??process.cwd()),f=T(l),u=(await d.listSessions(f)).slice().sort((g,h)=>h.mtime-g.mtime),p=Math.max(0,s.offset??0),m=s.limit!==void 0&&s.limit>0?u.slice(p,p+s.limit):p>0?u.slice(p):u;return(await Promise.allSettled(m.map(async({sessionId:g,mtime:h})=>{let k=await d.load(pe(f,g));return k?dt(g,k,h,{defaultCwd:l}):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 N(s),r=(await Promise.all(e.map(async d=>{try{return(await ut(d)).filter(f=>f.endsWith(".jsonl")).map(f=>b(d,f))}catch{return[]}}))).flat(),n=await Promise.all(r.map(Hs)),o=new Map;for(let d of n){if(!d)continue;let l=o.get(d.sessionId);(!l||d.lastModified>l.lastModified)&&o.set(d.sessionId,d)}let i=Array.from(o.values()).sort((d,l)=>l.lastModified-d.lastModified),a=s?.offset??0,c=s?.limit;return c!==void 0?i.slice(a,a+c):i.slice(a)}async function ki(s,e){if(e?.sessionStore){if(!H(s))return;let r=await Vs(e.sessionStore,s,e.dir);return r?dt(s,r.entries,pi(r.entries)):void 0}let t=await N(e);for(let r of t){let n=b(r,`${s}.jsonl`),o=await Hs(n);if(o)return o}}async function Pi(s,e){if(!H(s))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let n=await Vs(e.sessionStore,s,e.dir);if(!n)return[];let o=Us(Ns(di(n.entries)));return $s(o.filter(i=>Fs(i,t)).map(qs),e)}let r=await N(e);for(let n of r){let o=b(n,`${s}.jsonl`);try{let i=await je(o,"utf-8"),c=Us(Ns(i)).filter(d=>Fs(d,t)).map(qs);return $s(c,e)}catch{continue}}return[]}async function bi(s,e,t){if(!H(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(pe(await ie(t.dir),s),[{type:"custom-title",sessionId:s,customTitle:r,uuid:Qs(),timestamp:new Date().toISOString()}]);return}let n=await N(t);for(let o of n){let i=b(o,`${s}.jsonl`);try{await oe(i);let a=JSON.stringify({type:"custom-title",sessionId:s,customTitle:r,timestamp:new Date().toISOString()});await Ls(i,a+`
|
|
24
|
+
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function Ri(s,e,t){if(!H(s))throw new Error(`Invalid sessionId: ${s}`);let r=e===null?null:mi(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(pe(await ie(t.dir),s),[{type:"tag",sessionId:s,tag:r??"",uuid:Qs(),timestamp:new Date().toISOString()}]);return}let n=await N(t);for(let o of n){let i=b(o,`${s}.jsonl`);try{await oe(i);let a=JSON.stringify({type:"tag",sessionId:s,tag:r??"",timestamp:new Date().toISOString()});await Ls(i,a+`
|
|
25
|
+
`);return}catch{continue}}throw new Error(`Session ${s} not found`)}async function Ti(s,e){if(e?.sessionStore){if(!H(s))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await ie(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 N(e);for(let r of t){let n=b(r,`${s}.jsonl`);try{await oe(n);let o=await Js(Bs(r,s));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function Ei(s,e,t){if(t?.sessionStore){if(!H(s)||!e)return[];let n=await ie(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let p=await t.sessionStore.listSubkeys({projectKey:n,sessionId:s}),m=`agent-${e}`,S=p.find(g=>g.startsWith("subagents/")&&g.split("/").at(-1)===m);if(!S)return[];o=S}let i=await t.sessionStore.load({projectKey:n,sessionId:s,subpath:o});if(!i)return[];let a=i.filter(Ws),c=i.filter(p=>p.type==="agent_metadata").at(-1),d=typeof c?.toolUseId=="string"?c.toolUseId:null,l=typeof c?.parentAgentId=="string"?c.parentAgentId:null,f=Gs(a).map(p=>({type:p.type,uuid:p.uuid,session_id:p.sessionId??s,message:p.message,parent_tool_use_id:d,parent_agent_id:l})),u=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(u,u+t.limit):f.slice(u)}let r=await N(t);for(let n of r){let o=b(n,`${s}.jsonl`);try{await oe(o);let a=(await Js(Bs(n,s))).find(c=>c.agentId===e);return a?await ui(a.filePath,s,t):[]}catch{continue}}return[]}async function _i(s,e){if(!H(s))throw new Error(`Invalid sessionId: ${s}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(pe(await ie(e.dir),s));return}let t=await N(e);for(let r of t){let n=b(r,`${s}.jsonl`);try{await oe(n),await Promise.all([Ds(n,{force:!0}),Ds(b(r,s),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${s} not found`)}import{randomUUID as Ke}from"crypto";import{readdir as Mi,readFile as Ci,realpath as Ai,stat as Ys,writeFile as xi}from"fs/promises";import{dirname as Ii,join as lt,resolve as Oi}from"path";var Xs=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Di=new Set(["user","assistant","attachment","system","progress"]);async function er(s){let e=Oi(s);try{return await Ai(e)}catch{return e}}async function ji(s,e){let t=ne();if(e){let n=T(await er(e)),o=lt(t,n,`${s}.jsonl`);try{if((await Ys(o)).size>0)return o}catch{}return}let r;try{r=await Mi(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=lt(t,n.name,`${s}.jsonl`);try{if((await Ys(o)).size>0)return o}catch{}}}function tr(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"&&Di.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 Ni(s,e){let t=[];for(let r of s.split(`
|
|
26
|
+
`))if(r.trim())try{t.push(JSON.parse(r))}catch{}return tr(t,e)}function Ki(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(`
|
|
27
|
+
`).trim();if(o)return o}}function Ui(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??Ki(s)}function Zs(s,e,t,r){let n=s.transcript.filter(u=>u.isSidechain!==!0);if(n.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let u=n.findIndex(p=>p.uuid===t.upToMessageId);if(u<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);n=n.slice(0,u+1)}let o=new Map(n.map(u=>[u.uuid,Ke()])),i=n.filter(u=>u.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(n.map(u=>[u.uuid,u])),c=Ke(),d=new Date().toISOString(),l=i.map((u,p)=>{let m=null,S=typeof u.parentUuid=="string"?u.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 u.logicalParentUuid=="string"?o.get(u.logicalParentUuid)??null:u.logicalParentUuid??null,h={...u,...u.type==="system"&&u.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(u.uuid),parentUuid:m,logicalParentUuid:g,sessionId:c,timestamp:p===i.length-1?d:typeof u.timestamp=="string"?u.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:u.uuid}};return delete h.teamName,delete h.agentName,delete h.sessionKind,delete h.slug,delete h.sourceToolAssistantUUID,h});s.contentReplacements.length>0&&l.push({type:"content-replacement",sessionId:c,replacements:s.contentReplacements,uuid:Ke(),timestamp:d}),s.relocatedCwd&&l.push({type:"relocated",sessionId:c,relocatedCwd:s.relocatedCwd});let f=t.title?.trim();return l.push({type:"custom-title",sessionId:c,customTitle:f||`${Ui(r)??"Forked session"} (fork)`,uuid:Ke(),timestamp:d}),{sessionId:c,entries:l}}async function Fi(s,e={}){if(!Xs.test(s))throw new Error(`Invalid sessionId: ${s}`);if(e.upToMessageId&&!Xs.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await er(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 d=Zs(tr(c,s),s,e,c);return await e.sessionStore.append({projectKey:a,sessionId:d.sessionId},d.entries),{sessionId:d.sessionId}}let t=await ji(s,e.dir);if(!t)throw new Error(`Session ${s} not found`);let r=await Ci(t,"utf8"),n=r.split(`
|
|
28
|
+
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Zs(Ni(r,s),s,e,n);return await xi(lt(Ii(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
29
29
|
`)}
|
|
30
|
-
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function
|
|
30
|
+
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ue(s){return JSON.stringify([s.projectKey,s.sessionId,s.subpath??null])}var pt=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=Ue(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(Ue(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(Ue(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(Ue(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 qi}from"fs";import{readdir as or,readFile as $i,realpath as Li,stat as sr}from"fs/promises";import{basename as rr,dirname as Qi,join as fe,relative as zi,resolve as Hi,sep as Bi}from"path";import{createInterface as Wi}from"readline";var Ji=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Gi=500,Vi=1024*1024;async function Yi(s){let e=Hi(s);try{return await Li(e)}catch{return e}}async function Xi(s,e){let t=ne();if(e){let n=T(await Yi(e)),o=fe(t,n,`${s}.jsonl`);try{if((await sr(o)).size>0)return{filePath:o,projectKey:n}}catch{}return}let r;try{r=await or(t,{withFileTypes:!0})}catch{return}for(let n of r){if(!n.isDirectory()&&!n.isSymbolicLink())continue;let o=fe(t,n.name,`${s}.jsonl`);try{if((await sr(o)).size>0)return{filePath:o,projectKey:n.name}}catch{}}}async function Zi(s){let e=[];async function t(r){let n;try{n=await or(r,{withFileTypes:!0})}catch{return}n.sort((o,i)=>o.name.localeCompare(i.name));for(let o of n){let i=fe(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(s),e}async function nr(s,e,t,r){let n=Wi({input:qi(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(d){console.warn(`importSessionToStore: skipping unparseable line in ${s}: ${String(d)}`);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>=Vi)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function ea(s,e,t={}){if(!Ji.test(s))throw new Error(`Invalid sessionId: ${s}`);let r=await Xi(s,t.dir);if(!r)throw new Error(`Session ${s} not found`);let n=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Gi;if(await nr(r.filePath,{projectKey:r.projectKey,sessionId:s},e,n),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=fe(o,"subagents");for(let a of await Zi(i)){let d=zi(o,a).split(Bi);d[d.length-1]=rr(d[d.length-1],".jsonl");let l={projectKey:r.projectKey,sessionId:s,subpath:d.join("/")};await nr(a,l,e,n);let f=fe(Qi(a),`${rr(a,".jsonl")}.meta.json`);try{let u=JSON.parse(await $i(f,"utf8"));await e.append(l,[{type:"agent_metadata",...u}])}catch(u){if(typeof u=="object"&&u!==null&&"code"in u&&u.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(u)}`)}}}import{spawn as ta}from"child_process";async function sa(s){let e=s?.cliPath??me(),t=["plugins","list","--json"];s?.orgId&&t.push("--org-id",s.orgId);let r=await ge(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 ra(s,e){let t=e?.cliPath??me(),r=await ge(t,["plugins","enable",s,"--scope","user"],e?.env);r.exitCode!==0&&Fe(r)}async function na(s,e){let t=e?.cliPath??me(),r=await ge(t,["plugins","disable",s,"--scope","user"],e?.env);r.exitCode!==0&&Fe(r)}async function oa(s,e){let t=e?.cliPath??me(),r=await ge(t,["plugins","install",s,"--scope","user","--json"],e?.env);r.exitCode!==0&&Fe(r);let n=JSON.parse(r.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function ia(s,e){let t=e?.cliPath??me(),r=["plugins","uninstall",s,"--scope","user","--json"];e?.keepData&&r.push("--keep-data");let n=await ge(t,r,e?.env);n.exitCode!==0&&Fe(n);let o=JSON.parse(n.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}function me(){return G()}var ir=3e4;function ge(s,e,t){return new Promise((r,n)=>{let o=ta(s,e,{env:{...process.env,...t},stdio:["ignore","pipe","pipe"]}),i="",a="",c=!1,d=setTimeout(()=>{c||(c=!0,o.kill("SIGTERM"),n(new Error(`qodercli subprocess timed out after ${ir}ms`)))},ir);o.stdout.on("data",l=>{i+=l.toString()}),o.stderr.on("data",l=>{a+=l.toString()}),o.on("error",l=>{c||(c=!0,clearTimeout(d),n(l))}),o.on("close",l=>{c||(c=!0,clearTimeout(d),r({stdout:i,stderr:a,exitCode:l??1}))})})}function Fe(s){let e="plugin_operation_failed",t=s.stderr||s.stdout;try{let n=JSON.parse(s.stdout);n.error&&n.code&&(e=n.code,t=n.message??t)}catch{}let r=new Error(t);throw r.code=e,r}import{execFile as aa}from"child_process";function ca(){return G()}async function ua(s,e){if(!s.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??ca(),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=>{aa(t,n,{env:e?.env??process.env,timeout:r,maxBuffer:1024*1024},(i,a)=>{let c=a.trim();if(c)try{let d=JSON.parse(c);o({success:!!d.success,message:d.success?d.message||"Feedback submitted successfully":d.error||d.message||"Failed to submit feedback",requestId:d.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:c||"Feedback submitted successfully"})})})}var cr={};lr(cr,{filterEscalatingDefaultMode:()=>ar});var da=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function ar(s){let e=s.effective.permissions?.defaultMode;if(!e||!da.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{L as AbortError,we as AuthAccessTokenEnvVarError,ke as AuthServiceAccountEnvVarError,Pt as DEFAULT_ACCESS_TOKEN_ENV_VAR,ze as DEFAULT_RUNTIME_TRANSPORT,ve as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,fr as EXIT_REASONS,pr as HOOK_EVENTS,pt as InMemorySessionStore,ce as ModelPolicyTimeoutError,Y as ProcessTransport,ue as ProtocolVersionMismatchError,V as QoderCliProcessError,$ as QoderWorkerRuntimeError,Ye as WIRE_PROTOCOL_VERSION,Z as WorkerTransport,vr as accessToken,wr as accessTokenFromEnv,cr as coreTypes,zo as createSdkMcpServer,_i as deleteSession,na as disablePlugin,ra as enablePlugin,ar as filterEscalatingDefaultMode,Fi as forkSession,ki as getSessionInfo,Pi as getSessionMessages,Ei as getSubagentMessages,kn as hasResolvableQoderWorkerRuntime,ea as importSessionToStore,oa as installPlugin,Rr as jobToken,sa as listPlugins,wi as listSessions,Ti as listSubagents,kr as qodercliAuth,Lo as query,bi as renameSession,Ve as resolveQoderWorkerRuntimePath,Pr as serviceAccount,br as serviceAccountFromEnv,ua as submitFeedback,Ri as tagSession,Ho as tool,ia as uninstallPlugin};
|