@qoder-ai/qoder-agent-sdk 1.0.27 → 1.0.28
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 +25 -1
- package/dist/core/bounded-line-transform.d.ts +16 -0
- package/dist/core/process-transport.d.ts +5 -0
- package/dist/daemon/daemon-auth-rpc.d.ts +9 -0
- package/dist/daemon/daemon-connection.d.ts +98 -0
- package/dist/daemon/daemon-session-transport.d.ts +60 -0
- package/dist/daemon/protocol.d.ts +171 -0
- package/dist/daemon/remote-session-launch-rpc.d.ts +3 -0
- package/dist/daemon/session-metadata.d.ts +19 -0
- package/dist/daemon/session-registration-store.d.ts +10 -0
- package/dist/daemon/session-store-rpc.d.ts +37 -0
- package/dist/daemon/start-daemon.d.ts +95 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +30 -28
- package/dist/protocol/common.d.ts +2 -2
- package/dist/protocol/control.d.ts +22 -0
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/messages.d.ts +48 -2
- package/dist/query/daemon-permission-mode.d.ts +9 -0
- package/dist/query/query-runner.d.ts +12 -0
- package/dist/runtime-manifest.json +5 -5
- package/dist/session/transcript-mirror.d.ts +1 -1
- package/dist/types/messages.d.ts +1 -1
- package/dist/types/options.d.ts +8 -2
- package/dist/types/tools.d.ts +0 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,33 +1,35 @@
|
|
|
1
|
-
var Wr=Object.defineProperty;var Hr=(n,e)=>{for(var t in e)Wr(n,t,{get:e[t],enumerable:!0})};import{spawn as Ps}from"child_process";import{createInterface as _s}from"readline";var Jr=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Vr=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],_e=2e3,Gt=5e3;var Bt="1.0.27";var q=41,$t=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Qt=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Yr="QODER_FEATURE_TASKS";function zt(n){let e=n[Yr];if(e!=="0"&&e!=="false")return[...$t];let t=new Set(Qt);return $t.flatMap(r=>r===Qt[0]?["TodoWrite"]:t.has(r)?[]:[r])}import{chmod as Xt,mkdtemp as us,rm as Zt,writeFile as cs}from"fs/promises";import{existsSync as xe,mkdtempSync as ls,readFileSync as ds,rmSync as ps,writeFileSync as ms}from"fs";import{homedir as fs,tmpdir as en}from"os";import{dirname as un,join as O}from"path";import{fileURLToPath as gs}from"url";var Xr=/^[A-Za-z0-9_-]{1,64}$/,Zr=new Set(["mcp_list","mcp_get","mcp_call"]);function rt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Xr.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Zr.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function st(n,e){let t={};for(let r of e)rt(n,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 ot(n,e,t=e.tools??[]){let{tools:r,...s}=e,o=st(n,t);return{...s,...o?{toolOverrides:o}:{}}}function Wt(n){let e={};for(let[t,r]of Object.entries(n)){if(r.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let s=r.tools??[],o=s.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=ot(t,r,s)}return e}var es="global",Ht=es==="cn",ts=Ht?"QODERCN_":"QODER_",it=`${ts}VPC_ENDPOINT`,v=Ht?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Jt=v.accessTokenEnv,Ce=v.serviceAccountEnv;function ns(n){return{type:"accessToken",accessToken:n}}function rs(n=Jt){return{type:"accessToken",accessToken:{envVar:n}}}function ss(){return{type:"qodercli"}}function os(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function is(n=Ce){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function as(n){return{type:"jobToken",fetchJobToken:n}}var Vt=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Yt(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Vt),t=Object.keys(n).filter(r=>!e.has(r));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let r of Vt){let s=n[r];if(s!==void 0&&typeof s!="boolean")throw new TypeError(`securityScan.${r} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var tn="QODER_AGENT_SDK_ENTRYPOINT",nn="QODER_AGENT_SDK_VERSION",rn="QODER_SDK_AUTH_PAYLOAD_FILE",hs="sdk-ts",ys=gs(import.meta.url),sn=un(ys),Me=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ae=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function cn(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function Z(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Ss();if(n)return n;let e=vs();if(xe(e))return e;let t=ws();return t||v.cliCommands[0]}function Ss(){for(let n of ln())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=O(n,"dist","_bundled",t);if(xe(r))return r}return null}function vs(){for(let n of ln())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=[O(n,"node_modules",".bin",t),O(n,"..","..",".bin",t)];for(let s of r)if(xe(s))return s}return v.cliCommands[0]}function ws(){let n=process.env[v.cliHomeEnv]??fs();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,r=O(n,v.configDirName,"local",t);if(xe(r))return r}return null}function ln(){let n=[O(sn,".."),O(sn,"..","..")];return[...new Set(n)]}function ks(){return{allow:[],ask:[],deny:[]}}function on(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function bs(n,e){if(e.startsWith("mcp__"))return e;let t=on(n),r=e==="*"?"*":on(e);if(!t||!r)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${r}`}function an(n,e){if(e.length===0)return;let t=new Set(n);for(let r of e)t.has(r)||(n.push(r),t.add(r))}function Rs(n){let e=n??{},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 X=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{ps(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=un(this.authPayloadPath);try{await Zt(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,s]of Object.entries(e))s!==void 0&&(t[r]=s);delete t[tn],delete t[nn],delete t[rn];for(let r of this.serviceAccountCredentialEnvVars())Es(t,r);if(t[tn]=hs,t[nn]=Bt,this.authPayloadPath&&(t[rn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let r=this.options.vpcEndpoint.trim();r?t[it]=r:delete t[it]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ce];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");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.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let r=t.tools??zt(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 s=this.buildSettingsArg();if(s!==void 0&&e.push("--settings",s),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let r={...e??{}};this.applySettingsCompatibility(r),this.applyAdditionalDirectories(r),this.applyMcpPolicyRules(r,t),this.applySecurityScanSetting(r);let s=this.applyFileCheckpointingSetting(r);return Object.keys(s).length>0?JSON.stringify(s):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?Rs(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Yt(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let r=e.general!==null&&typeof e.general=="object"?e.general:{},s=this.toQoderDefaultPermissionMode(t.defaultMode);s!==void 0&&r.defaultPermissionMode===void 0&&(r.defaultPermissionMode=s),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:{},s=Array.isArray(r.additionalDirectories)?[...r.additionalDirectories]:[];an(s,t),r.additionalDirectories=s,e.permissions=r}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[r,s]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[r]??s.tools??[];t[r]=ot(r,s,o)}return t}collectMcpPolicyPermissionRules(){let e=ks(),t=new Map;for(let[r,s]of Object.entries(this.options.mcpToolPolicies??{}))s.length>0&&t.set(r,s);for(let[r,s]of Object.entries(this.options.mcpServers??{})){let o=s.tools;Array.isArray(o)&&o.length>0&&t.set(r,[...t.get(r)??[],...o])}for(let[r,s]of t)for(let o of s){let i=bs(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 s of["allow","ask","deny"]){let o=Array.isArray(r[s])?[...r[s]]:[];an(o,t[s]),r[s]=o}}readSettingsFile(e){let t=ds(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=ls(O(en(),"qoder-agent-sdk-settings-"));let t=O(this.generatedSettingsDir,"settings.json");return ms(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),r=await us(O(en(),"qoder-sdk-auth-"));try{await Xt(r,448);let s=O(r,"payload.json");return await cs(s,JSON.stringify(t),{mode:384}),await Xt(s,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${s}`),s}catch(s){throw await Zt(r,{recursive:!0,force:!0}).catch(()=>{}),s}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,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 Ae(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 Me(t);return r}};function Es(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let r of Object.keys(n))r.toLowerCase()===t&&delete n[r]}function Ie(n,e){let t={...n};for(let[r,s]of Object.entries(e))s!==void 0&&(t[r]=s);return t}var Ts=new Set(["--mcp-config","--proxy","--settings"]);function Oe(n){let e=[];for(let t=0;t<n.length;t+=1){let r=n[t];e.push(r),Ts.has(r)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}var dn=8192,ee=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}},te=class n{static default=new n;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 X(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(Ie(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let r=e.env,{command:s,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${s} ${Oe(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:s,args:o,cwd:this.options.cwd,env: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,u)=>{this.ready=!1,a===q&&this.fireAuthExpired();let c=this.createProcessExitError(a,u);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})})}else this.process=Ps(s,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===q&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
1
|
+
var ko=Object.defineProperty;var Ro=(n,e)=>{for(var t in e)ko(n,t,{get:e[t],enumerable:!0})};import{spawn as si}from"child_process";import{createInterface as ri}from"readline";var Eo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Po=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],et=2e3,zn=5e3;var tt="1.0.28";var oe=41,Ln=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],$n=["TaskCreate","TaskGet","TaskUpdate","TaskList"],To="QODER_FEATURE_TASKS";function Qn(n){let e=n[To];if(e!=="0"&&e!=="false")return[...Ln];let t=new Set($n);return Ln.flatMap(s=>s===$n[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Vn,mkdtemp as Fo,rm as Yn,writeFile as Uo}from"fs/promises";import{existsSync as ot,mkdtempSync as Ko,readFileSync as Lo,rmSync as $o,writeFileSync as zo}from"fs";import{homedir as Qo,tmpdir as Xn}from"os";import{dirname as os,join as $}from"path";import{fileURLToPath as Bo}from"url";var Co=/^[A-Za-z0-9_-]{1,64}$/,Mo=new Set(["mcp_list","mcp_get","mcp_call"]);function Nt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Co.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Mo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function jt(n,e){let t={};for(let s of e)Nt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function qt(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=jt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Bn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.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]=qt(t,s,r)}return e}var Oo="global",Jn=Oo==="cn",Ao=Jn?"QODERCN_":"QODER_",Ft=`${Ao}VPC_ENDPOINT`,v=Jn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Hn=v.accessTokenEnv,nt=v.serviceAccountEnv;function Do(n){return{type:"accessToken",accessToken:n}}function Io(n=Hn){return{type:"accessToken",accessToken:{envVar:n}}}function xo(){return{type:"qodercli"}}function No(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function jo(n=nt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function qo(n){return{type:"jobToken",fetchJobToken:n}}var Gn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Wn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Gn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of Gn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var Zn="QODER_AGENT_SDK_ENTRYPOINT",es="QODER_AGENT_SDK_VERSION",ts="QODER_SDK_AUTH_PAYLOAD_FILE",Jo="sdk-ts",Ho=Bo(import.meta.url),ns=os(Ho),st=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"}},rt=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 it(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function W(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Go();if(n)return n;let e=Wo();if(ot(e))return e;let t=Vo();return t||v.cliCommands[0]}function Go(){for(let n of is())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,"dist","_bundled",t);if(ot(s))return s}return null}function Wo(){for(let n of is())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[$(n,"node_modules",".bin",t),$(n,"..","..",".bin",t)];for(let r of s)if(ot(r))return r}return v.cliCommands[0]}function Vo(){let n=process.env[v.cliHomeEnv]??Qo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,v.configDirName,"local",t);if(ot(s))return s}return null}function is(){let n=[$(ns,".."),$(ns,"..","..")];return[...new Set(n)]}function Yo(){return{allow:[],ask:[],deny:[]}}function ss(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Xo(n,e){if(e.startsWith("mcp__"))return e;let t=ss(n),s=e==="*"?"*":ss(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function rs(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function Zo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var H=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}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{$o(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=os(this.authPayloadPath);try{await Yn(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[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[Zn],delete t[es],delete t[ts];for(let s of this.serviceAccountCredentialEnvVars())ei(t,s);if(t[Zn]=Jo,t[es]=tt,this.authPayloadPath&&(t[ts]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Ft]=s:delete t[Ft]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[nt];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");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.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Qn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.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 r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?Zo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Wn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}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 s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];rs(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=qt(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=Yo(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=Xo(s,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 s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];rs(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Lo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ko($(Xn(),"qoder-agent-sdk-settings-"));let t=$(this.generatedSettingsDir,"settings.json");return zo(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await Fo($(Xn(),"qoder-sdk-auth-"));try{await Vn(s,448);let r=$(s,"payload.json");return await Uo(r,JSON.stringify(t),{mode:384}),await Vn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Yn(s,{recursive:!0,force:!0}).catch(()=>{}),r}}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,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{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,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new rt(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new st(t);return s}};function ei(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function at(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var ti=new Set(["--mcp-config","--proxy","--settings"]);function ut(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),ti.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as ni}from"node:stream";var z=16*1024*1024,je=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},V=class extends ni{constructor(t=z,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new je(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new je(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ve(n,e=z,t="JSONL output"){let s=n.endsWith(`
|
|
2
|
+
`)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new je(t,e)}var as=8192,I=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}},be=class n{static default=new n;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 n(at(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 s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${ut(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,u)=>{this.ready=!1,a===oe&&this.fireAuthExpired();let c=this.createProcessExitError(a,u);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})})}else this.process=si(r,o,{cwd:this.options.cwd,env:s,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===oe&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
2
3
|
`)?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=_s({input:e,crlfDelay:1/0});try{for await(let r of t){if(this.closed)break;let s=r.trim();if(s)try{yield JSON.parse(s)}catch{}}this.closed||await this.waitForProcessExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let r=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!r)return;let s=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??_e,i=setTimeout(()=>{if(s()){r("SIGTERM");let a=setTimeout(()=>{s()&&r("SIGKILL")},Gt);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>dn&&(this.stderrTail=this.stderrTail.slice(-dn))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",s=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new ee(s,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==q){if(e!==0&&e!==null)return new ee(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new ee(`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 s=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,r(u)):t()},o=i=>{e.off("exit",s);let a=this.createSpawnError(i);this.processExitError=a,r(a)};e.once("exit",s),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??Z();if(cn(t)){let r=this.options.executable??"node",s=this.options.executableArgs??[];return{command:r,commandArgs:[...s,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Cs(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var he=Cs();function pn(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function De(n,e){return n.create(e)}import{existsSync as Zs}from"fs";import{createInterface as eo}from"readline";import{Worker as to}from"worker_threads";import{createHash as Ms}from"node:crypto";import{existsSync as As}from"node:fs";import{chmod as xs,lstat as Is,mkdir as ye,readFile as mn,readdir as Os,readlink as Ds,rename as js,rm as je,stat as Ns,symlink as Ks,writeFile as fn}from"node:fs/promises";import{tmpdir as Fs,userInfo as Us}from"node:os";import{basename as gn,dirname as ne,join as D,relative as qs}from"node:path";var Ls="QODER_WORKER_RUNTIME_ASSET_ROOT",hn=/(^|[\\/])app\.asar([\\/]|$)/,ut=".qoder-worker-runtime-ready";function yn(n){return hn.test(n)}function ct(n){return yn(n)?n.replace(hn,(e,t,r)=>`${t}app.asar.unpacked${r}`):null}async function Ne(n,e={}){let t=ct(n);if(!e.forceMaterialize&&t){let u=ne(t);if(As(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),at(t,u,!1,ne(n))}if(!(e.forceMaterialize||yn(n))){let u=ne(n);return at(n,u,!1)}let s=ne(n),o=await $s(s,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=qs(s,n)||gn(n),a=D(o,i);return at(a,o,!0,s)}function at(n,e,t,r){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:r,env:{[Ls]:e}}}async function $s(n,e,t){let r=await Qs(n,e),s=t.cacheDir??zs(),o=D(s,r),i=D(o,ut);if(await vn(i)===r)return o;let a=D(s,`.setup-${r}-${process.pid}-${Date.now()}`);await ye(s,{recursive:!0,mode:448}),await je(a,{recursive:!0,force:!0}),await je(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await ye(a,{recursive:!0,mode:448}),await Sn(n,a),await fn(D(a,ut),r,{mode:384}),await Bs(a,o,r),o}catch(u){throw await je(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Qs(n,e){let t=Ms("sha256");t.update("qoder-worker-runtime-v1\0");let r=await wn(D(n,"runtime-info.json"));if(r)t.update(r);else{t.update(e);let s=await Ns(e).catch(()=>null);s&&t.update(`${s.size}\0${s.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function Sn(n,e){let t=await Os(n,{withFileTypes:!0});await ye(e,{recursive:!0,mode:448});for(let r of t){let s=D(n,r.name),o=D(e,r.name);if(r.isDirectory()){await Sn(s,o);continue}if(r.isSymbolicLink()){await ye(ne(o),{recursive:!0,mode:448}),await Ks(await Ds(s),o);continue}if(!r.isFile())continue;let i=await Gs(s);await ye(ne(o),{recursive:!0,mode:448}),await fn(o,await mn(s),{mode:i}),process.platform!=="win32"&&await xs(o,i)}}async function Gs(n){let e=((await Is(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=gn(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Bs(n,e,t){try{await js(n,e)}catch(r){if(await vn(D(e,ut))===t){await je(n,{recursive:!0,force:!0});return}throw r}}async function vn(n){let e=await wn(n);return e?e.toString("utf8"):null}async function wn(n){try{return await mn(n)}catch{return null}}function zs(){let n=Ws(Us().username||process.env.USER||process.env.USERNAME||"user");return D(Fs(),`qoder-sdk-worker-runtime-${n}`)}function Ws(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Hs="QODER_WORKER_CWD";function Ke(n,e){return{env:{...e.env,[Hs]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as lt}from"node:fs";import{dirname as Js,join as L}from"node:path";import{fileURLToPath as Vs}from"node:url";var Ys=Vs(import.meta.url),dt=Js(Ys);function re(n){if(n)return n;let e=[];for(let t of Xs())e.push(L(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),L(t,"dist","_worker","qoder-worker-runtime.mjs"),L(t,"_worker","qoder-worker-runtime.obf.mjs"),L(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(lt(t))return t;return e[0]??L(dt,"..","_worker","qoder-worker-runtime.obf.mjs")}function kn(n){let e=re(n);if(lt(e))return!0;let t=ct(e);return t!==null&<(t)}function Xs(){let n=[L(dt,".."),L(dt,"..","..")];return[...new Set(n)]}var bn=8192,$=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},se=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new pt(Ie(this.options,e))}},pt=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 X(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=re(this.options.pathToQoderWorkerRuntime),r;try{r=await Ne(t,{diagnostics:this.diagnostics})}catch(a){throw new $(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let s=r.runtimePath;if(!Zs(s))throw new $(`Qoder worker runtime not found: ${s}`);let o=this.options.cwd??process.cwd(),i=Ke(r,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${s}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Oe(e.args)}`),this.worker=new to(s,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===q&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
4
|
+
`;if(ve(t,z,"SDK process input"),!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=new V(z,"SDK process output");e.pipe(t);let s=ri({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}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 s=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!s)return;let r=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??et,i=setTimeout(()=>{if(r()){s("SIGTERM");let a=setTimeout(()=>{r()&&s("SIGKILL")},zn);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>as&&(this.stderrTail=this.stderrTail.slice(-as))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new I(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==oe){if(e!==0&&e!==null)return new I(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new I(`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,s)=>{let r=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{e.off("exit",r);let a=this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??W();if(it(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,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 oi(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ie=oi();function us(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function ct(n,e){return n.create(e)}import{existsSync as Oi}from"fs";import{createInterface as Ai}from"readline";import{Worker as Di}from"worker_threads";import{createHash as ii}from"node:crypto";import{existsSync as ai}from"node:fs";import{chmod as ui,lstat as ci,mkdir as qe,readFile as cs,readdir as di,readlink as li,rename as pi,rm as dt,stat as mi,symlink as fi,writeFile as ds}from"node:fs/promises";import{tmpdir as gi,userInfo as hi}from"node:os";import{basename as ls,dirname as _e,join as Q,relative as yi}from"node:path";var Si="QODER_WORKER_RUNTIME_ASSET_ROOT",ps=/(^|[\\/])app\.asar([\\/]|$)/,Kt=".qoder-worker-runtime-ready";function ms(n){return ps.test(n)}function Lt(n){return ms(n)?n.replace(ps,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ke(n,e={}){let t=Lt(n);if(!e.forceMaterialize&&t){let u=_e(t);if(ai(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ut(t,u,!1,_e(n))}if(!(e.forceMaterialize||ms(n))){let u=_e(n);return Ut(n,u,!1)}let r=_e(n),o=await wi(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=yi(r,n)||ls(n),a=Q(o,i);return Ut(a,o,!0,r)}function Ut(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[Si]:e}}}async function wi(n,e,t){let s=await vi(n,e),r=t.cacheDir??ki(),o=Q(r,s),i=Q(o,Kt);if(await gs(i)===s)return o;let a=Q(r,`.setup-${s}-${process.pid}-${Date.now()}`);await qe(r,{recursive:!0,mode:448}),await dt(a,{recursive:!0,force:!0}),await dt(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await qe(a,{recursive:!0,mode:448}),await fs(n,a),await ds(Q(a,Kt),s,{mode:384}),await _i(a,o,s),o}catch(u){throw await dt(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function vi(n,e){let t=ii("sha256");t.update("qoder-worker-runtime-v1\0");let s=await hs(Q(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await mi(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function fs(n,e){let t=await di(n,{withFileTypes:!0});await qe(e,{recursive:!0,mode:448});for(let s of t){let r=Q(n,s.name),o=Q(e,s.name);if(s.isDirectory()){await fs(r,o);continue}if(s.isSymbolicLink()){await qe(_e(o),{recursive:!0,mode:448}),await fi(await li(r),o);continue}if(!s.isFile())continue;let i=await bi(r);await qe(_e(o),{recursive:!0,mode:448}),await ds(o,await cs(r),{mode:i}),process.platform!=="win32"&&await ui(o,i)}}async function bi(n){let e=((await ci(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=ls(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function _i(n,e,t){try{await pi(n,e)}catch(s){if(await gs(Q(e,Kt))===t){await dt(n,{recursive:!0,force:!0});return}throw s}}async function gs(n){let e=await hs(n);return e?e.toString("utf8"):null}async function hs(n){try{return await cs(n)}catch{return null}}function ki(){let n=Ri(hi().username||process.env.USER||process.env.USERNAME||"user");return Q(gi(),`qoder-sdk-worker-runtime-${n}`)}function Ri(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Ei="QODER_WORKER_CWD";function lt(n,e){return{env:{...e.env,[Ei]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as $t}from"node:fs";import{dirname as Pi,join as ae}from"node:path";import{fileURLToPath as Ti}from"node:url";var Ci=Ti(import.meta.url),zt=Pi(Ci);function Y(n){if(n)return n;let e=[];for(let t of Mi())e.push(ae(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),ae(t,"dist","_worker","qoder-worker-runtime.mjs"),ae(t,"_worker","qoder-worker-runtime.obf.mjs"),ae(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if($t(t))return t;return e[0]??ae(zt,"..","_worker","qoder-worker-runtime.obf.mjs")}function ys(n){let e=Y(n);if($t(e))return!0;let t=Lt(e);return t!==null&&$t(t)}function Mi(){let n=[ae(zt,".."),ae(zt,"..","..")];return[...new Set(n)]}var Ss=8192,ue=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}},Re=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new Qt(at(this.options,e))}},Qt=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=Y(this.options.pathToQoderWorkerRuntime),s;try{s=await ke(t,{diagnostics:this.diagnostics})}catch(a){throw new ue(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!Oi(r))throw new ue(`Qoder worker runtime not found: ${r}`);let o=this.options.cwd??process.cwd(),i=lt(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${ut(e.args)}`),this.worker=new Di(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===oe&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
4
5
|
`)?e:e+`
|
|
5
|
-
`;if(
|
|
6
|
+
`;if(ve(t,z,"SDK Worker input"),!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=new V(z,"SDK Worker output");e.pipe(t);let s=Ai({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForWorkerExit()}finally{s.close(),e.unpipe(t),t.destroy()}}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??et;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>Ss&&(this.stderrTail=this.stderrTail.slice(-Ss))}createWorkerError(e){return new ue(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===oe))return new ue(`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,s)=>{let r=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,s(a)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,s(a)};e.once("exit",r),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{}}}};var pt=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 Ii,mkdirSync as xi}from"fs";import{dirname as Ni}from"path";var ji="QODER_AGENT_SDK_DEBUG";function qi(n){return n.debugFile?!0:n.debug===!0||Ui(process.env[ji])}function Fi(n){if(n.debugFile)return n.debugFile}function Ui(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var mt=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=qi(e),this.debugFile=Fi(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let s=this.formatLine(e,t),r=this.debugFile;if(r){this.writeToFile(r,s);return}this.writeToStderr(s)}get filePath(){return this.debugFile}writeToFile(e,t){try{xi(Ni(e),{recursive:!0}),Ii(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let s=new Date().toISOString(),r=this.formatError(t);return`${s} ${e}${r}
|
|
6
7
|
`}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 oe=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 M=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},Se=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}},ve=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}},Q=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var mt="1.3.0";function Rn(n,e,t,r){return new Promise((s,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){o(u);return}s({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;r.set(a,{resolve:s,reject:o}),t.onmessage?t.onmessage(e):(r.delete(a),o(new Error(`No message handler registered for MCP server "${n}"`)))})}function En(n,e,t){if("id"in e&&e.id!==null){let r=`${n}:${e.id}`,s=t.get(r);if(s)return s.resolve(e),t.delete(r),!0}return!1}function Tn(n,e,t){let r=0,s=`${n}:`,o=Array.from(t.entries());for(let i of o){let[a,u]=i;a.startsWith(s)&&(u.reject(e),t.delete(a),r++)}return r}import{randomUUID as co}from"crypto";function Cn(n){if(typeof n!="object"||n===null)return!1;let e=n;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var lo=500,po=1024*1024,mo=6e4,fo=[200,800],qe=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=go(e.filePath),r=ho(e.entries),s=_n(t),o=this.states.get(s);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(s,o)),o.entries.push(...r),o.bytes+=So(r),(this.options.flushMode==="eager"||o.entries.length>=lo||o.bytes>=po)&&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 vo(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??mo,retryDelaysMs:this.options.retryDelaysMs??fo})}catch(r){this.options.diagnostics?.record(`[SessionStore] append failed for ${_n(e.key)}`,r),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:r instanceof Error?r.message:String(r),key:{...e.key},uuid:co(),session_id:e.key.sessionId})}})}};function go(n){let e=n.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: ${n}`);let s=r[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(r[1]);if(r.length===2&&o)return{projectKey:s,sessionId:Pn(o[1])};let i=Pn(r[1]),a=r.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return yo(c),{projectKey:s,sessionId:i,subpath:c}}function ho(n){return n.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 Pn(n){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n))throw new Error(`Invalid transcript session id: ${n}`);return n}function yo(n){let e=n.split("/");if(!n||n.includes("\0")||/^[a-z]:/i.test(n)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${n}`)}function _n(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function So(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function vo(n,e,t,r){for(let s=0;;s++)try{await wo(n.append({...e},structuredClone(t)),r.appendTimeoutMs);return}catch(o){if(o instanceof Le)throw o;let i=r.retryDelaysMs[s];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function wo(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((r,s)=>{t=setTimeout(()=>s(new Le(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Le=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Mn(){return Math.random().toString(36).substring(2,15)}function An(n,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:n,request:t}}function xn(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function In(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function On(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function Dn(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function jn(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function ie(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let r=e.type;return typeof r=="string"?r:void 0}function Nn(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function Kn(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function Fn(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Un(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function qn(n){return typeof n=="object"&&n!==null&&n.type==="result"}var ko="<synthetic>";function bo(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==ko?n:{...n,isApiErrorMessage:!0}}var Qe=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;initResponse;initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;constructor(e,t,r,s,o,i,a,u,c,d,m,p,l,g,h,f,y,w="batched",S,T,P,H){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=r,this.hooks=s??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=S??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=g,this.fetchServiceAccountToken=T,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=h,this.resolveModelTimeoutMs=f??500,this.memoryCallbacks=P,this.skillEvolutionCallbacks=H,this.inputStream=new oe(()=>{this.close().catch(()=>{})}),y&&(this.transcriptMirrorBatcher=new qe({store:y,flushMode:w,diagnostics:c,onMirrorError:k=>this.inputStream.enqueue(k)})),this.readLoopPromise=this.readMessages().catch(k=>{this.inputStream.error(k)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let k=this.abortController.signal;k.aborted?this.close().catch(()=>{}):k.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 s=this.extractMessagePreview(t.content);if(s)return s;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let 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,s=this.getRecord(t)?.content,o=Array.isArray(s)?s.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(Cn(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(s){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",s)}continue}if(On(t)){this.handleControlResponse(t);continue}if(Dn(t)){this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",s)});continue}if(jn(t)){this.handleControlCancelRequest(t);continue}if(Nn(t)||Kn(t)||Fn(t)||Un(t))continue;if(qn(t)){await this.transcriptMirrorBatcher?.flush();let s=t;this.recordInboundSessionMessage(s),this.resultMessage=s,this.pendingErrorResultExit=this.resultMessage.is_error===!0,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(s),this.isSingleTurn&&this.flushBeforeEndInput();continue}let r=bo(t);if((r.type==="user"||r.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(r),r.type==="system"&&r.subtype==="init")try{let s=r;this.validateProtocolHandshake(s),this.cliCapabilities=new Set(s.capabilities??[])}catch(s){throw this.inputStream.error(s),s}this.dispatchMemoryCallbacks(r),this.dispatchSkillEvolutionCallbacks(r),this.notifyAuthExpiredIfNeeded(r),this.inputStream.enqueue(r)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):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()}}isStructuredResultExit(e){if(!this.pendingErrorResultExit||e===null||typeof e!="object")return!1;let t=e;return t.exitCode===1&&(t.signal===void 0||t.signal===null)}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let r=e.type==="auth_status"&&!!e.error,s=e.type==="assistant"&&e.error==="authentication_failed";!r&&!s||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(r=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",r)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}dispatchSkillEvolutionCallbacks(e){if(!(e.type!=="system"||e.subtype!=="skill_evolution"||!this.skillEvolutionCallbacks))try{let t=this.skillEvolutionCallbacks.onResult?.(e.result);t!==void 0&&Promise.resolve(t).catch(r=>this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",r))}catch(t){this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",t)}}flushBeforeEndInput(){return this.endInputFlushPromise||(this.endInputFlushPromise=this.performFlushBeforeEndInput()),this.endInputFlushPromise}async performFlushBeforeEndInput(){try{let e=[];this.initConfig.memory!==void 0&&e.push(this.flushMemory()),this.initConfig.evolution?.skill!==void 0&&e.push(this.flushSkillEvolution());let r=(await Promise.allSettled(e)).find(s=>s.status==="rejected");if(r)throw r.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new M;let r=Mn(),s=An(r,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=ie(s.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let d=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:r})+`
|
|
8
|
-
`)}catch(g){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",g)}},p=()=>{d&&(clearTimeout(d),d=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(
|
|
9
|
-
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${
|
|
10
|
-
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${
|
|
11
|
-
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${
|
|
12
|
-
`),this.recordOutboundSessionMessage(i)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(r=>typeof r=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new Q(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let r=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(s=>({...s}))}:{}},{timeoutMs:0,signal:t?.signal});return r?.response==null?null:{response:r.response,synthetic:r.synthetic??!1,...r.refusal_fallback?{refusalFallback:{originalModel:r.refusal_fallback.original_model,fallbackModel:r.refusal_fallback.fallback_model,content:r.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=Po(e?.usage),r=To(e?.session);return!t&&!r?null:{...t??{},...r?{session:r}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let r={type:"rewind_files",user_message_id:e};t?.dryRun&&(r.dry_run=!0);let o=await this.request(r);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let s={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(s.dry_run=!0),await this.request(s)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new Q("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Wt(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}:{}}),s=r?.requiresUserAction===!0,o=typeof r?.authUrl=="string"?r.authUrl:void 0;if(s&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return s?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(t){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,r]of this.sdkMcpTransports){try{await r.close()}catch(s){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,s)}Tn(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function G(n){return typeof n=="object"&&n!==null}function ft(n){return typeof n=="number"&&Number.isFinite(n)}function gt(n){return Object.keys(n).length>0}function j(n,e,t){let r=e[t];ft(r)&&(n[t]=r)}function ae(n,e,t){let r=e[t];typeof r=="string"&&(n[t]=r)}function $e(n,e,t){let r=e[t];typeof r=="boolean"&&(n[t]=r)}function $n(n){if(!G(n)||Array.isArray(n))return;let e={};return j(e,n,"total"),j(e,n,"used"),j(e,n,"remaining"),j(e,n,"percentage"),ae(e,n,"unit"),gt(e)?e:void 0}function Ro(n){if(!G(n)||Array.isArray(n))return;let e=$n(n)??{};return ae(e,n,"detailUrl"),gt(e)?e:void 0}function Eo(n){if(!G(n)||Array.isArray(n))return;let e={};return j(e,n,"used"),j(e,n,"cap"),j(e,n,"remaining"),j(e,n,"percentage"),$e(e,n,"available"),ae(e,n,"unit"),gt(e)?e:void 0}function To(n){if(!G(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!ft(e)||e<0||!G(t)||Array.isArray(t))return;let r={};for(let[s,o]of Object.entries(t)){if(!G(o)||Array.isArray(o))continue;let i=o.credits;ft(i)&&i>=0&&(r[s]={credits:i})}return{total_credits:e,model_usage:r}}function Po(n){if(!G(n)||Array.isArray(n))return null;let e={};ae(e,n,"userId"),ae(e,n,"userType"),j(e,n,"totalUsagePercentage"),$e(e,n,"isHighestTier"),j(e,n,"expiresAt"),ae(e,n,"upgradeUrl"),$e(e,n,"isQuotaExceeded"),$e(e,n,"isPlanQuotaProrated");let t=$n(n.userQuota);t&&(e.userQuota=t);let r=Ro(n.addOnQuota);r&&(e.addOnQuota=r);let s=Eo(n.orgResourcePackage);return s&&(e.orgResourcePackage=s),e}function _o(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,r=typeof t=="string"&&t.length>0?t:void 0,s=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(s){let o=r??s[1];return(!r||r===s[1])&&(e=s[2]||e),{error:e,code:o}}return r?{error:e,code:r}:{error:e}}function Ln(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Ge=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 Qn}from"crypto";var Co="QODER_CLOUD_AGENT_API_BASE",Mo="https://api.qoder.com/api/v1/cloud",N={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Ao=1024,Gn=1*1024*1024,Bn=4*1024*1024,xo=8*1024,yt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},Be=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},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}},Io=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Jn(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!Io.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new Be;let{agent:t,session:r}=n.experimentalCloudAgent;if(t&&ue(t)&&ht(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(r&&ue(r)&&ht(r))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(r&&ue(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 s=!!r&&ue(r);if(!s&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!s){if(!r||!ht(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 ue(n){return"id"in n&&n.id!==void 0}function ht(n){return"create"in n&&n.create!==void 0}function Vn(n){return new vt(n)}var vt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Wo();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Hn();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=Oo(e.options.auth,e.options.env),this.apiBase=Do(),this.inputStream=new oe(()=>{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(Bo(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=Go(t);this.beginPendingTurn();let s=await this.postSessionEvents([{type:N.userMessage,content:r}]);this.postedMessages+=1,this.activateTurn(s.find(o=>o.type===N.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:N.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&ue(e))t=e.id;else{let r=await this.resolveAgentId(),s=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:r,...No(s)}});t=zn(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(ue(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:jo(e.create)});return zn(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 zo(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 s=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await Wn(s);if(!s.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(s.body)}async readSseBody(e){let t=e.getReader(),r=new TextDecoder,s="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){s+=r.decode(),s.length>0&&this.consumeSseLine(s,o);break}s+=r.decode(a,{stream:!0});let u;for(;(u=s.indexOf(`
|
|
13
|
-
`))!==-1;){let c=
|
|
14
|
-
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let
|
|
15
|
-
`):JSON.stringify(e)}function
|
|
16
|
-
`);await
|
|
17
|
-
`:"")}async function ar(n,e){await sr(ui(n),{recursive:!0,mode:448}),await oi(n,e,{encoding:"utf8",mode:384}),await rr(n,384)}async function bt(n,e,t){let r;n.catch(()=>{});try{return await Promise.race([n,new Promise((s,o)=>{r=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{r!==void 0&&clearTimeout(r)}}var wi=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function ki(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return wi.test(e)}function We(n,e,t=process.env){let r=n.pathToQoderCLIExecutable;return r?ki(r)?{transport:"worker",pathToQoderWorkerRuntime:r}:{transport:"process"}:n.executable!==void 0||n.executableArgs!==void 0||n.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}import ur from"node:path";function le(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function ke(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function bi(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,r]of n.entries()){if(!r||typeof r!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(le(r.id,`options.memory.generation.roots[${t}].id`),le(r.path,`options.memory.generation.roots[${t}].path`),e.has(r.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${r.id}"`);if(e.add(r.id),r.access!==void 0&&r.access!=="read"&&r.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(r.indexFile!==void 0){le(r.indexFile,`options.memory.generation.roots[${t}].indexFile`);let s=r.indexFile.replaceAll("\\","/");if(ur.posix.isAbsolute(s)||ur.win32.isAbsolute(r.indexFile)||s.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Ri(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,r]of n.entries()){if(!r||typeof r!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(le(r.id,`options.memory.consumption.files[${t}].id`),le(r.path,`options.memory.consumption.files[${t}].path`),e.has(r.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${r.id}"`);if(e.add(r.id),r.required!==void 0&&typeof r.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function cr(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(n))throw new TypeError("options.memory must be an object");if(Object.keys(n).length===0)return{};if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(n.projectScope!==void 0&&typeof n.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(n.userScope!==void 0&&typeof n.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(n.mode==="native"){if(n.projectScope===!1&&n.userScope===!1)throw new TypeError("options.memory native mode requires at least one enabled scope; use memory: {} to disable SDK memory");let i=Object.keys(n.generation??{}),a=Object.keys(n.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return ke(n.generation?.onResult,"options.memory.generation.onResult"),ke(n.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native",...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{}},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n.generation?.onResult,onConsumptionResult:n.consumption?.onResult}}}let t,r=n.generation;if(r!==void 0){if(!r||typeof r!="object")throw new TypeError("options.memory.generation must be an object");if(r.enabled!==void 0&&typeof r.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");bi(r.roots),r.prompt!==void 0&&le(r.prompt,"options.memory.generation.prompt"),ke(r.onResult,"options.memory.generation.onResult");let i;if(r.turnComplete!==void 0){let a=r.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if(ke(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(r.turnComplete?.enabled===!0&&r.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:r.enabled??!0,roots:r.roots?.map(a=>({...a})),prompt:r.prompt,turnComplete:i}}let s,o=n.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Ri(o.files),o.maxTokens!==void 0&&(!Number.isInteger(o.maxTokens)||o.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(o.overflow!==void 0&&o.overflow!=="truncate"&&o.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(o.failureMode!==void 0&&o.failureMode!=="best_effort"&&o.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');ke(o.onResult,"options.memory.consumption.onResult"),s={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:n.mode,...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{},generation:t,consumption:s},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:r?.onResult,onConsumptionResult:o?.onResult}}}var He=10;function Ei(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function Je(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function lr(n){if(n!==void 0){if(!Number.isInteger(n)||n<1||n>10)throw new TypeError(`options.evolution.skill.generation.turnComplete.reviewThreshold must be an integer between 1 and ${10}`);return n}}function Ti(n){let e={shouldReviewCallbacks:new Map};if(n===void 0)return{config:void 0,callbacks:e};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill.generation must be an object");if("roots"in n)throw new TypeError("options.evolution.skill.generation does not accept roots; roots are derived from loaded skills");if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");if(n.prompt!==void 0&&Ei(n.prompt,"options.evolution.skill.generation.prompt"),n.maxSuggestions!==void 0&&(!Number.isInteger(n.maxSuggestions)||n.maxSuggestions<1||n.maxSuggestions>10))throw new TypeError("options.evolution.skill.generation.maxSuggestions must be an integer between 1 and 10");Je(n.onResult,"options.evolution.skill.generation.onResult");let t;if(n.turnComplete!==void 0){if(!n.turnComplete||typeof n.turnComplete!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(n.turnComplete.enabled!==void 0&&typeof n.turnComplete.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.turnComplete.enabled must be a boolean");let r=lr(n.turnComplete.reviewThreshold);if(Je(n.turnComplete.shouldReview,"options.evolution.skill.generation.turnComplete.shouldReview"),n.turnComplete.timeoutMs!==void 0&&(!Number.isFinite(n.turnComplete.timeoutMs)||n.turnComplete.timeoutMs<=0))throw new TypeError("options.evolution.skill.generation.turnComplete.timeoutMs must be a positive finite number");if(n.turnComplete.onGateError!==void 0&&n.turnComplete.onGateError!=="skip"&&n.turnComplete.onGateError!=="report_failed")throw new TypeError('options.evolution.skill.generation.turnComplete.onGateError must be "skip" or "report_failed"');let s=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;s&&e.shouldReviewCallbacks.set(s,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:r,shouldReviewCallbackId:s,timeoutMs:n.turnComplete.timeoutMs,onGateError:n.turnComplete.onGateError}}if(n.turnComplete!==void 0&&t?.enabled===!0&&n.enabled===!1)throw new TypeError("options.evolution.skill.generation.turnComplete cannot be enabled when generation.enabled is false");return{config:{enabled:n.enabled??!0,prompt:n.prompt,maxSuggestions:n.maxSuggestions,turnComplete:t},callbacks:{...e,onResult:n.onResult}}}function dr(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill must be an object");if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.evolution.skill.mode must be "native" or "custom"');let e=n.generation;if(n.mode==="native"){if(Object.keys(e??{}).some(i=>i!=="enabled"&&i!=="onResult"&&i!=="turnComplete"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.enabled, generation.onResult, and generation.turnComplete.reviewThreshold');if(e?.enabled!==void 0&&typeof e.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");let s=e?.turnComplete;if(s!==void 0){if(!s||typeof s!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(Object.keys(s).some(i=>i!=="reviewThreshold"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.turnComplete.reviewThreshold')}let o=lr(s?.reviewThreshold);return e?.enabled===!1?(Je(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(Je(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...o===void 0?{}:{generation:{turnComplete:{reviewThreshold:o}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=Ti(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}var Rt=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 Pi(n){if(n.transport!==void 0){if(pn(n.transport))return n.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let e=We(n,he);return e.transport==="worker"?new se({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):te.default}function Et(n){let{prompt:e,options:t={}}=n,r=Pi(t),s=new Ue({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.");if(t.planMode!==void 0&&typeof t.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");let o=t.auth;if(o==null)throw new Rt;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 ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(t.sessionStore&&!(r instanceof te)&&!(r instanceof se))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(t.sessionStore&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(t.sessionStore&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(t.sessionStore&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Jn(t),Vn({prompt:e,options:t,diagnostics:s});let i=cr(t.memory),a=dr(t.evolution?.skill),u=t.onAuthExpired,c=!1,d=u?()=>{c||(c=!0,Promise.resolve(u()).catch(b=>{s.record("[query] onAuthExpired callback threw:",b)}))}:void 0,m=new Map,p=new Map,l=new Map,g={},h={},f={};if(t.mcpServers)for(let[b,I]of Object.entries(t.mcpServers)){let U=I.tools;if(Array.isArray(U)&&U.length>0&&(h[b]=U),I.type==="sdk"&&"instance"in I&&I.instance){let Y=I.instance;if(m.set(b,Y),U){let Pe=st(b,U);Pe&&(f[b]=Pe)}let Lt=new Ge(Pe=>{En(b,Pe,l)});p.set(b,Lt),Y.connect(Lt).catch(()=>{})}else g[b]=I}let y=Object.keys(g).length>0,w=Object.keys(h).length>0,S=t.pathToQoderCLIExecutable,T=t.env,P=o?.type==="jobToken"?o.fetchJobToken:void 0,H=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,k={pathToQoderCLIExecutable:S,executable:t.executable,executableArgs:t.executableArgs,env:T,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:o,model:t.model,agent:t.agent,debug:t.debug,diagnostics:s,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:t.sessionStore!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let b=t.allowedTools??[];if(t.skills===void 0)return b.length>0?b:void 0;let I=t.skills==="all"?["Skill"]:t.skills.map(Y=>`Skill(${Y})`),U=new Set(b);return[...b,...I.filter(Y=>!U.has(Y))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:y?g:void 0,mcpToolPolicies:w?h:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,securityScan:t.securityScan,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:d},ge=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new Fe(async()=>{let b=await ir({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!b)return{transport:De(r,{...k,continue:!1})};try{return{transport:De(r,{...k,env:{...k.env??process.env,[v.configDirEnv]:b.configDir},continue:!1,resume:b.sessionId}),cleanup:b.cleanup}}catch(I){throw await b.cleanup(),I}}):De(r,k);ge.initialize().catch(()=>{});let Br=typeof e=="string",V=t.systemPrompt,Ut,qt;if(typeof V=="string")Ut=V;else if(typeof V=="object"&&V!==null&&V.type==="preset"){let b=V;if(b.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(b.preset)}`);qt=b.append}let zr={systemPrompt:Ut,appendSystemPrompt:qt,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:t.planMode,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing,memory:i.config,evolution:a.config?{skill:a.config}:void 0,customContext:t.customContext},nt=new Qe(ge,Br,t.canUseTool,t.hooks,t.abortController,m,zr,t.onElicitation,s,d,t.controlRequestTimeoutMs,p,l,P,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",f,H,i.callbacks,a.callbacks);if(typeof e=="string"){let b={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};nt.streamInput(async function*(){yield b}())}else nt.streamInput(e);return nt}var Tt=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},Pt=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function _i(n={}){let e=n.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(n.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new Tt,r=Et({prompt:t,options:n.options}),s;try{return await Promise.race([r.initializationResult(),new Promise((o,i)=>{s=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new Pt(r,t)}catch(o){throw t.discard(),await r.close(),o}finally{s!==void 0&&clearTimeout(s)}}import{readFile as Ci}from"node:fs/promises";import Mi from"node:os";import x from"node:path";var Ai=["user","project","local"],Mt=new Set(["__proto__","constructor","prototype"]),xi=/^[\p{L}\p{N}\p{M}._ -]+$/u,Ii=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Oi=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Di=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),ji=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function z(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Ni(n){let e=n.charCodeAt(0)===65279?n.slice(1):n,t="",r=!1,s=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
|
|
8
|
+
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};import{randomUUID as Yi}from"node:crypto";var X=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"}},Fe=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}},G=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}},ce=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var Bt="1.3.0";var Ki=new Set(["default","acceptEdits","auto","bypassPermissions"]);function Ue(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Ki.has(n))return n;if(n==="plan")throw new Error('permissionMode="plan" is not supported for daemon Queries; use planMode or setPlanMode() instead.');let e=typeof n=="string"?JSON.stringify(n):n===null?"null":typeof n;throw new Error(`permissionMode=${e} is not supported for daemon Queries; use default, acceptEdits, auto, or bypassPermissions.`)}function ws(n,e,t,s){return new Promise((r,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){o(u);return}r({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:r,reject:o}),t.onmessage?t.onmessage(e):(s.delete(a),o(new Error(`No message handler registered for MCP server "${n}"`)))})}function vs(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,r=t.get(s);if(r)return r.resolve(e),t.delete(s),!0}return!1}function bs(n,e,t){let s=0,r=`${n}:`,o=Array.from(t.entries());for(let i of o){let[a,u]=i;a.startsWith(r)&&(u.reject(e),t.delete(a),s++)}return s}import{randomUUID as Li}from"crypto";function Rs(n){if(typeof n!="object"||n===null)return!1;let e=n;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var $i=500,zi=1024*1024,Qi=6e4,ft=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=Bi(e.filePath),s=Ji(e.entries),r=ks(t),o=this.states.get(r);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(r,o)),o.entries.push(...s),o.bytes+=Gi(s),(this.options.flushMode==="eager"||o.entries.length>=$i||o.bytes>=zi)&&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 Wi(this.options.store,e.key,t,this.options.appendTimeoutMs??Qi)}catch(s){this.options.diagnostics?.record(`[SessionStore] append failed for ${ks(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:Li(),session_id:e.key.sessionId})}})}};function Bi(n){let e=n.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),s=e.slice(t+1);if(t<0||s.length<2)throw new Error(`Invalid transcript mirror path: ${n}`);let r=s[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(s[1]);if(s.length===2&&o)return{projectKey:r,sessionId:_s(o[1])};let i=_s(s[1]),a=s.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return Hi(c),{projectKey:r,sessionId:i,subpath:c}}function Ji(n){return n.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 _s(n){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n))throw new Error(`Invalid transcript session id: ${n}`);return n}function Hi(n){let e=n.split("/");if(!n||n.includes("\0")||/^[a-z]:/i.test(n)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${n}`)}function ks(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function Gi(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Wi(n,e,t,s){await Vi(n.append({...e},structuredClone(t)),s)}async function Vi(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Jt(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Jt=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 Ps(n,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:n,request:t}}function Ts(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function Cs(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function Ms(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function Os(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function As(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function Ee(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function Ds(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function Is(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function xs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Ns(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function js(n){return typeof n=="object"&&n!==null&&n.type==="result"}var Xi="<synthetic>";function Zi(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==Xi?n:{...n,isApiErrorMessage:!0}}var Ke=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;initResponse;initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;constructor(e,t,s,r,o,i,a,u,c,d,m,p,l,g,h,f,y,b="batched",S,T,C,ye){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=r??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=S??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=g,this.fetchServiceAccountToken=T,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=h,this.resolveModelTimeoutMs=f??500,this.memoryCallbacks=C,this.skillEvolutionCallbacks=ye,this.inputStream=new X(()=>{this.close().catch(()=>{})}),y&&(this.transcriptMirrorBatcher=new ft({store:y,flushMode:b,diagnostics:c,onMirrorError:_=>this.inputStream.enqueue(_)})),this.readLoopPromise=this.readMessages().catch(_=>{this.inputStream.error(_)}),this.initializationPromise=this.initConfig.attachedInitialization?this.initConfig.attachedInitialization.then(_=>(this.initResponse=_,this.cliCapabilities=new Set(_.capabilities??[]),_)):this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let _=this.abortController.signal;_.aborted?this.close().catch(()=>{}):_.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}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 s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;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 s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"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,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.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(Rs(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(Ms(t)){this.handleControlResponse(t);continue}if(Os(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(As(t)){this.handleControlCancelRequest(t);continue}if(Ds(t)||Is(t)||xs(t)||Ns(t))continue;if(js(t)){await this.transcriptMirrorBatcher?.flush();let r=t;this.recordInboundSessionMessage(r),this.resultMessage=r,this.pendingErrorResultExit=this.resultMessage.is_error===!0,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(r),this.isSingleTurn&&this.flushBeforeEndInput();continue}let s=Zi(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let r=s;this.validateProtocolHandshake(r),this.cliCapabilities=new Set(r.capabilities??[])}catch(r){throw this.inputStream.error(r),r}this.dispatchMemoryCallbacks(s),this.dispatchSkillEvolutionCallbacks(s),this.notifyAuthExpiredIfNeeded(s),this.inputStream.enqueue(s)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):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[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}isStructuredResultExit(e){if(!this.pendingErrorResultExit||e===null||typeof e!="object")return!1;let t=e;return t.exitCode===1&&(t.signal===void 0||t.signal===null)}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let s=e.type==="auth_status"&&!!e.error,r=e.type==="assistant"&&e.error==="authentication_failed";!s&&!r||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(s=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",s)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}dispatchSkillEvolutionCallbacks(e){if(!(e.type!=="system"||e.subtype!=="skill_evolution"||!this.skillEvolutionCallbacks))try{let t=this.skillEvolutionCallbacks.onResult?.(e.result);t!==void 0&&Promise.resolve(t).catch(s=>this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",s))}catch(t){this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",t)}}flushBeforeEndInput(){return this.endInputFlushPromise||(this.endInputFlushPromise=this.performFlushBeforeEndInput()),this.endInputFlushPromise}async performFlushBeforeEndInput(){try{let e=[];this.initConfig.memory!==void 0&&e.push(this.flushMemory()),this.initConfig.evolution?.skill!==void 0&&e.push(this.flushSkillEvolution());let s=(await Promise.allSettled(e)).find(r=>r.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new F;let s=Es(),r=Ps(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Ee(r.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let d=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
|
|
9
|
+
`)}catch(g){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",g)}},p=()=>{d&&(clearTimeout(d),d=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(s)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${s} subtype=${i}`),m(),c(new F))};this.pendingRequests.set(s,{resolve:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(g)},reject:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,g),c(g)}}),t?.signal?.addEventListener("abort",l,{once:!0}),o>0&&Number.isFinite(o)&&(d=setTimeout(()=>{this.pendingRequests.has(s)&&(this.pendingRequests.delete(s),p(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o}`),m(),c(new Error(`Control request "${Ee(r.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(r)+`
|
|
10
|
+
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(g){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,g),c(g)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)Ee(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=Ee(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=Ts(t,i);this.transport.write(JSON.stringify(a)+`
|
|
11
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-r}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=ra(i),c=Cs(t,a,u);this.transport.write(JSON.stringify(c)+`
|
|
12
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,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 F}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=Bt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=qs(t),o=qs(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new G(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new F;return new Promise((s,r)=>{let o=()=>{r(new F)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=Ee(s),o=s;switch(r){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let d=c.expiresAt;if(d!==void 0&&(!Number.isFinite(d)||d<1e12))throw new Error("job_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token,...d!==void 0?{expires_at:d}:{}}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,d=o.blocked_path,m=o.decision_reason,p=o.title,l=o.display_name,g=o.description,h=o.agent_id,f=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:d,decisionReason:m,title:p,displayName:l,description:g,toolUseID:u,agentID:h}),t);if(f.behavior==="deny"&&!f.message)throw new Error("Permission deny result must include a message.");return f.behavior==="allow"?{...f,updatedInput:f.updatedInput??a,toolUseID:u}:{...f,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"skill_evolution_should_review":{let i=o.callbackId;if(!i)throw new Error("Skill evolution shouldReview request missing callbackId");let a=this.skillEvolutionCallbacks?.shouldReviewCallbacks.get(i);if(!a)throw new Error(`Unknown skill evolution shouldReview callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Skill evolution shouldReview callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(ws(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,agentId:o.agentId,agentType:o.agentType,resolvedModel:o.resolvedModel,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,d=new Promise((f,y)=>{c=setTimeout(()=>{y(new Fe(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,d]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},l=m?.model;if(typeof l=="string")p.model=l;else if(l!==void 0){let{model:f,...y}=l;p.model=f,p.custom_model={...y,style:y.style??"openai"}}let g=m?.taskId?.trim();g&&(p.task_id=g);let h=m?.subTask?.trim();return h&&(p.sub_task=h),p}default:throw new Error(`Unhandled control request subtype: ${r??"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,supportsAvailableModelsUpdate:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let d=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(d,c),d});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[r]=i)}if(Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let r=Ue(this.initConfig.permissionMode);r!==void 0&&(e.permissionMode=r)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r,this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new ce(n.PLAN_MODE_CAPABILITY);let r={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(r)}return this.initResponse}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(s,"custom_context")?s.custom_context:this.initConfig.customContext,i=typeof s.uuid=="string"&&s.uuid.trim().length>0?s.uuid:Yi(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
|
|
13
|
+
`),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}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(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new ce(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?Ue(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!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 askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=sa(e?.usage),s=na(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}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 s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new ce("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Bn(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 s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(t){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,s]of this.sdkMcpTransports){try{await s.close()}catch(r){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,r)}bs(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function Fs(n){return new Ke(n.transport,!1,n.canUseTool,void 0,void 0,void 0,{attachedInitialization:n.initialization,independentPlanModeControls:!0},n.onElicitation)}function de(n){return typeof n=="object"&&n!==null}function Ht(n){return typeof n=="number"&&Number.isFinite(n)}function Gt(n){return Object.keys(n).length>0}function B(n,e,t){let s=e[t];Ht(s)&&(n[t]=s)}function Pe(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function gt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function Us(n){if(!de(n)||Array.isArray(n))return;let e={};return B(e,n,"total"),B(e,n,"used"),B(e,n,"remaining"),B(e,n,"percentage"),Pe(e,n,"unit"),Gt(e)?e:void 0}function ea(n){if(!de(n)||Array.isArray(n))return;let e=Us(n)??{};return Pe(e,n,"detailUrl"),Gt(e)?e:void 0}function ta(n){if(!de(n)||Array.isArray(n))return;let e={};return B(e,n,"used"),B(e,n,"cap"),B(e,n,"remaining"),B(e,n,"percentage"),gt(e,n,"available"),Pe(e,n,"unit"),Gt(e)?e:void 0}function na(n){if(!de(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Ht(e)||e<0||!de(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!de(o)||Array.isArray(o))continue;let i=o.credits;Ht(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function sa(n){if(!de(n)||Array.isArray(n))return null;let e={};Pe(e,n,"userId"),Pe(e,n,"userType"),B(e,n,"totalUsagePercentage"),gt(e,n,"isHighestTier"),B(e,n,"expiresAt"),Pe(e,n,"upgradeUrl"),gt(e,n,"isQuotaExceeded"),gt(e,n,"isPlanQuotaProrated");let t=Us(n.userQuota);t&&(e.userQuota=t);let s=ea(n.addOnQuota);s&&(e.addOnQuota=s);let r=ta(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function ra(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function qs(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var ht=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 Ks}from"crypto";var oa="QODER_CLOUD_AGENT_API_BASE",ia="https://api.qoder.com/api/v1/cloud",Z={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},aa=1024,Ls=1*1024*1024,$s=4*1024*1024,ua=8*1024,Vt=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"}},yt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Yt=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}},ca=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Js(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!ca.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new yt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Te(t)&&Wt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Te(s)&&Wt(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Te(s)&&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 r=!!s&&Te(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!Wt(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Te(n){return"id"in n&&n.id!==void 0}function Wt(n){return"create"in n&&n.create!==void 0}function Hs(n){return new Xt(n)}var Xt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Ra();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Bs();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=da(e.options.auth,e.options.env),this.apiBase=la(),this.inputStream=new X(()=>{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(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(_a(e.prompt)).catch(s=>{this.closed||this.inputStream.error(s)})}[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 s=ba(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:Z.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===Z.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:Z.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Te(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...ma(r)}});t=zs(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(Te(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:pa(e.create)});return zs(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let s=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==s&&(t=0),t+=1,await ka(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),s=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;s&&t.searchParams.set("after_id",s),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let r=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await Qs(r);if(!r.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(r.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,r="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){r+=s.decode(),r.length>0&&this.consumeSseLine(r,o);break}r+=s.decode(a,{stream:!0});let u;for(;(u=r.indexOf(`
|
|
14
|
+
`))!==-1;){let c=r.slice(0,u);r=r.slice(u+1);let d=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(d,o),this.closed)break}r.length>Ls&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Ls} bytes; resetting buffer.`),r="",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:ha(t.data.join(`
|
|
15
|
+
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let s=e.indexOf(":"),r=s===-1?e:e.slice(0,s),o=s===-1?"":e.slice(s+1);switch(o.startsWith(" ")&&(o=o.slice(1)),r){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>$s){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${$s} 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=U(e.data,"type")??e.event,s=U(e.data,"turn_id"),r={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Ks(),session_id:this.sessionId??U(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(r),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case Z.agentMessage:{let s=Sa(Le(e.data,"content"));s&&this.assistantTextParts.push(s);return}case Z.modelRequestEnd:this.captureUsage(e.data);return;case Z.idle:this.idleSeen=!0,this.finishIfIdle();return;case Z.error:this.emitErrorResult(e),this.finish();return;case Z.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Bs(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let s of t)if(this.isCurrentTurnEvent(s.turnId)&&this.handleCurrentTurnEvent(s.event,s.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,s){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=aa&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:s}))}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(U(e.data,"error")??U(St(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:Ks(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,s=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return fa(s)}captureUsage(e){let t=St(e,"usage");if(!t)return;this.latestUsage=wa(this.latestUsage,t);let s=x(e,"total_cost_usd")??x(e,"cost_usd")??x(t,"total_cost_usd")??x(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let r=U(e,"model")??U(t,"model");if(r){let o=this.latestModelUsage[r]?.costUSD??0;this.latestModelUsage[r]=va(this.latestUsage,o+(s??0))}}async requestJson(e,t){let s=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(!s.ok)throw this.handleAuthFailure(s.status),await Qs(s);if(s.status===204)return{};try{return await s.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 da(n,e){if(n?.type!=="accessToken")throw new yt;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new Vt(t);return s}function la(){return process.env[oa]?.replace(/\/+$/,"")??ia}function pa(n){return Zt({name:n.name,model:n.model,system:n.system,description:n.description,tools:n.tools,mcp_servers:n.mcp_servers,skills:n.skills,metadata:n.metadata})}function ma(n){return Zt({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>Zt({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function Zt(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function zs(n,e){let t=U(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function fa(n){let e=ya(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:U(t,"id"),turnId:U(t,"turn_id"),type:U(t,"type")}]):[]}async function Qs(n){let e=await ga(n,ua);return new Yt(n.status,e||n.statusText||"unknown error")}async function ga(n,e){if(!n.body)try{return(await n.text()).slice(0,e)}catch{return""}let t=n.body.getReader(),s=new TextDecoder,r=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,r.push(s.decode(a,{stream:!0}))}r.push(s.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return r.join("").slice(0,e)}function ha(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function St(n,e){let t=Le(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ya(n,e){let t=Le(n,e);return Array.isArray(t)?t:void 0}function U(n,e){let t=Le(n,e);return typeof t=="string"?t:void 0}function x(n,e){let t=Le(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Le(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function Sa(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Gs(t)?t.text:"").filter(Boolean).join("")||void 0}function wa(n,e){let t=St(e,"cache_creation"),s=St(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:x(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:x(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:x(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:x(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:x(e,"input_tokens")??n.input_tokens,output_tokens:x(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:x(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:x(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function va(n,e){return{inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,webSearchRequests:n.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function ba(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Gs(t)?t.text:JSON.stringify(t)).join(`
|
|
16
|
+
`):JSON.stringify(e)}function Gs(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function _a(n){return typeof n!="string"?n:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:n}]},parent_tool_use_id:null}}()}function Bs(){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 ka(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function Ra(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as Da,chmod as er,cp as Ia,mkdtemp as xa,mkdir as tr,realpath as nr,rm as Ys,writeFile as Na}from"fs/promises";import{homedir as ja,tmpdir as qa}from"os";import{dirname as Fa,isAbsolute as sr,join as le,relative as Ua,resolve as en,sep as Ka}from"path";import{homedir as Ea}from"os";import{join as Vs}from"path";var Pa=v.configDirName,Ta=v.cliHomeEnv,Ca=v.configDirEnv,Ws=200;function Ma(){return process.env[Ta]||Ea()}function Oa(){let n=process.env[Ca];return n||Vs(Ma(),Pa)}function Ce(){return Vs(Oa(),"projects")}function Aa(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function N(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ws)return e;let t=Math.abs(Aa(n)).toString(36);return`${e.slice(0,Ws)}-${t}`}var La=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,$a=6e4;async function wt(n){if(n.resume===void 0&&!n.continue)return;let e=N(await Ba(n.cwd)),t=n.loadTimeoutMs??$a,s=n.resume!==void 0?n.resume:await Ja(n.store,e,t);if(s===void 0||!La.test(s))return;let r={projectKey:e,sessionId:s},o=await Xs(n.store,r,t);if(!o)return;let i=n.store.listSubkeys?await tn(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Ga(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let d=await Xs(n.store,{...r,subpath:c},t);d&&a.push({subpath:c,entries:d})}let u;try{u=await xa(le(qa(),"qoder-session-store-")),await er(u,448),u=await nr(u),await Qa(za(n.env),u);let c=le(u,"projects",e),d=le(c,s);await tr(c,{recursive:!0,mode:448}),await Zs(le(c,`${s}.jsonl`),o);for(let{subpath:p,entries:l}of a){let g=Wa(d,`${p}.jsonl`),h=l.filter(y=>y.type==="agent_metadata"),f=l.filter(y=>y.type!=="agent_metadata");if(f.length>0&&await Zs(g,f),h.length>0){let y={...h.at(-1)};delete y.type,await rr(g.slice(0,-6)+".meta.json",JSON.stringify(y))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await Ys(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await Ys(u,{recursive:!0,force:!0}),c}}function za(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??ja();return en(n?.[v.configDirEnv]??process.env[v.configDirEnv]??le(e,v.configDirName))}async function Qa(n,e){for(let t of[".auth","oauth_creds.json"]){let s=le(n,t);try{await Da(s),await Ia(s,le(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Ba(n){let e=en(n??process.cwd());try{return await nr(e)}catch{return e}}async function Ja(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await tn(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((r,o)=>o.mtime-r.mtime)[0]?.sessionId}async function Xs(n,e,t){let s=await tn(n.load({...e}),t,"load");if(!(s===null||s.length===0)){if(!Array.isArray(s))throw new Error("SessionStore load() must return an array or null");return s.map((r,o)=>Ha(r,o))}}function Ha(n,e){if(n===null||typeof n!="object"||typeof n.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(n);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 Ga(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||sr(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Wa(n,e){let t=en(n,e),s=Ua(n,t);if(s===""||s===".."||s.startsWith(`..${Ka}`)||sr(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Zs(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
|
|
17
|
+
`);await rr(n,t?`${t}
|
|
18
|
+
`:"")}async function rr(n,e){await tr(Fa(n),{recursive:!0,mode:448}),await Na(n,e,{encoding:"utf8",mode:384}),await er(n,384)}async function tn(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((r,o)=>{s=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var Va=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Ya(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return Va.test(e)}function Me(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?Ya(s)?{transport:"worker",pathToQoderWorkerRuntime:s}:{transport:"process"}:n.executable!==void 0||n.executableArgs!==void 0||n.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}import or from"node:path";function Oe(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function $e(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function Xa(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(Oe(s.id,`options.memory.generation.roots[${t}].id`),Oe(s.path,`options.memory.generation.roots[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${s.id}"`);if(e.add(s.id),s.access!==void 0&&s.access!=="read"&&s.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(s.indexFile!==void 0){Oe(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let r=s.indexFile.replaceAll("\\","/");if(or.posix.isAbsolute(r)||or.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Za(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(Oe(s.id,`options.memory.consumption.files[${t}].id`),Oe(s.path,`options.memory.consumption.files[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${s.id}"`);if(e.add(s.id),s.required!==void 0&&typeof s.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function ir(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(n))throw new TypeError("options.memory must be an object");if(Object.keys(n).length===0)return{};if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(n.projectScope!==void 0&&typeof n.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(n.userScope!==void 0&&typeof n.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(n.mode==="native"){if(n.projectScope===!1&&n.userScope===!1)throw new TypeError("options.memory native mode requires at least one enabled scope; use memory: {} to disable SDK memory");let i=Object.keys(n.generation??{}),a=Object.keys(n.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return $e(n.generation?.onResult,"options.memory.generation.onResult"),$e(n.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native",...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{}},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n.generation?.onResult,onConsumptionResult:n.consumption?.onResult}}}let t,s=n.generation;if(s!==void 0){if(!s||typeof s!="object")throw new TypeError("options.memory.generation must be an object");if(s.enabled!==void 0&&typeof s.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");Xa(s.roots),s.prompt!==void 0&&Oe(s.prompt,"options.memory.generation.prompt"),$e(s.onResult,"options.memory.generation.onResult");let i;if(s.turnComplete!==void 0){let a=s.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if($e(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(s.turnComplete?.enabled===!0&&s.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:s.enabled??!0,roots:s.roots?.map(a=>({...a})),prompt:s.prompt,turnComplete:i}}let r,o=n.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Za(o.files),o.maxTokens!==void 0&&(!Number.isInteger(o.maxTokens)||o.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(o.overflow!==void 0&&o.overflow!=="truncate"&&o.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(o.failureMode!==void 0&&o.failureMode!=="best_effort"&&o.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');$e(o.onResult,"options.memory.consumption.onResult"),r={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:n.mode,...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{},generation:t,consumption:r},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:o?.onResult}}}var vt=10;function eu(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function bt(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function ar(n){if(n!==void 0){if(!Number.isInteger(n)||n<1||n>10)throw new TypeError(`options.evolution.skill.generation.turnComplete.reviewThreshold must be an integer between 1 and ${10}`);return n}}function tu(n){let e={shouldReviewCallbacks:new Map};if(n===void 0)return{config:void 0,callbacks:e};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill.generation must be an object");if("roots"in n)throw new TypeError("options.evolution.skill.generation does not accept roots; roots are derived from loaded skills");if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");if(n.prompt!==void 0&&eu(n.prompt,"options.evolution.skill.generation.prompt"),n.maxSuggestions!==void 0&&(!Number.isInteger(n.maxSuggestions)||n.maxSuggestions<1||n.maxSuggestions>10))throw new TypeError("options.evolution.skill.generation.maxSuggestions must be an integer between 1 and 10");bt(n.onResult,"options.evolution.skill.generation.onResult");let t;if(n.turnComplete!==void 0){if(!n.turnComplete||typeof n.turnComplete!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(n.turnComplete.enabled!==void 0&&typeof n.turnComplete.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.turnComplete.enabled must be a boolean");let s=ar(n.turnComplete.reviewThreshold);if(bt(n.turnComplete.shouldReview,"options.evolution.skill.generation.turnComplete.shouldReview"),n.turnComplete.timeoutMs!==void 0&&(!Number.isFinite(n.turnComplete.timeoutMs)||n.turnComplete.timeoutMs<=0))throw new TypeError("options.evolution.skill.generation.turnComplete.timeoutMs must be a positive finite number");if(n.turnComplete.onGateError!==void 0&&n.turnComplete.onGateError!=="skip"&&n.turnComplete.onGateError!=="report_failed")throw new TypeError('options.evolution.skill.generation.turnComplete.onGateError must be "skip" or "report_failed"');let r=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;r&&e.shouldReviewCallbacks.set(r,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:r,timeoutMs:n.turnComplete.timeoutMs,onGateError:n.turnComplete.onGateError}}if(n.turnComplete!==void 0&&t?.enabled===!0&&n.enabled===!1)throw new TypeError("options.evolution.skill.generation.turnComplete cannot be enabled when generation.enabled is false");return{config:{enabled:n.enabled??!0,prompt:n.prompt,maxSuggestions:n.maxSuggestions,turnComplete:t},callbacks:{...e,onResult:n.onResult}}}function ur(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill must be an object");if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.evolution.skill.mode must be "native" or "custom"');let e=n.generation;if(n.mode==="native"){if(Object.keys(e??{}).some(i=>i!=="enabled"&&i!=="onResult"&&i!=="turnComplete"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.enabled, generation.onResult, and generation.turnComplete.reviewThreshold');if(e?.enabled!==void 0&&typeof e.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");let r=e?.turnComplete;if(r!==void 0){if(!r||typeof r!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(Object.keys(r).some(i=>i!=="reviewThreshold"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.turnComplete.reviewThreshold')}let o=ar(r?.reviewThreshold);return e?.enabled===!1?(bt(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(bt(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...o===void 0?{}:{generation:{turnComplete:{reviewThreshold:o}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=tu(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as Gu}from"node:child_process";import{isDeepStrictEqual as Wu}from"node:util";import{createInterface as cu}from"node:readline";var w=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function rn(n){if(n.trim().length===0)throw new w("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new w("daemon protocol line must contain valid JSON")}let t=R(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new w("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":nu(t);break;case"control_response":su(t);break;case"event":D(t,["type","event","session_id","data"],"event frame"),E(t,"event"),kt(t),R(t.data,"event data");break;case"keep_alive":D(t,["type"],"keep_alive frame");break;case"session_input":case"session_output":throw new w(`${String(t.type)} is not supported on the v2 wire`);default:if(E(t,"type"),!ou(t.type))throw new w(`unknown daemon message type: ${String(t.type)}`);ru(t),kt(t)}return t}function cr(n){let e=JSON.stringify(n);return rn(e),e}function dr(n,e){let t=e.response.response;switch(n){case"initialize":{_t(e,"initialize response");let s=R(t,"initialize response");if(D(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==2)throw new w(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return E(s,"daemon_version"),au(s,"capabilities"),s}case"open_session":{let s=ze(e,"open_session response");return sn(t,"open_session"),{session_id:s}}case"list_sessions":{_t(e,"list_sessions response");let s=R(t,"list_sessions response");D(s,["sessions"],"list_sessions response");let r=s.sessions;if(!Array.isArray(r))throw new w("sessions must be an array");for(let[o,i]of r.entries())nn(R(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{ze(e,"rename_session response");let s=R(t,"rename_session response");return D(s,["session"],"rename_session response"),nn(R(s.session,"rename_session session"),"rename_session session"),s}case"subscribe_session":{let s=ze(e,"subscribe_session response"),r=R(t,"subscribe_session response");D(r,["initialization_result"],"subscribe_session response");let o=R(r.initialization_result,"initialization_result");return{session_id:s,initialization_result:o}}case"enable_remote_control":{_t(e,"enable_remote_control response");let s=R(t,"enable_remote_control response");return D(s,["environment_id"],"enable_remote_control response"),E(s,"environment_id"),s}case"update_session_metadata":{ze(e,"update_session_metadata response");let s=R(t,"update_session_metadata response");return D(s,["session"],"update_session_metadata response"),nn(R(s.session,"update_session_metadata session"),"update_session_metadata session"),s}case"unsubscribe_session":case"close_session":return ze(e,`${n} response`),sn(t,n),null;case"sync_session_registrations":case"disable_remote_control":case"delete_session":case"shutdown":return _t(e,`${n} response`),sn(t,n),null;default:throw new w(`unknown daemon command result method: ${String(n)}`)}}function nu(n){D(n,["type","request_id","session_id","request"],"control_request frame"),E(n,"request_id"),kt(n);let e=R(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new w("control request must have a non-empty string type or subtype")}function su(n){D(n,["type","session_id","response"],"control_response frame"),kt(n);let e=R(n.response,"control response");E(e,"request_id");let t=E(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new w("success control response must not include error fields");D(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&R(e.response,"success response result");return}if(t!=="error")throw new w(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new w("error control response must not include response");if(D(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),E(e,"error"),e.code!==void 0&&E(e,"code"),e.retryable!==void 0&&iu(e,"retryable"),e.details!==void 0&&R(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new w("pending_permission_requests must be an array")}function nn(n,e){D(n,["local_session_id","remote_session_id","environment_id","title","cwd","extra","state","created_at","updated_at"],e),E(n,"local_session_id");for(let s of["remote_session_id","environment_id","cwd"])n[s]!==void 0&&E(n,s);n.extra!==void 0&&R(n.extra,`${e}.extra`),E(n,"title");let t=E(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new w(`${e} has invalid state: ${t}`);E(n,"created_at"),E(n,"updated_at")}function sn(n,e){if(n!==void 0)throw new w(`${e} success must omit response`)}function ze(n,e){let t=n;try{return E(t,"session_id")}catch{throw new w(`${e} requires a valid session_id`)}}function _t(n,e){if(Object.hasOwn(n,"session_id"))throw new w(`${e} must not include session_id`)}function kt(n){let e=n;e.session_id!==void 0&&E(e,"session_id")}function ru(n){for(let e of["session_epoch","sequence"])if(Object.hasOwn(n,e))throw new w(`${e} is reserved for daemon-internal Session ordering`)}function ou(n){return typeof n=="string"&&["user","assistant","stream_event","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function R(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new w(`${e} must be a JSON object`);return n}function E(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new w(`${e} must be a non-empty string`);return t}function iu(n,e){let t=n[e];if(typeof t!="boolean")throw new w(`${e} must be a boolean`);return t}function au(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new w(`${e} must be an array of strings`);return t}function D(n,e,t){let s=new Set(e),r=Object.keys(n).find(o=>!s.has(o));if(r!==void 0)throw new w(`${t} contains unknown field: ${r}`)}var Qe=class{constructor(e,t){this.connection=e;this.options=t;this.remoteSessionId="remoteSessionId"in t?t.remoteSessionId:void 0}messages=new X;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;subscribeResult;remoteSessionId;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}async initializationResult(){if(await this.initialize(),!this.subscribeResult)throw new Error("Daemon Session transport is not attached");let e=this.subscribeResult.initialization_result;return this.updateCommandLifecycleCapability(e),e}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=uu(e);if(this.trackOutboundCommand(t),!this.sessionId||this.flushingPendingMessages){if(!this.initializePromise)throw new Error("Transport is not ready or has been closed");this.pendingMessages.push(t);return}let s;try{s=lr(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){if(this.closed)return;this.closed=!0,this.cleanup(),this.messages.done();let e=this.sessionId;e&&this.startRelease(e)}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t;if(this.remoteSessionId!==void 0)this.subscribeResult=await this.connection.subscribeSession(this.remoteSessionId,this),t=this.subscribeResult.session_id;else{let s=this.options;t=await this.connection.openSession({worker_args:[...s.workerArgs],...s.cwd!==void 0?{cwd:s.cwd}:{},...s.configDir!==void 0?{config_dir:s.configDir}:{},...s.extra!==void 0?{extra:structuredClone(s.extra)}:{}},this)}if(this.sessionId=t,e=t,this.closed){await this.releaseSessionOnce(t);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let s=this.pendingMessages.map(r=>lr(r,t));this.pendingMessages.splice(0);for(let r of s)await this.connection.sendSessionMessage(r)}}finally{this.flushingPendingMessages=!1}}catch(t){throw e!==void 0&&this.startRelease(e),this.fail(t),t}}failAndRelease(e){let t=this.sessionId;t!==void 0&&this.startRelease(t),this.fail(e)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.remoteSessionId!==void 0?this.connection.unsubscribeSession(e):this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.closeAfterResult()}async closeAfterResult(){if(this.closed)return;this.closed=!0,this.cleanup();let e=this.sessionId;try{e&&await this.releaseSessionOnce(e),this.messages.done()}catch(t){this.messages.error(t)}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function uu(n){let e;try{e=JSON.parse(n.trim())}catch{throw new Error("Query transport input must contain valid JSON")}if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Query transport input must be a JSON object");return e}function lr(n,e){if(Object.hasOwn(n,"session_id")&&n.session_id!==e)throw new Error(`Query message session_id must match daemon Session: expected ${e}, received ${String(n.session_id)}`);return{...n,session_id:e}}var an="multi_session_v2",pr="remote_control_v1",mr="session_title_sync_v1",fr="session_delete_v1",du=3e4,Rt=3e4,lu=125e3,Et=6e4,gr=12e4,pu=5e3,mu=1024,fu=64,gu=8*1024*1024,hu=256,yu=32*1024*1024,Su=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token","daemon.session_store.list_all","daemon.session_store.load","daemon.session_store.append","daemon.session_store.delete","daemon.session_store.materialize","daemon.session_store.release_materialization","daemon.session_store.update_metadata","daemon.session.resolve_remote_launch"]),Be=class extends Error{code;retryable;constructor(e){super(e.message),this.name="DaemonRpcError",this.code=e.code,this.retryable=e.retryable}},j=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRequestError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},Pt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;closedSessionIds=new Set;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;remoteControlFailureListener;daemonEventListeners=new Set;failureListeners=new Set;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.maxFrameBytes=e.maxFrameBytes??z,!Number.isSafeInteger(this.maxFrameBytes)||this.maxFrameBytes<=0)throw new TypeError("maxFrameBytes must be a positive safe integer");this.readTask=this.readOutput(e.output)}async initialize(e,t=[],s=du){if(this.initialized)throw new w("daemon connection is already initialized");if(this.initializing)throw new w("daemon initialize is already in progress");this.initializing=!0;let r,o=typeof t=="number"?[]:t,i=typeof t=="number"?t:s,a=this.request("initialize",{daemon_protocol_version:2,sdk_version:e,capabilities:[an,...o]}),u=new Promise((d,m)=>{r=setTimeout(()=>{let p=new Error(`Qoder CLI daemon did not initialize within ${i}ms`);this.fail(p),m(p)},i)}),c;try{c=await Promise.race([a,u])}finally{this.initializing=!1,r&&clearTimeout(r)}if(!c.capabilities.includes(an))throw new w(`daemon is missing required capability: ${an}`);for(let d of c.capabilities)this.capabilities.add(d);this.initialized=!0}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Qe(this,e)}createAttachedSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Qe(this,{remoteSessionId:e})}onRemoteControlFailure(e){this.remoteControlFailureListener=e}onDaemonEvent(e){return this.daemonEventListeners.add(e),()=>this.daemonEventListeners.delete(e)}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){return(await this.request("open_session",e,t,void 0,gr)).session_id}subscribeSession(e,t){return this.request("subscribe_session",{remote_session_id:e},t,void 0,gr)}enableRemoteControl(e){return this.capabilities.has(pr)?this.request("enable_remote_control",e,void 0,void 0,Et):Promise.reject(new w(`daemon is missing required capability: ${pr}`))}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,lu,"request")).sessions}renameSession(e,t){return this.capabilities.has(mr)?this.request("rename_session",{title:t},void 0,e,Rt):Promise.reject(new w(`daemon is missing required capability: ${mr}`))}async disableRemoteControl(){await this.request("disable_remote_control",{},void 0,void 0,Et)}async syncSessionRegistrations(e){await this.request("sync_session_registrations",{local_session_ids:e},void 0,void 0,Et)}updateSessionMetadata(e,t){return this.request("update_session_metadata",{extra:t},void 0,e,Rt)}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("close_session",{},void 0,e,Rt)}async deleteSession(e){if(!this.capabilities.has(fr))throw new w(`daemon is missing required capability: ${fr}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,Et)}async unsubscribeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("unsubscribe_session",{},void 0,e,Rt)}async shutdown(e=pu){if(this.stopping){await this.readTask.catch(()=>{});return}this.stopping=!0;for(let t of this.sessions.values())t.fail(new Error("Daemon is stopping"));this.sessions.clear();try{this.failure||await this.request("shutdown",{},void 0,void 0,e)}finally{!this.input.destroyed&&!this.input.writableEnded&&this.input.end()}}fail(e,t=!0){let s=e instanceof Error?e:new Error(String(e));if(!this.failure){this.failure=s;for(let r of this.pendingRequests.values())r.timeout&&clearTimeout(r.timeout),r.reject(s);this.pendingRequests.clear(),this.timedOutRequestIds.clear(),this.clearPendingSessionMessages();for(let r of this.sessions.values())r.fail(s);if(this.sessions.clear(),t)for(let r of this.failureListeners)try{r(s)}catch{}}}request(e,t,s,r,o,i="connection"){if(this.failure)return Promise.reject(this.failure);if(e!=="initialize"&&!this.initialized)return Promise.reject(new w("daemon connection is not initialized"));let a=`sdk_daemon_${this.nextRequestId++}`,u={type:"control_request",request_id:a,...r!==void 0?{session_id:r}:{},request:{type:`daemon.${e}`,...t}};return new Promise((c,d)=>{let m={method:e,resolve:p=>c(p),reject:d,...s?{sessionTransport:s}:{},...r!==void 0?{sessionId:r}:{}};o!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new w(`daemon ${e} request timed out after ${o}ms`);if(i==="request"){this.pendingRequests.delete(a),this.rememberTimedOutRequestId(a),m.reject(p);return}this.fail(p)},o),m.timeout.unref?.()),this.pendingRequests.set(a,m),this.writeFrame(u).catch(p=>{let l=this.pendingRequests.get(a);l?.timeout&&clearTimeout(l.timeout),this.pendingRequests.delete(a),d(p),l?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new V(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=cu({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=wu(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(rn(r))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(new Error("Daemon connection closed"),!1)}catch(r){this.fail(r)}finally{s.close(),e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="control_response"){let s=e,r=s.response.request_id;if(this.pendingRequests.has(r)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(r))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,r=vu(s);if(r==="valid"){this.acceptRequest(s);return}if(r==="contradictory")throw new w(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="event"){this.acceptEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=mu){let t=this.timedOutRequestIds.values().next().value;t!==void 0&&this.timedOutRequestIds.delete(t)}this.timedOutRequestIds.add(e)}routeSessionMessage(e){let t=e.session_id;if(typeof t!="string"||t.length===0)throw new w(`daemon Session message requires a valid session_id: ${String(t)}`);let s=this.sessions.get(t);if(s){s.acceptOutput(e);return}if(this.hasPendingSessionRequest()){this.bufferPendingSessionMessage(t,e);return}if(!this.closedSessionIds.has(t))throw new w(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new w(`daemon response has unknown request_id: ${t}`);if(s.timeout&&clearTimeout(s.timeout),s.sessionId!==void 0&&e.session_id!==s.sessionId){this.pendingRequests.delete(t),s.reject(new w(`${s.method} response session_id does not match request: expected ${s.sessionId}, received ${String(e.session_id)}`));return}if(this.pendingRequests.delete(t),e.response.subtype==="error"){if(s.method==="initialize"&&e.response.code==="PROTOCOL_VERSION_UNSUPPORTED"){s.reject(new G("1","2"));return}s.reject(new Be({code:e.response.code??"DAEMON_REQUEST_FAILED",message:e.response.error,retryable:e.response.retryable??!1})),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned();return}try{let r=e,o=r.response.response?.daemon_protocol_version;if(s.method==="initialize"&&typeof o=="number"&&o!==2)throw new G(String(o),String(2));let i=dr(s.method,r);if(s.sessionTransport){let a=i.session_id;if(typeof a!="string"||a.length===0)throw new w(`${s.method} did not return a valid session_id`);let u=this.takePendingSessionMessages(a);this.closedSessionIds.delete(a);let c=this.failIfSessionMessagesAreOrphaned(`${s.method} response session_id does not match buffered output`);if(c)throw c;if(this.sessions.has(a)){let d=new w(`daemon returned duplicate session_id: ${a}`);throw this.fail(d),d}this.sessions.set(a,s.sessionTransport);for(let d of u)s.sessionTransport.acceptOutput(d)}s.resolve(i)}catch(r){s.reject(r instanceof Error?r:new Error(String(r))),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned()}}hasPendingSessionRequest(){return[...this.pendingRequests.values()].some(e=>e.sessionTransport!==void 0)}failIfSessionMessagesAreOrphaned(e="daemon left orphaned pre-response Session output"){if(this.hasPendingSessionRequest())return;for(let r of this.pendingSessionMessages.keys())this.closedSessionIds.has(r)&&this.deletePendingSessionMessages(r);if(this.pendingSessionMessages.size===0)return;let t=[...this.pendingSessionMessages.keys()].join(", "),s=new w(`${e}: ${t}`);return this.clearPendingSessionMessages(),this.fail(s),s}bufferPendingSessionMessage(e,t){let s=this.pendingSessionMessages.get(e)??[],r=Buffer.byteLength(JSON.stringify(t),"utf8"),o=this.pendingSessionMessageBytes.get(e)??0;if(s.length+1>fu||o+r>gu||this.pendingSessionMessageFrameCount+1>hu||this.pendingSessionMessageByteCount+r>yu)throw new w("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,o+r),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=r}takePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)??[];return this.deletePendingSessionMessages(e),t}deletePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)?.length??0,s=this.pendingSessionMessageBytes.get(e)??0;this.pendingSessionMessages.delete(e),this.pendingSessionMessageBytes.delete(e),this.pendingSessionMessageFrameCount-=t,this.pendingSessionMessageByteCount-=s}clearPendingSessionMessages(){this.pendingSessionMessages.clear(),this.pendingSessionMessageBytes.clear(),this.pendingSessionMessageFrameCount=0,this.pendingSessionMessageByteCount=0}rejectLegacyInitialize(e){let t=this.pendingRequests.get(e);return t?.method!=="initialize"?!1:(this.pendingRequests.delete(e),t.reject(new G("1","2")),!0)}acceptRequest(e){if(!this.initialized){this.writeInboundError(e.request_id,"DAEMON_NOT_INITIALIZED","daemon reverse RPC is unavailable before initialize completes");return}if(this.activeInboundRequestIds.has(e.request_id)){this.writeInboundError(e.request_id,"DUPLICATE_REQUEST_ID",`daemon request_id is already active: ${e.request_id}`);return}if(!this.requestHandler){this.writeInboundError(e.request_id,"METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${e.request.type}`);return}this.activeInboundRequestIds.add(e.request_id),Promise.resolve().then(()=>this.requestHandler(e)).then(t=>{let s={type:"control_response",response:{subtype:"success",request_id:e.request_id,...t===null?{}:{response:t}}};return this.writeFrame(s)}).catch(t=>{let s=t instanceof j?t:void 0,r={type:"control_response",response:{subtype:"error",request_id:e.request_id,code:s?.code??"SDK_REQUEST_FAILED",error:t instanceof Error?t.message:String(t),retryable:s?.retryable??!1,...s?.details?{details:s.details}:{}}};return this.writeFrame(r)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let r={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(r).catch(o=>this.fail(o))}acceptEvent(e){if(e.event==="session_deleted"&&e.session_id!==void 0){let s=this.sessions.get(e.session_id);this.sessions.delete(e.session_id),this.closedSessionIds.add(e.session_id),s?.fail(new Be({code:"SESSION_DELETED",message:`Session was deleted: ${e.session_id}`,retryable:!1}))}for(let s of this.daemonEventListeners)try{s(e)}catch{}if(e.event==="session_deleted")return;if(e.event==="remote_control_state_changed"&&e.session_id===void 0){this.acceptRemoteControlEvent(e.data);return}if(e.event!=="session_state_changed"||e.session_id===void 0||e.data.state!=="failed")return;let t=this.sessions.get(e.session_id);t&&(this.sessions.delete(e.session_id),this.closedSessionIds.add(e.session_id),t.fail(bu(e.data)))}acceptRemoteControlEvent(e){if(e.state!=="failed")return;let t=e.environment_id;if(typeof t!="string"||t.length===0)return;let s=e.error,r=typeof s=="object"&&s!==null&&!Array.isArray(s)?s:{},o=typeof r.code=="string"&&r.code.length>0?r.code:"REMOTE_CONTROL_RUNTIME_FAILED",i=typeof r.message=="string"&&r.message.length>0?r.message:"Remote Control runtime failed";this.remoteControlFailureListener?.({environmentId:t,error:new Be({code:o,message:i,retryable:!1})})}writeFrame(e){let t;try{t=`${cr(e)}
|
|
19
|
+
`,ve(t,this.maxFrameBytes,"SDK daemon input")}catch(r){let o=r instanceof Error?r:new Error(String(r));return this.fail(o),Promise.reject(o)}let s=this.writeChain.then(()=>new Promise((r,o)=>{this.input.write(t,"utf8",i=>{if(i){o(i);return}r()})}));return this.writeChain=s.catch(()=>{}),s.catch(r=>this.fail(r)),s}};function wu(n){let e;try{e=JSON.parse(n)}catch{return}if(!hr(e)||!yr(e,["protocol_version","frame_type","request_id","ok","error"])||e.protocol_version!==1||e.frame_type!=="response"||e.ok!==!1||typeof e.request_id!="string"||e.request_id.length===0)return;let t=e.error;if(!(!hr(t)||!yr(t,["code","message","retryable"])||t.code!=="PROTOCOL_VERSION_UNSUPPORTED"||typeof t.message!="string"||t.message.length===0||t.retryable!==!1))return e.request_id}function hr(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function yr(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function vu(n){let e=Su.has(n.request.type),t=n.request_id.startsWith("daemon_sdk_");return e&&t&&n.session_id===void 0?"valid":e||t?"contradictory":"none"}function bu(n){let e=n.error,t=typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{},s=typeof t.message=="string"&&t.message.length>0?t.message:"Qoder CLI Worker exited before Session completed",r=t.exit_code===null||typeof t.exit_code=="number"?t.exit_code:void 0,o=t.signal===null||typeof t.signal=="string"?t.signal:void 0,i=typeof t.stderr=="string"&&t.stderr.length>0?t.stderr:void 0;return new I(s,{exitCode:r,signal:o,stderr:i})}import{randomUUID as _u}from"node:crypto";function J(n,e="extra"){if(!Sr(n))throw new TypeError(`${e} must be a JSON object`);return un(n,e,new Set),structuredClone(n)}function un(n,e,t){if(!(n===null||typeof n=="string"||typeof n=="boolean")){if(typeof n=="number"){if(Number.isFinite(n))return;throw new TypeError(`${e} must contain finite JSON numbers`)}if(typeof n!="object")throw new TypeError(`${e} must contain only JSON values`);if(t.has(n))throw new TypeError(`${e} must not contain circular references`);if(t.add(n),Array.isArray(n))n.forEach((s,r)=>un(s,`${e}[${r}]`,t));else{if(!Sr(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))un(r,`${e}.${s}`,t)}t.delete(n)}}function Sr(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var ku=3e4,Ru=256,Eu=512*1024,Tt=class extends j{constructor(e){super({code:e.code,message:e.message,retryable:e.retryable??!1,...e.operation?{details:{operation:e.operation}}:{}}),this.name="DaemonSessionStoreRpcError"}};function vr(n,e={}){let t=cn(e.callbackTimeoutMs??ku,"callbackTimeoutMs"),s=cn(e.maxEntriesPerPage??Ru,"maxEntriesPerPage"),r=cn(e.maxPayloadBytes??Eu,"maxPayloadBytes"),o=new Map,i=!1,a;return Object.assign(async c=>{if(i)throw q("SESSION_STORE_DISPOSED","SessionStore daemon connection is closed");switch(c.request.type){case"daemon.session_store.list_all":return Pu(n,c,t,s,r);case"daemon.session_store.load":return Tu(n,c,t,s,r);case"daemon.session_store.append":return Cu(n,c,t,s,r);case"daemon.session_store.update_metadata":return Ou(n,c,t);case"daemon.session_store.delete":return Mu(n,c,t);case"daemon.session_store.materialize":return Au(n,c,t,o);case"daemon.session_store.release_materialization":return Du(c,t,o);default:throw q("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${c.request.type}`)}},{dispose(){return a||(i=!0,a=Promise.all([...o.keys()].map(c=>br(c,t,o))).then(()=>{}),a.catch(()=>{a=void 0}),a)}})}async function Pu(n,e,t,s,r){let o=me(e,["cursor"]),i=Rr(o.cursor),a=await fe("list_all",t,!0,()=>n.listAllSessions());if(!Array.isArray(a))throw q("SESSION_STORE_OPERATION_FAILED","SessionStore listAllSessions() must return an array",!0,"list_all");let u=a.map((d,m)=>xu(Iu(d,`sessions[${m}]`))),c=Er(u,i,s,r);return{sessions:c.items,next_cursor:c.nextCursor}}async function Tu(n,e,t,s,r){let o=me(e,["key","cursor"]),i=Ae(o.key,"key"),a=Rr(o.cursor),u=await fe("load",t,!0,()=>n.load(i));if(u===null)return{found:!1,entries:[],next_cursor:null};if(!Array.isArray(u))throw q("SESSION_STORE_OPERATION_FAILED","SessionStore load() must return an array or null",!0,"load");let c=u.map((m,p)=>kr(m,`entries[${p}]`)),d=Er(c,a,s,r);return{found:!0,entries:d.items,next_cursor:d.nextCursor}}async function Cu(n,e,t,s,r){let o=me(e,["key","entries"]),i=Ae(o.key,"key");if(!Array.isArray(o.entries))throw P("entries must be an array");if(o.entries.length>s)throw ln(`entries exceeds the ${s} entry batch limit`);let a=o.entries.map((u,c)=>kr(u,`entries[${c}]`));return Nu(a,r),await fe("append",t,!1,()=>n.append(i,a)),null}async function Mu(n,e,t){let s=me(e,["key"]),r=Ae(s.key,"key");if(!n.delete)throw q("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore delete() is not implemented",!1,"delete");return await fe("delete",t,!1,()=>n.delete(r)),null}async function Ou(n,e,t){let s=me(e,["key","extra"]),r=Ae(s.key,"key");if(r.subpath!==void 0)throw P("key.subpath is not allowed for Session metadata");if(!n.updateSessionMetadata)throw q("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore updateSessionMetadata() is not implemented",!1,"update_metadata");let o=_r(s.extra,"extra");return await fe("update_metadata",t,!1,()=>n.updateSessionMetadata(r,{extra:o})),null}async function Au(n,e,t,s){let r=me(e,["key","cwd"]),o=Ae(r.key,"key");if(o.subpath!==void 0)throw P("key.subpath is not allowed for materialization");let i=pe(r.cwd,"cwd"),a,u;try{u=await fe("materialize",t,!0,()=>(a=wt({store:n,cwd:i,resume:o.sessionId,loadTimeoutMs:t}),a))}catch(d){throw a?.then(m=>m?.cleanup()).catch(()=>{}),d}if(!u)throw q("SESSION_STORE_SESSION_NOT_FOUND","SessionStore has no materializable transcript for the requested Session",!1,"materialize");if(u.projectKey!==o.projectKey||u.sessionId!==o.sessionId)throw await u.cleanup().catch(()=>{}),q("SESSION_STORE_KEY_MISMATCH","SessionStore key does not match the requested cwd",!1,"materialize");let c=`materialized_${_u()}`;return s.set(c,{materialized:u}),{lease_id:c,config_dir:u.configDir}}async function Du(n,e,t){let s=me(n,["lease_id"]),r=pe(s.lease_id,"lease_id");return await br(r,e,t),null}async function br(n,e,t){let s=t.get(n);if(s){s.releasePromise||(s.releasePromise=fe("release_materialization",e,!0,()=>s.materialized.cleanup()));try{await s.releasePromise,t.delete(n)}catch(r){throw s.releasePromise=void 0,r}}}function me(n,e){let s=Object.keys(n.request).find(r=>r!=="type"&&!e.includes(r));if(s)throw P(`request contains unknown field: ${s}`);return n.request}function Ae(n,e){let t=dn(n,e),s=["projectKey","sessionId","subpath"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw P(`${e} contains unknown field: ${r}`);let o=pe(t.projectKey,`${e}.projectKey`),i=pe(t.sessionId,`${e}.sessionId`),a=t.subpath;if(a!==void 0&&(typeof a!="string"||!a))throw P(`${e}.subpath must be a non-empty string`);return{projectKey:o,sessionId:i,...typeof a=="string"?{subpath:a}:{}}}function Iu(n,e){let t=dn(n,e),s=["key","title","lastActiveAt","cwd","extra"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw P(`${e} contains unknown field: ${r}`);let o=pe(t.lastActiveAt,`${e}.lastActiveAt`);if(!Number.isFinite(Date.parse(o)))throw P(`${e}.lastActiveAt must be an ISO timestamp`);let i=Ae(t.key,`${e}.key`);if(i.subpath!==void 0)throw P(`${e}.key must identify a main Session`);let a=t.extra===void 0?void 0:_r(t.extra,`${e}.extra`);return{key:i,title:wr(t.title,`${e}.title`),lastActiveAt:o,cwd:wr(t.cwd,`${e}.cwd`),...a===void 0?{}:{extra:a}}}function xu(n){return{key:{projectKey:n.key.projectKey,sessionId:n.key.sessionId,...n.key.subpath===void 0?{}:{subpath:n.key.subpath}},title:n.title,last_active_at:n.lastActiveAt,cwd:n.cwd,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function _r(n,e){try{return J(n,e)}catch(t){throw P(t instanceof Error?t.message:`${e} must be a JSON object`)}}function kr(n,e){let t=dn(n,e);pe(t.type,`${e}.type`);try{return JSON.parse(JSON.stringify(t))}catch{throw P(`${e} must be JSON-safe`)}}function dn(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw P(`${e} must be an object`);return n}function pe(n,e){if(typeof n!="string"||n.length===0)throw P(`${e} must be a non-empty string`);return n}function wr(n,e){let t=pe(n,e);if(t.trim().length===0)throw P(`${e} must be a non-empty string`);return t}function Rr(n){if(n===void 0)return 0;if(typeof n!="string"||!/^(0|[1-9]\d*)$/.test(n))throw P("cursor must be a non-negative integer string");let e=Number(n);if(!Number.isSafeInteger(e))throw P("cursor exceeds the supported range");return e}function Er(n,e,t,s){if(e>n.length)throw P("cursor is beyond the current result set");let r=[],o=2;for(let a=e;a<n.length;a+=1){let u=Pr(n[a])+(r.length?1:0);if(u+2>s&&r.length===0)throw ln("one SessionStore item exceeds the payload limit");if(r.length>=t||o+u>s)break;r.push(n[a]),o+=u}let i=e+r.length;return{items:r,nextCursor:i<n.length?String(i):null}}function Nu(n,e){if(Pr(n)>e)throw ln(`payload exceeds the ${e} byte limit`)}function Pr(n){return Buffer.byteLength(JSON.stringify(n),"utf8")}async function fe(n,e,t,s){let r;try{return await Promise.race([Promise.resolve().then(s),new Promise((o,i)=>{r=setTimeout(()=>i(q("SESSION_STORE_TIMEOUT",`SessionStore ${n} timed out after ${e}ms`,t,n)),e)})])}catch(o){throw o instanceof Tt?o:q("SESSION_STORE_OPERATION_FAILED",o instanceof Error?o.message:String(o),t,n)}finally{r&&clearTimeout(r)}}function cn(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`);return n}function P(n){return q("SESSION_STORE_INVALID_REQUEST",n)}function ln(n){return q("SESSION_STORE_PAYLOAD_TOO_LARGE",n)}function q(n,e,t=!1,s){return new Tt({code:n,message:e,retryable:t,operation:s})}var ju=3e4;function qu(n,e=ju){return $u(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return Fu(n,t,e);case"daemon.auth.fetch_service_account_token":return Uu(n,t,e);default:throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}function Tr(n){let e=qu(n.auth,n.callbackTimeoutMs);return t=>{if(t.request.type.startsWith("daemon.session_store.")){if(n.sessionStoreHandler)return n.sessionStoreHandler(t);throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}if(t.request.type==="daemon.session.resolve_remote_launch"){if(n.remoteSessionLaunchHandler)return n.remoteSessionLaunchHandler(t);throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}return e(t)}}async function Fu(n,e,t){if(n.type!=="jobToken")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Cr(e,["reason","session_id"]),r=Mr(s.reason),o=Ku(s.session_id,"session_id"),i=new AbortController;try{let a=await Or(()=>n.fetchJobToken({requestId:e.request_id,reason:r,sessionId:o},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");return{token:a.token}}catch(a){throw a instanceof j?a:M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function Uu(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=Cr(e,["reason","required_scopes"]);Mr(s.reason),Lu(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await Or(()=>n.fetchServiceAccountToken(),t,r);if(!o||typeof o.token!="string"||!o.token)throw M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=o.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:o.token,...i!==void 0?{expires_at:i}:{}}}catch(o){throw o instanceof j?o:M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function Cr(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw M("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Mr(n){if(n!=="initial"&&n!=="unauthorized")throw M("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function Ku(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw M("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function Lu(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw M("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function Or(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((r,o)=>{s=setTimeout(()=>{t.abort(),o(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function $u(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function M(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var zu=3e4;function Dr(n,e=zu){return async t=>{if(t.request.type!=="daemon.session.resolve_remote_launch")throw ee("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`);let s=Qu(t,["remote_session_id","extra"]),r=Ar(s.remote_session_id,"remote_session_id"),o=s.extra===void 0?void 0:Bu(s.extra,"extra"),i;try{let a=await Promise.race([n({remoteSessionId:r,...o===void 0?{}:{extra:o}}),new Promise((d,m)=>{i=setTimeout(()=>m(ee("REMOTE_SESSION_LAUNCH_TIMEOUT",`resolveRemoteSessionLaunch() timed out after ${e}ms`,!0)),e)})]);if(!a||typeof a!="object")throw ee("REMOTE_SESSION_LAUNCH_INVALID_RESULT","resolveRemoteSessionLaunch() must return a launch object");let u=Ar(a.cwd,"cwd"),c=a.additionalDirectories;if(c!==void 0&&(!Array.isArray(c)||c.some(d=>typeof d!="string"||d.trim().length===0)))throw ee("REMOTE_SESSION_LAUNCH_INVALID_RESULT","additionalDirectories must contain non-empty strings");return{cwd:u,...c===void 0?{}:{additional_directories:[...c]}}}catch(a){throw a instanceof j?a:ee("REMOTE_SESSION_LAUNCH_FAILED",a instanceof Error?a.message:"resolveRemoteSessionLaunch() failed",!0)}finally{i&&clearTimeout(i)}}}function Qu(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw ee("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Ar(n,e){if(typeof n!="string"||n.trim().length===0)throw ee("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}function Bu(n,e){try{return J(n,e)}catch(t){throw ee("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",t instanceof Error?t.message:`${e} must be a JSON object`)}}function ee(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var Ju=[250,1e3,5e3];function Ir(n,e){let t=new pn(e.sync,e.retryDelaysMs??Ju);return{store:{listAllSessions:()=>n.listAllSessions(),load:r=>n.load(r),async append(r,o){await n.append(r,o),r.subpath===void 0&&o.length>0&&t.notify(r.sessionId)},...n.updateSessionMetadata?{async updateSessionMetadata(r,o){await n.updateSessionMetadata(r,o)}}:{},...n.listSessions?{listSessions:r=>n.listSessions(r)}:{},...n.delete?{delete:r=>n.delete(r)}:{},...n.listSubkeys?{listSubkeys:r=>n.listSubkeys(r)}:{}},flush:()=>t.flush(),dispose:()=>t.dispose()}}var pn=class{constructor(e,t){this.sync=e;this.retryDelaysMs=t}pending=new Set;running;disposed=!1;notify(e){this.disposed||(this.pending.add(e),this.run())}flush(){return this.run()}dispose(){this.disposed=!0,this.pending.clear()}run(){if(this.running)return this.running;if(this.disposed||this.pending.size===0)return Promise.resolve();let e=this.drain();return this.running=e.finally(()=>{this.running=void 0,!this.disposed&&this.pending.size>0&&this.run()}),this.running}async drain(){let e=0;for(;!this.disposed&&this.pending.size>0;){let t=[...this.pending];try{await this.sync(t);for(let s of t)this.pending.delete(s);e=0}catch{let s=this.retryDelaysMs[e++];if(s===void 0)return;await Hu(s)}}}};function Hu(n){return new Promise(e=>{setTimeout(e,n).unref?.()})}var Vu="QODER_AGENT_SDK_DAEMON",Yu="QODER_AGENT_SDK_DAEMON_CAPACITY",Xu="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",Zu="ELECTRON_RUN_AS_NODE",ec=3e5,xr=2e3,Nr=8192,jr=255,Fr=new WeakMap;function wn(n){return Fr.get(n)}async function tc(n){rc(n.capacity);let e=n.workerIdleTimeoutMs??ec;oc(e);let t=new H({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await cc(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[Vu]:"1",[Yu]:String(n.capacity),[Xu]:String(e)},i,a,u;try{i=await Sn.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let c;u=n.sessionStore?Ir(n.sessionStore,{sync:l=>{if(!c)throw new Error("Daemon connection is not ready");return c.syncSessionRegistrations(l)}}):void 0,a=u?vr(u.store):void 0;let d=n.resolveRemoteSessionLaunch?Dr(n.resolveRemoteSessionLaunch):void 0;c=new Pt({input:i.process.stdin,output:i.process.stdout,requestHandler:Tr({auth:n.auth,...a?{sessionStoreHandler:a}:{},...d?{remoteSessionLaunchHandler:d}:{}})}),i.setConnection(c);let m=[...d?["remote_session_launch_v1"]:[],...!n.sessionStore||typeof n.sessionStore.delete=="function"?["session_delete_v1"]:[]];await c.initialize(tt,m),await t.cleanupAuthPayload();let p=new fn(c,i,a,u);return Fr.set(p,{auth:n.auth,transportProvider:new hn(c,s.env,n.cwd),...u!==void 0?{sessionStore:u.store}:{}}),p}catch(c){throw await t.cleanupAuthPayload(),await i?.stop().catch(()=>{}),u?.dispose(),await a?.dispose().catch(()=>{}),c}}var fn=class{constructor(e,t,s,r){this.connection=e;this.processController=t;this.sessionStoreHandler=s;this.registrationStore=r;this.connection.onDaemonEvent(o=>{this.acceptDaemonEvent(o)}),this.connection.onRemoteControlFailure(o=>{this.acceptRemoteControlFailure(o)}),this.connection.onFailure(o=>this.acceptDaemonFailure(o)),this.processController.onFailure(o=>this.acceptDaemonFailure(o))}currentState="ready";activeRemoteControl;pendingRemoteControlFailures=new Map;remoteControlLifecycle=Promise.resolve();stopPromise;eventListeners=new Set;knownSessions=new Map;deletedSessionIds=new Set;pendingUnknownSessionStates=new Map;refreshingUnknownSessionIds=new Set;pendingSessionRefreshIds=new Set;refreshingSessionIds=new Set;sessionEventRefresh=Promise.resolve();get state(){return this.currentState}async listSessions(){let e=await this.fetchSessions(),t=new Set(e.map(s=>s.localSessionId));for(let s of this.knownSessions.keys())t.has(s)||this.knownSessions.delete(s);for(let s of e)this.knownSessions.set(s.localSessionId,Je(s));return e}async fetchSessions(){return(await this.connection.listSessions()).map(mn).filter(t=>!this.deletedSessionIds.has(t.localSessionId))}onEvent(e){if(typeof e!="function")throw new TypeError("Daemon event callback must be a function");return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}async renameSession(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let s=nc(t),r=await this.connection.renameSession(e,s),o=mn(r.session);return this.acceptSessionSnapshot(o),Je(o)}async updateSessionMetadata(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");if(!t||typeof t!="object")throw new TypeError("update must be an object");let s=J(t.extra),r=await this.connection.updateSessionMetadata(e,s),o=mn(r.session);return this.knownSessions.has(e)&&this.acceptSessionSnapshot(o),Je(o)}async deleteSession(e){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e)}async enableRemoteControl(e){let t=ac(e);return this.enqueueRemoteControl(async()=>{if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(this.activeRemoteControl)throw new Error("Remote Control is already enabled");let s=await this.connection.enableRemoteControl(t),r=this.pendingRemoteControlFailures.get(s.environment_id);if(r)throw this.pendingRemoteControlFailures.delete(s.environment_id),r;let o=new gn(s.environment_id,i=>i.startDisable(()=>this.enqueueRemoteControl(()=>this.disableRemoteControlNow(i))),(i,a,u)=>{this.emitEvent({type:"remoteControlStateChanged",environmentId:s.environment_id,previousState:i,state:a,...u?{error:u}:{}})});return this.activeRemoteControl=o,o})}async attachSession(e,t={}){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");let s=this.connection.createAttachedSessionTransport(e);try{return await s.initialize(),Fs({transport:s,initialization:s.initializationResult(),...t.canUseTool?{canUseTool:t.canUseTool}:{},...t.onElicitation?{onElicitation:t.onElicitation}:{}})}catch(r){throw s.close(),r}}stop(){return this.stopPromise||(this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{this.registrationStore?.dispose(),await this.enqueueRemoteControl(async()=>{let e=this.activeRemoteControl;e&&await e.startDisable(()=>this.disableRemoteControlNow(e))}).catch(()=>{}),await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),await this.sessionStoreHandler?.dispose(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),this.registrationStore?.dispose(),await this.sessionStoreHandler?.dispose().catch(()=>{}),e}}async disableRemoteControlNow(e){if(this.activeRemoteControl===e)try{await this.connection.disableRemoteControl()}finally{this.activeRemoteControl===e&&(this.activeRemoteControl=void 0)}}enqueueRemoteControl(e){let t=this.remoteControlLifecycle.then(e,e);return this.remoteControlLifecycle=t.then(()=>{},()=>{}),t}acceptRemoteControlFailure(e){let t=this.activeRemoteControl;if(t?.environmentId===e.environmentId){t.fail(e.error),this.activeRemoteControl=void 0;return}this.pendingRemoteControlFailures.set(e.environmentId,e.error)}acceptDaemonFailure(e){this.currentState==="ready"&&this.setDaemonState("failed",e),this.activeRemoteControl?.fail(e),this.activeRemoteControl=void 0,this.registrationStore?.dispose(),this.sessionStoreHandler?.dispose().catch(()=>{})}acceptDaemonEvent(e){if(e.event==="session_deleted"&&typeof e.session_id=="string"){let o=e.session_id;this.deletedSessionIds.add(o),this.knownSessions.delete(o),this.pendingUnknownSessionStates.delete(o),this.pendingSessionRefreshIds.delete(o),this.emitEvent({type:"sessionDeleted",localSessionId:o});return}if(e.event==="session_title_changed"&&typeof e.session_id=="string"){let o=e.data.title,i=e.data.updated_at,a=this.knownSessions.get(e.session_id);if(a&&typeof o=="string"&&o.trim().length>0&&typeof i=="string"&&Number.isFinite(Date.parse(i))){this.acceptSessionSnapshot({...a,title:o,updatedAt:i});return}this.refreshSession(e.session_id);return}if(e.event==="session_metadata_changed"&&typeof e.session_id=="string"){let o=e.data.extra;if(vn(o)){let i=this.knownSessions.get(e.session_id);if(i){this.acceptSessionSnapshot({...i,extra:J(o)});return}}this.refreshSession(e.session_id);return}if(e.event!=="session_state_changed"||typeof e.session_id!="string"||!ic(e.data.state))return;let t=e.session_id,s=e.data.state,r=this.knownSessions.get(t);if(r){if(r.state===s)return;let o={...r,state:s};this.knownSessions.set(t,o),this.emitEvent({type:"sessionUpdated",session:o,previousState:r.state});return}this.pendingUnknownSessionStates.set(t,s),!this.refreshingUnknownSessionIds.has(t)&&(this.refreshingUnknownSessionIds.add(t),this.sessionEventRefresh=this.sessionEventRefresh.then(async()=>{let o=this.knownSessions.get(t),a=(await this.fetchSessions()).find(d=>d.localSessionId===t);if(!a)return;let u=this.pendingUnknownSessionStates.get(t)??s,c=a.state===u?a:{...a,state:u};this.knownSessions.set(t,c),o?o.state!==c.state&&this.emitEvent({type:"sessionUpdated",session:c,previousState:o.state}):this.emitEvent({type:"sessionDiscovered",session:c})}).catch(()=>{}).finally(()=>{this.pendingUnknownSessionStates.delete(t),this.refreshingUnknownSessionIds.delete(t)}))}refreshSession(e){this.pendingSessionRefreshIds.add(e),!this.refreshingSessionIds.has(e)&&(this.refreshingSessionIds.add(e),this.sessionEventRefresh=this.sessionEventRefresh.then(async()=>{for(;this.pendingSessionRefreshIds.delete(e);){let s=(await this.fetchSessions()).find(r=>r.localSessionId===e);s&&this.acceptSessionSnapshot(s)}}).catch(()=>{}).finally(()=>{this.refreshingSessionIds.delete(e)}))}acceptSessionSnapshot(e){if(this.deletedSessionIds.has(e.localSessionId))return;let t=this.knownSessions.get(e.localSessionId);if(t&&Wu(t,e))return;let s=Je(e);this.knownSessions.set(e.localSessionId,s),t?this.emitEvent({type:"sessionUpdated",session:s,previousState:t.state}):this.emitEvent({type:"sessionDiscovered",session:s})}setDaemonState(e,t){let s=this.currentState;s!==e&&(this.currentState=e,this.emitEvent({type:"daemonStateChanged",previousState:s,state:e,...t?{error:t}:{}}))}emitEvent(e){for(let t of this.eventListeners)try{t(sc(e))}catch{}}};function Je(n){return{...n,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function nc(n){if(typeof n!="string")throw new TypeError("title must be a non-empty string");let e=n.replace(/[\r\n]+/g," ").trim();if(!e)throw new TypeError("title must be a non-empty string");if(e.length>jr)throw new TypeError(`title must be at most ${jr} characters`);return e}function mn(n){return{localSessionId:n.local_session_id,...n.remote_session_id?{remoteSessionId:n.remote_session_id}:{},...n.environment_id?{environmentId:n.environment_id}:{},title:n.title,...n.cwd?{cwd:n.cwd}:{},...n.extra===void 0?{}:{extra:J(n.extra)},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}function sc(n){return"session"in n?{...n,session:Je(n.session)}:{...n}}var gn=class{constructor(e,t,s){this.environmentId=e;this.requestDisable=t;this.onStateChanged=s}currentState="ready";disablePromise;get state(){return this.currentState}disable(){return this.startDisable(()=>this.requestDisable(this))}startDisable(e){if(!this.disablePromise){let t=this.currentState;this.currentState="stopping",this.onStateChanged(t,"stopping"),this.disablePromise=e().then(()=>{let s=this.currentState;this.currentState="stopped",this.onStateChanged(s,"stopped")},s=>{let r=this.currentState;throw this.currentState="failed",this.onStateChanged(r,"failed",s instanceof Error?s:new Error(String(s))),s})}return this.disablePromise}fail(e){if(this.currentState==="ready"){let t=this.currentState;this.currentState="failed",this.onStateChanged(t,"failed",e)}}},hn=class{constructor(e,t,s){this.connection=e;this.daemonEnv=t;this.defaultCwd=s}create(e){let t=new H({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs();return this.connection.createSessionTransport({workerArgs:s,cwd:e.cwd??this.defaultCwd,...e.extra!==void 0?{extra:e.extra}:{},...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}};function rc(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError("capacity must be a positive integer")}function oc(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}function ic(n){return n==="pending"||n==="ready"||n==="inactive"||n==="failed"}function ac(n){if(!n||typeof n!="object")throw new TypeError("Remote Control options must be an object");if(typeof n.externalId!="string"||!n.externalId.trim())throw new TypeError("externalId must be a non-empty string");if(typeof n.environmentType!="string"||!n.environmentType.trim())throw new TypeError("environmentType must be a non-empty string");if(n.name!==void 0&&(typeof n.name!="string"||!n.name.trim()))throw new TypeError("name must be a non-empty string");let e=uc(n.metadata);return{external_id:n.externalId,environment_type:n.environmentType,...n.name!==void 0?{name:n.name}:{},...e!==void 0?{metadata:e}:{}}}function uc(n){if(n!==void 0){if(!vn(n))throw new TypeError("metadata must be a JSON object");return yn(n,"metadata",new Set),structuredClone(n)}}function yn(n,e,t){if(!(n===null||typeof n=="string"||typeof n=="boolean")){if(typeof n=="number"){if(Number.isFinite(n))return;throw new TypeError(`${e} must contain finite JSON numbers`)}if(typeof n!="object")throw new TypeError(`${e} must contain only JSON values`);if(t.has(n))throw new TypeError(`${e} must not contain circular references`);if(t.add(n),Array.isArray(n))n.forEach((s,r)=>yn(s,`${e}[${r}]`,t));else{if(!vn(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))yn(r,`${e}.${s}`,t)}t.delete(n)}}function vn(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}async function cc(n){let e=Me({pathToQoderCLIExecutable:n},ie),t,s={};if(e.transport==="worker"){let r=await ke(Y(e.pathToQoderWorkerRuntime));t=r.runtimePath,s=r.env}else t=n??W();return it(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[Zu]:"1"}:{}}}:{command:t,args:[],env:s}}var Sn=class n{constructor(e){this.process=e;this.exited=new Promise(t=>{e.once("exit",()=>t()),e.once("error",()=>t())}),e.stderr?.on("data",t=>{this.stderrTail+=t.toString("utf8"),this.stderrTail.length>Nr&&(this.stderrTail=this.stderrTail.slice(-Nr))}),e.once("error",t=>{this.reportFailure(new I(`Failed to spawn Qoder CLI daemon: ${t.message}`,{stderr:this.getStderr(),cause:t}))}),e.once("exit",(t,s)=>{this.stopping||this.reportFailure(new I(t!==null?`Qoder CLI daemon exited with code ${t}`:`Qoder CLI daemon terminated by signal ${s}`,{exitCode:t,signal:s,stderr:this.getStderr()}))})}connection;failure;failureListeners=new Set;stderrTail="";exited;stopping=!1;static async spawn(e){let t;try{t=Gu(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await lc(t)}catch(s){throw new I(`Failed to spawn Qoder CLI daemon: ${dc(s)}`,{cause:s})}if(!t.stdin||!t.stdout)throw t.kill("SIGTERM"),new Error("Qoder CLI daemon did not expose piped stdin/stdout");return new n(t)}setConnection(e){this.connection=e,this.failure&&e.fail(this.failure)}onFailure(e){this.failureListeners.add(e),this.failure&&e(this.failure)}beginStopping(){this.stopping=!0}async stop(){this.beginStopping(),!await qr(this.exited,xr)&&(this.process.kill("SIGTERM"),!await qr(this.exited,xr)&&(this.process.kill("SIGKILL"),await this.exited))}getStderr(){return this.stderrTail.trim()||void 0}reportFailure(e){if(!(this.stopping||this.failure)){this.failure=e,this.connection?.fail(e);for(let t of this.failureListeners)t(e)}}};function dc(n){return n instanceof Error?n.message:String(n)}async function lc(n){n.pid===void 0&&await new Promise((e,t)=>{let s=()=>{n.off("error",r),e()},r=o=>{n.off("spawn",s),t(o)};n.once("spawn",s),n.once("error",r)})}async function qr(n,e){let t;try{return await Promise.race([n.then(()=>!0),new Promise(s=>{t=setTimeout(()=>s(!1),e),t.unref?.()})])}finally{t&&clearTimeout(t)}}var bn=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 pc(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=wn(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(us(n.transport))return n.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let t=Me(n,ie);return t.transport==="worker"?new Re({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):be.default}function _n(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;if(s)r=mc(t);else if(t.extra!==void 0)throw new Error("options.extra requires options.daemon.");let o=s?wn(s):void 0,i=o?.sessionStore??t.sessionStore,a=t.sessionStoreFlush??(o?.sessionStore!==void 0?"eager":"batched"),u=pc(t,s),c=new mt({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.");if(t.planMode!==void 0&&typeof t.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");let d=o?.auth??t.auth;if(d==null)throw new bn;if(i&&t.enableFileCheckpointing)throw new Error("sessionStore cannot be combined with enableFileCheckpointing because checkpoint blobs are not part of the SessionStore contract.");if(i&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(i&&o===void 0&&!(u instanceof be)&&!(u instanceof Re))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(i&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(i&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(i&&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 Js(t),Hs({prompt:e,options:t,diagnostics:c});let m=ir(t.memory),p=ur(t.evolution?.skill),l=t.onAuthExpired,g=!1,h=l?()=>{g||(g=!0,Promise.resolve(l()).catch(k=>{c.record("[query] onAuthExpired callback threw:",k)}))}:void 0,f=new Map,y=new Map,b=new Map,S={},T={},C={};if(t.mcpServers)for(let[k,L]of Object.entries(t.mcpServers)){let re=L.tools;if(Array.isArray(re)&&re.length>0&&(T[k]=re),L.type==="sdk"&&"instance"in L&&L.instance){let we=L.instance;if(f.set(k,we),re){let Ze=jt(k,re);Ze&&(C[k]=Ze)}let Kn=new ht(Ze=>{vs(k,Ze,b)});y.set(k,Kn),we.connect(Kn).catch(()=>{})}else S[k]=L}let ye=Object.keys(S).length>0,_=Object.keys(T).length>0,se=t.pathToQoderCLIExecutable,Ye=t.env,wo=d?.type==="jobToken"?d.fetchJobToken:void 0,vo=d?.type==="serviceAccount"?d.fetchServiceAccountToken:void 0,Xe={pathToQoderCLIExecutable:se,executable:t.executable,executableArgs:t.executableArgs,env:Ye,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:s?void 0:d,model:t.model,agent:t.agent,debug:t.debug,diagnostics:c,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:i!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,extra:t.extra===void 0?void 0:J(t.extra),continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let k=t.allowedTools??[];if(t.skills===void 0)return k.length>0?k:void 0;let L=t.skills==="all"?["Skill"]:t.skills.map(we=>`Skill(${we})`),re=new Set(k);return[...k,...L.filter(we=>!re.has(we))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:ye?S:void 0,mcpToolPolicies:_?T:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,securityScan:t.securityScan,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:h},qn=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new pt(async()=>{let k=await wt({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:ct(u,{...Xe,continue:!1})};try{return{transport:ct(u,{...Xe,env:{...Xe.env??process.env,[v.configDirEnv]:k.configDir},materializedSessionConfigDir:k.configDir,continue:!1,resume:k.sessionId}),cleanup:k.cleanup}}catch(L){throw await k.cleanup(),L}}):ct(u,Xe);qn.initialize().catch(()=>{});let bo=typeof e=="string",Se=t.systemPrompt,Fn,Un;if(typeof Se=="string")Fn=Se;else if(typeof Se=="object"&&Se!==null&&Se.type==="preset"){let k=Se;if(k.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(k.preset)}`);Un=k.append}let _o={systemPrompt:Fn,appendSystemPrompt:Un,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:s!==void 0?t.planMode??!1:t.planMode,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing,memory:m.config,evolution:p.config?{skill:p.config}:void 0,customContext:t.customContext,...s!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},xt=new Ke(qn,bo,t.canUseTool,t.hooks,t.abortController,f,_o,t.onElicitation,c,h,t.controlRequestTimeoutMs,y,b,wo,t.resolveModel,t.resolveModelTimeoutMs,i,a,C,vo,m.callbacks,p.callbacks);if(typeof e=="string"){let k={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};xt.streamInput(async function*(){yield k}())}else xt.streamInput(e);return xt}function mc(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=Ue(n.permissionMode),s=[["auth",n.auth],["transport",n.transport],["env",n.env],["pathToQoderCLIExecutable",n.pathToQoderCLIExecutable],["executable",n.executable],["executableArgs",n.executableArgs],["proxy",n.proxy],["spawnQoderCLIProcess",n.spawnQoderCLIProcess],["closeGraceMs",n.closeGraceMs],["sessionStore",n.sessionStore]].find(([,r])=>r!==void 0);if(s)throw new Error(`options.${s[0]} is part of startDaemon() configuration and cannot be overridden by a daemon-bound Query.`);return e}var kn=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},Rn=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function fc(n={}){let e=n.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(n.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new kn,s=_n({prompt:t,options:n.options}),r;try{return await Promise.race([s.initializationResult(),new Promise((o,i)=>{r=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new Rn(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as gc}from"node:fs/promises";import hc from"node:os";import K from"node:path";var yc=["user","project","local"],Tn=new Set(["__proto__","constructor","prototype"]),Sc=/^[\p{L}\p{N}\p{M}._ -]+$/u,wc=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,vc=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),bc=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),_c=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function ge(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function kc(n){let e=n.charCodeAt(0)===65279?n.slice(1):n,t="",s=!1,r=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
|
|
18
20
|
`||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){u==="*"&&c==="/"?(i=!1,t+=" ",a+=1):t+=u===`
|
|
19
|
-
`||u==="\r"?u:" ";continue}if(
|
|
20
|
-
`)){let
|
|
21
|
-
`)){let s
|
|
22
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)
|
|
23
|
-
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return
|
|
24
|
-
`).filter(Boolean))try{let m=JSON.parse(d);
|
|
25
|
-
`," ").trim();if(!i)continue;let a=
|
|
26
|
-
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function
|
|
27
|
-
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function
|
|
28
|
-
`))if(
|
|
29
|
-
`).trim();if(o)return o}}function
|
|
30
|
-
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=
|
|
21
|
+
`||u==="\r"?u:" ";continue}if(s){t+=u,r?r=!1:u==="\\"?r=!0:u==='"'&&(s=!1);continue}u==='"'?(s=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Rc(n,e){let t;try{t=JSON.parse(kc(n))}catch(s){let r=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${r}`)}if(!ge(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Ct(t)}function De(n){return Array.isArray(n)?n.map(De):ge(n)?Ct(n):n}function Ct(n){let e={};for(let[t,s]of Object.entries(n))Tn.has(t)||s===void 0||(e[t]=De(s));return e}function Ec(n){let e=n.join(".");if(bc.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(_c.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function Pn(n,e,t=[]){for(let[s,r]of Object.entries(e)){if(Tn.has(s)||r===void 0)continue;let o=[...t,s],i=n[s],a=Ec(o);if(a==="shallow"&&i&&r){let u={};ge(i)&&Object.assign(u,Ct(i)),ge(r)&&Object.assign(u,Ct(r)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(r)?r:[r];if(a==="concat"){n[s]=[...i.map(De),...u.map(De)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(De);continue}}if(ge(i)&&ge(r))Pn(i,r,o);else if(ge(r)){let u={};Pn(u,r,o),n[s]=u}else n[s]=De(r)}}function Pc(n){let e=n?.[v.configDirNameEnv];if(e===void 0||e==="")return{user:v.configDirName,project:v.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!Sc.test(t)||wc.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(vc.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function En(n,e){let t;try{t=await gc(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:K.resolve(e),settings:Rc(t,K.resolve(e))}}async function Tc(n={}){let e=K.resolve(n.cwd??process.cwd()),t=process.env,s=Pc(t),r=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=r?K.resolve(e,r):hc.homedir(),i=t[v.configDirEnv]?K.resolve(e,t[v.configDirEnv]):K.join(o,s.user),a=K.join(e,s.project),u=new Set(n.settingSources??yc),c=K.resolve(o)===e,d=[];if(u.has("user")){let l=await En("user",K.join(i,"settings.json"));l&&d.push(l)}if(u.has("project")&&!c){let l=await En("project",K.join(a,"settings.json"));l&&d.push(l)}if(u.has("local")&&!c){let l=await En("local",K.join(a,"settings.local.json"));l&&d.push(l)}let m={},p={};for(let l of d){Pn(m,l.settings);for(let g of Object.keys(l.settings))Tn.has(g)||(p[g]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:m,provenance:p,sources:d}}import{McpServer as Cc}from"@modelcontextprotocol/sdk/server/mcp.js";function Mc(n){if(!n.name||typeof n.name!="string"||n.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Cc({name:n.name,version:n.version??"1.0.0"},{capabilities:{tools:n.tools&&n.tools.length>0?{}:void 0}}),t=[];if(n.tools&&n.tools.length>0)for(let s of n.tools){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${n.name}".`);if(!s.description||typeof s.description!="string")throw new Error(`[createSdkMcpServer] Tool "${s.name}" must have a non-empty description string.`);Nt(n.name,{name:s.name,exposedName:s.exposedName,alwaysLoad:s.alwaysLoad}),(s.exposedName!==void 0||s.alwaysLoad!==void 0||s.permissionPolicy!==void 0)&&t.push({name:s.name,...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s.permissionPolicy!==void 0?{permission_policy:s.permissionPolicy}:{}});try{e.registerTool(s.name,{description:s.description,inputSchema:s.inputSchema,...s.annotations?{annotations:s.annotations}:{}},s.handler)}catch(r){throw r instanceof Error&&r.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${s.name}" in server "${n.name}". Each tool name must be unique within a server.`):r}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Oc(n,e,t,s,r){return{name:n,description:e,inputSchema:t,handler:s,annotations:r?.annotations,...r?.exposedName!==void 0?{exposedName:r.exposedName}:{},...r?.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r?.permissionPolicy!==void 0?{permissionPolicy:r.permissionPolicy}:{}}}import{readdir as Cn,readFile as Ot,stat as Ie,appendFile as Br,realpath as Ac,rm as Ur}from"fs/promises";import{basename as Dc,join as O,resolve as Kr}from"path";import{execFile as Ic}from"child_process";import{randomUUID as Jr}from"crypto";import{promisify as xc}from"util";var Nc=xc(Ic),jc=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Hr=new Set(["user","assistant","system","progress","attachment"]);function A(n){return n!==null&&typeof n=="object"}function he(n){return jc.test(n)}function qc(n){let e=[];for(let t of n.split(`
|
|
22
|
+
`)){let s=t.trim();if(s)try{let r=JSON.parse(s);A(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&Hr.has(r.type)&&e.push(r)}catch{}}return e}function Fc(n,e){let t;for(let s of n.split(`
|
|
23
|
+
`)){let r=s.trim();if(r)try{let o=JSON.parse(r);if(!A(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function Mt(n){if(!A(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var Uc=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Kc(n){return typeof n=="string"&&Uc.has(n)?n:void 0}function Mn(n){if(n.type!=="user")return;let e=Mt(n).filter(o=>A(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(n.toolDenialKind)?n.toolDenialKind:e.length===1?[n.toolDenialKind]:[],s=Array.isArray(n.userFeedback)?n.userFeedback:e.length===1?[n.userFeedback]:[],r=e.flatMap((o,i)=>{let a=Kc(t[i]);if(!a)return[];let u=s[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return r.length>0?r:void 0}function He(n){if(n.type!=="assistant"||!A(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function Gr(n){return n.type!=="user"||!n.parentUuid?!1:Mt(n).some(e=>A(e)&&e.type==="tool_result")}function Lc(n){if(!A(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function $c(n,e){let t=new Map;for(let[s,r]of n){let o=Lc(r);if(o){let i=t.get(o);i?i.push(s):t.set(o,[s])}}for(let[s,r]of n){let o=zc(r,r.parentUuid,n,t,e);o!==r.parentUuid&&n.set(s,{...r,parentUuid:o})}}function zc(n,e,t,s,r){if(!e||t.has(e))return e;let o=s.get(e);return!o||o.length===0?e:o.length===1?o[0]:Qc(n,o,t)??Bc(n,o,t,r)??e}function Qc(n,e,t){if(!Gr(n))return;let s=Mt(n).filter(o=>A(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(s.length===0)return;let r=e.filter(o=>{let i=t.get(o);return i?Mt(i).some(a=>A(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return r.length===1?r[0]:void 0}function Bc(n,e,t,s){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(s.get(o.uuid)??-1)<(s.get(n.uuid)??-1)).at(-1)?.uuid}function Jc(n){for(let e of n.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,s=t?.headUuid,r=t?.anchorUuid,o=t?.tailUuid;if(!s||!r||!o)continue;let i=n.get(s);i&&n.set(s,{...i,parentUuid:r});for(let[a,u]of n)a!==s&&u.parentUuid===r&&n.set(a,{...u,parentUuid:o})}}function Lr(n,e,t){let s=(n.timestamp??"").localeCompare(e.timestamp??"");return s!==0?s:(t.get(n.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function Hc(n,e,t){let s=e.filter(p=>p.type==="assistant");if(s.length===0)return e;let r=new Map,o=0;for(let p of n.keys())r.set(p,o++);let i=new Map;for(let p of s){let l=He(p);l&&i.set(l,p)}let a=new Map,u=new Map;for(let p of n.values()){let l=He(p);if(l){let g=a.get(l)??[];g.push(p),a.set(l,g);continue}if(Gr(p)&&p.parentUuid){let g=u.get(p.parentUuid)??[];g.push(p),u.set(p.parentUuid,g)}}let c=new Set,d=new Map;for(let p of s){let l=He(p);if(!l||c.has(l))continue;c.add(l);let g=a.get(l)??[p],h=g.filter(_=>!t.has(_.uuid)),f=[];for(let _ of g){let se=u.get(_.uuid)??[];for(let Ye of se)t.has(Ye.uuid)||f.push(Ye)}if(h.length===0&&f.length===0)continue;let y=i.get(l);if(!y)continue;let b=[...g].sort((_,se)=>Lr(_,se,r));f.sort((_,se)=>Lr(_,se,r));let S=b.findIndex(_=>_.uuid===y.uuid),T=b.slice(0,Math.max(S,0)).filter(_=>!t.has(_.uuid)),C=b.slice(S+1).filter(_=>!t.has(_.uuid)),ye=[...T,...C,...f];for(let _ of ye)t.add(_.uuid);d.set(y.uuid,ye)}if(d.size===0)return e;let m=[];for(let p of e){let l=d.get(p.uuid);if(l){let g=r.get(p.uuid)??Number.MAX_SAFE_INTEGER,h=[],f=[];for(let y of l)(p.type==="assistant"&&y.type==="assistant"&&He(y)===He(p)&&(r.get(y.uuid)??Number.MAX_SAFE_INTEGER)<g?h:f).push(y);m.push(...h,p,...f)}else m.push(p)}return m}function Wr(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,r=new Map;for(let[d,m]of n.entries())s.set(m.uuid,m),r.set(m.uuid,d);t==="runtime"&&Jc(s),$c(s,r);let o;if(e?.leafUuid===null)return[];if(e){let d=s.get(e.leafUuid),m=d?.sessionId??d?.session_id;d&&(m===void 0||m===e.sessionId)&&(o=d)}if(!o){let d=new Set;for(let h of s.values())h.parentUuid&&d.add(h.parentUuid);let m=Array.from(s.values()).filter(h=>!d.has(h.uuid)),p=[];for(let h of m){let f=h,y=new Set;for(;f&&!y.has(f.uuid);){if(y.add(f.uuid),f.type==="user"||f.type==="assistant"){p.push(f);break}f=f.parentUuid?s.get(f.parentUuid):void 0}}if(p.length===0)return[];let l=p.filter(h=>!h.isSidechain&&!h.teamName&&!h.isMeta);o=(l.length>0?l:p).reduce((h,f)=>(r.get(f.uuid)??-1)>(r.get(h.uuid)??-1)?f:h)}let i=[],a=new Set,u=o;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let d=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=d?s.get(d):void 0}i.reverse();let c=t==="runtime"?Gc(i):i;return Hc(s,c,new Set(c.map(d=>d.uuid)))}function Gc(n){let e=-1;for(let t=n.length-1;t>=0;t--){let s=n[t];if(s?.type==="system"&&s.subtype==="compact_boundary"){e=t;break}}return e>=0?n.slice(e):[...n]}function Wc(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function On(n,e,t){let s=n.flatMap(o=>A(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Hr.has(o.type)?[o]:[]),r;for(let o of n){if(!A(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;a!==null&&typeof a!="string"||(r={leafUuid:a,sessionId:e})}return Wr(s,r,t)}function $r(n,e,t){if(t==="historical"&&Wc(n))return!1;let s=n.type==="user"||n.type==="assistant",r=e&&n.type==="system";return!(!s&&!r||n.isMeta||n.isSidechain||n.teamName)}function Vc(n){if(!n)return;let e=n.preservedSegment,t={trigger:n.trigger,pre_tokens:n.preTokens??n.pre_tokens,post_tokens:n.postTokens??n.post_tokens,messages_summarized:n.messagesSummarized??n.messages_summarized,duration_ms:n.durationMs??n.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 An(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function Dn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function zr(n){let e=n.type==="system"?Vc(n.compactMetadata):void 0,t=Mn(n);return{type:n.type,uuid:n.uuid,session_id:n.sessionId??n.session_id??"",message:n.message,parent_tool_use_id:null,parent_agent_id:null,...An(n),...Dn(n),...t?{tool_result_meta:t}:{},...typeof n.timestamp=="string"&&n.timestamp.length>0?{timestamp:n.timestamp}:{},...n.type==="system"&&n.subtype?{subtype:n.subtype}:{},...e?{compact_metadata:e}:{}}}function Qr(n,e){let t=Math.max(0,e?.offset??0),s=e?.limit;return s!==void 0&&s>0?n.slice(t,t+s):t>0?n.slice(t):n}async function At(n){try{return await Ac(Kr(n))}catch{return Kr(n)}}async function Yc(n){return N(await At(n))}async function te(n){let e=Ce();if(n?.dir){let t=await At(n.dir),s=[O(e,N(t))];if(n.includeWorktrees!==!1)try{let{stdout:r}=await Nc("git",["worktree","list","--porcelain"],{cwd:n.dir}),o=r.split(`
|
|
24
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)s.push(O(e,await Yc(i)))}catch{}return s}try{return(await Cn(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>O(e,s.name))}catch{return[]}}async function Vr(n){try{let[e,t]=await Promise.all([Ot(n,"utf-8"),Ie(n)]),s=e.trim().split(`
|
|
25
|
+
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return A(i)?[i]:[]}catch{return[]}});if(s.length===0)return null;let r=Dc(n,".jsonl");return In(r,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Yr(n,e){return O(n,e,"subagents")}function Xr(n){if(typeof n!="object"||n===null)return!1;let e=n;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function Zr(n){let e=[];async function t(s){let r;try{r=await Cn(s,{withFileTypes:!0})}catch{return}for(let o of r){let i=O(s,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(n),e}async function Xc(n){try{let e=await Ot(n.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 eo(n){if(n.length===0)return[];let e=new Map(n.map(i=>[i.uuid,i])),t=n[n.length-1],s=[],r=new Set,o=t;for(;o&&!r.has(o.uuid);)r.add(o.uuid),s.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return s.reverse()}async function Zc(n,e,t){let[s,r]=await Promise.all([Ot(n,"utf-8"),Xc(n)]),o=[];for(let d of s.trim().split(`
|
|
26
|
+
`).filter(Boolean))try{let m=JSON.parse(d);Xr(m)&&o.push(m)}catch{}let a=eo(o).map(d=>{let m=Mn(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??e,message:d.message,parent_tool_use_id:r.parentToolUseId,parent_agent_id:r.parentAgentId,...An(d),...Dn(d),...m?{tool_result_meta:m}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function xe(n){return N(await At(n??process.cwd()))}function Ge(n,e){return{projectKey:n,sessionId:e}}function ed(n){let e=0;for(let t of n){if(typeof t.timestamp!="string")continue;let s=Date.parse(t.timestamp);Number.isFinite(s)&&(e=Math.max(e,s))}return e}function td(n){let e=n.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var nd=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function sd(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(nd,"");if(s===e)return s;e=s}return e}var rd=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,od=/<command-name>(.*?)<\/command-name>/,id=/<bash-input>([\s\S]*?)<\/bash-input>/;function ad(n){if(n.length<=200)return n;let e=n.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function ud(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!A(t))return;let s=t.content,r=[];if(typeof s=="string")r.push(s);else if(Array.isArray(s)){for(let o of s)if(A(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&r.push(o.text)}}for(let o of r){let i=o.replaceAll(`
|
|
27
|
+
`," ").trim();if(!i)continue;let a=od.exec(i);if(a){e.commandFallback??=a[1];continue}let u=id.exec(i);if(u)return`! ${u[1].trim()}`;if(!rd.test(i))return ad(i)}}function In(n,e,t,s={}){if(e.length===0)return;let r,o,i,a,u,c,d,m,p,l,g;for(let b of e){let S=b;if(g??=S.isSidechain===!0,l===void 0&&typeof S.timestamp=="string"){let T=Date.parse(S.timestamp);Number.isFinite(T)&&(l=T)}if(!r){let T={commandFallback:o};r=ud(S,T),o=T.commandFallback}S.type==="custom-title"&&typeof S.customTitle=="string"&&(i=S.customTitle),S.type==="ai-title"&&typeof S.aiTitle=="string"&&(a=S.aiTitle),typeof S.lastPrompt=="string"&&(u=S.lastPrompt),typeof S.summary=="string"&&(c=S.summary),S.type==="tag"&&(p=typeof S.tag=="string"&&S.tag?S.tag:void 0),typeof S.gitBranch=="string"&&(d=S.gitBranch),m===void 0&&typeof S.cwd=="string"&&(m=S.cwd),S.type==="relocated"&&typeof S.relocatedCwd=="string"&&(m=S.relocatedCwd)}if(g)return;let h=r??o,f=i||a,y=f||u||c||h;if(y)return{sessionId:n,summary:y,lastModified:t??ed(e),fileSize:s.fileSize,customTitle:f,firstPrompt:h,gitBranch:d,cwd:m||s.defaultCwd,tag:p,createdAt:l}}async function to(n,e,t){let s=Ge(await xe(t),e),r=await n.load(s);return r?{key:s,entries:r}:void 0}async function cd(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let d=await At(n.dir??process.cwd()),m=N(d),p=(await c.listSessions(m)).slice().sort((f,y)=>y.mtime-f.mtime),l=Math.max(0,n.offset??0),g=n.limit!==void 0&&n.limit>0?p.slice(l,l+n.limit):l>0?p.slice(l):p;return(await Promise.allSettled(g.map(async({sessionId:f,mtime:y})=>{let b=await c.load(Ge(m,f));return b?In(f,b,y,{defaultCwd:d}):void 0}))).flatMap((f,y)=>{if(f.status==="fulfilled")return f.value?[f.value]:[];let b=g[y];return[{sessionId:b.sessionId,summary:"",lastModified:b.mtime}]})}let e=await te(n),s=(await Promise.all(e.map(async c=>{try{return(await Cn(c)).filter(m=>m.endsWith(".jsonl")).map(m=>O(c,m))}catch{return[]}}))).flat(),r=await Promise.all(s.map(Vr)),o=new Map;for(let c of r){if(!c)continue;let d=o.get(c.sessionId);(!d||c.lastModified>d.lastModified)&&o.set(c.sessionId,c)}let i=Array.from(o.values()).sort((c,d)=>d.lastModified-c.lastModified),a=n?.offset??0,u=n?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function dd(n,e){if(e?.sessionStore){if(!he(n))return;let s=await to(e.sessionStore,n,e.dir);return s?In(n,s.entries,td(s.entries)):void 0}let t=await te(e);for(let s of t){let r=O(s,`${n}.jsonl`),o=await Vr(r);if(o)return o}}async function ld(n,e){if(!he(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let o=await to(e.sessionStore,n,e.dir);if(!o)return[];let i=On(o.entries,n,s);return Qr(i.filter(a=>$r(a,t,s)).map(zr),e)}let r=await te(e);for(let o of r){let i=O(o,`${n}.jsonl`);try{let a=await Ot(i,"utf-8"),c=Wr(qc(a),Fc(a,n),s).filter(d=>$r(d,t,s)).map(zr);return Qr(c,e)}catch{continue}}return[]}async function pd(n,e,t){if(!he(n))throw new Error(`Invalid sessionId: ${n}`);let s=e.trim();if(!s)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(Ge(await xe(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Jr(),timestamp:new Date().toISOString()}]);return}let r=await te(t);for(let o of r){let i=O(o,`${n}.jsonl`);try{await Ie(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await Br(i,a+`
|
|
28
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function md(n,e,t){if(!he(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:sd(e).trim();if(s!==null&&!s)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(Ge(await xe(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Jr(),timestamp:new Date().toISOString()}]);return}let r=await te(t);for(let o of r){let i=O(o,`${n}.jsonl`);try{await Ie(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await Br(i,a+`
|
|
29
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function fd(n,e){if(e?.sessionStore){if(!he(n))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let s=await e.sessionStore.listSubkeys({projectKey:await xe(e.dir),sessionId:n});return Array.from(new Set(s.map(r=>{if(!r.startsWith("subagents/"))return;let o=r.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(r=>r!==void 0)))}let t=await te(e);for(let s of t){let r=O(s,`${n}.jsonl`);try{await Ie(r);let o=await Zr(Yr(s,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function gd(n,e,t){if(t?.sessionStore){if(!he(n)||!e)return[];let r=await xe(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:r,sessionId:n}),g=`agent-${e}`,h=l.find(f=>f.startsWith("subagents/")&&f.split("/").at(-1)===g);if(!h)return[];o=h}let i=await t.sessionStore.load({projectKey:r,sessionId:n,subpath:o});if(!i)return[];let a=i.filter(Xr),u=i.filter(l=>l.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,d=typeof u?.parentAgentId=="string"?u.parentAgentId:null,m=eo(a).map(l=>{let g=Mn(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??n,message:l.message,parent_tool_use_id:c,parent_agent_id:d,...An(l),...Dn(l),...g?{tool_result_meta:g}:{}}}),p=Math.max(0,t.offset??0);return t.limit!==void 0?m.slice(p,p+t.limit):m.slice(p)}let s=await te(t);for(let r of s){let o=O(r,`${n}.jsonl`);try{await Ie(o);let a=(await Zr(Yr(r,n))).find(u=>u.agentId===e);return a?await Zc(a.filePath,n,t):[]}catch{continue}}return[]}async function hd(n,e){if(!he(n))throw new Error(`Invalid sessionId: ${n}`);if(e?.sessionStore){if(!e.sessionStore.delete)throw new Error("SessionStore does not support delete()");await e.sessionStore.delete(Ge(await xe(e.dir),n));return}let t=await te(e);for(let s of t){let r=O(s,`${n}.jsonl`);try{await Ie(r),await Promise.all([Ur(r,{force:!0}),Ur(O(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as Dt}from"crypto";import{readdir as yd,readFile as Sd,realpath as wd,stat as no,writeFile as vd}from"fs/promises";import{dirname as bd,join as xn,resolve as _d}from"path";var so=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,kd=new Set(["user","assistant","attachment","system","progress"]);async function oo(n){let e=_d(n);try{return await wd(e)}catch{return e}}async function Rd(n,e){let t=Ce();if(e){let r=N(await oo(e)),o=xn(t,r,`${n}.jsonl`);try{if((await no(o)).size>0)return o}catch{}return}let s;try{s=await yd(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=xn(t,r.name,`${n}.jsonl`);try{if((await no(o)).size>0)return o}catch{}}}function io(n,e){let t=[],s;for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){t.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(s=i.relocatedCwd)}return{transcript:On(n,e,"historical").filter(o=>kd.has(o.type)),contentReplacements:t,relocatedCwd:s}}function Ed(n,e){let t=[];for(let s of n.split(`
|
|
30
|
+
`))if(s.trim())try{t.push(JSON.parse(s))}catch{}return io(t,e)}function Pd(n){for(let e of n){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let s=t.message;if(s===null||typeof s!="object")continue;let r=s.content;if(typeof r=="string"&&r.trim())return r.trim();if(!Array.isArray(r)||r.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=r.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
|
|
31
|
+
`).trim();if(o)return o}}function Td(n){let e,t;for(let s of n){if(s===null||typeof s!="object")continue;let r=s;typeof r.customTitle=="string"&&r.customTitle&&(e=r.customTitle),typeof r.aiTitle=="string"&&r.aiTitle&&(t=r.aiTitle)}return e??t??Pd(n)}function ro(n,e,t,s){let r=n.transcript.filter(l=>l.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=r.findIndex(g=>g.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,l+1)}let o=new Set(r.map(l=>l.uuid)),i=new Map(r.map(l=>[l.uuid,Dt()])),a=r.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(l=>[l.uuid,l])),c=Dt(),d=new Date().toISOString(),m=a.map((l,g)=>{let h=null,f=typeof l.parentUuid=="string"?l.parentUuid:void 0;for(;f;){let S=u.get(f);if(!S)break;if(S.type!=="progress"){h=i.get(f)??null;break}f=typeof S.parentUuid=="string"?S.parentUuid:void 0}let y=typeof l.logicalParentUuid=="string"?i.get(l.logicalParentUuid)??null:l.logicalParentUuid??null,b={...l,...l.type==="system"&&l.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(l.uuid),parentUuid:h,logicalParentUuid:y,sessionId:c,timestamp:g===a.length-1?d:typeof l.timestamp=="string"?l.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:l.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let l=n.contentReplacements.flatMap(g=>{if(g===null||typeof g!="object")return[];let h=g.messageUuid;if(typeof h!="string"||!o.has(h))return[];let f=i.get(h);return f?[{...g,messageUuid:f}]:[]});l.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:l,uuid:Dt(),timestamp:d})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${Td(s)??"Forked session"} (fork)`,uuid:Dt(),timestamp:d}),{sessionId:c,entries:m}}async function Cd(n,e={}){if(!so.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!so.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await oo(e.dir??process.cwd()),a=N(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=ro(io(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Rd(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await Sd(t,"utf8"),r=s.split(`
|
|
32
|
+
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=ro(Ed(s,n),n,e,r);return await vd(xn(bd(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
31
33
|
`)}
|
|
32
|
-
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function
|
|
33
|
-
${t.stdout}`);throw
|
|
34
|
+
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function It(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Nn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=It(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(It(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(It(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(It(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 Md}from"fs";import{readdir as lo,readFile as Od,realpath as Ad,stat as ao}from"fs/promises";import{basename as uo,dirname as Dd,join as We,relative as Id,resolve as xd,sep as Nd}from"path";import{createInterface as jd}from"readline";var qd=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Fd=500,Ud=1024*1024;async function Kd(n){let e=xd(n);try{return await Ad(e)}catch{return e}}async function Ld(n,e){let t=Ce();if(e){let r=N(await Kd(e)),o=We(t,r,`${n}.jsonl`);try{if((await ao(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await lo(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=We(t,r.name,`${n}.jsonl`);try{if((await ao(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function $d(n){let e=[];async function t(s){let r;try{r=await lo(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=We(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function co(n,e,t,s){let r=jd({input:Md(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=Ud)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function zd(n,e,t={}){if(!qd.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await Ld(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Fd;if(await co(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=We(o,"subagents");for(let a of await $d(i)){let c=Id(o,a).split(Nd);c[c.length-1]=uo(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await co(a,d,e,r);let m=We(Dd(a),`${uo(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Od(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as Qd}from"node:child_process";import{existsSync as Bd}from"node:fs";import{Worker as Jd}from"node:worker_threads";var jn=3e4;async function po(n,e={}){let t=Me({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ie);return t.transport==="worker"?Gd(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Hd(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??W()})}function Hd(n,e){return new Promise((t,s)=>{let r=Qd(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:mo(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(fo(e.timeoutMs)))},e.timeoutMs??jn);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function Gd(n,e){Vd(e.signal);let t=Y(e.pathToQoderWorkerRuntime),s=await ke(t);Wd(s);let r=e.cwd??process.cwd(),o=mo(e.env);delete o.NODE_OPTIONS;let i=lt(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new Jd(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,g=c.stdout===null,h=c.stderr===null,f=()=>{clearTimeout(T),e.signal?.removeEventListener("abort",S)},y=C=>{p||(p=!0,f(),u(C))},b=()=>{p||l===void 0||!g||!h||(p=!0,f(),a({stdout:d,stderr:m,exitCode:l}))},S=()=>{c.terminate(),y(go(e.signal))},T=setTimeout(()=>{c.terminate(),y(fo(e.timeoutMs))},e.timeoutMs??jn);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{g=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{h=!0,b()}),c.once("error",y),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",S,{once:!0}),e.signal?.aborted&&S()})}function mo(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function Wd(n){if(!Bd(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function fo(n){return new Error(`qodercli subprocess timed out after ${n??jn}ms`)}function Vd(n){if(n?.aborted)throw go(n)}function go(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function Yd(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ne(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,resources:r.resources}))}async function Xd(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ne(t,e);s.exitCode!==0&&Ve(s)}async function Zd(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ne(t,e);s.exitCode!==0&&Ve(s)}async function el(n,e){let t=await Ne(["plugins","install",n,"--scope","user","--json"],e);t.exitCode!==0&&Ve(t);let s=JSON.parse(t.stdout);return{pluginId:s.pluginId,version:s.version??"local",path:s.path}}async function tl(n,e){let t=["plugins","uninstall",n,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let s=await Ne(t,e);s.exitCode!==0&&Ve(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}async function nl(n,e){let t;try{t=await Ne(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new F("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ne("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=sl(`${t.stderr}
|
|
35
|
+
${t.stdout}`);throw ne(r?"plugin_validation_unsupported":"plugin_validation_protocol_error",r?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(s&&typeof s=="object"&&"ok"in s&&s.schemaVersion!==1)throw ne("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(s&&typeof s=="object"&&s.ok===!0&&s.report){let r=s.report;if(ol(r))return r;throw ne("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(s&&typeof s=="object"&&s.ok===!1){let r=s.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw ne("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw ne(o.code,o.message)}throw t.exitCode!==0&&Ve(t),ne("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function sl(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var rl=3e4;function Ne(n,e){return po(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:rl})}function Ve(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw ne(e,t)}function ne(n,e){let t=new Error(e);return t.code=n,t}function ol(n){if(!n||typeof n!="object")return!1;let e=n;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(s=>s!==null&&typeof s=="object"&&(s.severity==="error"||s.severity==="warning")&&typeof s.code=="string"&&typeof s.message=="string"&&typeof s.phase=="string"&&t.has(s.phase)&&(s.location===void 0||s.location!==null&&typeof s.location=="object"&&typeof s.location.path=="string"))}import{execFile as il}from"child_process";function al(){return W()}async function ul(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??al(),s=e?.timeout??6e4,r=["feedback","-c",n.content,"--json"];if(e?.storageDir&&r.push("--storage-dir",e.storageDir),n.sessionId&&r.push("-s",n.sessionId),n.workdir&&r.push("--workdir",n.workdir),n.email&&r.push("--email",n.email),n.include)for(let o of n.include)r.push("--include",o);if(n.imagePaths)for(let o of n.imagePaths)r.push("--images",o);if(n.callerVersion&&r.push("--caller-version",n.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&r.push("--ide-type",o)}return new Promise(o=>{il(t,r,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var So={};Ro(So,{filterEscalatingDefaultMode:()=>ho,isBashToolBackgroundLaunchResult:()=>yo});var cl=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function ho(n){let e=n.effective.permissions?.defaultMode;if(!e||!cl.has(e))return n.effective;for(let t=n.sources.length-1;t>=0;t-=1){let s=n.sources[t];if(s.settings.permissions?.defaultMode!==void 0){if(s.source==="project"){let{defaultMode:r,...o}=n.effective.permissions??{};return{...n.effective,permissions:o}}return n.effective}}return n.effective}function yo(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{F as AbortError,st as AuthAccessTokenEnvVarError,rt as AuthServiceAccountEnvVarError,Hn as DEFAULT_ACCESS_TOKEN_ENV_VAR,ie as DEFAULT_RUNTIME_TRANSPORT,nt as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Po as EXIT_REASONS,Eo as HOOK_EVENTS,Nn as InMemorySessionStore,vt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Fe as ModelPolicyTimeoutError,be as ProcessTransport,G as ProtocolVersionMismatchError,I as QoderCliProcessError,ue as QoderWorkerRuntimeError,ce as UnsupportedCliCapabilityError,Bt as WIRE_PROTOCOL_VERSION,Re as WorkerTransport,Do as accessToken,Io as accessTokenFromEnv,So as coreTypes,Mc as createSdkMcpServer,hd as deleteSession,Zd as disablePlugin,Xd as enablePlugin,ho as filterEscalatingDefaultMode,Cd as forkSession,dd as getSessionInfo,ld as getSessionMessages,gd as getSubagentMessages,ys as hasResolvableQoderWorkerRuntime,zd as importSessionToStore,el as installPlugin,yo as isBashToolBackgroundLaunchResult,qo as jobToken,Yd as listPlugins,cd as listSessions,fd as listSubagents,xo as qodercliAuth,_n as query,pd as renameSession,Y as resolveQoderWorkerRuntimePath,Tc as resolveSettings,No as serviceAccount,jo as serviceAccountFromEnv,tc as startDaemon,fc as startup,ul as submitFeedback,md as tagSession,Oc as tool,tl as uninstallPlugin,nl as validatePlugin};
|