@qoder-ai/qoder-agent-sdk 1.0.39 → 1.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,35 +1,35 @@
1
- var io=Object.defineProperty;var ao=(n,e)=>{for(var t in e)io(n,t,{get:e[t],enumerable:!0})};import{spawn as Lo}from"child_process";import{createInterface as Bo}from"readline";var uo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],co=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Je=2e3,On=5e3;var Ve="1.0.39";var he=41,In=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],An=["TaskCreate","TaskGet","TaskUpdate","TaskList"],lo="QODER_FEATURE_TASKS";function Dn(n){let e=n[lo];if(e!=="0"&&e!=="false")return[...In];let t=new Set(An);return In.flatMap(s=>s===An[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Kn,mkdtemp as ko,rm as Un,writeFile as _o}from"fs/promises";import{existsSync as et,mkdtempSync as Ro,readFileSync as Eo,rmSync as Co,writeFileSync as Po}from"fs";import{homedir as To,tmpdir as Ln}from"os";import{dirname as Hn,join as L}from"path";import{fileURLToPath as Mo}from"url";var po=/^[A-Za-z0-9_-]{1,64}$/,mo=new Set(["mcp_list","mcp_get","mcp_call"]);function Tt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!po.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(mo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Mt(n,e){let t={};for(let s of e)Tt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function It(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Mt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function xn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=It(t,s,r)}return e}var fo="global",Nn=fo==="cn",go=Nn?"QODERCN_":"QODER_",At=`${go}VPC_ENDPOINT`,v=Nn?{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 qn=v.accessTokenEnv,Ye=v.serviceAccountEnv;function ho(n){return{type:"accessToken",accessToken:n}}function yo(n=qn){return{type:"accessToken",accessToken:{envVar:n}}}function So(){return{type:"qodercli"}}function wo(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function vo(n=Ye){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function bo(n){return{type:"jobToken",fetchJobToken:n}}var jn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Fn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(jn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of jn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var Bn="QODER_AGENT_SDK_ENTRYPOINT",$n="QODER_AGENT_SDK_VERSION",zn="QODER_SDK_AUTH_PAYLOAD_FILE",Io="sdk-ts",Ao=Mo(import.meta.url),Qn=Hn(Ao),Xe=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"}},Ze=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 tt(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function H(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Oo();if(n)return n;let e=Do();if(et(e))return e;let t=xo();return t||v.cliCommands[0]}function Oo(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,"dist","_bundled",t);if(et(s))return s}return null}function Do(){for(let n of Jn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[L(n,"node_modules",".bin",t),L(n,"..","..",".bin",t)];for(let r of s)if(et(r))return r}return v.cliCommands[0]}function xo(){let n=process.env[v.cliHomeEnv]??To();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,v.configDirName,"local",t);if(et(s))return s}return null}function Jn(){let n=[L(Qn,".."),L(Qn,"..","..")];return[...new Set(n)]}function No(){return{allow:[],ask:[],deny:[]}}function Gn(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function qo(n,e){if(e.startsWith("mcp__"))return e;let t=Gn(n),s=e==="*"?"*":Gn(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function Wn(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function jo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var G=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Co(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Hn(this.authPayloadPath);try{await Un(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[Bn],delete t[$n],delete t[zn];for(let s of this.serviceAccountCredentialEnvVars())Fo(t,s);if(t[Bn]=Io,t[$n]=Ve,this.authPayloadPath&&(t[zn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[At]=s:delete t[At]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Dn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?jo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Fn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];Wn(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=It(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=No(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=qo(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];Wn(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Eo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ro(L(Ln(),"qoder-agent-sdk-settings-"));let t=L(this.generatedSettingsDir,"settings.json");return Po(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await ko(L(Ln(),"qoder-sdk-auth-"));try{await Kn(s,448);let r=L(s,"payload.json");return await _o(r,JSON.stringify(t),{mode:384}),await Kn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Un(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Ze(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Xe(t);return s}};function Fo(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function nt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var Ko=new Set(["--mcp-config","--proxy","--settings"]);function st(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),Ko.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Uo}from"node:stream";var B=16*1024*1024,Oe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},J=class extends Uo{constructor(t=B,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ye(n,e=B,t="JSONL output"){let s=n.endsWith(`
2
- `)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new Oe(t,e)}var Vn=8192,I=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},Se=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;shutdownStarted=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;processStopped=!1;closeTimer;killTimer;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new G(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(nt(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.cleanupLaunchArtifacts();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${st(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,this.observeProcess(i)}else this.process=Lo(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.observeProcess(this.process),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=!this.closed&&!this.shutdownStarted&&!this.processStopped,this.flushPendingInput()}catch(e){throw this.process||this.customHandle?this.shutdownProcess():await this.cleanupLaunchArtifacts(),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 ao=Object.defineProperty;var uo=(n,e)=>{for(var t in e)ao(n,t,{get:e[t],enumerable:!0})};import{spawn as Bo}from"child_process";import{createInterface as $o}from"readline";var co=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],lo=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],Je=2e3,Dn=5e3;var Ve="1.0.41";var he=41,An=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],On=["TaskCreate","TaskGet","TaskUpdate","TaskList"],po="QODER_FEATURE_TASKS";function xn(n){let e=n[po];if(e!=="0"&&e!=="false")return[...An];let t=new Set(On);return An.flatMap(s=>s===On[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Un,mkdtemp as _o,rm as Ln,writeFile as Ro}from"fs/promises";import{existsSync as et,mkdtempSync as Eo,readFileSync as Co,rmSync as Po,writeFileSync as To}from"fs";import{homedir as Mo,tmpdir as Bn}from"os";import{dirname as Jn,join as L}from"path";import{fileURLToPath as Io}from"url";var mo=/^[A-Za-z0-9_-]{1,64}$/,fo=new Set(["mcp_list","mcp_get","mcp_call"]);function Tt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!mo.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(fo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Mt(n,e){let t={};for(let s of e)Tt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function It(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Mt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Nn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=It(t,s,r)}return e}var go="global",qn=go==="cn",ho=qn?"QODERCN_":"QODER_",At=`${ho}VPC_ENDPOINT`,v=qn?{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 jn=v.accessTokenEnv,Ye=v.serviceAccountEnv;function yo(n){return{type:"accessToken",accessToken:n}}function So(n=jn){return{type:"accessToken",accessToken:{envVar:n}}}function wo(){return{type:"qodercli"}}function vo(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function bo(n=Ye){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function ko(n){return{type:"jobToken",fetchJobToken:n}}var Fn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Kn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Fn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of Fn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var $n="QODER_AGENT_SDK_ENTRYPOINT",zn="QODER_AGENT_SDK_VERSION",Qn="QODER_SDK_AUTH_PAYLOAD_FILE",Ao="sdk-ts",Oo=Io(import.meta.url),Gn=Jn(Oo),Xe=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"}},Ze=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 tt(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function H(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Do();if(n)return n;let e=xo();if(et(e))return e;let t=No();return t||v.cliCommands[0]}function Do(){for(let n of Vn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,"dist","_bundled",t);if(et(s))return s}return null}function xo(){for(let n of Vn())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[L(n,"node_modules",".bin",t),L(n,"..","..",".bin",t)];for(let r of s)if(et(r))return r}return v.cliCommands[0]}function No(){let n=process.env[v.cliHomeEnv]??Mo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=L(n,v.configDirName,"local",t);if(et(s))return s}return null}function Vn(){let n=[L(Gn,".."),L(Gn,"..","..")];return[...new Set(n)]}function qo(){return{allow:[],ask:[],deny:[]}}function Wn(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function jo(n,e){if(e.startsWith("mcp__"))return e;let t=Wn(n),s=e==="*"?"*":Wn(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function Hn(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function Fo(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var G=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Po(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupLaunchArtifacts(){this.cleanupGeneratedSettings(),await this.cleanupAuthPayload()}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=Jn(this.authPayloadPath);try{await Ln(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[$n],delete t[zn],delete t[Qn];for(let s of this.serviceAccountCredentialEnvVars())Ko(t,s);if(t[$n]=Ao,t[zn]=Ve,this.authPayloadPath&&(t[Qn]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[At]=s:delete t[At]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[Ye];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??xn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?Fo(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Kn(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];Hn(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=It(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=qo(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=jo(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];Hn(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Co(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Eo(L(Bn(),"qoder-agent-sdk-settings-"));let t=L(this.generatedSettingsDir,"settings.json");return To(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await _o(L(Bn(),"qoder-sdk-auth-"));try{await Un(s,448);let r=L(s,"payload.json");return await Ro(r,JSON.stringify(t),{mode:384}),await Un(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Ln(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Ze(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new Xe(t);return s}};function Ko(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function nt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var Uo=new Set(["--mcp-config","--proxy","--settings"]);function st(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),Uo.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as Lo}from"node:stream";var B=16*1024*1024,Oe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},J=class extends Lo{constructor(t=B,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Oe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ye(n,e=B,t="JSONL output"){let s=n.endsWith(`
2
+ `)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new Oe(t,e)}var Yn=8192,I=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},Se=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;shutdownStarted=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;processStopped=!1;closeTimer;killTimer;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new G(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(nt(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.cleanupLaunchArtifacts();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${st(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,this.observeProcess(i)}else this.process=Bo(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.observeProcess(this.process),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=!this.closed&&!this.shutdownStarted&&!this.processStopped,this.flushPendingInput()}catch(e){throw this.process||this.customHandle?this.shutdownProcess():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
3
3
  `)?e:e+`
4
- `;if(ye(t,B,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new J(B,"SDK process output");e.pipe(t);let s=Bo({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){this.closed||(this.closed=!0,this.shutdownProcess())}shutdownProcess(){if(this.shutdownStarted)return;this.shutdownStarted=!0,this.ready=!1,this.pendingInput=[];let e=this.process??this.customHandle;if(!e)return;if(this.hasProcessStopped()){this.finishProcess();return}if(this.endInput(),this.hasProcessStopped()){this.finishProcess();return}let t=r=>{try{e.kill(r)}catch(o){this.diagnostics?.record(`[ProcessTransport] Failed to send ${r}:`,o)}},s=this.options.closeGraceMs??Je;this.closeTimer=setTimeout(()=>{this.closeTimer=void 0,!this.hasProcessStopped()&&(t("SIGTERM"),!this.hasProcessStopped()&&(this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.hasProcessStopped()||t("SIGKILL")},On),this.killTimer.unref()))},s),this.closeTimer.unref()}hasProcessStopped(){let e=this.process??this.customHandle;return this.processStopped||e!==null&&e.exitCode!==null||this.process!==null&&this.process.signalCode!==null}finishProcess(){this.processStopped||(this.processStopped=!0,this.ready=!1,clearTimeout(this.closeTimer),clearTimeout(this.killTimer),this.closeTimer=void 0,this.killTimer=void 0,this.cleanupLaunchArtifacts().catch(()=>{}))}observeProcess(e){e.on("error",t=>{this.ready=!1,this.closed||(this.processExitError??=this.createSpawnError(t)),this.diagnostics?.record("[ProcessTransport] Process error:",t),this.hasProcessStopped()?this.finishProcess():this.shutdownProcess()}),e.once("exit",(t,s)=>{if(this.finishProcess(),this.diagnostics?.record(`[ProcessTransport] Process exited: code=${t}, signal=${s}`),!this.closed&&!this.processExitError){t===he&&this.fireAuthExpired();let r=this.createProcessExitError(t,s);r&&(this.processExitError=r)}})}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>Vn&&(this.stderrTail=this.stderrTail.slice(-Vn))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new I(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==he){if(e!==0&&e!==null)return new I(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new I(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(this.hasProcessStopped()){let t=this.createProcessExitError(e.exitCode,this.process?.signalCode??null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{if(e.off("error",o),this.closed){t();return}let u=this.processExitError??this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.processExitError??this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??H();if(tt(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function $o(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var se=$o();function Yn(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function rt(n,e){return n.create(e)}import{existsSync as fi}from"fs";import{createInterface as gi}from"readline";import{Worker as hi}from"worker_threads";import{createHash as zo}from"node:crypto";import{existsSync as Qo}from"node:fs";import{chmod as Go,lstat as Wo,mkdir as De,readFile as Xn,readdir as Ho,readlink as Jo,rename as Vo,rm as ot,stat as Yo,symlink as Xo,writeFile as Zn}from"node:fs/promises";import{tmpdir as Zo,userInfo as ei}from"node:os";import{basename as es,dirname as we,join as $,relative as ti}from"node:path";var ni="QODER_WORKER_RUNTIME_ASSET_ROOT",ts=/(^|[\\/])app\.asar([\\/]|$)/,Dt=".qoder-worker-runtime-ready";function ns(n){return ts.test(n)}function xt(n){return ns(n)?n.replace(ts,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ve(n,e={}){let t=xt(n);if(!e.forceMaterialize&&t){let u=we(t);if(Qo(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ot(t,u,!1,we(n))}if(!(e.forceMaterialize||ns(n))){let u=we(n);return Ot(n,u,!1)}let r=we(n),o=await si(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=ti(r,n)||es(n),a=$(o,i);return Ot(a,o,!0,r)}function Ot(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[ni]:e}}}async function si(n,e,t){let s=await ri(n,e),r=t.cacheDir??ai(),o=$(r,s),i=$(o,Dt);if(await rs(i)===s)return o;let a=$(r,`.setup-${s}-${process.pid}-${Date.now()}`);await De(r,{recursive:!0,mode:448}),await ot(a,{recursive:!0,force:!0}),await ot(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await De(a,{recursive:!0,mode:448}),await ss(n,a),await Zn($(a,Dt),s,{mode:384}),await ii(a,o,s),o}catch(u){throw await ot(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function ri(n,e){let t=zo("sha256");t.update("qoder-worker-runtime-v1\0");let s=await os($(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await Yo(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ss(n,e){let t=await Ho(n,{withFileTypes:!0});await De(e,{recursive:!0,mode:448});for(let s of t){let r=$(n,s.name),o=$(e,s.name);if(s.isDirectory()){await ss(r,o);continue}if(s.isSymbolicLink()){await De(we(o),{recursive:!0,mode:448}),await Xo(await Jo(r),o);continue}if(!s.isFile())continue;let i=await oi(r);await De(we(o),{recursive:!0,mode:448}),await Zn(o,await Xn(r),{mode:i}),process.platform!=="win32"&&await Go(o,i)}}async function oi(n){let e=((await Wo(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=es(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function ii(n,e,t){try{await Vo(n,e)}catch(s){if(await rs($(e,Dt))===t){await ot(n,{recursive:!0,force:!0});return}throw s}}async function rs(n){let e=await os(n);return e?e.toString("utf8"):null}async function os(n){try{return await Xn(n)}catch{return null}}function ai(){let n=ui(ei().username||process.env.USER||process.env.USERNAME||"user");return $(Zo(),`qoder-sdk-worker-runtime-${n}`)}function ui(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var ci="QODER_WORKER_CWD";function it(n,e){return{env:{...e.env,[ci]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as Nt}from"node:fs";import{dirname as li,join as re}from"node:path";import{fileURLToPath as di}from"node:url";var pi=di(import.meta.url),qt=li(pi);function V(n){if(n)return n;let e=[];for(let t of mi())e.push(re(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),re(t,"dist","_worker","qoder-worker-runtime.mjs"),re(t,"_worker","qoder-worker-runtime.obf.mjs"),re(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Nt(t))return t;return e[0]??re(qt,"..","_worker","qoder-worker-runtime.obf.mjs")}function is(n){let e=V(n);if(Nt(e))return!0;let t=xt(e);return t!==null&&Nt(t)}function mi(){let n=[re(qt,".."),re(qt,"..","..")];return[...new Set(n)]}var as=8192,oe=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}},be=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new jt(nt(this.options,e))}},jt=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 G(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.cleanupLaunchArtifacts();return}let t=V(this.options.pathToQoderWorkerRuntime),s;try{s=await ve(t,{diagnostics:this.diagnostics})}catch(a){throw new oe(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!fi(r))throw new oe(`Qoder worker runtime not found: ${r}`);if(this.closed){await this.cleanupLaunchArtifacts();return}let o=this.options.cwd??process.cwd(),i=it(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${st(e.args)}`),this.worker=new hi(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker)}),this.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.cleanupLaunchArtifacts().catch(()=>{});return}a===he&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupLaunchArtifacts().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 this.worker?this.close():await this.cleanupLaunchArtifacts(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
4
+ `;if(ye(t,B,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new J(B,"SDK process output");e.pipe(t);let s=$o({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){this.closed||(this.closed=!0,this.shutdownProcess())}shutdownProcess(){if(this.shutdownStarted)return;this.shutdownStarted=!0,this.ready=!1,this.pendingInput=[];let e=this.process??this.customHandle;if(!e)return;if(this.hasProcessStopped()){this.finishProcess();return}if(this.endInput(),this.hasProcessStopped()){this.finishProcess();return}let t=r=>{try{e.kill(r)}catch(o){this.diagnostics?.record(`[ProcessTransport] Failed to send ${r}:`,o)}},s=this.options.closeGraceMs??Je;this.closeTimer=setTimeout(()=>{this.closeTimer=void 0,!this.hasProcessStopped()&&(t("SIGTERM"),!this.hasProcessStopped()&&(this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.hasProcessStopped()||t("SIGKILL")},Dn),this.killTimer.unref()))},s),this.closeTimer.unref()}hasProcessStopped(){let e=this.process??this.customHandle;return this.processStopped||e!==null&&e.exitCode!==null||this.process!==null&&this.process.signalCode!==null}finishProcess(){this.processStopped||(this.processStopped=!0,this.ready=!1,clearTimeout(this.closeTimer),clearTimeout(this.killTimer),this.closeTimer=void 0,this.killTimer=void 0,this.cleanupLaunchArtifacts().catch(()=>{}))}observeProcess(e){e.on("error",t=>{this.ready=!1,this.closed||(this.processExitError??=this.createSpawnError(t)),this.diagnostics?.record("[ProcessTransport] Process error:",t),this.hasProcessStopped()?this.finishProcess():this.shutdownProcess()}),e.once("exit",(t,s)=>{if(this.finishProcess(),this.diagnostics?.record(`[ProcessTransport] Process exited: code=${t}, signal=${s}`),!this.closed&&!this.processExitError){t===he&&this.fireAuthExpired();let r=this.createProcessExitError(t,s);r&&(this.processExitError=r)}})}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>Yn&&(this.stderrTail=this.stderrTail.slice(-Yn))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new I(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==he){if(e!==0&&e!==null)return new I(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new I(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(this.hasProcessStopped()){let t=this.createProcessExitError(e.exitCode,this.process?.signalCode??null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{if(e.off("error",o),this.closed){t();return}let u=this.processExitError??this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.processExitError??this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??H();if(tt(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function zo(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var se=zo();function Xn(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function rt(n,e){return n.create(e)}import{existsSync as gi}from"fs";import{createInterface as hi}from"readline";import{Worker as yi}from"worker_threads";import{createHash as Qo}from"node:crypto";import{existsSync as Go}from"node:fs";import{chmod as Wo,lstat as Ho,mkdir as De,readFile as Zn,readdir as Jo,readlink as Vo,rename as Yo,rm as ot,stat as Xo,symlink as Zo,writeFile as es}from"node:fs/promises";import{tmpdir as ei,userInfo as ti}from"node:os";import{basename as ts,dirname as we,join as $,relative as ni}from"node:path";var si="QODER_WORKER_RUNTIME_ASSET_ROOT",ns=/(^|[\\/])app\.asar([\\/]|$)/,Dt=".qoder-worker-runtime-ready";function ss(n){return ns.test(n)}function xt(n){return ss(n)?n.replace(ns,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ve(n,e={}){let t=xt(n);if(!e.forceMaterialize&&t){let u=we(t);if(Go(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ot(t,u,!1,we(n))}if(!(e.forceMaterialize||ss(n))){let u=we(n);return Ot(n,u,!1)}let r=we(n),o=await ri(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=ni(r,n)||ts(n),a=$(o,i);return Ot(a,o,!0,r)}function Ot(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[si]:e}}}async function ri(n,e,t){let s=await oi(n,e),r=t.cacheDir??ui(),o=$(r,s),i=$(o,Dt);if(await os(i)===s)return o;let a=$(r,`.setup-${s}-${process.pid}-${Date.now()}`);await De(r,{recursive:!0,mode:448}),await ot(a,{recursive:!0,force:!0}),await ot(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await De(a,{recursive:!0,mode:448}),await rs(n,a),await es($(a,Dt),s,{mode:384}),await ai(a,o,s),o}catch(u){throw await ot(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function oi(n,e){let t=Qo("sha256");t.update("qoder-worker-runtime-v1\0");let s=await is($(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await Xo(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function rs(n,e){let t=await Jo(n,{withFileTypes:!0});await De(e,{recursive:!0,mode:448});for(let s of t){let r=$(n,s.name),o=$(e,s.name);if(s.isDirectory()){await rs(r,o);continue}if(s.isSymbolicLink()){await De(we(o),{recursive:!0,mode:448}),await Zo(await Vo(r),o);continue}if(!s.isFile())continue;let i=await ii(r);await De(we(o),{recursive:!0,mode:448}),await es(o,await Zn(r),{mode:i}),process.platform!=="win32"&&await Wo(o,i)}}async function ii(n){let e=((await Ho(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=ts(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function ai(n,e,t){try{await Yo(n,e)}catch(s){if(await os($(e,Dt))===t){await ot(n,{recursive:!0,force:!0});return}throw s}}async function os(n){let e=await is(n);return e?e.toString("utf8"):null}async function is(n){try{return await Zn(n)}catch{return null}}function ui(){let n=ci(ti().username||process.env.USER||process.env.USERNAME||"user");return $(ei(),`qoder-sdk-worker-runtime-${n}`)}function ci(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var li="QODER_WORKER_CWD";function it(n,e){return{env:{...e.env,[li]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as Nt}from"node:fs";import{dirname as di,join as re}from"node:path";import{fileURLToPath as pi}from"node:url";var mi=pi(import.meta.url),qt=di(mi);function V(n){if(n)return n;let e=[];for(let t of fi())e.push(re(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),re(t,"dist","_worker","qoder-worker-runtime.mjs"),re(t,"_worker","qoder-worker-runtime.obf.mjs"),re(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(Nt(t))return t;return e[0]??re(qt,"..","_worker","qoder-worker-runtime.obf.mjs")}function as(n){let e=V(n);if(Nt(e))return!0;let t=xt(e);return t!==null&&Nt(t)}function fi(){let n=[re(qt,".."),re(qt,"..","..")];return[...new Set(n)]}var us=8192,oe=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}},be=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new jt(nt(this.options,e))}},jt=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 G(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.cleanupLaunchArtifacts();return}let t=V(this.options.pathToQoderWorkerRuntime),s;try{s=await ve(t,{diagnostics:this.diagnostics})}catch(a){throw new oe(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!gi(r))throw new oe(`Qoder worker runtime not found: ${r}`);if(this.closed){await this.cleanupLaunchArtifacts();return}let o=this.options.cwd??process.cwd(),i=it(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${st(e.args)}`),this.worker=new yi(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker)}),this.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.cleanupLaunchArtifacts().catch(()=>{});return}a===he&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupLaunchArtifacts().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 this.worker?this.close():await this.cleanupLaunchArtifacts(),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(`
5
5
  `)?e:e+`
6
- `;if(ye(t,B,"SDK Worker input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=new J(B,"SDK Worker output");e.pipe(t);let s=gi({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForWorkerExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupAbortListener();let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??Je;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>as&&(this.stderrTail=this.stderrTail.slice(-as))}createWorkerError(e){return new oe(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===he))return new oe(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,s)=>{let r=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,s(a)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};var at=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;closePromise;cleanup;cleanupPromise;async initialize(){if(this.closed){await this.closePromise;return}try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){await 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(){return this.closePromise||(this.closed=!0,this.pending.length=0,this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{if(await this.initialize(),this.closed)return;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,e.transport))),this.bootstrapPromise}async performClose(){let e=this.transport;if(!e&&this.bootstrapPromise)try{e=await this.bootstrapPromise}catch{await this.runCleanup();return}try{await e?.close()}finally{await this.runCleanup()}}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as yi,mkdirSync as Si}from"fs";import{dirname as wi}from"path";var vi="QODER_AGENT_SDK_DEBUG";function bi(n){return n.debugFile?!0:n.debug===!0||_i(process.env[vi])}function ki(n){if(n.debugFile)return n.debugFile}function _i(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var ut=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=bi(e),this.debugFile=ki(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let s=this.formatLine(e,t),r=this.debugFile;if(r){this.writeToFile(r,s);return}this.writeToStderr(s)}get filePath(){return this.debugFile}writeToFile(e,t){try{Si(wi(e),{recursive:!0}),yi(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let s=new Date().toISOString(),r=this.formatError(t);return`${s} ${e}${r}
6
+ `;if(ye(t,B,"SDK Worker input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=new J(B,"SDK Worker output");e.pipe(t);let s=hi({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForWorkerExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupAbortListener();let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??Je;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>us&&(this.stderrTail=this.stderrTail.slice(-us))}createWorkerError(e){return new oe(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===he))return new oe(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,s)=>{let r=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,s(a)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupLaunchArtifacts(){await this.launchOptionsBuilder.cleanupLaunchArtifacts()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};var at=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;closePromise;cleanup;cleanupPromise;async initialize(){if(this.closed){await this.closePromise;return}try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){await 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(){return this.closePromise||(this.closed=!0,this.pending.length=0,this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{if(await this.initialize(),this.closed)return;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,e.transport))),this.bootstrapPromise}async performClose(){let e=this.transport;if(!e&&this.bootstrapPromise)try{e=await this.bootstrapPromise}catch{await this.runCleanup();return}try{await e?.close()}finally{await this.runCleanup()}}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as Si,mkdirSync as wi}from"fs";import{dirname as vi}from"path";var bi="QODER_AGENT_SDK_DEBUG";function ki(n){return n.debugFile?!0:n.debug===!0||Ri(process.env[bi])}function _i(n){if(n.debugFile)return n.debugFile}function Ri(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var ut=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=ki(e),this.debugFile=_i(e),this.stderr=e.stderr}record(e,t){if(!this.enabled)return;let s=this.formatLine(e,t),r=this.debugFile;if(r){this.writeToFile(r,s);return}this.writeToStderr(s)}get filePath(){return this.debugFile}writeToFile(e,t){try{wi(vi(e),{recursive:!0}),Si(e,t,"utf8")}catch{}}writeToStderr(e){try{this.stderr?this.stderr(e):process.stderr.write(e)}catch{}}formatLine(e,t){let s=new Date().toISOString(),r=this.formatError(t);return`${s} ${e}${r}
7
7
  `}formatError(e){if(e===void 0)return"";if(e instanceof Error)return`
8
- ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};import{randomUUID as ji}from"node:crypto";var Y=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}}};import{isAbsolute as Ri}from"node:path";function Ft(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function xe(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-empty string`);return t}function us(n,e){let t=n[e];if(t!==void 0){if(typeof t!="string")throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a string`);return t}}function cs(n,e){let t=n[e];if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative finite number`);return t}}function ls(n,e){let t=n[e];if(!Number.isSafeInteger(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative safe integer`);return t}function Ei(n){if(!Ft(n))throw new TypeError("resolveSessionArtifacts result artifacts must contain objects");let e=xe(n,"path");if(!Ri(e))throw new TypeError('resolveSessionArtifacts result field "path" must be absolute');let t=xe(n,"displayPath"),s=xe(n,"name"),r=us(n,"relativePath"),o=us(n,"mime"),i=cs(n,"size"),a=cs(n,"mtime"),u;if(n.group!==void 0){if(!Ft(n.group))throw new TypeError('resolveSessionArtifacts result field "group" must be an object');u={key:xe(n.group,"key"),name:xe(n.group,"name")}}let c={path:e,displayPath:t,name:s,...u?{group:u}:{},...r!==void 0?{relativePath:r}:{},...i!==void 0?{size:i}:{},...o!==void 0?{mime:o}:{},...a!==void 0?{mtime:a}:{}};if(n.kind==="presented")return{...c,kind:"presented"};if(n.kind!=="changed")throw new TypeError('resolveSessionArtifacts result field "kind" must be "presented" or "changed"');if(typeof n.isNew!="boolean")throw new TypeError('resolveSessionArtifacts result field "isNew" must be a boolean');return{...c,kind:"changed",additions:ls(n,"additions"),deletions:ls(n,"deletions"),isNew:n.isNew}}function ds(n){if(!Ft(n)||!Array.isArray(n.artifacts))throw new TypeError("resolveSessionArtifacts must return an object with an artifacts array");return{artifacts:n.artifacts.map(Ei)}}var N=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},Ne=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},q=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}},W=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}},qe=class extends Error{requestId;code;retryable;details;constructor(e){super(e.message),this.name="ControlRequestError",this.requestId=e.requestId,this.code=e.code,this.retryable=e.retryable===!0,this.details=e.details}};var Kt="1.4.0";var Ci=new Set(["default","acceptEdits","auto","bypassPermissions"]);function je(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Ci.has(n))return n;if(n==="plan")throw new Error('permissionMode="plan" is not supported for daemon Queries; use planMode or setPlanMode() instead.');let e=typeof n=="string"?JSON.stringify(n):n===null?"null":typeof n;throw new Error(`permissionMode=${e} is not supported for daemon Queries; use default, acceptEdits, auto, or bypassPermissions.`)}function Fe(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`goalMaxTurns must be a positive safe integer, received ${String(n)}.`)}function ps(n,e,t,s){return new Promise((r,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){o(u);return}r({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:r,reject:o}),t.onmessage?t.onmessage(e):(s.delete(a),o(new Error(`No message handler registered for MCP server "${n}"`)))})}function ms(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,r=t.get(s);if(r)return r.resolve(e),t.delete(s),!0}return!1}function fs(n,e,t){let s=0,r=`${n}:`,o=Array.from(t.entries());for(let i of o){let[a,u]=i;a.startsWith(r)&&(u.reject(e),t.delete(a),s++)}return s}import{randomUUID as Pi}from"crypto";function ys(n){if(typeof n!="object"||n===null)return!1;let e=n;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var Ti=500,Mi=1024*1024,Ii=6e4,ct=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Ai(e.filePath),s=Oi(e.entries);this.receivedEntryCount+=s.length;let r=hs(t),o=this.states.get(r);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(r,o)),o.entries.push(...s),o.bytes+=xi(s),!this.holding&&(this.options.flushMode==="eager"||o.entries.length>=Ti||o.bytes>=Mi)&&this.drain(o)}async flush(e={}){for(let t of this.states.values())this.drain(t);if(await Promise.all([...this.states.values()].map(t=>t.tail)),e.throwOnError===!0&&this.failures.length>0)throw new AggregateError(this.failures,`SessionStore failed to persist ${this.failures.length} transcript mirror batch(es).`)}async completeBarrier(){if(this.receivedEntryCount===0)throw new Error("SessionStore Fork persistence barrier received no transcript entries.");await this.flush({throwOnError:!0}),this.holding=!1}discardPending(){for(let e of this.states.values())e.entries=[],e.bytes=0}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 Ni(this.options.store,e.key,t,this.options.appendTimeoutMs??Ii)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${hs(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:Pi(),session_id:e.key.sessionId})}})}};function Ai(n){let e=n.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),s=e.slice(t+1);if(t<0||s.length<2)throw new Error(`Invalid transcript mirror path: ${n}`);let r=s[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(s[1]);if(s.length===2&&o)return{projectKey:r,sessionId:gs(o[1])};let i=gs(s[1]),a=s.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return Di(c),{projectKey:r,sessionId:i,subpath:c}}function Oi(n){return n.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function gs(n){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n))throw new Error(`Invalid transcript session id: ${n}`);return n}function Di(n){let e=n.split("/");if(!n||n.includes("\0")||/^[a-z]:/i.test(n)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${n}`)}function hs(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function xi(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Ni(n,e,t,s){await qi(n.append({...e},structuredClone(t)),s)}async function qi(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Ut(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ut=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Ss(){return Math.random().toString(36).substring(2,15)}function ws(n,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:n,request:t}}function vs(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function bs(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function ks(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function _s(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function Rs(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function ke(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function Es(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function Cs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function Ps(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Ts(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function Ms(n){return typeof n=="object"&&n!==null&&n.type==="result"}var Fi="<synthetic>";function Ki(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==Fi?n:{...n,isApiErrorMessage:!0}}var dt=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static GOAL_MAX_TURNS_CAPABILITY="goal_max_turns_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";static SESSION_STORE_FORK_BARRIER_CAPABILITY="session_store_fork_barrier_v1";static BYOK_CONFIG_MANAGEMENT_CAPABILITY="byok_config_management_v1";static REMOTE_PROJECTION_REQUEST_ID_PREFIX="daemon_worker_sdk_";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;resolveSessionArtifacts;resolveStreamInitialization;initResponse;latestCommands=[];initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;sessionStoreForkBarrierComplete=!1;constructor(e,t,s,r,o,i,a,u,c,d,m,p,l,f,y,g,S,b="batched",h,E,C,te,_){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=r??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=h??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=f,this.fetchServiceAccountToken=E,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=g??500,this.memoryCallbacks=C,this.skillEvolutionCallbacks=te,this.resolveSessionArtifacts=_,this.inputStream=new Y(()=>{this.close().catch(()=>{})}),S&&(this.transcriptMirrorBatcher=new ct({store:S,flushMode:b,holdUntilFlush:this.initConfig.requireSessionStoreForkBarrier===!0,diagnostics:c,onMirrorError:P=>this.inputStream.enqueue(P)})),this.readLoopPromise=this.readMessages().catch(P=>{this.inputStream.error(P)}),this.initializationPromise=this.initConfig.resolveInitializationFromStream?this.waitForStreamInitialization():this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let P=this.abortController.signal;P.aborted?this.close().catch(()=>{}):P.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(ys(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(ks(t)){this.handleControlResponse(t);continue}if(_s(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(Rs(t)){this.handleControlCancelRequest(t);continue}if(Es(t)||Cs(t)||Ps(t)||Ts(t))continue;if(Ms(t)){await this.transcriptMirrorBatcher?.flush();let r=t;this.recordInboundSessionMessage(r),this.resultMessage=r,this.pendingErrorResultExit=this.resultMessage.is_error===!0,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(r),this.isSingleTurn&&this.flushBeforeEndInput();continue}let s=Ki(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let r=s;this.validateProtocolHandshake(r),this.cliCapabilities=new Set(r.capabilities??[]),this.replaceLatestCommands(r.commands),this.resolveStreamInitialization&&(this.initResponse=r,this.resolveStreamInitialization(this.initResponse),this.resolveStreamInitialization=void 0)}catch(r){throw this.inputStream.error(r),r}s.type==="system"&&s.subtype==="commands_changed"&&this.replaceLatestCommands(s.commands),this.dispatchMemoryCallbacks(s),this.dispatchSkillEvolutionCallbacks(s),this.notifyAuthExpiredIfNeeded(s),this.inputStream.enqueue(s)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):e=t}finally{await this.flushTranscriptMirrorForLifecycle();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}isStructuredResultExit(e){if(!this.pendingErrorResultExit||e===null||typeof e!="object")return!1;let t=e;return t.exitCode===1&&(t.signal===void 0||t.signal===null)}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let s=e.type==="auth_status"&&!!e.error,r=e.type==="assistant"&&e.error==="authentication_failed";!s&&!r||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(s=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",s)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}dispatchSkillEvolutionCallbacks(e){if(!(e.type!=="system"||e.subtype!=="skill_evolution"||!this.skillEvolutionCallbacks))try{let t=this.skillEvolutionCallbacks.onResult?.(e.result);t!==void 0&&Promise.resolve(t).catch(s=>this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",s))}catch(t){this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",t)}}flushBeforeEndInput(){return this.endInputFlushPromise||(this.endInputFlushPromise=this.performFlushBeforeEndInput()),this.endInputFlushPromise}async performFlushBeforeEndInput(){try{let e=[];this.initConfig.memory!==void 0&&e.push(this.flushMemory()),this.initConfig.evolution?.skill!==void 0&&e.push(this.flushSkillEvolution());let s=(await Promise.allSettled(e)).find(r=>r.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new N;let s=`${t?.requestIdPrefix??""}${Ss()}`,r=ws(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=ke(r.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let d=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
9
- `)}catch(f){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",f)}},p=()=>{d&&(clearTimeout(d),d=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(s)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${s} subtype=${i}`),m(),c(new N))};this.pendingRequests.set(s,{resolve:f=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(f)},reject:f=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,f),c(f)}}),t?.signal?.addEventListener("abort",l,{once:!0}),o>0&&Number.isFinite(o)&&(d=setTimeout(()=>{this.pendingRequests.has(s)&&(this.pendingRequests.delete(s),p(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o}`),m(),c(new Error(`Control request "${ke(r.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(r)+`
10
- `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(f){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,f),c(f)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new qe({requestId:s,message:t.error,code:t.code,retryable:t.retryable,details:t.details});r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)ke(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=ke(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=vs(t,i);this.transport.write(JSON.stringify(a)+`
11
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-r}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=zi(i),c=bs(t,a,u);this.transport.write(JSON.stringify(c)+`
12
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new N}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=Kt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=Is(t),o=Is(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new q(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new N;return new Promise((s,r)=>{let o=()=>{r(new N)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=ke(s),o=s;switch(r){case"resolve_session_artifacts":{if(!this.resolveSessionArtifacts)throw new Error("resolve_session_artifacts_unavailable: No resolveSessionArtifacts callback configured");let i=o.local_session_id,a=o.cwd;if(typeof i!="string"||i.length===0||typeof a!="string"||a.length===0)throw new TypeError("resolve_session_artifacts requires local_session_id and cwd");let u=await this.awaitAbortable(Promise.resolve().then(()=>this.resolveSessionArtifacts(i,a)),t);return ds(u)}case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let d=c.expiresAt;if(d!==void 0&&(!Number.isFinite(d)||d<1e12))throw new Error("job_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token,...d!==void 0?{expires_at:d}:{}}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,d=o.blocked_path,m=o.decision_reason,p=o.title,l=o.display_name,f=o.description,y=o.agent_id,g=o.permission_kind,S=o.options,b=o.details,h=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:d,decisionReason:m,title:p,displayName:l,description:f,toolUseID:u,agentID:y,permissionKind:g,permissionOptions:S,details:b}),t);if(h.behavior==="deny"&&!h.message)throw new Error("Permission deny result must include a message.");return h.behavior==="allow"?{...h,updatedInput:h.updatedInput??a,toolUseID:u}:{...h,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"skill_evolution_should_review":{let i=o.callbackId;if(!i)throw new Error("Skill evolution shouldReview request missing callbackId");let a=this.skillEvolutionCallbacks?.shouldReviewCallbacks.get(i);if(!a)throw new Error(`Unknown skill evolution shouldReview callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Skill evolution shouldReview callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(ps(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,agentId:o.agentId,agentType:o.agentType,resolvedModel:o.resolvedModel,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,d=new Promise((g,S)=>{c=setTimeout(()=>{S(new Ne(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,d]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},l=m?.model;if(typeof l=="string")p.model=l;else if(l!==void 0){let{model:g,...S}=l;p.model=g,p.custom_model={...S,style:S.style??"openai"}}let f=m?.taskId?.trim();f&&(p.task_id=f);let y=m?.subTask?.trim();return y&&(p.sub_task=y),p}default:throw new Error(`Unhandled control request subtype: ${r??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){await this.initConfig.beforeInitialize?.();let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,supportsCommandsChanged:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let d=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(d,c),d});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[r]=i)}if(Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let r=je(this.initConfig.permissionMode);r!==void 0&&(e.permissionMode=r)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.resolveSessionArtifacts!==void 0&&(e.resolveSessionArtifacts=!0),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r,this.replaceLatestCommands(r.commands),this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.goalMaxTurns!==void 0&&!this.cliCapabilities?.has(n.GOAL_MAX_TURNS_CAPABILITY))throw new W(n.GOAL_MAX_TURNS_CAPABILITY);if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new W(n.PLAN_MODE_CAPABILITY);let r={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(r)}return await this.completeSessionStoreForkBarrier(),this.initResponse}async completeSessionStoreForkBarrier(){if(this.initConfig.requireSessionStoreForkBarrier!==!0)return;if(!this.cliCapabilities?.has(n.SESSION_STORE_FORK_BARRIER_CAPABILITY))throw new W(n.SESSION_STORE_FORK_BARRIER_CAPABILITY);let e=this.transcriptMirrorBatcher;if(!e)throw new Error("SessionStore Fork persistence barrier requires a transcript mirror.");await e.completeBarrier(),this.sessionStoreForkBarrierComplete=!0}async flushTranscriptMirrorForLifecycle(){if(this.initConfig.requireSessionStoreForkBarrier===!0&&!this.sessionStoreForkBarrierComplete){this.transcriptMirrorBatcher?.discardPending();return}await this.transcriptMirrorBatcher?.flush()}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}replaceLatestCommands(e){this.latestCommands=(e??[]).map(t=>({...t}))}getLatestCommands(){return this.latestCommands.map(e=>({...e}))}waitForStreamInitialization(){return new Promise(e=>{this.resolveStreamInitialization=e})}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(s,"custom_context")?s.custom_context:this.initConfig.customContext,i=typeof s.uuid=="string"&&s.uuid.trim().length>0?s.uuid:ji(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
13
- `),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async setGoalMaxTurns(e){e!==null&&Fe(e),await this.requireCliCapability(n.GOAL_MAX_TURNS_CAPABILITY);let t={subtype:"set_goal_max_turns",max_turns:e},s=await this.request(t);return Fe(s.goal_max_turns),s.goal_max_turns}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new W(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?je(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async enableRemoteProjection(e,t={}){if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");if(t.fromSequenceNum!==void 0&&(!Number.isSafeInteger(t.fromSequenceNum)||t.fromSequenceNum<=0))throw new TypeError("fromSequenceNum must be a positive safe integer");await this.request({type:"enable_remote_projection",remote_session_id:e,...t.suppressInitialIdleStateEvents===!0?{suppress_initial_idle_state_events:!0}:{},...t.skipInitialFlush===!0?{skip_initial_flush:!0}:{},...t.fromSequenceNum===void 0?{}:{from_sequence_num:t.fromSequenceNum}},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}})}async disableRemoteProjection(e={}){let t=await this.request({type:"disable_remote_projection"},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}});if(!(typeof t?.remote_session_id!="string"||t.remote_session_id.length===0||typeof t.last_sequence_num!="number"||!Number.isSafeInteger(t.last_sequence_num)||t.last_sequence_num<=0))return{remoteSessionId:t.remote_session_id,lastSequenceNum:t.last_sequence_num}}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return await this.initializationResult(),this.getLatestCommands()}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 listByokConfigs(){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs"})).configs}async createByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config}async updateByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"check_byok_config",config:e})}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=$i(e?.usage),s=Bi(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){let e=await this.request({type:"reload_plugins"});return this.replaceLatestCommands(e.commands),e}async reloadSkills(){return await this.requireCliCapability("reload_skills_v1"),await this.request({type:"reload_skills"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new W("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=xn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(s){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",s)}this.closed=!0;for(let[,s]of this.pendingInboundRequests)s.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[s,r]of this.sdkMcpTransports){try{await r.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${s}":`,o)}fs(s,e,this.pendingMcpResponses)}let t;try{await this.transport.close()}catch(s){t={error:s}}try{await this.readLoopPromise}catch{}if(await this.flushTranscriptMirrorForLifecycle(),t)throw t.error}async[Symbol.asyncDispose](){await this.close()}};function ie(n){return typeof n=="object"&&n!==null}function Lt(n){return typeof n=="number"&&Number.isFinite(n)}function Bt(n){return Object.keys(n).length>0}function z(n,e,t){let s=e[t];Lt(s)&&(n[t]=s)}function _e(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function lt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function As(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"total"),z(e,n,"used"),z(e,n,"remaining"),z(e,n,"percentage"),_e(e,n,"unit"),Bt(e)?e:void 0}function Ui(n){if(!ie(n)||Array.isArray(n))return;let e=As(n)??{};return _e(e,n,"detailUrl"),Bt(e)?e:void 0}function Li(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"used"),z(e,n,"cap"),z(e,n,"remaining"),z(e,n,"percentage"),lt(e,n,"available"),_e(e,n,"unit"),Bt(e)?e:void 0}function Bi(n){if(!ie(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Lt(e)||e<0||!ie(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!ie(o)||Array.isArray(o))continue;let i=o.credits;Lt(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function $i(n){if(!ie(n)||Array.isArray(n))return null;let e={};_e(e,n,"userId"),_e(e,n,"userType"),z(e,n,"totalUsagePercentage"),lt(e,n,"isHighestTier"),z(e,n,"expiresAt"),_e(e,n,"upgradeUrl"),lt(e,n,"isQuotaExceeded"),lt(e,n,"isPlanQuotaProrated");let t=As(n.userQuota);t&&(e.userQuota=t);let s=Ui(n.addOnQuota);s&&(e.addOnQuota=s);let r=Li(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function zi(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function Is(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var pt=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 Os}from"crypto";var Qi="QODER_CLOUD_AGENT_API_BASE",Gi="https://api.qoder.com/api/v1/cloud",X={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Wi=1024,Ds=1*1024*1024,xs=4*1024*1024,Hi=8*1024,zt=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"}},mt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Qt=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}},Ji=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Fs(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!Ji.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new mt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Re(t)&&$t(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Re(s)&&$t(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Re(s)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let r=!!s&&Re(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!$t(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Re(n){return"id"in n&&n.id!==void 0}function $t(n){return"create"in n&&n.create!==void 0}function Ks(n){return new Gt(n)}var Gt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=la();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=js();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=Vi(e.options.auth,e.options.env),this.apiBase=Yi(),this.inputStream=new Y(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(ua(e.prompt)).catch(s=>{this.closed||this.inputStream.error(s)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let s=aa(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:X.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===X.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:X.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 listByokConfigs(){this.unsupported("listByokConfigs")}async createByokConfig(e){this.unsupported("createByokConfig")}async updateByokConfig(e){this.unsupported("updateByokConfig")}async deleteByokConfig(e){this.unsupported("deleteByokConfig")}async checkByokConfig(e){this.unsupported("checkByokConfig")}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 reloadSkills(){this.unsupported("reloadSkills")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Re(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...Zi(r)}});t=Ns(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(Re(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Xi(e.create)});return Ns(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let s=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==s&&(t=0),t+=1,await ca(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),s=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;s&&t.searchParams.set("after_id",s),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let r=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await qs(r);if(!r.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(r.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,r="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){r+=s.decode(),r.length>0&&this.consumeSseLine(r,o);break}r+=s.decode(a,{stream:!0});let u;for(;(u=r.indexOf(`
14
- `))!==-1;){let c=r.slice(0,u);r=r.slice(u+1);let d=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(d,o),this.closed)break}r.length>Ds&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Ds} bytes; resetting buffer.`),r="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:na(t.data.join(`
15
- `))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let s=e.indexOf(":"),r=s===-1?e:e.slice(0,s),o=s===-1?"":e.slice(s+1);switch(o.startsWith(" ")&&(o=o.slice(1)),r){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>xs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${xs} 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=j(e.data,"type")??e.event,s=j(e.data,"turn_id"),r={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Os(),session_id:this.sessionId??j(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(r),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case X.agentMessage:{let s=ra(Ke(e.data,"content"));s&&this.assistantTextParts.push(s);return}case X.modelRequestEnd:this.captureUsage(e.data);return;case X.idle:this.idleSeen=!0,this.finishIfIdle();return;case X.error:this.emitErrorResult(e),this.finish();return;case X.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=js(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let s of t)if(this.isCurrentTurnEvent(s.turnId)&&this.handleCurrentTurnEvent(s.event,s.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,s){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Wi&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:s}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(j(e.data,"error")??j(ft(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:Os(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,s=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return ea(s)}captureUsage(e){let t=ft(e,"usage");if(!t)return;this.latestUsage=oa(this.latestUsage,t);let s=A(e,"total_cost_usd")??A(e,"cost_usd")??A(t,"total_cost_usd")??A(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let r=j(e,"model")??j(t,"model");if(r){let o=this.latestModelUsage[r]?.costUSD??0;this.latestModelUsage[r]=ia(this.latestUsage,o+(s??0))}}async requestJson(e,t){let s=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await qs(s);if(s.status===204)return{};try{return await s.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Vi(n,e){if(n?.type!=="accessToken")throw new mt;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new zt(t);return s}function Yi(){return process.env[Qi]?.replace(/\/+$/,"")??Gi}function Xi(n){return Wt({name:n.name,model:n.model,system:n.system,description:n.description,tools:n.tools,mcp_servers:n.mcp_servers,skills:n.skills,metadata:n.metadata})}function Zi(n){return Wt({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>Wt({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function Wt(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function Ns(n,e){let t=j(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function ea(n){let e=sa(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:j(t,"id"),turnId:j(t,"turn_id"),type:j(t,"type")}]):[]}async function qs(n){let e=await ta(n,Hi);return new Qt(n.status,e||n.statusText||"unknown error")}async function ta(n,e){if(!n.body)try{return(await n.text()).slice(0,e)}catch{return""}let t=n.body.getReader(),s=new TextDecoder,r=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,r.push(s.decode(a,{stream:!0}))}r.push(s.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return r.join("").slice(0,e)}function na(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function ft(n,e){let t=Ke(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function sa(n,e){let t=Ke(n,e);return Array.isArray(t)?t:void 0}function j(n,e){let t=Ke(n,e);return typeof t=="string"?t:void 0}function A(n,e){let t=Ke(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Ke(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function ra(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Us(t)?t.text:"").filter(Boolean).join("")||void 0}function oa(n,e){let t=ft(e,"cache_creation"),s=ft(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:A(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:A(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:A(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:A(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:A(e,"input_tokens")??n.input_tokens,output_tokens:A(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:A(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:A(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function ia(n,e){return{inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,webSearchRequests:n.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function aa(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Us(t)?t.text:JSON.stringify(t)).join(`
16
- `):JSON.stringify(e)}function Us(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function ua(n){return typeof n!="string"?n:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:n}]},parent_tool_use_id:null}}()}function js(){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 ca(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function la(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as Sa,chmod as Gs,cp as wa,mkdtemp as va,mkdir as Ws,realpath as Hs,rm as $s,writeFile as ba}from"fs/promises";import{homedir as ka,tmpdir as _a}from"os";import{dirname as Ra,isAbsolute as Js,join as ae,relative as Ea,resolve as Ht,sep as Ca}from"path";import{homedir as da}from"os";import{join as Bs}from"path";var pa=v.configDirName,ma=v.cliHomeEnv,fa=v.configDirEnv,Ls=200;function ga(){return process.env[ma]||da()}function ha(){let n=process.env[fa];return n||Bs(ga(),pa)}function Ee(){return Bs(ha(),"projects")}function ya(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function O(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Ls)return e;let t=Math.abs(ya(n)).toString(36);return`${e.slice(0,Ls)}-${t}`}var Pa=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ta=6e4;async function Vs(n){if(n.resume===void 0&&!n.continue)return;let e=O(await Aa(n.cwd)),t=n.loadTimeoutMs??Ta,s=n.resume!==void 0?n.resume:await Oa(n.store,e,t);if(s===void 0||!Pa.test(s))return;let r={projectKey:e,sessionId:s},o=await zs(n.store,r,t);if(!o)return;let i=n.store.listSubkeys?await Jt(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!xa(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let d=await zs(n.store,{...r,subpath:c},t);d&&a.push({subpath:c,entries:d})}let u;try{u=await va(ae(_a(),"qoder-session-store-")),await Gs(u,448),u=await Hs(u),await Ia(Ma(n.env),u);let c=ae(u,"projects",e),d=ae(c,s);await Ws(c,{recursive:!0,mode:448}),await Qs(ae(c,`${s}.jsonl`),o);for(let{subpath:p,entries:l}of a){let f=Na(d,`${p}.jsonl`),y=l.filter(S=>S.type==="agent_metadata"),g=l.filter(S=>S.type!=="agent_metadata");if(g.length>0&&await Qs(f,g),y.length>0){let S={...y.at(-1)};delete S.type,await Ys(f.slice(0,-6)+".meta.json",JSON.stringify(S))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await $s(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await $s(u,{recursive:!0,force:!0}),c}}function Ma(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??ka();return Ht(n?.[v.configDirEnv]??process.env[v.configDirEnv]??ae(e,v.configDirName))}async function Ia(n,e){for(let t of[".auth","oauth_creds.json"]){let s=ae(n,t);try{await Sa(s),await wa(s,ae(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Aa(n){let e=Ht(n??process.cwd());try{return await Hs(e)}catch{return e}}async function Oa(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await Jt(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((r,o)=>o.mtime-r.mtime)[0]?.sessionId}async function zs(n,e,t){let s=await Jt(n.load({...e}),t,"load");if(!(s===null||s.length===0)){if(!Array.isArray(s))throw new Error("SessionStore load() must return an array or null");return s.map((r,o)=>Da(r,o))}}function Da(n,e){if(n===null||typeof n!="object"||typeof n.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(n);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function xa(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||Js(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Na(n,e){let t=Ht(n,e),s=Ea(n,t);if(s===""||s===".."||s.startsWith(`..${Ca}`)||Js(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Qs(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
17
- `);await Ys(n,t?`${t}
18
- `:"")}async function Ys(n,e){await Ws(Ra(n),{recursive:!0,mode:448}),await ba(n,e,{encoding:"utf8",mode:384}),await Gs(n,384)}async function Jt(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((r,o)=>{s=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var qa=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function ja(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return qa.test(e)}function Ce(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?ja(s)?{transport:"worker",pathToQoderWorkerRuntime:s}:{transport:"process"}:n.executable!==void 0||n.executableArgs!==void 0||n.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}import Xs from"node:path";function Pe(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function Ue(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function Fa(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(Pe(s.id,`options.memory.generation.roots[${t}].id`),Pe(s.path,`options.memory.generation.roots[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${s.id}"`);if(e.add(s.id),s.access!==void 0&&s.access!=="read"&&s.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(s.indexFile!==void 0){Pe(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let r=s.indexFile.replaceAll("\\","/");if(Xs.posix.isAbsolute(r)||Xs.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Ka(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(Pe(s.id,`options.memory.consumption.files[${t}].id`),Pe(s.path,`options.memory.consumption.files[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${s.id}"`);if(e.add(s.id),s.required!==void 0&&typeof s.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function Zs(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(n))throw new TypeError("options.memory must be an object");if(Object.keys(n).length===0)return{};if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(n.projectScope!==void 0&&typeof n.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(n.userScope!==void 0&&typeof n.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(n.mode==="native"){if(n.projectScope===!1&&n.userScope===!1)throw new TypeError("options.memory native mode requires at least one enabled scope; use memory: {} to disable SDK memory");let i=Object.keys(n.generation??{}),a=Object.keys(n.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return Ue(n.generation?.onResult,"options.memory.generation.onResult"),Ue(n.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native",...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{}},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n.generation?.onResult,onConsumptionResult:n.consumption?.onResult}}}let t,s=n.generation;if(s!==void 0){if(!s||typeof s!="object")throw new TypeError("options.memory.generation must be an object");if(s.enabled!==void 0&&typeof s.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");Fa(s.roots),s.prompt!==void 0&&Pe(s.prompt,"options.memory.generation.prompt"),Ue(s.onResult,"options.memory.generation.onResult");let i;if(s.turnComplete!==void 0){let a=s.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if(Ue(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(s.turnComplete?.enabled===!0&&s.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:s.enabled??!0,roots:s.roots?.map(a=>({...a})),prompt:s.prompt,turnComplete:i}}let r,o=n.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Ka(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"');Ue(o.onResult,"options.memory.consumption.onResult"),r={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:n.mode,...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{},generation:t,consumption:r},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:o?.onResult}}}var gt=10;function Ua(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function ht(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function er(n){if(n!==void 0){if(!Number.isInteger(n)||n<1||n>10)throw new TypeError(`options.evolution.skill.generation.turnComplete.reviewThreshold must be an integer between 1 and ${10}`);return n}}function La(n){let e={shouldReviewCallbacks:new Map};if(n===void 0)return{config:void 0,callbacks:e};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill.generation must be an object");if("roots"in n)throw new TypeError("options.evolution.skill.generation does not accept roots; roots are derived from loaded skills");if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");if(n.prompt!==void 0&&Ua(n.prompt,"options.evolution.skill.generation.prompt"),n.maxSuggestions!==void 0&&(!Number.isInteger(n.maxSuggestions)||n.maxSuggestions<1||n.maxSuggestions>10))throw new TypeError("options.evolution.skill.generation.maxSuggestions must be an integer between 1 and 10");ht(n.onResult,"options.evolution.skill.generation.onResult");let t;if(n.turnComplete!==void 0){if(!n.turnComplete||typeof n.turnComplete!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(n.turnComplete.enabled!==void 0&&typeof n.turnComplete.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.turnComplete.enabled must be a boolean");let s=er(n.turnComplete.reviewThreshold);if(ht(n.turnComplete.shouldReview,"options.evolution.skill.generation.turnComplete.shouldReview"),n.turnComplete.timeoutMs!==void 0&&(!Number.isFinite(n.turnComplete.timeoutMs)||n.turnComplete.timeoutMs<=0))throw new TypeError("options.evolution.skill.generation.turnComplete.timeoutMs must be a positive finite number");if(n.turnComplete.onGateError!==void 0&&n.turnComplete.onGateError!=="skip"&&n.turnComplete.onGateError!=="report_failed")throw new TypeError('options.evolution.skill.generation.turnComplete.onGateError must be "skip" or "report_failed"');let r=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;r&&e.shouldReviewCallbacks.set(r,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:r,timeoutMs:n.turnComplete.timeoutMs,onGateError:n.turnComplete.onGateError}}if(n.turnComplete!==void 0&&t?.enabled===!0&&n.enabled===!1)throw new TypeError("options.evolution.skill.generation.turnComplete cannot be enabled when generation.enabled is false");return{config:{enabled:n.enabled??!0,prompt:n.prompt,maxSuggestions:n.maxSuggestions,turnComplete:t},callbacks:{...e,onResult:n.onResult}}}function tr(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill must be an object");if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.evolution.skill.mode must be "native" or "custom"');let e=n.generation;if(n.mode==="native"){if(Object.keys(e??{}).some(i=>i!=="enabled"&&i!=="onResult"&&i!=="turnComplete"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.enabled, generation.onResult, and generation.turnComplete.reviewThreshold');if(e?.enabled!==void 0&&typeof e.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");let r=e?.turnComplete;if(r!==void 0){if(!r||typeof r!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(Object.keys(r).some(i=>i!=="reviewThreshold"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.turnComplete.reviewThreshold')}let o=er(r?.reviewThreshold);return e?.enabled===!1?(ht(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(ht(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...o===void 0?{}:{generation:{turnComplete:{reviewThreshold:o}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=La(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as hu}from"node:child_process";import{createInterface as Va}from"node:readline";var w=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function Zt(n){if(n.trim().length===0)throw new w("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new w("daemon protocol line must contain valid JSON")}let t=D(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new w("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":$a(t);break;case"control_response":za(t);break;case"status_event":Ba(t);break;case"keep_alive":F(t,["type"],"keep_alive frame");break;case"session_input":case"session_output":throw new w(`${String(t.type)} is not supported on the v2 wire`);default:if(R(t,"type"),!Ga(t.type))throw new w(`unknown daemon message type: ${String(t.type)}`);Qa(t),en(t)}return t}function sr(n){let e=JSON.stringify(n);return Zt(e),e}function rr(n,e){let t=e.response.response;switch(n){case"initialize":{Xt(e,"initialize response");let s=D(t,"initialize response");if(F(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==2)throw new w(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return R(s,"daemon_version"),Ha(s,"capabilities"),s}case"open_session":{let s=Yt(e,"open_session response");return Vt(t,"open_session"),{session_id:s}}case"list_sessions":{Xt(e,"list_sessions response");let s=D(t,"list_sessions response");F(s,["sessions"],"list_sessions response");let r=s.sessions;if(!Array.isArray(r))throw new w("sessions must be an array");for(let[o,i]of r.entries())nr(D(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{Yt(e,"rename_session response");let s=D(t,"rename_session response");return F(s,["session"],"rename_session response"),nr(D(s.session,"rename_session session"),"rename_session session"),s}case"close_session":return Yt(e,`${n} response`),Vt(t,n),null;case"delete_session":case"shutdown":return Xt(e,`${n} response`),Vt(t,n),null;default:throw new w(`unknown daemon command result method: ${String(n)}`)}}function Ba(n){if(F(n,["type","status","data"],"status_event frame"),n.status!=="daemon.session_updated")throw new w("unsupported status_event status");let e=D(n.data,"status_event data");if(F(e,["local_session_id","state","error"],"status_event data"),R(e,"local_session_id"),e.state!=="failed")throw new w("status_event state must be failed");D(e.error,"status_event error")}function $a(n){F(n,["type","request_id","session_id","request"],"control_request frame"),R(n,"request_id"),en(n);let e=D(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new w("control request must have a non-empty string type or subtype")}function za(n){F(n,["type","session_id","response"],"control_response frame"),en(n);let e=D(n.response,"control response");R(e,"request_id");let t=R(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new w("success control response must not include error fields");F(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&D(e.response,"success response result");return}if(t!=="error")throw new w(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new w("error control response must not include response");if(F(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),R(e,"error"),e.code!==void 0&&R(e,"code"),e.retryable!==void 0&&Wa(e,"retryable"),e.details!==void 0&&D(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new w("pending_permission_requests must be an array")}function nr(n,e){F(n,["local_session_id","title","cwd","state","created_at","updated_at"],e),R(n,"local_session_id"),n.cwd!==void 0&&R(n,"cwd"),R(n,"title");let t=R(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new w(`${e} has invalid state: ${t}`);R(n,"created_at"),R(n,"updated_at")}function Vt(n,e){if(n!==void 0)throw new w(`${e} success must omit response`)}function Yt(n,e){let t=n;try{return R(t,"session_id")}catch{throw new w(`${e} requires a valid session_id`)}}function Xt(n,e){if(Object.hasOwn(n,"session_id"))throw new w(`${e} must not include session_id`)}function en(n){let e=n;e.session_id!==void 0&&R(e,"session_id")}function Qa(n){for(let e of["session_epoch","sequence"])if(Object.hasOwn(n,e))throw new w(`${e} is reserved for daemon-internal Session ordering`)}function Ga(n){return typeof n=="string"&&["user","assistant","stream_event","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function D(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new w(`${e} must be a JSON object`);return n}function R(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new w(`${e} must be a non-empty string`);return t}function Wa(n,e){let t=n[e];if(typeof t!="boolean")throw new w(`${e} must be a boolean`);return t}function Ha(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new w(`${e} must be an array of strings`);return t}function F(n,e,t){let s=new Set(e),r=Object.keys(n).find(o=>!s.has(o));if(r!==void 0)throw new w(`${t} contains unknown field: ${r}`)}var yt=class{constructor(e,t){this.connection=e;this.options=t}messages=new Y;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;closePromise;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=Ja(e);if(this.trackOutboundCommand(t),!this.sessionId||this.flushingPendingMessages){if(!this.initializePromise)throw new Error("Transport is not ready or has been closed");this.pendingMessages.push(t);return}let s;try{s=or(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){return this.closePromise||(this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t=await this.connection.openSession({worker_args:[...this.options.workerArgs],...this.options.cwd!==void 0?{cwd:this.options.cwd}:{},...this.options.configDir!==void 0?{config_dir:this.options.configDir}:{}},this);if(this.sessionId=t,e=t,this.closed){await this.releaseSessionOnce(t);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let s=this.pendingMessages.map(r=>or(r,t));this.pendingMessages.splice(0);for(let r of s)await this.connection.sendSessionMessage(r)}}finally{this.flushingPendingMessages=!1}}catch(t){throw e!==void 0&&this.startRelease(e),this.fail(t),t}}failAndRelease(e){let t=this.sessionId;t!==void 0&&this.startRelease(t),this.fail(e)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.close().catch(()=>{})}async performClose(){this.closed||(this.closed=!0,this.cleanup());try{this.initializePromise&&await this.initializePromise.catch(()=>{}),this.releasePromise?await this.releasePromise:this.sessionId&&await this.releaseSessionOnce(this.sessionId),this.messages.done()}catch(e){throw this.messages.error(e),e}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function Ja(n){let e;try{e=JSON.parse(n.trim())}catch{throw new Error("Query transport input must contain valid JSON")}if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Query transport input must be a JSON object");return e}function or(n,e){if(Object.hasOwn(n,"session_id")&&n.session_id!==e)throw new Error(`Query message session_id must match daemon Session: expected ${e}, received ${String(n.session_id)}`);return{...n,session_id:e}}var nn="multi_session_v2",ir="session_title_sync_v1",ar="session_delete_v1";var Ya=3e4,sn=3e4,Xa=125e3,Za=12e4,eu=5e3,tu=1024,nu=64,su=8*1024*1024,ru=256,ou=32*1024*1024,iu=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token"]),St=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRpcError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},ue=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRequestError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},wt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;closedSessionIds=new Set;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;failureListeners=new Set;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.maxFrameBytes=e.maxFrameBytes??B,!Number.isSafeInteger(this.maxFrameBytes)||this.maxFrameBytes<=0)throw new TypeError("maxFrameBytes must be a positive safe integer");this.readTask=this.readOutput(e.output)}async initialize(e,t=[],s=Ya){if(this.initialized)throw new w("daemon connection is already initialized");if(this.initializing)throw new w("daemon initialize is already in progress");this.initializing=!0;let r,o=typeof t=="number"?[]:t,i=typeof t=="number"?t:s,a=this.request("initialize",{daemon_protocol_version:2,sdk_version:e,capabilities:[nn,...o]}),u=new Promise((d,m)=>{r=setTimeout(()=>{let p=new Error(`Qoder CLI daemon did not initialize within ${i}ms`);this.fail(p),m(p)},i)}),c;try{c=await Promise.race([a,u])}finally{this.initializing=!1,r&&clearTimeout(r)}if(!c.capabilities.includes(nn))throw new w(`daemon is missing required capability: ${nn}`);for(let d of c.capabilities)this.capabilities.add(d);this.initialized=!0}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new yt(this,e)}supportsCapability(e){return this.capabilities.has(e)}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){return(await this.request("open_session",e,t,void 0,Za)).session_id}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,Xa,"request")).sessions}renameSession(e,t){return this.capabilities.has(ir)?this.request("rename_session",{title:t},void 0,e,sn):Promise.reject(new w(`daemon is missing required capability: ${ir}`))}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("close_session",{},void 0,e,sn)}async deleteSession(e){if(!this.capabilities.has(ar))throw new w(`daemon is missing required capability: ${ar}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,sn)}async shutdown(e=eu){if(this.stopping){await this.readTask.catch(()=>{});return}this.stopping=!0;for(let t of this.sessions.values())t.fail(new Error("Daemon is stopping"));this.sessions.clear();try{this.failure||await this.request("shutdown",{},void 0,void 0,e)}finally{!this.input.destroyed&&!this.input.writableEnded&&this.input.end()}}fail(e,t=!0){let s=e instanceof Error?e:new Error(String(e));if(!this.failure){this.failure=s;for(let r of this.pendingRequests.values())r.timeout&&clearTimeout(r.timeout),r.reject(s);this.pendingRequests.clear(),this.timedOutRequestIds.clear(),this.clearPendingSessionMessages();for(let r of this.sessions.values())r.fail(s);if(this.sessions.clear(),t)for(let r of this.failureListeners)try{r(s)}catch{}}}request(e,t,s,r,o,i="connection"){if(this.failure)return Promise.reject(this.failure);if(e!=="initialize"&&!this.initialized)return Promise.reject(new w("daemon connection is not initialized"));let a=`sdk_daemon_${this.nextRequestId++}`,u={type:"control_request",request_id:a,...r!==void 0?{session_id:r}:{},request:{type:`daemon.${e}`,...t}};return new Promise((c,d)=>{let m={method:e,resolve:p=>c(p),reject:d,...s?{sessionTransport:s}:{},...r!==void 0?{sessionId:r}:{}};o!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new w(`daemon ${e} request timed out after ${o}ms`);if(i==="request"){this.pendingRequests.delete(a),this.rememberTimedOutRequestId(a),m.reject(p);return}this.fail(p)},o),m.timeout.unref?.()),this.pendingRequests.set(a,m),this.writeFrame(u).catch(p=>{let l=this.pendingRequests.get(a);l?.timeout&&clearTimeout(l.timeout),this.pendingRequests.delete(a),d(p),l?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new J(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=Va({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=au(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(Zt(r))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(new Error("Daemon connection closed"),!1)}catch(r){this.fail(r)}finally{s.close(),e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="control_response"){let s=e,r=s.response.request_id;if(this.pendingRequests.has(r)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(r))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,r=uu(s);if(r==="valid"){this.acceptRequest(s);return}if(r==="contradictory")throw new w(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="status_event"){this.acceptSessionUpdatedStatusEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=tu){let t=this.timedOutRequestIds.values().next().value;t!==void 0&&this.timedOutRequestIds.delete(t)}this.timedOutRequestIds.add(e)}routeSessionMessage(e){let t=e.session_id;if(typeof t!="string"||t.length===0)throw new w(`daemon Session message requires a valid session_id: ${String(t)}`);let s=this.sessions.get(t);if(s){s.acceptOutput(e);return}if(this.hasPendingSessionRequest()){this.bufferPendingSessionMessage(t,e);return}if(!this.closedSessionIds.has(t))throw new w(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new w(`daemon response has unknown request_id: ${t}`);if(s.timeout&&clearTimeout(s.timeout),s.sessionId!==void 0&&e.session_id!==s.sessionId){this.pendingRequests.delete(t),s.reject(new w(`${s.method} response session_id does not match request: expected ${s.sessionId}, received ${String(e.session_id)}`));return}if(this.pendingRequests.delete(t),e.response.subtype==="error"){if(s.method==="initialize"&&e.response.code==="PROTOCOL_VERSION_UNSUPPORTED"){s.reject(new q("1","2"));return}s.reject(new St({code:e.response.code??"DAEMON_REQUEST_FAILED",message:e.response.error,retryable:e.response.retryable??!1,...e.response.details===void 0?{}:{details:e.response.details}})),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned();return}try{let r=e,o=r.response.response?.daemon_protocol_version;if(s.method==="initialize"&&typeof o=="number"&&o!==2)throw new q(String(o),String(2));let i=rr(s.method,r);if(s.sessionTransport){let a=i.session_id;if(typeof a!="string"||a.length===0)throw new w(`${s.method} did not return a valid session_id`);let u=this.takePendingSessionMessages(a);this.closedSessionIds.delete(a);let c=this.failIfSessionMessagesAreOrphaned(`${s.method} response session_id does not match buffered output`);if(c)throw c;if(this.sessions.has(a)){let d=new w(`daemon returned duplicate session_id: ${a}`);throw this.fail(d),d}this.sessions.set(a,s.sessionTransport);for(let d of u)s.sessionTransport.acceptOutput(d)}s.resolve(i)}catch(r){s.reject(r instanceof Error?r:new Error(String(r))),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned()}}hasPendingSessionRequest(){return[...this.pendingRequests.values()].some(e=>e.sessionTransport!==void 0)}failIfSessionMessagesAreOrphaned(e="daemon left orphaned pre-response Session output"){if(this.hasPendingSessionRequest())return;for(let r of this.pendingSessionMessages.keys())this.closedSessionIds.has(r)&&this.deletePendingSessionMessages(r);if(this.pendingSessionMessages.size===0)return;let t=[...this.pendingSessionMessages.keys()].join(", "),s=new w(`${e}: ${t}`);return this.clearPendingSessionMessages(),this.fail(s),s}bufferPendingSessionMessage(e,t){let s=this.pendingSessionMessages.get(e)??[],r=Buffer.byteLength(JSON.stringify(t),"utf8"),o=this.pendingSessionMessageBytes.get(e)??0;if(s.length+1>nu||o+r>su||this.pendingSessionMessageFrameCount+1>ru||this.pendingSessionMessageByteCount+r>ou)throw new w("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,o+r),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=r}takePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)??[];return this.deletePendingSessionMessages(e),t}deletePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)?.length??0,s=this.pendingSessionMessageBytes.get(e)??0;this.pendingSessionMessages.delete(e),this.pendingSessionMessageBytes.delete(e),this.pendingSessionMessageFrameCount-=t,this.pendingSessionMessageByteCount-=s}clearPendingSessionMessages(){this.pendingSessionMessages.clear(),this.pendingSessionMessageBytes.clear(),this.pendingSessionMessageFrameCount=0,this.pendingSessionMessageByteCount=0}rejectLegacyInitialize(e){let t=this.pendingRequests.get(e);return t?.method!=="initialize"?!1:(this.pendingRequests.delete(e),t.reject(new q("1","2")),!0)}acceptRequest(e){if(!this.initialized){this.writeInboundError(e.request_id,"DAEMON_NOT_INITIALIZED","daemon reverse RPC is unavailable before initialize completes");return}if(this.activeInboundRequestIds.has(e.request_id)){this.writeInboundError(e.request_id,"DUPLICATE_REQUEST_ID",`daemon request_id is already active: ${e.request_id}`);return}if(!this.requestHandler){this.writeInboundError(e.request_id,"METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${e.request.type}`);return}this.activeInboundRequestIds.add(e.request_id),Promise.resolve().then(()=>this.requestHandler(e)).then(t=>{let s={type:"control_response",response:{subtype:"success",request_id:e.request_id,...t===null?{}:{response:t}}};return this.writeFrame(s)}).catch(t=>{let s=t instanceof ue?t:void 0,r={type:"control_response",response:{subtype:"error",request_id:e.request_id,code:s?.code??"SDK_REQUEST_FAILED",error:t instanceof Error?t.message:String(t),retryable:s?.retryable??!1,...s?.details?{details:s.details}:{}}};return this.writeFrame(r)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let r={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(r).catch(o=>this.fail(o))}acceptSessionUpdatedStatusEvent(e){let t=e.data.local_session_id,s=this.sessions.get(t);s&&(this.sessions.delete(t),this.closedSessionIds.add(t),s.fail(cu(e.data)))}writeFrame(e){let t;try{t=`${sr(e)}
19
- `,ye(t,this.maxFrameBytes,"SDK daemon input")}catch(r){let o=r instanceof Error?r:new Error(String(r));return this.fail(o),Promise.reject(o)}let s=this.writeChain.then(()=>new Promise((r,o)=>{this.input.write(t,"utf8",i=>{if(i){o(i);return}r()})}));return this.writeChain=s.catch(()=>{}),s.catch(r=>this.fail(r)),s}};function au(n){let e;try{e=JSON.parse(n)}catch{return}if(!ur(e)||!cr(e,["protocol_version","frame_type","request_id","ok","error"])||e.protocol_version!==1||e.frame_type!=="response"||e.ok!==!1||typeof e.request_id!="string"||e.request_id.length===0)return;let t=e.error;if(!(!ur(t)||!cr(t,["code","message","retryable"])||t.code!=="PROTOCOL_VERSION_UNSUPPORTED"||typeof t.message!="string"||t.message.length===0||t.retryable!==!1))return e.request_id}function ur(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function cr(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function uu(n){let e=iu.has(n.request.type),t=n.request_id.startsWith("daemon_sdk_");return e&&t&&n.session_id===void 0?"valid":e||t?"contradictory":"none"}function cu(n){let e=n.error,t=typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{},s=typeof t.message=="string"&&t.message.length>0?t.message:"Qoder CLI Worker exited before Session completed",r=t.exit_code===null||typeof t.exit_code=="number"?t.exit_code:void 0,o=t.signal===null||typeof t.signal=="string"?t.signal:void 0,i=typeof t.stderr=="string"&&t.stderr.length>0?t.stderr:void 0;return new I(s,{exitCode:r,signal:o,stderr:i})}var lu=3e4;function lr(n,e=lu){return gu(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return du(n,t,e);case"daemon.auth.fetch_service_account_token":return pu(n,t,e);default:throw x("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}async function du(n,e,t){if(n.type!=="jobToken")throw x("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=dr(e,["reason","session_id"]),r=pr(s.reason),o=mu(s.session_id,"session_id"),i=new AbortController;try{let a=await mr(()=>n.fetchJobToken({requestId:e.request_id,reason:r,sessionId:o},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw x("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");return{token:a.token}}catch(a){throw a instanceof ue?a:x("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function pu(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw x("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=dr(e,["reason","required_scopes"]);pr(s.reason),fu(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await mr(()=>n.fetchServiceAccountToken(),t,r);if(!o||typeof o.token!="string"||!o.token)throw x("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=o.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw x("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:o.token,...i!==void 0?{expires_at:i}:{}}}catch(o){throw o instanceof ue?o:x("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function dr(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw x("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function pr(n){if(n!=="initial"&&n!=="unauthorized")throw x("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function mu(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw x("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function fu(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw x("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function mr(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((r,o)=>{s=setTimeout(()=>{t.abort(),o(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function gu(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function x(n,e,t=!1){return new ue({code:n,message:e,retryable:t})}var yu="QODER_AGENT_SDK_DAEMON",Su="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",wu="ELECTRON_RUN_AS_NODE",vu=30*6e4,fr=2e3,gr=8192,hr=255,wr=new WeakMap;function un(n){return wr.get(n)}async function cn(n){let e=n.workerIdleTimeoutMs??vu;ku(e);let t=new G({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await _u(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[yu]:"1",[Su]:String(e)},i;try{i=await an.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let a=new wt({input:i.process.stdin,output:i.process.stdout,requestHandler:lr(n.auth)});i.setConnection(a),await a.initialize(Ve,["session_delete_v1"]),await t.cleanupAuthPayload();let u=new rn(a,i);return wr.set(u,{auth:n.auth,transportProvider:new on(a,s.env,n.cwd)}),u}catch(a){throw await t.cleanupAuthPayload(),await i?.stop().catch(()=>{}),a}}var rn=class{constructor(e,t){this.connection=e;this.processController=t;this.connection.onFailure(s=>this.acceptDaemonFailure(s)),this.processController.onFailure(s=>this.acceptDaemonFailure(s))}currentState="ready";stopPromise;get state(){return this.currentState}async listSessions(){if(this.currentState!=="ready")throw new Error("Daemon is not ready");return(await this.connection.listSessions()).map(yr)}async renameSession(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let s=bu(t),r=await this.connection.renameSession(e,s);return yr(r.session)}async deleteSession(e){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e)}stop(){return this.stopPromise||(this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),e}}acceptDaemonFailure(e){this.currentState==="ready"&&this.setDaemonState("failed",e)}setDaemonState(e,t){this.currentState!==e&&(this.currentState=e)}};function bu(n){if(typeof n!="string")throw new TypeError("title must be a non-empty string");let e=n.replace(/[\r\n]+/g," ").trim();if(!e)throw new TypeError("title must be a non-empty string");if(e.length>hr)throw new TypeError(`title must be at most ${hr} characters`);return e}function yr(n){return{localSessionId:n.local_session_id,title:n.title,...n.cwd?{cwd:n.cwd}:{},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}var on=class{constructor(e,t,s){this.connection=e;this.daemonEnv=t;this.defaultCwd=s}create(e){let t=new G({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs();return this.connection.createSessionTransport({workerArgs:s,cwd:e.cwd??this.defaultCwd,...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}};function ku(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}async function _u(n){let e=Ce({pathToQoderCLIExecutable:n},se),t,s={};if(e.transport==="worker"){let r=await ve(V(e.pathToQoderWorkerRuntime));t=r.runtimePath,s=r.env}else t=n??H();return tt(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[wu]:"1"}:{}}}:{command:t,args:[],env:s}}var an=class n{constructor(e){this.process=e;this.exited=new Promise(t=>{e.once("exit",()=>t()),e.once("error",()=>t())}),e.stderr?.on("data",t=>{this.stderrTail+=t.toString("utf8"),this.stderrTail.length>gr&&(this.stderrTail=this.stderrTail.slice(-gr))}),e.once("error",t=>{this.reportFailure(new I(`Failed to spawn Qoder CLI daemon: ${t.message}`,{stderr:this.getStderr(),cause:t}))}),e.once("exit",(t,s)=>{this.stopping||this.reportFailure(new I(t!==null?`Qoder CLI daemon exited with code ${t}`:`Qoder CLI daemon terminated by signal ${s}`,{exitCode:t,signal:s,stderr:this.getStderr()}))})}connection;failure;failureListeners=new Set;stderrTail="";exited;stopping=!1;static async spawn(e){let t;try{t=hu(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await Eu(t)}catch(s){throw new I(`Failed to spawn Qoder CLI daemon: ${Ru(s)}`,{cause:s})}if(!t.stdin||!t.stdout)throw t.kill("SIGTERM"),new Error("Qoder CLI daemon did not expose piped stdin/stdout");return new n(t)}setConnection(e){this.connection=e,this.failure&&e.fail(this.failure)}onFailure(e){this.failureListeners.add(e),this.failure&&e(this.failure)}beginStopping(){this.stopping=!0}async stop(){this.beginStopping(),!await Sr(this.exited,fr)&&(this.process.kill("SIGTERM"),!await Sr(this.exited,fr)&&(this.process.kill("SIGKILL"),await this.exited))}getStderr(){return this.stderrTail.trim()||void 0}reportFailure(e){if(!(this.stopping||this.failure)){this.failure=e,this.connection?.fail(e);for(let t of this.failureListeners)t(e)}}};function Ru(n){return n instanceof Error?n.message:String(n)}async function Eu(n){n.pid===void 0&&await new Promise((e,t)=>{let s=()=>{n.off("error",r),e()},r=o=>{n.off("spawn",s),t(o)};n.once("spawn",s),n.once("error",r)})}async function Sr(n,e){let t;try{return await Promise.race([n.then(()=>!0),new Promise(s=>{t=setTimeout(()=>s(!1),e),t.unref?.()})])}finally{t&&clearTimeout(t)}}var ln=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 Cu(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=un(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(Yn(n.transport))return n.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let t=Ce(n,se);return t.transport==="worker"?new be({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Se.default}function dn(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;s&&(r=Pu(t));let o=s?un(s):void 0,i=t.sessionStore,a=t.sessionStoreFlush??"batched",u=Cu(t,s),c=new ut({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(s!==void 0&&c.record("[DaemonRoute] explicit_daemon transport_overridden"),t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");if(t.planMode!==void 0&&typeof t.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");t.goalMaxTurns!==void 0&&Fe(t.goalMaxTurns);let d=o?.auth??t.auth;if(d==null)throw new ln;let m=i!==void 0&&t.forkSession===!0;if(i&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(i&&o===void 0&&!(u instanceof Se)&&!(u instanceof be))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(i&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(i&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(i&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Fs(t),Ks({prompt:e,options:t,diagnostics:c});let p=Zs(t.memory),l=tr(t.evolution?.skill),f=t.onAuthExpired,y=!1,g=f?()=>{y||(y=!0,Promise.resolve(f()).catch(k=>{c.record("[query] onAuthExpired callback threw:",k)}))}:void 0,S=new Map,b=new Map,h=new Map,E={},C={},te={};if(t.mcpServers)for(let[k,U]of Object.entries(t.mcpServers)){let ne=U.tools;if(Array.isArray(ne)&&ne.length>0&&(C[k]=ne),U.type==="sdk"&&"instance"in U&&U.instance){let ge=U.instance;if(S.set(k,ge),ne){let He=Mt(k,ne);He&&(te[k]=He)}let Mn=new pt(He=>{ms(k,He,h)});b.set(k,Mn),ge.connect(Mn).catch(()=>{})}else E[k]=U}let _=Object.keys(E).length>0,P=Object.keys(C).length>0,Ge=t.pathToQoderCLIExecutable,to=t.env,no=d?.type==="jobToken"?d.fetchJobToken:void 0,so=d?.type==="serviceAccount"?d.fetchServiceAccountToken:void 0,We={pathToQoderCLIExecutable:Ge,executable:t.executable,executableArgs:t.executableArgs,env:to,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:d,model:t.model,agent:t.agent,debug:t.debug,diagnostics:c,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:i!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let k=t.allowedTools??[];if(t.skills===void 0)return k.length>0?k:void 0;let U=t.skills==="all"?["Skill"]:t.skills.map(ge=>`Skill(${ge})`),ne=new Set(k);return[...k,...U.filter(ge=>!ne.has(ge))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:_?E:void 0,mcpToolPolicies:P?C: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:g},Cn=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new at(async()=>{let k=await Vs({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:rt(u,{...We,continue:!1})};try{return{transport:rt(u,{...We,env:{...We.env??process.env,[v.configDirEnv]:k.configDir},materializedSessionConfigDir:k.configDir,continue:!1,resume:k.sessionId}),cleanup:k.cleanup}}catch(U){throw await k.cleanup(),U}}):rt(u,We);Cn.initialize().catch(()=>{});let ro=typeof e=="string",fe=t.systemPrompt,Pn,Tn;if(typeof fe=="string")Pn=fe;else if(typeof fe=="object"&&fe!==null&&fe.type==="preset"){let k=fe;if(k.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(k.preset)}`);Tn=k.append}let oo={systemPrompt:Pn,appendSystemPrompt:Tn,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:s!==void 0?t.planMode??!1:t.planMode,promptSuggestions:t.promptSuggestions,goalMaxTurns:t.goalMaxTurns,enableFileCheckpointing:t.enableFileCheckpointing,memory:p.config,evolution:l.config?{skill:l.config}:void 0,customContext:t.customContext,beforeInitialize:void 0,requireSessionStoreForkBarrier:m,...s!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},Pt=new dt(Cn,ro,t.canUseTool,t.hooks,t.abortController,S,oo,t.onElicitation,c,g,t.controlRequestTimeoutMs,b,h,no,t.resolveModel,t.resolveModelTimeoutMs,i,a,te,so,p.callbacks,l.callbacks,t.resolveSessionArtifacts);if(typeof e=="string"){let k={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Pt.streamInput(async function*(){yield k}())}else Pt.streamInput(e);return Pt}function Pu(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=je(n.permissionMode),s=[["auth",n.auth],["transport",n.transport],["env",n.env],["pathToQoderCLIExecutable",n.pathToQoderCLIExecutable],["executable",n.executable],["executableArgs",n.executableArgs],["proxy",n.proxy],["spawnQoderCLIProcess",n.spawnQoderCLIProcess],["closeGraceMs",n.closeGraceMs],["sessionStore",n.sessionStore]].find(([,r])=>r!==void 0);if(s)throw new Error(`options.${s[0]} is part of startDaemon() configuration and cannot be overridden by a daemon-bound Query.`);return e}var pn=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}}},mn=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 Tu(n={}){let e=n.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(n.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new pn,s=dn({prompt:t,options:n.options}),r;try{return await Promise.race([s.initializationResult(),new Promise((o,i)=>{r=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new mn(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as Mu}from"node:fs/promises";import Iu from"node:os";import K from"node:path";var Au=["user","project","local"],hn=new Set(["__proto__","constructor","prototype"]),Ou=/^[\p{L}\p{N}\p{M}._ -]+$/u,Du=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,xu=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Nu=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),qu=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 ce(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function ju(n){let e=n.charCodeAt(0)===65279?n.slice(1):n,t="",s=!1,r=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
8
+ ${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};import{randomUUID as Fi}from"node:crypto";var Y=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}}};import{isAbsolute as Ei}from"node:path";function Ft(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function xe(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-empty string`);return t}function cs(n,e){let t=n[e];if(t!==void 0){if(typeof t!="string")throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a string`);return t}}function ls(n,e){let t=n[e];if(t!==void 0){if(typeof t!="number"||!Number.isFinite(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative finite number`);return t}}function ds(n,e){let t=n[e];if(!Number.isSafeInteger(t)||t<0)throw new TypeError(`resolveSessionArtifacts result field "${e}" must be a non-negative safe integer`);return t}function Ci(n){if(!Ft(n))throw new TypeError("resolveSessionArtifacts result artifacts must contain objects");let e=xe(n,"path");if(!Ei(e))throw new TypeError('resolveSessionArtifacts result field "path" must be absolute');let t=xe(n,"displayPath"),s=xe(n,"name"),r=cs(n,"relativePath"),o=cs(n,"mime"),i=ls(n,"size"),a=ls(n,"mtime"),u;if(n.group!==void 0){if(!Ft(n.group))throw new TypeError('resolveSessionArtifacts result field "group" must be an object');u={key:xe(n.group,"key"),name:xe(n.group,"name")}}let c={path:e,displayPath:t,name:s,...u?{group:u}:{},...r!==void 0?{relativePath:r}:{},...i!==void 0?{size:i}:{},...o!==void 0?{mime:o}:{},...a!==void 0?{mtime:a}:{}};if(n.kind==="presented")return{...c,kind:"presented"};if(n.kind!=="changed")throw new TypeError('resolveSessionArtifacts result field "kind" must be "presented" or "changed"');if(typeof n.isNew!="boolean")throw new TypeError('resolveSessionArtifacts result field "isNew" must be a boolean');return{...c,kind:"changed",additions:ds(n,"additions"),deletions:ds(n,"deletions"),isNew:n.isNew}}function ps(n){if(!Ft(n)||!Array.isArray(n.artifacts))throw new TypeError("resolveSessionArtifacts must return an object with an artifacts array");return{artifacts:n.artifacts.map(Ci)}}var N=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},Ne=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},q=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}},W=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}},Kt="CONTROL_REQUEST_TIMEOUT",ke=class extends Error{requestId;code;retryable;details;constructor(e){super(e.message),this.name="ControlRequestError",this.requestId=e.requestId,this.code=e.code,this.retryable=e.retryable===!0,this.details=e.details}};var Ut="1.4.0";var Pi=new Set(["default","acceptEdits","auto","bypassPermissions"]);function qe(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Pi.has(n))return n;if(n==="plan")throw new Error('permissionMode="plan" is not supported for daemon Queries; use planMode or setPlanMode() instead.');let e=typeof n=="string"?JSON.stringify(n):n===null?"null":typeof n;throw new Error(`permissionMode=${e} is not supported for daemon Queries; use default, acceptEdits, auto, or bypassPermissions.`)}function je(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`goalMaxTurns must be a positive safe integer, received ${String(n)}.`)}function ms(n,e,t,s){return new Promise((r,o)=>{if(!("id"in e&&e.id!==null)){try{t.onmessage?.(e)}catch(u){o(u);return}r({jsonrpc:"2.0"});return}let a=`${n}:${e.id}`;s.set(a,{resolve:r,reject:o}),t.onmessage?t.onmessage(e):(s.delete(a),o(new Error(`No message handler registered for MCP server "${n}"`)))})}function fs(n,e,t){if("id"in e&&e.id!==null){let s=`${n}:${e.id}`,r=t.get(s);if(r)return r.resolve(e),t.delete(s),!0}return!1}function gs(n,e,t){let s=0,r=`${n}:`,o=Array.from(t.entries());for(let i of o){let[a,u]=i;a.startsWith(r)&&(u.reject(e),t.delete(a),s++)}return s}import{randomUUID as Ti}from"crypto";function Ss(n){if(typeof n!="object"||n===null)return!1;let e=n;return e.type==="transcript_mirror"&&typeof e.filePath=="string"&&Array.isArray(e.entries)}var Mi=500,Ii=1024*1024,Ai=6e4,ct=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Oi(e.filePath),s=Di(e.entries);this.receivedEntryCount+=s.length;let r=ys(t),o=this.states.get(r);o||(o={key:t,entries:[],bytes:0,tail:Promise.resolve()},this.states.set(r,o)),o.entries.push(...s),o.bytes+=Ni(s),!this.holding&&(this.options.flushMode==="eager"||o.entries.length>=Mi||o.bytes>=Ii)&&this.drain(o)}async flush(e={}){for(let t of this.states.values())this.drain(t);if(await Promise.all([...this.states.values()].map(t=>t.tail)),e.throwOnError===!0&&this.failures.length>0)throw new AggregateError(this.failures,`SessionStore failed to persist ${this.failures.length} transcript mirror batch(es).`)}async completeBarrier(){if(this.receivedEntryCount===0)throw new Error("SessionStore Fork persistence barrier received no transcript entries.");await this.flush({throwOnError:!0}),this.holding=!1}discardPending(){for(let e of this.states.values())e.entries=[],e.bytes=0}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 qi(this.options.store,e.key,t,this.options.appendTimeoutMs??Ai)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${ys(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:Ti(),session_id:e.key.sessionId})}})}};function Oi(n){let e=n.replaceAll("\\","/").split("/").filter(Boolean),t=e.lastIndexOf("projects"),s=e.slice(t+1);if(t<0||s.length<2)throw new Error(`Invalid transcript mirror path: ${n}`);let r=s[0],o=/^([0-9a-f-]{36})\.jsonl$/i.exec(s[1]);if(s.length===2&&o)return{projectKey:r,sessionId:hs(o[1])};let i=hs(s[1]),a=s.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return xi(c),{projectKey:r,sessionId:i,subpath:c}}function Di(n){return n.map((e,t)=>{if(typeof e!="object"||e===null||typeof e.type!="string")throw new Error(`Transcript mirror entry ${t} is not a typed object`);return e})}function hs(n){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n))throw new Error(`Invalid transcript session id: ${n}`);return n}function xi(n){let e=n.split("/");if(!n||n.includes("\0")||/^[a-z]:/i.test(n)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${n}`)}function ys(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function Ni(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function qi(n,e,t,s){await ji(n.append({...e},structuredClone(t)),s)}async function ji(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Lt(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Lt=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function ws(){return Math.random().toString(36).substring(2,15)}function vs(n,e){let t="type"in e&&!("subtype"in e)?{...e,subtype:e.type}:e;return{type:"control_request",request_id:n,request:t}}function bs(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function ks(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function _s(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function Rs(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function Es(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function Fe(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function Cs(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function Ps(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function Ts(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Ms(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function Is(n){return typeof n=="object"&&n!==null&&n.type==="result"}var Ki="<synthetic>";function Ui(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==Ki?n:{...n,isApiErrorMessage:!0}}var dt=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static GOAL_MAX_TURNS_CAPABILITY="goal_max_turns_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";static SESSION_STORE_FORK_BARRIER_CAPABILITY="session_store_fork_barrier_v1";static BYOK_CONFIG_MANAGEMENT_CAPABILITY="byok_config_management_v1";static REMOTE_PROJECTION_REQUEST_ID_PREFIX="daemon_worker_sdk_";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;resolveSessionArtifacts;resolveStreamInitialization;initResponse;latestCommands=[];initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;sessionStoreForkBarrierComplete=!1;constructor(e,t,s,r,o,i,a,u,c,d,m,p,l,f,y,g,S,b="batched",h,E,C,te,_){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=r??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=h??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=f,this.fetchServiceAccountToken=E,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=y,this.resolveModelTimeoutMs=g??500,this.memoryCallbacks=C,this.skillEvolutionCallbacks=te,this.resolveSessionArtifacts=_,this.inputStream=new Y(()=>{this.close().catch(()=>{})}),S&&(this.transcriptMirrorBatcher=new ct({store:S,flushMode:b,holdUntilFlush:this.initConfig.requireSessionStoreForkBarrier===!0,diagnostics:c,onMirrorError:P=>this.inputStream.enqueue(P)})),this.readLoopPromise=this.readMessages().catch(P=>{this.inputStream.error(P)}),this.initializationPromise=this.initConfig.resolveInitializationFromStream?this.waitForStreamInitialization():this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let P=this.abortController.signal;P.aborted?this.close().catch(()=>{}):P.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(Ss(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(_s(t)){this.handleControlResponse(t);continue}if(Rs(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(Es(t)){this.handleControlCancelRequest(t);continue}if(Cs(t)||Ps(t)||Ts(t)||Ms(t))continue;if(Is(t)){await this.transcriptMirrorBatcher?.flush();let r=t;this.recordInboundSessionMessage(r),this.resultMessage=r,this.pendingErrorResultExit=this.resultMessage.is_error===!0,this.firstResultReceived=!0,this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0,this.inputStream.enqueue(r),this.isSingleTurn&&this.flushBeforeEndInput();continue}let s=Ui(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let r=s;this.validateProtocolHandshake(r),this.cliCapabilities=new Set(r.capabilities??[]),this.replaceLatestCommands(r.commands),this.resolveStreamInitialization&&(this.initResponse=r,this.resolveStreamInitialization(this.initResponse),this.resolveStreamInitialization=void 0)}catch(r){throw this.inputStream.error(r),r}s.type==="system"&&s.subtype==="commands_changed"&&this.replaceLatestCommands(s.commands),this.dispatchMemoryCallbacks(s),this.dispatchSkillEvolutionCallbacks(s),this.notifyAuthExpiredIfNeeded(s),this.inputStream.enqueue(s)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):e=t}finally{await this.flushTranscriptMirrorForLifecycle();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}isStructuredResultExit(e){if(!this.pendingErrorResultExit||e===null||typeof e!="object")return!1;let t=e;return t.exitCode===1&&(t.signal===void 0||t.signal===null)}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let s=e.type==="auth_status"&&!!e.error,r=e.type==="assistant"&&e.error==="authentication_failed";!s&&!r||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(s=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",s)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}dispatchSkillEvolutionCallbacks(e){if(!(e.type!=="system"||e.subtype!=="skill_evolution"||!this.skillEvolutionCallbacks))try{let t=this.skillEvolutionCallbacks.onResult?.(e.result);t!==void 0&&Promise.resolve(t).catch(s=>this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",s))}catch(t){this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",t)}}flushBeforeEndInput(){return this.endInputFlushPromise||(this.endInputFlushPromise=this.performFlushBeforeEndInput()),this.endInputFlushPromise}async performFlushBeforeEndInput(){try{let e=[];this.initConfig.memory!==void 0&&e.push(this.flushMemory()),this.initConfig.evolution?.skill!==void 0&&e.push(this.flushSkillEvolution());let s=(await Promise.allSettled(e)).find(r=>r.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new N;let s=`${t?.requestIdPrefix??""}${ws()}`,r=vs(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Fe(r.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let d=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
9
+ `)}catch(f){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",f)}},p=()=>{d&&(clearTimeout(d),d=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(s)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${s} subtype=${i}`),m(),c(new N))};this.pendingRequests.set(s,{resolve:f=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(f)},reject:f=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,f),c(f)}}),t?.signal?.addEventListener("abort",l,{once:!0}),o>0&&Number.isFinite(o)&&(d=setTimeout(()=>{if(!this.pendingRequests.has(s))return;this.pendingRequests.delete(s),p();let f=Date.now()-a;this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o} elapsed_ms=${f}`),m(),c(new ke({requestId:s,message:`Control request "${i}" timed out after ${o}ms`,code:Kt,details:{requestType:i,timeoutMs:o,elapsedMs:f}}))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(r)+`
10
+ `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(f){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,f),c(f)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new ke({requestId:s,message:t.error,code:t.code,retryable:t.retryable,details:t.details});r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)Fe(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=Fe(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=bs(t,i);this.transport.write(JSON.stringify(a)+`
11
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=success duration_ms=${Date.now()-r}`)}}catch(i){if(!o.signal.aborted){let{error:a,code:u}=Qi(i),c=ks(t,a,u);this.transport.write(JSON.stringify(c)+`
12
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new N}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=Ut;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=As(t),o=As(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new q(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new N;return new Promise((s,r)=>{let o=()=>{r(new N)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=Fe(s),o=s;switch(r){case"resolve_session_artifacts":{if(!this.resolveSessionArtifacts)throw new Error("resolve_session_artifacts_unavailable: No resolveSessionArtifacts callback configured");let i=o.local_session_id,a=o.cwd;if(typeof i!="string"||i.length===0||typeof a!="string"||a.length===0)throw new TypeError("resolve_session_artifacts requires local_session_id and cwd");let u=await this.awaitAbortable(Promise.resolve().then(()=>this.resolveSessionArtifacts(i,a)),t);return ps(u)}case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let d=c.expiresAt;if(d!==void 0&&(!Number.isFinite(d)||d<1e12))throw new Error("job_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token,...d!==void 0?{expires_at:d}:{}}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,d=o.blocked_path,m=o.decision_reason,p=o.title,l=o.display_name,f=o.description,y=o.agent_id,g=o.permission_kind,S=o.options,b=o.details,h=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:d,decisionReason:m,title:p,displayName:l,description:f,toolUseID:u,agentID:y,permissionKind:g,permissionOptions:S,details:b}),t);if(h.behavior==="deny"&&!h.message)throw new Error("Permission deny result must include a message.");return h.behavior==="allow"?{...h,updatedInput:h.updatedInput??a,toolUseID:u}:{...h,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"skill_evolution_should_review":{let i=o.callbackId;if(!i)throw new Error("Skill evolution shouldReview request missing callbackId");let a=this.skillEvolutionCallbacks?.shouldReviewCallbacks.get(i);if(!a)throw new Error(`Unknown skill evolution shouldReview callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Skill evolution shouldReview callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(ms(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,agentId:o.agentId,agentType:o.agentType,resolvedModel:o.resolvedModel,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,d=new Promise((g,S)=>{c=setTimeout(()=>{S(new Ne(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,d]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},l=m?.model;if(typeof l=="string")p.model=l;else if(l!==void 0){let{model:g,...S}=l;p.model=g,p.custom_model={...S,style:S.style??"openai"}}let f=m?.taskId?.trim();f&&(p.task_id=f);let y=m?.subTask?.trim();return y&&(p.sub_task=y),p}default:throw new Error(`Unhandled control request subtype: ${r??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){await this.initConfig.beforeInitialize?.();let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,supportsCommandsChanged:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let d=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(d,c),d});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[r]=i)}if(Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let r=qe(this.initConfig.permissionMode);r!==void 0&&(e.permissionMode=r)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.resolveSessionArtifacts!==void 0&&(e.resolveSessionArtifacts=!0),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r,this.replaceLatestCommands(r.commands),this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.goalMaxTurns!==void 0&&!this.cliCapabilities?.has(n.GOAL_MAX_TURNS_CAPABILITY))throw new W(n.GOAL_MAX_TURNS_CAPABILITY);if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new W(n.PLAN_MODE_CAPABILITY);let r={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(r)}return await this.completeSessionStoreForkBarrier(),this.initResponse}async completeSessionStoreForkBarrier(){if(this.initConfig.requireSessionStoreForkBarrier!==!0)return;if(!this.cliCapabilities?.has(n.SESSION_STORE_FORK_BARRIER_CAPABILITY))throw new W(n.SESSION_STORE_FORK_BARRIER_CAPABILITY);let e=this.transcriptMirrorBatcher;if(!e)throw new Error("SessionStore Fork persistence barrier requires a transcript mirror.");await e.completeBarrier(),this.sessionStoreForkBarrierComplete=!0}async flushTranscriptMirrorForLifecycle(){if(this.initConfig.requireSessionStoreForkBarrier===!0&&!this.sessionStoreForkBarrierComplete){this.transcriptMirrorBatcher?.discardPending();return}await this.transcriptMirrorBatcher?.flush()}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}replaceLatestCommands(e){this.latestCommands=(e??[]).map(t=>({...t}))}getLatestCommands(){return this.latestCommands.map(e=>({...e}))}waitForStreamInitialization(){return new Promise(e=>{this.resolveStreamInitialization=e})}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(s,"custom_context")?s.custom_context:this.initConfig.customContext,i=typeof s.uuid=="string"&&s.uuid.trim().length>0?s.uuid:Fi(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
13
+ `),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async setGoalMaxTurns(e){e!==null&&je(e),await this.requireCliCapability(n.GOAL_MAX_TURNS_CAPABILITY);let t={subtype:"set_goal_max_turns",max_turns:e},s=await this.request(t);return je(s.goal_max_turns),s.goal_max_turns}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new W(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?qe(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async enableRemoteProjection(e,t={}){if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");if(t.fromSequenceNum!==void 0&&(!Number.isSafeInteger(t.fromSequenceNum)||t.fromSequenceNum<=0))throw new TypeError("fromSequenceNum must be a positive safe integer");await this.request({type:"enable_remote_projection",remote_session_id:e,...t.suppressInitialIdleStateEvents===!0?{suppress_initial_idle_state_events:!0}:{},...t.skipInitialFlush===!0?{skip_initial_flush:!0}:{},...t.fromSequenceNum===void 0?{}:{from_sequence_num:t.fromSequenceNum}},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}})}async disableRemoteProjection(e={}){let t=await this.request({type:"disable_remote_projection"},{requestIdPrefix:n.REMOTE_PROJECTION_REQUEST_ID_PREFIX,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}});if(!(typeof t?.remote_session_id!="string"||t.remote_session_id.length===0||typeof t.last_sequence_num!="number"||!Number.isSafeInteger(t.last_sequence_num)||t.last_sequence_num<=0))return{remoteSessionId:t.remote_session_id,lastSequenceNum:t.last_sequence_num}}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return await this.initializationResult(),this.getLatestCommands()}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{},...e?.outerProviders?{outerProviders:e.outerProviders}:{}};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 listByokConfigs(){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs"})).configs}async createByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config}async updateByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"check_byok_config",config:e})}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=zi(e?.usage),s=$i(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){let e=await this.request({type:"reload_plugins"});return this.replaceLatestCommands(e.commands),e}async reloadSkills(){return await this.requireCliCapability("reload_skills_v1"),await this.request({type:"reload_skills"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new W("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Nn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(s){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",s)}this.closed=!0;for(let[,s]of this.pendingInboundRequests)s.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[s,r]of this.sdkMcpTransports){try{await r.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${s}":`,o)}gs(s,e,this.pendingMcpResponses)}let t;try{await this.transport.close()}catch(s){t={error:s}}try{await this.readLoopPromise}catch{}if(await this.flushTranscriptMirrorForLifecycle(),t)throw t.error}async[Symbol.asyncDispose](){await this.close()}};function ie(n){return typeof n=="object"&&n!==null}function Bt(n){return typeof n=="number"&&Number.isFinite(n)}function $t(n){return Object.keys(n).length>0}function z(n,e,t){let s=e[t];Bt(s)&&(n[t]=s)}function _e(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function lt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function Os(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"total"),z(e,n,"used"),z(e,n,"remaining"),z(e,n,"percentage"),_e(e,n,"unit"),$t(e)?e:void 0}function Li(n){if(!ie(n)||Array.isArray(n))return;let e=Os(n)??{};return _e(e,n,"detailUrl"),$t(e)?e:void 0}function Bi(n){if(!ie(n)||Array.isArray(n))return;let e={};return z(e,n,"used"),z(e,n,"cap"),z(e,n,"remaining"),z(e,n,"percentage"),lt(e,n,"available"),_e(e,n,"unit"),$t(e)?e:void 0}function $i(n){if(!ie(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Bt(e)||e<0||!ie(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!ie(o)||Array.isArray(o))continue;let i=o.credits;Bt(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function zi(n){if(!ie(n)||Array.isArray(n))return null;let e={};_e(e,n,"userId"),_e(e,n,"userType"),z(e,n,"totalUsagePercentage"),lt(e,n,"isHighestTier"),z(e,n,"expiresAt"),_e(e,n,"upgradeUrl"),lt(e,n,"isQuotaExceeded"),lt(e,n,"isPlanQuotaProrated");let t=Os(n.userQuota);t&&(e.userQuota=t);let s=Li(n.addOnQuota);s&&(e.addOnQuota=s);let r=Bi(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function Qi(n){let e=n instanceof Error?n.message:String(n),t=typeof n=="object"&&n!==null?n.code:void 0,s=typeof t=="string"&&t.length>0?t:void 0,r=/^([a-z][a-z0-9_]*):\s*(.*)$/.exec(e);if(r){let o=s??r[1];return(!s||s===r[1])&&(e=r[2]||e),{error:e,code:o}}return s?{error:e,code:s}:{error:e}}function As(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var pt=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 Ds}from"crypto";var Gi="QODER_CLOUD_AGENT_API_BASE",Wi="https://api.qoder.com/api/v1/cloud",X={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},Hi=1024,xs=1*1024*1024,Ns=4*1024*1024,Ji=8*1024,Qt=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"}},mt=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}},Vi=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Ks(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!Vi.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new mt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Re(t)&&zt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Re(s)&&zt(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Re(s)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let r=!!s&&Re(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!zt(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Re(n){return"id"in n&&n.id!==void 0}function zt(n){return"create"in n&&n.create!==void 0}function Us(n){return new Wt(n)}var Wt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=da();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Fs();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=Yi(e.options.auth,e.options.env),this.apiBase=Xi(),this.inputStream=new Y(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(ca(e.prompt)).catch(s=>{this.closed||this.inputStream.error(s)})}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async initializationResult(){return(await this.sessionReadyPromise).init}async streamInput(e){this.activeInputStreams+=1,(async()=>{try{await this.sessionReadyPromise,await this.sseConnected.promise;for await(let t of e){if(this.closed)break;let s=ua(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:X.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===X.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:X.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 listByokConfigs(){this.unsupported("listByokConfigs")}async createByokConfig(e){this.unsupported("createByokConfig")}async updateByokConfig(e){this.unsupported("updateByokConfig")}async deleteByokConfig(e){this.unsupported("deleteByokConfig")}async checkByokConfig(e){this.unsupported("checkByokConfig")}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 reloadSkills(){this.unsupported("reloadSkills")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Re(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...ea(r)}});t=qs(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(Re(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:Zi(e.create)});return qs(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let s=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==s&&(t=0),t+=1,await la(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),s=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;s&&t.searchParams.set("after_id",s),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let r=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await js(r);if(!r.body)throw new Error("Cloud Agent SSE response did not include a body.");this.sseConnected.resolve(),await this.readSseBody(r.body)}async readSseBody(e){let t=e.getReader(),s=new TextDecoder,r="",o={data:[],dataBytes:0};try{for(;!this.closed;){let{done:i,value:a}=await t.read();if(i){r+=s.decode(),r.length>0&&this.consumeSseLine(r,o);break}r+=s.decode(a,{stream:!0});let u;for(;(u=r.indexOf(`
14
+ `))!==-1;){let c=r.slice(0,u);r=r.slice(u+1);let d=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(d,o),this.closed)break}r.length>xs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${xs} bytes; resetting buffer.`),r="",o.id=void 0,o.event=void 0,o.data.length=0,o.dataBytes=0)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}consumeSseLine(e,t){if(e===""){(t.event||t.data.length>0)&&this.handleSseEvent({id:t.id,event:t.event??"message",data:sa(t.data.join(`
15
+ `))}),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}if(e.startsWith(":"))return;let s=e.indexOf(":"),r=s===-1?e:e.slice(0,s),o=s===-1?"":e.slice(s+1);switch(o.startsWith(" ")&&(o=o.slice(1)),r){case"id":t.id=o;break;case"event":t.event=o;break;case"data":if(t.dataBytes+o.length>Ns){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Ns} 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=j(e.data,"type")??e.event,s=j(e.data,"turn_id"),r={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Ds(),session_id:this.sessionId??j(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(r),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case X.agentMessage:{let s=oa(Ke(e.data,"content"));s&&this.assistantTextParts.push(s);return}case X.modelRequestEnd:this.captureUsage(e.data);return;case X.idle:this.idleSeen=!0,this.finishIfIdle();return;case X.error:this.emitErrorResult(e),this.finish();return;case X.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Fs(),this.latestModelUsage={},this.totalCostUsd=0,this.idleSeen=!1}activateTurn(e){this.currentTurnId=e,this.hasCurrentTurn=!0;let t=this.pendingTurnEvents;this.pendingTurnEvents=[];for(let s of t)if(this.isCurrentTurnEvent(s.turnId)&&this.handleCurrentTurnEvent(s.event,s.type),this.closed)break}isCurrentTurnEvent(e){return this.hasCurrentTurn?this.currentTurnId?e===this.currentTurnId:e===void 0:!1}bufferPendingTurnEvent(e,t,s){this.hasCurrentTurn||this.activeInputStreams===0||(this.pendingTurnEvents.length>=Hi&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:s}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(j(e.data,"error")??j(ft(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:Ds(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,s=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return ta(s)}captureUsage(e){let t=ft(e,"usage");if(!t)return;this.latestUsage=ia(this.latestUsage,t);let s=A(e,"total_cost_usd")??A(e,"cost_usd")??A(t,"total_cost_usd")??A(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let r=j(e,"model")??j(t,"model");if(r){let o=this.latestModelUsage[r]?.costUSD??0;this.latestModelUsage[r]=aa(this.latestUsage,o+(s??0))}}async requestJson(e,t){let s=await fetch(`${this.apiBase}${e}`,{method:t.method,headers:this.authHeaders({accept:"application/json",contentType:t.body?"application/json":void 0}),body:t.body?JSON.stringify(t.body):void 0,signal:this.abortController.signal});if(!s.ok)throw this.handleAuthFailure(s.status),await js(s);if(s.status===204)return{};try{return await s.json()}catch{return{}}}authHeaders(e){let t={Authorization:`Bearer ${this.accessToken}`,Accept:e.accept};return e.contentType&&(t["Content-Type"]=e.contentType),t}handleAuthFailure(e){if((e===401||e===403)&&!this.authExpiredFired){this.authExpiredFired=!0;try{this.onAuthExpired?.()}catch(t){this.diagnostics?.record("[cloud-agent] onAuthExpired callback threw:",t)}}}finish(){this.closed||(this.closed=!0,this.abortController.abort(),this.sseConnected.resolve(),this.inputStream.done())}unsupported(e){throw new Error(`Query.${e}() is not supported when options.experimentalCloudAgent is enabled.`)}};function Yi(n,e){if(n?.type!=="accessToken")throw new mt;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new Qt(t);return s}function Xi(){return process.env[Gi]?.replace(/\/+$/,"")??Wi}function Zi(n){return Ht({name:n.name,model:n.model,system:n.system,description:n.description,tools:n.tools,mcp_servers:n.mcp_servers,skills:n.skills,metadata:n.metadata})}function ea(n){return Ht({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>Ht({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function Ht(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function qs(n,e){let t=j(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function ta(n){let e=ra(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:j(t,"id"),turnId:j(t,"turn_id"),type:j(t,"type")}]):[]}async function js(n){let e=await na(n,Ji);return new Gt(n.status,e||n.statusText||"unknown error")}async function na(n,e){if(!n.body)try{return(await n.text()).slice(0,e)}catch{return""}let t=n.body.getReader(),s=new TextDecoder,r=[],o=0;try{for(;o<e;){let{done:i,value:a}=await t.read();if(i)break;o+=a.byteLength,r.push(s.decode(a,{stream:!0}))}r.push(s.decode())}catch{}finally{try{await t.cancel()}catch{}t.releaseLock()}return r.join("").slice(0,e)}function sa(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function ft(n,e){let t=Ke(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ra(n,e){let t=Ke(n,e);return Array.isArray(t)?t:void 0}function j(n,e){let t=Ke(n,e);return typeof t=="string"?t:void 0}function A(n,e){let t=Ke(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Ke(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function oa(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Ls(t)?t.text:"").filter(Boolean).join("")||void 0}function ia(n,e){let t=ft(e,"cache_creation"),s=ft(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:A(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:A(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:A(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:A(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:A(e,"input_tokens")??n.input_tokens,output_tokens:A(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:A(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:A(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function aa(n,e){return{inputTokens:n.input_tokens,outputTokens:n.output_tokens,cacheReadInputTokens:n.cache_read_input_tokens,cacheCreationInputTokens:n.cache_creation_input_tokens,webSearchRequests:n.server_tool_use.web_search_requests,costUSD:e,contextWindow:0,maxOutputTokens:0}}function ua(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ls(t)?t.text:JSON.stringify(t)).join(`
16
+ `):JSON.stringify(e)}function Ls(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function ca(n){return typeof n!="string"?n:async function*(){yield{type:"user",message:{role:"user",content:[{type:"text",text:n}]},parent_tool_use_id:null}}()}function Fs(){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 la(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function da(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as wa,chmod as Ws,cp as va,mkdtemp as ba,mkdir as Hs,realpath as Js,rm as zs,writeFile as ka}from"fs/promises";import{homedir as _a,tmpdir as Ra}from"os";import{dirname as Ea,isAbsolute as Vs,join as ae,relative as Ca,resolve as Jt,sep as Pa}from"path";import{homedir as pa}from"os";import{join as $s}from"path";var ma=v.configDirName,fa=v.cliHomeEnv,ga=v.configDirEnv,Bs=200;function ha(){return process.env[fa]||pa()}function ya(){let n=process.env[ga];return n||$s(ha(),ma)}function Ee(){return $s(ya(),"projects")}function Sa(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function O(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Bs)return e;let t=Math.abs(Sa(n)).toString(36);return`${e.slice(0,Bs)}-${t}`}var Ta=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ma=6e4;async function Ys(n){if(n.resume===void 0&&!n.continue)return;let e=O(await Oa(n.cwd)),t=n.loadTimeoutMs??Ma,s=n.resume!==void 0?n.resume:await Da(n.store,e,t);if(s===void 0||!Ta.test(s))return;let r={projectKey:e,sessionId:s},o=await Qs(n.store,r,t);if(!o)return;let i=n.store.listSubkeys?await Vt(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Na(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let d=await Qs(n.store,{...r,subpath:c},t);d&&a.push({subpath:c,entries:d})}let u;try{u=await ba(ae(Ra(),"qoder-session-store-")),await Ws(u,448),u=await Js(u),await Aa(Ia(n.env),u);let c=ae(u,"projects",e),d=ae(c,s);await Hs(c,{recursive:!0,mode:448}),await Gs(ae(c,`${s}.jsonl`),o);for(let{subpath:p,entries:l}of a){let f=qa(d,`${p}.jsonl`),y=l.filter(S=>S.type==="agent_metadata"),g=l.filter(S=>S.type!=="agent_metadata");if(g.length>0&&await Gs(f,g),y.length>0){let S={...y.at(-1)};delete S.type,await Xs(f.slice(0,-6)+".meta.json",JSON.stringify(S))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await zs(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await zs(u,{recursive:!0,force:!0}),c}}function Ia(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??_a();return Jt(n?.[v.configDirEnv]??process.env[v.configDirEnv]??ae(e,v.configDirName))}async function Aa(n,e){for(let t of[".auth","oauth_creds.json"]){let s=ae(n,t);try{await wa(s),await va(s,ae(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Oa(n){let e=Jt(n??process.cwd());try{return await Js(e)}catch{return e}}async function Da(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await Vt(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((r,o)=>o.mtime-r.mtime)[0]?.sessionId}async function Qs(n,e,t){let s=await Vt(n.load({...e}),t,"load");if(!(s===null||s.length===0)){if(!Array.isArray(s))throw new Error("SessionStore load() must return an array or null");return s.map((r,o)=>xa(r,o))}}function xa(n,e){if(n===null||typeof n!="object"||typeof n.type!="string")throw new Error(`SessionStore entry ${e} is not a typed object`);try{let t=JSON.stringify(n);if(t===void 0)throw new Error("JSON serialization returned undefined");return JSON.parse(t)}catch(t){throw new Error(`SessionStore entry ${e} is not JSON-safe`,{cause:t})}}function Na(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||Vs(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function qa(n,e){let t=Jt(n,e),s=Ca(n,t);if(s===""||s===".."||s.startsWith(`..${Pa}`)||Vs(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function Gs(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
17
+ `);await Xs(n,t?`${t}
18
+ `:"")}async function Xs(n,e){await Hs(Ea(n),{recursive:!0,mode:448}),await ka(n,e,{encoding:"utf8",mode:384}),await Ws(n,384)}async function Vt(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((r,o)=>{s=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var ja=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Fa(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return ja.test(e)}function Ce(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?Fa(s)?{transport:"worker",pathToQoderWorkerRuntime:s}:{transport:"process"}:n.executable!==void 0||n.executableArgs!==void 0||n.spawnQoderCLIProcess!==void 0?{transport:"process"}:t.QODERCLI_PATH?{transport:"process"}:{transport:e}}import Zs from"node:path";function Pe(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function Ue(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function Ka(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(Pe(s.id,`options.memory.generation.roots[${t}].id`),Pe(s.path,`options.memory.generation.roots[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${s.id}"`);if(e.add(s.id),s.access!==void 0&&s.access!=="read"&&s.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(s.indexFile!==void 0){Pe(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let r=s.indexFile.replaceAll("\\","/");if(Zs.posix.isAbsolute(r)||Zs.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function Ua(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(Pe(s.id,`options.memory.consumption.files[${t}].id`),Pe(s.path,`options.memory.consumption.files[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${s.id}"`);if(e.add(s.id),s.required!==void 0&&typeof s.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function er(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(n))throw new TypeError("options.memory must be an object");if(Object.keys(n).length===0)return{};if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(n.projectScope!==void 0&&typeof n.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(n.userScope!==void 0&&typeof n.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(n.mode==="native"){if(n.projectScope===!1&&n.userScope===!1)throw new TypeError("options.memory native mode requires at least one enabled scope; use memory: {} to disable SDK memory");let i=Object.keys(n.generation??{}),a=Object.keys(n.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return Ue(n.generation?.onResult,"options.memory.generation.onResult"),Ue(n.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native",...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{}},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n.generation?.onResult,onConsumptionResult:n.consumption?.onResult}}}let t,s=n.generation;if(s!==void 0){if(!s||typeof s!="object")throw new TypeError("options.memory.generation must be an object");if(s.enabled!==void 0&&typeof s.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");Ka(s.roots),s.prompt!==void 0&&Pe(s.prompt,"options.memory.generation.prompt"),Ue(s.onResult,"options.memory.generation.onResult");let i;if(s.turnComplete!==void 0){let a=s.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if(Ue(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(s.turnComplete?.enabled===!0&&s.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:s.enabled??!0,roots:s.roots?.map(a=>({...a})),prompt:s.prompt,turnComplete:i}}let r,o=n.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(Ua(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"');Ue(o.onResult,"options.memory.consumption.onResult"),r={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:n.mode,...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{},generation:t,consumption:r},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:o?.onResult}}}var gt=10;function La(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function ht(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function tr(n){if(n!==void 0){if(!Number.isInteger(n)||n<1||n>10)throw new TypeError(`options.evolution.skill.generation.turnComplete.reviewThreshold must be an integer between 1 and ${10}`);return n}}function Ba(n){let e={shouldReviewCallbacks:new Map};if(n===void 0)return{config:void 0,callbacks:e};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill.generation must be an object");if("roots"in n)throw new TypeError("options.evolution.skill.generation does not accept roots; roots are derived from loaded skills");if(n.enabled!==void 0&&typeof n.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");if(n.prompt!==void 0&&La(n.prompt,"options.evolution.skill.generation.prompt"),n.maxSuggestions!==void 0&&(!Number.isInteger(n.maxSuggestions)||n.maxSuggestions<1||n.maxSuggestions>10))throw new TypeError("options.evolution.skill.generation.maxSuggestions must be an integer between 1 and 10");ht(n.onResult,"options.evolution.skill.generation.onResult");let t;if(n.turnComplete!==void 0){if(!n.turnComplete||typeof n.turnComplete!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(n.turnComplete.enabled!==void 0&&typeof n.turnComplete.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.turnComplete.enabled must be a boolean");let s=tr(n.turnComplete.reviewThreshold);if(ht(n.turnComplete.shouldReview,"options.evolution.skill.generation.turnComplete.shouldReview"),n.turnComplete.timeoutMs!==void 0&&(!Number.isFinite(n.turnComplete.timeoutMs)||n.turnComplete.timeoutMs<=0))throw new TypeError("options.evolution.skill.generation.turnComplete.timeoutMs must be a positive finite number");if(n.turnComplete.onGateError!==void 0&&n.turnComplete.onGateError!=="skip"&&n.turnComplete.onGateError!=="report_failed")throw new TypeError('options.evolution.skill.generation.turnComplete.onGateError must be "skip" or "report_failed"');let r=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;r&&e.shouldReviewCallbacks.set(r,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:r,timeoutMs:n.turnComplete.timeoutMs,onGateError:n.turnComplete.onGateError}}if(n.turnComplete!==void 0&&t?.enabled===!0&&n.enabled===!1)throw new TypeError("options.evolution.skill.generation.turnComplete cannot be enabled when generation.enabled is false");return{config:{enabled:n.enabled??!0,prompt:n.prompt,maxSuggestions:n.maxSuggestions,turnComplete:t},callbacks:{...e,onResult:n.onResult}}}function nr(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill must be an object");if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.evolution.skill.mode must be "native" or "custom"');let e=n.generation;if(n.mode==="native"){if(Object.keys(e??{}).some(i=>i!=="enabled"&&i!=="onResult"&&i!=="turnComplete"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.enabled, generation.onResult, and generation.turnComplete.reviewThreshold');if(e?.enabled!==void 0&&typeof e.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");let r=e?.turnComplete;if(r!==void 0){if(!r||typeof r!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(Object.keys(r).some(i=>i!=="reviewThreshold"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.turnComplete.reviewThreshold')}let o=tr(r?.reviewThreshold);return e?.enabled===!1?(ht(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(ht(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...o===void 0?{}:{generation:{turnComplete:{reviewThreshold:o}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=Ba(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as yu}from"node:child_process";import{createInterface as Ya}from"node:readline";var w=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function en(n){if(n.trim().length===0)throw new w("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new w("daemon protocol line must contain valid JSON")}let t=D(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new w("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":za(t);break;case"control_response":Qa(t);break;case"status_event":$a(t);break;case"keep_alive":F(t,["type"],"keep_alive frame");break;case"session_input":case"session_output":throw new w(`${String(t.type)} is not supported on the v2 wire`);default:if(R(t,"type"),!Wa(t.type))throw new w(`unknown daemon message type: ${String(t.type)}`);Ga(t),tn(t)}return t}function rr(n){let e=JSON.stringify(n);return en(e),e}function or(n,e){let t=e.response.response;switch(n){case"initialize":{Zt(e,"initialize response");let s=D(t,"initialize response");if(F(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==2)throw new w(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return R(s,"daemon_version"),Ja(s,"capabilities"),s}case"open_session":{let s=Xt(e,"open_session response");return Yt(t,"open_session"),{session_id:s}}case"list_sessions":{Zt(e,"list_sessions response");let s=D(t,"list_sessions response");F(s,["sessions"],"list_sessions response");let r=s.sessions;if(!Array.isArray(r))throw new w("sessions must be an array");for(let[o,i]of r.entries())sr(D(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{Xt(e,"rename_session response");let s=D(t,"rename_session response");return F(s,["session"],"rename_session response"),sr(D(s.session,"rename_session session"),"rename_session session"),s}case"close_session":return Xt(e,`${n} response`),Yt(t,n),null;case"delete_session":case"shutdown":return Zt(e,`${n} response`),Yt(t,n),null;default:throw new w(`unknown daemon command result method: ${String(n)}`)}}function $a(n){if(F(n,["type","status","data"],"status_event frame"),n.status!=="daemon.session_updated")throw new w("unsupported status_event status");let e=D(n.data,"status_event data");if(F(e,["local_session_id","state","error"],"status_event data"),R(e,"local_session_id"),e.state!=="failed")throw new w("status_event state must be failed");D(e.error,"status_event error")}function za(n){F(n,["type","request_id","session_id","request"],"control_request frame"),R(n,"request_id"),tn(n);let e=D(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new w("control request must have a non-empty string type or subtype")}function Qa(n){F(n,["type","session_id","response"],"control_response frame"),tn(n);let e=D(n.response,"control response");R(e,"request_id");let t=R(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new w("success control response must not include error fields");F(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&D(e.response,"success response result");return}if(t!=="error")throw new w(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new w("error control response must not include response");if(F(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),R(e,"error"),e.code!==void 0&&R(e,"code"),e.retryable!==void 0&&Ha(e,"retryable"),e.details!==void 0&&D(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new w("pending_permission_requests must be an array")}function sr(n,e){F(n,["local_session_id","title","cwd","state","created_at","updated_at"],e),R(n,"local_session_id"),n.cwd!==void 0&&R(n,"cwd"),R(n,"title");let t=R(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new w(`${e} has invalid state: ${t}`);R(n,"created_at"),R(n,"updated_at")}function Yt(n,e){if(n!==void 0)throw new w(`${e} success must omit response`)}function Xt(n,e){let t=n;try{return R(t,"session_id")}catch{throw new w(`${e} requires a valid session_id`)}}function Zt(n,e){if(Object.hasOwn(n,"session_id"))throw new w(`${e} must not include session_id`)}function tn(n){let e=n;e.session_id!==void 0&&R(e,"session_id")}function Ga(n){for(let e of["session_epoch","sequence"])if(Object.hasOwn(n,e))throw new w(`${e} is reserved for daemon-internal Session ordering`)}function Wa(n){return typeof n=="string"&&["user","assistant","stream_event","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function D(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new w(`${e} must be a JSON object`);return n}function R(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new w(`${e} must be a non-empty string`);return t}function Ha(n,e){let t=n[e];if(typeof t!="boolean")throw new w(`${e} must be a boolean`);return t}function Ja(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new w(`${e} must be an array of strings`);return t}function F(n,e,t){let s=new Set(e),r=Object.keys(n).find(o=>!s.has(o));if(r!==void 0)throw new w(`${t} contains unknown field: ${r}`)}var yt=class{constructor(e,t){this.connection=e;this.options=t}messages=new Y;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;closePromise;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=Va(e);if(this.trackOutboundCommand(t),!this.sessionId||this.flushingPendingMessages){if(!this.initializePromise)throw new Error("Transport is not ready or has been closed");this.pendingMessages.push(t);return}let s;try{s=ir(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){return this.closePromise||(this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t=await this.connection.openSession({worker_args:[...this.options.workerArgs],...this.options.cwd!==void 0?{cwd:this.options.cwd}:{},...this.options.configDir!==void 0?{config_dir:this.options.configDir}:{}},this);if(this.sessionId=t,e=t,this.closed){await this.releaseSessionOnce(t);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let s=this.pendingMessages.map(r=>ir(r,t));this.pendingMessages.splice(0);for(let r of s)await this.connection.sendSessionMessage(r)}}finally{this.flushingPendingMessages=!1}}catch(t){throw e!==void 0&&this.startRelease(e),this.fail(t),t}}failAndRelease(e){let t=this.sessionId;t!==void 0&&this.startRelease(t),this.fail(e)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.close().catch(()=>{})}async performClose(){this.closed||(this.closed=!0,this.cleanup());try{this.initializePromise&&await this.initializePromise.catch(()=>{}),this.releasePromise?await this.releasePromise:this.sessionId&&await this.releaseSessionOnce(this.sessionId),this.messages.done()}catch(e){throw this.messages.error(e),e}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function Va(n){let e;try{e=JSON.parse(n.trim())}catch{throw new Error("Query transport input must contain valid JSON")}if(typeof e!="object"||e===null||Array.isArray(e))throw new Error("Query transport input must be a JSON object");return e}function ir(n,e){if(Object.hasOwn(n,"session_id")&&n.session_id!==e)throw new Error(`Query message session_id must match daemon Session: expected ${e}, received ${String(n.session_id)}`);return{...n,session_id:e}}var sn="multi_session_v2",ar="session_title_sync_v1",ur="session_delete_v1";var Xa=3e4,rn=3e4,Za=125e3,eu=12e4,tu=5e3,nu=1024,su=64,ru=8*1024*1024,ou=256,iu=32*1024*1024,au=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token"]),St=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRpcError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},ue=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRequestError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},wt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;closedSessionIds=new Set;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;failureListeners=new Set;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.maxFrameBytes=e.maxFrameBytes??B,!Number.isSafeInteger(this.maxFrameBytes)||this.maxFrameBytes<=0)throw new TypeError("maxFrameBytes must be a positive safe integer");this.readTask=this.readOutput(e.output)}async initialize(e,t=[],s=Xa){if(this.initialized)throw new w("daemon connection is already initialized");if(this.initializing)throw new w("daemon initialize is already in progress");this.initializing=!0;let r,o=typeof t=="number"?[]:t,i=typeof t=="number"?t:s,a=this.request("initialize",{daemon_protocol_version:2,sdk_version:e,capabilities:[sn,...o]}),u=new Promise((d,m)=>{r=setTimeout(()=>{let p=new Error(`Qoder CLI daemon did not initialize within ${i}ms`);this.fail(p),m(p)},i)}),c;try{c=await Promise.race([a,u])}finally{this.initializing=!1,r&&clearTimeout(r)}if(!c.capabilities.includes(sn))throw new w(`daemon is missing required capability: ${sn}`);for(let d of c.capabilities)this.capabilities.add(d);this.initialized=!0}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new yt(this,e)}supportsCapability(e){return this.capabilities.has(e)}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){return(await this.request("open_session",e,t,void 0,eu)).session_id}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,Za,"request")).sessions}renameSession(e,t){return this.capabilities.has(ar)?this.request("rename_session",{title:t},void 0,e,rn):Promise.reject(new w(`daemon is missing required capability: ${ar}`))}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("close_session",{},void 0,e,rn)}async deleteSession(e){if(!this.capabilities.has(ur))throw new w(`daemon is missing required capability: ${ur}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,rn)}async shutdown(e=tu){if(this.stopping){await this.readTask.catch(()=>{});return}this.stopping=!0;for(let t of this.sessions.values())t.fail(new Error("Daemon is stopping"));this.sessions.clear();try{this.failure||await this.request("shutdown",{},void 0,void 0,e)}finally{!this.input.destroyed&&!this.input.writableEnded&&this.input.end()}}fail(e,t=!0){let s=e instanceof Error?e:new Error(String(e));if(!this.failure){this.failure=s;for(let r of this.pendingRequests.values())r.timeout&&clearTimeout(r.timeout),r.reject(s);this.pendingRequests.clear(),this.timedOutRequestIds.clear(),this.clearPendingSessionMessages();for(let r of this.sessions.values())r.fail(s);if(this.sessions.clear(),t)for(let r of this.failureListeners)try{r(s)}catch{}}}request(e,t,s,r,o,i="connection"){if(this.failure)return Promise.reject(this.failure);if(e!=="initialize"&&!this.initialized)return Promise.reject(new w("daemon connection is not initialized"));let a=`sdk_daemon_${this.nextRequestId++}`,u={type:"control_request",request_id:a,...r!==void 0?{session_id:r}:{},request:{type:`daemon.${e}`,...t}};return new Promise((c,d)=>{let m={method:e,resolve:p=>c(p),reject:d,...s?{sessionTransport:s}:{},...r!==void 0?{sessionId:r}:{}};o!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new w(`daemon ${e} request timed out after ${o}ms`);if(i==="request"){this.pendingRequests.delete(a),this.rememberTimedOutRequestId(a),m.reject(p);return}this.fail(p)},o),m.timeout.unref?.()),this.pendingRequests.set(a,m),this.writeFrame(u).catch(p=>{let l=this.pendingRequests.get(a);l?.timeout&&clearTimeout(l.timeout),this.pendingRequests.delete(a),d(p),l?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new J(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=Ya({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=uu(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(en(r))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(new Error("Daemon connection closed"),!1)}catch(r){this.fail(r)}finally{s.close(),e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="control_response"){let s=e,r=s.response.request_id;if(this.pendingRequests.has(r)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(r))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,r=cu(s);if(r==="valid"){this.acceptRequest(s);return}if(r==="contradictory")throw new w(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="status_event"){this.acceptSessionUpdatedStatusEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=nu){let t=this.timedOutRequestIds.values().next().value;t!==void 0&&this.timedOutRequestIds.delete(t)}this.timedOutRequestIds.add(e)}routeSessionMessage(e){let t=e.session_id;if(typeof t!="string"||t.length===0)throw new w(`daemon Session message requires a valid session_id: ${String(t)}`);let s=this.sessions.get(t);if(s){s.acceptOutput(e);return}if(this.hasPendingSessionRequest()){this.bufferPendingSessionMessage(t,e);return}if(!this.closedSessionIds.has(t))throw new w(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new w(`daemon response has unknown request_id: ${t}`);if(s.timeout&&clearTimeout(s.timeout),s.sessionId!==void 0&&e.session_id!==s.sessionId){this.pendingRequests.delete(t),s.reject(new w(`${s.method} response session_id does not match request: expected ${s.sessionId}, received ${String(e.session_id)}`));return}if(this.pendingRequests.delete(t),e.response.subtype==="error"){if(s.method==="initialize"&&e.response.code==="PROTOCOL_VERSION_UNSUPPORTED"){s.reject(new q("1","2"));return}s.reject(new St({code:e.response.code??"DAEMON_REQUEST_FAILED",message:e.response.error,retryable:e.response.retryable??!1,...e.response.details===void 0?{}:{details:e.response.details}})),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned();return}try{let r=e,o=r.response.response?.daemon_protocol_version;if(s.method==="initialize"&&typeof o=="number"&&o!==2)throw new q(String(o),String(2));let i=or(s.method,r);if(s.sessionTransport){let a=i.session_id;if(typeof a!="string"||a.length===0)throw new w(`${s.method} did not return a valid session_id`);let u=this.takePendingSessionMessages(a);this.closedSessionIds.delete(a);let c=this.failIfSessionMessagesAreOrphaned(`${s.method} response session_id does not match buffered output`);if(c)throw c;if(this.sessions.has(a)){let d=new w(`daemon returned duplicate session_id: ${a}`);throw this.fail(d),d}this.sessions.set(a,s.sessionTransport);for(let d of u)s.sessionTransport.acceptOutput(d)}s.resolve(i)}catch(r){s.reject(r instanceof Error?r:new Error(String(r))),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned()}}hasPendingSessionRequest(){return[...this.pendingRequests.values()].some(e=>e.sessionTransport!==void 0)}failIfSessionMessagesAreOrphaned(e="daemon left orphaned pre-response Session output"){if(this.hasPendingSessionRequest())return;for(let r of this.pendingSessionMessages.keys())this.closedSessionIds.has(r)&&this.deletePendingSessionMessages(r);if(this.pendingSessionMessages.size===0)return;let t=[...this.pendingSessionMessages.keys()].join(", "),s=new w(`${e}: ${t}`);return this.clearPendingSessionMessages(),this.fail(s),s}bufferPendingSessionMessage(e,t){let s=this.pendingSessionMessages.get(e)??[],r=Buffer.byteLength(JSON.stringify(t),"utf8"),o=this.pendingSessionMessageBytes.get(e)??0;if(s.length+1>su||o+r>ru||this.pendingSessionMessageFrameCount+1>ou||this.pendingSessionMessageByteCount+r>iu)throw new w("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,o+r),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=r}takePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)??[];return this.deletePendingSessionMessages(e),t}deletePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)?.length??0,s=this.pendingSessionMessageBytes.get(e)??0;this.pendingSessionMessages.delete(e),this.pendingSessionMessageBytes.delete(e),this.pendingSessionMessageFrameCount-=t,this.pendingSessionMessageByteCount-=s}clearPendingSessionMessages(){this.pendingSessionMessages.clear(),this.pendingSessionMessageBytes.clear(),this.pendingSessionMessageFrameCount=0,this.pendingSessionMessageByteCount=0}rejectLegacyInitialize(e){let t=this.pendingRequests.get(e);return t?.method!=="initialize"?!1:(this.pendingRequests.delete(e),t.reject(new q("1","2")),!0)}acceptRequest(e){if(!this.initialized){this.writeInboundError(e.request_id,"DAEMON_NOT_INITIALIZED","daemon reverse RPC is unavailable before initialize completes");return}if(this.activeInboundRequestIds.has(e.request_id)){this.writeInboundError(e.request_id,"DUPLICATE_REQUEST_ID",`daemon request_id is already active: ${e.request_id}`);return}if(!this.requestHandler){this.writeInboundError(e.request_id,"METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${e.request.type}`);return}this.activeInboundRequestIds.add(e.request_id),Promise.resolve().then(()=>this.requestHandler(e)).then(t=>{let s={type:"control_response",response:{subtype:"success",request_id:e.request_id,...t===null?{}:{response:t}}};return this.writeFrame(s)}).catch(t=>{let s=t instanceof ue?t:void 0,r={type:"control_response",response:{subtype:"error",request_id:e.request_id,code:s?.code??"SDK_REQUEST_FAILED",error:t instanceof Error?t.message:String(t),retryable:s?.retryable??!1,...s?.details?{details:s.details}:{}}};return this.writeFrame(r)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let r={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(r).catch(o=>this.fail(o))}acceptSessionUpdatedStatusEvent(e){let t=e.data.local_session_id,s=this.sessions.get(t);s&&(this.sessions.delete(t),this.closedSessionIds.add(t),s.fail(lu(e.data)))}writeFrame(e){let t;try{t=`${rr(e)}
19
+ `,ye(t,this.maxFrameBytes,"SDK daemon input")}catch(r){let o=r instanceof Error?r:new Error(String(r));return this.fail(o),Promise.reject(o)}let s=this.writeChain.then(()=>new Promise((r,o)=>{this.input.write(t,"utf8",i=>{if(i){o(i);return}r()})}));return this.writeChain=s.catch(()=>{}),s.catch(r=>this.fail(r)),s}};function uu(n){let e;try{e=JSON.parse(n)}catch{return}if(!cr(e)||!lr(e,["protocol_version","frame_type","request_id","ok","error"])||e.protocol_version!==1||e.frame_type!=="response"||e.ok!==!1||typeof e.request_id!="string"||e.request_id.length===0)return;let t=e.error;if(!(!cr(t)||!lr(t,["code","message","retryable"])||t.code!=="PROTOCOL_VERSION_UNSUPPORTED"||typeof t.message!="string"||t.message.length===0||t.retryable!==!1))return e.request_id}function cr(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function lr(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function cu(n){let e=au.has(n.request.type),t=n.request_id.startsWith("daemon_sdk_");return e&&t&&n.session_id===void 0?"valid":e||t?"contradictory":"none"}function lu(n){let e=n.error,t=typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{},s=typeof t.message=="string"&&t.message.length>0?t.message:"Qoder CLI Worker exited before Session completed",r=t.exit_code===null||typeof t.exit_code=="number"?t.exit_code:void 0,o=t.signal===null||typeof t.signal=="string"?t.signal:void 0,i=typeof t.stderr=="string"&&t.stderr.length>0?t.stderr:void 0;return new I(s,{exitCode:r,signal:o,stderr:i})}var du=3e4;function dr(n,e=du){return hu(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return pu(n,t,e);case"daemon.auth.fetch_service_account_token":return mu(n,t,e);default:throw x("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}async function pu(n,e,t){if(n.type!=="jobToken")throw x("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=pr(e,["reason","session_id"]),r=mr(s.reason),o=fu(s.session_id,"session_id"),i=new AbortController;try{let a=await fr(()=>n.fetchJobToken({requestId:e.request_id,reason:r,sessionId:o},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw x("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");return{token:a.token}}catch(a){throw a instanceof ue?a:x("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function mu(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw x("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=pr(e,["reason","required_scopes"]);mr(s.reason),gu(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await fr(()=>n.fetchServiceAccountToken(),t,r);if(!o||typeof o.token!="string"||!o.token)throw x("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=o.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw x("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:o.token,...i!==void 0?{expires_at:i}:{}}}catch(o){throw o instanceof ue?o:x("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function pr(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw x("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function mr(n){if(n!=="initial"&&n!=="unauthorized")throw x("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function fu(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw x("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function gu(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw x("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function fr(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((r,o)=>{s=setTimeout(()=>{t.abort(),o(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function hu(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function x(n,e,t=!1){return new ue({code:n,message:e,retryable:t})}var Su="QODER_AGENT_SDK_DAEMON",wu="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",vu="ELECTRON_RUN_AS_NODE",bu=30*6e4,gr=2e3,hr=8192,yr=255,vr=new WeakMap;function cn(n){return vr.get(n)}async function ln(n){let e=n.workerIdleTimeoutMs??bu;_u(e);let t=new G({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await Ru(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[Su]:"1",[wu]:String(e)},i;try{i=await un.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let a=new wt({input:i.process.stdin,output:i.process.stdout,requestHandler:dr(n.auth)});i.setConnection(a),await a.initialize(Ve,["session_delete_v1"]),await t.cleanupAuthPayload();let u=new on(a,i);return vr.set(u,{auth:n.auth,transportProvider:new an(a,s.env,n.cwd)}),u}catch(a){throw await t.cleanupAuthPayload(),await i?.stop().catch(()=>{}),a}}var on=class{constructor(e,t){this.connection=e;this.processController=t;this.connection.onFailure(s=>this.acceptDaemonFailure(s)),this.processController.onFailure(s=>this.acceptDaemonFailure(s))}currentState="ready";stopPromise;get state(){return this.currentState}async listSessions(){if(this.currentState!=="ready")throw new Error("Daemon is not ready");return(await this.connection.listSessions()).map(Sr)}async renameSession(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let s=ku(t),r=await this.connection.renameSession(e,s);return Sr(r.session)}async deleteSession(e){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e)}stop(){return this.stopPromise||(this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),e}}acceptDaemonFailure(e){this.currentState==="ready"&&this.setDaemonState("failed",e)}setDaemonState(e,t){this.currentState!==e&&(this.currentState=e)}};function ku(n){if(typeof n!="string")throw new TypeError("title must be a non-empty string");let e=n.replace(/[\r\n]+/g," ").trim();if(!e)throw new TypeError("title must be a non-empty string");if(e.length>yr)throw new TypeError(`title must be at most ${yr} characters`);return e}function Sr(n){return{localSessionId:n.local_session_id,title:n.title,...n.cwd?{cwd:n.cwd}:{},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}var an=class{constructor(e,t,s){this.connection=e;this.daemonEnv=t;this.defaultCwd=s}create(e){let t=new G({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs();return this.connection.createSessionTransport({workerArgs:s,cwd:e.cwd??this.defaultCwd,...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}};function _u(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}async function Ru(n){let e=Ce({pathToQoderCLIExecutable:n},se),t,s={};if(e.transport==="worker"){let r=await ve(V(e.pathToQoderWorkerRuntime));t=r.runtimePath,s=r.env}else t=n??H();return tt(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[vu]:"1"}:{}}}:{command:t,args:[],env:s}}var un=class n{constructor(e){this.process=e;this.exited=new Promise(t=>{e.once("exit",()=>t()),e.once("error",()=>t())}),e.stderr?.on("data",t=>{this.stderrTail+=t.toString("utf8"),this.stderrTail.length>hr&&(this.stderrTail=this.stderrTail.slice(-hr))}),e.once("error",t=>{this.reportFailure(new I(`Failed to spawn Qoder CLI daemon: ${t.message}`,{stderr:this.getStderr(),cause:t}))}),e.once("exit",(t,s)=>{this.stopping||this.reportFailure(new I(t!==null?`Qoder CLI daemon exited with code ${t}`:`Qoder CLI daemon terminated by signal ${s}`,{exitCode:t,signal:s,stderr:this.getStderr()}))})}connection;failure;failureListeners=new Set;stderrTail="";exited;stopping=!1;static async spawn(e){let t;try{t=yu(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await Cu(t)}catch(s){throw new I(`Failed to spawn Qoder CLI daemon: ${Eu(s)}`,{cause:s})}if(!t.stdin||!t.stdout)throw t.kill("SIGTERM"),new Error("Qoder CLI daemon did not expose piped stdin/stdout");return new n(t)}setConnection(e){this.connection=e,this.failure&&e.fail(this.failure)}onFailure(e){this.failureListeners.add(e),this.failure&&e(this.failure)}beginStopping(){this.stopping=!0}async stop(){this.beginStopping(),!await wr(this.exited,gr)&&(this.process.kill("SIGTERM"),!await wr(this.exited,gr)&&(this.process.kill("SIGKILL"),await this.exited))}getStderr(){return this.stderrTail.trim()||void 0}reportFailure(e){if(!(this.stopping||this.failure)){this.failure=e,this.connection?.fail(e);for(let t of this.failureListeners)t(e)}}};function Eu(n){return n instanceof Error?n.message:String(n)}async function Cu(n){n.pid===void 0&&await new Promise((e,t)=>{let s=()=>{n.off("error",r),e()},r=o=>{n.off("spawn",s),t(o)};n.once("spawn",s),n.once("error",r)})}async function wr(n,e){let t;try{return await Promise.race([n.then(()=>!0),new Promise(s=>{t=setTimeout(()=>s(!1),e),t.unref?.()})])}finally{t&&clearTimeout(t)}}var dn=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 Pu(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=cn(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(Xn(n.transport))return n.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let t=Ce(n,se);return t.transport==="worker"?new be({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Se.default}function pn(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;s&&(r=Tu(t));let o=s?cn(s):void 0,i=t.sessionStore,a=t.sessionStoreFlush??"batched",u=Pu(t,s),c=new ut({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(s!==void 0&&c.record("[DaemonRoute] explicit_daemon transport_overridden"),t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");if(t.planMode!==void 0&&typeof t.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");t.goalMaxTurns!==void 0&&je(t.goalMaxTurns);let d=o?.auth??t.auth;if(d==null)throw new dn;let m=i!==void 0&&t.forkSession===!0;if(i&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(i&&o===void 0&&!(u instanceof Se)&&!(u instanceof be))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(i&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(i&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(i&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Ks(t),Us({prompt:e,options:t,diagnostics:c});let p=er(t.memory),l=nr(t.evolution?.skill),f=t.onAuthExpired,y=!1,g=f?()=>{y||(y=!0,Promise.resolve(f()).catch(k=>{c.record("[query] onAuthExpired callback threw:",k)}))}:void 0,S=new Map,b=new Map,h=new Map,E={},C={},te={};if(t.mcpServers)for(let[k,U]of Object.entries(t.mcpServers)){let ne=U.tools;if(Array.isArray(ne)&&ne.length>0&&(C[k]=ne),U.type==="sdk"&&"instance"in U&&U.instance){let ge=U.instance;if(S.set(k,ge),ne){let He=Mt(k,ne);He&&(te[k]=He)}let In=new pt(He=>{fs(k,He,h)});b.set(k,In),ge.connect(In).catch(()=>{})}else E[k]=U}let _=Object.keys(E).length>0,P=Object.keys(C).length>0,Ge=t.pathToQoderCLIExecutable,no=t.env,so=d?.type==="jobToken"?d.fetchJobToken:void 0,ro=d?.type==="serviceAccount"?d.fetchServiceAccountToken:void 0,We={pathToQoderCLIExecutable:Ge,executable:t.executable,executableArgs:t.executableArgs,env:no,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:d,model:t.model,agent:t.agent,debug:t.debug,diagnostics:c,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:i!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let k=t.allowedTools??[];if(t.skills===void 0)return k.length>0?k:void 0;let U=t.skills==="all"?["Skill"]:t.skills.map(ge=>`Skill(${ge})`),ne=new Set(k);return[...k,...U.filter(ge=>!ne.has(ge))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:_?E:void 0,mcpToolPolicies:P?C: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:g},Pn=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new at(async()=>{let k=await Ys({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:rt(u,{...We,continue:!1})};try{return{transport:rt(u,{...We,env:{...We.env??process.env,[v.configDirEnv]:k.configDir},materializedSessionConfigDir:k.configDir,continue:!1,resume:k.sessionId}),cleanup:k.cleanup}}catch(U){throw await k.cleanup(),U}}):rt(u,We);Pn.initialize().catch(()=>{});let oo=typeof e=="string",fe=t.systemPrompt,Tn,Mn;if(typeof fe=="string")Tn=fe;else if(typeof fe=="object"&&fe!==null&&fe.type==="preset"){let k=fe;if(k.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(k.preset)}`);Mn=k.append}let io={systemPrompt:Tn,appendSystemPrompt:Mn,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:s!==void 0?t.planMode??!1:t.planMode,promptSuggestions:t.promptSuggestions,goalMaxTurns:t.goalMaxTurns,enableFileCheckpointing:t.enableFileCheckpointing,memory:p.config,evolution:l.config?{skill:l.config}:void 0,customContext:t.customContext,beforeInitialize:void 0,requireSessionStoreForkBarrier:m,...s!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},Pt=new dt(Pn,oo,t.canUseTool,t.hooks,t.abortController,S,io,t.onElicitation,c,g,t.controlRequestTimeoutMs,b,h,so,t.resolveModel,t.resolveModelTimeoutMs,i,a,te,ro,p.callbacks,l.callbacks,t.resolveSessionArtifacts);if(typeof e=="string"){let k={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};Pt.streamInput(async function*(){yield k}())}else Pt.streamInput(e);return Pt}function Tu(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=qe(n.permissionMode),s=[["auth",n.auth],["transport",n.transport],["env",n.env],["pathToQoderCLIExecutable",n.pathToQoderCLIExecutable],["executable",n.executable],["executableArgs",n.executableArgs],["proxy",n.proxy],["spawnQoderCLIProcess",n.spawnQoderCLIProcess],["closeGraceMs",n.closeGraceMs],["sessionStore",n.sessionStore]].find(([,r])=>r!==void 0);if(s)throw new Error(`options.${s[0]} is part of startDaemon() configuration and cannot be overridden by a daemon-bound Query.`);return e}var mn=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}}},fn=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 Mu(n={}){let e=n.initializeTimeoutMs??6e4;if(!Number.isFinite(e)||e<=0)throw new TypeError("initializeTimeoutMs must be a positive finite number");if(n.options?.experimentalCloudAgent!==void 0)throw new Error("startup is not supported by the experimental Cloud Agent runtime");let t=new mn,s=pn({prompt:t,options:n.options}),r;try{return await Promise.race([s.initializationResult(),new Promise((o,i)=>{r=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new fn(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as Iu}from"node:fs/promises";import Au from"node:os";import K from"node:path";var Ou=["user","project","local"],yn=new Set(["__proto__","constructor","prototype"]),Du=/^[\p{L}\p{N}\p{M}._ -]+$/u,xu=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Nu=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),qu=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),ju=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 ce(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Fu(n){let e=n.charCodeAt(0)===65279?n.slice(1):n,t="",s=!1,r=!1,o=!1,i=!1;for(let a=0;a<e.length;a+=1){let u=e[a],c=e[a+1];if(o){u===`
20
20
  `||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){u==="*"&&c==="/"?(i=!1,t+=" ",a+=1):t+=u===`
21
- `||u==="\r"?u:" ";continue}if(s){t+=u,r?r=!1:u==="\\"?r=!0:u==='"'&&(s=!1);continue}u==='"'?(s=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Fu(n,e){let t;try{t=JSON.parse(ju(n))}catch(s){let r=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${r}`)}if(!ce(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return vt(t)}function Te(n){return Array.isArray(n)?n.map(Te):ce(n)?vt(n):n}function vt(n){let e={};for(let[t,s]of Object.entries(n))hn.has(t)||s===void 0||(e[t]=Te(s));return e}function Ku(n){let e=n.join(".");if(Nu.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(qu.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function gn(n,e,t=[]){for(let[s,r]of Object.entries(e)){if(hn.has(s)||r===void 0)continue;let o=[...t,s],i=n[s],a=Ku(o);if(a==="shallow"&&i&&r){let u={};ce(i)&&Object.assign(u,vt(i)),ce(r)&&Object.assign(u,vt(r)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(r)?r:[r];if(a==="concat"){n[s]=[...i.map(Te),...u.map(Te)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(Te);continue}}if(ce(i)&&ce(r))gn(i,r,o);else if(ce(r)){let u={};gn(u,r,o),n[s]=u}else n[s]=Te(r)}}function Uu(n){let e=n?.[v.configDirNameEnv];if(e===void 0||e==="")return{user:v.configDirName,project:v.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!Ou.test(t)||Du.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(xu.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function fn(n,e){let t;try{t=await Mu(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:K.resolve(e),settings:Fu(t,K.resolve(e))}}async function Lu(n={}){let e=K.resolve(n.cwd??process.cwd()),t=process.env,s=Uu(t),r=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=r?K.resolve(e,r):Iu.homedir(),i=t[v.configDirEnv]?K.resolve(e,t[v.configDirEnv]):K.join(o,s.user),a=K.join(e,s.project),u=new Set(n.settingSources??Au),c=K.resolve(o)===e,d=[];if(u.has("user")){let l=await fn("user",K.join(i,"settings.json"));l&&d.push(l)}if(u.has("project")&&!c){let l=await fn("project",K.join(a,"settings.json"));l&&d.push(l)}if(u.has("local")&&!c){let l=await fn("local",K.join(a,"settings.local.json"));l&&d.push(l)}let m={},p={};for(let l of d){gn(m,l.settings);for(let f of Object.keys(l.settings))hn.has(f)||(p[f]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:m,provenance:p,sources:d}}var Bu=30*6e4,bt=class extends Error{constructor(){super("Global daemon is already initialized with a different workerIdleTimeoutMs"),this.name="DaemonConfigurationConflictError"}},le,Q,de,Le,pe;function br(n){let e;try{e=zu(n)}catch(s){return Promise.reject(s)}if(pe)return pe.then(()=>br(n));if(le){if(le.state==="ready")return vr(e)?Promise.resolve({mode:"daemon",daemon:le}):Promise.reject(new bt);le=void 0,Q=void 0,Le=void 0}if(de)return vr(e)?de:Promise.reject(new bt);if(Le)return Promise.resolve(Le);Q=e;let t;return t=cn(e).then(s=>(le=s,{mode:"daemon",daemon:s})).catch(s=>{let r=Qu(s);return Le=r,Q=void 0,r}).finally(()=>{de===t&&(de=void 0)}),de=t,t}function $u(){if(pe)return pe;let n=de,e=le,t;return t=(async()=>{let s=e?{mode:"daemon",daemon:e}:n?await n:void 0;s?.mode==="daemon"&&await s.daemon.stop()})().finally(()=>{pe===t&&(le=void 0,Q=void 0,de=void 0,Le=void 0,pe=void 0)}),pe=t,t}function zu(n){let e=n.workerIdleTimeoutMs??Bu;if(!Number.isSafeInteger(e)||e<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer");return{...n,workerIdleTimeoutMs:e}}function vr(n){return Q?.auth===n.auth&&Q.workerIdleTimeoutMs===n.workerIdleTimeoutMs&&Q.cwd===n.cwd&&Q.pathToQoderCLIExecutable===n.pathToQoderCLIExecutable&&Q.proxy===n.proxy&&Q.env===n.env}function Qu(n){return n instanceof q?{mode:"direct",reason:"protocol_version_mismatch"}:{mode:"direct",reason:"daemon_unavailable"}}import{McpServer as Gu}from"@modelcontextprotocol/sdk/server/mcp.js";function Wu(n){if(!n.name||typeof n.name!="string"||n.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Gu({name:n.name,version:n.version??"1.0.0"},{capabilities:{tools:n.tools&&n.tools.length>0?{}:void 0}}),t=[];if(n.tools&&n.tools.length>0)for(let s of n.tools){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${n.name}".`);if(!s.description||typeof s.description!="string")throw new Error(`[createSdkMcpServer] Tool "${s.name}" must have a non-empty description string.`);Tt(n.name,{name:s.name,exposedName:s.exposedName,alwaysLoad:s.alwaysLoad}),(s.exposedName!==void 0||s.alwaysLoad!==void 0||s.permissionPolicy!==void 0)&&t.push({name:s.name,...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s.permissionPolicy!==void 0?{permission_policy:s.permissionPolicy}:{}});try{e.registerTool(s.name,{description:s.description,inputSchema:s.inputSchema,...s.annotations?{annotations:s.annotations}:{}},s.handler)}catch(r){throw r instanceof Error&&r.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${s.name}" in server "${n.name}". Each tool name must be unique within a server.`):r}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Hu(n,e,t,s,r){return{name:n,description:e,inputSchema:t,handler:s,annotations:r?.annotations,...r?.exposedName!==void 0?{exposedName:r.exposedName}:{},...r?.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r?.permissionPolicy!==void 0?{permissionPolicy:r.permissionPolicy}:{}}}import{readdir as yn,readFile as _t,stat as Me,appendFile as Tr,realpath as Ju,rm as kr}from"fs/promises";import{basename as Vu,join as T,resolve as _r}from"path";import{execFile as Yu}from"child_process";import{randomUUID as Mr}from"crypto";import{promisify as Xu}from"util";var Zu=Xu(Yu),ec=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ir=new Set(["user","assistant","system","progress","attachment"]);function M(n){return n!==null&&typeof n=="object"}function me(n){return ec.test(n)}function tc(n){let e=[];for(let t of n.split(`
22
- `)){let s=t.trim();if(s)try{let r=JSON.parse(s);M(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&Ir.has(r.type)&&e.push(r)}catch{}}return e}function nc(n,e){let t;for(let s of n.split(`
23
- `)){let r=s.trim();if(r)try{let o=JSON.parse(r);if(!M(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 kt(n){if(!M(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var sc=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function rc(n){return typeof n=="string"&&sc.has(n)?n:void 0}function Sn(n){if(n.type!=="user")return;let e=kt(n).filter(o=>M(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(n.toolDenialKind)?n.toolDenialKind:e.length===1?[n.toolDenialKind]:[],s=Array.isArray(n.userFeedback)?n.userFeedback:e.length===1?[n.userFeedback]:[],r=e.flatMap((o,i)=>{let a=rc(t[i]);if(!a)return[];let u=s[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return r.length>0?r:void 0}function Be(n){if(n.type!=="assistant"||!M(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function Ar(n){return n.type!=="user"||!n.parentUuid?!1:kt(n).some(e=>M(e)&&e.type==="tool_result")}function oc(n){if(!M(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function ic(n,e){let t=new Map;for(let[s,r]of n){let o=oc(r);if(o){let i=t.get(o);i?i.push(s):t.set(o,[s])}}for(let[s,r]of n){let o=ac(r,r.parentUuid,n,t,e);o!==r.parentUuid&&n.set(s,{...r,parentUuid:o})}}function ac(n,e,t,s,r){if(!e||t.has(e))return e;let o=s.get(e);return!o||o.length===0?e:o.length===1?o[0]:uc(n,o,t)??cc(n,o,t,r)??e}function uc(n,e,t){if(!Ar(n))return;let s=kt(n).filter(o=>M(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(s.length===0)return;let r=e.filter(o=>{let i=t.get(o);return i?kt(i).some(a=>M(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return r.length===1?r[0]:void 0}function cc(n,e,t,s){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(s.get(o.uuid)??-1)<(s.get(n.uuid)??-1)).at(-1)?.uuid}function lc(n){for(let e of n.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,s=t?.headUuid,r=t?.anchorUuid,o=t?.tailUuid;if(!s||!r||!o)continue;let i=n.get(s);i&&n.set(s,{...i,parentUuid:r});for(let[a,u]of n)a!==s&&u.parentUuid===r&&n.set(a,{...u,parentUuid:o})}}function Rr(n,e,t){let s=(n.timestamp??"").localeCompare(e.timestamp??"");return s!==0?s:(t.get(n.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function dc(n,e,t){let s=e.filter(p=>p.type==="assistant");if(s.length===0)return e;let r=new Map,o=0;for(let p of n.keys())r.set(p,o++);let i=new Map;for(let p of s){let l=Be(p);l&&i.set(l,p)}let a=new Map,u=new Map;for(let p of n.values()){let l=Be(p);if(l){let f=a.get(l)??[];f.push(p),a.set(l,f);continue}if(Ar(p)&&p.parentUuid){let f=u.get(p.parentUuid)??[];f.push(p),u.set(p.parentUuid,f)}}let c=new Set,d=new Map;for(let p of s){let l=Be(p);if(!l||c.has(l))continue;c.add(l);let f=a.get(l)??[p],y=f.filter(_=>!t.has(_.uuid)),g=[];for(let _ of f){let P=u.get(_.uuid)??[];for(let Ge of P)t.has(Ge.uuid)||g.push(Ge)}if(y.length===0&&g.length===0)continue;let S=i.get(l);if(!S)continue;let b=[...f].sort((_,P)=>Rr(_,P,r));g.sort((_,P)=>Rr(_,P,r));let h=b.findIndex(_=>_.uuid===S.uuid),E=b.slice(0,Math.max(h,0)).filter(_=>!t.has(_.uuid)),C=b.slice(h+1).filter(_=>!t.has(_.uuid)),te=[...E,...C,...g];for(let _ of te)t.add(_.uuid);d.set(S.uuid,te)}if(d.size===0)return e;let m=[];for(let p of e){let l=d.get(p.uuid);if(l){let f=r.get(p.uuid)??Number.MAX_SAFE_INTEGER,y=[],g=[];for(let S of l)(p.type==="assistant"&&S.type==="assistant"&&Be(S)===Be(p)&&(r.get(S.uuid)??Number.MAX_SAFE_INTEGER)<f?y:g).push(S);m.push(...y,p,...g)}else m.push(p)}return m}function Or(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,r=new Map;for(let[d,m]of n.entries())s.set(m.uuid,m),r.set(m.uuid,d);t==="runtime"&&lc(s),ic(s,r);let o;if(e?.leafUuid===null)return[];if(e){let d=s.get(e.leafUuid),m=d?.sessionId??d?.session_id;d&&(m===void 0||m===e.sessionId)&&(o=d)}if(!o){let d=new Set;for(let y of s.values())y.parentUuid&&d.add(y.parentUuid);let m=Array.from(s.values()).filter(y=>!d.has(y.uuid)),p=[];for(let y of m){let g=y,S=new Set;for(;g&&!S.has(g.uuid);){if(S.add(g.uuid),g.type==="user"||g.type==="assistant"){p.push(g);break}g=g.parentUuid?s.get(g.parentUuid):void 0}}if(p.length===0)return[];let l=p.filter(y=>!y.isSidechain&&!y.teamName&&!y.isMeta);o=(l.length>0?l:p).reduce((y,g)=>(r.get(g.uuid)??-1)>(r.get(y.uuid)??-1)?g:y)}let i=[],a=new Set,u=o;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let d=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=d?s.get(d):void 0}i.reverse();let c=t==="runtime"?pc(i):i;return dc(s,c,new Set(c.map(d=>d.uuid)))}function pc(n){let e=-1;for(let t=n.length-1;t>=0;t--){let s=n[t];if(s?.type==="system"&&s.subtype==="compact_boundary"){e=t;break}}return e>=0?n.slice(e):[...n]}function mc(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function wn(n,e,t){let s=n.flatMap(o=>M(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Ir.has(o.type)?[o]:[]),r;for(let o of n){if(!M(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;a!==null&&typeof a!="string"||(r={leafUuid:a,sessionId:e})}return Or(s,r,t)}function Er(n,e,t){if(t==="historical"&&mc(n))return!1;let s=n.type==="user"||n.type==="assistant",r=e&&n.type==="system";return!(!s&&!r||n.isMeta||n.isSidechain||n.teamName)}function fc(n){if(!n)return;let e=n.preservedSegment,t={trigger:n.trigger,pre_tokens:n.preTokens??n.pre_tokens,post_tokens:n.postTokens??n.post_tokens,messages_summarized:n.messagesSummarized??n.messages_summarized,duration_ms:n.durationMs??n.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function vn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function bn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function Cr(n){let e=n.type==="system"?fc(n.compactMetadata):void 0,t=Sn(n);return{type:n.type,uuid:n.uuid,session_id:n.sessionId??n.session_id??"",message:n.message,parent_tool_use_id:null,parent_agent_id:null,...vn(n),...bn(n),...t?{tool_result_meta:t}:{},...typeof n.timestamp=="string"&&n.timestamp.length>0?{timestamp:n.timestamp}:{},...n.type==="system"&&n.subtype?{subtype:n.subtype}:{},...e?{compact_metadata:e}:{}}}function Pr(n,e){let t=Math.max(0,e?.offset??0),s=e?.limit;return s!==void 0&&s>0?n.slice(t,t+s):t>0?n.slice(t):n}async function Rt(n){try{return await Ju(_r(n))}catch{return _r(n)}}async function gc(n){return O(await Rt(n))}async function Z(n){let e=Ee();if(n?.dir){let t=await Rt(n.dir),s=[T(e,O(t))];if(n.includeWorktrees!==!1)try{let{stdout:r}=await Zu("git",["worktree","list","--porcelain"],{cwd:n.dir}),o=r.split(`
24
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)s.push(T(e,await gc(i)))}catch{}return s}try{return(await yn(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>T(e,s.name))}catch{return[]}}async function Dr(n){try{let[e,t]=await Promise.all([_t(n,"utf-8"),Me(n)]),s=e.trim().split(`
25
- `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return M(i)?[i]:[]}catch{return[]}});if(s.length===0)return null;let r=Vu(n,".jsonl");return kn(r,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function xr(n,e){return T(n,e,"subagents")}function Nr(n){if(typeof n!="object"||n===null)return!1;let e=n;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function qr(n){let e=[];async function t(s){let r;try{r=await yn(s,{withFileTypes:!0})}catch{return}for(let o of r){let i=T(s,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(n),e}async function hc(n){try{let e=await _t(n.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function jr(n){if(n.length===0)return[];let e=new Map(n.map(i=>[i.uuid,i])),t=n[n.length-1],s=[],r=new Set,o=t;for(;o&&!r.has(o.uuid);)r.add(o.uuid),s.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return s.reverse()}async function yc(n,e,t){let[s,r]=await Promise.all([_t(n,"utf-8"),hc(n)]),o=[];for(let d of s.trim().split(`
26
- `).filter(Boolean))try{let m=JSON.parse(d);Nr(m)&&o.push(m)}catch{}let a=jr(o).map(d=>{let m=Sn(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??e,message:d.message,parent_tool_use_id:r.parentToolUseId,parent_agent_id:r.parentAgentId,...vn(d),...bn(d),...m?{tool_result_meta:m}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function Ie(n){return O(await Rt(n??process.cwd()))}function $e(n,e){return{projectKey:n,sessionId:e}}function Sc(n){let e=0;for(let t of n){if(typeof t.timestamp!="string")continue;let s=Date.parse(t.timestamp);Number.isFinite(s)&&(e=Math.max(e,s))}return e}function wc(n){let e=n.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var vc=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function bc(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(vc,"");if(s===e)return s;e=s}return e}var kc=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,_c=/<command-name>(.*?)<\/command-name>/,Rc=/<bash-input>([\s\S]*?)<\/bash-input>/;function Ec(n){if(n.length<=200)return n;let e=n.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function Cc(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!M(t))return;let s=t.content,r=[];if(typeof s=="string")r.push(s);else if(Array.isArray(s)){for(let o of s)if(M(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&r.push(o.text)}}for(let o of r){let i=o.replaceAll(`
27
- `," ").trim();if(!i)continue;let a=_c.exec(i);if(a){e.commandFallback??=a[1];continue}let u=Rc.exec(i);if(u)return`! ${u[1].trim()}`;if(!kc.test(i))return Ec(i)}}function kn(n,e,t,s={}){if(e.length===0)return;let r,o,i,a,u,c,d,m,p,l,f;for(let b of e){let h=b;if(f??=h.isSidechain===!0,l===void 0&&typeof h.timestamp=="string"){let E=Date.parse(h.timestamp);Number.isFinite(E)&&(l=E)}if(!r){let E={commandFallback:o};r=Cc(h,E),o=E.commandFallback}h.type==="custom-title"&&typeof h.customTitle=="string"&&(i=h.customTitle),h.type==="ai-title"&&typeof h.aiTitle=="string"&&(a=h.aiTitle),typeof h.lastPrompt=="string"&&(u=h.lastPrompt),typeof h.summary=="string"&&(c=h.summary),h.type==="tag"&&(p=typeof h.tag=="string"&&h.tag?h.tag:void 0),typeof h.gitBranch=="string"&&(d=h.gitBranch),m===void 0&&typeof h.cwd=="string"&&(m=h.cwd),h.type==="relocated"&&typeof h.relocatedCwd=="string"&&(m=h.relocatedCwd)}if(f)return;let y=r??o,g=i||a,S=g||u||c||y;if(S)return{sessionId:n,summary:S,lastModified:t??Sc(e),fileSize:s.fileSize,customTitle:g,firstPrompt:y,gitBranch:d,cwd:m||s.defaultCwd,tag:p,createdAt:l}}async function Fr(n,e,t){let s=$e(await Ie(t),e),r=await n.load(s);return r?{key:s,entries:r}:void 0}async function Pc(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let d=await Rt(n.dir??process.cwd()),m=O(d),p=(await c.listSessions(m)).slice().sort((g,S)=>S.mtime-g.mtime),l=Math.max(0,n.offset??0),f=n.limit!==void 0&&n.limit>0?p.slice(l,l+n.limit):l>0?p.slice(l):p;return(await Promise.allSettled(f.map(async({sessionId:g,mtime:S})=>{let b=await c.load($e(m,g));return b?kn(g,b,S,{defaultCwd:d}):void 0}))).flatMap((g,S)=>{if(g.status==="fulfilled")return g.value?[g.value]:[];let b=f[S];return[{sessionId:b.sessionId,summary:"",lastModified:b.mtime}]})}let e=await Z(n),s=(await Promise.all(e.map(async c=>{try{return(await yn(c)).filter(m=>m.endsWith(".jsonl")).map(m=>T(c,m))}catch{return[]}}))).flat(),r=await Promise.all(s.map(Dr)),o=new Map;for(let c of r){if(!c)continue;let d=o.get(c.sessionId);(!d||c.lastModified>d.lastModified)&&o.set(c.sessionId,c)}let i=Array.from(o.values()).sort((c,d)=>d.lastModified-c.lastModified),a=n?.offset??0,u=n?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function Tc(n,e){if(e?.sessionStore){if(!me(n))return;let s=await Fr(e.sessionStore,n,e.dir);return s?kn(n,s.entries,wc(s.entries)):void 0}let t=await Z(e);for(let s of t){let r=T(s,`${n}.jsonl`),o=await Dr(r);if(o)return o}}async function Mc(n,e){if(!me(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let o=await Fr(e.sessionStore,n,e.dir);if(!o)return[];let i=wn(o.entries,n,s);return Pr(i.filter(a=>Er(a,t,s)).map(Cr),e)}let r=await Z(e);for(let o of r){let i=T(o,`${n}.jsonl`);try{let a=await _t(i,"utf-8"),c=Or(tc(a),nc(a,n),s).filter(d=>Er(d,t,s)).map(Cr);return Pr(c,e)}catch{continue}}return[]}async function Ic(n,e,t){if(!me(n))throw new Error(`Invalid sessionId: ${n}`);let s=e.trim();if(!s)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append($e(await Ie(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Mr(),timestamp:new Date().toISOString()}]);return}let r=await Z(t);for(let o of r){let i=T(o,`${n}.jsonl`);try{await Me(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await Tr(i,a+`
28
- `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Ac(n,e,t){if(!me(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:bc(e).trim();if(s!==null&&!s)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append($e(await Ie(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Mr(),timestamp:new Date().toISOString()}]);return}let r=await Z(t);for(let o of r){let i=T(o,`${n}.jsonl`);try{await Me(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await Tr(i,a+`
29
- `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Oc(n,e){if(e?.sessionStore){if(!me(n))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let s=await e.sessionStore.listSubkeys({projectKey:await Ie(e.dir),sessionId:n});return Array.from(new Set(s.map(r=>{if(!r.startsWith("subagents/"))return;let o=r.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(r=>r!==void 0)))}let t=await Z(e);for(let s of t){let r=T(s,`${n}.jsonl`);try{await Me(r);let o=await qr(xr(s,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function Dc(n,e,t){if(t?.sessionStore){if(!me(n)||!e)return[];let r=await Ie(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:r,sessionId:n}),f=`agent-${e}`,y=l.find(g=>g.startsWith("subagents/")&&g.split("/").at(-1)===f);if(!y)return[];o=y}let i=await t.sessionStore.load({projectKey:r,sessionId:n,subpath:o});if(!i)return[];let a=i.filter(Nr),u=i.filter(l=>l.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,d=typeof u?.parentAgentId=="string"?u.parentAgentId:null,m=jr(a).map(l=>{let f=Sn(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??n,message:l.message,parent_tool_use_id:c,parent_agent_id:d,...vn(l),...bn(l),...f?{tool_result_meta:f}:{}}}),p=Math.max(0,t.offset??0);return t.limit!==void 0?m.slice(p,p+t.limit):m.slice(p)}let s=await Z(t);for(let r of s){let o=T(r,`${n}.jsonl`);try{await Me(o);let a=(await qr(xr(r,n))).find(u=>u.agentId===e);return a?await yc(a.filePath,n,t):[]}catch{continue}}return[]}async function xc(n,e){if(!me(n))throw new Error(`Invalid sessionId: ${n}`);if(e?.sessionStore){if(!e.sessionStore.delete)throw new Error("SessionStore does not support delete()");await e.sessionStore.delete($e(await Ie(e.dir),n));return}let t=await Z(e);for(let s of t){let r=T(s,`${n}.jsonl`);try{await Me(r),await Promise.all([kr(r,{force:!0}),kr(T(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as Et}from"crypto";import{readdir as Nc,readFile as qc,realpath as jc,stat as Kr,writeFile as Fc}from"fs/promises";import{dirname as Kc,join as _n,resolve as Uc}from"path";var Ur=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Lc=new Set(["user","assistant","attachment","system","progress"]);async function Br(n){let e=Uc(n);try{return await jc(e)}catch{return e}}async function Bc(n,e){let t=Ee();if(e){let r=O(await Br(e)),o=_n(t,r,`${n}.jsonl`);try{if((await Kr(o)).size>0)return o}catch{}return}let s;try{s=await Nc(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=_n(t,r.name,`${n}.jsonl`);try{if((await Kr(o)).size>0)return o}catch{}}}function $r(n,e){let t=[],s;for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){t.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(s=i.relocatedCwd)}return{transcript:wn(n,e,"historical").filter(o=>Lc.has(o.type)),contentReplacements:t,relocatedCwd:s}}function $c(n,e){let t=[];for(let s of n.split(`
30
- `))if(s.trim())try{t.push(JSON.parse(s))}catch{}return $r(t,e)}function zc(n){for(let e of n){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let s=t.message;if(s===null||typeof s!="object")continue;let r=s.content;if(typeof r=="string"&&r.trim())return r.trim();if(!Array.isArray(r)||r.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=r.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
31
- `).trim();if(o)return o}}function Qc(n){let e,t;for(let s of n){if(s===null||typeof s!="object")continue;let r=s;typeof r.customTitle=="string"&&r.customTitle&&(e=r.customTitle),typeof r.aiTitle=="string"&&r.aiTitle&&(t=r.aiTitle)}return e??t??zc(n)}function Lr(n,e,t,s){let r=n.transcript.filter(l=>l.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=r.findIndex(f=>f.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,l+1)}let o=new Set(r.map(l=>l.uuid)),i=new Map(r.map(l=>[l.uuid,Et()])),a=r.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(l=>[l.uuid,l])),c=Et(),d=new Date().toISOString(),m=a.map((l,f)=>{let y=null,g=typeof l.parentUuid=="string"?l.parentUuid:void 0;for(;g;){let h=u.get(g);if(!h)break;if(h.type!=="progress"){y=i.get(g)??null;break}g=typeof h.parentUuid=="string"?h.parentUuid:void 0}let S=typeof l.logicalParentUuid=="string"?i.get(l.logicalParentUuid)??null:l.logicalParentUuid??null,b={...l,...l.type==="system"&&l.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(l.uuid),parentUuid:y,logicalParentUuid:S,sessionId:c,timestamp:f===a.length-1?d:typeof l.timestamp=="string"?l.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:l.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let l=n.contentReplacements.flatMap(f=>{if(f===null||typeof f!="object")return[];let y=f.messageUuid;if(typeof y!="string"||!o.has(y))return[];let g=i.get(y);return g?[{...f,messageUuid:g}]:[]});l.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:l,uuid:Et(),timestamp:d})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${Qc(s)??"Forked session"} (fork)`,uuid:Et(),timestamp:d}),{sessionId:c,entries:m}}async function Gc(n,e={}){if(!Ur.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!Ur.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await Br(e.dir??process.cwd()),a=O(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=Lr($r(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Bc(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await qc(t,"utf8"),r=s.split(`
32
- `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Lr($c(s,n),n,e,r);return await Fc(_n(Kc(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
21
+ `||u==="\r"?u:" ";continue}if(s){t+=u,r?r=!1:u==="\\"?r=!0:u==='"'&&(s=!1);continue}u==='"'?(s=!0,t+=u):u==="/"&&c==="/"?(o=!0,t+=" ",a+=1):u==="/"&&c==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Ku(n,e){let t;try{t=JSON.parse(Fu(n))}catch(s){let r=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${r}`)}if(!ce(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return vt(t)}function Te(n){return Array.isArray(n)?n.map(Te):ce(n)?vt(n):n}function vt(n){let e={};for(let[t,s]of Object.entries(n))yn.has(t)||s===void 0||(e[t]=Te(s));return e}function Uu(n){let e=n.join(".");if(qu.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(ju.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function hn(n,e,t=[]){for(let[s,r]of Object.entries(e)){if(yn.has(s)||r===void 0)continue;let o=[...t,s],i=n[s],a=Uu(o);if(a==="shallow"&&i&&r){let u={};ce(i)&&Object.assign(u,vt(i)),ce(r)&&Object.assign(u,vt(r)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(r)?r:[r];if(a==="concat"){n[s]=[...i.map(Te),...u.map(Te)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(Te);continue}}if(ce(i)&&ce(r))hn(i,r,o);else if(ce(r)){let u={};hn(u,r,o),n[s]=u}else n[s]=Te(r)}}function Lu(n){let e=n?.[v.configDirNameEnv];if(e===void 0||e==="")return{user:v.configDirName,project:v.projectConfigDirName};let t=e.normalize("NFC");if(Array.from(t).length<1||Array.from(t).length>64||t.startsWith(" ")||t.endsWith(" ")||t.endsWith(".")||t==="."||t===".."||!Du.test(t)||xu.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(Nu.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function gn(n,e){let t;try{t=await Iu(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:K.resolve(e),settings:Ku(t,K.resolve(e))}}async function Bu(n={}){let e=K.resolve(n.cwd??process.cwd()),t=process.env,s=Lu(t),r=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=r?K.resolve(e,r):Au.homedir(),i=t[v.configDirEnv]?K.resolve(e,t[v.configDirEnv]):K.join(o,s.user),a=K.join(e,s.project),u=new Set(n.settingSources??Ou),c=K.resolve(o)===e,d=[];if(u.has("user")){let l=await gn("user",K.join(i,"settings.json"));l&&d.push(l)}if(u.has("project")&&!c){let l=await gn("project",K.join(a,"settings.json"));l&&d.push(l)}if(u.has("local")&&!c){let l=await gn("local",K.join(a,"settings.local.json"));l&&d.push(l)}let m={},p={};for(let l of d){hn(m,l.settings);for(let f of Object.keys(l.settings))yn.has(f)||(p[f]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:m,provenance:p,sources:d}}var $u=30*6e4,bt=class extends Error{constructor(){super("Global daemon is already initialized with a different workerIdleTimeoutMs"),this.name="DaemonConfigurationConflictError"}},le,Q,de,Le,pe;function kr(n){let e;try{e=Qu(n)}catch(s){return Promise.reject(s)}if(pe)return pe.then(()=>kr(n));if(le){if(le.state==="ready")return br(e)?Promise.resolve({mode:"daemon",daemon:le}):Promise.reject(new bt);le=void 0,Q=void 0,Le=void 0}if(de)return br(e)?de:Promise.reject(new bt);if(Le)return Promise.resolve(Le);Q=e;let t;return t=ln(e).then(s=>(le=s,{mode:"daemon",daemon:s})).catch(s=>{let r=Gu(s);return Le=r,Q=void 0,r}).finally(()=>{de===t&&(de=void 0)}),de=t,t}function zu(){if(pe)return pe;let n=de,e=le,t;return t=(async()=>{let s=e?{mode:"daemon",daemon:e}:n?await n:void 0;s?.mode==="daemon"&&await s.daemon.stop()})().finally(()=>{pe===t&&(le=void 0,Q=void 0,de=void 0,Le=void 0,pe=void 0)}),pe=t,t}function Qu(n){let e=n.workerIdleTimeoutMs??$u;if(!Number.isSafeInteger(e)||e<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer");return{...n,workerIdleTimeoutMs:e}}function br(n){return Q?.auth===n.auth&&Q.workerIdleTimeoutMs===n.workerIdleTimeoutMs&&Q.cwd===n.cwd&&Q.pathToQoderCLIExecutable===n.pathToQoderCLIExecutable&&Q.proxy===n.proxy&&Q.env===n.env}function Gu(n){return n instanceof q?{mode:"direct",reason:"protocol_version_mismatch"}:{mode:"direct",reason:"daemon_unavailable"}}import{McpServer as Wu}from"@modelcontextprotocol/sdk/server/mcp.js";function Hu(n){if(!n.name||typeof n.name!="string"||n.name.trim()==="")throw new Error("[createSdkMcpServer] Server name must be a non-empty string.");let e=new Wu({name:n.name,version:n.version??"1.0.0"},{capabilities:{tools:n.tools&&n.tools.length>0?{}:void 0}}),t=[];if(n.tools&&n.tools.length>0)for(let s of n.tools){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${n.name}".`);if(!s.description||typeof s.description!="string")throw new Error(`[createSdkMcpServer] Tool "${s.name}" must have a non-empty description string.`);Tt(n.name,{name:s.name,exposedName:s.exposedName,alwaysLoad:s.alwaysLoad}),(s.exposedName!==void 0||s.alwaysLoad!==void 0||s.permissionPolicy!==void 0)&&t.push({name:s.name,...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s.permissionPolicy!==void 0?{permission_policy:s.permissionPolicy}:{}});try{e.registerTool(s.name,{description:s.description,inputSchema:s.inputSchema,...s.annotations?{annotations:s.annotations}:{}},s.handler)}catch(r){throw r instanceof Error&&r.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${s.name}" in server "${n.name}". Each tool name must be unique within a server.`):r}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Ju(n,e,t,s,r){return{name:n,description:e,inputSchema:t,handler:s,annotations:r?.annotations,...r?.exposedName!==void 0?{exposedName:r.exposedName}:{},...r?.alwaysLoad!==void 0?{alwaysLoad:r.alwaysLoad}:{},...r?.permissionPolicy!==void 0?{permissionPolicy:r.permissionPolicy}:{}}}import{readdir as Sn,readFile as _t,stat as Me,appendFile as Mr,realpath as Vu,rm as _r}from"fs/promises";import{basename as Yu,join as T,resolve as Rr}from"path";import{execFile as Xu}from"child_process";import{randomUUID as Ir}from"crypto";import{promisify as Zu}from"util";var ec=Zu(Xu),tc=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ar=new Set(["user","assistant","system","progress","attachment"]);function M(n){return n!==null&&typeof n=="object"}function me(n){return tc.test(n)}function nc(n){let e=[];for(let t of n.split(`
22
+ `)){let s=t.trim();if(s)try{let r=JSON.parse(s);M(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&Ar.has(r.type)&&e.push(r)}catch{}}return e}function sc(n,e){let t;for(let s of n.split(`
23
+ `)){let r=s.trim();if(r)try{let o=JSON.parse(r);if(!M(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 kt(n){if(!M(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var rc=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function oc(n){return typeof n=="string"&&rc.has(n)?n:void 0}function wn(n){if(n.type!=="user")return;let e=kt(n).filter(o=>M(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(n.toolDenialKind)?n.toolDenialKind:e.length===1?[n.toolDenialKind]:[],s=Array.isArray(n.userFeedback)?n.userFeedback:e.length===1?[n.userFeedback]:[],r=e.flatMap((o,i)=>{let a=oc(t[i]);if(!a)return[];let u=s[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return r.length>0?r:void 0}function Be(n){if(n.type!=="assistant"||!M(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function Or(n){return n.type!=="user"||!n.parentUuid?!1:kt(n).some(e=>M(e)&&e.type==="tool_result")}function ic(n){if(!M(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function ac(n,e){let t=new Map;for(let[s,r]of n){let o=ic(r);if(o){let i=t.get(o);i?i.push(s):t.set(o,[s])}}for(let[s,r]of n){let o=uc(r,r.parentUuid,n,t,e);o!==r.parentUuid&&n.set(s,{...r,parentUuid:o})}}function uc(n,e,t,s,r){if(!e||t.has(e))return e;let o=s.get(e);return!o||o.length===0?e:o.length===1?o[0]:cc(n,o,t)??lc(n,o,t,r)??e}function cc(n,e,t){if(!Or(n))return;let s=kt(n).filter(o=>M(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(s.length===0)return;let r=e.filter(o=>{let i=t.get(o);return i?kt(i).some(a=>M(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return r.length===1?r[0]:void 0}function lc(n,e,t,s){return e.map(o=>t.get(o)).filter(o=>o!==void 0).filter(o=>(s.get(o.uuid)??-1)<(s.get(n.uuid)??-1)).at(-1)?.uuid}function dc(n){for(let e of n.values()){if(e.type!=="system"||e.subtype!=="compact_boundary")continue;let t=e.compactMetadata?.preservedSegment,s=t?.headUuid,r=t?.anchorUuid,o=t?.tailUuid;if(!s||!r||!o)continue;let i=n.get(s);i&&n.set(s,{...i,parentUuid:r});for(let[a,u]of n)a!==s&&u.parentUuid===r&&n.set(a,{...u,parentUuid:o})}}function Er(n,e,t){let s=(n.timestamp??"").localeCompare(e.timestamp??"");return s!==0?s:(t.get(n.uuid)??Number.MAX_SAFE_INTEGER)-(t.get(e.uuid)??Number.MAX_SAFE_INTEGER)}function pc(n,e,t){let s=e.filter(p=>p.type==="assistant");if(s.length===0)return e;let r=new Map,o=0;for(let p of n.keys())r.set(p,o++);let i=new Map;for(let p of s){let l=Be(p);l&&i.set(l,p)}let a=new Map,u=new Map;for(let p of n.values()){let l=Be(p);if(l){let f=a.get(l)??[];f.push(p),a.set(l,f);continue}if(Or(p)&&p.parentUuid){let f=u.get(p.parentUuid)??[];f.push(p),u.set(p.parentUuid,f)}}let c=new Set,d=new Map;for(let p of s){let l=Be(p);if(!l||c.has(l))continue;c.add(l);let f=a.get(l)??[p],y=f.filter(_=>!t.has(_.uuid)),g=[];for(let _ of f){let P=u.get(_.uuid)??[];for(let Ge of P)t.has(Ge.uuid)||g.push(Ge)}if(y.length===0&&g.length===0)continue;let S=i.get(l);if(!S)continue;let b=[...f].sort((_,P)=>Er(_,P,r));g.sort((_,P)=>Er(_,P,r));let h=b.findIndex(_=>_.uuid===S.uuid),E=b.slice(0,Math.max(h,0)).filter(_=>!t.has(_.uuid)),C=b.slice(h+1).filter(_=>!t.has(_.uuid)),te=[...E,...C,...g];for(let _ of te)t.add(_.uuid);d.set(S.uuid,te)}if(d.size===0)return e;let m=[];for(let p of e){let l=d.get(p.uuid);if(l){let f=r.get(p.uuid)??Number.MAX_SAFE_INTEGER,y=[],g=[];for(let S of l)(p.type==="assistant"&&S.type==="assistant"&&Be(S)===Be(p)&&(r.get(S.uuid)??Number.MAX_SAFE_INTEGER)<f?y:g).push(S);m.push(...y,p,...g)}else m.push(p)}return m}function Dr(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,r=new Map;for(let[d,m]of n.entries())s.set(m.uuid,m),r.set(m.uuid,d);t==="runtime"&&dc(s),ac(s,r);let o;if(e?.leafUuid===null)return[];if(e){let d=s.get(e.leafUuid),m=d?.sessionId??d?.session_id;d&&(m===void 0||m===e.sessionId)&&(o=d)}if(!o){let d=new Set;for(let y of s.values())y.parentUuid&&d.add(y.parentUuid);let m=Array.from(s.values()).filter(y=>!d.has(y.uuid)),p=[];for(let y of m){let g=y,S=new Set;for(;g&&!S.has(g.uuid);){if(S.add(g.uuid),g.type==="user"||g.type==="assistant"){p.push(g);break}g=g.parentUuid?s.get(g.parentUuid):void 0}}if(p.length===0)return[];let l=p.filter(y=>!y.isSidechain&&!y.teamName&&!y.isMeta);o=(l.length>0?l:p).reduce((y,g)=>(r.get(g.uuid)??-1)>(r.get(y.uuid)??-1)?g:y)}let i=[],a=new Set,u=o;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let d=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=d?s.get(d):void 0}i.reverse();let c=t==="runtime"?mc(i):i;return pc(s,c,new Set(c.map(d=>d.uuid)))}function mc(n){let e=-1;for(let t=n.length-1;t>=0;t--){let s=n[t];if(s?.type==="system"&&s.subtype==="compact_boundary"){e=t;break}}return e>=0?n.slice(e):[...n]}function fc(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function vn(n,e,t){let s=n.flatMap(o=>M(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Ar.has(o.type)?[o]:[]),r;for(let o of n){if(!M(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;a!==null&&typeof a!="string"||(r={leafUuid:a,sessionId:e})}return Dr(s,r,t)}function Cr(n,e,t){if(t==="historical"&&fc(n))return!1;let s=n.type==="user"||n.type==="assistant",r=e&&n.type==="system";return!(!s&&!r||n.isMeta||n.isSidechain||n.teamName)}function gc(n){if(!n)return;let e=n.preservedSegment,t={trigger:n.trigger,pre_tokens:n.preTokens??n.pre_tokens,post_tokens:n.postTokens??n.post_tokens,messages_summarized:n.messagesSummarized??n.messages_summarized,duration_ms:n.durationMs??n.duration_ms};return!e?.headUuid||!e.anchorUuid||!e.tailUuid?t:{...t,preserved_segment:{head_uuid:e.headUuid,anchor_uuid:e.anchorUuid,tail_uuid:e.tailUuid}}}function bn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function kn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function Pr(n){let e=n.type==="system"?gc(n.compactMetadata):void 0,t=wn(n);return{type:n.type,uuid:n.uuid,session_id:n.sessionId??n.session_id??"",message:n.message,parent_tool_use_id:null,parent_agent_id:null,...bn(n),...kn(n),...t?{tool_result_meta:t}:{},...typeof n.timestamp=="string"&&n.timestamp.length>0?{timestamp:n.timestamp}:{},...n.type==="system"&&n.subtype?{subtype:n.subtype}:{},...e?{compact_metadata:e}:{}}}function Tr(n,e){let t=Math.max(0,e?.offset??0),s=e?.limit;return s!==void 0&&s>0?n.slice(t,t+s):t>0?n.slice(t):n}async function Rt(n){try{return await Vu(Rr(n))}catch{return Rr(n)}}async function hc(n){return O(await Rt(n))}async function Z(n){let e=Ee();if(n?.dir){let t=await Rt(n.dir),s=[T(e,O(t))];if(n.includeWorktrees!==!1)try{let{stdout:r}=await ec("git",["worktree","list","--porcelain"],{cwd:n.dir}),o=r.split(`
24
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)s.push(T(e,await hc(i)))}catch{}return s}try{return(await Sn(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>T(e,s.name))}catch{return[]}}async function xr(n){try{let[e,t]=await Promise.all([_t(n,"utf-8"),Me(n)]),s=e.trim().split(`
25
+ `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return M(i)?[i]:[]}catch{return[]}});if(s.length===0)return null;let r=Yu(n,".jsonl");return _n(r,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Nr(n,e){return T(n,e,"subagents")}function qr(n){if(typeof n!="object"||n===null)return!1;let e=n;return(e.type==="user"||e.type==="assistant")&&typeof e.uuid=="string"}async function jr(n){let e=[];async function t(s){let r;try{r=await Sn(s,{withFileTypes:!0})}catch{return}for(let o of r){let i=T(s,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(n),e}async function yc(n){try{let e=await _t(n.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function Fr(n){if(n.length===0)return[];let e=new Map(n.map(i=>[i.uuid,i])),t=n[n.length-1],s=[],r=new Set,o=t;for(;o&&!r.has(o.uuid);)r.add(o.uuid),s.push(o),o=o.parentUuid!==void 0&&o.parentUuid!==null?e.get(o.parentUuid):void 0;return s.reverse()}async function Sc(n,e,t){let[s,r]=await Promise.all([_t(n,"utf-8"),yc(n)]),o=[];for(let d of s.trim().split(`
26
+ `).filter(Boolean))try{let m=JSON.parse(d);qr(m)&&o.push(m)}catch{}let a=Fr(o).map(d=>{let m=wn(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??e,message:d.message,parent_tool_use_id:r.parentToolUseId,parent_agent_id:r.parentAgentId,...bn(d),...kn(d),...m?{tool_result_meta:m}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function Ie(n){return O(await Rt(n??process.cwd()))}function $e(n,e){return{projectKey:n,sessionId:e}}function wc(n){let e=0;for(let t of n){if(typeof t.timestamp!="string")continue;let s=Date.parse(t.timestamp);Number.isFinite(s)&&(e=Math.max(e,s))}return e}function vc(n){let e=n.at(-1)?.timestamp;if(typeof e=="string"){let t=Date.parse(e);if(Number.isFinite(t))return t}return Date.now()}var bc=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function kc(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(bc,"");if(s===e)return s;e=s}return e}var _c=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,Rc=/<command-name>(.*?)<\/command-name>/,Ec=/<bash-input>([\s\S]*?)<\/bash-input>/;function Cc(n){if(n.length<=200)return n;let e=n.slice(0,200),t=e.charCodeAt(e.length-1);return`${(t>=55296&&t<=56319?e.slice(0,-1):e).trim()}\u2026`}function Pc(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!M(t))return;let s=t.content,r=[];if(typeof s=="string")r.push(s);else if(Array.isArray(s)){for(let o of s)if(M(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&r.push(o.text)}}for(let o of r){let i=o.replaceAll(`
27
+ `," ").trim();if(!i)continue;let a=Rc.exec(i);if(a){e.commandFallback??=a[1];continue}let u=Ec.exec(i);if(u)return`! ${u[1].trim()}`;if(!_c.test(i))return Cc(i)}}function _n(n,e,t,s={}){if(e.length===0)return;let r,o,i,a,u,c,d,m,p,l,f;for(let b of e){let h=b;if(f??=h.isSidechain===!0,l===void 0&&typeof h.timestamp=="string"){let E=Date.parse(h.timestamp);Number.isFinite(E)&&(l=E)}if(!r){let E={commandFallback:o};r=Pc(h,E),o=E.commandFallback}h.type==="custom-title"&&typeof h.customTitle=="string"&&(i=h.customTitle),h.type==="ai-title"&&typeof h.aiTitle=="string"&&(a=h.aiTitle),typeof h.lastPrompt=="string"&&(u=h.lastPrompt),typeof h.summary=="string"&&(c=h.summary),h.type==="tag"&&(p=typeof h.tag=="string"&&h.tag?h.tag:void 0),typeof h.gitBranch=="string"&&(d=h.gitBranch),m===void 0&&typeof h.cwd=="string"&&(m=h.cwd),h.type==="relocated"&&typeof h.relocatedCwd=="string"&&(m=h.relocatedCwd)}if(f)return;let y=r??o,g=i||a,S=g||u||c||y;if(S)return{sessionId:n,summary:S,lastModified:t??wc(e),fileSize:s.fileSize,customTitle:g,firstPrompt:y,gitBranch:d,cwd:m||s.defaultCwd,tag:p,createdAt:l}}async function Kr(n,e,t){let s=$e(await Ie(t),e),r=await n.load(s);return r?{key:s,entries:r}:void 0}async function Tc(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let d=await Rt(n.dir??process.cwd()),m=O(d),p=(await c.listSessions(m)).slice().sort((g,S)=>S.mtime-g.mtime),l=Math.max(0,n.offset??0),f=n.limit!==void 0&&n.limit>0?p.slice(l,l+n.limit):l>0?p.slice(l):p;return(await Promise.allSettled(f.map(async({sessionId:g,mtime:S})=>{let b=await c.load($e(m,g));return b?_n(g,b,S,{defaultCwd:d}):void 0}))).flatMap((g,S)=>{if(g.status==="fulfilled")return g.value?[g.value]:[];let b=f[S];return[{sessionId:b.sessionId,summary:"",lastModified:b.mtime}]})}let e=await Z(n),s=(await Promise.all(e.map(async c=>{try{return(await Sn(c)).filter(m=>m.endsWith(".jsonl")).map(m=>T(c,m))}catch{return[]}}))).flat(),r=await Promise.all(s.map(xr)),o=new Map;for(let c of r){if(!c)continue;let d=o.get(c.sessionId);(!d||c.lastModified>d.lastModified)&&o.set(c.sessionId,c)}let i=Array.from(o.values()).sort((c,d)=>d.lastModified-c.lastModified),a=n?.offset??0,u=n?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function Mc(n,e){if(e?.sessionStore){if(!me(n))return;let s=await Kr(e.sessionStore,n,e.dir);return s?_n(n,s.entries,vc(s.entries)):void 0}let t=await Z(e);for(let s of t){let r=T(s,`${n}.jsonl`),o=await xr(r);if(o)return o}}async function Ic(n,e){if(!me(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let o=await Kr(e.sessionStore,n,e.dir);if(!o)return[];let i=vn(o.entries,n,s);return Tr(i.filter(a=>Cr(a,t,s)).map(Pr),e)}let r=await Z(e);for(let o of r){let i=T(o,`${n}.jsonl`);try{let a=await _t(i,"utf-8"),c=Dr(nc(a),sc(a,n),s).filter(d=>Cr(d,t,s)).map(Pr);return Tr(c,e)}catch{continue}}return[]}async function Ac(n,e,t){if(!me(n))throw new Error(`Invalid sessionId: ${n}`);let s=e.trim();if(!s)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append($e(await Ie(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Ir(),timestamp:new Date().toISOString()}]);return}let r=await Z(t);for(let o of r){let i=T(o,`${n}.jsonl`);try{await Me(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await Mr(i,a+`
28
+ `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Oc(n,e,t){if(!me(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:kc(e).trim();if(s!==null&&!s)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append($e(await Ie(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Ir(),timestamp:new Date().toISOString()}]);return}let r=await Z(t);for(let o of r){let i=T(o,`${n}.jsonl`);try{await Me(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await Mr(i,a+`
29
+ `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Dc(n,e){if(e?.sessionStore){if(!me(n))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let s=await e.sessionStore.listSubkeys({projectKey:await Ie(e.dir),sessionId:n});return Array.from(new Set(s.map(r=>{if(!r.startsWith("subagents/"))return;let o=r.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(r=>r!==void 0)))}let t=await Z(e);for(let s of t){let r=T(s,`${n}.jsonl`);try{await Me(r);let o=await jr(Nr(s,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function xc(n,e,t){if(t?.sessionStore){if(!me(n)||!e)return[];let r=await Ie(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:r,sessionId:n}),f=`agent-${e}`,y=l.find(g=>g.startsWith("subagents/")&&g.split("/").at(-1)===f);if(!y)return[];o=y}let i=await t.sessionStore.load({projectKey:r,sessionId:n,subpath:o});if(!i)return[];let a=i.filter(qr),u=i.filter(l=>l.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,d=typeof u?.parentAgentId=="string"?u.parentAgentId:null,m=Fr(a).map(l=>{let f=wn(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??n,message:l.message,parent_tool_use_id:c,parent_agent_id:d,...bn(l),...kn(l),...f?{tool_result_meta:f}:{}}}),p=Math.max(0,t.offset??0);return t.limit!==void 0?m.slice(p,p+t.limit):m.slice(p)}let s=await Z(t);for(let r of s){let o=T(r,`${n}.jsonl`);try{await Me(o);let a=(await jr(Nr(r,n))).find(u=>u.agentId===e);return a?await Sc(a.filePath,n,t):[]}catch{continue}}return[]}async function Nc(n,e){if(!me(n))throw new Error(`Invalid sessionId: ${n}`);if(e?.sessionStore){if(!e.sessionStore.delete)throw new Error("SessionStore does not support delete()");await e.sessionStore.delete($e(await Ie(e.dir),n));return}let t=await Z(e);for(let s of t){let r=T(s,`${n}.jsonl`);try{await Me(r),await Promise.all([_r(r,{force:!0}),_r(T(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as Et}from"crypto";import{readdir as qc,readFile as jc,realpath as Fc,stat as Ur,writeFile as Kc}from"fs/promises";import{dirname as Uc,join as Rn,resolve as Lc}from"path";var Lr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Bc=new Set(["user","assistant","attachment","system","progress"]);async function $r(n){let e=Lc(n);try{return await Fc(e)}catch{return e}}async function $c(n,e){let t=Ee();if(e){let r=O(await $r(e)),o=Rn(t,r,`${n}.jsonl`);try{if((await Ur(o)).size>0)return o}catch{}return}let s;try{s=await qc(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=Rn(t,r.name,`${n}.jsonl`);try{if((await Ur(o)).size>0)return o}catch{}}}function zr(n,e){let t=[],s;for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type==="content-replacement"&&i.sessionId===e&&Array.isArray(i.replacements)){t.push(...i.replacements);continue}i.type==="relocated"&&i.sessionId===e&&typeof i.relocatedCwd=="string"&&(s=i.relocatedCwd)}return{transcript:vn(n,e,"historical").filter(o=>Bc.has(o.type)),contentReplacements:t,relocatedCwd:s}}function zc(n,e){let t=[];for(let s of n.split(`
30
+ `))if(s.trim())try{t.push(JSON.parse(s))}catch{}return zr(t,e)}function Qc(n){for(let e of n){if(e===null||typeof e!="object")continue;let t=e;if(t.type!=="user"||t.isMeta===!0||t.isCompactSummary===!0)continue;let s=t.message;if(s===null||typeof s!="object")continue;let r=s.content;if(typeof r=="string"&&r.trim())return r.trim();if(!Array.isArray(r)||r.some(i=>i!==null&&typeof i=="object"&&i.type==="tool_result"))continue;let o=r.filter(i=>i!==null&&typeof i=="object"&&i.type==="text"&&typeof i.text=="string").map(i=>i.text).join(`
31
+ `).trim();if(o)return o}}function Gc(n){let e,t;for(let s of n){if(s===null||typeof s!="object")continue;let r=s;typeof r.customTitle=="string"&&r.customTitle&&(e=r.customTitle),typeof r.aiTitle=="string"&&r.aiTitle&&(t=r.aiTitle)}return e??t??Qc(n)}function Br(n,e,t,s){let r=n.transcript.filter(l=>l.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=r.findIndex(f=>f.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,l+1)}let o=new Set(r.map(l=>l.uuid)),i=new Map(r.map(l=>[l.uuid,Et()])),a=r.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(l=>[l.uuid,l])),c=Et(),d=new Date().toISOString(),m=a.map((l,f)=>{let y=null,g=typeof l.parentUuid=="string"?l.parentUuid:void 0;for(;g;){let h=u.get(g);if(!h)break;if(h.type!=="progress"){y=i.get(g)??null;break}g=typeof h.parentUuid=="string"?h.parentUuid:void 0}let S=typeof l.logicalParentUuid=="string"?i.get(l.logicalParentUuid)??null:l.logicalParentUuid??null,b={...l,...l.type==="system"&&l.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(l.uuid),parentUuid:y,logicalParentUuid:S,sessionId:c,timestamp:f===a.length-1?d:typeof l.timestamp=="string"?l.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:l.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let l=n.contentReplacements.flatMap(f=>{if(f===null||typeof f!="object")return[];let y=f.messageUuid;if(typeof y!="string"||!o.has(y))return[];let g=i.get(y);return g?[{...f,messageUuid:g}]:[]});l.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:l,uuid:Et(),timestamp:d})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${Gc(s)??"Forked session"} (fork)`,uuid:Et(),timestamp:d}),{sessionId:c,entries:m}}async function Wc(n,e={}){if(!Lr.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!Lr.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await $r(e.dir??process.cwd()),a=O(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=Br(zr(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await $c(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await jc(t,"utf8"),r=s.split(`
32
+ `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=Br(zc(s,n),n,e,r);return await Kc(Rn(Uc(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
33
33
  `)}
34
- `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ct(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Rn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Ct(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(Ct(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Ct(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Ct(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 Wc}from"fs";import{readdir as Wr,readFile as Hc,realpath as Jc,stat as zr}from"fs/promises";import{basename as Qr,dirname as Vc,join as ze,relative as Yc,resolve as Xc,sep as Zc}from"path";import{createInterface as el}from"readline";var tl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,nl=500,sl=1024*1024;async function rl(n){let e=Xc(n);try{return await Jc(e)}catch{return e}}async function ol(n,e){let t=Ee();if(e){let r=O(await rl(e)),o=ze(t,r,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await Wr(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=ze(t,r.name,`${n}.jsonl`);try{if((await zr(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function il(n){let e=[];async function t(s){let r;try{r=await Wr(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=ze(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Gr(n,e,t,s){let r=el({input:Wc(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=sl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function al(n,e,t={}){if(!tl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await ol(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:nl;if(await Gr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=ze(o,"subagents");for(let a of await il(i)){let c=Yc(o,a).split(Zc);c[c.length-1]=Qr(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await Gr(a,d,e,r);let m=ze(Vc(a),`${Qr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Hc(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as ul}from"node:child_process";import{existsSync as cl}from"node:fs";import{Worker as ll}from"node:worker_threads";var En=3e4;async function Hr(n,e={}){let t=Ce({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},se);return t.transport==="worker"?pl(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):dl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??H()})}function dl(n,e){return new Promise((t,s)=>{let r=ul(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Jr(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(Vr(e.timeoutMs)))},e.timeoutMs??En);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function pl(n,e){fl(e.signal);let t=V(e.pathToQoderWorkerRuntime),s=await ve(t);ml(s);let r=e.cwd??process.cwd(),o=Jr(e.env);delete o.NODE_OPTIONS;let i=it(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new ll(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(E),e.signal?.removeEventListener("abort",h)},S=C=>{p||(p=!0,g(),u(C))},b=()=>{p||l===void 0||!f||!y||(p=!0,g(),a({stdout:d,stderr:m,exitCode:l}))},h=()=>{c.terminate(),S(Yr(e.signal))},E=setTimeout(()=>{c.terminate(),S(Vr(e.timeoutMs))},e.timeoutMs??En);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",h,{once:!0}),e.signal?.aborted&&h()})}function Jr(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function ml(n){if(!cl(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Vr(n){return new Error(`qodercli subprocess timed out after ${n??En}ms`)}function fl(n){if(n?.aborted)throw Yr(n)}function Yr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function gl(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ae(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,...typeof r.projectPath=="string"?{projectPath:r.projectPath}:{},resources:r.resources}))}async function hl(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function yl(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function Sl(n,e){let t=e?.scope??"user",s=await Ae(["plugins","install",n,"--scope",t,"--json"],e);s.exitCode!==0&&Qe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,version:r.version??"local",path:r.path}}async function wl(n,e){let t=e?.scope??"user",s=["plugins","uninstall",n,"--scope",t,"--json"];e?.keepData&&s.push("--keep-data");let r=await Ae(s,e);r.exitCode!==0&&Qe(r);let o=JSON.parse(r.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function vl(n,e){let t;try{t=await Ae(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new N("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ee("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=bl(`${t.stderr}
35
- ${t.stdout}`);throw ee(r?"plugin_validation_unsupported":"plugin_validation_protocol_error",r?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(s&&typeof s=="object"&&"ok"in s&&s.schemaVersion!==1)throw ee("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(s&&typeof s=="object"&&s.ok===!0&&s.report){let r=s.report;if(_l(r))return r;throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(s&&typeof s=="object"&&s.ok===!1){let r=s.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw ee(o.code,o.message)}throw t.exitCode!==0&&Qe(t),ee("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function bl(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var kl=3e4;function Ae(n,e){return Hr(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:kl})}function Qe(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw ee(e,t)}function ee(n,e){let t=new Error(e);return t.code=n,t}function _l(n){if(!n||typeof n!="object")return!1;let e=n;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(s=>s!==null&&typeof s=="object"&&(s.severity==="error"||s.severity==="warning")&&typeof s.code=="string"&&typeof s.message=="string"&&typeof s.phase=="string"&&t.has(s.phase)&&(s.location===void 0||s.location!==null&&typeof s.location=="object"&&typeof s.location.path=="string"))}import{execFile as Rl}from"child_process";function El(){return H()}async function Cl(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??El(),s=e?.timeout??6e4,r=["feedback","-c",n.content,"--json"];if(e?.storageDir&&r.push("--storage-dir",e.storageDir),n.sessionId&&r.push("-s",n.sessionId),n.workdir&&r.push("--workdir",n.workdir),n.email&&r.push("--email",n.email),n.include)for(let o of n.include)r.push("--include",o);if(n.imagePaths)for(let o of n.imagePaths)r.push("--images",o);if(n.callerVersion&&r.push("--caller-version",n.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&r.push("--ide-type",o)}return new Promise(o=>{Rl(t,r,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var eo={};ao(eo,{filterEscalatingDefaultMode:()=>Xr,isBashToolBackgroundLaunchResult:()=>Zr});var Pl=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Xr(n){let e=n.effective.permissions?.defaultMode;if(!e||!Pl.has(e))return n.effective;for(let t=n.sources.length-1;t>=0;t-=1){let s=n.sources[t];if(s.settings.permissions?.defaultMode!==void 0){if(s.source==="project"){let{defaultMode:r,...o}=n.effective.permissions??{};return{...n.effective,permissions:o}}return n.effective}}return n.effective}function Zr(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{N as AbortError,Xe as AuthAccessTokenEnvVarError,Ze as AuthServiceAccountEnvVarError,qe as ControlRequestError,qn as DEFAULT_ACCESS_TOKEN_ENV_VAR,se as DEFAULT_RUNTIME_TRANSPORT,Ye as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,St as DaemonRpcError,co as EXIT_REASONS,uo as HOOK_EVENTS,Rn as InMemorySessionStore,gt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Ne as ModelPolicyTimeoutError,Se as ProcessTransport,q as ProtocolVersionMismatchError,I as QoderCliProcessError,oe as QoderWorkerRuntimeError,W as UnsupportedCliCapabilityError,Kt as WIRE_PROTOCOL_VERSION,be as WorkerTransport,ho as accessToken,yo as accessTokenFromEnv,eo as coreTypes,Wu as createSdkMcpServer,xc as deleteSession,yl as disablePlugin,hl as enablePlugin,Xr as filterEscalatingDefaultMode,Gc as forkSession,Tc as getSessionInfo,Mc as getSessionMessages,Dc as getSubagentMessages,is as hasResolvableQoderWorkerRuntime,al as importSessionToStore,br as initDaemon,Sl as installPlugin,Zr as isBashToolBackgroundLaunchResult,bo as jobToken,gl as listPlugins,Pc as listSessions,Oc as listSubagents,So as qodercliAuth,dn as query,Ic as renameSession,V as resolveQoderWorkerRuntimePath,Lu as resolveSettings,wo as serviceAccount,vo as serviceAccountFromEnv,$u as shutdownDaemon,cn as startDaemon,Tu as startup,Cl as submitFeedback,Ac as tagSession,Hu as tool,wl as uninstallPlugin,vl as validatePlugin};
34
+ `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Ct(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var En=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Ct(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(Ct(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(Ct(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(Ct(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 Hc}from"fs";import{readdir as Hr,readFile as Jc,realpath as Vc,stat as Qr}from"fs/promises";import{basename as Gr,dirname as Yc,join as ze,relative as Xc,resolve as Zc,sep as el}from"path";import{createInterface as tl}from"readline";var nl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,sl=500,rl=1024*1024;async function ol(n){let e=Zc(n);try{return await Vc(e)}catch{return e}}async function il(n,e){let t=Ee();if(e){let r=O(await ol(e)),o=ze(t,r,`${n}.jsonl`);try{if((await Qr(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await Hr(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=ze(t,r.name,`${n}.jsonl`);try{if((await Qr(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function al(n){let e=[];async function t(s){let r;try{r=await Hr(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=ze(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function Wr(n,e,t,s){let r=tl({input:Hc(n,{encoding:"utf8"}),crlfDelay:1/0}),o=[],i=0;for await(let a of r){if(!a.trim())continue;let u;try{u=JSON.parse(a)}catch(c){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(c)}`);continue}if(u===null||typeof u!="object"){console.warn(`importSessionToStore: skipping non-object line in ${n}`);continue}o.push(u),i+=Buffer.byteLength(a),(o.length>=s||i>=rl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function ul(n,e,t={}){if(!nl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await il(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:sl;if(await Wr(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=ze(o,"subagents");for(let a of await al(i)){let c=Xc(o,a).split(el);c[c.length-1]=Gr(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await Wr(a,d,e,r);let m=ze(Yc(a),`${Gr(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Jc(m,"utf8"));await e.append(d,[{type:"agent_metadata",...p}])}catch(p){if(typeof p=="object"&&p!==null&&"code"in p&&p.code==="ENOENT")continue;console.warn(`importSessionToStore: skipping unreadable sidecar ${m}: ${String(p)}`)}}}import{spawn as cl}from"node:child_process";import{existsSync as ll}from"node:fs";import{Worker as dl}from"node:worker_threads";var Cn=3e4;async function Jr(n,e={}){let t=Ce({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},se);return t.transport==="worker"?ml(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):pl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??H()})}function pl(n,e){return new Promise((t,s)=>{let r=cl(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:Vr(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(Yr(e.timeoutMs)))},e.timeoutMs??Cn);r.stdout.on("data",c=>{o+=c.toString()}),r.stderr.on("data",c=>{i+=c.toString()}),r.on("error",c=>{a||(a=!0,clearTimeout(u),s(c))}),r.on("close",c=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:c??1}))})})}async function ml(n,e){gl(e.signal);let t=V(e.pathToQoderWorkerRuntime),s=await ve(t);fl(s);let r=e.cwd??process.cwd(),o=Vr(e.env);delete o.NODE_OPTIONS;let i=it(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new dl(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,f=c.stdout===null,y=c.stderr===null,g=()=>{clearTimeout(E),e.signal?.removeEventListener("abort",h)},S=C=>{p||(p=!0,g(),u(C))},b=()=>{p||l===void 0||!f||!y||(p=!0,g(),a({stdout:d,stderr:m,exitCode:l}))},h=()=>{c.terminate(),S(Xr(e.signal))},E=setTimeout(()=>{c.terminate(),S(Yr(e.timeoutMs))},e.timeoutMs??Cn);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{f=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{y=!0,b()}),c.once("error",S),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",h,{once:!0}),e.signal?.aborted&&h()})}function Vr(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function fl(n){if(!ll(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function Yr(n){return new Error(`qodercli subprocess timed out after ${n??Cn}ms`)}function gl(n){if(n?.aborted)throw Xr(n)}function Xr(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function hl(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ae(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,...typeof r.projectPath=="string"?{projectPath:r.projectPath}:{},resources:r.resources}))}async function yl(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function Sl(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ae(t,e);s.exitCode!==0&&Qe(s)}async function wl(n,e){let t=e?.scope??"user",s=await Ae(["plugins","install",n,"--scope",t,"--json"],e);s.exitCode!==0&&Qe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,version:r.version??"local",path:r.path}}async function vl(n,e){let t=e?.scope??"user",s=["plugins","uninstall",n,"--scope",t,"--json"];e?.keepData&&s.push("--keep-data");let r=await Ae(s,e);r.exitCode!==0&&Qe(r);let o=JSON.parse(r.stdout);return{pluginId:o.pluginId,fullyRemoved:o.fullyRemoved,reverseDependents:o.reverseDependents??[]}}async function bl(n,e){let t;try{t=await Ae(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new N("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ee("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=kl(`${t.stderr}
35
+ ${t.stdout}`);throw ee(r?"plugin_validation_unsupported":"plugin_validation_protocol_error",r?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(s&&typeof s=="object"&&"ok"in s&&s.schemaVersion!==1)throw ee("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(s&&typeof s=="object"&&s.ok===!0&&s.report){let r=s.report;if(Rl(r))return r;throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(s&&typeof s=="object"&&s.ok===!1){let r=s.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw ee("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw ee(o.code,o.message)}throw t.exitCode!==0&&Qe(t),ee("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function kl(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var _l=3e4;function Ae(n,e){return Jr(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:_l})}function Qe(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw ee(e,t)}function ee(n,e){let t=new Error(e);return t.code=n,t}function Rl(n){if(!n||typeof n!="object")return!1;let e=n;if(e.schemaVersion!==1||typeof e.valid!="boolean"||!e.validator||e.validator.name!=="qodercli"||typeof e.validator.version!="string"||!e.target||typeof e.target.inputPath!="string"||typeof e.target.resolvedPath!="string"||!Array.isArray(e.diagnostics)||!e.summary||typeof e.summary.errorCount!="number"||typeof e.summary.warningCount!="number"||typeof e.summary.componentCount!="number")return!1;let t=new Set(["target","manifest","component","load-simulation","installability"]);return e.diagnostics.every(s=>s!==null&&typeof s=="object"&&(s.severity==="error"||s.severity==="warning")&&typeof s.code=="string"&&typeof s.message=="string"&&typeof s.phase=="string"&&t.has(s.phase)&&(s.location===void 0||s.location!==null&&typeof s.location=="object"&&typeof s.location.path=="string"))}import{execFile as El}from"child_process";function Cl(){return H()}async function Pl(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??Cl(),s=e?.timeout??6e4,r=["feedback","-c",n.content,"--json"];if(e?.storageDir&&r.push("--storage-dir",e.storageDir),n.sessionId&&r.push("-s",n.sessionId),n.workdir&&r.push("--workdir",n.workdir),n.email&&r.push("--email",n.email),n.include)for(let o of n.include)r.push("--include",o);if(n.imagePaths)for(let o of n.imagePaths)r.push("--images",o);if(n.callerVersion&&r.push("--caller-version",n.callerVersion),e?.integrationMode){let o=e.integrationMode==="qoder_work"?"QoderWork":e.integrationMode==="quest"?"Quest":e.integrationMode;o&&r.push("--ide-type",o)}return new Promise(o=>{El(t,r,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let c=JSON.parse(u);o({success:!!c.success,message:c.success?c.message||"Feedback submitted successfully":c.error||c.message||"Failed to submit feedback",requestId:c.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var to={};uo(to,{filterEscalatingDefaultMode:()=>Zr,isBashToolBackgroundLaunchResult:()=>eo});var Tl=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function Zr(n){let e=n.effective.permissions?.defaultMode;if(!e||!Tl.has(e))return n.effective;for(let t=n.sources.length-1;t>=0;t-=1){let s=n.sources[t];if(s.settings.permissions?.defaultMode!==void 0){if(s.source==="project"){let{defaultMode:r,...o}=n.effective.permissions??{};return{...n.effective,permissions:o}}return n.effective}}return n.effective}function eo(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{N as AbortError,Xe as AuthAccessTokenEnvVarError,Ze as AuthServiceAccountEnvVarError,Kt as CONTROL_REQUEST_TIMEOUT_CODE,ke as ControlRequestError,jn as DEFAULT_ACCESS_TOKEN_ENV_VAR,se as DEFAULT_RUNTIME_TRANSPORT,Ye as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,St as DaemonRpcError,lo as EXIT_REASONS,co as HOOK_EVENTS,En as InMemorySessionStore,gt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Ne as ModelPolicyTimeoutError,Se as ProcessTransport,q as ProtocolVersionMismatchError,I as QoderCliProcessError,oe as QoderWorkerRuntimeError,W as UnsupportedCliCapabilityError,Ut as WIRE_PROTOCOL_VERSION,be as WorkerTransport,yo as accessToken,So as accessTokenFromEnv,to as coreTypes,Hu as createSdkMcpServer,Nc as deleteSession,Sl as disablePlugin,yl as enablePlugin,Zr as filterEscalatingDefaultMode,Wc as forkSession,Mc as getSessionInfo,Ic as getSessionMessages,xc as getSubagentMessages,as as hasResolvableQoderWorkerRuntime,ul as importSessionToStore,kr as initDaemon,wl as installPlugin,eo as isBashToolBackgroundLaunchResult,ko as jobToken,hl as listPlugins,Tc as listSessions,Dc as listSubagents,wo as qodercliAuth,pn as query,Ac as renameSession,V as resolveQoderWorkerRuntimePath,Bu as resolveSettings,vo as serviceAccount,bo as serviceAccountFromEnv,zu as shutdownDaemon,ln as startDaemon,Mu as startup,Pl as submitFeedback,Oc as tagSession,Ju as tool,vl as uninstallPlugin,bl as validatePlugin};