@qoder-ai/qoder-agent-sdk 1.0.24 → 1.0.26
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 +28 -0
- package/dist/core/brand.d.ts +10 -0
- package/dist/core/constants.d.ts +6 -5
- package/dist/core/diagnostic-args.d.ts +2 -0
- package/dist/core/process-transport.d.ts +5 -0
- package/dist/core/runtime-launch-options.d.ts +1 -0
- package/dist/global/plugins.d.ts +3 -9
- package/dist/index.d.ts +7 -5
- package/dist/index.js +28 -29
- package/dist/protocol/control.d.ts +78 -3
- package/dist/protocol/index.d.ts +3 -2
- package/dist/protocol/index.js +1 -1
- package/dist/protocol/memory.d.ts +4 -0
- package/dist/protocol/messages.d.ts +43 -1
- package/dist/protocol/skill-evolution.d.ts +67 -0
- package/dist/protocol/version.d.ts +1 -1
- package/dist/query/query-runner.d.ts +44 -5
- package/dist/runtime-manifest.json +5 -5
- package/dist/session/session-manager.d.ts +42 -4
- package/dist/skill-evolution/skill-evolution-options.d.ts +2 -0
- package/dist/types/control.d.ts +1 -1
- package/dist/types/hooks.d.ts +4 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/memory.d.ts +16 -1
- package/dist/types/messages.d.ts +1 -1
- package/dist/types/model-policy-provider.d.ts +8 -2
- package/dist/types/options.d.ts +61 -4
- package/dist/types/plugins.d.ts +11 -0
- package/dist/types/session.d.ts +8 -0
- package/dist/types/skill-evolution.d.ts +41 -0
- package/dist/types/tools.d.ts +26 -8
- package/package.json +2 -2
- package/scripts/postinstall.cjs +52 -39
package/dist/index.js
CHANGED
|
@@ -1,34 +1,33 @@
|
|
|
1
|
-
var qn=Object.defineProperty;var Ln=(r,e)=>{for(var t in e)qn(r,t,{get:e[t],enumerable:!0})};import{spawn as ws}from"child_process";import{createInterface as vs}from"readline";var $n=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],Qn=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],_e=2e3,Ut=5e3;var qt="1.0.24";var L=41,Kt=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","WebFetch","WebSearch","Write"],Ft=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Bn="QODER_FEATURE_TASKS";function Lt(r){let e=r[Bn];if(e!=="0"&&e!=="false")return[...Kt];let t=new Set(Ft);return Kt.flatMap(n=>n===Ft[0]?["TodoWrite"]:t.has(n)?[]:[n])}import{chmod as Wt,mkdtemp as ts,rm as Ht,writeFile as rs}from"fs/promises";import{existsSync as xe,mkdtempSync as ns,readFileSync as ss,rmSync as os,writeFileSync as is}from"fs";import{homedir as as,tmpdir as Gt}from"os";import{dirname as tr,join as D}from"path";import{fileURLToPath as us}from"url";var zn=/^[A-Za-z0-9_-]{1,64}$/,Wn=new Set(["mcp_list","mcp_get","mcp_call"]);function et(r,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${r}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!zn.test(e.exposedName))throw new Error(`MCP tool "${r}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Wn.has(e.exposedName))throw new Error(`MCP tool "${r}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function tt(r,e){let t={};for(let n of e)et(r,n),(n.exposedName!==void 0||n.alwaysLoad===!0)&&(t[n.name]={...n.exposedName!==void 0?{exposedName:n.exposedName}:{},...n.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function rt(r,e,t=e.tools??[]){let{tools:n,...s}=e,o=tt(r,t);return{...s,...o?{toolOverrides:o}:{}}}function $t(r){let e={};for(let[t,n]of Object.entries(r)){if(n.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let s=n.tools??[],o=s.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=rt(t,n,s)}return e}var Hn="global",Gn=Hn==="cn",w=Gn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Qt=w.accessTokenEnv,Me=w.serviceAccountEnv;function Jn(r){return{type:"accessToken",accessToken:r}}function Vn(r=Qt){return{type:"accessToken",accessToken:{envVar:r}}}function Yn(){return{type:"qodercli"}}function Xn(r){let e=r.serviceAccountKey!==void 0,t=typeof r.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...r}}function Zn(r=Me){return{type:"serviceAccount",serviceAccountKey:{envVar:r}}}function es(r){return{type:"jobToken",fetchJobToken:r}}var Bt=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function zt(r){if(r===null||typeof r!="object"||Array.isArray(r))throw new TypeError("securityScan must be an object.");let e=new Set(Bt),t=Object.keys(r).filter(n=>!e.has(n));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let n of Bt){let s=r[n];if(s!==void 0&&typeof s!="boolean")throw new TypeError(`securityScan.${n} must be a boolean.`)}return{l1StaticCheck:r.l1StaticCheck??!1,l2LightweightScan:r.l2LightweightScan??!1,l3DeepScan:r.l3DeepScan??!1}}var Jt="QODER_AGENT_SDK_ENTRYPOINT",Vt="QODER_AGENT_SDK_VERSION",Yt="QODER_SDK_AUTH_PAYLOAD_FILE",cs="sdk-ts",ds=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],ls=us(import.meta.url),Xt=tr(ls),Ce=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},Ae=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function rr(r){return/\.(js|mjs|tsx?|jsx)$/.test(r)}function X(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let r=ps();if(r)return r;let e=ms();if(xe(e))return e;let t=fs();return t||w.cliCommands[0]}function ps(){for(let r of nr())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,n=D(r,"dist","_bundled",t);if(xe(n))return n}return null}function ms(){for(let r of nr())for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,n=[D(r,"node_modules",".bin",t),D(r,"..","..",".bin",t)];for(let s of n)if(xe(s))return s}return w.cliCommands[0]}function fs(){let r=process.env[w.cliHomeEnv]??as();for(let e of w.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,n=D(r,w.configDirName,"local",t);if(xe(n))return n}return null}function nr(){let r=[D(Xt,".."),D(Xt,"..","..")];return[...new Set(r)]}function gs(){return{allow:[],ask:[],deny:[]}}function Zt(r){return r.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function hs(r,e){if(e.startsWith("mcp__"))return e;let t=Zt(r),n=e==="*"?"*":Zt(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${r}" and tool "${e}"`);return`mcp__${t}__${n}`}function er(r,e){if(e.length===0)return;let t=new Set(r);for(let n of e)t.has(n)||(r.push(n),t.add(n))}function ys(r){let e=r??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},n=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...n,enabled:!0}}}}var Y=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,n="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=n}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{os(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=tr(this.authPayloadPath);try{await Ht(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[n,s]of Object.entries(e))s!==void 0&&(t[n]=s);delete t[Jt],delete t[Vt],delete t[Yt];for(let n of this.serviceAccountCredentialEnvVars())Ss(t,n);if(t[Jt]=cs,t[Vt]=qt,this.authPayloadPath&&(t[Yt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of ds)t[n]=this.options.proxy;return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Me];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let n=t.tools??Lt(t.env??process.env);if(Array.isArray(n)?e.push("--tools",n.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let s=this.buildSettingsArg();if(s!==void 0&&e.push("--settings",s),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let n={...e??{}};this.applySettingsCompatibility(n),this.applyAdditionalDirectories(n),this.applyMcpPolicyRules(n,t),this.applySecurityScanSetting(n);let s=this.applyFileCheckpointingSetting(n);return Object.keys(s).length>0?JSON.stringify(s):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?ys(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=zt(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let n=e.general!==null&&typeof e.general=="object"?e.general:{},s=this.toQoderDefaultPermissionMode(t.defaultMode);s!==void 0&&n.defaultPermissionMode===void 0&&(n.defaultPermissionMode=s),e.general=n}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},s=Array.isArray(n.additionalDirectories)?[...n.additionalDirectories]:[];er(s,t),n.additionalDirectories=s,e.permissions=n}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[n,s]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[n]??s.tools??[];t[n]=rt(n,s,o)}return t}collectMcpPolicyPermissionRules(){let e=gs(),t=new Map;for(let[n,s]of Object.entries(this.options.mcpToolPolicies??{}))s.length>0&&t.set(n,s);for(let[n,s]of Object.entries(this.options.mcpServers??{})){let o=s.tools;Array.isArray(o)&&o.length>0&&t.set(n,[...t.get(n)??[],...o])}for(let[n,s]of t)for(let o of s){let i=hs(n,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let n=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=n;for(let s of["allow","ask","deny"]){let o=Array.isArray(n[s])?[...n[s]]:[];er(o,t[s]),n[s]=o}}readSettingsFile(e){let t=ss(e,"utf8").trim();if(!t)return{};let n=JSON.parse(t);if(n===null||typeof n!="object"||Array.isArray(n))throw new Error("Settings file must contain a JSON object.");return n}writeGeneratedSettingsFile(e){this.generatedSettingsDir=ns(D(Gt(),"qoder-agent-sdk-settings-"));let t=D(this.generatedSettingsDir,"settings.json");return is(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await ts(D(Gt(),"qoder-sdk-auth-"));try{await Wt(n,448);let s=D(n,"payload.json");return await rs(s,JSON.stringify(t),{mode:384}),await Wt(s,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${s}`),s}catch(s){throw await Ht(n,{recursive:!0,force:!0}).catch(()=>{}),s}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,n=typeof e.fetchServiceAccountToken=="function";if(t===n)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return n?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,n=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!n)throw new Ae(t);return n}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,n=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!n)throw new Ce(t);return n}};function Ss(r,e){if(process.platform!=="win32"){delete r[e];return}let t=e.toLowerCase();for(let n of Object.keys(r))n.toLowerCase()===t&&delete r[n]}function Ie(r,e){let t={...r};for(let[n,s]of Object.entries(e))s!==void 0&&(t[n]=s);return t}var sr=8192,Z=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},ee=class r{static default=new r;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new r(Ie(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let n=e.env,{command:s,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${s} ${o.join(" ")}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:s,args:o,cwd:this.options.cwd,env:n,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,u)=>{this.ready=!1,a===L&&this.fireAuthExpired();let c=this.createProcessExitError(a,u);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})})}else this.process=ws(s,o,{cwd:this.options.cwd,env:n,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===L&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
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.26";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(`
|
|
2
2
|
`)?e:e+`
|
|
3
|
-
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=vs({input:e,crlfDelay:1/0});try{for await(let n of t){if(this.closed)break;let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}this.closed||await this.waitForProcessExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let n=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!n)return;let s=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??_e,i=setTimeout(()=>{if(s()){n("SIGTERM");let a=setTimeout(()=>{s()&&n("SIGKILL")},Ut);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>sr&&(this.stderrTail=this.stderrTail.slice(-sr))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",s=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new Z(s,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==L){if(e!==0&&e!==null)return new Z(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new Z(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,n)=>{let s=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,n(u)):t()},o=i=>{e.off("exit",s);let a=this.createSpawnError(i);this.processExitError=a,n(a)};e.once("exit",s),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??X();if(rr(t)){let n=this.options.executable??"node",s=this.options.executableArgs??[];return{command:n,commandArgs:[...s,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function ks(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ge=ks();function or(r){return typeof r=="object"&&r!==null&&typeof r.create=="function"}function Oe(r,e){return r.create(e)}import{existsSync as Ws}from"fs";import{createInterface as Hs}from"readline";import{Worker as Gs}from"worker_threads";import{createHash as bs}from"node:crypto";import{existsSync as Rs}from"node:fs";import{chmod as Ts,lstat as Ps,mkdir as he,readFile as ir,readdir as Es,readlink as _s,rename as Ms,rm as De,stat as Cs,symlink as As,writeFile as ar}from"node:fs/promises";import{tmpdir as xs,userInfo as Is}from"node:os";import{basename as ur,dirname as te,join as j,relative as Os}from"node:path";var Ds="QODER_WORKER_RUNTIME_ASSET_ROOT",cr=/(^|[\\/])app\.asar([\\/]|$)/,st=".qoder-worker-runtime-ready";function dr(r){return cr.test(r)}function ot(r){return dr(r)?r.replace(cr,(e,t,n)=>`${t}app.asar.unpacked${n}`):null}async function je(r,e={}){let t=ot(r);if(!e.forceMaterialize&&t){let u=te(t);if(Rs(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),nt(t,u,!1,te(r))}if(!(e.forceMaterialize||dr(r))){let u=te(r);return nt(r,u,!1)}let s=te(r),o=await js(s,r,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=Os(s,r)||ur(r),a=j(o,i);return nt(a,o,!0,s)}function nt(r,e,t,n){return{runtimePath:r,runtimeRoot:e,materialized:t,sourceRuntimeRoot:n,env:{[Ds]:e}}}async function js(r,e,t){let n=await Ns(r,e),s=t.cacheDir??Us(),o=j(s,n),i=j(o,st);if(await pr(i)===n)return o;let a=j(s,`.setup-${n}-${process.pid}-${Date.now()}`);await he(s,{recursive:!0,mode:448}),await De(a,{recursive:!0,force:!0}),await De(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${r} -> ${o}`);try{return await he(a,{recursive:!0,mode:448}),await lr(r,a),await ar(j(a,st),n,{mode:384}),await Fs(a,o,n),o}catch(u){throw await De(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Ns(r,e){let t=bs("sha256");t.update("qoder-worker-runtime-v1\0");let n=await mr(j(r,"runtime-info.json"));if(n)t.update(n);else{t.update(e);let s=await Cs(e).catch(()=>null);s&&t.update(`${s.size}\0${s.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function lr(r,e){let t=await Es(r,{withFileTypes:!0});await he(e,{recursive:!0,mode:448});for(let n of t){let s=j(r,n.name),o=j(e,n.name);if(n.isDirectory()){await lr(s,o);continue}if(n.isSymbolicLink()){await he(te(o),{recursive:!0,mode:448}),await As(await _s(s),o);continue}if(!n.isFile())continue;let i=await Ks(s);await he(te(o),{recursive:!0,mode:448}),await ar(o,await ir(s),{mode:i}),process.platform!=="win32"&&await Ts(o,i)}}async function Ks(r){let e=((await Ps(r)).mode||420)&511;if(process.platform==="win32")return e||420;let t=ur(r);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Fs(r,e,t){try{await Ms(r,e)}catch(n){if(await pr(j(e,st))===t){await De(r,{recursive:!0,force:!0});return}throw n}}async function pr(r){let e=await mr(r);return e?e.toString("utf8"):null}async function mr(r){try{return await ir(r)}catch{return null}}function Us(){let r=qs(Is().username||process.env.USER||process.env.USERNAME||"user");return j(xs(),`qoder-sdk-worker-runtime-${r}`)}function qs(r){return r.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Ls="QODER_WORKER_CWD";function Ne(r,e){return{env:{...e.env,[Ls]:e.cwd,...r.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:r.runtimeRoot,materialized:r.materialized}}}}import{existsSync as it}from"node:fs";import{dirname as $s,join as $}from"node:path";import{fileURLToPath as Qs}from"node:url";var Bs=Qs(import.meta.url),at=$s(Bs);function re(r){if(r)return r;let e=[];for(let t of zs())e.push($(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),$(t,"dist","_worker","qoder-worker-runtime.mjs"),$(t,"_worker","qoder-worker-runtime.obf.mjs"),$(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(it(t))return t;return e[0]??$(at,"..","_worker","qoder-worker-runtime.obf.mjs")}function fr(r){let e=re(r);if(it(e))return!0;let t=ot(e);return t!==null&&it(t)}function zs(){let r=[$(at,".."),$(at,"..","..")];return[...new Set(r)]}var gr=8192,Js=new Set(["--mcp-config","--settings"]),Q=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},ne=class r{static default=new r;options;constructor(e={}){this.options={...e}}create(e){return new ut(Ie(this.options,e))}},ut=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new Y(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=re(this.options.pathToQoderWorkerRuntime),n;try{n=await je(t,{diagnostics:this.diagnostics})}catch(a){throw new Q(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let s=n.runtimePath;if(!Ws(s))throw new Q(`Qoder worker runtime not found: ${s}`);let o=this.options.cwd??process.cwd(),i=Ne(n,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${s}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${Vs(e.args)}`),this.worker=new Gs(s,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===L&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
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
4
|
`)?e:e+`
|
|
5
|
-
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=
|
|
5
|
+
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=eo({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.waitForWorkerExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??_e;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>bn&&(this.stderrTail=this.stderrTail.slice(-bn))}createWorkerError(e){return new $(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===q))return new $(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,r)=>{let s=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,r(a)):t()},o=i=>{if(e.off("exit",s),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,r(a)};e.once("exit",s),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};var Fe=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 no,mkdirSync as ro}from"fs";import{dirname as so}from"path";var oo="QODER_AGENT_SDK_DEBUG";function io(n){return n.debugFile?!0:n.debug===!0||uo(process.env[oo])}function ao(n){if(n.debugFile)return n.debugFile}function uo(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var Ue=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=io(e),this.debugFile=ao(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let r=this.formatLine(e,t),s=this.debugFile;if(s){this.writeToFile(s,r);return}this.writeToStderr(r)}get filePath(){return this.debugFile}writeToFile(e,t){try{ro(so(e),{recursive:!0}),no(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let r=new Date().toISOString(),s=this.formatError(t);return`${r} ${e}${s}
|
|
6
6
|
`}formatError(e){if(e===void 0)return"";if(e instanceof Error)return`
|
|
7
|
-
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var se=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var A=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},ye=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},Se=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},we=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var ct="1.2.0";function hr(r,e,t,n){return new Promise((s,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){o(u);return}s({jsonrpc:"2.0"});return}let a=`${r}:${e.id}`;n.set(a,{resolve:s,reject:o}),t.onmessage?t.onmessage(e):(n.delete(a),o(new Error(`No message handler registered for MCP server "${r}"`)))})}function yr(r,e,t){if("id"in e&&e.id!==null){let n=`${r}:${e.id}`,s=t.get(n);if(s)return s.resolve(e),t.delete(n),!0}return!1}function Sr(r,e,t){let n=0,s=`${r}:`,o=Array.from(t.entries());for(let i of o){let[a,u]=i;a.startsWith(s)&&(u.reject(e),t.delete(a),n++)}return n}import{randomUUID as so}from"crypto";function kr(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var oo=500,io=1024*1024,ao=6e4,uo=[200,800],Ue=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=co(e.filePath),n=lo(e.entries),s=vr(t),o=this.states.get(s);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(s,o)),o.entries.push(...n),o.bytes+=mo(n),(this.options.flushMode==="eager"||o.entries.length>=oo||o.bytes>=io)&&this.drain(o)}async flush(){for(let e of this.states.values())this.drain(e);await Promise.all([...this.states.values()].map(e=>e.tail))}drain(e){if(e.entries.length===0)return;let t=e.entries;e.entries=[],e.bytes=0,e.tail=e.tail.then(async()=>{try{await fo(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??ao,retryDelaysMs:this.options.retryDelaysMs??uo})}catch(n){this.options.diagnostics?.record(`[SessionStore] append failed for ${vr(e.key)}`,n),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:n instanceof Error?n.message:String(n),key:{...e.key},uuid:so(),session_id:e.key.sessionId})}})}};function co(r){let e=r.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),n=e.slice(t+1);if(t<0||n.length<2)throw new Error(`Invalid transcript mirror path: ${r}`);let s=n[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(n[1]);if(n.length===2&&o)return{projectKey:s,sessionId:wr(o[1])};let i=wr(n[1]),a=n.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return po(c),{projectKey:s,sessionId:i,subpath:c}}function lo(r){return r.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function wr(r){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(r))throw new Error(`Invalid transcript session id: ${r}`);return r}function po(r){let e=r.split("/");if(!r||r.includes("\0")||/^[a-z]:/i.test(r)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${r}`)}function vr(r){return JSON.stringify([r.projectKey,r.sessionId,r.subpath??null])}function mo(r){return r.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function fo(r,e,t,n){for(let s=0;;s++)try{await go(r.append({...e},structuredClone(t)),n.appendTimeoutMs);return}catch(o){if(o instanceof qe)throw o;let i=n.retryDelaysMs[s];if(i===void 0)throw o;await new Promise(a=>setTimeout(a,i))}}async function go(r,e){let t;r.catch(()=>{});try{await Promise.race([r,new Promise((n,s)=>{t=setTimeout(()=>s(new qe(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var qe=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function br(){return Math.random().toString(36).substring(2,15)}function Rr(r,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:r,request:t}}function Tr(r,e){return{type:"control_response",response:{subtype:"success",request_id:r,response:e}}}function Pr(r,e,t){return{type:"control_response",response:{subtype:"error",request_id:r,error:e,...t?{code:t}:{}}}}function Er(r){return typeof r=="object"&&r!==null&&r.type==="control_response"}function _r(r){return typeof r=="object"&&r!==null&&r.type==="control_request"}function Mr(r){return typeof r=="object"&&r!==null&&(r.type==="control_cancel_request"||r.type==="control_cancel")}function oe(r){if(typeof r!="object"||r===null)return;let e=r,t=e.subtype;if(typeof t=="string")return t;let n=e.type;return typeof n=="string"?n:void 0}function Cr(r){if(typeof r!="object"||r===null)return!1;let e=r.type;return e==="keepalive"||e==="keep_alive"}function Ar(r){return typeof r=="object"&&r!==null&&r.type==="streamlined_text"}function xr(r){return typeof r=="object"&&r!==null&&r.type==="streamlined_tool_use_summary"}function Ir(r){return typeof r=="object"&&r!==null&&r.type==="post_turn_summary"}function Or(r){return typeof r=="object"&&r!==null&&r.type==="result"}var ho="<synthetic>";function yo(r){return r.type!=="assistant"||r.isApiErrorMessage===!0||r.message.model!==ho?r:{...r,isApiErrorMessage:!0}}var $e=class r{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;initResponse;initializationPromise;resultMessage;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;memoryEndInputPromise;closePromise;constructor(e,t,n,s,o,i,a,u,c,p,f,d,l,m,S,g,h,k="batched",y,T,P){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=n,this.hooks=s??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=d??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=y??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=p,this.fetchJobToken=m,this.fetchServiceAccountToken=T,this.diagnostics=c,this.controlRequestTimeoutMs=f??6e4,this.resolveModel=S,this.resolveModelTimeoutMs=g??500,this.memoryCallbacks=P,this.inputStream=new se(()=>{this.close().catch(()=>{})}),h&&(this.transcriptMirrorBatcher=new Ue({store:h,flushMode:k,diagnostics:c,onMirrorError:C=>this.inputStream.enqueue(C)})),this.readLoopPromise=this.readMessages().catch(C=>{this.inputStream.error(C)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let C=this.abortController.signal;C.aborted?this.close().catch(()=>{}):C.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let n=e.replace(/\s+/g," ").trim();return n.length>200?`${n.slice(0,200)}...`:n}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let n=t.text;if(typeof n=="string")return this.normalizeLogPreview(n);let s=this.extractMessagePreview(t.content);if(s)return s;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let n=this.getRecord(e)?.type;return typeof n=="string"&&n?n:"unknown"}getMessageSubtype(e){let n=this.getRecord(e)?.subtype;return typeof n=="string"&&n?n:"none"}getMessageUuid(e){let n=this.getRecord(e)?.uuid;return typeof n=="string"&&n?n:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,s=this.getRecord(t)?.content,o=Array.isArray(s)?s.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(kr(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(s){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",s)}continue}if(Er(t)){this.handleControlResponse(t);continue}if(_r(t)){this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",s)});continue}if(Mr(t)){this.handleControlCancelRequest(t);continue}if(Cr(t)||Ar(t)||xr(t)||Ir(t))continue;if(Or(t)){await this.transcriptMirrorBatcher?.flush();let s=t;this.recordInboundSessionMessage(s),this.resultMessage=s,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(s),this.isSingleTurn&&this.flushMemoryBeforeEndInput();continue}let n=yo(t);if(this.recordInboundSessionMessage(n),n.type==="system"&&n.subtype==="init")try{let s=n;this.validateProtocolHandshake(s),this.cliCapabilities=new Set(s.capabilities??[])}catch(s){throw this.inputStream.error(s),s}this.dispatchMemoryCallbacks(n),this.notifyAuthExpiredIfNeeded(n),this.inputStream.enqueue(n)}}catch(t){e=t}finally{await this.transcriptMirrorBatcher?.flush();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,n]of this.pendingRequests)n.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let n=e.type==="auth_status"&&!!e.error,s=e.type==="assistant"&&e.error==="authentication_failed";!n&&!s||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(n=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",n)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}flushMemoryBeforeEndInput(){return this.memoryEndInputPromise||(this.memoryEndInputPromise=this.performFlushMemoryBeforeEndInput()),this.memoryEndInputPromise}async performFlushMemoryBeforeEndInput(){try{this.initConfig.memory!==void 0&&await this.flushMemory()}catch(e){this.diagnostics?.record("[QueryRunner] memory flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new A;let n=br(),s=Rr(n,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=oe(s.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let p=null,f=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:n})+`
|
|
8
|
-
`)}catch(
|
|
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.flushMemoryBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(n=>typeof n=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new we(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(r.SIDE_QUESTION_CAPABILITY);let n=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(s=>({...s}))}:{}},{timeoutMs:0,signal:t?.signal});return n?.response==null?null:{response:n.response,synthetic:n.synthetic??!1,...n.refusal_fallback?{refusalFallback:{originalModel:n.refusal_fallback.original_model,fallbackModel:n.refusal_fallback.fallback_model,content:n.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=ko(e?.usage),n=vo(e?.session);return!t&&!n?null:{...t??{},...n?{session:n}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let n={type:"rewind_files",user_message_id:e};t?.dryRun&&(n.dry_run=!0);let o=await this.request(n);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let s={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(s.dry_run=!0),await this.request(s)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=$t(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let n=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),s=n?.requiresUserAction===!0,o=typeof n?.authUrl=="string"?n.authUrl:void 0;if(s&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return s?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if(this.initConfig.memory!==void 0&&this.initResponse?.memory?.enabled===!0&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.memoryEndInputPromise??this.flushMemory())}catch(t){this.diagnostics?.record("[QueryRunner] memory flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,n]of this.sdkMcpTransports){try{await n.close()}catch(s){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,s)}Sr(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function B(r){return typeof r=="object"&&r!==null}function dt(r){return typeof r=="number"&&Number.isFinite(r)}function lt(r){return Object.keys(r).length>0}function N(r,e,t){let n=e[t];dt(n)&&(r[t]=n)}function ie(r,e,t){let n=e[t];typeof n=="string"&&(r[t]=n)}function Le(r,e,t){let n=e[t];typeof n=="boolean"&&(r[t]=n)}function jr(r){if(!B(r)||Array.isArray(r))return;let e={};return N(e,r,"total"),N(e,r,"used"),N(e,r,"remaining"),N(e,r,"percentage"),ie(e,r,"unit"),lt(e)?e:void 0}function So(r){if(!B(r)||Array.isArray(r))return;let e=jr(r)??{};return ie(e,r,"detailUrl"),lt(e)?e:void 0}function wo(r){if(!B(r)||Array.isArray(r))return;let e={};return N(e,r,"used"),N(e,r,"cap"),N(e,r,"remaining"),N(e,r,"percentage"),Le(e,r,"available"),ie(e,r,"unit"),lt(e)?e:void 0}function vo(r){if(!B(r)||Array.isArray(r))return;let e=r.total_credits,t=r.model_usage;if(!dt(e)||e<0||!B(t)||Array.isArray(t))return;let n={};for(let[s,o]of Object.entries(t)){if(!B(o)||Array.isArray(o))continue;let i=o.credits;dt(i)&&i>=0&&(n[s]={credits:i})}return{total_credits:e,model_usage:n}}function ko(r){if(!B(r)||Array.isArray(r))return null;let e={};ie(e,r,"userId"),ie(e,r,"userType"),N(e,r,"totalUsagePercentage"),Le(e,r,"isHighestTier"),N(e,r,"expiresAt"),ie(e,r,"upgradeUrl"),Le(e,r,"isQuotaExceeded"),Le(e,r,"isPlanQuotaProrated");let t=jr(r.userQuota);t&&(e.userQuota=t);let n=So(r.addOnQuota);n&&(e.addOnQuota=n);let s=wo(r.orgResourcePackage);return s&&(e.orgResourcePackage=s),e}function bo(r){let e=r instanceof Error?r.message:String(r),t=typeof r=="object"&&r!==null?r.code:void 0,n=typeof t=="string"&&t.length>0?t:void 0,s=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(s){let o=n??s[1];return(!n||n===s[1])&&(e=s[2]||e),{error:e,code:o}}return n?{error:e,code:n}:{error:e}}function Dr(r){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(r);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Qe=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Nr}from"crypto";var Ro="QODER_CLOUD_AGENT_API_BASE",To="https://api.qoder.com/api/v1/cloud",K={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Po=1024,Kr=1*1024*1024,Fr=4*1024*1024,Eo=8*1024,mt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},Be=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},ft=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},_o=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function $r(r){if(!r.experimentalCloudAgent)return;let e=Object.keys(r).filter(o=>r[o]!==void 0&&!_o.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(r.auth?.type!=="accessToken")throw new Be;let{agent:t,session:n}=r.experimentalCloudAgent;if(t&&ae(t)&&pt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&ae(n)&&pt(n))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(n&&ae(n)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let s=!!n&&ae(n);if(!s&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!s){if(!n||!pt(n))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof n.create.environment_id!="string"||n.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function ae(r){return"id"in r&&r.id!==void 0}function pt(r){return"create"in r&&r.create!==void 0}function Qr(r){return new gt(r)}var gt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=$o();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Lr();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=Mo(e.options.auth,e.options.env),this.apiBase=Co(),this.inputStream=new se(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(n=>{this.sseConnected.reject(n),this.closed||this.inputStream.error(n)}),this.streamInput(qo(e.prompt)).catch(n=>{this.closed||this.inputStream.error(n)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let n=Uo(t);this.beginPendingTurn();let s=await this.postSessionEvents([{type:K.userMessage,content:n}]);this.postedMessages+=1,this.activateTurn(s.find(o=>o.type===K.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:K.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&ae(e))t=e.id;else{let n=await this.resolveAgentId(),s=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:n,...xo(s)}});t=Ur(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(ae(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Ao(e.create)});return Ur(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let n=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==n&&(t=0),t+=1,await Lo(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),n=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;n&&t.searchParams.set("after_id",n),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let s=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await qr(s);if(!s.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(s.body)}async readSseBody(e){let t=e.getReader(),n=new TextDecoder,s="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){s+=n.decode(),s.length>0&&this.consumeSseLine(s,o);break}s+=n.decode(a,{stream:!0});let u;for(;(u=s.indexOf(`
|
|
13
|
-
`))!==-1;){let c=s.slice(0,u);s=s.slice(u+1);let
|
|
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 en(r,e){await Yr(ni(r),{recursive:!0,mode:448}),await ei(r,e,{encoding:"utf8",mode:384}),await Vr(r,384)}async function St(r,e,t){let n;r.catch(()=>{});try{return await Promise.race([r,new Promise((s,o)=>{n=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{n!==void 0&&clearTimeout(n)}}var gi=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function hi(r){let e=r.replace(/\\/g,"/").split("/").at(-1)??"";return gi.test(e)}function We(r,e,t=process.env){let n=r.pathToQoderCLIExecutable;return n?hi(n)?{transport:"worker",pathToQoderWorkerRuntime:n}:{transport:"process"}:r.executable!==void 0||r.executableArgs!==void 0||r.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}import tn from"node:path";function ce(r,e){if(typeof r!="string"||r.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function ke(r,e){if(r!==void 0&&typeof r!="function")throw new TypeError(`${e} must be a function`)}function yi(r){if(r===void 0)return;if(!Array.isArray(r)||r.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,n]of r.entries()){if(!n||typeof n!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(ce(n.id,`options.memory.generation.roots[${t}].id`),ce(n.path,`options.memory.generation.roots[${t}].path`),e.has(n.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${n.id}"`);if(e.add(n.id),n.access!==void 0&&n.access!=="read"&&n.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(n.indexFile!==void 0){ce(n.indexFile,`options.memory.generation.roots[${t}].indexFile`);let s=n.indexFile.replaceAll("\\","/");if(tn.posix.isAbsolute(s)||tn.win32.isAbsolute(n.indexFile)||s.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Si(r){if(r===void 0)return;if(!Array.isArray(r)||r.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,n]of r.entries()){if(!n||typeof n!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(ce(n.id,`options.memory.consumption.files[${t}].id`),ce(n.path,`options.memory.consumption.files[${t}].path`),e.has(n.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${n.id}"`);if(e.add(n.id),n.required!==void 0&&typeof n.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function rn(r){if(r===void 0)return{};if(!r||typeof r!="object")throw new TypeError("options.memory must be an object");if(r.mode!=="native"&&r.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');let e=new Map;if(r.mode==="native"){let i=Object.keys(r.generation??{}),a=Object.keys(r.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return ke(r.generation?.onResult,"options.memory.generation.onResult"),ke(r.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native"},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:r.generation?.onResult,onConsumptionResult:r.consumption?.onResult}}}let t,n=r.generation;if(n!==void 0){if(!n||typeof n!="object")throw new TypeError("options.memory.generation must be an object");if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");yi(n.roots),n.prompt!==void 0&&ce(n.prompt,"options.memory.generation.prompt"),ke(n.onResult,"options.memory.generation.onResult");let i;if(n.turnComplete!==void 0){let a=n.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if(ke(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(n.turnComplete?.enabled===!0&&n.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:n.enabled??!0,roots:n.roots?.map(a=>({...a})),prompt:n.prompt,turnComplete:i}}let s,o=r.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Si(o.files),o.maxTokens!==void 0&&(!Number.isInteger(o.maxTokens)||o.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(o.overflow!==void 0&&o.overflow!=="truncate"&&o.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(o.failureMode!==void 0&&o.failureMode!=="best_effort"&&o.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');ke(o.onResult,"options.memory.consumption.onResult"),s={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:r.mode,generation:t,consumption:s},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n?.onResult,onConsumptionResult:o?.onResult}}}var wt=class extends Error{code="auth_not_configured";constructor(){super("The auth option is required when calling query(); configure options.auth so the SDK can create an auth payload file before spawning qodercli."),this.name="AuthNotConfiguredError"}};function wi(r){if(r.transport!==void 0){if(or(r.transport))return r.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let e=We(r,ge);return e.transport==="worker"?new ne({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):ee.default}function vt(r){let{prompt:e,options:t={}}=r,n=wi(t),s=new Fe({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");let o=t.auth;if(o==null)throw new wt;if(t.sessionStore&&t.enableFileCheckpointing)throw new Error("sessionStore cannot be combined with enableFileCheckpointing because checkpoint blobs are not part of the SessionStore contract.");if(t.sessionStore&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${w.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(t.sessionStore&&!(n instanceof ee)&&!(n instanceof ne))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(t.sessionStore&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(t.sessionStore&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(t.sessionStore&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return $r(t),Qr({prompt:e,options:t,diagnostics:s});let i=rn(t.memory),a=!!t.resolveModel,u=t.onAuthExpired,c=!1,p=u?()=>{c||(c=!0,Promise.resolve(u()).catch(v=>{s.record("[query] onAuthExpired callback threw:",v)}))}:void 0,f=new Map,d=new Map,l=new Map,m={},S={},g={};if(t.mcpServers)for(let[v,O]of Object.entries(t.mcpServers)){let q=O.tools;if(Array.isArray(q)&&q.length>0&&(S[v]=q),O.type==="sdk"&&"instance"in O&&O.instance){let V=O.instance;if(f.set(v,V),q){let Ee=tt(v,q);Ee&&(g[v]=Ee)}let Nt=new Qe(Ee=>{yr(v,Ee,l)});d.set(v,Nt),V.connect(Nt).catch(()=>{})}else m[v]=O}let h=Object.keys(m).length>0,k=Object.keys(S).length>0,y=t.pathToQoderCLIExecutable,T=t.env,P=o?.type==="jobToken"?o.fetchJobToken:void 0,C=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,b={pathToQoderCLIExecutable:y,executable:t.executable,executableArgs:t.executableArgs,env:T,proxy:t.proxy,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:o,model:a?void 0:t.model,agent:t.agent,debug:t.debug,diagnostics:s,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:t.sessionStore!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let v=t.allowedTools??[];if(t.skills===void 0)return v.length>0?v:void 0;let O=t.skills==="all"?["Skill"]:t.skills.map(V=>`Skill(${V})`),q=new Set(v);return[...v,...O.filter(V=>!q.has(V))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:h?m:void 0,mcpToolPolicies:k?S:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,securityScan:t.securityScan,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:p},fe=t.sessionStore!==void 0&&(t.resume!==void 0||t.continue===!0)?new Ke(async()=>{let v=await Zr({store:t.sessionStore,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!v)return{transport:Oe(n,{...b,continue:!1})};try{return{transport:Oe(n,{...b,env:{...b.env??process.env,[w.configDirEnv]:v.configDir},continue:!1,resume:v.sessionId}),cleanup:v.cleanup}}catch(O){throw await v.cleanup(),O}}):Oe(n,b);fe.initialize().catch(()=>{});let Fn=typeof e=="string",J=t.systemPrompt,Dt,jt;if(typeof J=="string")Dt=J;else if(typeof J=="object"&&J!==null&&J.type==="preset"){let v=J;if(v.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(v.preset)}`);jt=v.append}let Un={systemPrompt:Dt,appendSystemPrompt:jt,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing,memory:i.config,customContext:t.customContext},Ze=new $e(fe,Fn,t.canUseTool,t.hooks,t.abortController,f,Un,t.onElicitation,s,p,t.controlRequestTimeoutMs,d,l,P,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",g,C,i.callbacks);if(typeof e=="string"){let v={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Ze.streamInput(async function*(){yield v}())}else Ze.streamInput(e);return Ze}var kt=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},bt=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function vi(r={}){let e=r.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(r.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new kt,n=vt({prompt:t,options:r.options}),s;try{return await Promise.race([n.initializationResult(),new Promise((o,i)=>{s=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new bt(n,t)}catch(o){throw t.discard(),await n.close(),o}finally{s!==void 0&&clearTimeout(s)}}import{readFile as ki}from"node:fs/promises";import bi from"node:os";import I from"node:path";var Ri=["user","project","local"],Pt=new Set(["__proto__","constructor","prototype"]),Ti=/^[\p{L}\p{N}\p{M}._ -]+$/u,Pi=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Ei=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),_i=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Mi=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function W(r){if(r===null||typeof r!="object"||Array.isArray(r))return!1;let e=Object.getPrototypeOf(r);return e===Object.prototype||e===null}function Ci(r){let e=r.charCodeAt(0)===65279?r.slice(1):r,t="",n=!1,s=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
|
|
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(r)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${r} subtype=${i}`),m(),c(new M))};this.pendingRequests.set(r,{resolve:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(g)},reject:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${r} 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(r)&&(this.pendingRequests.delete(r),p(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${r} subtype=${i} timeout_ms=${o}`),m(),c(new Error(`Control request "${ie(s.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${r} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(s)+`
|
|
9
|
+
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${r} subtype=${i}`)}catch(g){p(),this.pendingRequests.delete(r),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${r} subtype=${i}`,g),c(g)}})}handleControlResponse(e){let t=e.response,r=t.request_id,s=this.pendingRequests.get(r);if(!s){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${r} status=${t.subtype}`);return}if(this.pendingRequests.delete(r),t.subtype==="success")s.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),s.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)ie(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",r)})}async handleControlRequest(e){let t=e.request_id,r=ie(e.request)??"unknown",s=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${r}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=xn(t,i);this.transport.write(JSON.stringify(a)+`
|
|
10
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=success duration_ms=${Date.now()-s}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=_o(i),c=In(t,a,u);this.transport.write(JSON.stringify(c)+`
|
|
11
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${r} status=error duration_ms=${Date.now()-s}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new M}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,r=mt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${r}. Consider upgrading qodercli for the version handshake.`);return}let s=Ln(t),o=Ln(r);if(!s||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${r}"; skipping handshake.`);return}if(s.major!==o.major)throw new ve(t,r);s.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${r}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new M;return new Promise((r,s)=>{let o=()=>{s(new M)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),r(i)},i=>{t.removeEventListener("abort",o),s(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let r=e.request,s=ie(r),o=r;switch(s){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,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(Rn(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 Se(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: ${s??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[s,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let 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[s]=i)}Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.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 r=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(r&&typeof r=="object"){let s=r;this.initResponse=s,this.cliCapabilities=new Set(s.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 Q(n.PLAN_MODE_CAPABILITY);let s={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(s)}return this.initResponse}async invokeRegisteredHookCallback(e,t,r,s){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,r,{signal:s}),s)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let r of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(r,"custom_context")?r.custom_context:this.initConfig.customContext,i=o===void 0?r:{...r,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(i)+`
|
|
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=s.slice(0,u);s=s.slice(u+1);let d=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(d,o),this.closed)break}s.length>Gn&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Gn} bytes; resetting buffer.`),s="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:Uo(t.data.join(`
|
|
14
|
+
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let r=e.indexOf(":"),s=r===-1?e:e.slice(0,r),o=r===-1?"":e.slice(r+1);switch(o.startsWith(" ")&&(o=o.slice(1)),s){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>Bn){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Bn} 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=A(e.data,"type")??e.event,r=A(e.data,"turn_id"),s={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Qn(),session_id:this.sessionId??A(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(s),!this.isCurrentTurnEvent(r)){this.bufferPendingTurnEvent(e,t,r);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case N.agentMessage:{let r=Lo(we(e.data,"content"));r&&this.assistantTextParts.push(r);return}case N.modelRequestEnd:this.captureUsage(e.data);return;case N.idle:this.idleSeen=!0,this.finishIfIdle();return;case N.error:this.emitErrorResult(e),this.finish();return;case N.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Hn(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let r of t)if(this.isCurrentTurnEvent(r.turnId)&&this.handleCurrentTurnEvent(r.event,r.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,r){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Ao&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:r}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(A(e.data,"error")??A(ze(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:Qn(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,r=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return Ko(r)}captureUsage(e){let t=ze(e,"usage");if(!t)return;this.latestUsage=$o(this.latestUsage,t);let r=_(e,"total_cost_usd")??_(e,"cost_usd")??_(t,"total_cost_usd")??_(t,"cost_usd");r!==void 0&&(this.totalCostUsd+=r);let s=A(e,"model")??A(t,"model");if(s){let o=this.latestModelUsage[s]?.costUSD??0;this.latestModelUsage[s]=Qo(this.latestUsage,o+(r??0))}}async requestJson(e,t){let r=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await Wn(r);if(r.status===204)return{};try{return await r.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Oo(n,e){if(n?.type!=="accessToken")throw new Be;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,r=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!r)throw new yt(t);return r}function Do(){return process.env[Co]?.replace(/\/+$/,"")??Mo}function jo(n){return wt({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 No(n){return wt({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>wt({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function wt(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function zn(n,e){let t=A(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Ko(n){let e=qo(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:A(t,"id"),turnId:A(t,"turn_id"),type:A(t,"type")}]):[]}async function Wn(n){let e=await Fo(n,xo);return new St(n.status,e||n.statusText||"unknown error")}async function Fo(n,e){if(!n.body)try{return(await n.text()).slice(0,e)}catch{return""}let t=n.body.getReader(),r=new TextDecoder,s=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,s.push(r.decode(a,{stream:!0}))}s.push(r.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return s.join("").slice(0,e)}function Uo(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function ze(n,e){let t=we(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function qo(n,e){let t=we(n,e);return Array.isArray(t)?t:void 0}function A(n,e){let t=we(n,e);return typeof t=="string"?t:void 0}function _(n,e){let t=we(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function we(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function Lo(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Yn(t)?t.text:"").filter(Boolean).join("")||void 0}function $o(n,e){let t=ze(e,"cache_creation"),r=ze(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:_(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:_(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:_(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:_(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:_(e,"input_tokens")??n.input_tokens,output_tokens:_(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:_(r,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:_(r,"web_search_requests")??n.server_tool_use.web_search_requests}}}function Qo(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 Go(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Yn(t)?t.text:JSON.stringify(t)).join(`
|
|
15
|
+
`):JSON.stringify(e)}function Yn(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function Bo(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 Hn(){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 zo(n,e){e.aborted||await new Promise(t=>{let r=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(r),t()},{once:!0})})}function Wo(){let n,e;return{promise:new Promise((r,s)=>{n=r,e=s}),resolve:n,reject:e}}import{access as ti,chmod as rr,cp as ni,mkdtemp as ri,mkdir as sr,realpath as si,rm as er,writeFile as oi}from"fs/promises";import{homedir as ii,tmpdir as ai}from"os";import{dirname as ui,isAbsolute as or,join as B,relative as ci,resolve as kt,sep as li}from"path";import{homedir as Ho}from"os";import{join as Zn}from"path";var Jo=v.configDirName,Vo=v.cliHomeEnv,Yo=v.configDirEnv,Xn=200;function Xo(){return process.env[Vo]||Ho()}function Zo(){let n=process.env[Yo];return n||Zn(Xo(),Jo)}function ce(){return Zn(Zo(),"projects")}function ei(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function C(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Xn)return e;let t=Math.abs(ei(n)).toString(36);return`${e.slice(0,Xn)}-${t}`}var di=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,pi=6e4;async function ir(n){if(n.resume===void 0&&!n.continue)return;let e=C(await gi(n.cwd)),t=n.loadTimeoutMs??pi,r=n.resume!==void 0?n.resume:await hi(n.store,e,t);if(r===void 0||!di.test(r))return;let s={projectKey:e,sessionId:r},o=await tr(n.store,s,t);if(!o)return;let i=n.store.listSubkeys?await bt(n.store.listSubkeys(s),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Si(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let d=await tr(n.store,{...s,subpath:c},t);d&&a.push({subpath:c,entries:d})}let u;try{u=await ri(B(ai(),"qoder-session-store-")),await rr(u,448),await fi(mi(n.env),u);let c=B(u,"projects",e),d=B(c,r);await sr(c,{recursive:!0,mode:448}),await nr(B(c,`${r}.jsonl`),o);for(let{subpath:p,entries:l}of a){let g=vi(d,`${p}.jsonl`),h=l.filter(y=>y.type==="agent_metadata"),f=l.filter(y=>y.type!=="agent_metadata");if(f.length>0&&await nr(g,f),h.length>0){let y={...h.at(-1)};delete y.type,await ar(g.slice(0,-6)+".meta.json",JSON.stringify(y))}}let m=u;return{configDir:m,projectKey:e,sessionId:r,cleanup:async()=>{await er(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await er(u,{recursive:!0,force:!0}),c}}function mi(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??ii();return kt(n?.[v.configDirEnv]??process.env[v.configDirEnv]??B(e,v.configDirName))}async function fi(n,e){for(let t of[".auth","oauth_creds.json"]){let r=B(n,t);try{await ti(r),await ni(r,B(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(s){if(s.code!=="ENOENT")throw s}}}async function gi(n){let e=kt(n??process.cwd());try{return await si(e)}catch{return e}}async function hi(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let r=await bt(n.listSessions(e),t,"listSessions");if(!Array.isArray(r))throw new Error("SessionStore listSessions() must return an array");return r.slice().sort((s,o)=>o.mtime-s.mtime)[0]?.sessionId}async function tr(n,e,t){let r=await bt(n.load({...e}),t,"load");if(!(r===null||r.length===0)){if(!Array.isArray(r))throw new Error("SessionStore load() must return an array or null");return r.map((s,o)=>yi(s,o))}}function yi(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 Si(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||or(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function vi(n,e){let t=kt(n,e),r=ci(n,t);if(r===""||r===".."||r.startsWith(`..${li}`)||or(r))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function nr(n,e){let t=e.map(r=>JSON.stringify(r)).join(`
|
|
16
|
+
`);await ar(n,t?`${t}
|
|
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===`
|
|
18
18
|
`||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){u==="*"&&c==="/"?(i=!1,t+=" ",a+=1):t+=u===`
|
|
19
|
-
`||u==="\r"?u:" ";continue}if(
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
`);return}catch{continue}}throw new Error(`Session ${
|
|
28
|
-
`)
|
|
29
|
-
`)
|
|
30
|
-
`).
|
|
31
|
-
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Tn(Ca(n,r),r,e,s);return await Ta(xt(Pa(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
19
|
+
`||u==="\r"?u:" ";continue}if(r){t+=u,s?s=!1:u==="\\"?s=!0:u==='"'&&(r=!1);continue}u==='"'?(r=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Ki(n,e){let t;try{t=JSON.parse(Ni(n))}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`Unable to parse settings from ${e}: ${s}`)}if(!z(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Ve(t)}function de(n){return Array.isArray(n)?n.map(de):z(n)?Ve(n):n}function Ve(n){let e={};for(let[t,r]of Object.entries(n))Mt.has(t)||r===void 0||(e[t]=de(r));return e}function Fi(n){let e=n.join(".");if(Di.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(ji.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function Ct(n,e,t=[]){for(let[r,s]of Object.entries(e)){if(Mt.has(r)||s===void 0)continue;let o=[...t,r],i=n[r],a=Fi(o);if(a==="shallow"&&i&&s){let u={};z(i)&&Object.assign(u,Ve(i)),z(s)&&Object.assign(u,Ve(s)),n[r]=u;continue}if(Array.isArray(i)){let u=Array.isArray(s)?s:[s];if(a==="concat"){n[r]=[...i.map(de),...u.map(de)];continue}if(a==="union"){n[r]=[...new Set([...i,...u])].map(de);continue}}if(z(i)&&z(s))Ct(i,s,o);else if(z(s)){let u={};Ct(u,s,o),n[r]=u}else n[r]=de(s)}}function Ui(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===".."||!xi.test(t)||Ii.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(Oi.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function _t(n,e){let t;try{t=await Ci(e,"utf8")}catch(r){if(r.code==="ENOENT")return;throw r}return{source:n,path:x.resolve(e),settings:Ki(t,x.resolve(e))}}async function qi(n={}){let e=x.resolve(n.cwd??process.cwd()),t=process.env,r=Ui(t),s=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=s?x.resolve(e,s):Mi.homedir(),i=t[v.configDirEnv]?x.resolve(e,t[v.configDirEnv]):x.join(o,r.user),a=x.join(e,r.project),u=new Set(n.settingSources??Ai),c=x.resolve(o)===e,d=[];if(u.has("user")){let l=await _t("user",x.join(i,"settings.json"));l&&d.push(l)}if(u.has("project")&&!c){let l=await _t("project",x.join(a,"settings.json"));l&&d.push(l)}if(u.has("local")&&!c){let l=await _t("local",x.join(a,"settings.local.json"));l&&d.push(l)}let m={},p={};for(let l of d){Ct(m,l.settings);for(let g of Object.keys(l.settings))Mt.has(g)||(p[g]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:m,provenance:p,sources:d}}import{McpServer as Li}from"@modelcontextprotocol/sdk/server/mcp.js";function $i(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 Li({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 r of n.tools){if(!r.name||typeof r.name!="string"||r.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${n.name}".`);if(!r.description||typeof r.description!="string")throw new Error(`[createSdkMcpServer] Tool "${r.name}" must have a non-empty description string.`);rt(n.name,{name:r.name,exposedName:r.exposedName,alwaysLoad:r.alwaysLoad}),(r.exposedName!==void 0||r.alwaysLoad!==void 0||r.permissionPolicy!==void 0)&&t.push({name:r.name,...r.exposedName!==void 0?{exposedName:r.exposedName}:{},...r.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r.permissionPolicy!==void 0?{permission_policy:r.permissionPolicy}:{}});try{e.registerTool(r.name,{description:r.description,inputSchema:r.inputSchema,...r.annotations?{annotations:r.annotations}:{}},r.handler)}catch(s){throw s instanceof Error&&s.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${r.name}" in server "${n.name}". Each tool name must be unique within a server.`):s}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Qi(n,e,t,r,s){return{name:n,description:e,inputSchema:t,handler:r,annotations:s?.annotations,...s?.exposedName!==void 0?{exposedName:s.exposedName}:{},...s?.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s?.permissionPolicy!==void 0?{permissionPolicy:s.permissionPolicy}:{}}}import{readdir as At,readFile as Xe,stat as pe,appendFile as Sr,realpath as Gi,rm as pr}from"fs/promises";import{basename as Bi,join as R,resolve as mr}from"path";import{execFile as zi}from"child_process";import{randomUUID as vr}from"crypto";import{promisify as Wi}from"util";var Hi=Wi(zi),Ji=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,wr=new Set(["user","assistant","system","progress","attachment"]);function E(n){return n!==null&&typeof n=="object"}function W(n){return Ji.test(n)}function Vi(n){let e=[];for(let t of n.split(`
|
|
20
|
+
`)){let r=t.trim();if(r)try{let s=JSON.parse(r);E(s)&&typeof s.uuid=="string"&&typeof s.type=="string"&&wr.has(s.type)&&e.push(s)}catch{}}return e}function Yi(n,e){let t;for(let r of n.split(`
|
|
21
|
+
`)){let s=r.trim();if(s)try{let o=JSON.parse(s);if(!E(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function Ye(n){if(!E(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var Xi=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Zi(n){return typeof n=="string"&&Xi.has(n)?n:void 0}function xt(n){if(n.type!=="user")return;let e=Ye(n).filter(o=>E(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]:[],r=Array.isArray(n.userFeedback)?n.userFeedback:e.length===1?[n.userFeedback]:[],s=e.flatMap((o,i)=>{let a=Zi(t[i]);if(!a)return[];let u=r[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return s.length>0?s:void 0}function be(n){if(n.type!=="assistant"||!E(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function kr(n){return n.type!=="user"||!n.parentUuid?!1:Ye(n).some(e=>E(e)&&e.type==="tool_result")}function ea(n){if(!E(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function ta(n,e){let t=new Map;for(let[r,s]of n){let o=ea(s);if(o){let i=t.get(o);i?i.push(r):t.set(o,[r])}}for(let[r,s]of n){let o=na(s,s.parentUuid,n,t,e);o!==s.parentUuid&&n.set(r,{...s,parentUuid:o})}}function na(n,e,t,r,s){if(!e||t.has(e))return e;let o=r.get(e);return!o||o.length===0?e:o.length===1?o[0]:ra(n,o,t)??sa(n,o,t,s)??e}function ra(n,e,t){if(!kr(n))return;let r=Ye(n).filter(o=>E(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(r.length===0)return;let s=e.filter(o=>{let i=t.get(o);return i?Ye(i).some(a=>E(a)&&a.type==="tool_use"&&r.includes(typeof a.id=="string"?a.id:"")):!1});return s.length===1?s[0]:void 0}function sa(n,e,t,r){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(r.get(o.uuid)??-1)<(r.get(n.uuid)??-1)).at(-1)?.uuid}function oa(n){for(let e of n.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,r=t?.headUuid,s=t?.anchorUuid,o=t?.tailUuid;if(!r||!s||!o)continue;let i=n.get(r);i&&n.set(r,{...i,parentUuid:s});for(let[a,u]of n)a!==r&&u.parentUuid===s&&n.set(a,{...u,parentUuid:o})}}function fr(n,e,t){let r=(n.timestamp??"").localeCompare(e.timestamp??"");return r!==0?r:(t.get(n.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function ia(n,e,t){let r=e.filter(p=>p.type==="assistant");if(r.length===0)return e;let s=new Map,o=0;for(let p of n.keys())s.set(p,o++);let i=new Map;for(let p of r){let l=be(p);l&&i.set(l,p)}let a=new Map,u=new Map;for(let p of n.values()){let l=be(p);if(l){let g=a.get(l)??[];g.push(p),a.set(l,g);continue}if(kr(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 r){let l=be(p);if(!l||c.has(l))continue;c.add(l);let g=a.get(l)??[p],h=g.filter(k=>!t.has(k.uuid)),f=[];for(let k of g){let J=u.get(k.uuid)??[];for(let ge of J)t.has(ge.uuid)||f.push(ge)}if(h.length===0&&f.length===0)continue;let y=i.get(l);if(!y)continue;let w=[...g].sort((k,J)=>fr(k,J,s));f.sort((k,J)=>fr(k,J,s));let S=w.findIndex(k=>k.uuid===y.uuid),T=w.slice(0,Math.max(S,0)).filter(k=>!t.has(k.uuid)),P=w.slice(S+1).filter(k=>!t.has(k.uuid)),H=[...T,...P,...f];for(let k of H)t.add(k.uuid);d.set(y.uuid,H)}if(d.size===0)return e;let m=[];for(let p of e){let l=d.get(p.uuid);if(l){let g=s.get(p.uuid)??Number.MAX_SAFE_INTEGER,h=[],f=[];for(let y of l)(p.type==="assistant"&&y.type==="assistant"&&be(y)===be(p)&&(s.get(y.uuid)??Number.MAX_SAFE_INTEGER)<g?h:f).push(y);m.push(...h,p,...f)}else m.push(p)}return m}function br(n,e,t="runtime"){if(n.length===0)return[];let r=new Map,s=new Map;for(let[d,m]of n.entries())r.set(m.uuid,m),s.set(m.uuid,d);t==="runtime"&&oa(r),ta(r,s);let o;if(e?.leafUuid===null)return[];if(e){let d=r.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 r.values())h.parentUuid&&d.add(h.parentUuid);let m=Array.from(r.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?r.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)=>(s.get(f.uuid)??-1)>(s.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?r.get(d):void 0}i.reverse();let c=t==="runtime"?aa(i):i;return ia(r,c,new Set(c.map(d=>d.uuid)))}function aa(n){let e=-1;for(let t=n.length-1;t>=0;t--){let r=n[t];if(r?.type==="system"&&r.subtype==="compact_boundary"){e=t;break}}return e>=0?n.slice(e):[...n]}function ua(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function It(n,e,t){let r=n.flatMap(o=>E(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&wr.has(o.type)?[o]:[]),s;for(let o of n){if(!E(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;a!==null&&typeof a!="string"||(s={leafUuid:a,sessionId:e})}return br(r,s,t)}function gr(n,e,t){if(t==="historical"&&ua(n))return!1;let r=n.type==="user"||n.type==="assistant",s=e&&n.type==="system";return!(!r&&!s||n.isMeta||n.isSidechain||n.teamName)}function ca(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 Ot(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function Dt(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function hr(n){let e=n.type==="system"?ca(n.compactMetadata):void 0,t=xt(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,...Ot(n),...Dt(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 yr(n,e){let t=Math.max(0,e?.offset??0),r=e?.limit;return r!==void 0&&r>0?n.slice(t,t+r):t>0?n.slice(t):n}async function Ze(n){try{return await Gi(mr(n))}catch{return mr(n)}}async function la(n){return C(await Ze(n))}async function K(n){let e=ce();if(n?.dir){let t=await Ze(n.dir),r=[R(e,C(t))];if(n.includeWorktrees!==!1)try{let{stdout:s}=await Hi("git",["worktree","list","--porcelain"],{cwd:n.dir}),o=s.split(`
|
|
22
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)r.push(R(e,await la(i)))}catch{}return r}try{return(await At(e,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>R(e,r.name))}catch{return[]}}async function Rr(n){try{let[e,t]=await Promise.all([Xe(n,"utf-8"),pe(n)]),r=e.trim().split(`
|
|
23
|
+
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return E(i)?[i]:[]}catch{return[]}});if(r.length===0)return null;let s=Bi(n,".jsonl");return jt(s,r,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Er(n,e){return R(n,e,"subagents")}function Tr(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 Pr(n){let e=[];async function t(r){let s;try{s=await At(r,{withFileTypes:!0})}catch{return}for(let o of s){let i=R(r,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(n),e}async function da(n){try{let e=await Xe(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 _r(n){if(n.length===0)return[];let e=new Map(n.map(i=>[i.uuid,i])),t=n[n.length-1],r=[],s=new Set,o=t;for(;o&&!s.has(o.uuid);)s.add(o.uuid),r.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return r.reverse()}async function pa(n,e,t){let[r,s]=await Promise.all([Xe(n,"utf-8"),da(n)]),o=[];for(let d of r.trim().split(`
|
|
24
|
+
`).filter(Boolean))try{let m=JSON.parse(d);Tr(m)&&o.push(m)}catch{}let a=_r(o).map(d=>{let m=xt(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??e,message:d.message,parent_tool_use_id:s.parentToolUseId,parent_agent_id:s.parentAgentId,...Ot(d),...Dt(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 me(n){return C(await Ze(n??process.cwd()))}function Re(n,e){return{projectKey:n,sessionId:e}}function ma(n){let e=0;for(let t of n){if(typeof t.timestamp!="string")continue;let r=Date.parse(t.timestamp);Number.isFinite(r)&&(e=Math.max(e,r))}return e}function fa(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 ga=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function ha(n){let e=n;for(let t=0;t<10;t+=1){let r=e.normalize("NFKC").replace(ga,"");if(r===e)return r;e=r}return e}var ya=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,Sa=/<command-name>(.*?)<\/command-name>/,va=/<bash-input>([\s\S]*?)<\/bash-input>/;function wa(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 ka(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!E(t))return;let r=t.content,s=[];if(typeof r=="string")s.push(r);else if(Array.isArray(r)){for(let o of r)if(E(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&s.push(o.text)}}for(let o of s){let i=o.replaceAll(`
|
|
25
|
+
`," ").trim();if(!i)continue;let a=Sa.exec(i);if(a){e.commandFallback??=a[1];continue}let u=va.exec(i);if(u)return`! ${u[1].trim()}`;if(!ya.test(i))return wa(i)}}function jt(n,e,t,r={}){if(e.length===0)return;let s,o,i,a,u,c,d,m,p,l,g;for(let w of e){let S=w;if(g??=S.isSidechain===!0,l===void 0&&typeof S.timestamp=="string"){let T=Date.parse(S.timestamp);Number.isFinite(T)&&(l=T)}if(!s){let T={commandFallback:o};s=ka(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=s??o,f=i||a,y=f||u||c||h;if(y)return{sessionId:n,summary:y,lastModified:t??ma(e),fileSize:r.fileSize,customTitle:f,firstPrompt:h,gitBranch:d,cwd:m||r.defaultCwd,tag:p,createdAt:l}}async function Cr(n,e,t){let r=Re(await me(t),e),s=await n.load(r);return s?{key:r,entries:s}:void 0}async function ba(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let d=await Ze(n.dir??process.cwd()),m=C(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 w=await c.load(Re(m,f));return w?jt(f,w,y,{defaultCwd:d}):void 0}))).flatMap((f,y)=>{if(f.status==="fulfilled")return f.value?[f.value]:[];let w=g[y];return[{sessionId:w.sessionId,summary:"",lastModified:w.mtime}]})}let e=await K(n),r=(await Promise.all(e.map(async c=>{try{return(await At(c)).filter(m=>m.endsWith(".jsonl")).map(m=>R(c,m))}catch{return[]}}))).flat(),s=await Promise.all(r.map(Rr)),o=new Map;for(let c of s){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 Ra(n,e){if(e?.sessionStore){if(!W(n))return;let r=await Cr(e.sessionStore,n,e.dir);return r?jt(n,r.entries,fa(r.entries)):void 0}let t=await K(e);for(let r of t){let s=R(r,`${n}.jsonl`),o=await Rr(s);if(o)return o}}async function Ea(n,e){if(!W(n))return[];let t=e?.includeSystemMessages===!0,r=e?.view??"runtime";if(e?.sessionStore){let o=await Cr(e.sessionStore,n,e.dir);if(!o)return[];let i=It(o.entries,n,r);return yr(i.filter(a=>gr(a,t,r)).map(hr),e)}let s=await K(e);for(let o of s){let i=R(o,`${n}.jsonl`);try{let a=await Xe(i,"utf-8"),c=br(Vi(a),Yi(a,n),r).filter(d=>gr(d,t,r)).map(hr);return yr(c,e)}catch{continue}}return[]}async function Ta(n,e,t){if(!W(n))throw new Error(`Invalid sessionId: ${n}`);let r=e.trim();if(!r)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(Re(await me(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:r,uuid:vr(),timestamp:new Date().toISOString()}]);return}let s=await K(t);for(let o of s){let i=R(o,`${n}.jsonl`);try{await pe(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:r,timestamp:new Date().toISOString()});await Sr(i,a+`
|
|
26
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Pa(n,e,t){if(!W(n))throw new Error(`Invalid sessionId: ${n}`);let r=e===null?null:ha(e).trim();if(r!==null&&!r)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(Re(await me(t.dir),n),[{type:"tag",sessionId:n,tag:r??"",uuid:vr(),timestamp:new Date().toISOString()}]);return}let s=await K(t);for(let o of s){let i=R(o,`${n}.jsonl`);try{await pe(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:r??"",timestamp:new Date().toISOString()});await Sr(i,a+`
|
|
27
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function _a(n,e){if(e?.sessionStore){if(!W(n))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let r=await e.sessionStore.listSubkeys({projectKey:await me(e.dir),sessionId:n});return Array.from(new Set(r.map(s=>{if(!s.startsWith("subagents/"))return;let o=s.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(s=>s!==void 0)))}let t=await K(e);for(let r of t){let s=R(r,`${n}.jsonl`);try{await pe(s);let o=await Pr(Er(r,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function Ca(n,e,t){if(t?.sessionStore){if(!W(n)||!e)return[];let s=await me(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:s,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:s,sessionId:n,subpath:o});if(!i)return[];let a=i.filter(Tr),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=_r(a).map(l=>{let g=xt(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,...Ot(l),...Dt(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 r=await K(t);for(let s of r){let o=R(s,`${n}.jsonl`);try{await pe(o);let a=(await Pr(Er(s,n))).find(u=>u.agentId===e);return a?await pa(a.filePath,n,t):[]}catch{continue}}return[]}async function Ma(n,e){if(!W(n))throw new Error(`Invalid sessionId: ${n}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(Re(await me(e.dir),n));return}let t=await K(e);for(let r of t){let s=R(r,`${n}.jsonl`);try{await pe(s),await Promise.all([pr(s,{force:!0}),pr(R(r,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as et}from"crypto";import{readdir as Aa,readFile as xa,realpath as Ia,stat as Mr,writeFile as Oa}from"fs/promises";import{dirname as Da,join as Nt,resolve as ja}from"path";var Ar=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Na=new Set(["user","assistant","attachment","system","progress"]);async function Ir(n){let e=ja(n);try{return await Ia(e)}catch{return e}}async function Ka(n,e){let t=ce();if(e){let s=C(await Ir(e)),o=Nt(t,s,`${n}.jsonl`);try{if((await Mr(o)).size>0)return o}catch{}return}let r;try{r=await Aa(t,{withFileTypes:!0})}catch{return}for(let s of r){if(!s.isDirectory()&&!s.isSymbolicLink())continue;let o=Nt(t,s.name,`${n}.jsonl`);try{if((await Mr(o)).size>0)return o}catch{}}}function Or(n,e){let t=[],r;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"&&(r=i.relocatedCwd)}return{transcript:It(n,e,"historical").filter(o=>Na.has(o.type)),contentReplacements:t,relocatedCwd:r}}function Fa(n,e){let t=[];for(let r of n.split(`
|
|
28
|
+
`))if(r.trim())try{t.push(JSON.parse(r))}catch{}return Or(t,e)}function Ua(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 r=t.message;if(r===null||typeof r!="object")continue;let s=r.content;if(typeof s=="string"&&s.trim())return s.trim();if(!Array.isArray(s)||s.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=s.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
|
|
29
|
+
`).trim();if(o)return o}}function qa(n){let e,t;for(let r of n){if(r===null||typeof r!="object")continue;let s=r;typeof s.customTitle=="string"&&s.customTitle&&(e=s.customTitle),typeof s.aiTitle=="string"&&s.aiTitle&&(t=s.aiTitle)}return e??t??Ua(n)}function xr(n,e,t,r){let s=n.transcript.filter(l=>l.isSidechain!==!0);if(s.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=s.findIndex(g=>g.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);s=s.slice(0,l+1)}let o=new Set(s.map(l=>l.uuid)),i=new Map(s.map(l=>[l.uuid,et()])),a=s.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(s.map(l=>[l.uuid,l])),c=et(),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,w={...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 w.teamName,delete w.agentName,delete w.sessionKind,delete w.slug,delete w.sourceToolAssistantUUID,w});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:et(),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||`${qa(r)??"Forked session"} (fork)`,uuid:et(),timestamp:d}),{sessionId:c,entries:m}}async function La(n,e={}){if(!Ar.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!Ar.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Ir(e.dir??process.cwd()),a=C(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=xr(Or(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Ka(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let r=await xa(t,"utf8"),s=r.split(`
|
|
30
|
+
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=xr(Fa(r,n),n,e,s);return await Oa(Nt(Da(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
32
31
|
`)}
|
|
33
|
-
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function
|
|
34
|
-
${t.stdout}`);throw
|
|
32
|
+
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function tt(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Kt=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let r=tt(e),s=this.entries.get(r)??[];s.push(...t),this.entries.set(r,s),this.keys.set(r,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(r,o)}async load(e){let t=this.entries.get(tt(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[r,s]of this.keys)s.projectKey!==e||s.subpath!==void 0||t.push({sessionId:s.sessionId,mtime:this.modifiedAt.get(r)??0});return t.sort((r,s)=>s.mtime-r.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(tt(e));return}for(let[t,r]of this.keys)r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let r of this.keys.values())r.projectKey===e.projectKey&&r.sessionId===e.sessionId&&r.subpath!==void 0&&t.push(r.subpath);return t.sort()}getEntries(e){return[...this.entries.get(tt(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 $a}from"fs";import{readdir as Kr,readFile as Qa,realpath as Ga,stat as Dr}from"fs/promises";import{basename as jr,dirname as Ba,join as Ee,relative as za,resolve as Wa,sep as Ha}from"path";import{createInterface as Ja}from"readline";var Va=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ya=500,Xa=1024*1024;async function Za(n){let e=Wa(n);try{return await Ga(e)}catch{return e}}async function eu(n,e){let t=ce();if(e){let s=C(await Za(e)),o=Ee(t,s,`${n}.jsonl`);try{if((await Dr(o)).size>0)return{filePath:o,projectKey:s}}catch{}return}let r;try{r=await Kr(t,{withFileTypes:!0})}catch{return}for(let s of r){if(!s.isDirectory()&&!s.isSymbolicLink())continue;let o=Ee(t,s.name,`${n}.jsonl`);try{if((await Dr(o)).size>0)return{filePath:o,projectKey:s.name}}catch{}}}async function tu(n){let e=[];async function t(r){let s;try{s=await Kr(r,{withFileTypes:!0})}catch{return}s.sort((o,i)=>o.name.localeCompare(i.name));for(let o of s){let i=Ee(r,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Nr(n,e,t,r){let s=Ja({input:$a(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of s){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${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>=r||i>=Xa)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function nu(n,e,t={}){if(!Va.test(n))throw new Error(`Invalid sessionId: ${n}`);let r=await eu(n,t.dir);if(!r)throw new Error(`Session ${n} not found`);let s=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Ya;if(await Nr(r.filePath,{projectKey:r.projectKey,sessionId:n},e,s),t.includeSubagents===!1)return;let o=r.filePath.replace(/\.jsonl$/,""),i=Ee(o,"subagents");for(let a of await tu(i)){let c=za(o,a).split(Ha);c[c.length-1]=jr(c[c.length-1],".jsonl");let d={projectKey:r.projectKey,sessionId:n,subpath:c.join("/")};await Nr(a,d,e,s);let m=Ee(Ba(a),`${jr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Qa(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 ru}from"node:child_process";import{existsSync as su}from"node:fs";import{Worker as ou}from"node:worker_threads";var Ft=3e4;async function Fr(n,e={}){let t=We({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},he);return t.transport==="worker"?au(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):iu(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??Z()})}function iu(n,e){return new Promise((t,r)=>{let s=ru(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Ur(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,s.kill("SIGTERM"),r(qr(e.timeoutMs)))},e.timeoutMs??Ft);s.stdout.on("data",c=>{o+=c.toString()}),s.stderr.on("data",c=>{i+=c.toString()}),s.on("error",c=>{a||(a=!0,clearTimeout(u),r(c))}),s.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function au(n,e){cu(e.signal);let t=re(e.pathToQoderWorkerRuntime),r=await Ne(t);uu(r);let s=e.cwd??process.cwd(),o=Ur(e.env);delete o.NODE_OPTIONS;let i=Ke(r,{cwd:s,env:o});return new Promise((a,u)=>{let c=new ou(r.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=P=>{p||(p=!0,f(),u(P))},w=()=>{p||l===void 0||!g||!h||(p=!0,f(),a({stdout:d,stderr:m,exitCode:l}))},S=()=>{c.terminate(),y(Lr(e.signal))},T=setTimeout(()=>{c.terminate(),y(qr(e.timeoutMs))},e.timeoutMs??Ft);c.stdin?.end(),c.stdout?.on("data",P=>{d+=P.toString()}),c.stdout?.on("end",()=>{g=!0,w()}),c.stderr?.on("data",P=>{m+=P.toString()}),c.stderr?.on("end",()=>{h=!0,w()}),c.once("error",y),c.once("exit",P=>{l=P,w()}),e.signal?.addEventListener("abort",S,{once:!0}),e.signal?.aborted&&S()})}function Ur(n){let e={...process.env,...n},t={};for(let[r,s]of Object.entries(e))s!==void 0&&(t[r]=s);return t}function uu(n){if(!su(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function qr(n){return new Error(`qodercli subprocess timed out after ${n??Ft}ms`)}function cu(n){if(n?.aborted)throw Lr(n)}function Lr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function lu(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await fe(e,n);return JSON.parse(t.stdout).map(s=>({id:s.id,name:s.name,source:s.source,path:s.installPath??s.path,version:s.version??"unknown",scope:s.scope,enabled:s.enabled,canDisable:s.canDisable,displayName:s.displayName,description:s.description,installedAt:s.installedAt,lastUpdated:s.lastUpdated,resources:s.resources}))}async function du(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let r=await fe(t,e);r.exitCode!==0&&Te(r)}async function pu(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let r=await fe(t,e);r.exitCode!==0&&Te(r)}async function mu(n,e){let t=await fe(["plugins","install",n,"--scope","user","--json"],e);t.exitCode!==0&&Te(t);let r=JSON.parse(t.stdout);return{pluginId:r.pluginId,version:r.version??"local",path:r.path}}async function fu(n,e){let t=["plugins","uninstall",n,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let r=await fe(t,e);r.exitCode!==0&&Te(r);let s=JSON.parse(r.stdout);return{pluginId:s.pluginId,fullyRemoved:s.fullyRemoved,reverseDependents:s.reverseDependents??[]}}async function gu(n,e){let t;try{t=await fe(["plugins","validate",n,"--json"],e)}catch(s){if(e?.signal?.aborted||s instanceof Error&&s.name==="AbortError")throw new M("Plugin validation was aborted");let o=s instanceof Error?s.message:String(s);throw F("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let r;try{r=JSON.parse(t.stdout)}catch{let s=hu(`${t.stderr}
|
|
33
|
+
${t.stdout}`);throw F(s?"plugin_validation_unsupported":"plugin_validation_protocol_error",s?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(r&&typeof r=="object"&&"ok"in r&&r.schemaVersion!==1)throw F("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(r&&typeof r=="object"&&r.ok===!0&&r.report){let s=r.report;if(Su(s))return s;throw F("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(r&&typeof r=="object"&&r.ok===!1){let s=r.error;if(!s||typeof s!="object"||typeof s.code!="string"||typeof s.message!="string")throw F("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=s;throw F(o.code,o.message)}throw t.exitCode!==0&&Te(t),F("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function hu(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var yu=3e4;function fe(n,e){return Fr(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:yu})}function Te(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let r=JSON.parse(n.stdout);r.error&&r.code?(e=r.code,t=r.message??t):r.ok===!1&&r.error&&(e=r.error.code??e,t=r.error.message??t)}catch{}throw F(e,t)}function F(n,e){let t=new Error(e);return t.code=n,t}function Su(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(r=>r!==null&&typeof r=="object"&&(r.severity==="error"||r.severity==="warning")&&typeof r.code=="string"&&typeof r.message=="string"&&typeof r.phase=="string"&&t.has(r.phase)&&(r.location===void 0||r.location!==null&&typeof r.location=="object"&&typeof r.location.path=="string"))}import{execFile as vu}from"child_process";function wu(){return Z()}async function ku(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??wu(),r=e?.timeout??6e4,s=["feedback","-c",n.content,"--json"];if(e?.storageDir&&s.push("--storage-dir",e.storageDir),n.sessionId&&s.push("-s",n.sessionId),n.workdir&&s.push("--workdir",n.workdir),n.email&&s.push("--email",n.email),n.include)for(let o of n.include)s.push("--include",o);if(n.imagePaths)for(let o of n.imagePaths)s.push("--images",o);if(n.callerVersion&&s.push("--caller-version",n.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&s.push("--ide-type",o)}return new Promise(o=>{vu(t,s,{env:e?.env??process.env,timeout:r,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 Gr={};Hr(Gr,{filterEscalatingDefaultMode:()=>$r,isBashToolBackgroundLaunchResult:()=>Qr});var bu=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function $r(n){let e=n.effective.permissions?.defaultMode;if(!e||!bu.has(e))return n.effective;for(let t=n.sources.length-1;t>=0;t-=1){let r=n.sources[t];if(r.settings.permissions?.defaultMode!==void 0){if(r.source==="project"){let{defaultMode:s,...o}=n.effective.permissions??{};return{...n.effective,permissions:o}}return n.effective}}return n.effective}function Qr(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",r=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,s=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&r(e.totalLines)&&r(e.totalBytes)&&(s===void 0||s==="user"||s==="model"||s==="timeout"||s==="auto")}export{M as AbortError,Me as AuthAccessTokenEnvVarError,Ae as AuthServiceAccountEnvVarError,Jt as DEFAULT_ACCESS_TOKEN_ENV_VAR,he as DEFAULT_RUNTIME_TRANSPORT,Ce as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Vr as EXIT_REASONS,Jr as HOOK_EVENTS,Kt as InMemorySessionStore,He as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Se as ModelPolicyTimeoutError,te as ProcessTransport,ve as ProtocolVersionMismatchError,ee as QoderCliProcessError,$ as QoderWorkerRuntimeError,Q as UnsupportedCliCapabilityError,mt as WIRE_PROTOCOL_VERSION,se as WorkerTransport,ns as accessToken,rs as accessTokenFromEnv,Gr as coreTypes,$i as createSdkMcpServer,Ma as deleteSession,pu as disablePlugin,du as enablePlugin,$r as filterEscalatingDefaultMode,La as forkSession,Ra as getSessionInfo,Ea as getSessionMessages,Ca as getSubagentMessages,kn as hasResolvableQoderWorkerRuntime,nu as importSessionToStore,mu as installPlugin,Qr as isBashToolBackgroundLaunchResult,as as jobToken,lu as listPlugins,ba as listSessions,_a as listSubagents,ss as qodercliAuth,Et as query,Ta as renameSession,re as resolveQoderWorkerRuntimePath,qi as resolveSettings,os as serviceAccount,is as serviceAccountFromEnv,_i as startup,ku as submitFeedback,Pa as tagSession,Qi as tool,fu as uninstallPlugin,gu as validatePlugin};
|