@qoder-ai/qoder-agent-sdk 1.0.33 → 1.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var Mo=Object.defineProperty;var Io=(n,e)=>{for(var t in e)Mo(n,t,{get:e[t],enumerable:!0})};import{spawn as li}from"child_process";import{createInterface as ci}from"readline";var Ao=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Oo=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],nt=2e3,Hn=5e3;var st="1.0.33";var ae=41,Gn=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Jn=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Do="QODER_FEATURE_TASKS";function Wn(n){let e=n[Do];if(e!=="0"&&e!=="false")return[...Gn];let t=new Set(Jn);return Gn.flatMap(s=>s===Jn[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as ts,mkdtemp as zo,rm as ns,writeFile as Qo}from"fs/promises";import{existsSync as at,mkdtempSync as Go,readFileSync as Jo,rmSync as Ho,writeFileSync as Wo}from"fs";import{homedir as Vo,tmpdir as ss}from"os";import{dirname as cs,join as B}from"path";import{fileURLToPath as Yo}from"url";var xo=/^[A-Za-z0-9_-]{1,64}$/,No=new Set(["mcp_list","mcp_get","mcp_call"]);function jt(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(!xo.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(No.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Ft(n,e){let t={};for(let s of e)jt(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 Ut(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Ft(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Vn(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]=Ut(t,s,r)}return e}var qo="global",Yn=qo==="cn",jo=Yn?"QODERCN_":"QODER_",Lt=`${jo}VPC_ENDPOINT`,v=Yn?{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 Xn=v.accessTokenEnv,rt=v.serviceAccountEnv;function Fo(n){return{type:"accessToken",accessToken:n}}function Uo(n=Xn){return{type:"accessToken",accessToken:{envVar:n}}}function Lo(){return{type:"qodercli"}}function Ko(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 Bo(n=rt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function $o(n){return{type:"jobToken",fetchJobToken:n}}var Zn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function es(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Zn),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 Zn){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 rs="QODER_AGENT_SDK_ENTRYPOINT",os="QODER_AGENT_SDK_VERSION",is="QODER_SDK_AUTH_PAYLOAD_FILE",Xo="sdk-ts",Zo=Yo(import.meta.url),as=cs(Zo),ot=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"}},it=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 ut(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function V(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=ei();if(n)return n;let e=ti();if(at(e))return e;let t=ni();return t||v.cliCommands[0]}function ei(){for(let n of ds())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=B(n,"dist","_bundled",t);if(at(s))return s}return null}function ti(){for(let n of ds())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[B(n,"node_modules",".bin",t),B(n,"..","..",".bin",t)];for(let r of s)if(at(r))return r}return v.cliCommands[0]}function ni(){let n=process.env[v.cliHomeEnv]??Vo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=B(n,v.configDirName,"local",t);if(at(s))return s}return null}function ds(){let n=[B(as,".."),B(as,"..","..")];return[...new Set(n)]}function si(){return{allow:[],ask:[],deny:[]}}function us(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function ri(n,e){if(e.startsWith("mcp__"))return e;let t=us(n),s=e==="*"?"*":us(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function ls(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 oi(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{Ho(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=cs(this.authPayloadPath);try{await ns(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[rs],delete t[os],delete t[is];for(let s of this.serviceAccountCredentialEnvVars())ii(t,s);if(t[rs]=Xo,t[os]=st,this.authPayloadPath&&(t[is]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Lt]=s:delete t[Lt]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[rt];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??Wn(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?oi(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=es(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]:[];ls(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]=Ut(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=si(),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=ri(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]]:[];ls(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Jo(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=Go(B(ss(),"qoder-agent-sdk-settings-"));let t=B(this.generatedSettingsDir,"settings.json");return Wo(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await zo(B(ss(),"qoder-sdk-auth-"));try{await ts(s,448);let r=B(s,"payload.json");return await Qo(r,JSON.stringify(t),{mode:384}),await ts(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await ns(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 it(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 ot(t);return s}};function ii(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 lt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var ai=new Set(["--mcp-config","--proxy","--settings"]);function ct(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),ai.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as ui}from"node:stream";var $=16*1024*1024,Fe=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"},Y=class extends ui{constructor(t=$,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 Fe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Fe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ve(n,e=$,t="JSONL output"){let s=n.endsWith(`
1
+ var Mo=Object.defineProperty;var Io=(n,e)=>{for(var t in e)Mo(n,t,{get:e[t],enumerable:!0})};import{spawn as li}from"child_process";import{createInterface as ci}from"readline";var Ao=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Oo=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],nt=2e3,Hn=5e3;var st="1.0.35";var ae=41,Gn=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Jn=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Do="QODER_FEATURE_TASKS";function Wn(n){let e=n[Do];if(e!=="0"&&e!=="false")return[...Gn];let t=new Set(Jn);return Gn.flatMap(s=>s===Jn[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as ts,mkdtemp as zo,rm as ns,writeFile as Qo}from"fs/promises";import{existsSync as at,mkdtempSync as Go,readFileSync as Jo,rmSync as Ho,writeFileSync as Wo}from"fs";import{homedir as Vo,tmpdir as ss}from"os";import{dirname as cs,join as B}from"path";import{fileURLToPath as Yo}from"url";var xo=/^[A-Za-z0-9_-]{1,64}$/,No=new Set(["mcp_list","mcp_get","mcp_call"]);function jt(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(!xo.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(No.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Ft(n,e){let t={};for(let s of e)jt(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 Ut(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Ft(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Vn(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]=Ut(t,s,r)}return e}var qo="global",Yn=qo==="cn",jo=Yn?"QODERCN_":"QODER_",Lt=`${jo}VPC_ENDPOINT`,v=Yn?{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 Xn=v.accessTokenEnv,rt=v.serviceAccountEnv;function Fo(n){return{type:"accessToken",accessToken:n}}function Uo(n=Xn){return{type:"accessToken",accessToken:{envVar:n}}}function Lo(){return{type:"qodercli"}}function Ko(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 Bo(n=rt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function $o(n){return{type:"jobToken",fetchJobToken:n}}var Zn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function es(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Zn),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 Zn){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 rs="QODER_AGENT_SDK_ENTRYPOINT",os="QODER_AGENT_SDK_VERSION",is="QODER_SDK_AUTH_PAYLOAD_FILE",Xo="sdk-ts",Zo=Yo(import.meta.url),as=cs(Zo),ot=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"}},it=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 ut(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function V(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=ei();if(n)return n;let e=ti();if(at(e))return e;let t=ni();return t||v.cliCommands[0]}function ei(){for(let n of ds())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=B(n,"dist","_bundled",t);if(at(s))return s}return null}function ti(){for(let n of ds())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[B(n,"node_modules",".bin",t),B(n,"..","..",".bin",t)];for(let r of s)if(at(r))return r}return v.cliCommands[0]}function ni(){let n=process.env[v.cliHomeEnv]??Vo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=B(n,v.configDirName,"local",t);if(at(s))return s}return null}function ds(){let n=[B(as,".."),B(as,"..","..")];return[...new Set(n)]}function si(){return{allow:[],ask:[],deny:[]}}function us(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function ri(n,e){if(e.startsWith("mcp__"))return e;let t=us(n),s=e==="*"?"*":us(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function ls(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 oi(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{Ho(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=cs(this.authPayloadPath);try{await ns(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[rs],delete t[os],delete t[is];for(let s of this.serviceAccountCredentialEnvVars())ii(t,s);if(t[rs]=Xo,t[os]=st,this.authPayloadPath&&(t[is]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Lt]=s:delete t[Lt]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[rt];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??Wn(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?oi(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=es(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]:[];ls(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]=Ut(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=si(),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=ri(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]]:[];ls(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Jo(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=Go(B(ss(),"qoder-agent-sdk-settings-"));let t=B(this.generatedSettingsDir,"settings.json");return Wo(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await zo(B(ss(),"qoder-sdk-auth-"));try{await ts(s,448);let r=B(s,"payload.json");return await Qo(r,JSON.stringify(t),{mode:384}),await ts(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await ns(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 it(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 ot(t);return s}};function ii(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 lt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var ai=new Set(["--mcp-config","--proxy","--settings"]);function ct(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),ai.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as ui}from"node:stream";var $=16*1024*1024,Fe=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"},Y=class extends ui{constructor(t=$,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 Fe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Fe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ve(n,e=$,t="JSONL output"){let s=n.endsWith(`
2
2
  `)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new Fe(t,e)}var ps=8192,D=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(lt(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} ${ct(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===ae&&this.fireAuthExpired();let l=this.createProcessExitError(a,u);l&&(this.processExitError=l),this.cleanupAuthPayload().catch(()=>{})})}else this.process=li(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===ae&&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(`
3
3
  `)?e:e+`
4
4
  `;if(ve(t,$,"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 Y($,"SDK process output");e.pipe(t);let s=ci({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??nt,i=setTimeout(()=>{if(r()){s("SIGTERM");let a=setTimeout(()=>{r()&&s("SIGKILL")},Hn);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>ps&&(this.stderrTail=this.stderrTail.slice(-ps))}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 D(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==ae){if(e!==0&&e!==null)return new D(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new D(`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??V();if(ut(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 di(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ue=di();function ms(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function dt(n,e){return n.create(e)}import{existsSync as qi}from"fs";import{createInterface as ji}from"readline";import{Worker as Fi}from"worker_threads";import{createHash as pi}from"node:crypto";import{existsSync as mi}from"node:fs";import{chmod as fi,lstat as gi,mkdir as Ue,readFile as fs,readdir as hi,readlink as yi,rename as Si,rm as pt,stat as wi,symlink as vi,writeFile as gs}from"node:fs/promises";import{tmpdir as bi,userInfo as _i}from"node:os";import{basename as hs,dirname as _e,join as z,relative as ki}from"node:path";var Ri="QODER_WORKER_RUNTIME_ASSET_ROOT",ys=/(^|[\\/])app\.asar([\\/]|$)/,Bt=".qoder-worker-runtime-ready";function Ss(n){return ys.test(n)}function $t(n){return Ss(n)?n.replace(ys,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ke(n,e={}){let t=$t(n);if(!e.forceMaterialize&&t){let u=_e(t);if(mi(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Kt(t,u,!1,_e(n))}if(!(e.forceMaterialize||Ss(n))){let u=_e(n);return Kt(n,u,!1)}let r=_e(n),o=await Ei(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=ki(r,n)||hs(n),a=z(o,i);return Kt(a,o,!0,r)}function Kt(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[Ri]:e}}}async function Ei(n,e,t){let s=await Ci(n,e),r=t.cacheDir??Mi(),o=z(r,s),i=z(o,Bt);if(await vs(i)===s)return o;let a=z(r,`.setup-${s}-${process.pid}-${Date.now()}`);await Ue(r,{recursive:!0,mode:448}),await pt(a,{recursive:!0,force:!0}),await pt(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await Ue(a,{recursive:!0,mode:448}),await ws(n,a),await gs(z(a,Bt),s,{mode:384}),await Ti(a,o,s),o}catch(u){throw await pt(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Ci(n,e){let t=pi("sha256");t.update("qoder-worker-runtime-v1\0");let s=await bs(z(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await wi(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ws(n,e){let t=await hi(n,{withFileTypes:!0});await Ue(e,{recursive:!0,mode:448});for(let s of t){let r=z(n,s.name),o=z(e,s.name);if(s.isDirectory()){await ws(r,o);continue}if(s.isSymbolicLink()){await Ue(_e(o),{recursive:!0,mode:448}),await vi(await yi(r),o);continue}if(!s.isFile())continue;let i=await Pi(r);await Ue(_e(o),{recursive:!0,mode:448}),await gs(o,await fs(r),{mode:i}),process.platform!=="win32"&&await fi(o,i)}}async function Pi(n){let e=((await gi(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=hs(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Ti(n,e,t){try{await Si(n,e)}catch(s){if(await vs(z(e,Bt))===t){await pt(n,{recursive:!0,force:!0});return}throw s}}async function vs(n){let e=await bs(n);return e?e.toString("utf8"):null}async function bs(n){try{return await fs(n)}catch{return null}}function Mi(){let n=Ii(_i().username||process.env.USER||process.env.USERNAME||"user");return z(bi(),`qoder-sdk-worker-runtime-${n}`)}function Ii(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Ai="QODER_WORKER_CWD";function mt(n,e){return{env:{...e.env,[Ai]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as zt}from"node:fs";import{dirname as Oi,join as le}from"node:path";import{fileURLToPath as Di}from"node:url";var xi=Di(import.meta.url),Qt=Oi(xi);function X(n){if(n)return n;let e=[];for(let t of Ni())e.push(le(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),le(t,"dist","_worker","qoder-worker-runtime.mjs"),le(t,"_worker","qoder-worker-runtime.obf.mjs"),le(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(zt(t))return t;return e[0]??le(Qt,"..","_worker","qoder-worker-runtime.obf.mjs")}function _s(n){let e=X(n);if(zt(e))return!0;let t=$t(e);return t!==null&&zt(t)}function Ni(){let n=[le(Qt,".."),le(Qt,"..","..")];return[...new Set(n)]}var ks=8192,ce=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 Gt(lt(this.options,e))}},Gt=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=X(this.options.pathToQoderWorkerRuntime),s;try{s=await ke(t,{diagnostics:this.diagnostics})}catch(a){throw new ce(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!qi(r))throw new ce(`Qoder worker runtime not found: ${r}`);let o=this.options.cwd??process.cwd(),i=mt(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: ${ct(e.args)}`),this.worker=new Fi(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===ae&&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 l=u.trim();l&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${l}`)}),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(`
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "version": 1,
3
3
  "brand": "global",
4
- "sdkVersion": "1.0.33",
5
- "qoderCliVersion": "1.1.43",
4
+ "sdkVersion": "1.0.35",
5
+ "qoderCliVersion": "1.1.46",
6
6
  "defaultTransport": "worker",
7
7
  "workerRuntime": {
8
8
  "packaged": false,
9
9
  "delivery": "install",
10
10
  "source": "qodercli-worker-runtime",
11
- "urlTemplate": "https://download.qoder.com/qodercli/releases/1.1.43/qodercli-worker-runtime-{target}.tgz",
11
+ "urlTemplate": "https://download.qoder.com/qodercli/releases/1.1.46/qodercli-worker-runtime-{target}.tgz",
12
12
  "artifactNameTemplate": "qodercli-worker-runtime-{target}.tgz",
13
- "sdkVersion": "1.0.33",
14
- "qoderCliVersion": "1.1.43"
13
+ "sdkVersion": "1.0.35",
14
+ "qoderCliVersion": "1.1.46"
15
15
  }
16
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qoder-ai/qoder-agent-sdk",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
4
4
  "description": "TypeScript SDK for building Qoder-powered coding agents.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -50,7 +50,7 @@
50
50
  "peerDependencies": {
51
51
  "zod": "^3.25.0 || ^4.0.0"
52
52
  },
53
- "qoderCliVersion": "1.1.43",
53
+ "qoderCliVersion": "1.1.46",
54
54
  "qoderSdkBrand": "global",
55
55
  "license": "SEE LICENSE IN LICENSE"
56
56
  }