@qoder-ai/qoder-agent-sdk 1.0.24 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/brand.d.ts +10 -0
- package/dist/core/constants.d.ts +5 -4
- 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 +1 -1
- package/dist/index.js +28 -28
- package/dist/protocol/control.d.ts +42 -1
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +1 -1
- package/dist/protocol/memory.d.ts +4 -0
- package/dist/protocol/messages.d.ts +24 -1
- package/dist/query/query-runner.d.ts +19 -1
- package/dist/runtime-manifest.json +5 -5
- package/dist/types/control.d.ts +1 -1
- package/dist/types/memory.d.ts +16 -1
- package/dist/types/options.d.ts +33 -0
- package/dist/types/plugins.d.ts +11 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
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 $n=Object.defineProperty;var Qn=(r,e)=>{for(var t in e)$n(r,t,{get:e[t],enumerable:!0})};import{spawn as ks}from"child_process";import{createInterface as bs}from"readline";var Bn=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied"],Gn=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],_e=2e3,qt=5e3;var Lt="1.0.25";var L=41,Ft=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Ut=["TaskCreate","TaskGet","TaskUpdate","TaskList"],zn="QODER_FEATURE_TASKS";function $t(r){let e=r[zn];if(e!=="0"&&e!=="false")return[...Ft];let t=new Set(Ut);return Ft.flatMap(n=>n===Ut[0]?["TodoWrite"]:t.has(n)?[]:[n])}import{chmod as Ht,mkdtemp as ns,rm as Jt,writeFile as ss}from"fs/promises";import{existsSync as xe,mkdtempSync as os,readFileSync as is,rmSync as as,writeFileSync as us}from"fs";import{homedir as cs,tmpdir as Vt}from"os";import{dirname as nr,join as D}from"path";import{fileURLToPath as ds}from"url";var Wn=/^[A-Za-z0-9_-]{1,64}$/,Hn=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(!Wn.test(e.exposedName))throw new Error(`MCP tool "${r}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Hn.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 Qt(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 Jn="global",Bt=Jn==="cn",Vn=Bt?"QODERCN_":"QODER_",nt=`${Vn}VPC_ENDPOINT`,w=Bt?{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 Gt=w.accessTokenEnv,Ce=w.serviceAccountEnv;function Yn(r){return{type:"accessToken",accessToken:r}}function Xn(r=Gt){return{type:"accessToken",accessToken:{envVar:r}}}function Zn(){return{type:"qodercli"}}function es(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 ts(r=Ce){return{type:"serviceAccount",serviceAccountKey:{envVar:r}}}function rs(r){return{type:"jobToken",fetchJobToken:r}}var zt=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Wt(r){if(r===null||typeof r!="object"||Array.isArray(r))throw new TypeError("securityScan must be an object.");let e=new Set(zt),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 zt){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 Yt="QODER_AGENT_SDK_ENTRYPOINT",Xt="QODER_AGENT_SDK_VERSION",Zt="QODER_SDK_AUTH_PAYLOAD_FILE",ls="sdk-ts",ps=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy"],ms=ds(import.meta.url),er=nr(ms),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 sr(r){return/\.(js|mjs|tsx?|jsx)$/.test(r)}function X(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let r=fs();if(r)return r;let e=gs();if(xe(e))return e;let t=hs();return t||w.cliCommands[0]}function fs(){for(let r of or())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 gs(){for(let r of or())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 hs(){let r=process.env[w.cliHomeEnv]??cs();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 or(){let r=[D(er,".."),D(er,"..","..")];return[...new Set(r)]}function ys(){return{allow:[],ask:[],deny:[]}}function tr(r){return r.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Ss(r,e){if(e.startsWith("mcp__"))return e;let t=tr(r),n=e==="*"?"*":tr(e);if(!t||!n)throw new Error(`Invalid MCP tool policy name for server "${r}" and tool "${e}"`);return`mcp__${t}__${n}`}function rr(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 ws(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{as(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=nr(this.authPayloadPath);try{await Jt(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[Yt],delete t[Xt],delete t[Zt];for(let n of this.serviceAccountCredentialEnvVars())vs(t,n);if(t[Yt]=ls,t[Xt]=Lt,this.authPayloadPath&&(t[Zt]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.proxy!==void 0)for(let n of ps)t[n]=this.options.proxy;if(this.options.vpcEndpoint!==void 0){let n=this.options.vpcEndpoint.trim();n?t[nt]=n:delete t[nt]}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(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??$t(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?ws(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Wt(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]:[];rr(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=ys(),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=Ss(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]]:[];rr(o,t[s]),n[s]=o}}readSettingsFile(e){let t=is(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=os(D(Vt(),"qoder-agent-sdk-settings-"));let t=D(this.generatedSettingsDir,"settings.json");return us(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),n=await ns(D(Vt(),"qoder-sdk-auth-"));try{await Ht(n,448);let s=D(n,"payload.json");return await ss(s,JSON.stringify(t),{mode:384}),await Ht(s,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${s}`),s}catch(s){throw await Jt(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 Me(t);return n}};function vs(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 ir=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=ks(s,o,{cwd:this.options.cwd,env:n,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===L&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
2
2
|
`)?e:e+`
|
|
3
|
-
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=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=bs({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")},qt);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>ir&&(this.stderrTail=this.stderrTail.slice(-ir))}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(sr(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 Rs(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ge=Rs();function ar(r){return typeof r=="object"&&r!==null&&typeof r.create=="function"}function Oe(r,e){return r.create(e)}import{existsSync as Hs}from"fs";import{createInterface as Js}from"readline";import{Worker as Vs}from"worker_threads";import{createHash as Ts}from"node:crypto";import{existsSync as Ps}from"node:fs";import{chmod as Es,lstat as _s,mkdir as he,readFile as ur,readdir as Cs,readlink as Ms,rename as As,rm as De,stat as xs,symlink as Is,writeFile as cr}from"node:fs/promises";import{tmpdir as Os,userInfo as Ds}from"node:os";import{basename as dr,dirname as te,join as j,relative as js}from"node:path";var Ns="QODER_WORKER_RUNTIME_ASSET_ROOT",lr=/(^|[\\/])app\.asar([\\/]|$)/,ot=".qoder-worker-runtime-ready";function pr(r){return lr.test(r)}function it(r){return pr(r)?r.replace(lr,(e,t,n)=>`${t}app.asar.unpacked${n}`):null}async function je(r,e={}){let t=it(r);if(!e.forceMaterialize&&t){let u=te(t);if(Ps(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),st(t,u,!1,te(r))}if(!(e.forceMaterialize||pr(r))){let u=te(r);return st(r,u,!1)}let s=te(r),o=await Ks(s,r,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=js(s,r)||dr(r),a=j(o,i);return st(a,o,!0,s)}function st(r,e,t,n){return{runtimePath:r,runtimeRoot:e,materialized:t,sourceRuntimeRoot:n,env:{[Ns]:e}}}async function Ks(r,e,t){let n=await Fs(r,e),s=t.cacheDir??Ls(),o=j(s,n),i=j(o,ot);if(await fr(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 mr(r,a),await cr(j(a,ot),n,{mode:384}),await qs(a,o,n),o}catch(u){throw await De(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Fs(r,e){let t=Ts("sha256");t.update("qoder-worker-runtime-v1\0");let n=await gr(j(r,"runtime-info.json"));if(n)t.update(n);else{t.update(e);let s=await xs(e).catch(()=>null);s&&t.update(`${s.size}\0${s.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function mr(r,e){let t=await Cs(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 mr(s,o);continue}if(n.isSymbolicLink()){await he(te(o),{recursive:!0,mode:448}),await Is(await Ms(s),o);continue}if(!n.isFile())continue;let i=await Us(s);await he(te(o),{recursive:!0,mode:448}),await cr(o,await ur(s),{mode:i}),process.platform!=="win32"&&await Es(o,i)}}async function Us(r){let e=((await _s(r)).mode||420)&511;if(process.platform==="win32")return e||420;let t=dr(r);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function qs(r,e,t){try{await As(r,e)}catch(n){if(await fr(j(e,ot))===t){await De(r,{recursive:!0,force:!0});return}throw n}}async function fr(r){let e=await gr(r);return e?e.toString("utf8"):null}async function gr(r){try{return await ur(r)}catch{return null}}function Ls(){let r=$s(Ds().username||process.env.USER||process.env.USERNAME||"user");return j(Os(),`qoder-sdk-worker-runtime-${r}`)}function $s(r){return r.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Qs="QODER_WORKER_CWD";function Ne(r,e){return{env:{...e.env,[Qs]:e.cwd,...r.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:r.runtimeRoot,materialized:r.materialized}}}}import{existsSync as at}from"node:fs";import{dirname as Bs,join as $}from"node:path";import{fileURLToPath as Gs}from"node:url";var zs=Gs(import.meta.url),ut=Bs(zs);function re(r){if(r)return r;let e=[];for(let t of Ws())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(at(t))return t;return e[0]??$(ut,"..","_worker","qoder-worker-runtime.obf.mjs")}function hr(r){let e=re(r);if(at(e))return!0;let t=it(e);return t!==null&&at(t)}function Ws(){let r=[$(ut,".."),$(ut,"..","..")];return[...new Set(r)]}var yr=8192,Ys=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 ct(Ie(this.options,e))}},ct=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(!Hs(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: ${Xs(e.args)}`),this.worker=new Vs(s,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===L&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
4
4
|
`)?e:e+`
|
|
5
|
-
`;if(!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=
|
|
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=Js({input:e,crlfDelay:1/0});try{for await(let n of t){if(this.closed)break;let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}this.closed||await this.waitForWorkerExit()}finally{t.close()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??_e;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>yr&&(this.stderrTail=this.stderrTail.slice(-yr))}createWorkerError(e){return new Q(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===L))return new Q(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,n)=>{let s=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,n(a)):t()},o=i=>{if(e.off("exit",s),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,n(a)};e.once("exit",s),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function Xs(r){let e=[];for(let t=0;t<r.length;t+=1){let n=r[t];e.push(n),Ys.has(n)&&t+1<r.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}var Ke=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as Zs,mkdirSync as eo}from"fs";import{dirname as to}from"path";var ro="QODER_AGENT_SDK_DEBUG";function no(r){return r.debugFile?!0:r.debug===!0||oo(process.env[ro])}function so(r){if(r.debugFile)return r.debugFile}function oo(r){if(r===void 0)return!1;let e=r.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var Fe=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=no(e),this.debugFile=so(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let n=this.formatLine(e,t),s=this.debugFile;if(s){this.writeToFile(s,n);return}this.writeToStderr(n)}get filePath(){return this.debugFile}writeToFile(e,t){try{eo(to(e),{recursive:!0}),Zs(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let n=new Date().toISOString(),s=this.formatError(t);return`${n} ${e}${s}
|
|
6
6
|
`}formatError(e){if(e===void 0)return"";if(e instanceof Error)return`
|
|
7
|
-
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};var 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})+`
|
|
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 dt="1.2.0";function Sr(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 wr(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 vr(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 io}from"crypto";function Rr(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 ao=500,uo=1024*1024,co=6e4,lo=[200,800],Ue=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=po(e.filePath),n=mo(e.entries),s=br(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+=go(n),(this.options.flushMode==="eager"||o.entries.length>=ao||o.bytes>=uo)&&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 ho(this.options.store,e.key,t,{appendTimeoutMs:this.options.appendTimeoutMs??co,retryDelaysMs:this.options.retryDelaysMs??lo})}catch(n){this.options.diagnostics?.record(`[SessionStore] append failed for ${br(e.key)}`,n),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:n instanceof Error?n.message:String(n),key:{...e.key},uuid:io(),session_id:e.key.sessionId})}})}};function po(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:kr(o[1])};let i=kr(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 fo(c),{projectKey:s,sessionId:i,subpath:c}}function mo(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 kr(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 fo(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 br(r){return JSON.stringify([r.projectKey,r.sessionId,r.subpath??null])}function go(r){return r.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function ho(r,e,t,n){for(let s=0;;s++)try{await yo(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 yo(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 Tr(){return Math.random().toString(36).substring(2,15)}function Pr(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 Er(r,e){return{type:"control_response",response:{subtype:"success",request_id:r,response:e}}}function _r(r,e,t){return{type:"control_response",response:{subtype:"error",request_id:r,error:e,...t?{code:t}:{}}}}function Cr(r){return typeof r=="object"&&r!==null&&r.type==="control_response"}function Mr(r){return typeof r=="object"&&r!==null&&r.type==="control_request"}function Ar(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 xr(r){if(typeof r!="object"||r===null)return!1;let e=r.type;return e==="keepalive"||e==="keep_alive"}function Ir(r){return typeof r=="object"&&r!==null&&r.type==="streamlined_text"}function Or(r){return typeof r=="object"&&r!==null&&r.type==="streamlined_tool_use_summary"}function Dr(r){return typeof r=="object"&&r!==null&&r.type==="post_turn_summary"}function jr(r){return typeof r=="object"&&r!==null&&r.type==="result"}var So="<synthetic>";function wo(r){return r.type!=="assistant"||r.isApiErrorMessage===!0||r.message.model!==So?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";static GOAL_CAPABILITY="goal_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:M=>this.inputStream.enqueue(M)})),this.readLoopPromise=this.readMessages().catch(M=>{this.inputStream.error(M)}),this.initializationPromise=this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let M=this.abortController.signal;M.aborted?this.close().catch(()=>{}):M.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let 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(Rr(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(s){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",s)}continue}if(Cr(t)){this.handleControlResponse(t);continue}if(Mr(t)){this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",s)});continue}if(Ar(t)){this.handleControlCancelRequest(t);continue}if(xr(t)||Ir(t)||Or(t)||Dr(t))continue;if(jr(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=wo(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=Tr(),s=Pr(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
8
|
`)}catch(m){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",m)}},d=()=>{p&&(clearTimeout(p),p=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(n)&&(d(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${n} subtype=${i}`),f(),c(new A))};this.pendingRequests.set(n,{resolve:m=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(m)},reject:m=>{d(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${n} subtype=${i} status=error duration_ms=${Date.now()-a}`,m),c(m)}}),t?.signal?.addEventListener("abort",l,{once:!0}),o>0&&Number.isFinite(o)&&(p=setTimeout(()=>{this.pendingRequests.has(n)&&(this.pendingRequests.delete(n),d(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${n} subtype=${i} timeout_ms=${o}`),f(),c(new Error(`Control request "${oe(s.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${n} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(s)+`
|
|
9
|
-
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${n} subtype=${i}`)}catch(m){d(),this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${n} subtype=${i}`,m),c(m)}})}handleControlResponse(e){let t=e.response,n=t.request_id,s=this.pendingRequests.get(n);if(!s){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${n} status=${t.subtype}`);return}if(this.pendingRequests.delete(n),t.subtype==="success")s.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),s.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)oe(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",n)})}async handleControlRequest(e){let t=e.request_id,n=oe(e.request)??"unknown",s=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${n}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=
|
|
10
|
-
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=success duration_ms=${Date.now()-s}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=
|
|
11
|
-
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=error duration_ms=${Date.now()-s}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new A}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=
|
|
12
|
-
`),this.recordOutboundSessionMessage(i)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushMemoryBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(n=>typeof n=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new we(e)}async setPermissionMode(e){await this.request({type:"set_permission_mode",mode:e==="yolo"?"bypassPermissions":e})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(r.SIDE_QUESTION_CAPABILITY);let n=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(s=>({...s}))}:{}},{timeoutMs:0,signal:t?.signal});return n?.response==null?null:{response:n.response,synthetic:n.synthetic??!1,...n.refusal_fallback?{refusalFallback:{originalModel:n.refusal_fallback.original_model,fallbackModel:n.refusal_fallback.fallback_model,content:n.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=ko(e?.usage),n=vo(e?.session);return!t&&!n?null:{...t??{},...n?{session:n}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let n={type:"rewind_files",user_message_id:e};t?.dryRun&&(n.dry_run=!0);let o=await this.request(n);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let s={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(s.dry_run=!0),await this.request(s)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=$t(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let n=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),s=n?.requiresUserAction===!0,o=typeof n?.authUrl=="string"?n.authUrl:void 0;if(s&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return s?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if(this.initConfig.memory!==void 0&&this.initResponse?.memory?.enabled===!0&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.memoryEndInputPromise??this.flushMemory())}catch(t){this.diagnostics?.record("[QueryRunner] memory flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,n]of this.sdkMcpTransports){try{await n.close()}catch(s){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,s)}Sr(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function B(r){return typeof r=="object"&&r!==null}function dt(r){return typeof r=="number"&&Number.isFinite(r)}function lt(r){return Object.keys(r).length>0}function N(r,e,t){let n=e[t];dt(n)&&(r[t]=n)}function ie(r,e,t){let n=e[t];typeof n=="string"&&(r[t]=n)}function Le(r,e,t){let n=e[t];typeof n=="boolean"&&(r[t]=n)}function jr(r){if(!B(r)||Array.isArray(r))return;let e={};return N(e,r,"total"),N(e,r,"used"),N(e,r,"remaining"),N(e,r,"percentage"),ie(e,r,"unit"),lt(e)?e:void 0}function So(r){if(!B(r)||Array.isArray(r))return;let e=jr(r)??{};return ie(e,r,"detailUrl"),lt(e)?e:void 0}function wo(r){if(!B(r)||Array.isArray(r))return;let e={};return N(e,r,"used"),N(e,r,"cap"),N(e,r,"remaining"),N(e,r,"percentage"),Le(e,r,"available"),ie(e,r,"unit"),lt(e)?e:void 0}function vo(r){if(!B(r)||Array.isArray(r))return;let e=r.total_credits,t=r.model_usage;if(!dt(e)||e<0||!B(t)||Array.isArray(t))return;let n={};for(let[s,o]of Object.entries(t)){if(!B(o)||Array.isArray(o))continue;let i=o.credits;dt(i)&&i>=0&&(n[s]={credits:i})}return{total_credits:e,model_usage:n}}function ko(r){if(!B(r)||Array.isArray(r))return null;let e={};ie(e,r,"userId"),ie(e,r,"userType"),N(e,r,"totalUsagePercentage"),Le(e,r,"isHighestTier"),N(e,r,"expiresAt"),ie(e,r,"upgradeUrl"),Le(e,r,"isQuotaExceeded"),Le(e,r,"isPlanQuotaProrated");let t=jr(r.userQuota);t&&(e.userQuota=t);let n=So(r.addOnQuota);n&&(e.addOnQuota=n);let s=wo(r.orgResourcePackage);return s&&(e.orgResourcePackage=s),e}function bo(r){let e=r instanceof Error?r.message:String(r),t=typeof r=="object"&&r!==null?r.code:void 0,n=typeof t=="string"&&t.length>0?t:void 0,s=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(s){let o=n??s[1];return(!n||n===s[1])&&(e=s[2]||e),{error:e,code:o}}return n?{error:e,code:n}:{error:e}}function Dr(r){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(r);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var Qe=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Nr}from"crypto";var Ro="QODER_CLOUD_AGENT_API_BASE",To="https://api.qoder.com/api/v1/cloud",K={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Po=1024,Kr=1*1024*1024,Fr=4*1024*1024,Eo=8*1024,mt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},Be=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},ft=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},_o=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function $r(r){if(!r.experimentalCloudAgent)return;let e=Object.keys(r).filter(o=>r[o]!==void 0&&!_o.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(r.auth?.type!=="accessToken")throw new Be;let{agent:t,session:n}=r.experimentalCloudAgent;if(t&&ae(t)&&pt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&ae(n)&&pt(n))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(n&&ae(n)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let s=!!n&&ae(n);if(!s&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!s){if(!n||!pt(n))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof n.create.environment_id!="string"||n.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function ae(r){return"id"in r&&r.id!==void 0}function pt(r){return"create"in r&&r.create!==void 0}function Qr(r){return new gt(r)}var gt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=$o();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Lr();latestModelUsage={};totalCostUsd=0;postedMessages=0;activeInputStreams=0;idleSeen=!1;resultEmitted=!1;constructor(e){if(!e.options.experimentalCloudAgent)throw new Error("options.experimentalCloudAgent is required for CloudAgentQuery.");this.experimentalCloudAgent=e.options.experimentalCloudAgent,this.diagnostics=e.diagnostics,this.onAuthExpired=e.options.onAuthExpired,this.accessToken=Mo(e.options.auth,e.options.env),this.apiBase=Co(),this.inputStream=new se(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(n=>{this.sseConnected.reject(n),this.closed||this.inputStream.error(n)}),this.streamInput(qo(e.prompt)).catch(n=>{this.closed||this.inputStream.error(n)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let n=Uo(t);this.beginPendingTurn();let s=await this.postSessionEvents([{type:K.userMessage,content:n}]);this.postedMessages+=1,this.activateTurn(s.find(o=>o.type===K.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:K.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&ae(e))t=e.id;else{let n=await this.resolveAgentId(),s=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:n,...xo(s)}});t=Ur(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(ae(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Ao(e.create)});return Ur(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let n=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==n&&(t=0),t+=1,await Lo(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),n=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;n&&t.searchParams.set("after_id",n),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let s=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await qr(s);if(!s.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(s.body)}async readSseBody(e){let t=e.getReader(),n=new TextDecoder,s="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){s+=n.decode(),s.length>0&&this.consumeSseLine(s,o);break}s+=n.decode(a,{stream:!0});let u;for(;(u=s.indexOf(`
|
|
13
|
-
`))!==-1;){let c=s.slice(0,u);s=s.slice(u+1);let p=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(p,o),this.closed)break}s.length>
|
|
14
|
-
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let n=e.indexOf(":"),s=n===-1?e:e.slice(0,n),o=n===-1?"":e.slice(n+1);switch(o.startsWith(" ")&&(o=o.slice(1)),s){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>
|
|
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===`
|
|
9
|
+
`),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${n} subtype=${i}`)}catch(m){d(),this.pendingRequests.delete(n),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${n} subtype=${i}`,m),c(m)}})}handleControlResponse(e){let t=e.response,n=t.request_id,s=this.pendingRequests.get(n);if(!s){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${n} status=${t.subtype}`);return}if(this.pendingRequests.delete(n),t.subtype==="success")s.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),s.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)oe(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(n=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",n)})}async handleControlRequest(e){let t=e.request_id,n=oe(e.request)??"unknown",s=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${n}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=Er(t,i);this.transport.write(JSON.stringify(a)+`
|
|
10
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=success duration_ms=${Date.now()-s}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=To(i),c=_r(t,a,u);this.transport.write(JSON.stringify(c)+`
|
|
11
|
+
`),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${n} status=error duration_ms=${Date.now()-s}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new A}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,n=dt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${n}. Consider upgrading qodercli for the version handshake.`);return}let s=Nr(t),o=Nr(n);if(!s||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${n}"; skipping handshake.`);return}if(s.major!==o.major)throw new Se(t,n);s.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${n}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new A;return new Promise((n,s)=>{let o=()=>{s(new A)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),n(i)},i=>{t.removeEventListener("abort",o),s(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let n=e.request,s=oe(n),o=n;switch(s){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,p=o.blocked_path,f=o.decision_reason,d=o.title,l=o.display_name,m=o.description,S=o.agent_id,g=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:p,decisionReason:f,title:d,displayName:l,description:m,toolUseID:u,agentID:S}),t);if(g.behavior==="deny"&&!g.message)throw new Error("Permission deny result must include a message.");return g.behavior==="allow"?{...g,updatedInput:g.updatedInput??a,toolUseID:u}:{...g,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(Sr(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,p=new Promise((S,g)=>{c=setTimeout(()=>{g(new ye(a))},a)}),f;try{f=await this.awaitAbortable(Promise.race([u,p]),t)}finally{clearTimeout(c)}let d={type:"get_model_policy",model:typeof f.model=="string"?f.model:f.model.model,parameters:f.parameters};if(typeof f.model!="string"){let{model:S,...g}=f.model;d.custom_model={...g,style:g.style??"openai"}}let l=f.taskId?.trim();l&&(d.task_id=l);let m=f.subTask?.trim();return m&&(d.sub_task=m),d}default:throw new Error(`Unhandled control request subtype: ${s??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,initializeTimeoutMs:r.INITIALIZE_TIMEOUT_MS},t={};for(let[s,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let p=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(p,c),p});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[s]=i)}Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let n=await this.request(e,{timeoutMs:r.INITIALIZE_TIMEOUT_MS});if(n&&typeof n=="object"){let s=n;this.initResponse=s,this.cliCapabilities=new Set(s.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");return this.initResponse}async invokeRegisteredHookCallback(e,t,n,s){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,n,{signal:s}),s)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let n of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(n,"custom_context")?n.custom_context:this.initConfig.customContext,i=o===void 0?n:{...n,custom_context:o};o!==void 0&&!this.cliCapabilities?.has(r.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(i)+`
|
|
12
|
+
`),this.recordOutboundSessionMessage(i)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushMemoryBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(n=>typeof n=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(r.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(r.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(r.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(r.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!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=Ro(e?.usage),n=bo(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=Qt(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)}vr(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 lt(r){return typeof r=="number"&&Number.isFinite(r)}function pt(r){return Object.keys(r).length>0}function N(r,e,t){let n=e[t];lt(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 Kr(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"),pt(e)?e:void 0}function vo(r){if(!B(r)||Array.isArray(r))return;let e=Kr(r)??{};return ie(e,r,"detailUrl"),pt(e)?e:void 0}function ko(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"),pt(e)?e:void 0}function bo(r){if(!B(r)||Array.isArray(r))return;let e=r.total_credits,t=r.model_usage;if(!lt(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;lt(i)&&i>=0&&(n[s]={credits:i})}return{total_credits:e,model_usage:n}}function Ro(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=Kr(r.userQuota);t&&(e.userQuota=t);let n=vo(r.addOnQuota);n&&(e.addOnQuota=n);let s=ko(r.orgResourcePackage);return s&&(e.orgResourcePackage=s),e}function To(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 Nr(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 Fr}from"crypto";var Po="QODER_CLOUD_AGENT_API_BASE",Eo="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"},_o=1024,Ur=1*1024*1024,qr=4*1024*1024,Co=8*1024,ft=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"}},gt=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}},Mo=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Br(r){if(!r.experimentalCloudAgent)return;let e=Object.keys(r).filter(o=>r[o]!==void 0&&!Mo.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)&&mt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(n&&ae(n)&&mt(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||!mt(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 mt(r){return"create"in r&&r.create!==void 0}function Gr(r){return new ht(r)}var ht=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Bo();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Qr();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=Ao(e.options.auth,e.options.env),this.apiBase=xo(),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($o(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=Lo(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,...Oo(s)}});t=Lr(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:Io(e.create)});return Lr(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 Qo(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 $r(s);if(!s.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(s.body)}async readSseBody(e){let t=e.getReader(),n=new TextDecoder,s="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){s+=n.decode(),s.length>0&&this.consumeSseLine(s,o);break}s+=n.decode(a,{stream:!0});let u;for(;(u=s.indexOf(`
|
|
13
|
+
`))!==-1;){let c=s.slice(0,u);s=s.slice(u+1);let p=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(p,o),this.closed)break}s.length>Ur&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Ur} 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:No(t.data.join(`
|
|
14
|
+
`))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let n=e.indexOf(":"),s=n===-1?e:e.slice(0,n),o=n===-1?"":e.slice(n+1);switch(o.startsWith(" ")&&(o=o.slice(1)),s){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>qr){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${qr} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(o),t.dataBytes+=o.length;break}}handleSseEvent(e){if(this.closed)return;let t=x(e.data,"type")??e.event,n=x(e.data,"turn_id"),s={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Fr(),session_id:this.sessionId??x(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(s),!this.isCurrentTurnEvent(n)){this.bufferPendingTurnEvent(e,t,n);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case K.agentMessage:{let n=Fo(ve(e.data,"content"));n&&this.assistantTextParts.push(n);return}case K.modelRequestEnd:this.captureUsage(e.data);return;case K.idle:this.idleSeen=!0,this.finishIfIdle();return;case K.error:this.emitErrorResult(e),this.finish();return;case K.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Qr(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let n of t)if(this.isCurrentTurnEvent(n.turnId)&&this.handleCurrentTurnEvent(n.event,n.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,n){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=_o&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:n}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(x(e.data,"error")??x(Ge(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:Fr(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,n=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return Do(n)}captureUsage(e){let t=Ge(e,"usage");if(!t)return;this.latestUsage=Uo(this.latestUsage,t);let n=E(e,"total_cost_usd")??E(e,"cost_usd")??E(t,"total_cost_usd")??E(t,"cost_usd");n!==void 0&&(this.totalCostUsd+=n);let s=x(e,"model")??x(t,"model");if(s){let o=this.latestModelUsage[s]?.costUSD??0;this.latestModelUsage[s]=qo(this.latestUsage,o+(n??0))}}async requestJson(e,t){let n=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!n.ok)throw this.handleAuthFailure(n.status),await $r(n);if(n.status===204)return{};try{return await n.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Ao(r,e){if(r?.type!=="accessToken")throw new Be;if(typeof r.accessToken=="string")return r.accessToken;let t=r.accessToken.envVar,n=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!n)throw new ft(t);return n}function xo(){return process.env[Po]?.replace(/\/+$/,"")??Eo}function Io(r){return yt({name:r.name,model:r.model,system:r.system,description:r.description,tools:r.tools,mcp_servers:r.mcp_servers,skills:r.skills,metadata:r.metadata})}function Oo(r){return yt({title:r.title,environment_id:r.environment_id,resources:r.resources?.map(e=>yt({...e})),vault_ids:r.vault_ids,memory_store_ids:r.memory_store_ids})}function yt(r){return Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0))}function Lr(r,e){let t=x(r,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Do(r){let e=Ko(r,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:x(t,"id"),turnId:x(t,"turn_id"),type:x(t,"type")}]):[]}async function $r(r){let e=await jo(r,Co);return new gt(r.status,e||r.statusText||"unknown error")}async function jo(r,e){if(!r.body)try{return(await r.text()).slice(0,e)}catch{return""}let t=r.body.getReader(),n=new TextDecoder,s=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,s.push(n.decode(a,{stream:!0}))}s.push(n.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return s.join("").slice(0,e)}function No(r){if(r.length===0)return{};try{return JSON.parse(r)}catch{return r}}function Ge(r,e){let t=ve(r,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function Ko(r,e){let t=ve(r,e);return Array.isArray(t)?t:void 0}function x(r,e){let t=ve(r,e);return typeof t=="string"?t:void 0}function E(r,e){let t=ve(r,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ve(r,e){if(!(r===null||typeof r!="object"||Array.isArray(r)))return r[e]}function Fo(r){return typeof r=="string"?r:Array.isArray(r)&&r.map(t=>zr(t)?t.text:"").filter(Boolean).join("")||void 0}function Uo(r,e){let t=Ge(e,"cache_creation"),n=Ge(e,"server_tool_use");return{...r,cache_creation:{ephemeral_1h_input_tokens:E(t,"ephemeral_1h_input_tokens")??r.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:E(t,"ephemeral_5m_input_tokens")??r.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:E(e,"cache_creation_input_tokens")??r.cache_creation_input_tokens,cache_read_input_tokens:E(e,"cache_read_input_tokens")??r.cache_read_input_tokens,input_tokens:E(e,"input_tokens")??r.input_tokens,output_tokens:E(e,"output_tokens")??r.output_tokens,server_tool_use:{web_fetch_requests:E(n,"web_fetch_requests")??r.server_tool_use.web_fetch_requests,web_search_requests:E(n,"web_search_requests")??r.server_tool_use.web_search_requests}}}function qo(r,e){return{inputTokens:r.input_tokens,outputTokens:r.output_tokens,cacheReadInputTokens:r.cache_read_input_tokens,cacheCreationInputTokens:r.cache_creation_input_tokens,webSearchRequests:r.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function Lo(r){let e=r.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>zr(t)?t.text:JSON.stringify(t)).join(`
|
|
15
|
+
`):JSON.stringify(e)}function zr(r){return r!==null&&typeof r=="object"&&"type"in r&&r.type==="text"&&"text"in r&&typeof r.text=="string"}function $o(r){return typeof r!="string"?r:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:r}]},parent_tool_use_id:null}}()}function Qr(){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 Qo(r,e){e.aborted||await new Promise(t=>{let n=setTimeout(t,r);e.addEventListener("abort",()=>{clearTimeout(n),t()},{once:!0})})}function Bo(){let r,e;return{promise:new Promise((n,s)=>{r=n,e=s}),resolve:r,reject:e}}import{access as Xo,chmod as Xr,cp as Zo,mkdtemp as ei,mkdir as Zr,realpath as ti,rm as Jr,writeFile as ri}from"fs/promises";import{homedir as ni,tmpdir as si}from"os";import{dirname as oi,isAbsolute as en,join as G,relative as ii,resolve as St,sep as ai}from"path";import{homedir as Go}from"os";import{join as Hr}from"path";var zo=w.configDirName,Wo=w.cliHomeEnv,Ho=w.configDirEnv,Wr=200;function Jo(){return process.env[Wo]||Go()}function Vo(){let r=process.env[Ho];return r||Hr(Jo(),zo)}function ue(){return Hr(Vo(),"projects")}function Yo(r){let e=5381;for(let t=0;t<r.length;t++)e=e*33^r.charCodeAt(t);return e}function _(r){let e=r.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Wr)return e;let t=Math.abs(Yo(r)).toString(36);return`${e.slice(0,Wr)}-${t}`}var ui=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ci=6e4;async function tn(r){if(r.resume===void 0&&!r.continue)return;let e=_(await pi(r.cwd)),t=r.loadTimeoutMs??ci,n=r.resume!==void 0?r.resume:await mi(r.store,e,t);if(n===void 0||!ui.test(n))return;let s={projectKey:e,sessionId:n},o=await Vr(r.store,s,t);if(!o)return;let i=r.store.listSubkeys?await wt(r.store.listSubkeys(s),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!gi(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let p=await Vr(r.store,{...s,subpath:c},t);p&&a.push({subpath:c,entries:p})}let u;try{u=await ei(G(si(),"qoder-session-store-")),await Xr(u,448),await li(di(r.env),u);let c=G(u,"projects",e),p=G(c,n);await Zr(c,{recursive:!0,mode:448}),await Yr(G(c,`${n}.jsonl`),o);for(let{subpath:d,entries:l}of a){let m=hi(p,`${d}.jsonl`),S=l.filter(h=>h.type==="agent_metadata"),g=l.filter(h=>h.type!=="agent_metadata");if(g.length>0&&await Yr(m,g),S.length>0){let h={...S.at(-1)};delete h.type,await rn(m.slice(0,-6)+".meta.json",JSON.stringify(h))}}let f=u;return{configDir:f,projectKey:e,sessionId:n,cleanup:async()=>{await Jr(f,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await Jr(u,{recursive:!0,force:!0}),c}}function di(r){let e=r?.[w.cliHomeEnv]??process.env[w.cliHomeEnv]??ni();return St(r?.[w.configDirEnv]??process.env[w.configDirEnv]??G(e,w.configDirName))}async function li(r,e){for(let t of[".auth","oauth_creds.json"]){let n=G(r,t);try{await Xo(n),await Zo(n,G(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(s){if(s.code!=="ENOENT")throw s}}}async function pi(r){let e=St(r??process.cwd());try{return await ti(e)}catch{return e}}async function mi(r,e,t){if(!r.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let n=await wt(r.listSessions(e),t,"listSessions");if(!Array.isArray(n))throw new Error("SessionStore listSessions() must return an array");return n.slice().sort((s,o)=>o.mtime-s.mtime)[0]?.sessionId}async function Vr(r,e,t){let n=await wt(r.load({...e}),t,"load");if(!(n===null||n.length===0)){if(!Array.isArray(n))throw new Error("SessionStore load() must return an array or null");return n.map((s,o)=>fi(s,o))}}function fi(r,e){if(r===null||typeof r!="object"||typeof r.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(r);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function gi(r){return!(typeof r!="string"||!r||r.includes("\0")||r.includes("\\")||en(r)||/^[a-z]:/i.test(r)||r.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function hi(r,e){let t=St(r,e),n=ii(r,t);if(n===""||n===".."||n.startsWith(`..${ai}`)||en(n))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Yr(r,e){let t=e.map(n=>JSON.stringify(n)).join(`
|
|
16
|
+
`);await rn(r,t?`${t}
|
|
17
|
+
`:"")}async function rn(r,e){await Zr(oi(r),{recursive:!0,mode:448}),await ri(r,e,{encoding:"utf8",mode:384}),await Xr(r,384)}async function wt(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 yi=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Si(r){let e=r.replace(/\\/g,"/").split("/").at(-1)??"";return yi.test(e)}function ze(r,e,t=process.env){let n=r.pathToQoderCLIExecutable;return n?Si(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 nn 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 wi(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(nn.posix.isAbsolute(s)||nn.win32.isAbsolute(n.indexFile)||s.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function vi(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 sn(r){if(r===void 0)return{};if(!r||typeof r!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(r))throw new TypeError("options.memory must be an object");if(Object.keys(r).length===0)return{};if(r.mode!=="native"&&r.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(r.projectScope!==void 0&&typeof r.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(r.userScope!==void 0&&typeof r.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(r.mode==="native"){if(r.projectScope===!1&&r.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(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",...r.projectScope!==void 0?{projectScope:r.projectScope}:{},...r.userScope!==void 0?{userScope:r.userScope}:{}},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");wi(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(vi(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,...r.projectScope!==void 0?{projectScope:r.projectScope}:{},...r.userScope!==void 0?{userScope:r.userScope}:{},generation:t,consumption:s},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n?.onResult,onConsumptionResult:o?.onResult}}}var vt=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 ki(r){if(r.transport!==void 0){if(ar(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=ze(r,ge);return e.transport==="worker"?new ne({pathToQoderWorkerRuntime:e.pathToQoderWorkerRuntime}):ee.default}function kt(r){let{prompt:e,options:t={}}=r,n=ki(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 vt;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 Br(t),Gr({prompt:e,options:t,diagnostics:s});let i=sn(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 Kt=new Qe(Ee=>{wr(v,Ee,l)});d.set(v,Kt),V.connect(Kt).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,M=o?.type==="serviceAccount"?o.fetchServiceAccountToken:void 0,b={pathToQoderCLIExecutable:y,executable:t.executable,executableArgs:t.executableArgs,env:T,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,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 tn({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 qn=typeof e=="string",J=t.systemPrompt,jt,Nt;if(typeof J=="string")jt=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)}`);Nt=v.append}let Ln={systemPrompt:jt,appendSystemPrompt:Nt,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,qn,t.canUseTool,t.hooks,t.abortController,f,Ln,t.onElicitation,s,p,t.controlRequestTimeoutMs,d,l,P,t.resolveModel,t.resolveModelTimeoutMs,t.sessionStore,t.sessionStoreFlush??"batched",g,M,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 bt=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}}},Rt=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 bi(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 bt,n=kt({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 Rt(n,t)}catch(o){throw t.discard(),await n.close(),o}finally{s!==void 0&&clearTimeout(s)}}import{readFile as Ri}from"node:fs/promises";import Ti from"node:os";import I from"node:path";var Pi=["user","project","local"],Et=new Set(["__proto__","constructor","prototype"]),Ei=/^[\p{L}\p{N}\p{M}._ -]+$/u,_i=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Ci=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Mi=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Ai=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(r){if(r===null||typeof r!="object"||Array.isArray(r))return!1;let e=Object.getPrototypeOf(r);return e===Object.prototype||e===null}function xi(r){let e=r.charCodeAt(0)===65279?r.slice(1):r,t="",n=!1,s=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
|
|
18
18
|
`||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){u==="*"&&c==="/"?(i=!1,t+=" ",a+=1):t+=u===`
|
|
19
|
-
`||u==="\r"?u:" ";continue}if(n){t+=u,s?s=!1:u==="\\"?s=!0:u==='"'&&(n=!1);continue}u==='"'?(n=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function
|
|
20
|
-
`)){let n=t.trim();if(n)try{let s=JSON.parse(n);
|
|
21
|
-
`)){let s=n.trim();if(s)try{let o=JSON.parse(s);if(!
|
|
22
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)n.push(R(e,await
|
|
23
|
-
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return
|
|
24
|
-
`).filter(Boolean))try{let f=JSON.parse(p);
|
|
25
|
-
`)}function
|
|
26
|
-
`," ").trim();if(!i)continue;let a=
|
|
27
|
-
`);return}catch{continue}}throw new Error(`Session ${r} not found`)}async function
|
|
28
|
-
`);return}catch{continue}}throw new Error(`Session ${r} not found`)}async function
|
|
29
|
-
`))if(n.trim())try{t.push(JSON.parse(n))}catch{}return
|
|
30
|
-
`).trim();if(o)return o}}function
|
|
31
|
-
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=
|
|
19
|
+
`||u==="\r"?u:" ";continue}if(n){t+=u,s?s=!1:u==="\\"?s=!0:u==='"'&&(n=!1);continue}u==='"'?(n=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Ii(r,e){let t;try{t=JSON.parse(xi(r))}catch(n){let s=n instanceof Error?n.message:String(n);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 We(t)}function de(r){return Array.isArray(r)?r.map(de):z(r)?We(r):r}function We(r){let e={};for(let[t,n]of Object.entries(r))Et.has(t)||n===void 0||(e[t]=de(n));return e}function Oi(r){let e=r.join(".");if(Mi.has(e)||r.length===2&&r[0]==="providers")return"shallow";if(Ai.has(e))return"union";if(r.length===2&&r[0]==="hooks")return"concat"}function Pt(r,e,t=[]){for(let[n,s]of Object.entries(e)){if(Et.has(n)||s===void 0)continue;let o=[...t,n],i=r[n],a=Oi(o);if(a==="shallow"&&i&&s){let u={};z(i)&&Object.assign(u,We(i)),z(s)&&Object.assign(u,We(s)),r[n]=u;continue}if(Array.isArray(i)){let u=Array.isArray(s)?s:[s];if(a==="concat"){r[n]=[...i.map(de),...u.map(de)];continue}if(a==="union"){r[n]=[...new Set([...i,...u])].map(de);continue}}if(z(i)&&z(s))Pt(i,s,o);else if(z(s)){let u={};Pt(u,s,o),r[n]=u}else r[n]=de(s)}}function Di(r){let e=r?.[w.configDirNameEnv];if(e===void 0||e==="")return{user:w.configDirName,project:w.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!Ei.test(t)||_i.test(t))throw new Error(`${w.configDirNameEnv} must be a valid directory name`);if(Ci.has(t.toLowerCase()))throw new Error(`${w.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function Tt(r,e){let t;try{t=await Ri(e,"utf8")}catch(n){if(n.code==="ENOENT")return;throw n}return{source:r,path:I.resolve(e),settings:Ii(t,I.resolve(e))}}async function ji(r={}){let e=I.resolve(r.cwd??process.cwd()),t=process.env,n=Di(t),s=t[w.cliHomeEnv]??t.GEMINI_CLI_HOME,o=s?I.resolve(e,s):Ti.homedir(),i=t[w.configDirEnv]?I.resolve(e,t[w.configDirEnv]):I.join(o,n.user),a=I.join(e,n.project),u=new Set(r.settingSources??Pi),c=I.resolve(o)===e,p=[];if(u.has("user")){let l=await Tt("user",I.join(i,"settings.json"));l&&p.push(l)}if(u.has("project")&&!c){let l=await Tt("project",I.join(a,"settings.json"));l&&p.push(l)}if(u.has("local")&&!c){let l=await Tt("local",I.join(a,"settings.local.json"));l&&p.push(l)}let f={},d={};for(let l of p){Pt(f,l.settings);for(let m of Object.keys(l.settings))Et.has(m)||(d[m]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:f,provenance:d,sources:p}}import{McpServer as Ni}from"@modelcontextprotocol/sdk/server/mcp.js";function Ki(r){if(!r.name||typeof r.name!="string"||r.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Ni({name:r.name,version:r.version??"1.0.0"},{capabilities:{tools:r.tools&&r.tools.length>0?{}:void 0}}),t=[];if(r.tools&&r.tools.length>0)for(let n of r.tools){if(!n.name||typeof n.name!="string"||n.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${r.name}".`);if(!n.description||typeof n.description!="string")throw new Error(`[createSdkMcpServer] Tool "${n.name}" must have a non-empty description string.`);et(r.name,{name:n.name,exposedName:n.exposedName,alwaysLoad:n.alwaysLoad}),(n.exposedName!==void 0||n.alwaysLoad!==void 0||n.permissionPolicy!==void 0)&&t.push({name:n.name,...n.exposedName!==void 0?{exposedName:n.exposedName}:{},...n.alwaysLoad!==void 0?{alwaysLoad:n.alwaysLoad}:{},...n.permissionPolicy!==void 0?{permission_policy:n.permissionPolicy}:{}});try{e.registerTool(n.name,{description:n.description,inputSchema:n.inputSchema,...n.annotations?{annotations:n.annotations}:{}},n.handler)}catch(s){throw s instanceof Error&&s.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${n.name}" in server "${r.name}". Each tool name must be unique within a server.`):s}}return{type:"sdk",name:r.name,instance:e,...t.length>0?{tools:t}:{}}}function Fi(r,e,t,n,s){return{name:r,description:e,inputSchema:t,handler:n,annotations:s?.annotations,...s?.exposedName!==void 0?{exposedName:s.exposedName}:{},...s?.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s?.permissionPolicy!==void 0?{permissionPolicy:s.permissionPolicy}:{}}}import{readdir as _t,readFile as Je,stat as le,appendFile as gn,realpath as Ui,rm as on}from"fs/promises";import{basename as qi,join as R,resolve as an}from"path";import{execFile as Li}from"child_process";import{randomUUID as hn}from"crypto";import{promisify as $i}from"util";var Qi=$i(Li),Bi=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Gi=new Set(["user","assistant","system","progress","attachment"]);function C(r){return r!==null&&typeof r=="object"}function W(r){return Bi.test(r)}function un(r){let e=[];for(let t of r.split(`
|
|
20
|
+
`)){let n=t.trim();if(n)try{let s=JSON.parse(n);C(s)&&typeof s.uuid=="string"&&typeof s.type=="string"&&Gi.has(s.type)&&e.push(s)}catch{}}return e}function cn(r,e){let t;for(let n of r.split(`
|
|
21
|
+
`)){let s=n.trim();if(s)try{let o=JSON.parse(s);if(!C(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 He(r){if(!C(r.message))return[];let e=r.message.content;return Array.isArray(e)?e:[]}var zi=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Wi(r){return typeof r=="string"&&zi.has(r)?r:void 0}function Ct(r){if(r.type!=="user")return;let e=He(r).filter(o=>C(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(r.toolDenialKind)?r.toolDenialKind:e.length===1?[r.toolDenialKind]:[],n=Array.isArray(r.userFeedback)?r.userFeedback:e.length===1?[r.userFeedback]:[],s=e.flatMap((o,i)=>{let a=Wi(t[i]);if(!a)return[];let u=n[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return s.length>0?s:void 0}function be(r){if(r.type!=="assistant"||!C(r.message))return;let e=r.message.id;return typeof e=="string"&&e?e:void 0}function yn(r){return r.type!=="user"||!r.parentUuid?!1:He(r).some(e=>C(e)&&e.type==="tool_result")}function Hi(r){if(!C(r.message))return null;let e=r.message.id;return typeof e=="string"&&e.length>0?e:null}function Ji(r,e){let t=new Map;for(let[n,s]of r){let o=Hi(s);if(o){let i=t.get(o);i?i.push(n):t.set(o,[n])}}for(let[n,s]of r){let o=Vi(s,s.parentUuid,r,t,e);o!==s.parentUuid&&r.set(n,{...s,parentUuid:o})}}function Vi(r,e,t,n,s){if(!e||t.has(e))return e;let o=n.get(e);return!o||o.length===0?e:o.length===1?o[0]:Yi(r,o,t)??Xi(r,o,t,s)??e}function Yi(r,e,t){if(!yn(r))return;let n=He(r).filter(o=>C(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(n.length===0)return;let s=e.filter(o=>{let i=t.get(o);return i?He(i).some(a=>C(a)&&a.type==="tool_use"&&n.includes(typeof a.id=="string"?a.id:"")):!1});return s.length===1?s[0]:void 0}function Xi(r,e,t,n){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(n.get(o.uuid)??-1)<(n.get(r.uuid)??-1)).at(-1)?.uuid}function Zi(r){for(let e of r.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,n=t?.headUuid,s=t?.anchorUuid,o=t?.tailUuid;if(!n||!s||!o)continue;let i=r.get(n);i&&r.set(n,{...i,parentUuid:s});for(let[a,u]of r)a!==n&&u.parentUuid===s&&r.set(a,{...u,parentUuid:o})}}function dn(r,e,t){let n=(r.timestamp??"").localeCompare(e.timestamp??"");return n!==0?n:(t.get(r.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function ea(r,e,t){let n=e.filter(d=>d.type==="assistant");if(n.length===0)return e;let s=new Map,o=0;for(let d of r.keys())s.set(d,o++);let i=new Map;for(let d of n){let l=be(d);l&&i.set(l,d)}let a=new Map,u=new Map;for(let d of r.values()){let l=be(d);if(l){let m=a.get(l)??[];m.push(d),a.set(l,m);continue}if(yn(d)&&d.parentUuid){let m=u.get(d.parentUuid)??[];m.push(d),u.set(d.parentUuid,m)}}let c=new Set,p=new Map;for(let d of n){let l=be(d);if(!l||c.has(l))continue;c.add(l);let m=a.get(l)??[d],S=m.filter(b=>!t.has(b.uuid)),g=[];for(let b of m){let H=u.get(b.uuid)??[];for(let fe of H)t.has(fe.uuid)||g.push(fe)}if(S.length===0&&g.length===0)continue;let h=i.get(l);if(!h)continue;let k=[...m].sort((b,H)=>dn(b,H,s));g.sort((b,H)=>dn(b,H,s));let y=k.findIndex(b=>b.uuid===h.uuid),T=k.slice(0,Math.max(y,0)).filter(b=>!t.has(b.uuid)),P=k.slice(y+1).filter(b=>!t.has(b.uuid)),M=[...T,...P,...g];for(let b of M)t.add(b.uuid);p.set(h.uuid,M)}if(p.size===0)return e;let f=[];for(let d of e){let l=p.get(d.uuid);if(l){let m=s.get(d.uuid)??Number.MAX_SAFE_INTEGER,S=[],g=[];for(let h of l)(d.type==="assistant"&&h.type==="assistant"&&be(h)===be(d)&&(s.get(h.uuid)??Number.MAX_SAFE_INTEGER)<m?S:g).push(h);f.push(...S,d,...g)}else f.push(d)}return f}function ln(r,e){if(r.length===0)return[];let t=new Map,n=new Map;for(let[u,c]of r.entries())t.set(c.uuid,c),n.set(c.uuid,u);Zi(t),Ji(t,n);let s;if(e?.leafUuid===null)return[];if(e){let u=t.get(e.leafUuid),c=u?.sessionId??u?.session_id;u&&(c===void 0||c===e.sessionId)&&(s=u)}if(!s){let u=new Set;for(let l of t.values())l.parentUuid&&u.add(l.parentUuid);let c=Array.from(t.values()).filter(l=>!u.has(l.uuid)),p=[];for(let l of c){let m=l,S=new Set;for(;m&&!S.has(m.uuid);){if(S.add(m.uuid),m.type==="user"||m.type==="assistant"){p.push(m);break}m=m.parentUuid?t.get(m.parentUuid):void 0}}if(p.length===0)return[];let f=p.filter(l=>!l.isSidechain&&!l.teamName&&!l.isMeta);s=(f.length>0?f:p).reduce((l,m)=>(n.get(m.uuid)??-1)>(n.get(l.uuid)??-1)?m:l)}let o=[],i=new Set,a=s;for(;a&&!i.has(a.uuid);)i.add(a.uuid),o.push(a),a=a.parentUuid?t.get(a.parentUuid):void 0;return o.reverse(),ea(t,o,i)}function pn(r,e){let t=r.type==="user"||r.type==="assistant",n=e&&r.type==="system";return!(!t&&!n||r.isMeta||r.isSidechain||r.teamName)}function ta(r){if(!r)return;let e=r.preservedSegment,t={trigger:r.trigger,pre_tokens:r.preTokens??r.pre_tokens,post_tokens:r.postTokens??r.post_tokens,messages_summarized:r.messagesSummarized??r.messages_summarized,duration_ms:r.durationMs??r.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function Mt(r){return r.type==="assistant"&&r.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function At(r){return r.type==="user"&&r.toolUseResult!==void 0?{tool_use_result:r.toolUseResult}:{}}function mn(r){let e=r.type==="system"?ta(r.compactMetadata):void 0,t=Ct(r);return{type:r.type,uuid:r.uuid,session_id:r.sessionId??r.session_id??"",message:r.message,parent_tool_use_id:null,parent_agent_id:null,...Mt(r),...At(r),...t?{tool_result_meta:t}:{},...typeof r.timestamp=="string"&&r.timestamp.length>0?{timestamp:r.timestamp}:{},...r.type==="system"&&r.subtype?{subtype:r.subtype}:{},...e?{compact_metadata:e}:{}}}function fn(r,e){let t=Math.max(0,e?.offset??0),n=e?.limit;return n!==void 0&&n>0?r.slice(t,t+n):t>0?r.slice(t):r}async function Ve(r){try{return await Ui(an(r))}catch{return an(r)}}async function ra(r){return _(await Ve(r))}async function F(r){let e=ue();if(r?.dir){let t=await Ve(r.dir),n=[R(e,_(t))];if(r.includeWorktrees!==!1)try{let{stdout:s}=await Qi("git",["worktree","list","--porcelain"],{cwd:r.dir}),o=s.split(`
|
|
22
|
+
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)n.push(R(e,await ra(i)))}catch{}return n}try{return(await _t(e,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>R(e,n.name))}catch{return[]}}async function Sn(r){try{let[e,t]=await Promise.all([Je(r,"utf-8"),le(r)]),n=e.trim().split(`
|
|
23
|
+
`).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return C(i)?[i]:[]}catch{return[]}});if(n.length===0)return null;let s=qi(r,".jsonl");return xt(s,n,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function wn(r,e){return R(r,e,"subagents")}function vn(r){if(typeof r!="object"||r===null)return!1;let e=r;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function kn(r){let e=[];async function t(n){let s;try{s=await _t(n,{withFileTypes:!0})}catch{return}for(let o of s){let i=R(n,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(r),e}async function na(r){try{let e=await Je(r.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function bn(r){if(r.length===0)return[];let e=new Map(r.map(i=>[i.uuid,i])),t=r[r.length-1],n=[],s=new Set,o=t;for(;o&&!s.has(o.uuid);)s.add(o.uuid),n.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return n.reverse()}async function sa(r,e,t){let[n,s]=await Promise.all([Je(r,"utf-8"),na(r)]),o=[];for(let p of n.trim().split(`
|
|
24
|
+
`).filter(Boolean))try{let f=JSON.parse(p);vn(f)&&o.push(f)}catch{}let a=bn(o).map(p=>{let f=Ct(p);return{type:p.type,uuid:p.uuid,session_id:p.sessionId??e,message:p.message,parent_tool_use_id:s.parentToolUseId,parent_agent_id:s.parentAgentId,...Mt(p),...At(p),...f?{tool_result_meta:f}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function pe(r){return _(await Ve(r??process.cwd()))}function Re(r,e){return{projectKey:r,sessionId:e}}function oa(r){return r.map(e=>JSON.stringify(e)).join(`
|
|
25
|
+
`)}function ia(r){let e=0;for(let t of r){if(typeof t.timestamp!="string")continue;let n=Date.parse(t.timestamp);Number.isFinite(n)&&(e=Math.max(e,n))}return e}function aa(r){let e=r.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var ua=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function ca(r){let e=r;for(let t=0;t<10;t+=1){let n=e.normalize("NFKC").replace(ua,"");if(n===e)return n;e=n}return e}var da=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,la=/<command-name>(.*?)<\/command-name>/,pa=/<bash-input>([\s\S]*?)<\/bash-input>/;function ma(r){if(r.length<=200)return r;let e=r.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function fa(r,e){if(r.type!=="user"||r.isMeta===!0||r.isCompactSummary===!0)return;let t=r.message;if(!C(t))return;let n=t.content,s=[];if(typeof n=="string")s.push(n);else if(Array.isArray(n)){for(let o of n)if(C(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&s.push(o.text)}}for(let o of s){let i=o.replaceAll(`
|
|
26
|
+
`," ").trim();if(!i)continue;let a=la.exec(i);if(a){e.commandFallback??=a[1];continue}let u=pa.exec(i);if(u)return`! ${u[1].trim()}`;if(!da.test(i))return ma(i)}}function xt(r,e,t,n={}){if(e.length===0)return;let s,o,i,a,u,c,p,f,d,l,m;for(let k of e){let y=k;if(m??=y.isSidechain===!0,l===void 0&&typeof y.timestamp=="string"){let T=Date.parse(y.timestamp);Number.isFinite(T)&&(l=T)}if(!s){let T={commandFallback:o};s=fa(y,T),o=T.commandFallback}y.type==="custom-title"&&typeof y.customTitle=="string"&&(i=y.customTitle),y.type==="ai-title"&&typeof y.aiTitle=="string"&&(a=y.aiTitle),typeof y.lastPrompt=="string"&&(u=y.lastPrompt),typeof y.summary=="string"&&(c=y.summary),y.type==="tag"&&(d=typeof y.tag=="string"&&y.tag?y.tag:void 0),typeof y.gitBranch=="string"&&(p=y.gitBranch),f===void 0&&typeof y.cwd=="string"&&(f=y.cwd),y.type==="relocated"&&typeof y.relocatedCwd=="string"&&(f=y.relocatedCwd)}if(m)return;let S=s??o,g=i||a,h=g||u||c||S;if(h)return{sessionId:r,summary:h,lastModified:t??ia(e),fileSize:n.fileSize,customTitle:g,firstPrompt:S,gitBranch:p,cwd:f||n.defaultCwd,tag:d,createdAt:l}}async function Rn(r,e,t){let n=Re(await pe(t),e),s=await r.load(n);return s?{key:n,entries:s}:void 0}async function ga(r){if(r?.sessionStore){let c=r.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let p=await Ve(r.dir??process.cwd()),f=_(p),d=(await c.listSessions(f)).slice().sort((g,h)=>h.mtime-g.mtime),l=Math.max(0,r.offset??0),m=r.limit!==void 0&&r.limit>0?d.slice(l,l+r.limit):l>0?d.slice(l):d;return(await Promise.allSettled(m.map(async({sessionId:g,mtime:h})=>{let k=await c.load(Re(f,g));return k?xt(g,k,h,{defaultCwd:p}):void 0}))).flatMap((g,h)=>{if(g.status==="fulfilled")return g.value?[g.value]:[];let k=m[h];return[{sessionId:k.sessionId,summary:"",lastModified:k.mtime}]})}let e=await F(r),n=(await Promise.all(e.map(async c=>{try{return(await _t(c)).filter(f=>f.endsWith(".jsonl")).map(f=>R(c,f))}catch{return[]}}))).flat(),s=await Promise.all(n.map(Sn)),o=new Map;for(let c of s){if(!c)continue;let p=o.get(c.sessionId);(!p||c.lastModified>p.lastModified)&&o.set(c.sessionId,c)}let i=Array.from(o.values()).sort((c,p)=>p.lastModified-c.lastModified),a=r?.offset??0,u=r?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function ha(r,e){if(e?.sessionStore){if(!W(r))return;let n=await Rn(e.sessionStore,r,e.dir);return n?xt(r,n.entries,aa(n.entries)):void 0}let t=await F(e);for(let n of t){let s=R(n,`${r}.jsonl`),o=await Sn(s);if(o)return o}}async function ya(r,e){if(!W(r))return[];let t=e?.includeSystemMessages===!0;if(e?.sessionStore){let s=await Rn(e.sessionStore,r,e.dir);if(!s)return[];let o=oa(s.entries),i=ln(un(o),cn(o,r));return fn(i.filter(a=>pn(a,t)).map(mn),e)}let n=await F(e);for(let s of n){let o=R(s,`${r}.jsonl`);try{let i=await Je(o,"utf-8"),u=ln(un(i),cn(i,r)).filter(c=>pn(c,t)).map(mn);return fn(u,e)}catch{continue}}return[]}async function Sa(r,e,t){if(!W(r))throw new Error(`Invalid sessionId: ${r}`);let n=e.trim();if(!n)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(Re(await pe(t.dir),r),[{type:"custom-title",sessionId:r,customTitle:n,uuid:hn(),timestamp:new Date().toISOString()}]);return}let s=await F(t);for(let o of s){let i=R(o,`${r}.jsonl`);try{await le(i);let a=JSON.stringify({type:"custom-title",sessionId:r,customTitle:n,timestamp:new Date().toISOString()});await gn(i,a+`
|
|
27
|
+
`);return}catch{continue}}throw new Error(`Session ${r} not found`)}async function wa(r,e,t){if(!W(r))throw new Error(`Invalid sessionId: ${r}`);let n=e===null?null:ca(e).trim();if(n!==null&&!n)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(Re(await pe(t.dir),r),[{type:"tag",sessionId:r,tag:n??"",uuid:hn(),timestamp:new Date().toISOString()}]);return}let s=await F(t);for(let o of s){let i=R(o,`${r}.jsonl`);try{await le(i);let a=JSON.stringify({type:"tag",sessionId:r,tag:n??"",timestamp:new Date().toISOString()});await gn(i,a+`
|
|
28
|
+
`);return}catch{continue}}throw new Error(`Session ${r} not found`)}async function va(r,e){if(e?.sessionStore){if(!W(r))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let n=await e.sessionStore.listSubkeys({projectKey:await pe(e.dir),sessionId:r});return Array.from(new Set(n.map(s=>{if(!s.startsWith("subagents/"))return;let o=s.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(s=>s!==void 0)))}let t=await F(e);for(let n of t){let s=R(n,`${r}.jsonl`);try{await le(s);let o=await kn(wn(n,r));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function ka(r,e,t){if(t?.sessionStore){if(!W(r)||!e)return[];let s=await pe(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:s,sessionId:r}),m=`agent-${e}`,S=l.find(g=>g.startsWith("subagents/")&&g.split("/").at(-1)===m);if(!S)return[];o=S}let i=await t.sessionStore.load({projectKey:s,sessionId:r,subpath:o});if(!i)return[];let a=i.filter(vn),u=i.filter(l=>l.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,p=typeof u?.parentAgentId=="string"?u.parentAgentId:null,f=bn(a).map(l=>{let m=Ct(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??r,message:l.message,parent_tool_use_id:c,parent_agent_id:p,...Mt(l),...At(l),...m?{tool_result_meta:m}:{}}}),d=Math.max(0,t.offset??0);return t.limit!==void 0?f.slice(d,d+t.limit):f.slice(d)}let n=await F(t);for(let s of n){let o=R(s,`${r}.jsonl`);try{await le(o);let a=(await kn(wn(s,r))).find(u=>u.agentId===e);return a?await sa(a.filePath,r,t):[]}catch{continue}}return[]}async function ba(r,e){if(!W(r))throw new Error(`Invalid sessionId: ${r}`);if(e?.sessionStore){if(!e.sessionStore.delete)return;await e.sessionStore.delete(Re(await pe(e.dir),r));return}let t=await F(e);for(let n of t){let s=R(n,`${r}.jsonl`);try{await le(s),await Promise.all([on(s,{force:!0}),on(R(n,r),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${r} not found`)}import{randomUUID as Ye}from"crypto";import{readdir as Ra,readFile as Ta,realpath as Pa,stat as Tn,writeFile as Ea}from"fs/promises";import{dirname as _a,join as It,resolve as Ca}from"path";var Pn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ma=new Set(["user","assistant","attachment","system","progress"]);async function _n(r){let e=Ca(r);try{return await Pa(e)}catch{return e}}async function Aa(r,e){let t=ue();if(e){let s=_(await _n(e)),o=It(t,s,`${r}.jsonl`);try{if((await Tn(o)).size>0)return o}catch{}return}let n;try{n=await Ra(t,{withFileTypes:!0})}catch{return}for(let s of n){if(!s.isDirectory()&&!s.isSymbolicLink())continue;let o=It(t,s.name,`${r}.jsonl`);try{if((await Tn(o)).size>0)return o}catch{}}}function Cn(r,e){let t=[],n=[],s;for(let o of r){if(o===null||typeof o!="object")continue;let i=o;if(typeof i.type=="string"&&Ma.has(i.type)&&typeof i.uuid=="string"){t.push(i);continue}if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){n.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(s=i.relocatedCwd)}return{transcript:t,contentReplacements:n,relocatedCwd:s}}function xa(r,e){let t=[];for(let n of r.split(`
|
|
29
|
+
`))if(n.trim())try{t.push(JSON.parse(n))}catch{}return Cn(t,e)}function Ia(r){for(let e of r){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let n=t.message;if(n===null||typeof n!="object")continue;let s=n.content;if(typeof s=="string"&&s.trim())return s.trim();if(!Array.isArray(s)||s.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=s.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
|
|
30
|
+
`).trim();if(o)return o}}function Oa(r){let e,t;for(let n of r){if(n===null||typeof n!="object")continue;let s=n;typeof s.customTitle=="string"&&s.customTitle&&(e=s.customTitle),typeof s.aiTitle=="string"&&s.aiTitle&&(t=s.aiTitle)}return e??t??Ia(r)}function En(r,e,t,n){let s=r.transcript.filter(d=>d.isSidechain!==!0);if(s.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=s.findIndex(l=>l.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);s=s.slice(0,d+1)}let o=new Map(s.map(d=>[d.uuid,Ye()])),i=s.filter(d=>d.type!=="progress");if(i.length===0)throw new Error(`Session ${e} has no messages to fork`);let a=new Map(s.map(d=>[d.uuid,d])),u=Ye(),c=new Date().toISOString(),p=i.map((d,l)=>{let m=null,S=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;S;){let k=a.get(S);if(!k)break;if(k.type!=="progress"){m=o.get(S)??null;break}S=typeof k.parentUuid=="string"?k.parentUuid:void 0}let g=typeof d.logicalParentUuid=="string"?o.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,h={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:o.get(d.uuid),parentUuid:m,logicalParentUuid:g,sessionId:u,timestamp:l===i.length-1?c:typeof d.timestamp=="string"?d.timestamp:c,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete h.teamName,delete h.agentName,delete h.sessionKind,delete h.slug,delete h.sourceToolAssistantUUID,h});r.contentReplacements.length>0&&p.push({type:"content-replacement",sessionId:u,replacements:r.contentReplacements,uuid:Ye(),timestamp:c}),r.relocatedCwd&&p.push({type:"relocated",sessionId:u,relocatedCwd:r.relocatedCwd});let f=t.title?.trim();return p.push({type:"custom-title",sessionId:u,customTitle:f||`${Oa(n)??"Forked session"} (fork)`,uuid:Ye(),timestamp:c}),{sessionId:u,entries:p}}async function Da(r,e={}){if(!Pn.test(r))throw new Error(`Invalid sessionId: ${r}`);if(e.upToMessageId&&!Pn.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await _n(e.dir??process.cwd()),a=_(i),u=await e.sessionStore.load({projectKey:a,sessionId:r});if(!u?.length)throw new Error(`Session ${r} not found`);let c=En(Cn(u,r),r,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Aa(r,e.dir);if(!t)throw new Error(`Session ${r} not found`);let n=await Ta(t,"utf8"),s=n.split(`
|
|
31
|
+
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=En(xa(n,r),r,e,s);return await Ea(It(_a(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
32
32
|
`)}
|
|
33
|
-
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Xe(r){return JSON.stringify([r.projectKey,r.sessionId,r.subpath??null])}var
|
|
34
|
-
${t.stdout}`);throw U(s?"plugin_validation_unsupported":"plugin_validation_protocol_error",s?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(n&&typeof n=="object"&&"ok"in n&&n.schemaVersion!==1)throw U("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(n&&typeof n=="object"&&n.ok===!0&&n.report){let s=n.report;if(
|
|
33
|
+
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Xe(r){return JSON.stringify([r.projectKey,r.sessionId,r.subpath??null])}var Ot=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let n=Xe(e),s=this.entries.get(n)??[];s.push(...t),this.entries.set(n,s),this.keys.set(n,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(n,o)}async load(e){let t=this.entries.get(Xe(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[n,s]of this.keys)s.projectKey!==e||s.subpath!==void 0||t.push({sessionId:s.sessionId,mtime:this.modifiedAt.get(n)??0});return t.sort((n,s)=>s.mtime-n.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Xe(e));return}for(let[t,n]of this.keys)n.projectKey===e.projectKey&&n.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let n of this.keys.values())n.projectKey===e.projectKey&&n.sessionId===e.sessionId&&n.subpath!==void 0&&t.push(n.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Xe(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as ja}from"fs";import{readdir as In,readFile as Na,realpath as Ka,stat as Mn}from"fs/promises";import{basename as An,dirname as Fa,join as Te,relative as Ua,resolve as qa,sep as La}from"path";import{createInterface as $a}from"readline";var Qa=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ba=500,Ga=1024*1024;async function za(r){let e=qa(r);try{return await Ka(e)}catch{return e}}async function Wa(r,e){let t=ue();if(e){let s=_(await za(e)),o=Te(t,s,`${r}.jsonl`);try{if((await Mn(o)).size>0)return{filePath:o,projectKey:s}}catch{}return}let n;try{n=await In(t,{withFileTypes:!0})}catch{return}for(let s of n){if(!s.isDirectory()&&!s.isSymbolicLink())continue;let o=Te(t,s.name,`${r}.jsonl`);try{if((await Mn(o)).size>0)return{filePath:o,projectKey:s.name}}catch{}}}async function Ha(r){let e=[];async function t(n){let s;try{s=await In(n,{withFileTypes:!0})}catch{return}s.sort((o,i)=>o.name.localeCompare(i.name));for(let o of s){let i=Te(n,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(r),e}async function xn(r,e,t,n){let s=$a({input:ja(r,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of s){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${r}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${r}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=n||i>=Ga)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Ja(r,e,t={}){if(!Qa.test(r))throw new Error(`Invalid sessionId: ${r}`);let n=await Wa(r,t.dir);if(!n)throw new Error(`Session ${r} not found`);let s=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Ba;if(await xn(n.filePath,{projectKey:n.projectKey,sessionId:r},e,s),t.includeSubagents===!1)return;let o=n.filePath.replace(/\.jsonl$/,""),i=Te(o,"subagents");for(let a of await Ha(i)){let c=Ua(o,a).split(La);c[c.length-1]=An(c[c.length-1],".jsonl");let p={projectKey:n.projectKey,sessionId:r,subpath:c.join("/")};await xn(a,p,e,s);let f=Te(Fa(a),`${An(a,".jsonl")}.meta.json`);try{let d=JSON.parse(await Na(f,"utf8"));await e.append(p,[{type:"agent_metadata",...d}])}catch(d){if(typeof d=="object"&&d!==null&&"code"in d&&d.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${f}: ${String(d)}`)}}}import{spawn as Va}from"node:child_process";import{existsSync as Ya}from"node:fs";import{Worker as Xa}from"node:worker_threads";var Dt=3e4;async function On(r,e={}){let t=ze({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ge);return t.transport==="worker"?eu(r,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Za(r,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??X()})}function Za(r,e){return new Promise((t,n)=>{let s=Va(e.pathToQoderCLIExecutable,r,{cwd:e.cwd,env:Dn(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,s.kill("SIGTERM"),n(jn(e.timeoutMs)))},e.timeoutMs??Dt);s.stdout.on("data",c=>{o+=c.toString()}),s.stderr.on("data",c=>{i+=c.toString()}),s.on("error",c=>{a||(a=!0,clearTimeout(u),n(c))}),s.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function eu(r,e){ru(e.signal);let t=re(e.pathToQoderWorkerRuntime),n=await je(t);tu(n);let s=e.cwd??process.cwd(),o=Dn(e.env);delete o.NODE_OPTIONS;let i=Ne(n,{cwd:s,env:o});return new Promise((a,u)=>{let c=new Xa(n.runtimePath,{argv:r,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),p="",f="",d=!1,l,m=c.stdout===null,S=c.stderr===null,g=()=>{clearTimeout(T),e.signal?.removeEventListener("abort",y)},h=P=>{d||(d=!0,g(),u(P))},k=()=>{d||l===void 0||!m||!S||(d=!0,g(),a({stdout:p,stderr:f,exitCode:l}))},y=()=>{c.terminate(),h(Nn(e.signal))},T=setTimeout(()=>{c.terminate(),h(jn(e.timeoutMs))},e.timeoutMs??Dt);c.stdin?.end(),c.stdout?.on("data",P=>{p+=P.toString()}),c.stdout?.on("end",()=>{m=!0,k()}),c.stderr?.on("data",P=>{f+=P.toString()}),c.stderr?.on("end",()=>{S=!0,k()}),c.once("error",h),c.once("exit",P=>{l=P,k()}),e.signal?.addEventListener("abort",y,{once:!0}),e.signal?.aborted&&y()})}function Dn(r){let e={...process.env,...r},t={};for(let[n,s]of Object.entries(e))s!==void 0&&(t[n]=s);return t}function tu(r){if(!Ya(r.runtimePath))throw new Error(`Qoder worker runtime not found: ${r.runtimePath}`)}function jn(r){return new Error(`qodercli subprocess timed out after ${r??Dt}ms`)}function ru(r){if(r?.aborted)throw Nn(r)}function Nn(r){if(r?.reason instanceof Error)return r.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function nu(r){let e=["plugins","list","--json"];r?.orgId&&e.push("--org-id",r.orgId);let t=await me(e,r);return JSON.parse(t.stdout).map(s=>({id:s.id,name:s.name,source:s.source,path:s.installPath??s.path,version:s.version??"unknown",scope:s.scope,enabled:s.enabled,canDisable:s.canDisable,displayName:s.displayName,description:s.description,installedAt:s.installedAt,lastUpdated:s.lastUpdated,resources:s.resources}))}async function su(r,e){let t=["plugins","enable",r];e?.scope&&t.push("--scope",e.scope);let n=await me(t,e);n.exitCode!==0&&Pe(n)}async function ou(r,e){let t=["plugins","disable",r];e?.scope&&t.push("--scope",e.scope);let n=await me(t,e);n.exitCode!==0&&Pe(n)}async function iu(r,e){let t=await me(["plugins","install",r,"--scope","user","--json"],e);t.exitCode!==0&&Pe(t);let n=JSON.parse(t.stdout);return{pluginId:n.pluginId,version:n.version??"local",path:n.path}}async function au(r,e){let t=["plugins","uninstall",r,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let n=await me(t,e);n.exitCode!==0&&Pe(n);let s=JSON.parse(n.stdout);return{pluginId:s.pluginId,fullyRemoved:s.fullyRemoved,reverseDependents:s.reverseDependents??[]}}async function uu(r,e){let t;try{t=await me(["plugins","validate",r,"--json"],e)}catch(s){if(e?.signal?.aborted||s instanceof Error&&s.name==="AbortError")throw new A("Plugin validation was aborted");let o=s instanceof Error?s.message:String(s);throw U("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let n;try{n=JSON.parse(t.stdout)}catch{let s=cu(`${t.stderr}
|
|
34
|
+
${t.stdout}`);throw U(s?"plugin_validation_unsupported":"plugin_validation_protocol_error",s?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(n&&typeof n=="object"&&"ok"in n&&n.schemaVersion!==1)throw U("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(n&&typeof n=="object"&&n.ok===!0&&n.report){let s=n.report;if(lu(s))return s;throw U("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(n&&typeof n=="object"&&n.ok===!1){let s=n.error;if(!s||typeof s!="object"||typeof s.code!="string"||typeof s.message!="string")throw U("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=s;throw U(o.code,o.message)}throw t.exitCode!==0&&Pe(t),U("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function cu(r){return/unknown option[^\n]*--json/i.test(r)||/unknown command[^\n]*validate/i.test(r)}var du=3e4;function me(r,e){return On(r,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:du})}function Pe(r){let e="plugin_operation_failed",t=r.stderr||r.stdout;try{let n=JSON.parse(r.stdout);n.error&&n.code?(e=n.code,t=n.message??t):n.ok===!1&&n.error&&(e=n.error.code??e,t=n.error.message??t)}catch{}throw U(e,t)}function U(r,e){let t=new Error(e);return t.code=r,t}function lu(r){if(!r||typeof r!="object")return!1;let e=r;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(n=>n!==null&&typeof n=="object"&&(n.severity==="error"||n.severity==="warning")&&typeof n.code=="string"&&typeof n.message=="string"&&typeof n.phase=="string"&&t.has(n.phase)&&(n.location===void 0||n.location!==null&&typeof n.location=="object"&&typeof n.location.path=="string"))}import{execFile as pu}from"child_process";function mu(){return X()}async function fu(r,e){if(!r.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??mu(),n=e?.timeout??6e4,s=["feedback","-c",r.content,"--json"];if(e?.storageDir&&s.push("--storage-dir",e.storageDir),r.sessionId&&s.push("-s",r.sessionId),r.workdir&&s.push("--workdir",r.workdir),r.email&&s.push("--email",r.email),r.include)for(let o of r.include)s.push("--include",o);if(r.imagePaths)for(let o of r.imagePaths)s.push("--images",o);if(r.callerVersion&&s.push("--caller-version",r.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&s.push("--ide-type",o)}return new Promise(o=>{pu(t,s,{env:e?.env??process.env,timeout:n,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var Un={};Qn(Un,{filterEscalatingDefaultMode:()=>Kn,isBashToolBackgroundLaunchResult:()=>Fn});var gu=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Kn(r){let e=r.effective.permissions?.defaultMode;if(!e||!gu.has(e))return r.effective;for(let t=r.sources.length-1;t>=0;t-=1){let n=r.sources[t];if(n.settings.permissions?.defaultMode!==void 0){if(n.source==="project"){let{defaultMode:s,...o}=r.effective.permissions??{};return{...r.effective,permissions:o}}return r.effective}}return r.effective}function Fn(r){if(r===null||typeof r!="object"||Array.isArray(r))return!1;let e=r,t=o=>o===void 0||typeof o=="string",n=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,s=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&n(e.totalLines)&&n(e.totalBytes)&&(s===void 0||s==="user"||s==="model"||s==="timeout"||s==="auto")}export{A as AbortError,Me as AuthAccessTokenEnvVarError,Ae as AuthServiceAccountEnvVarError,Gt as DEFAULT_ACCESS_TOKEN_ENV_VAR,ge as DEFAULT_RUNTIME_TRANSPORT,Ce as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Gn as EXIT_REASONS,Bn as HOOK_EVENTS,Ot as InMemorySessionStore,ye as ModelPolicyTimeoutError,ee as ProcessTransport,Se as ProtocolVersionMismatchError,Z as QoderCliProcessError,Q as QoderWorkerRuntimeError,we as UnsupportedCliCapabilityError,dt as WIRE_PROTOCOL_VERSION,ne as WorkerTransport,Yn as accessToken,Xn as accessTokenFromEnv,Un as coreTypes,Ki as createSdkMcpServer,ba as deleteSession,ou as disablePlugin,su as enablePlugin,Kn as filterEscalatingDefaultMode,Da as forkSession,ha as getSessionInfo,ya as getSessionMessages,ka as getSubagentMessages,hr as hasResolvableQoderWorkerRuntime,Ja as importSessionToStore,iu as installPlugin,Fn as isBashToolBackgroundLaunchResult,rs as jobToken,nu as listPlugins,ga as listSessions,va as listSubagents,Zn as qodercliAuth,kt as query,Sa as renameSession,re as resolveQoderWorkerRuntimePath,ji as resolveSettings,es as serviceAccount,ts as serviceAccountFromEnv,bi as startup,fu as submitFeedback,wa as tagSession,Fi as tool,au as uninstallPlugin,uu as validatePlugin};
|