@qoder-ai/qoder-agent-sdk 1.0.30 → 1.0.31

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 Ro=Object.defineProperty;var Eo=(n,e)=>{for(var t in e)Ro(n,t,{get:e[t],enumerable:!0})};import{spawn as ri}from"child_process";import{createInterface as oi}from"readline";var Po=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],To=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],et=2e3,Qn=5e3;var tt="1.0.30";var oe=41,$n=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],zn=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Co="QODER_FEATURE_TASKS";function Bn(n){let e=n[Co];if(e!=="0"&&e!=="false")return[...$n];let t=new Set(zn);return $n.flatMap(s=>s===zn[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Yn,mkdtemp as Uo,rm as Xn,writeFile as Lo}from"fs/promises";import{existsSync as ot,mkdtempSync as Ko,readFileSync as $o,rmSync as zo,writeFileSync as Qo}from"fs";import{homedir as Bo,tmpdir as Zn}from"os";import{dirname as is,join as $}from"path";import{fileURLToPath as Jo}from"url";var Mo=/^[A-Za-z0-9_-]{1,64}$/,Oo=new Set(["mcp_list","mcp_get","mcp_call"]);function Nt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Mo.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Oo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function jt(n,e){let t={};for(let s of e)Nt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function qt(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=jt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Jn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=qt(t,s,r)}return e}var Ao="global",Hn=Ao==="cn",Do=Hn?"QODERCN_":"QODER_",Ft=`${Do}VPC_ENDPOINT`,v=Hn?{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 Gn=v.accessTokenEnv,nt=v.serviceAccountEnv;function Io(n){return{type:"accessToken",accessToken:n}}function xo(n=Gn){return{type:"accessToken",accessToken:{envVar:n}}}function No(){return{type:"qodercli"}}function jo(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 qo(n=nt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function Fo(n){return{type:"jobToken",fetchJobToken:n}}var Wn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Vn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Wn),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 Wn){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 es="QODER_AGENT_SDK_ENTRYPOINT",ts="QODER_AGENT_SDK_VERSION",ns="QODER_SDK_AUTH_PAYLOAD_FILE",Ho="sdk-ts",Go=Jo(import.meta.url),ss=is(Go),st=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},rt=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function it(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function W(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Wo();if(n)return n;let e=Vo();if(ot(e))return e;let t=Yo();return t||v.cliCommands[0]}function Wo(){for(let n of as())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,"dist","_bundled",t);if(ot(s))return s}return null}function Vo(){for(let n of as())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[$(n,"node_modules",".bin",t),$(n,"..","..",".bin",t)];for(let r of s)if(ot(r))return r}return v.cliCommands[0]}function Yo(){let n=process.env[v.cliHomeEnv]??Bo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,v.configDirName,"local",t);if(ot(s))return s}return null}function as(){let n=[$(ss,".."),$(ss,"..","..")];return[...new Set(n)]}function Xo(){return{allow:[],ask:[],deny:[]}}function rs(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function Zo(n,e){if(e.startsWith("mcp__"))return e;let t=rs(n),s=e==="*"?"*":rs(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function os(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 ei(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var H=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{zo(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=is(this.authPayloadPath);try{await Xn(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[es],delete t[ts],delete t[ns];for(let s of this.serviceAccountCredentialEnvVars())ti(t,s);if(t[es]=Ho,t[ts]=tt,this.authPayloadPath&&(t[ns]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Ft]=s:delete t[Ft]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[nt];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Bn(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?ei(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Vn(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]:[];os(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=qt(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=Xo(),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=Zo(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]]:[];os(o,t[r]),s[r]=o}}readSettingsFile(e){let t=$o(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Ko($(Zn(),"qoder-agent-sdk-settings-"));let t=$(this.generatedSettingsDir,"settings.json");return Qo(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await Uo($(Zn(),"qoder-sdk-auth-"));try{await Yn(s,448);let r=$(s,"payload.json");return await Lo(r,JSON.stringify(t),{mode:384}),await Yn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await Xn(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new rt(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new st(t);return s}};function ti(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function at(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var ni=new Set(["--mcp-config","--proxy","--settings"]);function ut(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),ni.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as si}from"node:stream";var z=16*1024*1024,je=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},V=class extends si{constructor(t=z,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new je(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new je(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ve(n,e=z,t="JSONL output"){let s=n.endsWith(`
2
- `)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new je(t,e)}var us=8192,I=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},be=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(at(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${ut(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,u)=>{this.ready=!1,a===oe&&this.fireAuthExpired();let c=this.createProcessExitError(a,u);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})})}else this.process=ri(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===oe&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
1
+ var To=Object.defineProperty;var Co=(n,e)=>{for(var t in e)To(n,t,{get:e[t],enumerable:!0})};import{spawn as ai}from"child_process";import{createInterface as ui}from"readline";var Mo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Oo=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],et=2e3,Jn=5e3;var tt="1.0.31";var ae=41,Bn=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Qn=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Ao="QODER_FEATURE_TASKS";function Hn(n){let e=n[Ao];if(e!=="0"&&e!=="false")return[...Bn];let t=new Set(Qn);return Bn.flatMap(s=>s===Qn[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as Zn,mkdtemp as $o,rm as es,writeFile as zo}from"fs/promises";import{existsSync as ot,mkdtempSync as Bo,readFileSync as Qo,rmSync as Jo,writeFileSync as Ho}from"fs";import{homedir as Go,tmpdir as ts}from"os";import{dirname as us,join as $}from"path";import{fileURLToPath as Wo}from"url";var Io=/^[A-Za-z0-9_-]{1,64}$/,Do=new Set(["mcp_list","mcp_get","mcp_call"]);function Nt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Io.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(Do.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function jt(n,e){let t={};for(let s of e)Nt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function qt(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=jt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Gn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=qt(t,s,r)}return e}var xo="global",Wn=xo==="cn",No=Wn?"QODERCN_":"QODER_",Ft=`${No}VPC_ENDPOINT`,v=Wn?{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 Vn=v.accessTokenEnv,nt=v.serviceAccountEnv;function jo(n){return{type:"accessToken",accessToken:n}}function qo(n=Vn){return{type:"accessToken",accessToken:{envVar:n}}}function Fo(){return{type:"qodercli"}}function Uo(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 Lo(n=nt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function Ko(n){return{type:"jobToken",fetchJobToken:n}}var Yn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Xn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Yn),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 Yn){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 ns="QODER_AGENT_SDK_ENTRYPOINT",ss="QODER_AGENT_SDK_VERSION",rs="QODER_SDK_AUTH_PAYLOAD_FILE",Vo="sdk-ts",Yo=Wo(import.meta.url),os=us(Yo),st=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},rt=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function it(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function W(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Xo();if(n)return n;let e=Zo();if(ot(e))return e;let t=ei();return t||v.cliCommands[0]}function Xo(){for(let n of cs())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,"dist","_bundled",t);if(ot(s))return s}return null}function Zo(){for(let n of cs())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[$(n,"node_modules",".bin",t),$(n,"..","..",".bin",t)];for(let r of s)if(ot(r))return r}return v.cliCommands[0]}function ei(){let n=process.env[v.cliHomeEnv]??Go();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,v.configDirName,"local",t);if(ot(s))return s}return null}function cs(){let n=[$(os,".."),$(os,"..","..")];return[...new Set(n)]}function ti(){return{allow:[],ask:[],deny:[]}}function is(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function ni(n,e){if(e.startsWith("mcp__"))return e;let t=is(n),s=e==="*"?"*":is(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function as(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 si(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var H=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Jo(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=us(this.authPayloadPath);try{await es(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[ns],delete t[ss],delete t[rs];for(let s of this.serviceAccountCredentialEnvVars())ri(t,s);if(t[ns]=Vo,t[ss]=tt,this.authPayloadPath&&(t[rs]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Ft]=s:delete t[Ft]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[nt];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Hn(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?si(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Xn(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]:[];as(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=qt(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=ti(),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=ni(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]]:[];as(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Qo(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=Bo($(ts(),"qoder-agent-sdk-settings-"));let t=$(this.generatedSettingsDir,"settings.json");return Ho(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await $o($(ts(),"qoder-sdk-auth-"));try{await Zn(s,448);let r=$(s,"payload.json");return await zo(r,JSON.stringify(t),{mode:384}),await Zn(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await es(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new rt(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new st(t);return s}};function ri(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function at(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var oi=new Set(["--mcp-config","--proxy","--settings"]);function ut(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),oi.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as ii}from"node:stream";var z=16*1024*1024,qe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},V=class extends ii{constructor(t=z,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new qe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new qe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ve(n,e=z,t="JSONL output"){let s=n.endsWith(`
2
+ `)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new qe(t,e)}var ls=8192,D=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},be=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(at(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${ut(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,u)=>{this.ready=!1,a===ae&&this.fireAuthExpired();let c=this.createProcessExitError(a,u);c&&(this.processExitError=c),this.cleanupAuthPayload().catch(()=>{})})}else this.process=ai(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===ae&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
3
3
  `)?e:e+`
4
- `;if(ve(t,z,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new V(z,"SDK process output");e.pipe(t);let s=oi({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let s=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!s)return;let r=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??et,i=setTimeout(()=>{if(r()){s("SIGTERM");let a=setTimeout(()=>{r()&&s("SIGKILL")},Qn);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>us&&(this.stderrTail=this.stderrTail.slice(-us))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new I(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==oe){if(e!==0&&e!==null)return new I(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new I(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{e.off("exit",r);let a=this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??W();if(it(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function ii(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ie=ii();function cs(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function ct(n,e){return n.create(e)}import{existsSync as Ai}from"fs";import{createInterface as Di}from"readline";import{Worker as Ii}from"worker_threads";import{createHash as ai}from"node:crypto";import{existsSync as ui}from"node:fs";import{chmod as ci,lstat as di,mkdir as qe,readFile as ds,readdir as li,readlink as pi,rename as mi,rm as dt,stat as fi,symlink as gi,writeFile as ls}from"node:fs/promises";import{tmpdir as hi,userInfo as yi}from"node:os";import{basename as ps,dirname as _e,join as Q,relative as Si}from"node:path";var wi="QODER_WORKER_RUNTIME_ASSET_ROOT",ms=/(^|[\\/])app\.asar([\\/]|$)/,Lt=".qoder-worker-runtime-ready";function fs(n){return ms.test(n)}function Kt(n){return fs(n)?n.replace(ms,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ke(n,e={}){let t=Kt(n);if(!e.forceMaterialize&&t){let u=_e(t);if(ui(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ut(t,u,!1,_e(n))}if(!(e.forceMaterialize||fs(n))){let u=_e(n);return Ut(n,u,!1)}let r=_e(n),o=await vi(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=Si(r,n)||ps(n),a=Q(o,i);return Ut(a,o,!0,r)}function Ut(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[wi]:e}}}async function vi(n,e,t){let s=await bi(n,e),r=t.cacheDir??Ri(),o=Q(r,s),i=Q(o,Lt);if(await hs(i)===s)return o;let a=Q(r,`.setup-${s}-${process.pid}-${Date.now()}`);await qe(r,{recursive:!0,mode:448}),await dt(a,{recursive:!0,force:!0}),await dt(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await qe(a,{recursive:!0,mode:448}),await gs(n,a),await ls(Q(a,Lt),s,{mode:384}),await ki(a,o,s),o}catch(u){throw await dt(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function bi(n,e){let t=ai("sha256");t.update("qoder-worker-runtime-v1\0");let s=await ys(Q(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await fi(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function gs(n,e){let t=await li(n,{withFileTypes:!0});await qe(e,{recursive:!0,mode:448});for(let s of t){let r=Q(n,s.name),o=Q(e,s.name);if(s.isDirectory()){await gs(r,o);continue}if(s.isSymbolicLink()){await qe(_e(o),{recursive:!0,mode:448}),await gi(await pi(r),o);continue}if(!s.isFile())continue;let i=await _i(r);await qe(_e(o),{recursive:!0,mode:448}),await ls(o,await ds(r),{mode:i}),process.platform!=="win32"&&await ci(o,i)}}async function _i(n){let e=((await di(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=ps(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function ki(n,e,t){try{await mi(n,e)}catch(s){if(await hs(Q(e,Lt))===t){await dt(n,{recursive:!0,force:!0});return}throw s}}async function hs(n){let e=await ys(n);return e?e.toString("utf8"):null}async function ys(n){try{return await ds(n)}catch{return null}}function Ri(){let n=Ei(yi().username||process.env.USER||process.env.USERNAME||"user");return Q(hi(),`qoder-sdk-worker-runtime-${n}`)}function Ei(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Pi="QODER_WORKER_CWD";function lt(n,e){return{env:{...e.env,[Pi]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as $t}from"node:fs";import{dirname as Ti,join as ae}from"node:path";import{fileURLToPath as Ci}from"node:url";var Mi=Ci(import.meta.url),zt=Ti(Mi);function Y(n){if(n)return n;let e=[];for(let t of Oi())e.push(ae(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),ae(t,"dist","_worker","qoder-worker-runtime.mjs"),ae(t,"_worker","qoder-worker-runtime.obf.mjs"),ae(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if($t(t))return t;return e[0]??ae(zt,"..","_worker","qoder-worker-runtime.obf.mjs")}function Ss(n){let e=Y(n);if($t(e))return!0;let t=Kt(e);return t!==null&&$t(t)}function Oi(){let n=[ae(zt,".."),ae(zt,"..","..")];return[...new Set(n)]}var ws=8192,ue=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},Re=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new Qt(at(this.options,e))}},Qt=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=Y(this.options.pathToQoderWorkerRuntime),s;try{s=await ke(t,{diagnostics:this.diagnostics})}catch(a){throw new ue(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!Ai(r))throw new ue(`Qoder worker runtime not found: ${r}`);let o=this.options.cwd??process.cwd(),i=lt(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${ut(e.args)}`),this.worker=new Ii(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===oe&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
4
+ `;if(ve(t,z,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new V(z,"SDK process output");e.pipe(t);let s=ui({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let s=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!s)return;let r=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??et,i=setTimeout(()=>{if(r()){s("SIGTERM");let a=setTimeout(()=>{r()&&s("SIGKILL")},Jn);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>ls&&(this.stderrTail=this.stderrTail.slice(-ls))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new D(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==ae){if(e!==0&&e!==null)return new D(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new D(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{e.off("exit",r);let a=this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??W();if(it(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function ci(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ue=ci();function ds(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function ct(n,e){return n.create(e)}import{existsSync as xi}from"fs";import{createInterface as Ni}from"readline";import{Worker as ji}from"worker_threads";import{createHash as li}from"node:crypto";import{existsSync as di}from"node:fs";import{chmod as pi,lstat as mi,mkdir as Fe,readFile as ps,readdir as fi,readlink as gi,rename as hi,rm as lt,stat as yi,symlink as Si,writeFile as ms}from"node:fs/promises";import{tmpdir as wi,userInfo as vi}from"node:os";import{basename as fs,dirname as _e,join as B,relative as bi}from"node:path";var _i="QODER_WORKER_RUNTIME_ASSET_ROOT",gs=/(^|[\\/])app\.asar([\\/]|$)/,Lt=".qoder-worker-runtime-ready";function hs(n){return gs.test(n)}function Kt(n){return hs(n)?n.replace(gs,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ke(n,e={}){let t=Kt(n);if(!e.forceMaterialize&&t){let u=_e(t);if(di(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Ut(t,u,!1,_e(n))}if(!(e.forceMaterialize||hs(n))){let u=_e(n);return Ut(n,u,!1)}let r=_e(n),o=await ki(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=bi(r,n)||fs(n),a=B(o,i);return Ut(a,o,!0,r)}function Ut(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[_i]:e}}}async function ki(n,e,t){let s=await Ri(n,e),r=t.cacheDir??Ti(),o=B(r,s),i=B(o,Lt);if(await Ss(i)===s)return o;let a=B(r,`.setup-${s}-${process.pid}-${Date.now()}`);await Fe(r,{recursive:!0,mode:448}),await lt(a,{recursive:!0,force:!0}),await lt(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await Fe(a,{recursive:!0,mode:448}),await ys(n,a),await ms(B(a,Lt),s,{mode:384}),await Pi(a,o,s),o}catch(u){throw await lt(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Ri(n,e){let t=li("sha256");t.update("qoder-worker-runtime-v1\0");let s=await ws(B(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await yi(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ys(n,e){let t=await fi(n,{withFileTypes:!0});await Fe(e,{recursive:!0,mode:448});for(let s of t){let r=B(n,s.name),o=B(e,s.name);if(s.isDirectory()){await ys(r,o);continue}if(s.isSymbolicLink()){await Fe(_e(o),{recursive:!0,mode:448}),await Si(await gi(r),o);continue}if(!s.isFile())continue;let i=await Ei(r);await Fe(_e(o),{recursive:!0,mode:448}),await ms(o,await ps(r),{mode:i}),process.platform!=="win32"&&await pi(o,i)}}async function Ei(n){let e=((await mi(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=fs(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Pi(n,e,t){try{await hi(n,e)}catch(s){if(await Ss(B(e,Lt))===t){await lt(n,{recursive:!0,force:!0});return}throw s}}async function Ss(n){let e=await ws(n);return e?e.toString("utf8"):null}async function ws(n){try{return await ps(n)}catch{return null}}function Ti(){let n=Ci(vi().username||process.env.USER||process.env.USERNAME||"user");return B(wi(),`qoder-sdk-worker-runtime-${n}`)}function Ci(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Mi="QODER_WORKER_CWD";function dt(n,e){return{env:{...e.env,[Mi]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as $t}from"node:fs";import{dirname as Oi,join as ce}from"node:path";import{fileURLToPath as Ai}from"node:url";var Ii=Ai(import.meta.url),zt=Oi(Ii);function Y(n){if(n)return n;let e=[];for(let t of Di())e.push(ce(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),ce(t,"dist","_worker","qoder-worker-runtime.mjs"),ce(t,"_worker","qoder-worker-runtime.obf.mjs"),ce(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if($t(t))return t;return e[0]??ce(zt,"..","_worker","qoder-worker-runtime.obf.mjs")}function vs(n){let e=Y(n);if($t(e))return!0;let t=Kt(e);return t!==null&&$t(t)}function Di(){let n=[ce(zt,".."),ce(zt,"..","..")];return[...new Set(n)]}var bs=8192,le=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},Re=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new Bt(at(this.options,e))}},Bt=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=Y(this.options.pathToQoderWorkerRuntime),s;try{s=await ke(t,{diagnostics:this.diagnostics})}catch(a){throw new le(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!xi(r))throw new le(`Qoder worker runtime not found: ${r}`);let o=this.options.cwd??process.cwd(),i=dt(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${ut(e.args)}`),this.worker=new ji(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===ae&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let c=u.trim();c&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${c}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
5
5
  `)?e:e+`
6
- `;if(ve(t,z,"SDK Worker input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=new V(z,"SDK Worker output");e.pipe(t);let s=Di({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForWorkerExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??et;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>ws&&(this.stderrTail=this.stderrTail.slice(-ws))}createWorkerError(e){return new ue(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===oe))return new ue(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,s)=>{let r=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,s(a)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};var pt=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as xi,mkdirSync as Ni}from"fs";import{dirname as ji}from"path";var qi="QODER_AGENT_SDK_DEBUG";function Fi(n){return n.debugFile?!0:n.debug===!0||Li(process.env[qi])}function Ui(n){if(n.debugFile)return n.debugFile}function Li(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var mt=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=Fi(e),this.debugFile=Ui(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{Ni(ji(e),{recursive:!0}),xi(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(ve(t,z,"SDK Worker input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.worker){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.worker?.stdout;if(!e)return;let t=new V(z,"SDK Worker output");e.pipe(t);let s=Ni({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForWorkerExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.launchOptionsBuilder.cleanupGeneratedSettings(),this.cleanupAbortListener(),this.cleanupAuthPayload().catch(()=>{});let e=this.worker;if(!e)return;this.endInput();let t=this.options.closeGraceMs??et;this.closeTimer=setTimeout(()=>{e.terminate().catch(()=>{})},t),this.closeTimer.unref?.(),e.once("exit",()=>{this.clearCloseTimer()})}get threadId(){return this.worker?.threadId}writeReadyLine(e){let t=this.worker?.stdin;!t||t.destroyed||t.writableEnded||t.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}endReadyInput(){let e=this.worker?.stdin;!e||e.destroyed||e.writableEnded||e.end()}destroyWorkerStreams(e){e?.stdin?.destroy(),e?.stdout?.destroy(),e?.stderr?.destroy()}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>bs&&(this.stderrTail=this.stderrTail.slice(-bs))}createWorkerError(e){return new le(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===ae))return new le(`Qoder worker runtime exited with code ${e}`,{exitCode:e,stderr:this.getStderrTail()})}getStderrTail(){return this.stderrTail.trim()||void 0}recordWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker exited: code=${e}, closed=${this.closed}, ready=${this.ready}, stderrTail=${t}`)}recordSuppressedWorkerExit(e){let t=this.formatStderrTailForDiagnostics();this.diagnostics?.record(`[WorkerTransport] Worker non-zero exit suppressed after close: code=${e}, stderrTail=${t}`)}formatStderrTailForDiagnostics(){let e=this.getStderrTail();return e?JSON.stringify(e):"<empty>"}async waitForWorkerExit(){if(this.closed)return;if(this.workerExitError)throw this.workerExitError;let e=this.worker;if(e){if(this.observedExitCode!==null){if(this.closed)return;let t=this.createWorkerExitError(this.observedExitCode);if(t)throw this.workerExitError=t,t;return}await new Promise((t,s)=>{let r=i=>{if(e.off("error",o),this.closed){t();return}let a=this.createWorkerExitError(i);a?(this.workerExitError=a,s(a)):t()},o=i=>{if(e.off("exit",r),this.closed){t();return}let a=this.createWorkerError(i);this.workerExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}clearCloseTimer(){this.closeTimer&&(clearTimeout(this.closeTimer),this.closeTimer=null)}cleanupAbortListener(){this.abortSignal&&this.abortListener&&this.abortSignal.removeEventListener("abort",this.abortListener),this.abortSignal=void 0,this.abortListener=void 0}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};var pt=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;cleanup;cleanupPromise;async initialize(){try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){this.closed||(this.closed=!0,this.pending.length=0,this.transport?this.transport.close():this.bootstrapPromise&&this.bootstrapPromise.catch(()=>this.runCleanup()))}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{await this.initialize(),yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,this.closed&&(e.transport.close(),this.runCleanup()),e.transport))),this.bootstrapPromise}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as qi,mkdirSync as Fi}from"fs";import{dirname as Ui}from"path";var Li="QODER_AGENT_SDK_DEBUG";function Ki(n){return n.debugFile?!0:n.debug===!0||zi(process.env[Li])}function $i(n){if(n.debugFile)return n.debugFile}function zi(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var mt=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=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{Fi(Ui(e),{recursive:!0}),qi(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 Xi}from"node:crypto";var X=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var F=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},Fe=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},G=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},ce=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var Bt="1.3.0";var Ki=new Set(["default","acceptEdits","auto","bypassPermissions"]);function Ue(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Ki.has(n))return n;if(n==="plan")throw new Error('permissionMode="plan" is not supported for daemon Queries; use planMode or setPlanMode() instead.');let e=typeof n=="string"?JSON.stringify(n):n===null?"null":typeof n;throw new Error(`permissionMode=${e} is not supported for daemon Queries; use default, acceptEdits, auto, or bypassPermissions.`)}function vs(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 bs(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 _s(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 $i}from"crypto";function Es(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 zi=500,Qi=1024*1024,Bi=6e4,ft=class{constructor(e){this.options=e}states=new Map;enqueue(e){let t=Ji(e.filePath),s=Hi(e.entries),r=Rs(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+=Wi(s),(this.options.flushMode==="eager"||o.entries.length>=zi||o.bytes>=Qi)&&this.drain(o)}async flush(){for(let e of this.states.values())this.drain(e);await Promise.all([...this.states.values()].map(e=>e.tail))}drain(e){if(e.entries.length===0)return;let t=e.entries;e.entries=[],e.bytes=0,e.tail=e.tail.then(async()=>{try{await Vi(this.options.store,e.key,t,this.options.appendTimeoutMs??Bi)}catch(s){this.options.diagnostics?.record(`[SessionStore] append failed for ${Rs(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:$i(),session_id:e.key.sessionId})}})}};function Ji(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:ks(o[1])};let i=ks(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 Gi(c),{projectKey:r,sessionId:i,subpath:c}}function Hi(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 ks(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 Gi(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 Rs(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function Wi(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function Vi(n,e,t,s){await Yi(n.append({...e},structuredClone(t)),s)}async function Yi(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Jt(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Jt=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Ps(){return Math.random().toString(36).substring(2,15)}function Ts(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 Cs(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function Ms(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function Os(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function As(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function Ds(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function Ee(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function Is(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function xs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function Ns(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function js(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function qs(n){return typeof n=="object"&&n!==null&&n.type==="result"}var Zi="<synthetic>";function ea(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==Zi?n:{...n,isApiErrorMessage:!0}}var Le=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;initResponse;initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;constructor(e,t,s,r,o,i,a,u,c,d,m,p,l,g,h,f,y,b="batched",S,T,C,ye){if(this.transport=e,this.isSingleTurn=t,this.canUseTool=s,this.hooks=r??{},this.abortController=o,this.sdkMcpServers=i??new Map,this.sdkMcpTransports=p??new Map,this.pendingMcpResponses=l??new Map,this.sdkMcpToolOverrides=S??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=d,this.fetchJobToken=g,this.fetchServiceAccountToken=T,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=h,this.resolveModelTimeoutMs=f??500,this.memoryCallbacks=C,this.skillEvolutionCallbacks=ye,this.inputStream=new X(()=>{this.close().catch(()=>{})}),y&&(this.transcriptMirrorBatcher=new ft({store:y,flushMode:b,diagnostics:c,onMirrorError:_=>this.inputStream.enqueue(_)})),this.readLoopPromise=this.readMessages().catch(_=>{this.inputStream.error(_)}),this.initializationPromise=this.initConfig.attachedInitialization?this.initConfig.attachedInitialization.then(_=>(this.initResponse=_,this.cliCapabilities=new Set(_.capabilities??[]),_)):this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let _=this.abortController.signal;_.aborted?this.close().catch(()=>{}):_.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(Es(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(Os(t)){this.handleControlResponse(t);continue}if(As(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(Ds(t)){this.handleControlCancelRequest(t);continue}if(Is(t)||xs(t)||Ns(t)||js(t))continue;if(qs(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=ea(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let r=s;this.validateProtocolHandshake(r),this.cliCapabilities=new Set(r.capabilities??[])}catch(r){throw this.inputStream.error(r),r}this.dispatchMemoryCallbacks(s),this.dispatchSkillEvolutionCallbacks(s),this.notifyAuthExpiredIfNeeded(s),this.inputStream.enqueue(s)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):e=t}finally{await this.transcriptMirrorBatcher?.flush();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}isStructuredResultExit(e){if(!this.pendingErrorResultExit||e===null||typeof e!="object")return!1;let t=e;return t.exitCode===1&&(t.signal===void 0||t.signal===null)}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let s=e.type==="auth_status"&&!!e.error,r=e.type==="assistant"&&e.error==="authentication_failed";!s&&!r||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(s=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",s)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}dispatchSkillEvolutionCallbacks(e){if(!(e.type!=="system"||e.subtype!=="skill_evolution"||!this.skillEvolutionCallbacks))try{let t=this.skillEvolutionCallbacks.onResult?.(e.result);t!==void 0&&Promise.resolve(t).catch(s=>this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",s))}catch(t){this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",t)}}flushBeforeEndInput(){return this.endInputFlushPromise||(this.endInputFlushPromise=this.performFlushBeforeEndInput()),this.endInputFlushPromise}async performFlushBeforeEndInput(){try{let e=[];this.initConfig.memory!==void 0&&e.push(this.flushMemory()),this.initConfig.evolution?.skill!==void 0&&e.push(this.flushSkillEvolution());let s=(await Promise.allSettled(e)).find(r=>r.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new F;let s=Ps(),r=Ts(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Ee(r.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let d=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
9
- `)}catch(g){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",g)}},p=()=>{d&&(clearTimeout(d),d=null),t?.signal?.removeEventListener("abort",l)},l=()=>{this.pendingRequests.delete(s)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${s} subtype=${i}`),m(),c(new F))};this.pendingRequests.set(s,{resolve:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(g)},reject:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,g),c(g)}}),t?.signal?.addEventListener("abort",l,{once:!0}),o>0&&Number.isFinite(o)&&(d=setTimeout(()=>{this.pendingRequests.has(s)&&(this.pendingRequests.delete(s),p(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o}`),m(),c(new Error(`Control request "${Ee(r.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(r)+`
10
- `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(g){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,g),c(g)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)Ee(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=Ee(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=Cs(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}=oa(i),c=Ms(t,a,u);this.transport.write(JSON.stringify(c)+`
12
- `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new F}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=Bt;if(!t){this.diagnostics?.record(`[QueryRunner] CLI did not announce protocol_version. This SDK was built for ${s}. Consider upgrading qodercli for the version handshake.`);return}let r=Fs(t),o=Fs(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new G(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new F;return new Promise((s,r)=>{let o=()=>{r(new F)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=Ee(s),o=s;switch(r){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let d=c.expiresAt;if(d!==void 0&&(!Number.isFinite(d)||d<1e12))throw new Error("job_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record(`[QueryRunner] fetch_job_token fulfilled: reason=${i}`),{token:c.token,...d!==void 0?{expires_at:d}:{}}}case"fetch_service_account_token":{if(!this.fetchServiceAccountToken)throw new Error("service_account_token_unavailable: No fetchServiceAccountToken callback configured");let i=await this.awaitAbortable(this.fetchServiceAccountToken(),t);if(!i?.token)throw new Error("service_account_token_unavailable: Host did not provide a Service Account token");let a=i.expiresAt;if(a!==void 0&&(!Number.isFinite(a)||a<1e12))throw new Error("service_account_token_unavailable: expiresAt must be a Unix timestamp in milliseconds");return this.diagnostics?.record("[QueryRunner] fetch_service_account_token fulfilled"),{token:i.token,...a!==void 0?{expires_at:a}:{}}}case"can_use_tool":{let i=o.tool_name,a=o.input??{};if(!this.canUseTool)throw new Error("canUseTool callback is not provided.");let u=o.tool_use_id,c=o.permission_suggestions??o.suggestions,d=o.blocked_path,m=o.decision_reason,p=o.title,l=o.display_name,g=o.description,h=o.agent_id,f=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:d,decisionReason:m,title:p,displayName:l,description:g,toolUseID:u,agentID:h}),t);if(f.behavior==="deny"&&!f.message)throw new Error("Permission deny result must include a message.");return f.behavior==="allow"?{...f,updatedInput:f.updatedInput??a,toolUseID:u}:{...f,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"skill_evolution_should_review":{let i=o.callbackId;if(!i)throw new Error("Skill evolution shouldReview request missing callbackId");let a=this.skillEvolutionCallbacks?.shouldReviewCallbacks.get(i);if(!a)throw new Error(`Unknown skill evolution shouldReview callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Skill evolution shouldReview callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(vs(i,a,u,this.pendingMcpResponses),t)}}case"elicitation":case"elicitation_response":return this.onElicitation?await this.awaitAbortable(this.onElicitation({serverName:o.mcp_server_name??"",message:o.message??o.prompt??"",mode:o.mode,url:o.url,elicitationId:o.elicitation_id,requestedSchema:o.requested_schema,title:o.title,displayName:o.display_name,description:o.description},{signal:t}),t):{action:"cancel"};case"get_model_policy":{if(!this.resolveModel)return{type:"get_model_policy"};let i={purpose:o.purpose,sessionId:o.sessionId,turnIndex:o.turnIndex,agentId:o.agentId,agentType:o.agentType,resolvedModel:o.resolvedModel,availableModels:o.models??[]},a=this.resolveModelTimeoutMs,u=Promise.resolve(this.resolveModel(i)),c,d=new Promise((f,y)=>{c=setTimeout(()=>{y(new Fe(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,d]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},l=m?.model;if(typeof l=="string")p.model=l;else if(l!==void 0){let{model:f,...y}=l;p.model=f,p.custom_model={...y,style:y.style??"openai"}}let g=m?.taskId?.trim();g&&(p.task_id=g);let h=m?.subTask?.trim();return h&&(p.sub_task=h),p}default:throw new Error(`Unhandled control request subtype: ${r??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let d=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(d,c),d});u.length!==0&&i.push({matcher:a.matcher,hookCallbackIds:u,timeout:a.timeout})}i.length>0&&(t[r]=i)}if(Object.keys(t).length>0&&(e.hooks=t),this.initConfig.systemPrompt!==void 0&&(e.systemPrompt=this.initConfig.systemPrompt),this.initConfig.appendSystemPrompt!==void 0&&(e.appendSystemPrompt=this.initConfig.appendSystemPrompt),this.initConfig.modelRequestPatches!==void 0&&(e.modelRequestPatches=this.initConfig.modelRequestPatches),this.initConfig.agents&&(e.agents=this.initConfig.agents),this.initConfig.skills!==void 0&&(e.skills=this.initConfig.skills),this.initConfig.promptSuggestions!==void 0&&(e.promptSuggestions=this.initConfig.promptSuggestions),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let r=Ue(this.initConfig.permissionMode);r!==void 0&&(e.permissionMode=r)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r,this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new ce(n.PLAN_MODE_CAPABILITY);let r={subtype:"set_plan_mode",active:this.initConfig.planMode};await this.request(r)}return this.initResponse}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}async streamInput(e){(async()=>{try{await this.initialize();let t=0;for await(let s of e){if(this.closed)break;t+=1;let o=Object.prototype.hasOwnProperty.call(s,"custom_context")?s.custom_context:this.initConfig.customContext,i=typeof s.uuid=="string"&&s.uuid.trim().length>0?s.uuid:Xi(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
13
- `),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new ce(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?Ue(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=ra(e?.usage),s=sa(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new ce("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Jn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(t){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,s]of this.sdkMcpTransports){try{await s.close()}catch(r){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,r)}_s(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.transcriptMirrorBatcher?.flush()}async[Symbol.asyncDispose](){await this.close()}};function Us(n){return new Le(n.transport,!1,n.canUseTool,void 0,void 0,void 0,{attachedInitialization:n.initialization,independentPlanModeControls:!0},n.onElicitation)}function de(n){return typeof n=="object"&&n!==null}function Ht(n){return typeof n=="number"&&Number.isFinite(n)}function Gt(n){return Object.keys(n).length>0}function B(n,e,t){let s=e[t];Ht(s)&&(n[t]=s)}function Pe(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function gt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function Ls(n){if(!de(n)||Array.isArray(n))return;let e={};return B(e,n,"total"),B(e,n,"used"),B(e,n,"remaining"),B(e,n,"percentage"),Pe(e,n,"unit"),Gt(e)?e:void 0}function ta(n){if(!de(n)||Array.isArray(n))return;let e=Ls(n)??{};return Pe(e,n,"detailUrl"),Gt(e)?e:void 0}function na(n){if(!de(n)||Array.isArray(n))return;let e={};return B(e,n,"used"),B(e,n,"cap"),B(e,n,"remaining"),B(e,n,"percentage"),gt(e,n,"available"),Pe(e,n,"unit"),Gt(e)?e:void 0}function sa(n){if(!de(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Ht(e)||e<0||!de(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!de(o)||Array.isArray(o))continue;let i=o.credits;Ht(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function ra(n){if(!de(n)||Array.isArray(n))return null;let e={};Pe(e,n,"userId"),Pe(e,n,"userType"),B(e,n,"totalUsagePercentage"),gt(e,n,"isHighestTier"),B(e,n,"expiresAt"),Pe(e,n,"upgradeUrl"),gt(e,n,"isQuotaExceeded"),gt(e,n,"isPlanQuotaProrated");let t=Ls(n.userQuota);t&&(e.userQuota=t);let s=ta(n.addOnQuota);s&&(e.addOnQuota=s);let r=na(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function oa(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 Fs(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var ht=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as Ks}from"crypto";var ia="QODER_CLOUD_AGENT_API_BASE",aa="https://api.qoder.com/api/v1/cloud",Z={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},ua=1024,$s=1*1024*1024,zs=4*1024*1024,ca=8*1024,Vt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},yt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Yt=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},da=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Hs(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!da.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new yt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Te(t)&&Wt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Te(s)&&Wt(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Te(s)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let r=!!s&&Te(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!Wt(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Te(n){return"id"in n&&n.id!==void 0}function Wt(n){return"create"in n&&n.create!==void 0}function Gs(n){return new Xt(n)}var Xt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Ea();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=la(e.options.auth,e.options.env),this.apiBase=pa(),this.inputStream=new X(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(ka(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=_a(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:Z.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===Z.userMessage)?.turnId)}}finally{this.activeInputStreams=Math.max(0,this.activeInputStreams-1),this.finishIfIdle()}})().catch(t=>{this.closed||this.inputStream.error(t)})}async interrupt(){await this.sessionReadyPromise,await this.postSessionEvents([{type:Z.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Te(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...fa(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(Te(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:ma(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 Ra(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 Bs(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>$s&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${$s} 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:ya(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>zs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${zs} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(o),t.dataBytes+=o.length;break}}handleSseEvent(e){if(this.closed)return;let t=U(e.data,"type")??e.event,s=U(e.data,"turn_id"),r={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??Ks(),session_id:this.sessionId??U(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(r),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case Z.agentMessage:{let s=wa(Ke(e.data,"content"));s&&this.assistantTextParts.push(s);return}case Z.modelRequestEnd:this.captureUsage(e.data);return;case Z.idle:this.idleSeen=!0,this.finishIfIdle();return;case Z.error:this.emitErrorResult(e),this.finish();return;case Z.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=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>=ua&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:s}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(U(e.data,"error")??U(St(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:Ks(),session_id:this.sessionId??""}}async postSessionEvents(e){let t=this.sessionId??(await this.sessionReadyPromise).sessionId,s=await this.requestJson(`/sessions/${encodeURIComponent(t)}/events`,{method:"POST",body:{events:e}});return ga(s)}captureUsage(e){let t=St(e,"usage");if(!t)return;this.latestUsage=va(this.latestUsage,t);let s=x(e,"total_cost_usd")??x(e,"cost_usd")??x(t,"total_cost_usd")??x(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let r=U(e,"model")??U(t,"model");if(r){let o=this.latestModelUsage[r]?.costUSD??0;this.latestModelUsage[r]=ba(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 Bs(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 la(n,e){if(n?.type!=="accessToken")throw new yt;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new Vt(t);return s}function pa(){return process.env[ia]?.replace(/\/+$/,"")??aa}function ma(n){return Zt({name:n.name,model:n.model,system:n.system,description:n.description,tools:n.tools,mcp_servers:n.mcp_servers,skills:n.skills,metadata:n.metadata})}function fa(n){return Zt({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>Zt({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function Zt(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function Qs(n,e){let t=U(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function ga(n){let e=Sa(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:U(t,"id"),turnId:U(t,"turn_id"),type:U(t,"type")}]):[]}async function Bs(n){let e=await ha(n,ca);return new Yt(n.status,e||n.statusText||"unknown error")}async function ha(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 ya(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function St(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 U(n,e){let t=Ke(n,e);return typeof t=="string"?t:void 0}function x(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 wa(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Ws(t)?t.text:"").filter(Boolean).join("")||void 0}function va(n,e){let t=St(e,"cache_creation"),s=St(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:x(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:x(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:x(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:x(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:x(e,"input_tokens")??n.input_tokens,output_tokens:x(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:x(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:x(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function ba(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 _a(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ws(t)?t.text:JSON.stringify(t)).join(`
16
- `):JSON.stringify(e)}function Ws(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function ka(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 Ra(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function Ea(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as Ia,chmod as tr,cp as xa,mkdtemp as Na,mkdir as nr,realpath as sr,rm as Xs,writeFile as ja}from"fs/promises";import{homedir as qa,tmpdir as Fa}from"os";import{dirname as Ua,isAbsolute as rr,join as le,relative as La,resolve as en,sep as Ka}from"path";import{homedir as Pa}from"os";import{join as Ys}from"path";var Ta=v.configDirName,Ca=v.cliHomeEnv,Ma=v.configDirEnv,Vs=200;function Oa(){return process.env[Ca]||Pa()}function Aa(){let n=process.env[Ma];return n||Ys(Oa(),Ta)}function Ce(){return Ys(Aa(),"projects")}function Da(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function N(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Vs)return e;let t=Math.abs(Da(n)).toString(36);return`${e.slice(0,Vs)}-${t}`}var $a=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,za=6e4;async function wt(n){if(n.resume===void 0&&!n.continue)return;let e=N(await Ja(n.cwd)),t=n.loadTimeoutMs??za,s=n.resume!==void 0?n.resume:await Ha(n.store,e,t);if(s===void 0||!$a.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 tn(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Wa(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 Na(le(Fa(),"qoder-session-store-")),await tr(u,448),u=await sr(u),await Ba(Qa(n.env),u);let c=le(u,"projects",e),d=le(c,s);await nr(c,{recursive:!0,mode:448}),await er(le(c,`${s}.jsonl`),o);for(let{subpath:p,entries:l}of a){let g=Va(d,`${p}.jsonl`),h=l.filter(y=>y.type==="agent_metadata"),f=l.filter(y=>y.type!=="agent_metadata");if(f.length>0&&await er(g,f),h.length>0){let y={...h.at(-1)};delete y.type,await or(g.slice(0,-6)+".meta.json",JSON.stringify(y))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await Xs(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await Xs(u,{recursive:!0,force:!0}),c}}function Qa(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??qa();return en(n?.[v.configDirEnv]??process.env[v.configDirEnv]??le(e,v.configDirName))}async function Ba(n,e){for(let t of[".auth","oauth_creds.json"]){let s=le(n,t);try{await Ia(s),await xa(s,le(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Ja(n){let e=en(n??process.cwd());try{return await sr(e)}catch{return e}}async function Ha(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await tn(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((r,o)=>o.mtime-r.mtime)[0]?.sessionId}async function Zs(n,e,t){let s=await tn(n.load({...e}),t,"load");if(!(s===null||s.length===0)){if(!Array.isArray(s))throw new Error("SessionStore load() must return an array or null");return s.map((r,o)=>Ga(r,o))}}function Ga(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 Wa(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||rr(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Va(n,e){let t=en(n,e),s=La(n,t);if(s===""||s===".."||s.startsWith(`..${Ka}`)||rr(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function er(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
17
- `);await or(n,t?`${t}
18
- `:"")}async function or(n,e){await nr(Ua(n),{recursive:!0,mode:448}),await ja(n,e,{encoding:"utf8",mode:384}),await tr(n,384)}async function tn(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((r,o)=>{s=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var Ya=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function Xa(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return Ya.test(e)}function Me(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?Xa(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 ir from"node:path";function Oe(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function $e(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function Za(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(Oe(s.id,`options.memory.generation.roots[${t}].id`),Oe(s.path,`options.memory.generation.roots[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${s.id}"`);if(e.add(s.id),s.access!==void 0&&s.access!=="read"&&s.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(s.indexFile!==void 0){Oe(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let r=s.indexFile.replaceAll("\\","/");if(ir.posix.isAbsolute(r)||ir.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function eu(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(Oe(s.id,`options.memory.consumption.files[${t}].id`),Oe(s.path,`options.memory.consumption.files[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${s.id}"`);if(e.add(s.id),s.required!==void 0&&typeof s.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function ar(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(n))throw new TypeError("options.memory must be an object");if(Object.keys(n).length===0)return{};if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(n.projectScope!==void 0&&typeof n.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(n.userScope!==void 0&&typeof n.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(n.mode==="native"){if(n.projectScope===!1&&n.userScope===!1)throw new TypeError("options.memory native mode requires at least one enabled scope; use memory: {} to disable SDK memory");let i=Object.keys(n.generation??{}),a=Object.keys(n.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return $e(n.generation?.onResult,"options.memory.generation.onResult"),$e(n.consumption?.onResult,"options.memory.consumption.onResult"),{config:{requester:"sdk",mode:"native",...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{}},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:n.generation?.onResult,onConsumptionResult:n.consumption?.onResult}}}let t,s=n.generation;if(s!==void 0){if(!s||typeof s!="object")throw new TypeError("options.memory.generation must be an object");if(s.enabled!==void 0&&typeof s.enabled!="boolean")throw new TypeError("options.memory.generation.enabled must be a boolean");Za(s.roots),s.prompt!==void 0&&Oe(s.prompt,"options.memory.generation.prompt"),$e(s.onResult,"options.memory.generation.onResult");let i;if(s.turnComplete!==void 0){let a=s.turnComplete;if(!a||typeof a!="object")throw new TypeError("options.memory.generation.turnComplete must be an object");if(a.enabled!==void 0&&typeof a.enabled!="boolean")throw new TypeError("options.memory.generation.turnComplete.enabled must be a boolean");if($e(a.shouldGenerate,"options.memory.generation.turnComplete.shouldGenerate"),a.timeoutMs!==void 0&&(!Number.isFinite(a.timeoutMs)||a.timeoutMs<=0))throw new TypeError("options.memory.generation.turnComplete.timeoutMs must be a positive finite number");if(a.onGateError!==void 0&&a.onGateError!=="skip"&&a.onGateError!=="report_failed")throw new TypeError('options.memory.generation.turnComplete.onGateError must be "skip" or "report_failed"');let u=a.shouldGenerate?"memory_should_generate_0":void 0;u&&a.shouldGenerate&&e.set(u,a.shouldGenerate),i={enabled:a.enabled??!0,shouldGenerateCallbackId:u,timeoutMs:a.timeoutMs,onGateError:a.onGateError}}if(s.turnComplete?.enabled===!0&&s.enabled===!1)throw new TypeError("options.memory.generation.turnComplete cannot be enabled when generation.enabled is false");t={enabled:s.enabled??!0,roots:s.roots?.map(a=>({...a})),prompt:s.prompt,turnComplete:i}}let r,o=n.consumption;if(o!==void 0){if(!o||typeof o!="object")throw new TypeError("options.memory.consumption must be an object");if(o.enabled!==void 0&&typeof o.enabled!="boolean")throw new TypeError("options.memory.consumption.enabled must be a boolean");if(eu(o.files),o.maxTokens!==void 0&&(!Number.isInteger(o.maxTokens)||o.maxTokens<=0))throw new TypeError("options.memory.consumption.maxTokens must be a positive integer");if(o.overflow!==void 0&&o.overflow!=="truncate"&&o.overflow!=="fail_query")throw new TypeError('options.memory.consumption.overflow must be "truncate" or "fail_query"');if(o.failureMode!==void 0&&o.failureMode!=="best_effort"&&o.failureMode!=="fail_query")throw new TypeError('options.memory.consumption.failureMode must be "best_effort" or "fail_query"');$e(o.onResult,"options.memory.consumption.onResult"),r={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:n.mode,...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{},generation:t,consumption:r},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:o?.onResult}}}var vt=10;function tu(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function bt(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function ur(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 nu(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&&tu(n.prompt,"options.evolution.skill.generation.prompt"),n.maxSuggestions!==void 0&&(!Number.isInteger(n.maxSuggestions)||n.maxSuggestions<1||n.maxSuggestions>10))throw new TypeError("options.evolution.skill.generation.maxSuggestions must be an integer between 1 and 10");bt(n.onResult,"options.evolution.skill.generation.onResult");let t;if(n.turnComplete!==void 0){if(!n.turnComplete||typeof n.turnComplete!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(n.turnComplete.enabled!==void 0&&typeof n.turnComplete.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.turnComplete.enabled must be a boolean");let s=ur(n.turnComplete.reviewThreshold);if(bt(n.turnComplete.shouldReview,"options.evolution.skill.generation.turnComplete.shouldReview"),n.turnComplete.timeoutMs!==void 0&&(!Number.isFinite(n.turnComplete.timeoutMs)||n.turnComplete.timeoutMs<=0))throw new TypeError("options.evolution.skill.generation.turnComplete.timeoutMs must be a positive finite number");if(n.turnComplete.onGateError!==void 0&&n.turnComplete.onGateError!=="skip"&&n.turnComplete.onGateError!=="report_failed")throw new TypeError('options.evolution.skill.generation.turnComplete.onGateError must be "skip" or "report_failed"');let r=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;r&&e.shouldReviewCallbacks.set(r,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:r,timeoutMs:n.turnComplete.timeoutMs,onGateError:n.turnComplete.onGateError}}if(n.turnComplete!==void 0&&t?.enabled===!0&&n.enabled===!1)throw new TypeError("options.evolution.skill.generation.turnComplete cannot be enabled when generation.enabled is false");return{config:{enabled:n.enabled??!0,prompt:n.prompt,maxSuggestions:n.maxSuggestions,turnComplete:t},callbacks:{...e,onResult:n.onResult}}}function cr(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=ur(r?.reviewThreshold);return e?.enabled===!1?(bt(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(bt(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...o===void 0?{}:{generation:{turnComplete:{reviewThreshold:o}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=nu(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as Wu}from"node:child_process";import{isDeepStrictEqual as Vu}from"node:util";import{createInterface as du}from"node:readline";var w=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function rn(n){if(n.trim().length===0)throw new w("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new w("daemon protocol line must contain valid JSON")}let t=R(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new w("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":su(t);break;case"control_response":ru(t);break;case"event":D(t,["type","event","session_id","data"],"event frame"),E(t,"event"),kt(t),R(t.data,"event data");break;case"keep_alive":D(t,["type"],"keep_alive frame");break;case"session_input":case"session_output":throw new w(`${String(t.type)} is not supported on the v2 wire`);default:if(E(t,"type"),!iu(t.type))throw new w(`unknown daemon message type: ${String(t.type)}`);ou(t),kt(t)}return t}function dr(n){let e=JSON.stringify(n);return rn(e),e}function lr(n,e){let t=e.response.response;switch(n){case"initialize":{_t(e,"initialize response");let s=R(t,"initialize response");if(D(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==2)throw new w(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return E(s,"daemon_version"),uu(s,"capabilities"),s}case"open_session":{let s=ze(e,"open_session response");return sn(t,"open_session"),{session_id:s}}case"list_sessions":{_t(e,"list_sessions response");let s=R(t,"list_sessions response");D(s,["sessions"],"list_sessions response");let r=s.sessions;if(!Array.isArray(r))throw new w("sessions must be an array");for(let[o,i]of r.entries())nn(R(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{ze(e,"rename_session response");let s=R(t,"rename_session response");return D(s,["session"],"rename_session response"),nn(R(s.session,"rename_session session"),"rename_session session"),s}case"subscribe_session":{let s=ze(e,"subscribe_session response"),r=R(t,"subscribe_session response");D(r,["initialization_result"],"subscribe_session response");let o=R(r.initialization_result,"initialization_result");return{session_id:s,initialization_result:o}}case"enable_remote_control":{_t(e,"enable_remote_control response");let s=R(t,"enable_remote_control response");return D(s,["environment_id"],"enable_remote_control response"),E(s,"environment_id"),s}case"update_session_metadata":{ze(e,"update_session_metadata response");let s=R(t,"update_session_metadata response");return D(s,["session"],"update_session_metadata response"),nn(R(s.session,"update_session_metadata session"),"update_session_metadata session"),s}case"unsubscribe_session":case"close_session":return ze(e,`${n} response`),sn(t,n),null;case"sync_session_registrations":case"disable_remote_control":case"delete_session":case"shutdown":return _t(e,`${n} response`),sn(t,n),null;default:throw new w(`unknown daemon command result method: ${String(n)}`)}}function su(n){D(n,["type","request_id","session_id","request"],"control_request frame"),E(n,"request_id"),kt(n);let e=R(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new w("control request must have a non-empty string type or subtype")}function ru(n){D(n,["type","session_id","response"],"control_response frame"),kt(n);let e=R(n.response,"control response");E(e,"request_id");let t=E(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new w("success control response must not include error fields");D(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&R(e.response,"success response result");return}if(t!=="error")throw new w(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new w("error control response must not include response");if(D(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),E(e,"error"),e.code!==void 0&&E(e,"code"),e.retryable!==void 0&&au(e,"retryable"),e.details!==void 0&&R(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new w("pending_permission_requests must be an array")}function nn(n,e){D(n,["local_session_id","remote_session_id","environment_id","title","cwd","extra","state","created_at","updated_at"],e),E(n,"local_session_id");for(let s of["remote_session_id","environment_id","cwd"])n[s]!==void 0&&E(n,s);n.extra!==void 0&&R(n.extra,`${e}.extra`),E(n,"title");let t=E(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new w(`${e} has invalid state: ${t}`);E(n,"created_at"),E(n,"updated_at")}function sn(n,e){if(n!==void 0)throw new w(`${e} success must omit response`)}function ze(n,e){let t=n;try{return E(t,"session_id")}catch{throw new w(`${e} requires a valid session_id`)}}function _t(n,e){if(Object.hasOwn(n,"session_id"))throw new w(`${e} must not include session_id`)}function kt(n){let e=n;e.session_id!==void 0&&E(e,"session_id")}function ou(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 iu(n){return typeof n=="string"&&["user","assistant","stream_event","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function R(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new w(`${e} must be a JSON object`);return n}function E(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new w(`${e} must be a non-empty string`);return t}function au(n,e){let t=n[e];if(typeof t!="boolean")throw new w(`${e} must be a boolean`);return t}function uu(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new w(`${e} must be an array of strings`);return t}function D(n,e,t){let s=new Set(e),r=Object.keys(n).find(o=>!s.has(o));if(r!==void 0)throw new w(`${t} contains unknown field: ${r}`)}var Qe=class{constructor(e,t){this.connection=e;this.options=t;this.remoteSessionId="remoteSessionId"in t?t.remoteSessionId:void 0}messages=new X;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;subscribeResult;remoteSessionId;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}async initializationResult(){if(await this.initialize(),!this.subscribeResult)throw new Error("Daemon Session transport is not attached");let e=this.subscribeResult.initialization_result;return this.updateCommandLifecycleCapability(e),e}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=cu(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=pr(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){if(this.closed)return;this.closed=!0,this.cleanup(),this.messages.done();let e=this.sessionId;e&&this.startRelease(e)}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t;if(this.remoteSessionId!==void 0)this.subscribeResult=await this.connection.subscribeSession(this.remoteSessionId,this),t=this.subscribeResult.session_id;else{let s=this.options;t=await this.connection.openSession({worker_args:[...s.workerArgs],...s.cwd!==void 0?{cwd:s.cwd}:{},...s.configDir!==void 0?{config_dir:s.configDir}:{},...s.extra!==void 0?{extra:structuredClone(s.extra)}:{}},this)}if(this.sessionId=t,e=t,this.closed){await this.releaseSessionOnce(t);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let s=this.pendingMessages.map(r=>pr(r,t));this.pendingMessages.splice(0);for(let r of s)await this.connection.sendSessionMessage(r)}}finally{this.flushingPendingMessages=!1}}catch(t){throw e!==void 0&&this.startRelease(e),this.fail(t),t}}failAndRelease(e){let t=this.sessionId;t!==void 0&&this.startRelease(t),this.fail(e)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.remoteSessionId!==void 0?this.connection.unsubscribeSession(e):this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.closeAfterResult()}async closeAfterResult(){if(this.closed)return;this.closed=!0,this.cleanup();let e=this.sessionId;try{e&&await this.releaseSessionOnce(e),this.messages.done()}catch(t){this.messages.error(t)}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function cu(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 pr(n,e){if(Object.hasOwn(n,"session_id")&&n.session_id!==e)throw new Error(`Query message session_id must match daemon Session: expected ${e}, received ${String(n.session_id)}`);return{...n,session_id:e}}var an="multi_session_v2",mr="remote_control_v1",fr="session_title_sync_v1",gr="session_delete_v1",un="session_store_file_checkpointing_v1",lu=3e4,Rt=3e4,pu=125e3,Et=6e4,hr=12e4,mu=5e3,fu=1024,gu=64,hu=8*1024*1024,yu=256,Su=32*1024*1024,wu=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token","daemon.session_store.list_all","daemon.session_store.load","daemon.session_store.append","daemon.session_store.delete","daemon.session_store.materialize","daemon.session_store.release_materialization","daemon.session_store.update_metadata","daemon.session.resolve_remote_launch"]),Be=class extends Error{code;retryable;constructor(e){super(e.message),this.name="DaemonRpcError",this.code=e.code,this.retryable=e.retryable}},j=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRequestError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},Pt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;closedSessionIds=new Set;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;remoteControlFailureListener;daemonEventListeners=new Set;failureListeners=new Set;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.maxFrameBytes=e.maxFrameBytes??z,!Number.isSafeInteger(this.maxFrameBytes)||this.maxFrameBytes<=0)throw new TypeError("maxFrameBytes must be a positive safe integer");this.readTask=this.readOutput(e.output)}async initialize(e,t=[],s=lu){if(this.initialized)throw new w("daemon connection is already initialized");if(this.initializing)throw new w("daemon initialize is already in progress");this.initializing=!0;let r,o=typeof t=="number"?[]:t,i=typeof t=="number"?t:s,a=this.request("initialize",{daemon_protocol_version:2,sdk_version:e,capabilities:[an,...o]}),u=new Promise((d,m)=>{r=setTimeout(()=>{let p=new Error(`Qoder CLI daemon did not initialize within ${i}ms`);this.fail(p),m(p)},i)}),c;try{c=await Promise.race([a,u])}finally{this.initializing=!1,r&&clearTimeout(r)}if(!c.capabilities.includes(an))throw new w(`daemon is missing required capability: ${an}`);for(let d of c.capabilities)this.capabilities.add(d);this.initialized=!0}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Qe(this,e)}supportsCapability(e){return this.capabilities.has(e)}createAttachedSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Qe(this,{remoteSessionId:e})}onRemoteControlFailure(e){this.remoteControlFailureListener=e}onDaemonEvent(e){return this.daemonEventListeners.add(e),()=>this.daemonEventListeners.delete(e)}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){return(await this.request("open_session",e,t,void 0,hr)).session_id}subscribeSession(e,t){return this.request("subscribe_session",{remote_session_id:e},t,void 0,hr)}enableRemoteControl(e){return this.capabilities.has(mr)?this.request("enable_remote_control",e,void 0,void 0,Et):Promise.reject(new w(`daemon is missing required capability: ${mr}`))}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,pu,"request")).sessions}renameSession(e,t){return this.capabilities.has(fr)?this.request("rename_session",{title:t},void 0,e,Rt):Promise.reject(new w(`daemon is missing required capability: ${fr}`))}async disableRemoteControl(){await this.request("disable_remote_control",{},void 0,void 0,Et)}async syncSessionRegistrations(e){await this.request("sync_session_registrations",{local_session_ids:e},void 0,void 0,Et)}updateSessionMetadata(e,t){return this.request("update_session_metadata",{extra:t},void 0,e,Rt)}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("close_session",{},void 0,e,Rt)}async deleteSession(e){if(!this.capabilities.has(gr))throw new w(`daemon is missing required capability: ${gr}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,Et)}async unsubscribeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("unsubscribe_session",{},void 0,e,Rt)}async shutdown(e=mu){if(this.stopping){await this.readTask.catch(()=>{});return}this.stopping=!0;for(let t of this.sessions.values())t.fail(new Error("Daemon is stopping"));this.sessions.clear();try{this.failure||await this.request("shutdown",{},void 0,void 0,e)}finally{!this.input.destroyed&&!this.input.writableEnded&&this.input.end()}}fail(e,t=!0){let s=e instanceof Error?e:new Error(String(e));if(!this.failure){this.failure=s;for(let r of this.pendingRequests.values())r.timeout&&clearTimeout(r.timeout),r.reject(s);this.pendingRequests.clear(),this.timedOutRequestIds.clear(),this.clearPendingSessionMessages();for(let r of this.sessions.values())r.fail(s);if(this.sessions.clear(),t)for(let r of this.failureListeners)try{r(s)}catch{}}}request(e,t,s,r,o,i="connection"){if(this.failure)return Promise.reject(this.failure);if(e!=="initialize"&&!this.initialized)return Promise.reject(new w("daemon connection is not initialized"));let a=`sdk_daemon_${this.nextRequestId++}`,u={type:"control_request",request_id:a,...r!==void 0?{session_id:r}:{},request:{type:`daemon.${e}`,...t}};return new Promise((c,d)=>{let m={method:e,resolve:p=>c(p),reject:d,...s?{sessionTransport:s}:{},...r!==void 0?{sessionId:r}:{}};o!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new w(`daemon ${e} request timed out after ${o}ms`);if(i==="request"){this.pendingRequests.delete(a),this.rememberTimedOutRequestId(a),m.reject(p);return}this.fail(p)},o),m.timeout.unref?.()),this.pendingRequests.set(a,m),this.writeFrame(u).catch(p=>{let l=this.pendingRequests.get(a);l?.timeout&&clearTimeout(l.timeout),this.pendingRequests.delete(a),d(p),l?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new V(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=du({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=vu(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(rn(r))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(new Error("Daemon connection closed"),!1)}catch(r){this.fail(r)}finally{s.close(),e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="control_response"){let s=e,r=s.response.request_id;if(this.pendingRequests.has(r)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(r))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,r=bu(s);if(r==="valid"){this.acceptRequest(s);return}if(r==="contradictory")throw new w(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="event"){this.acceptEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=fu){let t=this.timedOutRequestIds.values().next().value;t!==void 0&&this.timedOutRequestIds.delete(t)}this.timedOutRequestIds.add(e)}routeSessionMessage(e){let t=e.session_id;if(typeof t!="string"||t.length===0)throw new w(`daemon Session message requires a valid session_id: ${String(t)}`);let s=this.sessions.get(t);if(s){s.acceptOutput(e);return}if(this.hasPendingSessionRequest()){this.bufferPendingSessionMessage(t,e);return}if(!this.closedSessionIds.has(t))throw new w(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new w(`daemon response has unknown request_id: ${t}`);if(s.timeout&&clearTimeout(s.timeout),s.sessionId!==void 0&&e.session_id!==s.sessionId){this.pendingRequests.delete(t),s.reject(new w(`${s.method} response session_id does not match request: expected ${s.sessionId}, received ${String(e.session_id)}`));return}if(this.pendingRequests.delete(t),e.response.subtype==="error"){if(s.method==="initialize"&&e.response.code==="PROTOCOL_VERSION_UNSUPPORTED"){s.reject(new G("1","2"));return}s.reject(new Be({code:e.response.code??"DAEMON_REQUEST_FAILED",message:e.response.error,retryable:e.response.retryable??!1})),s.sessionTransport&&this.failIfSessionMessagesAreOrphaned();return}try{let r=e,o=r.response.response?.daemon_protocol_version;if(s.method==="initialize"&&typeof o=="number"&&o!==2)throw new G(String(o),String(2));let i=lr(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>gu||o+r>hu||this.pendingSessionMessageFrameCount+1>yu||this.pendingSessionMessageByteCount+r>Su)throw new w("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,o+r),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=r}takePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)??[];return this.deletePendingSessionMessages(e),t}deletePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)?.length??0,s=this.pendingSessionMessageBytes.get(e)??0;this.pendingSessionMessages.delete(e),this.pendingSessionMessageBytes.delete(e),this.pendingSessionMessageFrameCount-=t,this.pendingSessionMessageByteCount-=s}clearPendingSessionMessages(){this.pendingSessionMessages.clear(),this.pendingSessionMessageBytes.clear(),this.pendingSessionMessageFrameCount=0,this.pendingSessionMessageByteCount=0}rejectLegacyInitialize(e){let t=this.pendingRequests.get(e);return t?.method!=="initialize"?!1:(this.pendingRequests.delete(e),t.reject(new G("1","2")),!0)}acceptRequest(e){if(!this.initialized){this.writeInboundError(e.request_id,"DAEMON_NOT_INITIALIZED","daemon reverse RPC is unavailable before initialize completes");return}if(this.activeInboundRequestIds.has(e.request_id)){this.writeInboundError(e.request_id,"DUPLICATE_REQUEST_ID",`daemon request_id is already active: ${e.request_id}`);return}if(!this.requestHandler){this.writeInboundError(e.request_id,"METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${e.request.type}`);return}this.activeInboundRequestIds.add(e.request_id),Promise.resolve().then(()=>this.requestHandler(e)).then(t=>{let s={type:"control_response",response:{subtype:"success",request_id:e.request_id,...t===null?{}:{response:t}}};return this.writeFrame(s)}).catch(t=>{let s=t instanceof j?t:void 0,r={type:"control_response",response:{subtype:"error",request_id:e.request_id,code:s?.code??"SDK_REQUEST_FAILED",error:t instanceof Error?t.message:String(t),retryable:s?.retryable??!1,...s?.details?{details:s.details}:{}}};return this.writeFrame(r)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let r={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(r).catch(o=>this.fail(o))}acceptEvent(e){if(e.event==="session_deleted"&&e.session_id!==void 0){let s=this.sessions.get(e.session_id);this.sessions.delete(e.session_id),this.closedSessionIds.add(e.session_id),s?.fail(new Be({code:"SESSION_DELETED",message:`Session was deleted: ${e.session_id}`,retryable:!1}))}for(let s of this.daemonEventListeners)try{s(e)}catch{}if(e.event==="session_deleted")return;if(e.event==="remote_control_state_changed"&&e.session_id===void 0){this.acceptRemoteControlEvent(e.data);return}if(e.event!=="session_state_changed"||e.session_id===void 0||e.data.state!=="failed")return;let t=this.sessions.get(e.session_id);t&&(this.sessions.delete(e.session_id),this.closedSessionIds.add(e.session_id),t.fail(_u(e.data)))}acceptRemoteControlEvent(e){if(e.state!=="failed")return;let t=e.environment_id;if(typeof t!="string"||t.length===0)return;let s=e.error,r=typeof s=="object"&&s!==null&&!Array.isArray(s)?s:{},o=typeof r.code=="string"&&r.code.length>0?r.code:"REMOTE_CONTROL_RUNTIME_FAILED",i=typeof r.message=="string"&&r.message.length>0?r.message:"Remote Control runtime failed";this.remoteControlFailureListener?.({environmentId:t,error:new Be({code:o,message:i,retryable:!1})})}writeFrame(e){let t;try{t=`${dr(e)}
19
- `,ve(t,this.maxFrameBytes,"SDK daemon input")}catch(r){let o=r instanceof Error?r:new Error(String(r));return this.fail(o),Promise.reject(o)}let s=this.writeChain.then(()=>new Promise((r,o)=>{this.input.write(t,"utf8",i=>{if(i){o(i);return}r()})}));return this.writeChain=s.catch(()=>{}),s.catch(r=>this.fail(r)),s}};function vu(n){let e;try{e=JSON.parse(n)}catch{return}if(!yr(e)||!Sr(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(!(!yr(t)||!Sr(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 yr(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Sr(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function bu(n){let e=wu.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 _u(n){let e=n.error,t=typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{},s=typeof t.message=="string"&&t.message.length>0?t.message:"Qoder CLI Worker exited before Session completed",r=t.exit_code===null||typeof t.exit_code=="number"?t.exit_code:void 0,o=t.signal===null||typeof t.signal=="string"?t.signal:void 0,i=typeof t.stderr=="string"&&t.stderr.length>0?t.stderr:void 0;return new I(s,{exitCode:r,signal:o,stderr:i})}import{randomUUID as ku}from"node:crypto";function J(n,e="extra"){if(!wr(n))throw new TypeError(`${e} must be a JSON object`);return cn(n,e,new Set),structuredClone(n)}function cn(n,e,t){if(!(n===null||typeof n=="string"||typeof n=="boolean")){if(typeof n=="number"){if(Number.isFinite(n))return;throw new TypeError(`${e} must contain finite JSON numbers`)}if(typeof n!="object")throw new TypeError(`${e} must contain only JSON values`);if(t.has(n))throw new TypeError(`${e} must not contain circular references`);if(t.add(n),Array.isArray(n))n.forEach((s,r)=>cn(s,`${e}[${r}]`,t));else{if(!wr(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))cn(r,`${e}.${s}`,t)}t.delete(n)}}function wr(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Ru=3e4,Eu=256,Pu=512*1024,Tt=class extends j{constructor(e){super({code:e.code,message:e.message,retryable:e.retryable??!1,...e.operation?{details:{operation:e.operation}}:{}}),this.name="DaemonSessionStoreRpcError"}};function br(n,e={}){let t=dn(e.callbackTimeoutMs??Ru,"callbackTimeoutMs"),s=dn(e.maxEntriesPerPage??Eu,"maxEntriesPerPage"),r=dn(e.maxPayloadBytes??Pu,"maxPayloadBytes"),o=new Map,i=!1,a;return Object.assign(async c=>{if(i)throw q("SESSION_STORE_DISPOSED","SessionStore daemon connection is closed");switch(c.request.type){case"daemon.session_store.list_all":return Tu(n,c,t,s,r);case"daemon.session_store.load":return Cu(n,c,t,s,r);case"daemon.session_store.append":return Mu(n,c,t,s,r);case"daemon.session_store.update_metadata":return Au(n,c,t);case"daemon.session_store.delete":return Ou(n,c,t);case"daemon.session_store.materialize":return Du(n,c,t,o);case"daemon.session_store.release_materialization":return Iu(c,t,o);default:throw q("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${c.request.type}`)}},{dispose(){return a||(i=!0,a=Promise.all([...o.keys()].map(c=>_r(c,t,o))).then(()=>{}),a.catch(()=>{a=void 0}),a)}})}async function Tu(n,e,t,s,r){let o=me(e,["cursor"]),i=Er(o.cursor),a=await fe("list_all",t,!0,()=>n.listAllSessions());if(!Array.isArray(a))throw q("SESSION_STORE_OPERATION_FAILED","SessionStore listAllSessions() must return an array",!0,"list_all");let u=a.map((d,m)=>Nu(xu(d,`sessions[${m}]`))),c=Pr(u,i,s,r);return{sessions:c.items,next_cursor:c.nextCursor}}async function Cu(n,e,t,s,r){let o=me(e,["key","cursor"]),i=Ae(o.key,"key"),a=Er(o.cursor),u=await fe("load",t,!0,()=>n.load(i));if(u===null)return{found:!1,entries:[],next_cursor:null};if(!Array.isArray(u))throw q("SESSION_STORE_OPERATION_FAILED","SessionStore load() must return an array or null",!0,"load");let c=u.map((m,p)=>Rr(m,`entries[${p}]`)),d=Pr(c,a,s,r);return{found:!0,entries:d.items,next_cursor:d.nextCursor}}async function Mu(n,e,t,s,r){let o=me(e,["key","entries"]),i=Ae(o.key,"key");if(!Array.isArray(o.entries))throw P("entries must be an array");if(o.entries.length>s)throw pn(`entries exceeds the ${s} entry batch limit`);let a=o.entries.map((u,c)=>Rr(u,`entries[${c}]`));return ju(a,r),await fe("append",t,!1,()=>n.append(i,a)),null}async function Ou(n,e,t){let s=me(e,["key"]),r=Ae(s.key,"key");if(!n.delete)throw q("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore delete() is not implemented",!1,"delete");return await fe("delete",t,!1,()=>n.delete(r)),null}async function Au(n,e,t){let s=me(e,["key","extra"]),r=Ae(s.key,"key");if(r.subpath!==void 0)throw P("key.subpath is not allowed for Session metadata");if(!n.updateSessionMetadata)throw q("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore updateSessionMetadata() is not implemented",!1,"update_metadata");let o=kr(s.extra,"extra");return await fe("update_metadata",t,!1,()=>n.updateSessionMetadata(r,{extra:o})),null}async function Du(n,e,t,s){let r=me(e,["key","cwd"]),o=Ae(r.key,"key");if(o.subpath!==void 0)throw P("key.subpath is not allowed for materialization");let i=pe(r.cwd,"cwd"),a,u;try{u=await fe("materialize",t,!0,()=>(a=wt({store:n,cwd:i,resume:o.sessionId,loadTimeoutMs:t}),a))}catch(d){throw a?.then(m=>m?.cleanup()).catch(()=>{}),d}if(!u)throw q("SESSION_STORE_SESSION_NOT_FOUND","SessionStore has no materializable transcript for the requested Session",!1,"materialize");if(u.projectKey!==o.projectKey||u.sessionId!==o.sessionId)throw await u.cleanup().catch(()=>{}),q("SESSION_STORE_KEY_MISMATCH","SessionStore key does not match the requested cwd",!1,"materialize");let c=`materialized_${ku()}`;return s.set(c,{materialized:u}),{lease_id:c,config_dir:u.configDir}}async function Iu(n,e,t){let s=me(n,["lease_id"]),r=pe(s.lease_id,"lease_id");return await _r(r,e,t),null}async function _r(n,e,t){let s=t.get(n);if(s){s.releasePromise||(s.releasePromise=fe("release_materialization",e,!0,()=>s.materialized.cleanup()));try{await s.releasePromise,t.delete(n)}catch(r){throw s.releasePromise=void 0,r}}}function me(n,e){let s=Object.keys(n.request).find(r=>r!=="type"&&!e.includes(r));if(s)throw P(`request contains unknown field: ${s}`);return n.request}function Ae(n,e){let t=ln(n,e),s=["projectKey","sessionId","subpath"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw P(`${e} contains unknown field: ${r}`);let o=pe(t.projectKey,`${e}.projectKey`),i=pe(t.sessionId,`${e}.sessionId`),a=t.subpath;if(a!==void 0&&(typeof a!="string"||!a))throw P(`${e}.subpath must be a non-empty string`);return{projectKey:o,sessionId:i,...typeof a=="string"?{subpath:a}:{}}}function xu(n,e){let t=ln(n,e),s=["key","title","lastActiveAt","cwd","extra"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw P(`${e} contains unknown field: ${r}`);let o=pe(t.lastActiveAt,`${e}.lastActiveAt`);if(!Number.isFinite(Date.parse(o)))throw P(`${e}.lastActiveAt must be an ISO timestamp`);let i=Ae(t.key,`${e}.key`);if(i.subpath!==void 0)throw P(`${e}.key must identify a main Session`);let a=t.extra===void 0?void 0:kr(t.extra,`${e}.extra`);return{key:i,title:vr(t.title,`${e}.title`),lastActiveAt:o,cwd:vr(t.cwd,`${e}.cwd`),...a===void 0?{}:{extra:a}}}function Nu(n){return{key:{projectKey:n.key.projectKey,sessionId:n.key.sessionId,...n.key.subpath===void 0?{}:{subpath:n.key.subpath}},title:n.title,last_active_at:n.lastActiveAt,cwd:n.cwd,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function kr(n,e){try{return J(n,e)}catch(t){throw P(t instanceof Error?t.message:`${e} must be a JSON object`)}}function Rr(n,e){let t=ln(n,e);pe(t.type,`${e}.type`);try{return JSON.parse(JSON.stringify(t))}catch{throw P(`${e} must be JSON-safe`)}}function ln(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw P(`${e} must be an object`);return n}function pe(n,e){if(typeof n!="string"||n.length===0)throw P(`${e} must be a non-empty string`);return n}function vr(n,e){let t=pe(n,e);if(t.trim().length===0)throw P(`${e} must be a non-empty string`);return t}function Er(n){if(n===void 0)return 0;if(typeof n!="string"||!/^(0|[1-9]\d*)$/.test(n))throw P("cursor must be a non-negative integer string");let e=Number(n);if(!Number.isSafeInteger(e))throw P("cursor exceeds the supported range");return e}function Pr(n,e,t,s){if(e>n.length)throw P("cursor is beyond the current result set");let r=[],o=2;for(let a=e;a<n.length;a+=1){let u=Tr(n[a])+(r.length?1:0);if(u+2>s&&r.length===0)throw pn("one SessionStore item exceeds the payload limit");if(r.length>=t||o+u>s)break;r.push(n[a]),o+=u}let i=e+r.length;return{items:r,nextCursor:i<n.length?String(i):null}}function ju(n,e){if(Tr(n)>e)throw pn(`payload exceeds the ${e} byte limit`)}function Tr(n){return Buffer.byteLength(JSON.stringify(n),"utf8")}async function fe(n,e,t,s){let r;try{return await Promise.race([Promise.resolve().then(s),new Promise((o,i)=>{r=setTimeout(()=>i(q("SESSION_STORE_TIMEOUT",`SessionStore ${n} timed out after ${e}ms`,t,n)),e)})])}catch(o){throw o instanceof Tt?o:q("SESSION_STORE_OPERATION_FAILED",o instanceof Error?o.message:String(o),t,n)}finally{r&&clearTimeout(r)}}function dn(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`);return n}function P(n){return q("SESSION_STORE_INVALID_REQUEST",n)}function pn(n){return q("SESSION_STORE_PAYLOAD_TOO_LARGE",n)}function q(n,e,t=!1,s){return new Tt({code:n,message:e,retryable:t,operation:s})}var qu=3e4;function Fu(n,e=qu){return zu(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return Uu(n,t,e);case"daemon.auth.fetch_service_account_token":return Lu(n,t,e);default:throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}function Cr(n){let e=Fu(n.auth,n.callbackTimeoutMs);return t=>{if(t.request.type.startsWith("daemon.session_store.")){if(n.sessionStoreHandler)return n.sessionStoreHandler(t);throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}if(t.request.type==="daemon.session.resolve_remote_launch"){if(n.remoteSessionLaunchHandler)return n.remoteSessionLaunchHandler(t);throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}return e(t)}}async function Uu(n,e,t){if(n.type!=="jobToken")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Mr(e,["reason","session_id"]),r=Or(s.reason),o=Ku(s.session_id,"session_id"),i=new AbortController;try{let a=await Ar(()=>n.fetchJobToken({requestId:e.request_id,reason:r,sessionId:o},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");return{token:a.token}}catch(a){throw a instanceof j?a:M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function Lu(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=Mr(e,["reason","required_scopes"]);Or(s.reason),$u(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await Ar(()=>n.fetchServiceAccountToken(),t,r);if(!o||typeof o.token!="string"||!o.token)throw M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=o.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:o.token,...i!==void 0?{expires_at:i}:{}}}catch(o){throw o instanceof j?o:M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function Mr(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw M("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Or(n){if(n!=="initial"&&n!=="unauthorized")throw M("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function Ku(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw M("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function $u(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw M("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function Ar(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 zu(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function M(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var Qu=3e4;function Ir(n,e=Qu){return async t=>{if(t.request.type!=="daemon.session.resolve_remote_launch")throw ee("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`);let s=Bu(t,["remote_session_id","extra"]),r=Dr(s.remote_session_id,"remote_session_id"),o=s.extra===void 0?void 0:Ju(s.extra,"extra"),i;try{let a=await Promise.race([n({remoteSessionId:r,...o===void 0?{}:{extra:o}}),new Promise((d,m)=>{i=setTimeout(()=>m(ee("REMOTE_SESSION_LAUNCH_TIMEOUT",`resolveRemoteSessionLaunch() timed out after ${e}ms`,!0)),e)})]);if(!a||typeof a!="object")throw ee("REMOTE_SESSION_LAUNCH_INVALID_RESULT","resolveRemoteSessionLaunch() must return a launch object");let u=Dr(a.cwd,"cwd"),c=a.additionalDirectories;if(c!==void 0&&(!Array.isArray(c)||c.some(d=>typeof d!="string"||d.trim().length===0)))throw ee("REMOTE_SESSION_LAUNCH_INVALID_RESULT","additionalDirectories must contain non-empty strings");return{cwd:u,...c===void 0?{}:{additional_directories:[...c]}}}catch(a){throw a instanceof j?a:ee("REMOTE_SESSION_LAUNCH_FAILED",a instanceof Error?a.message:"resolveRemoteSessionLaunch() failed",!0)}finally{i&&clearTimeout(i)}}}function Bu(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw ee("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Dr(n,e){if(typeof n!="string"||n.trim().length===0)throw ee("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}function Ju(n,e){try{return J(n,e)}catch(t){throw ee("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",t instanceof Error?t.message:`${e} must be a JSON object`)}}function ee(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var Hu=[250,1e3,5e3];function xr(n,e){let t=new mn(e.sync,e.retryDelaysMs??Hu);return{store:{listAllSessions:()=>n.listAllSessions(),load:r=>n.load(r),async append(r,o){await n.append(r,o),r.subpath===void 0&&o.length>0&&t.notify(r.sessionId)},...n.updateSessionMetadata?{async updateSessionMetadata(r,o){await n.updateSessionMetadata(r,o)}}:{},...n.listSessions?{listSessions:r=>n.listSessions(r)}:{},...n.delete?{delete:r=>n.delete(r)}:{},...n.listSubkeys?{listSubkeys:r=>n.listSubkeys(r)}:{}},flush:()=>t.flush(),dispose:()=>t.dispose()}}var mn=class{constructor(e,t){this.sync=e;this.retryDelaysMs=t}pending=new Set;running;disposed=!1;notify(e){this.disposed||(this.pending.add(e),this.run())}flush(){return this.run()}dispose(){this.disposed=!0,this.pending.clear()}run(){if(this.running)return this.running;if(this.disposed||this.pending.size===0)return Promise.resolve();let e=this.drain();return this.running=e.finally(()=>{this.running=void 0,!this.disposed&&this.pending.size>0&&this.run()}),this.running}async drain(){let e=0;for(;!this.disposed&&this.pending.size>0;){let t=[...this.pending];try{await this.sync(t);for(let s of t)this.pending.delete(s);e=0}catch{let s=this.retryDelaysMs[e++];if(s===void 0)return;await Gu(s)}}}};function Gu(n){return new Promise(e=>{setTimeout(e,n).unref?.()})}var Yu="QODER_AGENT_SDK_DAEMON",Xu="QODER_AGENT_SDK_DAEMON_CAPACITY",Zu="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",ec="ELECTRON_RUN_AS_NODE",tc=3e5,Nr=2e3,jr=8192,qr=255,Ur=new WeakMap;function vn(n){return Ur.get(n)}async function nc(n){oc(n.capacity);let e=n.workerIdleTimeoutMs??tc;ic(e);let t=new H({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await dc(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[Yu]:"1",[Xu]:String(n.capacity),[Zu]:String(e)},i,a,u;try{i=await wn.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let c;u=n.sessionStore?xr(n.sessionStore,{sync:l=>{if(!c)throw new Error("Daemon connection is not ready");return c.syncSessionRegistrations(l)}}):void 0,a=u?br(u.store):void 0;let d=n.resolveRemoteSessionLaunch?Ir(n.resolveRemoteSessionLaunch):void 0;c=new Pt({input:i.process.stdin,output:i.process.stdout,requestHandler:Cr({auth:n.auth,...a?{sessionStoreHandler:a}:{},...d?{remoteSessionLaunchHandler:d}:{}})}),i.setConnection(c);let m=[...d?["remote_session_launch_v1"]:[],...!n.sessionStore||typeof n.sessionStore.delete=="function"?["session_delete_v1"]:[],...n.sessionStore?[un]:[]];await c.initialize(tt,m),await t.cleanupAuthPayload();let p=new gn(c,i,a,u);return Ur.set(p,{auth:n.auth,transportProvider:new yn(c,s.env,n.cwd),supportsSessionStoreFileCheckpointing:c.supportsCapability(un),...u!==void 0?{sessionStore:u.store}:{}}),p}catch(c){throw await t.cleanupAuthPayload(),await i?.stop().catch(()=>{}),u?.dispose(),await a?.dispose().catch(()=>{}),c}}var gn=class n{constructor(e,t,s,r){this.connection=e;this.processController=t;this.sessionStoreHandler=s;this.registrationStore=r;this.connection.onDaemonEvent(o=>{this.acceptDaemonEvent(o)}),this.connection.onRemoteControlFailure(o=>{this.acceptRemoteControlFailure(o)}),this.connection.onFailure(o=>this.acceptDaemonFailure(o)),this.processController.onFailure(o=>this.acceptDaemonFailure(o))}static unknownSessionRefreshInitialDelayMs=25;static unknownSessionRefreshMaxDelayMs=1e3;currentState="ready";activeRemoteControl;pendingRemoteControlFailures=new Map;remoteControlLifecycle=Promise.resolve();stopPromise;eventListeners=new Set;knownSessions=new Map;deletedSessionIds=new Set;pendingUnknownSessionStates=new Map;refreshingUnknownSessionIds=new Set;unknownSessionRefreshDelays=new Map;unknownSessionRefreshTimers=new Map;pendingSessionRefreshIds=new Set;refreshingSessionIds=new Set;sessionEventRefresh=Promise.resolve();get state(){return this.currentState}async listSessions(){let e=await this.fetchSessions(),t=new Set(e.map(s=>s.localSessionId));for(let s of this.knownSessions.keys())t.has(s)||this.knownSessions.delete(s);for(let s of e)this.knownSessions.set(s.localSessionId,Je(s));return e}async fetchSessions(){return(await this.connection.listSessions()).map(fn).filter(t=>!this.deletedSessionIds.has(t.localSessionId))}onEvent(e){if(typeof e!="function")throw new TypeError("Daemon event callback must be a function");return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}async renameSession(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let s=sc(t),r=await this.connection.renameSession(e,s),o=fn(r.session);return this.acceptSessionSnapshot(o),Je(o)}async updateSessionMetadata(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");if(!t||typeof t!="object")throw new TypeError("update must be an object");let s=J(t.extra),r=await this.connection.updateSessionMetadata(e,s),o=fn(r.session);return this.knownSessions.has(e)&&this.acceptSessionSnapshot(o),Je(o)}async deleteSession(e){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e)}async enableRemoteControl(e){let t=uc(e);return this.enqueueRemoteControl(async()=>{if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(this.activeRemoteControl)throw new Error("Remote Control is already enabled");let s=await this.connection.enableRemoteControl(t),r=this.pendingRemoteControlFailures.get(s.environment_id);if(r)throw this.pendingRemoteControlFailures.delete(s.environment_id),r;let o=new hn(s.environment_id,i=>i.startDisable(()=>this.enqueueRemoteControl(()=>this.disableRemoteControlNow(i))),(i,a,u)=>{this.emitEvent({type:"remoteControlStateChanged",environmentId:s.environment_id,previousState:i,state:a,...u?{error:u}:{}})});return this.activeRemoteControl=o,o})}async attachSession(e,t={}){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");let s=this.connection.createAttachedSessionTransport(e);try{return await s.initialize(),Us({transport:s,initialization:s.initializationResult(),...t.canUseTool?{canUseTool:t.canUseTool}:{},...t.onElicitation?{onElicitation:t.onElicitation}:{}})}catch(r){throw s.close(),r}}stop(){return this.stopPromise||(this.clearAllUnknownSessionRefreshes(),this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{this.registrationStore?.dispose(),await this.enqueueRemoteControl(async()=>{let e=this.activeRemoteControl;e&&await e.startDisable(()=>this.disableRemoteControlNow(e))}).catch(()=>{}),await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),await this.sessionStoreHandler?.dispose(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),this.registrationStore?.dispose(),await this.sessionStoreHandler?.dispose().catch(()=>{}),e}}async disableRemoteControlNow(e){if(this.activeRemoteControl===e)try{await this.connection.disableRemoteControl()}finally{this.activeRemoteControl===e&&(this.activeRemoteControl=void 0)}}enqueueRemoteControl(e){let t=this.remoteControlLifecycle.then(e,e);return this.remoteControlLifecycle=t.then(()=>{},()=>{}),t}acceptRemoteControlFailure(e){let t=this.activeRemoteControl;if(t?.environmentId===e.environmentId){t.fail(e.error),this.activeRemoteControl=void 0;return}this.pendingRemoteControlFailures.set(e.environmentId,e.error)}acceptDaemonFailure(e){this.clearAllUnknownSessionRefreshes(),this.currentState==="ready"&&this.setDaemonState("failed",e),this.activeRemoteControl?.fail(e),this.activeRemoteControl=void 0,this.registrationStore?.dispose(),this.sessionStoreHandler?.dispose().catch(()=>{})}acceptDaemonEvent(e){if(e.event==="session_deleted"&&typeof e.session_id=="string"){let o=e.session_id;this.deletedSessionIds.add(o),this.knownSessions.delete(o),this.clearUnknownSessionRefresh(o),this.pendingSessionRefreshIds.delete(o),this.emitEvent({type:"sessionDeleted",localSessionId:o});return}if(e.event==="session_title_changed"&&typeof e.session_id=="string"){let o=e.data.title,i=e.data.updated_at,a=this.knownSessions.get(e.session_id);if(a&&typeof o=="string"&&o.trim().length>0&&typeof i=="string"&&Number.isFinite(Date.parse(i))){this.acceptSessionSnapshot({...a,title:o,updatedAt:i});return}this.refreshSession(e.session_id);return}if(e.event==="session_metadata_changed"&&typeof e.session_id=="string"){let o=e.data.extra;if(bn(o)){let i=this.knownSessions.get(e.session_id);if(i){this.acceptSessionSnapshot({...i,extra:J(o)});return}}this.refreshSession(e.session_id);return}if(e.event!=="session_state_changed"||typeof e.session_id!="string"||!ac(e.data.state))return;let t=e.session_id,s=e.data.state,r=this.knownSessions.get(t);if(r){if(r.state===s)return;let o={...r,state:s};this.knownSessions.set(t,o),this.emitEvent({type:"sessionUpdated",session:o,previousState:r.state});return}this.pendingUnknownSessionStates.set(t,s),this.refreshUnknownSession(t)}refreshUnknownSession(e){this.currentState!=="ready"||this.deletedSessionIds.has(e)||!this.pendingUnknownSessionStates.has(e)||this.refreshingUnknownSessionIds.has(e)||(this.refreshingUnknownSessionIds.add(e),this.sessionEventRefresh=this.sessionEventRefresh.then(async()=>{let s=(await this.fetchSessions()).find(a=>a.localSessionId===e);if(!s){this.scheduleUnknownSessionRefresh(e);return}let r=this.pendingUnknownSessionStates.get(e);if(!r)return;let o=this.knownSessions.get(e),i=s.state===r?s:{...s,state:r};this.clearUnknownSessionRefresh(e),this.knownSessions.set(e,i),o?o.state!==i.state&&this.emitEvent({type:"sessionUpdated",session:i,previousState:o.state}):this.emitEvent({type:"sessionDiscovered",session:i})}).catch(()=>{this.scheduleUnknownSessionRefresh(e)}).finally(()=>{this.refreshingUnknownSessionIds.delete(e)}))}scheduleUnknownSessionRefresh(e){if(this.currentState!=="ready"||this.deletedSessionIds.has(e)||!this.pendingUnknownSessionStates.has(e)||this.unknownSessionRefreshTimers.has(e))return;let t=this.unknownSessionRefreshDelays.get(e)??n.unknownSessionRefreshInitialDelayMs;this.unknownSessionRefreshDelays.set(e,Math.min(t*2,n.unknownSessionRefreshMaxDelayMs));let s=setTimeout(()=>{this.unknownSessionRefreshTimers.delete(e),this.refreshUnknownSession(e)},t);this.unknownSessionRefreshTimers.set(e,s)}clearUnknownSessionRefresh(e){let t=this.unknownSessionRefreshTimers.get(e);t&&clearTimeout(t),this.unknownSessionRefreshTimers.delete(e),this.unknownSessionRefreshDelays.delete(e),this.pendingUnknownSessionStates.delete(e)}clearAllUnknownSessionRefreshes(){for(let e of this.unknownSessionRefreshTimers.values())clearTimeout(e);this.unknownSessionRefreshTimers.clear(),this.unknownSessionRefreshDelays.clear(),this.pendingUnknownSessionStates.clear()}refreshSession(e){this.pendingSessionRefreshIds.add(e),!this.refreshingSessionIds.has(e)&&(this.refreshingSessionIds.add(e),this.sessionEventRefresh=this.sessionEventRefresh.then(async()=>{for(;this.pendingSessionRefreshIds.delete(e);){let s=(await this.fetchSessions()).find(r=>r.localSessionId===e);s&&this.acceptSessionSnapshot(s)}}).catch(()=>{}).finally(()=>{this.refreshingSessionIds.delete(e)}))}acceptSessionSnapshot(e){if(this.deletedSessionIds.has(e.localSessionId))return;let t=this.knownSessions.get(e.localSessionId);if(t&&Vu(t,e))return;let s=Je(e);this.knownSessions.set(e.localSessionId,s),t?this.emitEvent({type:"sessionUpdated",session:s,previousState:t.state}):this.emitEvent({type:"sessionDiscovered",session:s})}setDaemonState(e,t){let s=this.currentState;s!==e&&(this.currentState=e,this.emitEvent({type:"daemonStateChanged",previousState:s,state:e,...t?{error:t}:{}}))}emitEvent(e){for(let t of this.eventListeners)try{t(rc(e))}catch{}}};function Je(n){return{...n,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function sc(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>qr)throw new TypeError(`title must be at most ${qr} characters`);return e}function fn(n){return{localSessionId:n.local_session_id,...n.remote_session_id?{remoteSessionId:n.remote_session_id}:{},...n.environment_id?{environmentId:n.environment_id}:{},title:n.title,...n.cwd?{cwd:n.cwd}:{},...n.extra===void 0?{}:{extra:J(n.extra)},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}function rc(n){return"session"in n?{...n,session:Je(n.session)}:{...n}}var hn=class{constructor(e,t,s){this.environmentId=e;this.requestDisable=t;this.onStateChanged=s}currentState="ready";disablePromise;get state(){return this.currentState}disable(){return this.startDisable(()=>this.requestDisable(this))}startDisable(e){if(!this.disablePromise){let t=this.currentState;this.currentState="stopping",this.onStateChanged(t,"stopping"),this.disablePromise=e().then(()=>{let s=this.currentState;this.currentState="stopped",this.onStateChanged(s,"stopped")},s=>{let r=this.currentState;throw this.currentState="failed",this.onStateChanged(r,"failed",s instanceof Error?s:new Error(String(s))),s})}return this.disablePromise}fail(e){if(this.currentState==="ready"){let t=this.currentState;this.currentState="failed",this.onStateChanged(t,"failed",e)}}},yn=class{constructor(e,t,s){this.connection=e;this.daemonEnv=t;this.defaultCwd=s}create(e){let t=new H({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs();return this.connection.createSessionTransport({workerArgs:s,cwd:e.cwd??this.defaultCwd,...e.extra!==void 0?{extra:e.extra}:{},...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}};function oc(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError("capacity must be a positive integer")}function ic(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}function ac(n){return n==="pending"||n==="ready"||n==="inactive"||n==="failed"}function uc(n){if(!n||typeof n!="object")throw new TypeError("Remote Control options must be an object");if(typeof n.externalId!="string"||!n.externalId.trim())throw new TypeError("externalId must be a non-empty string");if(typeof n.environmentType!="string"||!n.environmentType.trim())throw new TypeError("environmentType must be a non-empty string");if(n.name!==void 0&&(typeof n.name!="string"||!n.name.trim()))throw new TypeError("name must be a non-empty string");let e=cc(n.metadata);return{external_id:n.externalId,environment_type:n.environmentType,...n.name!==void 0?{name:n.name}:{},...e!==void 0?{metadata:e}:{}}}function cc(n){if(n!==void 0){if(!bn(n))throw new TypeError("metadata must be a JSON object");return Sn(n,"metadata",new Set),structuredClone(n)}}function Sn(n,e,t){if(!(n===null||typeof n=="string"||typeof n=="boolean")){if(typeof n=="number"){if(Number.isFinite(n))return;throw new TypeError(`${e} must contain finite JSON numbers`)}if(typeof n!="object")throw new TypeError(`${e} must contain only JSON values`);if(t.has(n))throw new TypeError(`${e} must not contain circular references`);if(t.add(n),Array.isArray(n))n.forEach((s,r)=>Sn(s,`${e}[${r}]`,t));else{if(!bn(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))Sn(r,`${e}.${s}`,t)}t.delete(n)}}function bn(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}async function dc(n){let e=Me({pathToQoderCLIExecutable:n},ie),t,s={};if(e.transport==="worker"){let r=await ke(Y(e.pathToQoderWorkerRuntime));t=r.runtimePath,s=r.env}else t=n??W();return it(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[ec]:"1"}:{}}}:{command:t,args:[],env:s}}var wn=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>jr&&(this.stderrTail=this.stderrTail.slice(-jr))}),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=Wu(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await pc(t)}catch(s){throw new I(`Failed to spawn Qoder CLI daemon: ${lc(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 Fr(this.exited,Nr)&&(this.process.kill("SIGTERM"),!await Fr(this.exited,Nr)&&(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 lc(n){return n instanceof Error?n.message:String(n)}async function pc(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 Fr(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 _n=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 mc(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=vn(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(cs(n.transport))return n.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let t=Me(n,ie);return t.transport==="worker"?new Re({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):be.default}function kn(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;if(s)r=fc(t);else if(t.extra!==void 0)throw new Error("options.extra requires options.daemon.");let o=s?vn(s):void 0,i=o?.sessionStore??t.sessionStore,a=t.sessionStoreFlush??(o?.sessionStore!==void 0?"eager":"batched"),u=mc(t,s),c=new mt({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");if(t.planMode!==void 0&&typeof t.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");let d=o?.auth??t.auth;if(d==null)throw new _n;if(i&&t.enableFileCheckpointing&&o?.supportsSessionStoreFileCheckpointing!==!0)throw new Error("sessionStore cannot be combined with enableFileCheckpointing unless the bound daemon advertises persistent file checkpoint storage.");if(i&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(i&&o===void 0&&!(u instanceof be)&&!(u instanceof Re))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(i&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(i&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(i&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Hs(t),Gs({prompt:e,options:t,diagnostics:c});let m=ar(t.memory),p=cr(t.evolution?.skill),l=t.onAuthExpired,g=!1,h=l?()=>{g||(g=!0,Promise.resolve(l()).catch(k=>{c.record("[query] onAuthExpired callback threw:",k)}))}:void 0,f=new Map,y=new Map,b=new Map,S={},T={},C={};if(t.mcpServers)for(let[k,K]of Object.entries(t.mcpServers)){let re=K.tools;if(Array.isArray(re)&&re.length>0&&(T[k]=re),K.type==="sdk"&&"instance"in K&&K.instance){let we=K.instance;if(f.set(k,we),re){let Ze=jt(k,re);Ze&&(C[k]=Ze)}let Kn=new ht(Ze=>{bs(k,Ze,b)});y.set(k,Kn),we.connect(Kn).catch(()=>{})}else S[k]=K}let ye=Object.keys(S).length>0,_=Object.keys(T).length>0,se=t.pathToQoderCLIExecutable,Ye=t.env,vo=d?.type==="jobToken"?d.fetchJobToken:void 0,bo=d?.type==="serviceAccount"?d.fetchServiceAccountToken:void 0,Xe={pathToQoderCLIExecutable:se,executable:t.executable,executableArgs:t.executableArgs,env:Ye,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:s?void 0:d,model:t.model,agent:t.agent,debug:t.debug,diagnostics:c,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:i!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,extra:t.extra===void 0?void 0:J(t.extra),continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let k=t.allowedTools??[];if(t.skills===void 0)return k.length>0?k:void 0;let K=t.skills==="all"?["Skill"]:t.skills.map(we=>`Skill(${we})`),re=new Set(k);return[...k,...K.filter(we=>!re.has(we))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:ye?S:void 0,mcpToolPolicies:_?T:void 0,allowedMcpServerNames:t.allowedMcpServerNames,strictMcpConfig:t.strictMcpConfig,settings:t.settings,securityScan:t.securityScan,settingSources:t.settingSources,additionalDirectories:t.additionalDirectories,plugins:t.plugins,enableFileCheckpointing:t.enableFileCheckpointing,stderr:"pipe",stderrHandler:t.stderr,spawnQoderCLIProcess:t.spawnQoderCLIProcess,onAuthExpired:h},Fn=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new pt(async()=>{let k=await wt({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:ct(u,{...Xe,continue:!1})};try{return{transport:ct(u,{...Xe,env:{...Xe.env??process.env,[v.configDirEnv]:k.configDir},materializedSessionConfigDir:k.configDir,continue:!1,resume:k.sessionId}),cleanup:k.cleanup}}catch(K){throw await k.cleanup(),K}}):ct(u,Xe);Fn.initialize().catch(()=>{});let _o=typeof e=="string",Se=t.systemPrompt,Un,Ln;if(typeof Se=="string")Un=Se;else if(typeof Se=="object"&&Se!==null&&Se.type==="preset"){let k=Se;if(k.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(k.preset)}`);Ln=k.append}let ko={systemPrompt:Un,appendSystemPrompt:Ln,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:s!==void 0?t.planMode??!1:t.planMode,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing,memory:m.config,evolution:p.config?{skill:p.config}:void 0,customContext:t.customContext,...s!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},xt=new Le(Fn,_o,t.canUseTool,t.hooks,t.abortController,f,ko,t.onElicitation,c,h,t.controlRequestTimeoutMs,y,b,vo,t.resolveModel,t.resolveModelTimeoutMs,i,a,C,bo,m.callbacks,p.callbacks);if(typeof e=="string"){let k={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};xt.streamInput(async function*(){yield k}())}else xt.streamInput(e);return xt}function fc(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=Ue(n.permissionMode),s=[["auth",n.auth],["transport",n.transport],["env",n.env],["pathToQoderCLIExecutable",n.pathToQoderCLIExecutable],["executable",n.executable],["executableArgs",n.executableArgs],["proxy",n.proxy],["spawnQoderCLIProcess",n.spawnQoderCLIProcess],["closeGraceMs",n.closeGraceMs],["sessionStore",n.sessionStore]].find(([,r])=>r!==void 0);if(s)throw new Error(`options.${s[0]} is part of startDaemon() configuration and cannot be overridden by a daemon-bound Query.`);return e}var Rn=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}}},En=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 gc(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 Rn,s=kn({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 En(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as hc}from"node:fs/promises";import yc from"node:os";import L from"node:path";var Sc=["user","project","local"],Cn=new Set(["__proto__","constructor","prototype"]),wc=/^[\p{L}\p{N}\p{M}._ -]+$/u,vc=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,bc=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),_c=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),kc=new Set(["context.fileFiltering.customIgnoreFilePaths","tools.exclude","mcp.enabledProjectMcpServers","mcp.disabledProjectMcpServers","security.approvedExternalImportProjects","advanced.excludedEnvVars","extensions.disabled","extensions.workspacesWithMigrationNudge","plugins.enabled","plugins.disabled","skills.disabled","blockedMarketplaces","allowedHttpHookUrls"]);function ge(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Rc(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 ta}from"node:crypto";var X=class{queue=[];readResolve;readReject;isDone=!1;errorValue;started=!1;returnCallback;constructor(e){this.returnCallback=e}[Symbol.asyncIterator](){if(this.started)throw new Error("Stream can only be iterated once");return this.started=!0,this}async next(){if(this.queue.length>0)return{done:!1,value:this.queue.shift()};if(this.isDone)return{done:!0,value:void 0};if(this.errorValue!==void 0)throw this.errorValue;return new Promise((e,t)=>{this.readResolve=e,this.readReject=t})}enqueue(e){if(!this.isDone)if(this.readResolve){let t=this.readResolve;this.readResolve=void 0,this.readReject=void 0,t({done:!1,value:e})}else this.queue.push(e)}done(){if(this.isDone=!0,this.readResolve){let e=this.readResolve;this.readResolve=void 0,this.readReject=void 0,e({done:!0,value:void 0})}}error(e){if(this.errorValue=e,this.readReject){let t=this.readReject;this.readResolve=void 0,this.readReject=void 0,t(e)}}async return(){return this.isDone=!0,this.returnCallback?.(),{done:!0,value:void 0}}async throw(e){return this.error(e),{done:!0,value:void 0}}};var F=class extends Error{constructor(e="Operation was aborted"){super(e),this.name="AbortError"}},Ue=class extends Error{timeoutMs;constructor(e){super(`resolveModel did not return within ${e}ms. Increase resolveModelTimeoutMs or ensure the callback resolves faster.`),this.name="ModelPolicyTimeoutError",this.timeoutMs=e}},G=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},Z=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}};var Qt="1.3.0";var Bi=new Set(["default","acceptEdits","auto","bypassPermissions"]);function Le(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Bi.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 _s(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 ks(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 Rs(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 Qi}from"crypto";function Ts(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 Ji=500,Hi=1024*1024,Gi=6e4,ft=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Wi(e.filePath),s=Vi(e.entries);this.receivedEntryCount+=s.length;let r=Ps(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>=Ji||o.bytes>=Hi)&&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 Zi(this.options.store,e.key,t,this.options.appendTimeoutMs??Gi)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${Ps(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:Qi(),session_id:e.key.sessionId})}})}};function Wi(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:Es(o[1])};let i=Es(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 Yi(c),{projectKey:r,sessionId:i,subpath:c}}function Vi(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 Es(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 Yi(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 Ps(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 Zi(n,e,t,s){await ea(n.append({...e},structuredClone(t)),s)}async function ea(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Jt(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Jt=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Cs(){return Math.random().toString(36).substring(2,15)}function Ms(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 Os(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function As(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function Is(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function Ds(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function xs(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function Ee(n){if(typeof n!="object"||n===null)return;let e=n,t=e.subtype;if(typeof t=="string")return t;let s=e.type;return typeof s=="string"?s:void 0}function Ns(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function js(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function qs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Fs(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function Us(n){return typeof n=="object"&&n!==null&&n.type==="result"}var na="<synthetic>";function sa(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==na?n:{...n,isApiErrorMessage:!0}}var Ke=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";static SESSION_STORE_FORK_BARRIER_CAPABILITY="session_store_fork_barrier_v1";transport;inputStream;pendingRequests=new Map;pendingInboundRequests=new Map;hooks;hookCallbacks=new Map;nextHookCallbackId=0;sdkMcpServers;sdkMcpTransports;pendingMcpResponses;sdkMcpToolOverrides;isSingleTurn;canUseTool;abortController;initConfig;onElicitation;onAuthExpired;fetchJobToken;fetchServiceAccountToken;diagnostics;controlRequestTimeoutMs;resolveModel;resolveModelTimeoutMs;transcriptMirrorBatcher;memoryCallbacks;skillEvolutionCallbacks;initResponse;initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;sessionStoreForkBarrierComplete=!1;constructor(e,t,s,r,o,i,a,u,c,l,m,p,d,g,h,f,y,b="batched",w,T,C,re){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=d??new Map,this.sdkMcpToolOverrides=w??{},this.initConfig=a??{},this.onElicitation=u,this.onAuthExpired=l,this.fetchJobToken=g,this.fetchServiceAccountToken=T,this.diagnostics=c,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=h,this.resolveModelTimeoutMs=f??500,this.memoryCallbacks=C,this.skillEvolutionCallbacks=re,this.inputStream=new X(()=>{this.close().catch(()=>{})}),y&&(this.transcriptMirrorBatcher=new ft({store:y,flushMode:b,holdUntilFlush:this.initConfig.requireSessionStoreForkBarrier===!0,diagnostics:c,onMirrorError:_=>this.inputStream.enqueue(_)})),this.readLoopPromise=this.readMessages().catch(_=>{this.inputStream.error(_)}),this.initializationPromise=this.initConfig.attachedInitialization?this.initConfig.attachedInitialization.then(async _=>(this.initResponse=_,this.cliCapabilities=new Set(_.capabilities??[]),await this.completeSessionStoreForkBarrier(),_)):this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let _=this.abortController.signal;_.aborted?this.close().catch(()=>{}):_.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0})}}getRecord(e){return typeof e=="object"&&e!==null?e:void 0}normalizeLogPreview(e){let s=e.replace(/\s+/g," ").trim();return s.length>200?`${s.slice(0,200)}...`:s}extractMessagePreview(e){if(typeof e=="string")return this.normalizeLogPreview(e);if(Array.isArray(e)){for(let i of e){let a=this.extractMessagePreview(i);if(a)return a}return""}let t=this.getRecord(e);if(!t)return"";let s=t.text;if(typeof s=="string")return this.normalizeLogPreview(s);let r=this.extractMessagePreview(t.content);if(r)return r;let o=this.getRecord(t.message);return o?this.extractMessagePreview(o):""}getMessagePreviewSuffix(e){let t=this.extractMessagePreview(e);return t?` preview=${JSON.stringify(t)}`:""}getMessageType(e){let s=this.getRecord(e)?.type;return typeof s=="string"&&s?s:"unknown"}getMessageSubtype(e){let s=this.getRecord(e)?.subtype;return typeof s=="string"&&s?s:"none"}getMessageUuid(e){let s=this.getRecord(e)?.uuid;return typeof s=="string"&&s?s:"none"}recordInboundSessionMessage(e){this.diagnostics?.record(`[QueryRunner] inbound session_message received type=${this.getMessageType(e)} subtype=${this.getMessageSubtype(e)} uuid=${this.getMessageUuid(e)}${this.getMessagePreviewSuffix(e)}`)}recordOutboundSessionMessage(e){let t=this.getRecord(e)?.message,r=this.getRecord(t)?.content,o=Array.isArray(r)?r.length:0;this.diagnostics?.record(`[QueryRunner] outbound session_message sent type=${this.getMessageType(e)} uuid=${this.getMessageUuid(e)} content_blocks=${o}${this.getMessagePreviewSuffix(e)}`)}[Symbol.asyncIterator](){return this}async next(){return this.inputStream.next()}async return(){return await this.close(),{done:!0,value:void 0}}async throw(e){return await this.inputStream.throw(e),{done:!0,value:void 0}}async readMessages(){let e;try{for await(let t of this.transport.readMessages()){if(this.closed)break;if(Ts(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(Is(t)){this.handleControlResponse(t);continue}if(Ds(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(xs(t)){this.handleControlCancelRequest(t);continue}if(Ns(t)||js(t)||qs(t)||Fs(t))continue;if(Us(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=sa(t);if((s.type==="user"||s.type==="assistant")&&(this.pendingErrorResultExit=!1),this.recordInboundSessionMessage(s),s.type==="system"&&s.subtype==="init")try{let r=s;this.validateProtocolHandshake(r),this.cliCapabilities=new Set(r.capabilities??[])}catch(r){throw this.inputStream.error(r),r}this.dispatchMemoryCallbacks(s),this.dispatchSkillEvolutionCallbacks(s),this.notifyAuthExpiredIfNeeded(s),this.inputStream.enqueue(s)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):e=t}finally{await this.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 F;let s=Cs(),r=Ms(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Ee(r.request)??"unknown",a=Date.now();return new Promise((u,c)=>{let l=null,m=()=>{try{this.transport.write(JSON.stringify({type:"control_cancel_request",request_id:s})+`
9
+ `)}catch(g){this.diagnostics?.record("[QueryRunner] Failed to send control_cancel_request:",g)}},p=()=>{l&&(clearTimeout(l),l=null),t?.signal?.removeEventListener("abort",d)},d=()=>{this.pendingRequests.delete(s)&&(p(),this.diagnostics?.record(`[QueryRunner] control_request cancelled request_id=${s} subtype=${i}`),m(),c(new F))};this.pendingRequests.set(s,{resolve:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=success duration_ms=${Date.now()-a}`),u(g)},reject:g=>{p(),this.diagnostics?.record(`[QueryRunner] control_response received request_id=${s} subtype=${i} status=error duration_ms=${Date.now()-a}`,g),c(g)}}),t?.signal?.addEventListener("abort",d,{once:!0}),o>0&&Number.isFinite(o)&&(l=setTimeout(()=>{this.pendingRequests.has(s)&&(this.pendingRequests.delete(s),p(),this.diagnostics?.record(`[QueryRunner] control_request timed out request_id=${s} subtype=${i} timeout_ms=${o}`),m(),c(new Error(`Control request "${Ee(r.request)??"unknown"}" timed out after ${o}ms`)))},o));try{this.diagnostics?.record(`[QueryRunner] control_request sending request_id=${s} subtype=${i} timeout_ms=${o}`),this.transport.write(JSON.stringify(r)+`
10
+ `),this.diagnostics?.record(`[QueryRunner] control_request sent request_id=${s} subtype=${i}`)}catch(g){p(),this.pendingRequests.delete(s),this.diagnostics?.record(`[QueryRunner] control_request send failed request_id=${s} subtype=${i}`,g),c(g)}})}handleControlResponse(e){let t=e.response,s=t.request_id,r=this.pendingRequests.get(s);if(!r){this.diagnostics?.record(`[QueryRunner] unmatched control_response received request_id=${s} status=${t.subtype}`);return}if(this.pendingRequests.delete(s),t.subtype==="success")r.resolve(t.response);else{let o=new Error(t.error);t.code&&(o.code=t.code),r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)Ee(t.request)==="can_use_tool"&&this.handleControlRequest(t).catch(s=>{this.diagnostics?.record("[QueryRunner] Error handling pending permission request:",s)})}async handleControlRequest(e){let t=e.request_id,s=Ee(e.request)??"unknown",r=Date.now(),o=new AbortController;this.pendingInboundRequests.set(t,{abortController:o}),this.diagnostics?.record(`[QueryRunner] inbound control_request received request_id=${t} subtype=${s}`);try{let i=await this.awaitAbortable(this.processControlRequest(e,o.signal),o.signal);if(!o.signal.aborted){let a=Os(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}=ua(i),c=As(t,a,u);this.transport.write(JSON.stringify(c)+`
12
+ `),this.diagnostics?.record(`[QueryRunner] inbound control_response sent request_id=${t} subtype=${s} status=error duration_ms=${Date.now()-r}`,i)}}finally{this.pendingInboundRequests.delete(t)}}handleControlCancelRequest(e){let t=this.pendingInboundRequests.get(e.request_id);t&&(t.abortController.abort(),this.pendingInboundRequests.delete(e.request_id))}throwIfAborted(e){if(e.aborted)throw new F}validateProtocolHandshake(e){if(this.protocolHandshakeValidated)return;this.protocolHandshakeValidated=!0;let t=e.protocol_version,s=Qt;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=Ls(t),o=Ls(s);if(!r||!o){this.diagnostics?.record(`[QueryRunner] Could not parse protocol_version "${t}" or built-in "${s}"; skipping handshake.`);return}if(r.major!==o.major)throw new G(t,s);r.minor<o.minor&&this.diagnostics?.record(`[QueryRunner] CLI protocol_version ${t} is older than this SDK's ${s}. New optional fields may be absent.`)}async awaitAbortable(e,t){if(t.aborted)throw new F;return new Promise((s,r)=>{let o=()=>{r(new F)};t.addEventListener("abort",o,{once:!0}),e.then(i=>{t.removeEventListener("abort",o),s(i)},i=>{t.removeEventListener("abort",o),r(i)})})}async processControlRequest(e,t){this.throwIfAborted(t);let s=e.request,r=Ee(s),o=s;switch(r){case"fetch_job_token":{if(!this.fetchJobToken)throw new Error("job_token_unavailable: No fetchJobToken callback configured");let i=o.reason??"initial",a=o.session_id,u=e.request_id,c=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!c?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let l=c.expiresAt;if(l!==void 0&&(!Number.isFinite(l)||l<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,...l!==void 0?{expires_at:l}:{}}}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,l=o.blocked_path,m=o.decision_reason,p=o.title,d=o.display_name,g=o.description,h=o.agent_id,f=await this.awaitAbortable(this.canUseTool(i,a,{signal:t,suggestions:c,blockedPath:l,decisionReason:m,title:p,displayName:d,description:g,toolUseID:u,agentID:h}),t);if(f.behavior==="deny"&&!f.message)throw new Error("Permission deny result must include a message.");return f.behavior==="allow"?{...f,updatedInput:f.updatedInput??a,toolUseID:u}:{...f,toolUseID:u}}case"hook_callback":{let i=o.callback_id;if(!i)throw new Error("Hook callback missing callback_id");return this.invokeRegisteredHookCallback(i,o.input,o.tool_use_id,t)}case"memory_should_generate":{let i=o.callbackId;if(!i)throw new Error("Memory shouldGenerate request missing callbackId");let a=this.memoryCallbacks?.shouldGenerateCallbacks.get(i);if(!a)throw new Error(`Unknown memory shouldGenerate callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Memory shouldGenerate callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"skill_evolution_should_review":{let i=o.callbackId;if(!i)throw new Error("Skill evolution shouldReview request missing callbackId");let a=this.skillEvolutionCallbacks?.shouldReviewCallbacks.get(i);if(!a)throw new Error(`Unknown skill evolution shouldReview callback: ${i}`);let u=await this.awaitAbortable(a(o.input,{signal:t}),t);if(!u||typeof u.run!="boolean")throw new TypeError("Skill evolution shouldReview callback must return { run: boolean }");return{run:u.run,...typeof u.reason=="string"?{reason:u.reason}:{}}}case"mcp_message":{let i=o.server_name,a=o.message,u=this.sdkMcpTransports.get(i);if(!u)throw new Error(`Unknown in-process MCP server: ${i}`);return{mcp_response:await this.awaitAbortable(_s(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,l=new Promise((f,y)=>{c=setTimeout(()=>{y(new Ue(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,l]),t)}finally{clearTimeout(c)}let p={type:"get_model_policy",...m?.parameters!==void 0?{parameters:m.parameters}:{}},d=m?.model;if(typeof d=="string")p.model=d;else if(d!==void 0){let{model:f,...y}=d;p.model=f,p.custom_model={...y,style:y.style??"openai"}}let g=m?.taskId?.trim();g&&(p.task_id=g);let h=m?.subTask?.trim();return h&&(p.sub_task=h),p}default:throw new Error(`Unhandled control request subtype: ${r??"unknown"}`)}}async initialize(){return this.initializationPromise||(this.initializationPromise=this.performInitialize()),this.initializationPromise}async performInitialize(){let e={type:"initialize",modelPolicyProvider:this.resolveModel!==void 0,supportsCatalogReadyInitialize:!0,supportsAvailableModelsUpdate:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(c=>{let l=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(l,c),l});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=Le(this.initConfig.permissionMode);r!==void 0&&(e.permissionMode=r)}this.initConfig.memory!==void 0&&(e.memory=this.initConfig.memory),this.initConfig.evolution!==void 0&&(e.evolution=this.initConfig.evolution),this.sdkMcpServers.size>0&&(e.sdkMcpServers=Array.from(this.sdkMcpServers.keys()),Object.keys(this.sdkMcpToolOverrides).length>0&&(e.sdkMcpToolOverrides=this.sdkMcpToolOverrides));let s=await this.request(e,{timeoutMs:n.INITIALIZE_TIMEOUT_MS});if(s&&typeof s=="object"){let r=s;this.initResponse=r,this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new Z(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 Z(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()}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:ta(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
13
+ `),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new Z(e)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?Le(e):e==="yolo"?"bypassPermissions":e;if(t===void 0)throw new Error("permissionMode is required.");await this.request({type:"set_permission_mode",mode:t,...this.initConfig.independentPlanModeControls===!0?{preservePlanMode:!0}:{}})}waitForFirstResult(){return this.firstResultReceived||this.closed?Promise.resolve():new Promise(e=>{if(this.abortController?.signal.aborted){e();return}this.firstResultReceivedResolve=e,this.abortController?.signal.addEventListener("abort",()=>e(),{once:!0})})}async setModel(e){await this.request({type:"set_model",model:e??""})}async setProxy(e){await this.request({type:"set_proxy",proxy:e||null})}async generateSessionTitle(e,t){return(await this.request({type:"generate_session_title",description:e,...t?.persist!==void 0?{persist:t.persist}:{}}))?.title??null}async askSideQuestion(e,t){await this.requireCliCapability(n.SIDE_QUESTION_CAPABILITY);let s=await this.request({subtype:"side_question",question:e,...t?.history?.length?{history:t.history.map(r=>({...r}))}:{}},{timeoutMs:0,signal:t?.signal});return s?.response==null?null:{response:s.response,synthetic:s.synthetic??!1,...s.refusal_fallback?{refusalFallback:{originalModel:s.refusal_fallback.original_model,fallbackModel:s.refusal_fallback.fallback_model,content:s.refusal_fallback.content}}:{}}}async addDirectories(e){if(!Array.isArray(e))throw new Error("directories must be an array");return await this.request({type:"add_directories",directories:e})}async applyFlagSettings(e){await this.request({type:"apply_flag_settings",settings:e})}async supportedCommands(){return(await this.initializationResult()).commands??[]}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=aa(e?.usage),s=ia(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){return await this.request({type:"reload_plugins"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new Z("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=Gn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(t){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",t)}this.closed=!0;for(let[,t]of this.pendingInboundRequests)t.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[t,s]of this.sdkMcpTransports){try{await s.close()}catch(r){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${t}":`,r)}Rs(t,e,this.pendingMcpResponses)}this.transport.close();try{await this.readLoopPromise}catch{}await this.flushTranscriptMirrorForLifecycle()}async[Symbol.asyncDispose](){await this.close()}};function Ks(n){return new Ke(n.transport,!1,n.canUseTool,void 0,void 0,void 0,{attachedInitialization:n.initialization,independentPlanModeControls:!0},n.onElicitation)}function de(n){return typeof n=="object"&&n!==null}function Ht(n){return typeof n=="number"&&Number.isFinite(n)}function Gt(n){return Object.keys(n).length>0}function Q(n,e,t){let s=e[t];Ht(s)&&(n[t]=s)}function Pe(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function gt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function $s(n){if(!de(n)||Array.isArray(n))return;let e={};return Q(e,n,"total"),Q(e,n,"used"),Q(e,n,"remaining"),Q(e,n,"percentage"),Pe(e,n,"unit"),Gt(e)?e:void 0}function ra(n){if(!de(n)||Array.isArray(n))return;let e=$s(n)??{};return Pe(e,n,"detailUrl"),Gt(e)?e:void 0}function oa(n){if(!de(n)||Array.isArray(n))return;let e={};return Q(e,n,"used"),Q(e,n,"cap"),Q(e,n,"remaining"),Q(e,n,"percentage"),gt(e,n,"available"),Pe(e,n,"unit"),Gt(e)?e:void 0}function ia(n){if(!de(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Ht(e)||e<0||!de(t)||Array.isArray(t))return;let s={};for(let[r,o]of Object.entries(t)){if(!de(o)||Array.isArray(o))continue;let i=o.credits;Ht(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function aa(n){if(!de(n)||Array.isArray(n))return null;let e={};Pe(e,n,"userId"),Pe(e,n,"userType"),Q(e,n,"totalUsagePercentage"),gt(e,n,"isHighestTier"),Q(e,n,"expiresAt"),Pe(e,n,"upgradeUrl"),gt(e,n,"isQuotaExceeded"),gt(e,n,"isPlanQuotaProrated");let t=$s(n.userQuota);t&&(e.userQuota=t);let s=ra(n.addOnQuota);s&&(e.addOnQuota=s);let r=oa(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function ua(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 Ls(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var ht=class{sendMcpMessage;isClosed=!1;onclose;onerror;onmessage;constructor(e){this.sendMcpMessage=e}async start(){}async send(e){if(this.isClosed)throw new Error("Transport is closed");this.sendMcpMessage(e)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}get closed(){return this.isClosed}};import{randomUUID as zs}from"crypto";var ca="QODER_CLOUD_AGENT_API_BASE",la="https://api.qoder.com/api/v1/cloud",ee={agentMessage:"agent.message",modelRequestEnd:"span.model_request_end",idle:"session.status_idle",error:"session.error",terminated:"terminated",userMessage:"user.message",userInterrupt:"user.interrupt"},da=1024,Bs=1*1024*1024,Qs=4*1024*1024,pa=8*1024,Vt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},yt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Yt=class extends Error{code="cloud_agent_api_error";status;constructor(e,t){super(`Cloud Agent API request failed with status ${e}: ${t}`),this.name="CloudAgentApiError",this.status=e}},ma=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Ws(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!ma.has(o));if(e.length>0)throw new Error(`options.experimentalCloudAgent cannot be combined with CLI runtime options: ${e.join(", ")}`);if(n.auth?.type!=="accessToken")throw new yt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Te(t)&&Wt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Te(s)&&Wt(s))throw new Error("options.experimentalCloudAgent.session must specify either id or create, not both.");if(s&&Te(s)&&t!==void 0)throw new Error("options.experimentalCloudAgent.agent cannot be combined with experimentalCloudAgent.session.id because an existing session already selects its agent.");let r=!!s&&Te(s);if(!r&&t===void 0)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(!r){if(!s||!Wt(s))throw new Error("options.experimentalCloudAgent.session.create is required when creating a Cloud Agent session.");if(typeof s.create.environment_id!="string"||s.create.environment_id.length===0)throw new Error("options.experimentalCloudAgent.session.create.environment_id is required when creating a Cloud Agent session.")}}function Te(n){return"id"in n&&n.id!==void 0}function Wt(n){return"create"in n&&n.create!==void 0}function Vs(n){return new Xt(n)}var Xt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Ca();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Gs();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=fa(e.options.auth,e.options.env),this.apiBase=ga(),this.inputStream=new X(()=>{this.close().catch(()=>{})});let t=e.options.abortController?.signal;t?.aborted?this.abortController.abort():t?.addEventListener("abort",()=>{this.close().catch(()=>{})},{once:!0}),this.sessionReadyPromise=this.initializeCloudSession(),this.readLoopPromise=this.readCloudEvents().catch(s=>{this.sseConnected.reject(s),this.closed||this.inputStream.error(s)}),this.streamInput(Pa(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=Ea(t);this.beginPendingTurn();let r=await this.postSessionEvents([{type:ee.userMessage,content:s}]);this.postedMessages+=1,this.activateTurn(r.find(o=>o.type===ee.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:ee.userInterrupt}])}async cancelAsyncMessage(e){this.unsupported("cancelAsyncMessage")}async stopTask(e){this.unsupported("stopTask")}async backgroundTasks(e){this.unsupported("backgroundTasks")}async setPermissionMode(e){this.unsupported("setPermissionMode")}async setModel(e){this.unsupported("setModel")}async setProxy(e){this.unsupported("setProxy")}async generateSessionTitle(e,t){this.unsupported("generateSessionTitle")}async addDirectories(e){this.unsupported("addDirectories")}async applyFlagSettings(e){this.unsupported("applyFlagSettings")}async supportedCommands(){this.unsupported("supportedCommands")}async getAvailableModels(){this.unsupported("getAvailableModels")}async listByokProviders(){this.unsupported("listByokProviders")}async validateByokModel(e){this.unsupported("validateByokModel")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Te(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...ya(r)}});t=Js(o,"Cloud session")}return this.sessionId=t,this.diagnostics?.record(`[cloud-agent] session ready: ${t}`),{sessionId:t,init:{commands:[],agents:[],output_style:"cloud-agent",available_output_styles:["cloud-agent"],models:[],account:{}}}}async resolveAgentId(){let{agent:e}=this.experimentalCloudAgent;if(!e)throw new Error("options.experimentalCloudAgent.agent is required when experimentalCloudAgent.session.id is not provided.");if(Te(e))return e.id;let t=await this.requestJson("/agents",{method:"POST",body:ha(e.create)});return Js(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 Ta(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 Hs(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 l=c.endsWith("\r")?c.slice(0,-1):c;if(this.consumeSseLine(l,o),this.closed)break}r.length>Bs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Bs} 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:va(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>Qs){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Qs} bytes; dropping event.`),t.id=void 0,t.event=void 0,t.data.length=0,t.dataBytes=0;return}t.data.push(o),t.dataBytes+=o.length;break}}handleSseEvent(e){if(this.closed)return;let t=U(e.data,"type")??e.event,s=U(e.data,"turn_id"),r={type:"cloud_agent_event",event:t,id:e.id,data:e.data,uuid:e.id??zs(),session_id:this.sessionId??U(e.data,"session_id")??""};if(e.id&&(this.lastSseEventId=e.id),this.inputStream.enqueue(r),!this.isCurrentTurnEvent(s)){this.bufferPendingTurnEvent(e,t,s);return}this.handleCurrentTurnEvent(e,t)}handleCurrentTurnEvent(e,t){switch(t){case ee.agentMessage:{let s=_a($e(e.data,"content"));s&&this.assistantTextParts.push(s);return}case ee.modelRequestEnd:this.captureUsage(e.data);return;case ee.idle:this.idleSeen=!0,this.finishIfIdle();return;case ee.error:this.emitErrorResult(e),this.finish();return;case ee.terminated:this.resultEmitted||this.emitSuccessResult(),this.finish();return}}beginPendingTurn(){this.currentTurnId=void 0,this.hasCurrentTurn=!1,this.pendingTurnEvents=[],this.assistantTextParts=[],this.latestUsage=Gs(),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>=da&&this.pendingTurnEvents.shift(),this.pendingTurnEvents.push({event:e,type:t,turnId:s}))}finishIfIdle(){this.closed||!this.idleSeen||this.activeInputStreams>0||this.postedMessages===0||(this.emitSuccessResult(),this.finish())}finishAfterSseClosed(){this.finishIfIdle(),!this.closed&&(!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)&&this.emitErrorResultMessage("Cloud Agent SSE stream closed before the current turn reached a terminal state."),this.finish())}shouldReconnectSse(){return!this.resultEmitted&&(this.hasCurrentTurn||this.postedMessages>0||this.activeInputStreams>0)}emitSuccessResult(){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"success",is_error:!1,result:this.assistantTextParts.join("")}))}emitErrorResult(e){this.emitErrorResultMessage(U(e.data,"error")??U(St(e.data,"error"),"message")??"Cloud Agent session failed.")}emitErrorResultMessage(e){this.resultEmitted||this.closed||(this.resultEmitted=!0,this.inputStream.enqueue({...this.buildResultBase(),subtype:"error_during_execution",is_error:!0,errors:[e]}))}buildResultBase(){let e=Date.now()-this.startedAt;return{type:"result",duration_ms:e,duration_api_ms:e,num_turns:Math.max(1,this.postedMessages),stop_reason:null,total_cost_usd:this.totalCostUsd,usage:this.latestUsage,modelUsage:this.latestModelUsage,permission_denials:[],uuid:zs(),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 Sa(s)}captureUsage(e){let t=St(e,"usage");if(!t)return;this.latestUsage=ka(this.latestUsage,t);let s=x(e,"total_cost_usd")??x(e,"cost_usd")??x(t,"total_cost_usd")??x(t,"cost_usd");s!==void 0&&(this.totalCostUsd+=s);let r=U(e,"model")??U(t,"model");if(r){let o=this.latestModelUsage[r]?.costUSD??0;this.latestModelUsage[r]=Ra(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 Hs(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 fa(n,e){if(n?.type!=="accessToken")throw new yt;if(typeof n.accessToken=="string")return n.accessToken;let t=n.accessToken.envVar,s=e&&Object.hasOwn(e,t)?e[t]:process.env[t];if(!s)throw new Vt(t);return s}function ga(){return process.env[ca]?.replace(/\/+$/,"")??la}function ha(n){return Zt({name:n.name,model:n.model,system:n.system,description:n.description,tools:n.tools,mcp_servers:n.mcp_servers,skills:n.skills,metadata:n.metadata})}function ya(n){return Zt({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>Zt({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function Zt(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function Js(n,e){let t=U(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function Sa(n){let e=ba(n,"data");return e?e.flatMap(t=>t===null||typeof t!="object"||Array.isArray(t)?[]:[{id:U(t,"id"),turnId:U(t,"turn_id"),type:U(t,"type")}]):[]}async function Hs(n){let e=await wa(n,pa);return new Yt(n.status,e||n.statusText||"unknown error")}async function wa(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 va(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function St(n,e){let t=$e(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ba(n,e){let t=$e(n,e);return Array.isArray(t)?t:void 0}function U(n,e){let t=$e(n,e);return typeof t=="string"?t:void 0}function x(n,e){let t=$e(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function $e(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function _a(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Ys(t)?t.text:"").filter(Boolean).join("")||void 0}function ka(n,e){let t=St(e,"cache_creation"),s=St(e,"server_tool_use");return{...n,cache_creation:{ephemeral_1h_input_tokens:x(t,"ephemeral_1h_input_tokens")??n.cache_creation.ephemeral_1h_input_tokens,ephemeral_5m_input_tokens:x(t,"ephemeral_5m_input_tokens")??n.cache_creation.ephemeral_5m_input_tokens},cache_creation_input_tokens:x(e,"cache_creation_input_tokens")??n.cache_creation_input_tokens,cache_read_input_tokens:x(e,"cache_read_input_tokens")??n.cache_read_input_tokens,input_tokens:x(e,"input_tokens")??n.input_tokens,output_tokens:x(e,"output_tokens")??n.output_tokens,server_tool_use:{web_fetch_requests:x(s,"web_fetch_requests")??n.server_tool_use.web_fetch_requests,web_search_requests:x(s,"web_search_requests")??n.server_tool_use.web_search_requests}}}function Ra(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 Ea(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Ys(t)?t.text:JSON.stringify(t)).join(`
16
+ `):JSON.stringify(e)}function Ys(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function Pa(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 Gs(){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 Ta(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function Ca(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as ja,chmod as sr,cp as qa,mkdtemp as Fa,mkdir as rr,realpath as or,rm as er,writeFile as Ua}from"fs/promises";import{homedir as La,tmpdir as Ka}from"os";import{dirname as $a,isAbsolute as ir,join as pe,relative as za,resolve as en,sep as Ba}from"path";import{homedir as Ma}from"os";import{join as Zs}from"path";var Oa=v.configDirName,Aa=v.cliHomeEnv,Ia=v.configDirEnv,Xs=200;function Da(){return process.env[Aa]||Ma()}function xa(){let n=process.env[Ia];return n||Zs(Da(),Oa)}function Ce(){return Zs(xa(),"projects")}function Na(n){let e=5381;for(let t=0;t<n.length;t++)e=e*33^n.charCodeAt(t);return e}function N(n){let e=n.replace(/[^a-zA-Z0-9]/g,"-");if(e.length<=Xs)return e;let t=Math.abs(Na(n)).toString(36);return`${e.slice(0,Xs)}-${t}`}var Qa=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ja=6e4;async function wt(n){if(n.resume===void 0&&!n.continue)return;let e=N(await Wa(n.cwd)),t=n.loadTimeoutMs??Ja,s=n.resume!==void 0?n.resume:await Va(n.store,e,t);if(s===void 0||!Qa.test(s))return;let r={projectKey:e,sessionId:s},o=await tr(n.store,r,t);if(!o)return;let i=n.store.listSubkeys?await tn(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let c of i){if(!Xa(c)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(c)}`);continue}let l=await tr(n.store,{...r,subpath:c},t);l&&a.push({subpath:c,entries:l})}let u;try{u=await Fa(pe(Ka(),"qoder-session-store-")),await sr(u,448),u=await or(u),await Ga(Ha(n.env),u);let c=pe(u,"projects",e),l=pe(c,s);await rr(c,{recursive:!0,mode:448}),await nr(pe(c,`${s}.jsonl`),o);for(let{subpath:p,entries:d}of a){let g=Za(l,`${p}.jsonl`),h=d.filter(y=>y.type==="agent_metadata"),f=d.filter(y=>y.type!=="agent_metadata");if(f.length>0&&await nr(g,f),h.length>0){let y={...h.at(-1)};delete y.type,await ar(g.slice(0,-6)+".meta.json",JSON.stringify(y))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await er(m,{recursive:!0,force:!0})}}}catch(c){throw u!==void 0&&await er(u,{recursive:!0,force:!0}),c}}function Ha(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??La();return en(n?.[v.configDirEnv]??process.env[v.configDirEnv]??pe(e,v.configDirName))}async function Ga(n,e){for(let t of[".auth","oauth_creds.json"]){let s=pe(n,t);try{await ja(s),await qa(s,pe(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Wa(n){let e=en(n??process.cwd());try{return await or(e)}catch{return e}}async function Va(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await tn(n.listSessions(e),t,"listSessions");if(!Array.isArray(s))throw new Error("SessionStore listSessions() must return an array");return s.slice().sort((r,o)=>o.mtime-r.mtime)[0]?.sessionId}async function tr(n,e,t){let s=await tn(n.load({...e}),t,"load");if(!(s===null||s.length===0)){if(!Array.isArray(s))throw new Error("SessionStore load() must return an array or null");return s.map((r,o)=>Ya(r,o))}}function Ya(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("\\")||ir(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function Za(n,e){let t=en(n,e),s=za(n,t);if(s===""||s===".."||s.startsWith(`..${Ba}`)||ir(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function nr(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
17
+ `);await ar(n,t?`${t}
18
+ `:"")}async function ar(n,e){await rr($a(n),{recursive:!0,mode:448}),await Ua(n,e,{encoding:"utf8",mode:384}),await sr(n,384)}async function tn(n,e,t){let s;n.catch(()=>{});try{return await Promise.race([n,new Promise((r,o)=>{s=setTimeout(()=>o(new Error(`SessionStore ${t} timed out after ${e}ms`)),e)})])}finally{s!==void 0&&clearTimeout(s)}}var eu=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function tu(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return eu.test(e)}function Me(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?tu(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 ur from"node:path";function Oe(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function ze(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function nu(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.generation.roots must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.generation.roots[${t}] must be an object`);if(Oe(s.id,`options.memory.generation.roots[${t}].id`),Oe(s.path,`options.memory.generation.roots[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.generation.roots contains duplicate id "${s.id}"`);if(e.add(s.id),s.access!==void 0&&s.access!=="read"&&s.access!=="read-write")throw new TypeError(`options.memory.generation.roots[${t}].access must be "read" or "read-write"`);if(s.indexFile!==void 0){Oe(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let r=s.indexFile.replaceAll("\\","/");if(ur.posix.isAbsolute(r)||ur.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function su(n){if(n===void 0)return;if(!Array.isArray(n)||n.length===0)throw new TypeError("options.memory.consumption.files must be a non-empty array");let e=new Set;for(let[t,s]of n.entries()){if(!s||typeof s!="object")throw new TypeError(`options.memory.consumption.files[${t}] must be an object`);if(Oe(s.id,`options.memory.consumption.files[${t}].id`),Oe(s.path,`options.memory.consumption.files[${t}].path`),e.has(s.id))throw new TypeError(`options.memory.consumption.files contains duplicate id "${s.id}"`);if(e.add(s.id),s.required!==void 0&&typeof s.required!="boolean")throw new TypeError(`options.memory.consumption.files[${t}].required must be a boolean`)}}function cr(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.memory must be an object");if(Array.isArray(n))throw new TypeError("options.memory must be an object");if(Object.keys(n).length===0)return{};if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.memory.mode must be "native" or "custom"');if(n.projectScope!==void 0&&typeof n.projectScope!="boolean")throw new TypeError("options.memory.projectScope must be a boolean");if(n.userScope!==void 0&&typeof n.userScope!="boolean")throw new TypeError("options.memory.userScope must be a boolean");let e=new Map;if(n.mode==="native"){if(n.projectScope===!1&&n.userScope===!1)throw new TypeError("options.memory native mode requires at least one enabled scope; use memory: {} to disable SDK memory");let i=Object.keys(n.generation??{}),a=Object.keys(n.consumption??{});if(i.some(u=>u!=="onResult")||a.some(u=>u!=="onResult"))throw new TypeError('options.memory mode "native" only accepts generation.onResult and consumption.onResult');return ze(n.generation?.onResult,"options.memory.generation.onResult"),ze(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");nu(s.roots),s.prompt!==void 0&&Oe(s.prompt,"options.memory.generation.prompt"),ze(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(ze(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(su(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"');ze(o.onResult,"options.memory.consumption.onResult"),r={enabled:o.enabled??!0,files:o.files?.map(i=>({...i,required:i.required??!1})),maxTokens:o.maxTokens,overflow:o.overflow,failureMode:o.failureMode}}return{config:{requester:"sdk",mode:n.mode,...n.projectScope!==void 0?{projectScope:n.projectScope}:{},...n.userScope!==void 0?{userScope:n.userScope}:{},generation:t,consumption:r},callbacks:{shouldGenerateCallbacks:e,onGenerationResult:s?.onResult,onConsumptionResult:o?.onResult}}}var vt=10;function ru(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function bt(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function lr(n){if(n!==void 0){if(!Number.isInteger(n)||n<1||n>10)throw new TypeError(`options.evolution.skill.generation.turnComplete.reviewThreshold must be an integer between 1 and ${10}`);return n}}function ou(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&&ru(n.prompt,"options.evolution.skill.generation.prompt"),n.maxSuggestions!==void 0&&(!Number.isInteger(n.maxSuggestions)||n.maxSuggestions<1||n.maxSuggestions>10))throw new TypeError("options.evolution.skill.generation.maxSuggestions must be an integer between 1 and 10");bt(n.onResult,"options.evolution.skill.generation.onResult");let t;if(n.turnComplete!==void 0){if(!n.turnComplete||typeof n.turnComplete!="object")throw new TypeError("options.evolution.skill.generation.turnComplete must be an object");if(n.turnComplete.enabled!==void 0&&typeof n.turnComplete.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.turnComplete.enabled must be a boolean");let s=lr(n.turnComplete.reviewThreshold);if(bt(n.turnComplete.shouldReview,"options.evolution.skill.generation.turnComplete.shouldReview"),n.turnComplete.timeoutMs!==void 0&&(!Number.isFinite(n.turnComplete.timeoutMs)||n.turnComplete.timeoutMs<=0))throw new TypeError("options.evolution.skill.generation.turnComplete.timeoutMs must be a positive finite number");if(n.turnComplete.onGateError!==void 0&&n.turnComplete.onGateError!=="skip"&&n.turnComplete.onGateError!=="report_failed")throw new TypeError('options.evolution.skill.generation.turnComplete.onGateError must be "skip" or "report_failed"');let r=n.turnComplete.shouldReview?"skill_evolution_should_review_0":void 0;r&&e.shouldReviewCallbacks.set(r,n.turnComplete.shouldReview),t={enabled:n.turnComplete.enabled??!0,reviewThreshold:s,shouldReviewCallbackId:r,timeoutMs:n.turnComplete.timeoutMs,onGateError:n.turnComplete.onGateError}}if(n.turnComplete!==void 0&&t?.enabled===!0&&n.enabled===!1)throw new TypeError("options.evolution.skill.generation.turnComplete cannot be enabled when generation.enabled is false");return{config:{enabled:n.enabled??!0,prompt:n.prompt,maxSuggestions:n.maxSuggestions,turnComplete:t},callbacks:{...e,onResult:n.onResult}}}function dr(n){if(n===void 0)return{};if(!n||typeof n!="object")throw new TypeError("options.evolution.skill must be an object");if(n.mode!=="native"&&n.mode!=="custom")throw new TypeError('options.evolution.skill.mode must be "native" or "custom"');let e=n.generation;if(n.mode==="native"){if(Object.keys(e??{}).some(i=>i!=="enabled"&&i!=="onResult"&&i!=="turnComplete"))throw new TypeError('options.evolution.skill mode "native" only accepts generation.enabled, generation.onResult, and generation.turnComplete.reviewThreshold');if(e?.enabled!==void 0&&typeof e.enabled!="boolean")throw new TypeError("options.evolution.skill.generation.enabled must be a boolean");let 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=lr(r?.reviewThreshold);return e?.enabled===!1?(bt(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(bt(e?.onResult,"options.evolution.skill.generation.onResult"),{config:{requester:"sdk",mode:"native",...o===void 0?{}:{generation:{turnComplete:{reviewThreshold:o}}}},callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}})}let t=ou(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as Xu}from"node:child_process";import{isDeepStrictEqual as Zu}from"node:util";import{createInterface as mu}from"node:readline";var S=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function rn(n){if(n.trim().length===0)throw new S("daemon protocol line must not be empty");let e;try{e=JSON.parse(n)}catch{throw new S("daemon protocol line must contain valid JSON")}let t=R(e,"daemon protocol frame");if(Object.hasOwn(t,"frame_type")||Object.hasOwn(t,"protocol_version")&&!Object.hasOwn(t,"type"))throw new S("daemon v1 frame envelopes are not supported on the v2 wire");switch(t.type){case"control_request":iu(t);break;case"control_response":au(t);break;case"event":I(t,["type","event","session_id","data"],"event frame"),E(t,"event"),kt(t),R(t.data,"event data");break;case"keep_alive":I(t,["type"],"keep_alive frame");break;case"session_input":case"session_output":throw new S(`${String(t.type)} is not supported on the v2 wire`);default:if(E(t,"type"),!cu(t.type))throw new S(`unknown daemon message type: ${String(t.type)}`);uu(t),kt(t)}return t}function pr(n){let e=JSON.stringify(n);return rn(e),e}function mr(n,e){let t=e.response.response;switch(n){case"initialize":{_t(e,"initialize response");let s=R(t,"initialize response");if(I(s,["daemon_protocol_version","daemon_version","capabilities"],"initialize response"),s.daemon_protocol_version!==2)throw new S(`unsupported daemon_protocol_version: ${String(s.daemon_protocol_version)}`);return E(s,"daemon_version"),du(s,"capabilities"),s}case"open_session":{let s=Be(e,"open_session response");return sn(t,"open_session"),{session_id:s}}case"list_sessions":{_t(e,"list_sessions response");let s=R(t,"list_sessions response");I(s,["sessions"],"list_sessions response");let r=s.sessions;if(!Array.isArray(r))throw new S("sessions must be an array");for(let[o,i]of r.entries())nn(R(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{Be(e,"rename_session response");let s=R(t,"rename_session response");return I(s,["session"],"rename_session response"),nn(R(s.session,"rename_session session"),"rename_session session"),s}case"subscribe_session":{let s=Be(e,"subscribe_session response"),r=R(t,"subscribe_session response");I(r,["initialization_result"],"subscribe_session response");let o=R(r.initialization_result,"initialization_result");return{session_id:s,initialization_result:o}}case"enable_remote_control":{_t(e,"enable_remote_control response");let s=R(t,"enable_remote_control response");return I(s,["environment_id"],"enable_remote_control response"),E(s,"environment_id"),s}case"update_session_metadata":{Be(e,"update_session_metadata response");let s=R(t,"update_session_metadata response");return I(s,["session"],"update_session_metadata response"),nn(R(s.session,"update_session_metadata session"),"update_session_metadata session"),s}case"unsubscribe_session":case"close_session":return Be(e,`${n} response`),sn(t,n),null;case"sync_session_registrations":case"disable_remote_control":case"delete_session":case"shutdown":return _t(e,`${n} response`),sn(t,n),null;default:throw new S(`unknown daemon command result method: ${String(n)}`)}}function iu(n){I(n,["type","request_id","session_id","request"],"control_request frame"),E(n,"request_id"),kt(n);let e=R(n.request,"control request");if(!(typeof e.type=="string"&&e.type.length>0)&&!(typeof e.subtype=="string"&&e.subtype.length>0))throw new S("control request must have a non-empty string type or subtype")}function au(n){I(n,["type","session_id","response"],"control_response frame"),kt(n);let e=R(n.response,"control response");E(e,"request_id");let t=E(e,"subtype");if(t==="success"){if(["error","code","retryable","details"].some(s=>Object.hasOwn(e,s)))throw new S("success control response must not include error fields");I(e,["subtype","request_id","response"],"success control response"),e.response!==void 0&&R(e.response,"success response result");return}if(t!=="error")throw new S(`unknown control response subtype: ${t}`);if(Object.hasOwn(e,"response"))throw new S("error control response must not include response");if(I(e,["subtype","request_id","error","code","retryable","details","pending_permission_requests"],"error control response"),E(e,"error"),e.code!==void 0&&E(e,"code"),e.retryable!==void 0&&lu(e,"retryable"),e.details!==void 0&&R(e.details,"control response details"),e.pending_permission_requests!==void 0&&!Array.isArray(e.pending_permission_requests))throw new S("pending_permission_requests must be an array")}function nn(n,e){I(n,["local_session_id","remote_session_id","environment_id","title","cwd","extra","state","created_at","updated_at"],e),E(n,"local_session_id");for(let s of["remote_session_id","environment_id","cwd"])n[s]!==void 0&&E(n,s);n.extra!==void 0&&R(n.extra,`${e}.extra`),E(n,"title");let t=E(n,"state");if(!["pending","ready","inactive","failed"].includes(t))throw new S(`${e} has invalid state: ${t}`);E(n,"created_at"),E(n,"updated_at")}function sn(n,e){if(n!==void 0)throw new S(`${e} success must omit response`)}function Be(n,e){let t=n;try{return E(t,"session_id")}catch{throw new S(`${e} requires a valid session_id`)}}function _t(n,e){if(Object.hasOwn(n,"session_id"))throw new S(`${e} must not include session_id`)}function kt(n){let e=n;e.session_id!==void 0&&E(e,"session_id")}function uu(n){for(let e of["session_epoch","sequence"])if(Object.hasOwn(n,e))throw new S(`${e} is reserved for daemon-internal Session ordering`)}function cu(n){return typeof n=="string"&&["user","assistant","stream_event","result","system","prompt_suggestion","command_lifecycle","control_cancel_request","control_cancel","transcript_mirror"].includes(n)}function R(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw new S(`${e} must be a JSON object`);return n}function E(n,e){let t=n[e];if(typeof t!="string"||t.length===0)throw new S(`${e} must be a non-empty string`);return t}function lu(n,e){let t=n[e];if(typeof t!="boolean")throw new S(`${e} must be a boolean`);return t}function du(n,e){let t=n[e];if(!Array.isArray(t)||t.some(s=>typeof s!="string"))throw new S(`${e} must be an array of strings`);return t}function I(n,e,t){let s=new Set(e),r=Object.keys(n).find(o=>!s.has(o));if(r!==void 0)throw new S(`${t} contains unknown field: ${r}`)}var Qe=class{constructor(e,t){this.connection=e;this.options=t;this.remoteSessionId="remoteSessionId"in t?t.remoteSessionId:void 0}messages=new X;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;subscribeResult;remoteSessionId;initialize(){return this.initializePromise||(this.initializePromise=this.open(),this.initializePromise.catch(()=>{})),this.initializePromise}async initializationResult(){if(await this.initialize(),!this.subscribeResult)throw new Error("Daemon Session transport is not attached");let e=this.subscribeResult.initialization_result;return this.updateCommandLifecycleCapability(e),e}write(e){if(this.closed)throw new Error("Transport is not ready or has been closed");let t=pu(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=fr(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){if(this.closed)return;this.closed=!0,this.cleanup(),this.messages.done();let e=this.sessionId;e&&this.startRelease(e)}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t;if(this.remoteSessionId!==void 0)this.subscribeResult=await this.connection.subscribeSession(this.remoteSessionId,this),t=this.subscribeResult.session_id;else{let s=this.options;t=await this.connection.openSession({worker_args:[...s.workerArgs],...s.cwd!==void 0?{cwd:s.cwd}:{},...s.configDir!==void 0?{config_dir:s.configDir}:{},...s.extra!==void 0?{extra:structuredClone(s.extra)}:{}},this)}if(this.sessionId=t,e=t,this.closed){await this.releaseSessionOnce(t);return}this.flushingPendingMessages=!0;try{for(;this.pendingMessages.length>0;){let s=this.pendingMessages.map(r=>fr(r,t));this.pendingMessages.splice(0);for(let r of s)await this.connection.sendSessionMessage(r)}}finally{this.flushingPendingMessages=!1}}catch(t){throw e!==void 0&&this.startRelease(e),this.fail(t),t}}failAndRelease(e){let t=this.sessionId;t!==void 0&&this.startRelease(t),this.fail(e)}startRelease(e){this.releaseSessionOnce(e).catch(()=>{})}releaseSessionOnce(e){return this.releasePromise||(this.releasePromise=this.releaseSession(e).catch(t=>{throw this.connection.fail(t),t})),this.releasePromise}releaseSession(e){return this.remoteSessionId!==void 0?this.connection.unsubscribeSession(e):this.connection.closeSession(e)}trackOutboundCommand(e){if(!this.commandLifecycleSupported||e.type!=="user")return;let t=e.uuid;typeof t=="string"&&t.trim().length>0&&this.pendingCommandUuids.add(t)}observeCapabilities(e){e.type!=="system"||e.subtype!=="init"||this.updateCommandLifecycleCapability(e)}updateCommandLifecycleCapability(e){let t=e.capabilities;this.commandLifecycleSupported=Array.isArray(t)&&t.includes("msg_lifecycle_v1")}observeCommandLifecycle(e){if(e.type!=="command_lifecycle"||e.state!=="completed"&&e.state!=="cancelled"&&e.state!=="discarded")return;let t=e.command_uuid;typeof t=="string"&&this.pendingCommandUuids.delete(t)}maybeCloseAfterResult(){!this.inputEnded||!this.resultReceived||this.commandLifecycleSupported&&this.pendingCommandUuids.size>0||this.closeAfterResult()}async closeAfterResult(){if(this.closed)return;this.closed=!0,this.cleanup();let e=this.sessionId;try{e&&await this.releaseSessionOnce(e),this.messages.done()}catch(t){this.messages.error(t)}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function pu(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 fr(n,e){if(Object.hasOwn(n,"session_id")&&n.session_id!==e)throw new Error(`Query message session_id must match daemon Session: expected ${e}, received ${String(n.session_id)}`);return{...n,session_id:e}}var an="multi_session_v2",gr="remote_control_v1",hr="session_title_sync_v1",yr="session_delete_v1",un="session_store_file_checkpointing_v1",cn="session_store_fork_barrier_v1",fu=3e4,Rt=3e4,gu=125e3,Et=6e4,Sr=12e4,hu=5e3,yu=1024,Su=64,wu=8*1024*1024,vu=256,bu=32*1024*1024,_u=new Set(["daemon.auth.fetch_job_token","daemon.auth.fetch_service_account_token","daemon.session_store.list_all","daemon.session_store.load","daemon.session_store.append","daemon.session_store.delete","daemon.session_store.materialize","daemon.session_store.release_materialization","daemon.session_store.update_metadata","daemon.session.resolve_remote_launch"]),Ae=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}},j=class extends Error{code;retryable;details;constructor(e){super(e.message),this.name="DaemonRequestError",this.code=e.code,this.retryable=e.retryable,this.details=e.details}},Pt=class{input;requestHandler;pendingRequests=new Map;timedOutRequestIds=new Set;activeInboundRequestIds=new Set;sessions=new Map;closedSessionIds=new Set;pendingSessionMessages=new Map;pendingSessionMessageBytes=new Map;pendingSessionMessageFrameCount=0;pendingSessionMessageByteCount=0;maxFrameBytes;readTask;writeChain=Promise.resolve();nextRequestId=1;initializing=!1;initialized=!1;capabilities=new Set;stopping=!1;failure;remoteControlFailureListener;daemonEventListeners=new Set;failureListeners=new Set;constructor(e){if(this.input=e.input,this.requestHandler=e.requestHandler,this.maxFrameBytes=e.maxFrameBytes??z,!Number.isSafeInteger(this.maxFrameBytes)||this.maxFrameBytes<=0)throw new TypeError("maxFrameBytes must be a positive safe integer");this.readTask=this.readOutput(e.output)}async initialize(e,t=[],s=fu){if(this.initialized)throw new S("daemon connection is already initialized");if(this.initializing)throw new S("daemon initialize is already in progress");this.initializing=!0;let r,o=typeof t=="number"?[]:t,i=typeof t=="number"?t:s,a=this.request("initialize",{daemon_protocol_version:2,sdk_version:e,capabilities:[an,...o]}),u=new Promise((l,m)=>{r=setTimeout(()=>{let p=new Error(`Qoder CLI daemon did not initialize within ${i}ms`);this.fail(p),m(p)},i)}),c;try{c=await Promise.race([a,u])}finally{this.initializing=!1,r&&clearTimeout(r)}if(!c.capabilities.includes(an))throw new S(`daemon is missing required capability: ${an}`);for(let l of c.capabilities)this.capabilities.add(l);this.initialized=!0}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Qe(this,e)}supportsCapability(e){return this.capabilities.has(e)}createAttachedSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Qe(this,{remoteSessionId:e})}onRemoteControlFailure(e){this.remoteControlFailureListener=e}onDaemonEvent(e){return this.daemonEventListeners.add(e),()=>this.daemonEventListeners.delete(e)}onFailure(e){return this.failureListeners.add(e),this.failure&&e(this.failure),()=>this.failureListeners.delete(e)}async openSession(e,t){return(await this.request("open_session",e,t,void 0,Sr)).session_id}subscribeSession(e,t){return this.request("subscribe_session",{remote_session_id:e},t,void 0,Sr)}enableRemoteControl(e){return this.capabilities.has(gr)?this.request("enable_remote_control",e,void 0,void 0,Et):Promise.reject(new S(`daemon is missing required capability: ${gr}`))}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,gu,"request")).sessions}renameSession(e,t){return this.capabilities.has(hr)?this.request("rename_session",{title:t},void 0,e,Rt):Promise.reject(new S(`daemon is missing required capability: ${hr}`))}async disableRemoteControl(){await this.request("disable_remote_control",{},void 0,void 0,Et)}async syncSessionRegistrations(e){await this.request("sync_session_registrations",{local_session_ids:e},void 0,void 0,Et)}updateSessionMetadata(e,t){return this.request("update_session_metadata",{extra:t},void 0,e,Rt)}sendSessionMessage(e){return this.writeFrame(e)}async closeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("close_session",{},void 0,e,Rt)}async deleteSession(e){if(!this.capabilities.has(yr))throw new S(`daemon is missing required capability: ${yr}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,Et)}async unsubscribeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("unsubscribe_session",{},void 0,e,Rt)}async shutdown(e=hu){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 S("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,l)=>{let m={method:e,resolve:p=>c(p),reject:l,...s?{sessionTransport:s}:{},...r!==void 0?{sessionId:r}:{}};o!==void 0&&(m.timeout=setTimeout(()=>{if(this.pendingRequests.get(a)!==m)return;let p=new S(`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 d=this.pendingRequests.get(a);d?.timeout&&clearTimeout(d.timeout),this.pendingRequests.delete(a),l(p),d?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new V(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=mu({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=ku(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(rn(r))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(new Error("Daemon connection closed"),!1)}catch(r){this.fail(r)}finally{s.close(),e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="control_response"){let s=e,r=s.response.request_id;if(this.pendingRequests.has(r)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(r))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,r=Ru(s);if(r==="valid"){this.acceptRequest(s);return}if(r==="contradictory")throw new S(`contradictory daemon reverse RPC routing markers: ${s.request_id}`)}if(t.type==="event"){this.acceptEvent(e);return}this.routeSessionMessage(t)}}rememberTimedOutRequestId(e){if(this.timedOutRequestIds.size>=yu){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 S(`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 S(`daemon output has unknown session_id: ${t}`)}acceptControlResponse(e){let t=e.response.request_id,s=this.pendingRequests.get(t);if(!s)throw new S(`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 S(`${s.method} response session_id does not match request: expected ${s.sessionId}, received ${String(e.session_id)}`));return}if(this.pendingRequests.delete(t),e.response.subtype==="error"){if(s.method==="initialize"&&e.response.code==="PROTOCOL_VERSION_UNSUPPORTED"){s.reject(new G("1","2"));return}s.reject(new Ae({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 G(String(o),String(2));let i=mr(s.method,r);if(s.sessionTransport){let a=i.session_id;if(typeof a!="string"||a.length===0)throw new S(`${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 l=new S(`daemon returned duplicate session_id: ${a}`);throw this.fail(l),l}this.sessions.set(a,s.sessionTransport);for(let l of u)s.sessionTransport.acceptOutput(l)}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 S(`${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>wu||this.pendingSessionMessageFrameCount+1>vu||this.pendingSessionMessageByteCount+r>bu)throw new S("daemon pre-response Session output exceeded its bounded buffer");s.push(t),this.pendingSessionMessages.set(e,s),this.pendingSessionMessageBytes.set(e,o+r),this.pendingSessionMessageFrameCount+=1,this.pendingSessionMessageByteCount+=r}takePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)??[];return this.deletePendingSessionMessages(e),t}deletePendingSessionMessages(e){let t=this.pendingSessionMessages.get(e)?.length??0,s=this.pendingSessionMessageBytes.get(e)??0;this.pendingSessionMessages.delete(e),this.pendingSessionMessageBytes.delete(e),this.pendingSessionMessageFrameCount-=t,this.pendingSessionMessageByteCount-=s}clearPendingSessionMessages(){this.pendingSessionMessages.clear(),this.pendingSessionMessageBytes.clear(),this.pendingSessionMessageFrameCount=0,this.pendingSessionMessageByteCount=0}rejectLegacyInitialize(e){let t=this.pendingRequests.get(e);return t?.method!=="initialize"?!1:(this.pendingRequests.delete(e),t.reject(new G("1","2")),!0)}acceptRequest(e){if(!this.initialized){this.writeInboundError(e.request_id,"DAEMON_NOT_INITIALIZED","daemon reverse RPC is unavailable before initialize completes");return}if(this.activeInboundRequestIds.has(e.request_id)){this.writeInboundError(e.request_id,"DUPLICATE_REQUEST_ID",`daemon request_id is already active: ${e.request_id}`);return}if(!this.requestHandler){this.writeInboundError(e.request_id,"METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${e.request.type}`);return}this.activeInboundRequestIds.add(e.request_id),Promise.resolve().then(()=>this.requestHandler(e)).then(t=>{let s={type:"control_response",response:{subtype:"success",request_id:e.request_id,...t===null?{}:{response:t}}};return this.writeFrame(s)}).catch(t=>{let s=t instanceof j?t:void 0,r={type:"control_response",response:{subtype:"error",request_id:e.request_id,code:s?.code??"SDK_REQUEST_FAILED",error:t instanceof Error?t.message:String(t),retryable:s?.retryable??!1,...s?.details?{details:s.details}:{}}};return this.writeFrame(r)}).catch(t=>this.fail(t)).finally(()=>{this.activeInboundRequestIds.delete(e.request_id)})}writeInboundError(e,t,s){let r={type:"control_response",response:{subtype:"error",request_id:e,code:t,error:s,retryable:!1}};this.writeFrame(r).catch(o=>this.fail(o))}acceptEvent(e){if(e.event==="session_deleted"&&e.session_id!==void 0){let s=this.sessions.get(e.session_id);this.sessions.delete(e.session_id),this.closedSessionIds.add(e.session_id),s?.fail(new Ae({code:"SESSION_DELETED",message:`Session was deleted: ${e.session_id}`,retryable:!1}))}for(let s of this.daemonEventListeners)try{s(e)}catch{}if(e.event==="session_deleted")return;if(e.event==="remote_control_state_changed"&&e.session_id===void 0){this.acceptRemoteControlEvent(e.data);return}if(e.event!=="session_state_changed"||e.session_id===void 0||e.data.state!=="failed")return;let t=this.sessions.get(e.session_id);t&&(this.sessions.delete(e.session_id),this.closedSessionIds.add(e.session_id),t.fail(Eu(e.data)))}acceptRemoteControlEvent(e){if(e.state!=="failed")return;let t=e.environment_id;if(typeof t!="string"||t.length===0)return;let s=e.error,r=typeof s=="object"&&s!==null&&!Array.isArray(s)?s:{},o=typeof r.code=="string"&&r.code.length>0?r.code:"REMOTE_CONTROL_RUNTIME_FAILED",i=typeof r.message=="string"&&r.message.length>0?r.message:"Remote Control runtime failed";this.remoteControlFailureListener?.({environmentId:t,error:new Ae({code:o,message:i,retryable:!1})})}writeFrame(e){let t;try{t=`${pr(e)}
19
+ `,ve(t,this.maxFrameBytes,"SDK daemon input")}catch(r){let o=r instanceof Error?r:new Error(String(r));return this.fail(o),Promise.reject(o)}let s=this.writeChain.then(()=>new Promise((r,o)=>{this.input.write(t,"utf8",i=>{if(i){o(i);return}r()})}));return this.writeChain=s.catch(()=>{}),s.catch(r=>this.fail(r)),s}};function ku(n){let e;try{e=JSON.parse(n)}catch{return}if(!wr(e)||!vr(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(!(!wr(t)||!vr(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 wr(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function vr(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function Ru(n){let e=_u.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 Eu(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 D(s,{exitCode:r,signal:o,stderr:i})}import{randomUUID as Pu}from"node:crypto";function J(n,e="extra"){if(!br(n))throw new TypeError(`${e} must be a JSON object`);return ln(n,e,new Set),structuredClone(n)}function ln(n,e,t){if(!(n===null||typeof n=="string"||typeof n=="boolean")){if(typeof n=="number"){if(Number.isFinite(n))return;throw new TypeError(`${e} must contain finite JSON numbers`)}if(typeof n!="object")throw new TypeError(`${e} must contain only JSON values`);if(t.has(n))throw new TypeError(`${e} must not contain circular references`);if(t.add(n),Array.isArray(n))n.forEach((s,r)=>ln(s,`${e}[${r}]`,t));else{if(!br(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))ln(r,`${e}.${s}`,t)}t.delete(n)}}function br(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Tu=3e4,Cu=256,kr=512*1024;function Mu(n){return mn([n])}var Tt=class extends j{constructor(e){let t={...e.details??{},...e.operation?{operation:e.operation}:{}};super({code:e.code,message:e.message,retryable:e.retryable??!1,...Object.keys(t).length>0?{details:t}:{}}),this.name="DaemonSessionStoreRpcError"}};function Rr(n,e={}){let t=dn(e.callbackTimeoutMs??Tu,"callbackTimeoutMs"),s=dn(e.maxEntriesPerPage??Cu,"maxEntriesPerPage"),r=dn(e.maxPayloadBytes??kr,"maxPayloadBytes"),o=new Map,i=!1,a;return Object.assign(async c=>{if(i)throw q("SESSION_STORE_DISPOSED","SessionStore daemon connection is closed");switch(c.request.type){case"daemon.session_store.list_all":return Ou(n,c,t,s,r);case"daemon.session_store.load":return Au(n,c,t,s,r);case"daemon.session_store.append":return Iu(n,c,t,s,r);case"daemon.session_store.update_metadata":return xu(n,c,t);case"daemon.session_store.delete":return Du(n,c,t);case"daemon.session_store.materialize":return Nu(n,c,t,o);case"daemon.session_store.release_materialization":return ju(c,t,o);default:throw q("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${c.request.type}`)}},{dispose(){return a||(i=!0,a=Promise.all([...o.keys()].map(c=>Er(c,t,o))).then(()=>{}),a.catch(()=>{a=void 0}),a)}})}async function Ou(n,e,t,s,r){let o=fe(e,["cursor"]),i=Cr(o.cursor),a=await ge("list_all",t,!0,()=>n.listAllSessions());if(!Array.isArray(a))throw q("SESSION_STORE_OPERATION_FAILED","SessionStore listAllSessions() must return an array",!0,"list_all");let u=a.map((l,m)=>Fu(qu(l,`sessions[${m}]`))),c=Mr(u,i,s,r,"list_all");return{sessions:c.items,next_cursor:c.nextCursor}}async function Au(n,e,t,s,r){let o=fe(e,["key","cursor"]),i=Ie(o.key,"key"),a=Cr(o.cursor),u=await ge("load",t,!0,()=>n.load(i));if(u===null)return{found:!1,entries:[],next_cursor:null};if(!Array.isArray(u))throw q("SESSION_STORE_OPERATION_FAILED","SessionStore load() must return an array or null",!0,"load");let c=u.map((m,p)=>Tr(m,`entries[${p}]`)),l=Mr(c,a,s,r,"load");return{found:!0,entries:l.items,next_cursor:l.nextCursor}}async function Iu(n,e,t,s,r){let o=fe(e,["key","entries"]),i=Ie(o.key,"key");if(!Array.isArray(o.entries))throw P("entries must be an array");if(o.entries.length>s)throw fn(`entries exceeds the ${s} entry batch limit`,{operation:"append",entryCount:o.entries.length,maxEntriesPerBatch:s});let a=o.entries.map((u,c)=>Tr(u,`entries[${c}]`));return Uu(a,r,{operation:"append"}),await ge("append",t,!1,()=>n.append(i,a)),null}async function Du(n,e,t){let s=fe(e,["key"]),r=Ie(s.key,"key");if(!n.delete)throw q("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore delete() is not implemented",!1,"delete");return await ge("delete",t,!1,()=>n.delete(r)),null}async function xu(n,e,t){let s=fe(e,["key","extra"]),r=Ie(s.key,"key");if(r.subpath!==void 0)throw P("key.subpath is not allowed for Session metadata");if(!n.updateSessionMetadata)throw q("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore updateSessionMetadata() is not implemented",!1,"update_metadata");let o=Pr(s.extra,"extra");return await ge("update_metadata",t,!1,()=>n.updateSessionMetadata(r,{extra:o})),null}async function Nu(n,e,t,s){let r=fe(e,["key","cwd"]),o=Ie(r.key,"key");if(o.subpath!==void 0)throw P("key.subpath is not allowed for materialization");let i=me(r.cwd,"cwd"),a,u;try{u=await ge("materialize",t,!0,()=>(a=wt({store:n,cwd:i,resume:o.sessionId,loadTimeoutMs:t}),a))}catch(l){throw a?.then(m=>m?.cleanup()).catch(()=>{}),l}if(!u)throw q("SESSION_STORE_SESSION_NOT_FOUND","SessionStore has no materializable transcript for the requested Session",!1,"materialize");if(u.projectKey!==o.projectKey||u.sessionId!==o.sessionId)throw await u.cleanup().catch(()=>{}),q("SESSION_STORE_KEY_MISMATCH","SessionStore key does not match the requested cwd",!1,"materialize");let c=`materialized_${Pu()}`;return s.set(c,{materialized:u}),{lease_id:c,config_dir:u.configDir}}async function ju(n,e,t){let s=fe(n,["lease_id"]),r=me(s.lease_id,"lease_id");return await Er(r,e,t),null}async function Er(n,e,t){let s=t.get(n);if(s){s.releasePromise||(s.releasePromise=ge("release_materialization",e,!0,()=>s.materialized.cleanup()));try{await s.releasePromise,t.delete(n)}catch(r){throw s.releasePromise=void 0,r}}}function fe(n,e){let s=Object.keys(n.request).find(r=>r!=="type"&&!e.includes(r));if(s)throw P(`request contains unknown field: ${s}`);return n.request}function Ie(n,e){let t=pn(n,e),s=["projectKey","sessionId","subpath"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw P(`${e} contains unknown field: ${r}`);let o=me(t.projectKey,`${e}.projectKey`),i=me(t.sessionId,`${e}.sessionId`),a=t.subpath;if(a!==void 0&&(typeof a!="string"||!a))throw P(`${e}.subpath must be a non-empty string`);return{projectKey:o,sessionId:i,...typeof a=="string"?{subpath:a}:{}}}function qu(n,e){let t=pn(n,e),s=["key","title","lastActiveAt","cwd","extra"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw P(`${e} contains unknown field: ${r}`);let o=me(t.lastActiveAt,`${e}.lastActiveAt`);if(!Number.isFinite(Date.parse(o)))throw P(`${e}.lastActiveAt must be an ISO timestamp`);let i=Ie(t.key,`${e}.key`);if(i.subpath!==void 0)throw P(`${e}.key must identify a main Session`);let a=t.extra===void 0?void 0:Pr(t.extra,`${e}.extra`);return{key:i,title:_r(t.title,`${e}.title`),lastActiveAt:o,cwd:_r(t.cwd,`${e}.cwd`),...a===void 0?{}:{extra:a}}}function Fu(n){return{key:{projectKey:n.key.projectKey,sessionId:n.key.sessionId,...n.key.subpath===void 0?{}:{subpath:n.key.subpath}},title:n.title,last_active_at:n.lastActiveAt,cwd:n.cwd,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function Pr(n,e){try{return J(n,e)}catch(t){throw P(t instanceof Error?t.message:`${e} must be a JSON object`)}}function Tr(n,e){let t=pn(n,e);me(t.type,`${e}.type`);try{return JSON.parse(JSON.stringify(t))}catch{throw P(`${e} must be JSON-safe`)}}function pn(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw P(`${e} must be an object`);return n}function me(n,e){if(typeof n!="string"||n.length===0)throw P(`${e} must be a non-empty string`);return n}function _r(n,e){let t=me(n,e);if(t.trim().length===0)throw P(`${e} must be a non-empty string`);return t}function Cr(n){if(n===void 0)return 0;if(typeof n!="string"||!/^(0|[1-9]\d*)$/.test(n))throw P("cursor must be a non-negative integer string");let e=Number(n);if(!Number.isSafeInteger(e))throw P("cursor exceeds the supported range");return e}function Mr(n,e,t,s,r){if(e>n.length)throw P("cursor is beyond the current result set");let o=[],i=2;for(let u=e;u<n.length;u+=1){let c=mn(n[u]),l=c+(o.length?1:0),m=c+2;if(m>s&&o.length===0)throw fn("one SessionStore item exceeds the payload limit",{operation:r,cursor:String(e),index:u,serializedBytes:m,maxPayloadBytes:s});if(o.length>=t||i+l>s)break;o.push(n[u]),i+=l}let a=e+o.length;return{items:o,nextCursor:a<n.length?String(a):null}}function Uu(n,e,t){let s=mn(n);if(s>e)throw fn(`payload exceeds the ${e} byte limit`,{...t,serializedBytes:s,maxPayloadBytes:e})}function mn(n){return Buffer.byteLength(JSON.stringify(n),"utf8")}async function ge(n,e,t,s){let r;try{return await Promise.race([Promise.resolve().then(s),new Promise((o,i)=>{r=setTimeout(()=>i(q("SESSION_STORE_TIMEOUT",`SessionStore ${n} timed out after ${e}ms`,t,n)),e)})])}catch(o){throw o instanceof Tt?o:q("SESSION_STORE_OPERATION_FAILED",o instanceof Error?o.message:String(o),t,n)}finally{r&&clearTimeout(r)}}function dn(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`);return n}function P(n){return q("SESSION_STORE_INVALID_REQUEST",n)}function fn(n,e){return q("SESSION_STORE_PAYLOAD_TOO_LARGE",n,!1,void 0,e)}function q(n,e,t=!1,s,r){return new Tt({code:n,message:e,retryable:t,operation:s,details:r})}var Lu=3e4;function Ku(n,e=Lu){return Ju(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return $u(n,t,e);case"daemon.auth.fetch_service_account_token":return zu(n,t,e);default:throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}function Or(n){let e=Ku(n.auth,n.callbackTimeoutMs);return t=>{if(t.request.type.startsWith("daemon.session_store.")){if(n.sessionStoreHandler)return n.sessionStoreHandler(t);throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}if(t.request.type==="daemon.session.resolve_remote_launch"){if(n.remoteSessionLaunchHandler)return n.remoteSessionLaunchHandler(t);throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}return e(t)}}async function $u(n,e,t){if(n.type!=="jobToken")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Ar(e,["reason","session_id"]),r=Ir(s.reason),o=Bu(s.session_id,"session_id"),i=new AbortController;try{let a=await Dr(()=>n.fetchJobToken({requestId:e.request_id,reason:r,sessionId:o},{signal:i.signal}),t,i);if(!a||typeof a.token!="string"||!a.token)throw M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback did not provide a token");return{token:a.token}}catch(a){throw a instanceof j?a:M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function zu(n,e,t){if(n.type!=="serviceAccount"||typeof n.fetchServiceAccountToken!="function")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host Service Account token callback is not configured");let s=Ar(e,["reason","required_scopes"]);Ir(s.reason),Qu(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await Dr(()=>n.fetchServiceAccountToken(),t,r);if(!o||typeof o.token!="string"||!o.token)throw M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback did not provide a token");let i=o.expiresAt;if(i!==void 0&&(!Number.isFinite(i)||i<1e12))throw M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback returned invalid expiresAt");return{token:o.token,...i!==void 0?{expires_at:i}:{}}}catch(o){throw o instanceof j?o:M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function Ar(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw M("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function Ir(n){if(n!=="initial"&&n!=="unauthorized")throw M("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function Bu(n,e){if(n!==void 0){if(typeof n!="string"||!n)throw M("DAEMON_AUTH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}}function Qu(n,e){if(!Array.isArray(n)||n.some(t=>typeof t!="string"))throw M("DAEMON_AUTH_INVALID_REQUEST",`${e} must be an array of strings`);return n}async function Dr(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 Ju(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function M(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var Hu=3e4;function Nr(n,e=Hu){return async t=>{if(t.request.type!=="daemon.session.resolve_remote_launch")throw te("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`);let s=Gu(t,["remote_session_id","extra"]),r=xr(s.remote_session_id,"remote_session_id"),o=s.extra===void 0?void 0:Wu(s.extra,"extra"),i;try{let a=await Promise.race([n({remoteSessionId:r,...o===void 0?{}:{extra:o}}),new Promise((l,m)=>{i=setTimeout(()=>m(te("REMOTE_SESSION_LAUNCH_TIMEOUT",`resolveRemoteSessionLaunch() timed out after ${e}ms`,!0)),e)})]);if(!a||typeof a!="object")throw te("REMOTE_SESSION_LAUNCH_INVALID_RESULT","resolveRemoteSessionLaunch() must return a launch object");let u=xr(a.cwd,"cwd"),c=a.additionalDirectories;if(c!==void 0&&(!Array.isArray(c)||c.some(l=>typeof l!="string"||l.trim().length===0)))throw te("REMOTE_SESSION_LAUNCH_INVALID_RESULT","additionalDirectories must contain non-empty strings");return{cwd:u,...c===void 0?{}:{additional_directories:[...c]}}}catch(a){throw a instanceof j?a:te("REMOTE_SESSION_LAUNCH_FAILED",a instanceof Error?a.message:"resolveRemoteSessionLaunch() failed",!0)}finally{i&&clearTimeout(i)}}}function Gu(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw te("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function xr(n,e){if(typeof n!="string"||n.trim().length===0)throw te("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",`${e} must be a non-empty string`);return n}function Wu(n,e){try{return J(n,e)}catch(t){throw te("REMOTE_SESSION_LAUNCH_INVALID_REQUEST",t instanceof Error?t.message:`${e} must be a JSON object`)}}function te(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var Vu=[250,1e3,5e3];function jr(n,e){let t=new gn(e.sync,e.retryDelaysMs??Vu);return{store:{listAllSessions:()=>n.listAllSessions(),load:r=>n.load(r),async append(r,o){await n.append(r,o),r.subpath===void 0&&o.length>0&&t.notify(r.sessionId)},...n.updateSessionMetadata?{async updateSessionMetadata(r,o){await n.updateSessionMetadata(r,o)}}:{},...n.listSessions?{listSessions:r=>n.listSessions(r)}:{},...n.delete?{delete:r=>n.delete(r)}:{},...n.listSubkeys?{listSubkeys:r=>n.listSubkeys(r)}:{}},flush:()=>t.flush(),dispose:()=>t.dispose()}}var gn=class{constructor(e,t){this.sync=e;this.retryDelaysMs=t}pending=new Set;running;disposed=!1;notify(e){this.disposed||(this.pending.add(e),this.run())}flush(){return this.run()}dispose(){this.disposed=!0,this.pending.clear()}run(){if(this.running)return this.running;if(this.disposed||this.pending.size===0)return Promise.resolve();let e=this.drain();return this.running=e.finally(()=>{this.running=void 0,!this.disposed&&this.pending.size>0&&this.run()}),this.running}async drain(){let e=0;for(;!this.disposed&&this.pending.size>0;){let t=[...this.pending];try{await this.sync(t);for(let s of t)this.pending.delete(s);e=0}catch{let s=this.retryDelaysMs[e++];if(s===void 0)return;await Yu(s)}}}};function Yu(n){return new Promise(e=>{setTimeout(e,n).unref?.()})}var ec="QODER_AGENT_SDK_DAEMON",tc="QODER_AGENT_SDK_DAEMON_CAPACITY",nc="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",sc="ELECTRON_RUN_AS_NODE",rc=3e5,qr=2e3,Fr=8192,Ur=255,Kr=new WeakMap;function _n(n){return Kr.get(n)}async function oc(n){uc(n.capacity);let e=n.workerIdleTimeoutMs??rc;cc(e);let t=new H({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await mc(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[ec]:"1",[tc]:String(n.capacity),[nc]:String(e)},i,a,u;try{i=await bn.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let c;u=n.sessionStore?jr(n.sessionStore,{sync:d=>{if(!c)throw new Error("Daemon connection is not ready");return c.syncSessionRegistrations(d)}}):void 0,a=u?Rr(u.store):void 0;let l=n.resolveRemoteSessionLaunch?Nr(n.resolveRemoteSessionLaunch):void 0;c=new Pt({input:i.process.stdin,output:i.process.stdout,requestHandler:Or({auth:n.auth,...a?{sessionStoreHandler:a}:{},...l?{remoteSessionLaunchHandler:l}:{}})}),i.setConnection(c);let m=[...l?["remote_session_launch_v1"]:[],...!n.sessionStore||typeof n.sessionStore.delete=="function"?["session_delete_v1"]:[],...n.sessionStore?[un,cn]:[]];await c.initialize(tt,m),await t.cleanupAuthPayload();let p=new yn(c,i,a,u);return Kr.set(p,{auth:n.auth,transportProvider:new wn(c,s.env,n.cwd),supportsSessionStoreFileCheckpointing:c.supportsCapability(un),supportsSessionStoreForkBarrier:c.supportsCapability(cn),...u!==void 0?{sessionStore:u.store}:{}}),p}catch(c){throw await t.cleanupAuthPayload(),await i?.stop().catch(()=>{}),u?.dispose(),await a?.dispose().catch(()=>{}),c}}var yn=class n{constructor(e,t,s,r){this.connection=e;this.processController=t;this.sessionStoreHandler=s;this.registrationStore=r;this.connection.onDaemonEvent(o=>{this.acceptDaemonEvent(o)}),this.connection.onRemoteControlFailure(o=>{this.acceptRemoteControlFailure(o)}),this.connection.onFailure(o=>this.acceptDaemonFailure(o)),this.processController.onFailure(o=>this.acceptDaemonFailure(o))}static unknownSessionRefreshInitialDelayMs=25;static unknownSessionRefreshMaxDelayMs=1e3;currentState="ready";activeRemoteControl;pendingRemoteControlFailures=new Map;remoteControlLifecycle=Promise.resolve();stopPromise;eventListeners=new Set;knownSessions=new Map;deletedSessionIds=new Set;pendingUnknownSessionStates=new Map;refreshingUnknownSessionIds=new Set;unknownSessionRefreshDelays=new Map;unknownSessionRefreshTimers=new Map;pendingSessionRefreshIds=new Set;refreshingSessionIds=new Set;sessionEventRefresh=Promise.resolve();get state(){return this.currentState}async listSessions(){let e=await this.fetchSessions(),t=new Set(e.map(s=>s.localSessionId));for(let s of this.knownSessions.keys())t.has(s)||this.knownSessions.delete(s);for(let s of e)this.knownSessions.set(s.localSessionId,Je(s));return e}async fetchSessions(){return(await this.connection.listSessions()).map(hn).filter(t=>!this.deletedSessionIds.has(t.localSessionId))}onEvent(e){if(typeof e!="function")throw new TypeError("Daemon event callback must be a function");return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}async renameSession(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");let s=ic(t),r=await this.connection.renameSession(e,s),o=hn(r.session);return this.acceptSessionSnapshot(o),Je(o)}async updateSessionMetadata(e,t){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");if(!t||typeof t!="object")throw new TypeError("update must be an object");let s=J(t.extra),r=await this.connection.updateSessionMetadata(e,s),o=hn(r.session);return this.knownSessions.has(e)&&this.acceptSessionSnapshot(o),Je(o)}async deleteSession(e){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||!e.trim())throw new TypeError("localSessionId must be a non-empty string");await this.connection.deleteSession(e)}async enableRemoteControl(e){let t=dc(e);return this.enqueueRemoteControl(async()=>{if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(this.activeRemoteControl)throw new Error("Remote Control is already enabled");let s=await this.connection.enableRemoteControl(t),r=this.pendingRemoteControlFailures.get(s.environment_id);if(r)throw this.pendingRemoteControlFailures.delete(s.environment_id),r;let o=new Sn(s.environment_id,i=>i.startDisable(()=>this.enqueueRemoteControl(()=>this.disableRemoteControlNow(i))),(i,a,u)=>{this.emitEvent({type:"remoteControlStateChanged",environmentId:s.environment_id,previousState:i,state:a,...u?{error:u}:{}})});return this.activeRemoteControl=o,o})}async attachSession(e,t={}){if(this.currentState!=="ready")throw new Error("Daemon is not ready");if(typeof e!="string"||e.trim().length===0)throw new TypeError("remoteSessionId must be a non-empty string");let s=this.connection.createAttachedSessionTransport(e);try{return await s.initialize(),Ks({transport:s,initialization:s.initializationResult(),...t.canUseTool?{canUseTool:t.canUseTool}:{},...t.onElicitation?{onElicitation:t.onElicitation}:{}})}catch(r){throw s.close(),r}}stop(){return this.stopPromise||(this.clearAllUnknownSessionRefreshes(),this.processController.beginStopping(),this.currentState!=="failed"&&this.setDaemonState("stopping"),this.stopPromise=this.stopInternal()),this.stopPromise}async stopInternal(){try{this.registrationStore?.dispose(),await this.enqueueRemoteControl(async()=>{let e=this.activeRemoteControl;e&&await e.startDisable(()=>this.disableRemoteControlNow(e))}).catch(()=>{}),await this.connection.shutdown().catch(()=>{}),await this.processController.stop(),await this.sessionStoreHandler?.dispose(),this.currentState!=="failed"&&this.setDaemonState("stopped")}catch(e){throw this.setDaemonState("failed",e instanceof Error?e:new Error(String(e))),this.registrationStore?.dispose(),await this.sessionStoreHandler?.dispose().catch(()=>{}),e}}async disableRemoteControlNow(e){if(this.activeRemoteControl===e)try{await this.connection.disableRemoteControl()}finally{this.activeRemoteControl===e&&(this.activeRemoteControl=void 0)}}enqueueRemoteControl(e){let t=this.remoteControlLifecycle.then(e,e);return this.remoteControlLifecycle=t.then(()=>{},()=>{}),t}acceptRemoteControlFailure(e){let t=this.activeRemoteControl;if(t?.environmentId===e.environmentId){t.fail(e.error),this.activeRemoteControl=void 0;return}this.pendingRemoteControlFailures.set(e.environmentId,e.error)}acceptDaemonFailure(e){this.clearAllUnknownSessionRefreshes(),this.currentState==="ready"&&this.setDaemonState("failed",e),this.activeRemoteControl?.fail(e),this.activeRemoteControl=void 0,this.registrationStore?.dispose(),this.sessionStoreHandler?.dispose().catch(()=>{})}acceptDaemonEvent(e){if(e.event==="session_deleted"&&typeof e.session_id=="string"){let o=e.session_id;this.deletedSessionIds.add(o),this.knownSessions.delete(o),this.clearUnknownSessionRefresh(o),this.pendingSessionRefreshIds.delete(o),this.emitEvent({type:"sessionDeleted",localSessionId:o});return}if(e.event==="session_title_changed"&&typeof e.session_id=="string"){let o=e.data.title,i=e.data.updated_at,a=this.knownSessions.get(e.session_id);if(a&&typeof o=="string"&&o.trim().length>0&&typeof i=="string"&&Number.isFinite(Date.parse(i))){this.acceptSessionSnapshot({...a,title:o,updatedAt:i});return}this.refreshSession(e.session_id);return}if(e.event==="session_metadata_changed"&&typeof e.session_id=="string"){let o=e.data.extra;if(kn(o)){let i=this.knownSessions.get(e.session_id);if(i){this.acceptSessionSnapshot({...i,extra:J(o)});return}}this.refreshSession(e.session_id);return}if(e.event!=="session_state_changed"||typeof e.session_id!="string"||!lc(e.data.state))return;let t=e.session_id,s=e.data.state,r=this.knownSessions.get(t);if(r){if(r.state===s)return;let o={...r,state:s};this.knownSessions.set(t,o),this.emitEvent({type:"sessionUpdated",session:o,previousState:r.state});return}this.pendingUnknownSessionStates.set(t,s),this.refreshUnknownSession(t)}refreshUnknownSession(e){this.currentState!=="ready"||this.deletedSessionIds.has(e)||!this.pendingUnknownSessionStates.has(e)||this.refreshingUnknownSessionIds.has(e)||(this.refreshingUnknownSessionIds.add(e),this.sessionEventRefresh=this.sessionEventRefresh.then(async()=>{let s=(await this.fetchSessions()).find(a=>a.localSessionId===e);if(!s){this.scheduleUnknownSessionRefresh(e);return}let r=this.pendingUnknownSessionStates.get(e);if(!r)return;let o=this.knownSessions.get(e),i=s.state===r?s:{...s,state:r};this.clearUnknownSessionRefresh(e),this.knownSessions.set(e,i),o?o.state!==i.state&&this.emitEvent({type:"sessionUpdated",session:i,previousState:o.state}):this.emitEvent({type:"sessionDiscovered",session:i})}).catch(()=>{this.scheduleUnknownSessionRefresh(e)}).finally(()=>{this.refreshingUnknownSessionIds.delete(e)}))}scheduleUnknownSessionRefresh(e){if(this.currentState!=="ready"||this.deletedSessionIds.has(e)||!this.pendingUnknownSessionStates.has(e)||this.unknownSessionRefreshTimers.has(e))return;let t=this.unknownSessionRefreshDelays.get(e)??n.unknownSessionRefreshInitialDelayMs;this.unknownSessionRefreshDelays.set(e,Math.min(t*2,n.unknownSessionRefreshMaxDelayMs));let s=setTimeout(()=>{this.unknownSessionRefreshTimers.delete(e),this.refreshUnknownSession(e)},t);this.unknownSessionRefreshTimers.set(e,s)}clearUnknownSessionRefresh(e){let t=this.unknownSessionRefreshTimers.get(e);t&&clearTimeout(t),this.unknownSessionRefreshTimers.delete(e),this.unknownSessionRefreshDelays.delete(e),this.pendingUnknownSessionStates.delete(e)}clearAllUnknownSessionRefreshes(){for(let e of this.unknownSessionRefreshTimers.values())clearTimeout(e);this.unknownSessionRefreshTimers.clear(),this.unknownSessionRefreshDelays.clear(),this.pendingUnknownSessionStates.clear()}refreshSession(e){this.pendingSessionRefreshIds.add(e),!this.refreshingSessionIds.has(e)&&(this.refreshingSessionIds.add(e),this.sessionEventRefresh=this.sessionEventRefresh.then(async()=>{for(;this.pendingSessionRefreshIds.delete(e);){let s=(await this.fetchSessions()).find(r=>r.localSessionId===e);s&&this.acceptSessionSnapshot(s)}}).catch(()=>{}).finally(()=>{this.refreshingSessionIds.delete(e)}))}acceptSessionSnapshot(e){if(this.deletedSessionIds.has(e.localSessionId))return;let t=this.knownSessions.get(e.localSessionId);if(t&&Zu(t,e))return;let s=Je(e);this.knownSessions.set(e.localSessionId,s),t?this.emitEvent({type:"sessionUpdated",session:s,previousState:t.state}):this.emitEvent({type:"sessionDiscovered",session:s})}setDaemonState(e,t){let s=this.currentState;s!==e&&(this.currentState=e,this.emitEvent({type:"daemonStateChanged",previousState:s,state:e,...t?{error:t}:{}}))}emitEvent(e){for(let t of this.eventListeners)try{t(ac(e))}catch{}}};function Je(n){return{...n,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function ic(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>Ur)throw new TypeError(`title must be at most ${Ur} characters`);return e}function hn(n){return{localSessionId:n.local_session_id,...n.remote_session_id?{remoteSessionId:n.remote_session_id}:{},...n.environment_id?{environmentId:n.environment_id}:{},title:n.title,...n.cwd?{cwd:n.cwd}:{},...n.extra===void 0?{}:{extra:J(n.extra)},state:n.state,createdAt:n.created_at,updatedAt:n.updated_at}}function ac(n){return"session"in n?{...n,session:Je(n.session)}:{...n}}var Sn=class{constructor(e,t,s){this.environmentId=e;this.requestDisable=t;this.onStateChanged=s}currentState="ready";disablePromise;get state(){return this.currentState}disable(){return this.startDisable(()=>this.requestDisable(this))}startDisable(e){if(!this.disablePromise){let t=this.currentState;this.currentState="stopping",this.onStateChanged(t,"stopping"),this.disablePromise=e().then(()=>{let s=this.currentState;this.currentState="stopped",this.onStateChanged(s,"stopped")},s=>{let r=this.currentState;throw this.currentState="failed",this.onStateChanged(r,"failed",s instanceof Error?s:new Error(String(s))),s})}return this.disablePromise}fail(e){if(this.currentState==="ready"){let t=this.currentState;this.currentState="failed",this.onStateChanged(t,"failed",e)}}},wn=class{constructor(e,t,s){this.connection=e;this.daemonEnv=t;this.defaultCwd=s}create(e){let t=new H({...e,auth:void 0,env:this.daemonEnv}),s=t.buildArgs();return this.connection.createSessionTransport({workerArgs:s,cwd:e.cwd??this.defaultCwd,...e.extra!==void 0?{extra:e.extra}:{},...e.materializedSessionConfigDir!==void 0?{configDir:e.materializedSessionConfigDir}:{},cleanup:()=>t.cleanupGeneratedSettings()})}};function uc(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError("capacity must be a positive integer")}function cc(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}function lc(n){return n==="pending"||n==="ready"||n==="inactive"||n==="failed"}function dc(n){if(!n||typeof n!="object")throw new TypeError("Remote Control options must be an object");if(typeof n.externalId!="string"||!n.externalId.trim())throw new TypeError("externalId must be a non-empty string");if(typeof n.environmentType!="string"||!n.environmentType.trim())throw new TypeError("environmentType must be a non-empty string");if(n.name!==void 0&&(typeof n.name!="string"||!n.name.trim()))throw new TypeError("name must be a non-empty string");let e=pc(n.metadata);return{external_id:n.externalId,environment_type:n.environmentType,...n.name!==void 0?{name:n.name}:{},...e!==void 0?{metadata:e}:{}}}function pc(n){if(n!==void 0){if(!kn(n))throw new TypeError("metadata must be a JSON object");return vn(n,"metadata",new Set),structuredClone(n)}}function vn(n,e,t){if(!(n===null||typeof n=="string"||typeof n=="boolean")){if(typeof n=="number"){if(Number.isFinite(n))return;throw new TypeError(`${e} must contain finite JSON numbers`)}if(typeof n!="object")throw new TypeError(`${e} must contain only JSON values`);if(t.has(n))throw new TypeError(`${e} must not contain circular references`);if(t.add(n),Array.isArray(n))n.forEach((s,r)=>vn(s,`${e}[${r}]`,t));else{if(!kn(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))vn(r,`${e}.${s}`,t)}t.delete(n)}}function kn(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}async function mc(n){let e=Me({pathToQoderCLIExecutable:n},ue),t,s={};if(e.transport==="worker"){let r=await ke(Y(e.pathToQoderWorkerRuntime));t=r.runtimePath,s=r.env}else t=n??W();return it(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[sc]:"1"}:{}}}:{command:t,args:[],env:s}}var bn=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>Fr&&(this.stderrTail=this.stderrTail.slice(-Fr))}),e.once("error",t=>{this.reportFailure(new D(`Failed to spawn Qoder CLI daemon: ${t.message}`,{stderr:this.getStderr(),cause:t}))}),e.once("exit",(t,s)=>{this.stopping||this.reportFailure(new D(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=Xu(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await gc(t)}catch(s){throw new D(`Failed to spawn Qoder CLI daemon: ${fc(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 Lr(this.exited,qr)&&(this.process.kill("SIGTERM"),!await Lr(this.exited,qr)&&(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 fc(n){return n instanceof Error?n.message:String(n)}async function gc(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 Lr(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 Rn=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 hc(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=_n(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(ds(n.transport))return n.transport;throw new Error("options.transport must implement QueryTransportProvider. Use ProcessTransport.default, WorkerTransport.default, or a custom provider with create().")}let t=Me(n,ue);return t.transport==="worker"?new Re({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):be.default}function En(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;if(s)r=yc(t);else if(t.extra!==void 0)throw new Error("options.extra requires options.daemon.");let o=s?_n(s):void 0,i=o?.sessionStore??t.sessionStore,a=t.sessionStoreFlush??(o?.sessionStore!==void 0?"eager":"batched"),u=hc(t,s),c=new mt({debug:t.debug,debugFile:t.debugFile,stderr:t.stderr});if(t.canUseTool&&t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");if(t.planMode!==void 0&&typeof t.planMode!="boolean")throw new TypeError("options.planMode must be a boolean");let l=o?.auth??t.auth;if(l==null)throw new Rn;if(i&&t.enableFileCheckpointing&&o?.supportsSessionStoreFileCheckpointing!==!0)throw new Error("sessionStore cannot be combined with enableFileCheckpointing unless the bound daemon advertises persistent file checkpoint storage.");let m=i!==void 0&&t.forkSession===!0;if(m&&o!==void 0&&o.supportsSessionStoreForkBarrier!==!0)throw new Error("sessionStore cannot be combined with forkSession unless the bound daemon advertises a durable Fork persistence barrier.");if(i&&t.persistSession===!1)throw new Error(`sessionStore cannot be used with persistSession: false -- the storage adapter requires local writes to mirror from. Use ${v.configDirEnv}=/tmp for ephemeral local writes with external mirroring.`);if(i&&o===void 0&&!(u instanceof be)&&!(u instanceof Re))throw new Error("sessionStore requires ProcessTransport or WorkerTransport.");if(i&&t.sessionStoreFlush!==void 0&&t.sessionStoreFlush!=="batched"&&t.sessionStoreFlush!=="eager")throw new Error('sessionStoreFlush must be "batched" or "eager".');if(i&&t.loadTimeoutMs!==void 0&&(!Number.isFinite(t.loadTimeoutMs)||t.loadTimeoutMs<=0))throw new Error("loadTimeoutMs must be a positive finite number.");if(i&&t.experimentalCloudAgent!==void 0)throw new Error("sessionStore is not supported by the experimental Cloud Agent runtime.");if(t.cloudAgent!==void 0)throw new Error("options.cloudAgent is not supported. Use options.experimentalCloudAgent for the experimental Cloud Agent runtime.");if(t.experimentalCloudAgent!==void 0)return Ws(t),Vs({prompt:e,options:t,diagnostics:c});let p=cr(t.memory),d=dr(t.evolution?.skill),g=t.onAuthExpired,h=!1,f=g?()=>{h||(h=!0,Promise.resolve(g()).catch(k=>{c.record("[query] onAuthExpired callback threw:",k)}))}:void 0,y=new Map,b=new Map,w=new Map,T={},C={},re={};if(t.mcpServers)for(let[k,K]of Object.entries(t.mcpServers)){let ie=K.tools;if(Array.isArray(ie)&&ie.length>0&&(C[k]=ie),K.type==="sdk"&&"instance"in K&&K.instance){let we=K.instance;if(y.set(k,we),ie){let Ze=jt(k,ie);Ze&&(re[k]=Ze)}let zn=new ht(Ze=>{ks(k,Ze,w)});b.set(k,zn),we.connect(zn).catch(()=>{})}else T[k]=K}let _=Object.keys(T).length>0,oe=Object.keys(C).length>0,Ye=t.pathToQoderCLIExecutable,_o=t.env,ko=l?.type==="jobToken"?l.fetchJobToken:void 0,Ro=l?.type==="serviceAccount"?l.fetchServiceAccountToken:void 0,Xe={pathToQoderCLIExecutable:Ye,executable:t.executable,executableArgs:t.executableArgs,env:_o,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:s?void 0:l,model:t.model,agent:t.agent,debug:t.debug,diagnostics:c,maxTurns:t.maxTurns,includePartialMessages:t.includePartialMessages,includeHookEvents:t.includeHookEvents,sessionMirror:i!==void 0,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:t.allowDangerouslySkipPermissions,permissionPromptToolName:t.permissionPromptToolName,canUseTool:t.canUseTool!==void 0,extra:t.extra===void 0?void 0:J(t.extra),continue:t.continue,resume:t.resume,resumeSessionAt:t.resumeSessionAt,resumeDropsTurn:t.resumeDropsTurn,forkSession:t.forkSession,sessionId:t.sessionId,persistSession:t.persistSession,allowedTools:(()=>{let k=t.allowedTools??[];if(t.skills===void 0)return k.length>0?k:void 0;let K=t.skills==="all"?["Skill"]:t.skills.map(we=>`Skill(${we})`),ie=new Set(k);return[...k,...K.filter(we=>!ie.has(we))]})(),disallowedTools:t.disallowedTools,tools:t.tools,toolConfig:t.toolConfig,extensions:t.extensions,extraArgs:t.extraArgs,mcpServers:_?T:void 0,mcpToolPolicies:oe?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:f},Ln=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new pt(async()=>{let k=await wt({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:ct(u,{...Xe,continue:!1})};try{return{transport:ct(u,{...Xe,env:{...Xe.env??process.env,[v.configDirEnv]:k.configDir},materializedSessionConfigDir:k.configDir,continue:!1,resume:k.sessionId}),cleanup:k.cleanup}}catch(K){throw await k.cleanup(),K}}):ct(u,Xe);Ln.initialize().catch(()=>{});let Eo=typeof e=="string",Se=t.systemPrompt,Kn,$n;if(typeof Se=="string")Kn=Se;else if(typeof Se=="object"&&Se!==null&&Se.type==="preset"){let k=Se;if(k.preset!=="qodercli")throw new Error(`Unsupported systemPrompt preset: ${String(k.preset)}`);$n=k.append}let Po={systemPrompt:Kn,appendSystemPrompt:$n,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:s!==void 0?t.planMode??!1:t.planMode,promptSuggestions:t.promptSuggestions,enableFileCheckpointing:t.enableFileCheckpointing,memory:p.config,evolution:d.config?{skill:d.config}:void 0,customContext:t.customContext,requireSessionStoreForkBarrier:m,...s!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},xt=new Ke(Ln,Eo,t.canUseTool,t.hooks,t.abortController,y,Po,t.onElicitation,c,f,t.controlRequestTimeoutMs,b,w,ko,t.resolveModel,t.resolveModelTimeoutMs,i,a,re,Ro,p.callbacks,d.callbacks);if(typeof e=="string"){let k={type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};xt.streamInput(async function*(){yield k}())}else xt.streamInput(e);return xt}function yc(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=Le(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}}},Tn=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 Sc(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=En({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 Tn(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as wc}from"node:fs/promises";import vc from"node:os";import L from"node:path";var bc=["user","project","local"],On=new Set(["__proto__","constructor","prototype"]),_c=/^[\p{L}\p{N}\p{M}._ -]+$/u,kc=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Rc=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Ec=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Pc=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 he(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function Tc(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 Ec(n,e){let t;try{t=JSON.parse(Rc(n))}catch(s){let r=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${r}`)}if(!ge(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Ct(t)}function De(n){return Array.isArray(n)?n.map(De):ge(n)?Ct(n):n}function Ct(n){let e={};for(let[t,s]of Object.entries(n))Cn.has(t)||s===void 0||(e[t]=De(s));return e}function Pc(n){let e=n.join(".");if(_c.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(kc.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function Tn(n,e,t=[]){for(let[s,r]of Object.entries(e)){if(Cn.has(s)||r===void 0)continue;let o=[...t,s],i=n[s],a=Pc(o);if(a==="shallow"&&i&&r){let u={};ge(i)&&Object.assign(u,Ct(i)),ge(r)&&Object.assign(u,Ct(r)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(r)?r:[r];if(a==="concat"){n[s]=[...i.map(De),...u.map(De)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(De);continue}}if(ge(i)&&ge(r))Tn(i,r,o);else if(ge(r)){let u={};Tn(u,r,o),n[s]=u}else n[s]=De(r)}}function Tc(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===".."||!wc.test(t)||vc.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(bc.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function Pn(n,e){let t;try{t=await hc(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:L.resolve(e),settings:Ec(t,L.resolve(e))}}async function Cc(n={}){let e=L.resolve(n.cwd??process.cwd()),t=process.env,s=Tc(t),r=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=r?L.resolve(e,r):yc.homedir(),i=t[v.configDirEnv]?L.resolve(e,t[v.configDirEnv]):L.join(o,s.user),a=L.join(e,s.project),u=new Set(n.settingSources??Sc),c=L.resolve(o)===e,d=[];if(u.has("user")){let l=await Pn("user",L.join(i,"settings.json"));l&&d.push(l)}if(u.has("project")&&!c){let l=await Pn("project",L.join(a,"settings.json"));l&&d.push(l)}if(u.has("local")&&!c){let l=await Pn("local",L.join(a,"settings.local.json"));l&&d.push(l)}let m={},p={};for(let l of d){Tn(m,l.settings);for(let g of Object.keys(l.settings))Cn.has(g)||(p[g]={source:l.source,...l.path?{path:l.path}:{}})}return{effective:m,provenance:p,sources:d}}import{McpServer as Mc}from"@modelcontextprotocol/sdk/server/mcp.js";function Oc(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 Mc({name:n.name,version:n.version??"1.0.0"},{capabilities:{tools:n.tools&&n.tools.length>0?{}:void 0}}),t=[];if(n.tools&&n.tools.length>0)for(let s of n.tools){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${n.name}".`);if(!s.description||typeof s.description!="string")throw new Error(`[createSdkMcpServer] Tool "${s.name}" must have a non-empty description string.`);Nt(n.name,{name:s.name,exposedName:s.exposedName,alwaysLoad:s.alwaysLoad}),(s.exposedName!==void 0||s.alwaysLoad!==void 0||s.permissionPolicy!==void 0)&&t.push({name:s.name,...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s.permissionPolicy!==void 0?{permission_policy:s.permissionPolicy}:{}});try{e.registerTool(s.name,{description:s.description,inputSchema:s.inputSchema,...s.annotations?{annotations:s.annotations}:{}},s.handler)}catch(r){throw r instanceof Error&&r.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${s.name}" in server "${n.name}". Each tool name must be unique within a server.`):r}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function Ac(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 Mn,readFile as Ot,stat as Ie,appendFile as Jr,realpath as Dc,rm as Lr}from"fs/promises";import{basename as Ic,join as O,resolve as Kr}from"path";import{execFile as xc}from"child_process";import{randomUUID as Hr}from"crypto";import{promisify as Nc}from"util";var jc=Nc(xc),qc=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Gr=new Set(["user","assistant","system","progress","attachment"]);function A(n){return n!==null&&typeof n=="object"}function he(n){return qc.test(n)}function Fc(n){let e=[];for(let t of n.split(`
22
- `)){let s=t.trim();if(s)try{let r=JSON.parse(s);A(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&Gr.has(r.type)&&e.push(r)}catch{}}return e}function Uc(n,e){let t;for(let s of n.split(`
23
- `)){let r=s.trim();if(r)try{let o=JSON.parse(r);if(!A(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function Mt(n){if(!A(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var Lc=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Kc(n){return typeof n=="string"&&Lc.has(n)?n:void 0}function On(n){if(n.type!=="user")return;let e=Mt(n).filter(o=>A(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(n.toolDenialKind)?n.toolDenialKind:e.length===1?[n.toolDenialKind]:[],s=Array.isArray(n.userFeedback)?n.userFeedback:e.length===1?[n.userFeedback]:[],r=e.flatMap((o,i)=>{let a=Kc(t[i]);if(!a)return[];let u=s[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return r.length>0?r:void 0}function He(n){if(n.type!=="assistant"||!A(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function Wr(n){return n.type!=="user"||!n.parentUuid?!1:Mt(n).some(e=>A(e)&&e.type==="tool_result")}function $c(n){if(!A(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function zc(n,e){let t=new Map;for(let[s,r]of n){let o=$c(r);if(o){let i=t.get(o);i?i.push(s):t.set(o,[s])}}for(let[s,r]of n){let o=Qc(r,r.parentUuid,n,t,e);o!==r.parentUuid&&n.set(s,{...r,parentUuid:o})}}function Qc(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]:Bc(n,o,t)??Jc(n,o,t,r)??e}function Bc(n,e,t){if(!Wr(n))return;let s=Mt(n).filter(o=>A(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(s.length===0)return;let r=e.filter(o=>{let i=t.get(o);return i?Mt(i).some(a=>A(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return r.length===1?r[0]:void 0}function Jc(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 Hc(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 $r(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 Gc(n,e,t){let s=e.filter(p=>p.type==="assistant");if(s.length===0)return e;let r=new Map,o=0;for(let p of n.keys())r.set(p,o++);let i=new Map;for(let p of s){let l=He(p);l&&i.set(l,p)}let a=new Map,u=new Map;for(let p of n.values()){let l=He(p);if(l){let g=a.get(l)??[];g.push(p),a.set(l,g);continue}if(Wr(p)&&p.parentUuid){let g=u.get(p.parentUuid)??[];g.push(p),u.set(p.parentUuid,g)}}let c=new Set,d=new Map;for(let p of s){let l=He(p);if(!l||c.has(l))continue;c.add(l);let g=a.get(l)??[p],h=g.filter(_=>!t.has(_.uuid)),f=[];for(let _ of g){let se=u.get(_.uuid)??[];for(let Ye of se)t.has(Ye.uuid)||f.push(Ye)}if(h.length===0&&f.length===0)continue;let y=i.get(l);if(!y)continue;let b=[...g].sort((_,se)=>$r(_,se,r));f.sort((_,se)=>$r(_,se,r));let S=b.findIndex(_=>_.uuid===y.uuid),T=b.slice(0,Math.max(S,0)).filter(_=>!t.has(_.uuid)),C=b.slice(S+1).filter(_=>!t.has(_.uuid)),ye=[...T,...C,...f];for(let _ of ye)t.add(_.uuid);d.set(y.uuid,ye)}if(d.size===0)return e;let m=[];for(let p of e){let l=d.get(p.uuid);if(l){let g=r.get(p.uuid)??Number.MAX_SAFE_INTEGER,h=[],f=[];for(let y of l)(p.type==="assistant"&&y.type==="assistant"&&He(y)===He(p)&&(r.get(y.uuid)??Number.MAX_SAFE_INTEGER)<g?h:f).push(y);m.push(...h,p,...f)}else m.push(p)}return m}function Vr(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"&&Hc(s),zc(s,r);let o;if(e?.leafUuid===null)return[];if(e){let d=s.get(e.leafUuid),m=d?.sessionId??d?.session_id;d&&(m===void 0||m===e.sessionId)&&(o=d)}if(!o){let d=new Set;for(let h of s.values())h.parentUuid&&d.add(h.parentUuid);let m=Array.from(s.values()).filter(h=>!d.has(h.uuid)),p=[];for(let h of m){let f=h,y=new Set;for(;f&&!y.has(f.uuid);){if(y.add(f.uuid),f.type==="user"||f.type==="assistant"){p.push(f);break}f=f.parentUuid?s.get(f.parentUuid):void 0}}if(p.length===0)return[];let l=p.filter(h=>!h.isSidechain&&!h.teamName&&!h.isMeta);o=(l.length>0?l:p).reduce((h,f)=>(r.get(f.uuid)??-1)>(r.get(h.uuid)??-1)?f:h)}let i=[],a=new Set,u=o;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let d=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=d?s.get(d):void 0}i.reverse();let c=t==="runtime"?Wc(i):i;return Gc(s,c,new Set(c.map(d=>d.uuid)))}function Wc(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 Vc(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function An(n,e,t){let s=n.flatMap(o=>A(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Gr.has(o.type)?[o]:[]),r;for(let o of n){if(!A(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;a!==null&&typeof a!="string"||(r={leafUuid:a,sessionId:e})}return Vr(s,r,t)}function zr(n,e,t){if(t==="historical"&&Vc(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 Yc(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 Dn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function In(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function Qr(n){let e=n.type==="system"?Yc(n.compactMetadata):void 0,t=On(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,...Dn(n),...In(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 Br(n,e){let t=Math.max(0,e?.offset??0),s=e?.limit;return s!==void 0&&s>0?n.slice(t,t+s):t>0?n.slice(t):n}async function At(n){try{return await Dc(Kr(n))}catch{return Kr(n)}}async function Xc(n){return N(await At(n))}async function te(n){let e=Ce();if(n?.dir){let t=await At(n.dir),s=[O(e,N(t))];if(n.includeWorktrees!==!1)try{let{stdout:r}=await jc("git",["worktree","list","--porcelain"],{cwd:n.dir}),o=r.split(`
24
- `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)s.push(O(e,await Xc(i)))}catch{}return s}try{return(await Mn(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>O(e,s.name))}catch{return[]}}async function Yr(n){try{let[e,t]=await Promise.all([Ot(n,"utf-8"),Ie(n)]),s=e.trim().split(`
25
- `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return A(i)?[i]:[]}catch{return[]}});if(s.length===0)return null;let r=Ic(n,".jsonl");return xn(r,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function Xr(n,e){return O(n,e,"subagents")}function Zr(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 eo(n){let e=[];async function t(s){let r;try{r=await Mn(s,{withFileTypes:!0})}catch{return}for(let o of r){let i=O(s,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(n),e}async function Zc(n){try{let e=await Ot(n.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function to(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 ed(n,e,t){let[s,r]=await Promise.all([Ot(n,"utf-8"),Zc(n)]),o=[];for(let d of s.trim().split(`
26
- `).filter(Boolean))try{let m=JSON.parse(d);Zr(m)&&o.push(m)}catch{}let a=to(o).map(d=>{let m=On(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,...Dn(d),...In(d),...m?{tool_result_meta:m}:{}}}),u=t?.offset??0,c=t?.limit;return c!==void 0?a.slice(u,u+c):a.slice(u)}async function xe(n){return N(await At(n??process.cwd()))}function Ge(n,e){return{projectKey:n,sessionId:e}}function td(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 nd(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 sd=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function rd(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(sd,"");if(s===e)return s;e=s}return e}var od=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,id=/<command-name>(.*?)<\/command-name>/,ad=/<bash-input>([\s\S]*?)<\/bash-input>/;function ud(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 cd(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!A(t))return;let s=t.content,r=[];if(typeof s=="string")r.push(s);else if(Array.isArray(s)){for(let o of s)if(A(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&r.push(o.text)}}for(let o of r){let i=o.replaceAll(`
27
- `," ").trim();if(!i)continue;let a=id.exec(i);if(a){e.commandFallback??=a[1];continue}let u=ad.exec(i);if(u)return`! ${u[1].trim()}`;if(!od.test(i))return ud(i)}}function xn(n,e,t,s={}){if(e.length===0)return;let r,o,i,a,u,c,d,m,p,l,g;for(let b of e){let S=b;if(g??=S.isSidechain===!0,l===void 0&&typeof S.timestamp=="string"){let T=Date.parse(S.timestamp);Number.isFinite(T)&&(l=T)}if(!r){let T={commandFallback:o};r=cd(S,T),o=T.commandFallback}S.type==="custom-title"&&typeof S.customTitle=="string"&&(i=S.customTitle),S.type==="ai-title"&&typeof S.aiTitle=="string"&&(a=S.aiTitle),typeof S.lastPrompt=="string"&&(u=S.lastPrompt),typeof S.summary=="string"&&(c=S.summary),S.type==="tag"&&(p=typeof S.tag=="string"&&S.tag?S.tag:void 0),typeof S.gitBranch=="string"&&(d=S.gitBranch),m===void 0&&typeof S.cwd=="string"&&(m=S.cwd),S.type==="relocated"&&typeof S.relocatedCwd=="string"&&(m=S.relocatedCwd)}if(g)return;let h=r??o,f=i||a,y=f||u||c||h;if(y)return{sessionId:n,summary:y,lastModified:t??td(e),fileSize:s.fileSize,customTitle:f,firstPrompt:h,gitBranch:d,cwd:m||s.defaultCwd,tag:p,createdAt:l}}async function no(n,e,t){let s=Ge(await xe(t),e),r=await n.load(s);return r?{key:s,entries:r}:void 0}async function dd(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let d=await At(n.dir??process.cwd()),m=N(d),p=(await c.listSessions(m)).slice().sort((f,y)=>y.mtime-f.mtime),l=Math.max(0,n.offset??0),g=n.limit!==void 0&&n.limit>0?p.slice(l,l+n.limit):l>0?p.slice(l):p;return(await Promise.allSettled(g.map(async({sessionId:f,mtime:y})=>{let b=await c.load(Ge(m,f));return b?xn(f,b,y,{defaultCwd:d}):void 0}))).flatMap((f,y)=>{if(f.status==="fulfilled")return f.value?[f.value]:[];let b=g[y];return[{sessionId:b.sessionId,summary:"",lastModified:b.mtime}]})}let e=await te(n),s=(await Promise.all(e.map(async c=>{try{return(await Mn(c)).filter(m=>m.endsWith(".jsonl")).map(m=>O(c,m))}catch{return[]}}))).flat(),r=await Promise.all(s.map(Yr)),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 ld(n,e){if(e?.sessionStore){if(!he(n))return;let s=await no(e.sessionStore,n,e.dir);return s?xn(n,s.entries,nd(s.entries)):void 0}let t=await te(e);for(let s of t){let r=O(s,`${n}.jsonl`),o=await Yr(r);if(o)return o}}async function pd(n,e){if(!he(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let o=await no(e.sessionStore,n,e.dir);if(!o)return[];let i=An(o.entries,n,s);return Br(i.filter(a=>zr(a,t,s)).map(Qr),e)}let r=await te(e);for(let o of r){let i=O(o,`${n}.jsonl`);try{let a=await Ot(i,"utf-8"),c=Vr(Fc(a),Uc(a,n),s).filter(d=>zr(d,t,s)).map(Qr);return Br(c,e)}catch{continue}}return[]}async function md(n,e,t){if(!he(n))throw new Error(`Invalid sessionId: ${n}`);let s=e.trim();if(!s)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(Ge(await xe(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Hr(),timestamp:new Date().toISOString()}]);return}let r=await te(t);for(let o of r){let i=O(o,`${n}.jsonl`);try{await Ie(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await Jr(i,a+`
28
- `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function fd(n,e,t){if(!he(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:rd(e).trim();if(s!==null&&!s)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(Ge(await xe(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Hr(),timestamp:new Date().toISOString()}]);return}let r=await te(t);for(let o of r){let i=O(o,`${n}.jsonl`);try{await Ie(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await Jr(i,a+`
29
- `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function gd(n,e){if(e?.sessionStore){if(!he(n))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let s=await e.sessionStore.listSubkeys({projectKey:await xe(e.dir),sessionId:n});return Array.from(new Set(s.map(r=>{if(!r.startsWith("subagents/"))return;let o=r.split("/").at(-1);return o?.startsWith("agent-")?o.slice(6):void 0}).filter(r=>r!==void 0)))}let t=await te(e);for(let s of t){let r=O(s,`${n}.jsonl`);try{await Ie(r);let o=await eo(Xr(s,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function hd(n,e,t){if(t?.sessionStore){if(!he(n)||!e)return[];let r=await xe(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let l=await t.sessionStore.listSubkeys({projectKey:r,sessionId:n}),g=`agent-${e}`,h=l.find(f=>f.startsWith("subagents/")&&f.split("/").at(-1)===g);if(!h)return[];o=h}let i=await t.sessionStore.load({projectKey:r,sessionId:n,subpath:o});if(!i)return[];let a=i.filter(Zr),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=to(a).map(l=>{let g=On(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,...Dn(l),...In(l),...g?{tool_result_meta:g}:{}}}),p=Math.max(0,t.offset??0);return t.limit!==void 0?m.slice(p,p+t.limit):m.slice(p)}let s=await te(t);for(let r of s){let o=O(r,`${n}.jsonl`);try{await Ie(o);let a=(await eo(Xr(r,n))).find(u=>u.agentId===e);return a?await ed(a.filePath,n,t):[]}catch{continue}}return[]}async function yd(n,e){if(!he(n))throw new Error(`Invalid sessionId: ${n}`);if(e?.sessionStore){if(!e.sessionStore.delete)throw new Error("SessionStore does not support delete()");await e.sessionStore.delete(Ge(await xe(e.dir),n));return}let t=await te(e);for(let s of t){let r=O(s,`${n}.jsonl`);try{await Ie(r),await Promise.all([Lr(r,{force:!0}),Lr(O(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as Dt}from"crypto";import{readdir as Sd,readFile as wd,realpath as vd,stat as so,writeFile as bd}from"fs/promises";import{dirname as _d,join as Nn,resolve as kd}from"path";var ro=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Rd=new Set(["user","assistant","attachment","system","progress"]);async function io(n){let e=kd(n);try{return await vd(e)}catch{return e}}async function Ed(n,e){let t=Ce();if(e){let r=N(await io(e)),o=Nn(t,r,`${n}.jsonl`);try{if((await so(o)).size>0)return o}catch{}return}let s;try{s=await Sd(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=Nn(t,r.name,`${n}.jsonl`);try{if((await so(o)).size>0)return o}catch{}}}function ao(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:An(n,e,"historical").filter(o=>Rd.has(o.type)),contentReplacements:t,relocatedCwd:s}}function Pd(n,e){let t=[];for(let s of n.split(`
30
- `))if(s.trim())try{t.push(JSON.parse(s))}catch{}return ao(t,e)}function Td(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 Cd(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??Td(n)}function oo(n,e,t,s){let r=n.transcript.filter(l=>l.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let l=r.findIndex(g=>g.uuid===t.upToMessageId);if(l<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,l+1)}let o=new Set(r.map(l=>l.uuid)),i=new Map(r.map(l=>[l.uuid,Dt()])),a=r.filter(l=>l.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(l=>[l.uuid,l])),c=Dt(),d=new Date().toISOString(),m=a.map((l,g)=>{let h=null,f=typeof l.parentUuid=="string"?l.parentUuid:void 0;for(;f;){let S=u.get(f);if(!S)break;if(S.type!=="progress"){h=i.get(f)??null;break}f=typeof S.parentUuid=="string"?S.parentUuid:void 0}let y=typeof l.logicalParentUuid=="string"?i.get(l.logicalParentUuid)??null:l.logicalParentUuid??null,b={...l,...l.type==="system"&&l.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(l.uuid),parentUuid:h,logicalParentUuid:y,sessionId:c,timestamp:g===a.length-1?d:typeof l.timestamp=="string"?l.timestamp:d,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:l.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let l=n.contentReplacements.flatMap(g=>{if(g===null||typeof g!="object")return[];let h=g.messageUuid;if(typeof h!="string"||!o.has(h))return[];let f=i.get(h);return f?[{...g,messageUuid:f}]:[]});l.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:l,uuid:Dt(),timestamp:d})}n.relocatedCwd&&m.push({type:"relocated",sessionId:c,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:c,customTitle:p||`${Cd(s)??"Forked session"} (fork)`,uuid:Dt(),timestamp:d}),{sessionId:c,entries:m}}async function Md(n,e={}){if(!ro.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!ro.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await io(e.dir??process.cwd()),a=N(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=oo(ao(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Ed(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await wd(t,"utf8"),r=s.split(`
32
- `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=oo(Pd(s,n),n,e,r);return await bd(Nn(_d(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 Cc(n,e){let t;try{t=JSON.parse(Tc(n))}catch(s){let r=s instanceof Error?s.message:String(s);throw new Error(`Unable to parse settings from ${e}: ${r}`)}if(!he(t))throw new TypeError(`Settings from ${e} must be a JSON object`);return Ct(t)}function De(n){return Array.isArray(n)?n.map(De):he(n)?Ct(n):n}function Ct(n){let e={};for(let[t,s]of Object.entries(n))On.has(t)||s===void 0||(e[t]=De(s));return e}function Mc(n){let e=n.join(".");if(Ec.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(Pc.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function Mn(n,e,t=[]){for(let[s,r]of Object.entries(e)){if(On.has(s)||r===void 0)continue;let o=[...t,s],i=n[s],a=Mc(o);if(a==="shallow"&&i&&r){let u={};he(i)&&Object.assign(u,Ct(i)),he(r)&&Object.assign(u,Ct(r)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(r)?r:[r];if(a==="concat"){n[s]=[...i.map(De),...u.map(De)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(De);continue}}if(he(i)&&he(r))Mn(i,r,o);else if(he(r)){let u={};Mn(u,r,o),n[s]=u}else n[s]=De(r)}}function Oc(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===".."||!_c.test(t)||kc.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(Rc.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function Cn(n,e){let t;try{t=await wc(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:L.resolve(e),settings:Cc(t,L.resolve(e))}}async function Ac(n={}){let e=L.resolve(n.cwd??process.cwd()),t=process.env,s=Oc(t),r=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=r?L.resolve(e,r):vc.homedir(),i=t[v.configDirEnv]?L.resolve(e,t[v.configDirEnv]):L.join(o,s.user),a=L.join(e,s.project),u=new Set(n.settingSources??bc),c=L.resolve(o)===e,l=[];if(u.has("user")){let d=await Cn("user",L.join(i,"settings.json"));d&&l.push(d)}if(u.has("project")&&!c){let d=await Cn("project",L.join(a,"settings.json"));d&&l.push(d)}if(u.has("local")&&!c){let d=await Cn("local",L.join(a,"settings.local.json"));d&&l.push(d)}let m={},p={};for(let d of l){Mn(m,d.settings);for(let g of Object.keys(d.settings))On.has(g)||(p[g]={source:d.source,...d.path?{path:d.path}:{}})}return{effective:m,provenance:p,sources:l}}import{McpServer as Ic}from"@modelcontextprotocol/sdk/server/mcp.js";function Dc(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 Ic({name:n.name,version:n.version??"1.0.0"},{capabilities:{tools:n.tools&&n.tools.length>0?{}:void 0}}),t=[];if(n.tools&&n.tools.length>0)for(let s of n.tools){if(!s.name||typeof s.name!="string"||s.name.trim()==="")throw new Error(`[createSdkMcpServer] Tool name must be a non-empty string in server "${n.name}".`);if(!s.description||typeof s.description!="string")throw new Error(`[createSdkMcpServer] Tool "${s.name}" must have a non-empty description string.`);Nt(n.name,{name:s.name,exposedName:s.exposedName,alwaysLoad:s.alwaysLoad}),(s.exposedName!==void 0||s.alwaysLoad!==void 0||s.permissionPolicy!==void 0)&&t.push({name:s.name,...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad!==void 0?{alwaysLoad:s.alwaysLoad}:{},...s.permissionPolicy!==void 0?{permission_policy:s.permissionPolicy}:{}});try{e.registerTool(s.name,{description:s.description,inputSchema:s.inputSchema,...s.annotations?{annotations:s.annotations}:{}},s.handler)}catch(r){throw r instanceof Error&&r.message.includes("already registered")?new Error(`[createSdkMcpServer] Duplicate tool name "${s.name}" in server "${n.name}". Each tool name must be unique within a server.`):r}}return{type:"sdk",name:n.name,instance:e,...t.length>0?{tools:t}:{}}}function xc(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 An,readFile as Ot,stat as xe,appendFile as Gr,realpath as Nc,rm as $r}from"fs/promises";import{basename as jc,join as O,resolve as zr}from"path";import{execFile as qc}from"child_process";import{randomUUID as Wr}from"crypto";import{promisify as Fc}from"util";var Uc=Fc(qc),Lc=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Vr=new Set(["user","assistant","system","progress","attachment"]);function A(n){return n!==null&&typeof n=="object"}function ye(n){return Lc.test(n)}function Kc(n){let e=[];for(let t of n.split(`
22
+ `)){let s=t.trim();if(s)try{let r=JSON.parse(s);A(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&Vr.has(r.type)&&e.push(r)}catch{}}return e}function $c(n,e){let t;for(let s of n.split(`
23
+ `)){let r=s.trim();if(r)try{let o=JSON.parse(r);if(!A(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;if(a!==null&&typeof a!="string")continue;t={leafUuid:a,sessionId:e}}catch{}}return t}function Mt(n){if(!A(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var zc=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Bc(n){return typeof n=="string"&&zc.has(n)?n:void 0}function In(n){if(n.type!=="user")return;let e=Mt(n).filter(o=>A(o)&&o.type==="tool_result"&&typeof o.tool_use_id=="string");if(e.length===0)return;let t=Array.isArray(n.toolDenialKind)?n.toolDenialKind:e.length===1?[n.toolDenialKind]:[],s=Array.isArray(n.userFeedback)?n.userFeedback:e.length===1?[n.userFeedback]:[],r=e.flatMap((o,i)=>{let a=Bc(t[i]);if(!a)return[];let u=s[i];return[{id:o.tool_use_id,non_execution_kind:a,...typeof u=="string"?{user_feedback:u}:{}}]});return r.length>0?r:void 0}function He(n){if(n.type!=="assistant"||!A(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function Yr(n){return n.type!=="user"||!n.parentUuid?!1:Mt(n).some(e=>A(e)&&e.type==="tool_result")}function Qc(n){if(!A(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function Jc(n,e){let t=new Map;for(let[s,r]of n){let o=Qc(r);if(o){let i=t.get(o);i?i.push(s):t.set(o,[s])}}for(let[s,r]of n){let o=Hc(r,r.parentUuid,n,t,e);o!==r.parentUuid&&n.set(s,{...r,parentUuid:o})}}function Hc(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]:Gc(n,o,t)??Wc(n,o,t,r)??e}function Gc(n,e,t){if(!Yr(n))return;let s=Mt(n).filter(o=>A(o)&&o.type==="tool_result").map(o=>o.tool_use_id).filter(o=>typeof o=="string");if(s.length===0)return;let r=e.filter(o=>{let i=t.get(o);return i?Mt(i).some(a=>A(a)&&a.type==="tool_use"&&s.includes(typeof a.id=="string"?a.id:"")):!1});return r.length===1?r[0]:void 0}function Wc(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 Vc(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 Br(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 Yc(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 d=He(p);d&&i.set(d,p)}let a=new Map,u=new Map;for(let p of n.values()){let d=He(p);if(d){let g=a.get(d)??[];g.push(p),a.set(d,g);continue}if(Yr(p)&&p.parentUuid){let g=u.get(p.parentUuid)??[];g.push(p),u.set(p.parentUuid,g)}}let c=new Set,l=new Map;for(let p of s){let d=He(p);if(!d||c.has(d))continue;c.add(d);let g=a.get(d)??[p],h=g.filter(_=>!t.has(_.uuid)),f=[];for(let _ of g){let oe=u.get(_.uuid)??[];for(let Ye of oe)t.has(Ye.uuid)||f.push(Ye)}if(h.length===0&&f.length===0)continue;let y=i.get(d);if(!y)continue;let b=[...g].sort((_,oe)=>Br(_,oe,r));f.sort((_,oe)=>Br(_,oe,r));let w=b.findIndex(_=>_.uuid===y.uuid),T=b.slice(0,Math.max(w,0)).filter(_=>!t.has(_.uuid)),C=b.slice(w+1).filter(_=>!t.has(_.uuid)),re=[...T,...C,...f];for(let _ of re)t.add(_.uuid);l.set(y.uuid,re)}if(l.size===0)return e;let m=[];for(let p of e){let d=l.get(p.uuid);if(d){let g=r.get(p.uuid)??Number.MAX_SAFE_INTEGER,h=[],f=[];for(let y of d)(p.type==="assistant"&&y.type==="assistant"&&He(y)===He(p)&&(r.get(y.uuid)??Number.MAX_SAFE_INTEGER)<g?h:f).push(y);m.push(...h,p,...f)}else m.push(p)}return m}function Xr(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,r=new Map;for(let[l,m]of n.entries())s.set(m.uuid,m),r.set(m.uuid,l);t==="runtime"&&Vc(s),Jc(s,r);let o;if(e?.leafUuid===null)return[];if(e){let l=s.get(e.leafUuid),m=l?.sessionId??l?.session_id;l&&(m===void 0||m===e.sessionId)&&(o=l)}if(!o){let l=new Set;for(let h of s.values())h.parentUuid&&l.add(h.parentUuid);let m=Array.from(s.values()).filter(h=>!l.has(h.uuid)),p=[];for(let h of m){let f=h,y=new Set;for(;f&&!y.has(f.uuid);){if(y.add(f.uuid),f.type==="user"||f.type==="assistant"){p.push(f);break}f=f.parentUuid?s.get(f.parentUuid):void 0}}if(p.length===0)return[];let d=p.filter(h=>!h.isSidechain&&!h.teamName&&!h.isMeta);o=(d.length>0?d:p).reduce((h,f)=>(r.get(f.uuid)??-1)>(r.get(h.uuid)??-1)?f:h)}let i=[],a=new Set,u=o;for(;u&&!a.has(u.uuid);){a.add(u.uuid),i.push(u);let l=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=l?s.get(l):void 0}i.reverse();let c=t==="runtime"?Xc(i):i;return Yc(s,c,new Set(c.map(l=>l.uuid)))}function Xc(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 Zc(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function Dn(n,e,t){let s=n.flatMap(o=>A(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Vr.has(o.type)?[o]:[]),r;for(let o of n){if(!A(o)||o.type!=="active-leaf"||(o.sessionId??o.session_id)!==e)continue;let a=Object.hasOwn(o,"leafUuid")?o.leafUuid:o.leaf_uuid;a!==null&&typeof a!="string"||(r={leafUuid:a,sessionId:e})}return Xr(s,r,t)}function Qr(n,e,t){if(t==="historical"&&Zc(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 el(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 xn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function Nn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function Jr(n){let e=n.type==="system"?el(n.compactMetadata):void 0,t=In(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,...xn(n),...Nn(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 Hr(n,e){let t=Math.max(0,e?.offset??0),s=e?.limit;return s!==void 0&&s>0?n.slice(t,t+s):t>0?n.slice(t):n}async function At(n){try{return await Nc(zr(n))}catch{return zr(n)}}async function tl(n){return N(await At(n))}async function ne(n){let e=Ce();if(n?.dir){let t=await At(n.dir),s=[O(e,N(t))];if(n.includeWorktrees!==!1)try{let{stdout:r}=await Uc("git",["worktree","list","--porcelain"],{cwd:n.dir}),o=r.split(`
24
+ `).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)s.push(O(e,await tl(i)))}catch{}return s}try{return(await An(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>O(e,s.name))}catch{return[]}}async function Zr(n){try{let[e,t]=await Promise.all([Ot(n,"utf-8"),xe(n)]),s=e.trim().split(`
25
+ `).filter(Boolean).flatMap(o=>{try{let i=JSON.parse(o);return A(i)?[i]:[]}catch{return[]}});if(s.length===0)return null;let r=jc(n,".jsonl");return jn(r,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function eo(n,e){return O(n,e,"subagents")}function to(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 no(n){let e=[];async function t(s){let r;try{r=await An(s,{withFileTypes:!0})}catch{return}for(let o of r){let i=O(s,o.name);if(o.isDirectory()){await t(i);continue}if(o.isFile()&&o.name.startsWith("agent-")&&o.name.endsWith(".jsonl")){let a=o.name.slice(6,-6);a&&e.push({agentId:a,filePath:i})}}}return await t(n),e}async function nl(n){try{let e=await Ot(n.replace(/\.jsonl$/,".meta.json"),"utf-8"),t=JSON.parse(e);return{parentToolUseId:typeof t.toolUseId=="string"&&t.toolUseId.length>0?t.toolUseId:null,parentAgentId:typeof t.parentAgentId=="string"&&t.parentAgentId.length>0?t.parentAgentId:null}}catch{return{parentToolUseId:null,parentAgentId:null}}}function so(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 sl(n,e,t){let[s,r]=await Promise.all([Ot(n,"utf-8"),nl(n)]),o=[];for(let l of s.trim().split(`
26
+ `).filter(Boolean))try{let m=JSON.parse(l);to(m)&&o.push(m)}catch{}let a=so(o).map(l=>{let m=In(l);return{type:l.type,uuid:l.uuid,session_id:l.sessionId??e,message:l.message,parent_tool_use_id:r.parentToolUseId,parent_agent_id:r.parentAgentId,...xn(l),...Nn(l),...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 Ne(n){return N(await At(n??process.cwd()))}function Ge(n,e){return{projectKey:n,sessionId:e}}function rl(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 ol(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 il=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function al(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(il,"");if(s===e)return s;e=s}return e}var ul=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,cl=/<command-name>(.*?)<\/command-name>/,ll=/<bash-input>([\s\S]*?)<\/bash-input>/;function dl(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 pl(n,e){if(n.type!=="user"||n.isMeta===!0||n.isCompactSummary===!0)return;let t=n.message;if(!A(t))return;let s=t.content,r=[];if(typeof s=="string")r.push(s);else if(Array.isArray(s)){for(let o of s)if(A(o)){if(o.type==="tool_result")return;o.type==="text"&&typeof o.text=="string"&&r.push(o.text)}}for(let o of r){let i=o.replaceAll(`
27
+ `," ").trim();if(!i)continue;let a=cl.exec(i);if(a){e.commandFallback??=a[1];continue}let u=ll.exec(i);if(u)return`! ${u[1].trim()}`;if(!ul.test(i))return dl(i)}}function jn(n,e,t,s={}){if(e.length===0)return;let r,o,i,a,u,c,l,m,p,d,g;for(let b of e){let w=b;if(g??=w.isSidechain===!0,d===void 0&&typeof w.timestamp=="string"){let T=Date.parse(w.timestamp);Number.isFinite(T)&&(d=T)}if(!r){let T={commandFallback:o};r=pl(w,T),o=T.commandFallback}w.type==="custom-title"&&typeof w.customTitle=="string"&&(i=w.customTitle),w.type==="ai-title"&&typeof w.aiTitle=="string"&&(a=w.aiTitle),typeof w.lastPrompt=="string"&&(u=w.lastPrompt),typeof w.summary=="string"&&(c=w.summary),w.type==="tag"&&(p=typeof w.tag=="string"&&w.tag?w.tag:void 0),typeof w.gitBranch=="string"&&(l=w.gitBranch),m===void 0&&typeof w.cwd=="string"&&(m=w.cwd),w.type==="relocated"&&typeof w.relocatedCwd=="string"&&(m=w.relocatedCwd)}if(g)return;let h=r??o,f=i||a,y=f||u||c||h;if(y)return{sessionId:n,summary:y,lastModified:t??rl(e),fileSize:s.fileSize,customTitle:f,firstPrompt:h,gitBranch:l,cwd:m||s.defaultCwd,tag:p,createdAt:d}}async function ro(n,e,t){let s=Ge(await Ne(t),e),r=await n.load(s);return r?{key:s,entries:r}:void 0}async function ml(n){if(n?.sessionStore){let c=n.sessionStore;if(!c.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let l=await At(n.dir??process.cwd()),m=N(l),p=(await c.listSessions(m)).slice().sort((f,y)=>y.mtime-f.mtime),d=Math.max(0,n.offset??0),g=n.limit!==void 0&&n.limit>0?p.slice(d,d+n.limit):d>0?p.slice(d):p;return(await Promise.allSettled(g.map(async({sessionId:f,mtime:y})=>{let b=await c.load(Ge(m,f));return b?jn(f,b,y,{defaultCwd:l}):void 0}))).flatMap((f,y)=>{if(f.status==="fulfilled")return f.value?[f.value]:[];let b=g[y];return[{sessionId:b.sessionId,summary:"",lastModified:b.mtime}]})}let e=await ne(n),s=(await Promise.all(e.map(async c=>{try{return(await An(c)).filter(m=>m.endsWith(".jsonl")).map(m=>O(c,m))}catch{return[]}}))).flat(),r=await Promise.all(s.map(Zr)),o=new Map;for(let c of r){if(!c)continue;let l=o.get(c.sessionId);(!l||c.lastModified>l.lastModified)&&o.set(c.sessionId,c)}let i=Array.from(o.values()).sort((c,l)=>l.lastModified-c.lastModified),a=n?.offset??0,u=n?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function fl(n,e){if(e?.sessionStore){if(!ye(n))return;let s=await ro(e.sessionStore,n,e.dir);return s?jn(n,s.entries,ol(s.entries)):void 0}let t=await ne(e);for(let s of t){let r=O(s,`${n}.jsonl`),o=await Zr(r);if(o)return o}}async function gl(n,e){if(!ye(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let o=await ro(e.sessionStore,n,e.dir);if(!o)return[];let i=Dn(o.entries,n,s);return Hr(i.filter(a=>Qr(a,t,s)).map(Jr),e)}let r=await ne(e);for(let o of r){let i=O(o,`${n}.jsonl`);try{let a=await Ot(i,"utf-8"),c=Xr(Kc(a),$c(a,n),s).filter(l=>Qr(l,t,s)).map(Jr);return Hr(c,e)}catch{continue}}return[]}async function hl(n,e,t){if(!ye(n))throw new Error(`Invalid sessionId: ${n}`);let s=e.trim();if(!s)throw new Error("title must be non-empty");if(t?.sessionStore){await t.sessionStore.append(Ge(await Ne(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Wr(),timestamp:new Date().toISOString()}]);return}let r=await ne(t);for(let o of r){let i=O(o,`${n}.jsonl`);try{await xe(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await Gr(i,a+`
28
+ `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function yl(n,e,t){if(!ye(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:al(e).trim();if(s!==null&&!s)throw new Error("tag must be non-empty (use null to clear)");if(t?.sessionStore){await t.sessionStore.append(Ge(await Ne(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Wr(),timestamp:new Date().toISOString()}]);return}let r=await ne(t);for(let o of r){let i=O(o,`${n}.jsonl`);try{await xe(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await Gr(i,a+`
29
+ `);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function Sl(n,e){if(e?.sessionStore){if(!ye(n))return[];if(!e.sessionStore.listSubkeys)throw new Error("sessionStore.listSubkeys() is required by listSubagents()");let s=await e.sessionStore.listSubkeys({projectKey:await Ne(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 ne(e);for(let s of t){let r=O(s,`${n}.jsonl`);try{await xe(r);let o=await no(eo(s,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function wl(n,e,t){if(t?.sessionStore){if(!ye(n)||!e)return[];let r=await Ne(t.dir),o=`subagents/agent-${e}`;if(t.sessionStore.listSubkeys){let d=await t.sessionStore.listSubkeys({projectKey:r,sessionId:n}),g=`agent-${e}`,h=d.find(f=>f.startsWith("subagents/")&&f.split("/").at(-1)===g);if(!h)return[];o=h}let i=await t.sessionStore.load({projectKey:r,sessionId:n,subpath:o});if(!i)return[];let a=i.filter(to),u=i.filter(d=>d.type==="agent_metadata").at(-1),c=typeof u?.toolUseId=="string"?u.toolUseId:null,l=typeof u?.parentAgentId=="string"?u.parentAgentId:null,m=so(a).map(d=>{let g=In(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??n,message:d.message,parent_tool_use_id:c,parent_agent_id:l,...xn(d),...Nn(d),...g?{tool_result_meta:g}:{}}}),p=Math.max(0,t.offset??0);return t.limit!==void 0?m.slice(p,p+t.limit):m.slice(p)}let s=await ne(t);for(let r of s){let o=O(r,`${n}.jsonl`);try{await xe(o);let a=(await no(eo(r,n))).find(u=>u.agentId===e);return a?await sl(a.filePath,n,t):[]}catch{continue}}return[]}async function vl(n,e){if(!ye(n))throw new Error(`Invalid sessionId: ${n}`);if(e?.sessionStore){if(!e.sessionStore.delete)throw new Error("SessionStore does not support delete()");await e.sessionStore.delete(Ge(await Ne(e.dir),n));return}let t=await ne(e);for(let s of t){let r=O(s,`${n}.jsonl`);try{await xe(r),await Promise.all([$r(r,{force:!0}),$r(O(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as It}from"crypto";import{readdir as bl,readFile as _l,realpath as kl,stat as oo,writeFile as Rl}from"fs/promises";import{dirname as El,join as qn,resolve as Pl}from"path";var io=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Tl=new Set(["user","assistant","attachment","system","progress"]);async function uo(n){let e=Pl(n);try{return await kl(e)}catch{return e}}async function Cl(n,e){let t=Ce();if(e){let r=N(await uo(e)),o=qn(t,r,`${n}.jsonl`);try{if((await oo(o)).size>0)return o}catch{}return}let s;try{s=await bl(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=qn(t,r.name,`${n}.jsonl`);try{if((await oo(o)).size>0)return o}catch{}}}function co(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:Dn(n,e,"historical").filter(o=>Tl.has(o.type)),contentReplacements:t,relocatedCwd:s}}function Ml(n,e){let t=[];for(let s of n.split(`
30
+ `))if(s.trim())try{t.push(JSON.parse(s))}catch{}return co(t,e)}function Ol(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 Al(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??Ol(n)}function ao(n,e,t,s){let r=n.transcript.filter(d=>d.isSidechain!==!0);if(r.length===0)throw new Error(`Session ${e} has no messages to fork`);if(t.upToMessageId){let d=r.findIndex(g=>g.uuid===t.upToMessageId);if(d<0)throw new Error(`Message ${t.upToMessageId} not found in session ${e}`);r=r.slice(0,d+1)}let o=new Set(r.map(d=>d.uuid)),i=new Map(r.map(d=>[d.uuid,It()])),a=r.filter(d=>d.type!=="progress");if(a.length===0)throw new Error(`Session ${e} has no messages to fork`);let u=new Map(r.map(d=>[d.uuid,d])),c=It(),l=new Date().toISOString(),m=a.map((d,g)=>{let h=null,f=typeof d.parentUuid=="string"?d.parentUuid:void 0;for(;f;){let w=u.get(f);if(!w)break;if(w.type!=="progress"){h=i.get(f)??null;break}f=typeof w.parentUuid=="string"?w.parentUuid:void 0}let y=typeof d.logicalParentUuid=="string"?i.get(d.logicalParentUuid)??null:d.logicalParentUuid??null,b={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(d.uuid),parentUuid:h,logicalParentUuid:y,sessionId:c,timestamp:g===a.length-1?l:typeof d.timestamp=="string"?d.timestamp:l,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete b.teamName,delete b.agentName,delete b.sessionKind,delete b.slug,delete b.sourceToolAssistantUUID,b});if(n.contentReplacements.length>0){let d=n.contentReplacements.flatMap(g=>{if(g===null||typeof g!="object")return[];let h=g.messageUuid;if(typeof h!="string"||!o.has(h))return[];let f=i.get(h);return f?[{...g,messageUuid:f}]:[]});d.length>0&&m.push({type:"content-replacement",sessionId:c,replacements:d,uuid:It(),timestamp:l})}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||`${Al(s)??"Forked session"} (fork)`,uuid:It(),timestamp:l}),{sessionId:c,entries:m}}async function Il(n,e={}){if(!io.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!io.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await uo(e.dir??process.cwd()),a=N(i),u=await e.sessionStore.load({projectKey:a,sessionId:n});if(!u?.length)throw new Error(`Session ${n} not found`);let c=ao(co(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:c.sessionId},c.entries),{sessionId:c.sessionId}}let t=await Cl(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await _l(t,"utf8"),r=s.split(`
32
+ `).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=ao(Ml(s,n),n,e,r);return await Rl(qn(El(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
33
33
  `)}
34
- `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function It(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var jn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=It(e),r=this.entries.get(s)??[];r.push(...t),this.entries.set(s,r),this.keys.set(s,{...e});let o=Math.max(Date.now(),this.lastModifiedAt+1);this.lastModifiedAt=o,this.modifiedAt.set(s,o)}async load(e){let t=this.entries.get(It(e));return t?[...t]:null}async listSessions(e){let t=[];for(let[s,r]of this.keys)r.projectKey!==e||r.subpath!==void 0||t.push({sessionId:r.sessionId,mtime:this.modifiedAt.get(s)??0});return t.sort((s,r)=>r.mtime-s.mtime)}async delete(e){if(e.subpath!==void 0){this.deleteSerialized(It(e));return}for(let[t,s]of this.keys)s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&this.deleteSerialized(t)}async listSubkeys(e){let t=[];for(let s of this.keys.values())s.projectKey===e.projectKey&&s.sessionId===e.sessionId&&s.subpath!==void 0&&t.push(s.subpath);return t.sort()}getEntries(e){return[...this.entries.get(It(e))??[]]}get size(){let e=0;for(let t of this.keys.values())t.subpath===void 0&&(e+=1);return e}clear(){this.entries.clear(),this.keys.clear(),this.modifiedAt.clear(),this.lastModifiedAt=0}deleteSerialized(e){this.entries.delete(e),this.keys.delete(e),this.modifiedAt.delete(e)}};import{createReadStream as Od}from"fs";import{readdir as po,readFile as Ad,realpath as Dd,stat as uo}from"fs/promises";import{basename as co,dirname as Id,join as We,relative as xd,resolve as Nd,sep as jd}from"path";import{createInterface as qd}from"readline";var Fd=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ud=500,Ld=1024*1024;async function Kd(n){let e=Nd(n);try{return await Dd(e)}catch{return e}}async function $d(n,e){let t=Ce();if(e){let r=N(await Kd(e)),o=We(t,r,`${n}.jsonl`);try{if((await uo(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await po(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=We(t,r.name,`${n}.jsonl`);try{if((await uo(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function zd(n){let e=[];async function t(s){let r;try{r=await po(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=We(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function lo(n,e,t,s){let r=qd({input:Od(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>=Ld)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Qd(n,e,t={}){if(!Fd.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await $d(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:Ud;if(await lo(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=We(o,"subagents");for(let a of await zd(i)){let c=xd(o,a).split(jd);c[c.length-1]=co(c[c.length-1],".jsonl");let d={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await lo(a,d,e,r);let m=We(Id(a),`${co(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await Ad(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 Bd}from"node:child_process";import{existsSync as Jd}from"node:fs";import{Worker as Hd}from"node:worker_threads";var qn=3e4;async function mo(n,e={}){let t=Me({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ie);return t.transport==="worker"?Wd(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Gd(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??W()})}function Gd(n,e){return new Promise((t,s)=>{let r=Bd(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:fo(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(go(e.timeoutMs)))},e.timeoutMs??qn);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 Wd(n,e){Yd(e.signal);let t=Y(e.pathToQoderWorkerRuntime),s=await ke(t);Vd(s);let r=e.cwd??process.cwd(),o=fo(e.env);delete o.NODE_OPTIONS;let i=lt(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new Hd(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),d="",m="",p=!1,l,g=c.stdout===null,h=c.stderr===null,f=()=>{clearTimeout(T),e.signal?.removeEventListener("abort",S)},y=C=>{p||(p=!0,f(),u(C))},b=()=>{p||l===void 0||!g||!h||(p=!0,f(),a({stdout:d,stderr:m,exitCode:l}))},S=()=>{c.terminate(),y(ho(e.signal))},T=setTimeout(()=>{c.terminate(),y(go(e.timeoutMs))},e.timeoutMs??qn);c.stdin?.end(),c.stdout?.on("data",C=>{d+=C.toString()}),c.stdout?.on("end",()=>{g=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{h=!0,b()}),c.once("error",y),c.once("exit",C=>{l=C,b()}),e.signal?.addEventListener("abort",S,{once:!0}),e.signal?.aborted&&S()})}function fo(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function Vd(n){if(!Jd(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function go(n){return new Error(`qodercli subprocess timed out after ${n??qn}ms`)}function Yd(n){if(n?.aborted)throw ho(n)}function ho(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function Xd(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await Ne(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,resources:r.resources}))}async function Zd(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ne(t,e);s.exitCode!==0&&Ve(s)}async function el(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await Ne(t,e);s.exitCode!==0&&Ve(s)}async function tl(n,e){let t=await Ne(["plugins","install",n,"--scope","user","--json"],e);t.exitCode!==0&&Ve(t);let s=JSON.parse(t.stdout);return{pluginId:s.pluginId,version:s.version??"local",path:s.path}}async function nl(n,e){let t=["plugins","uninstall",n,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let s=await Ne(t,e);s.exitCode!==0&&Ve(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}async function sl(n,e){let t;try{t=await Ne(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new F("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw ne("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=rl(`${t.stderr}
35
- ${t.stdout}`);throw ne(r?"plugin_validation_unsupported":"plugin_validation_protocol_error",r?"The selected qodercli does not support structured plugin validation.":"qodercli returned an invalid plugin validation response.")}if(s&&typeof s=="object"&&"ok"in s&&s.schemaVersion!==1)throw ne("plugin_validation_schema_unsupported","qodercli returned an unsupported plugin validation schema version.");if(s&&typeof s=="object"&&s.ok===!0&&s.report){let r=s.report;if(il(r))return r;throw ne("plugin_validation_protocol_error","qodercli returned a malformed plugin validation report.")}if(s&&typeof s=="object"&&s.ok===!1){let r=s.error;if(!r||typeof r!="object"||typeof r.code!="string"||typeof r.message!="string")throw ne("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw ne(o.code,o.message)}throw t.exitCode!==0&&Ve(t),ne("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function rl(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var ol=3e4;function Ne(n,e){return mo(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:ol})}function Ve(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw ne(e,t)}function ne(n,e){let t=new Error(e);return t.code=n,t}function il(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 al}from"child_process";function ul(){return W()}async function cl(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??ul(),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=>{al(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 wo={};Eo(wo,{filterEscalatingDefaultMode:()=>yo,isBashToolBackgroundLaunchResult:()=>So});var dl=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function yo(n){let e=n.effective.permissions?.defaultMode;if(!e||!dl.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 So(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{F as AbortError,st as AuthAccessTokenEnvVarError,rt as AuthServiceAccountEnvVarError,Gn as DEFAULT_ACCESS_TOKEN_ENV_VAR,ie as DEFAULT_RUNTIME_TRANSPORT,nt as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,To as EXIT_REASONS,Po as HOOK_EVENTS,jn as InMemorySessionStore,vt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Fe as ModelPolicyTimeoutError,be as ProcessTransport,G as ProtocolVersionMismatchError,I as QoderCliProcessError,ue as QoderWorkerRuntimeError,ce as UnsupportedCliCapabilityError,Bt as WIRE_PROTOCOL_VERSION,Re as WorkerTransport,Io as accessToken,xo as accessTokenFromEnv,wo as coreTypes,Oc as createSdkMcpServer,yd as deleteSession,el as disablePlugin,Zd as enablePlugin,yo as filterEscalatingDefaultMode,Md as forkSession,ld as getSessionInfo,pd as getSessionMessages,hd as getSubagentMessages,Ss as hasResolvableQoderWorkerRuntime,Qd as importSessionToStore,tl as installPlugin,So as isBashToolBackgroundLaunchResult,Fo as jobToken,Xd as listPlugins,dd as listSessions,gd as listSubagents,No as qodercliAuth,kn as query,md as renameSession,Y as resolveQoderWorkerRuntimePath,Cc as resolveSettings,jo as serviceAccount,qo as serviceAccountFromEnv,nc as startDaemon,gc as startup,cl as submitFeedback,fd as tagSession,Ac as tool,nl as uninstallPlugin,sl as validatePlugin};
34
+ `,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Dt(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Fn=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Dt(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(Dt(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(Dt(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(Dt(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 Dl}from"fs";import{readdir as fo,readFile as xl,realpath as Nl,stat as lo}from"fs/promises";import{basename as po,dirname as jl,join as We,relative as ql,resolve as Fl,sep as Ul}from"path";import{createInterface as Ll}from"readline";var Kl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,$l=500,zl=1024*1024;async function Bl(n){let e=Fl(n);try{return await Nl(e)}catch{return e}}async function Ql(n,e){let t=Ce();if(e){let r=N(await Bl(e)),o=We(t,r,`${n}.jsonl`);try{if((await lo(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await fo(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=We(t,r.name,`${n}.jsonl`);try{if((await lo(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function Jl(n){let e=[];async function t(s){let r;try{r=await fo(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=We(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function mo(n,e,t,s){let r=Ll({input:Dl(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>=zl)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Hl(n,e,t={}){if(!Kl.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await Ql(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:$l;if(await mo(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=We(o,"subagents");for(let a of await Jl(i)){let c=ql(o,a).split(Ul);c[c.length-1]=po(c[c.length-1],".jsonl");let l={projectKey:s.projectKey,sessionId:n,subpath:c.join("/")};await mo(a,l,e,r);let m=We(jl(a),`${po(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await xl(m,"utf8"));await e.append(l,[{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 Gl}from"node:child_process";import{existsSync as Wl}from"node:fs";import{Worker as Vl}from"node:worker_threads";var Un=3e4;async function go(n,e={}){let t=Me({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ue);return t.transport==="worker"?Xl(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Yl(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??W()})}function Yl(n,e){return new Promise((t,s)=>{let r=Gl(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:ho(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(yo(e.timeoutMs)))},e.timeoutMs??Un);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 Xl(n,e){ed(e.signal);let t=Y(e.pathToQoderWorkerRuntime),s=await ke(t);Zl(s);let r=e.cwd??process.cwd(),o=ho(e.env);delete o.NODE_OPTIONS;let i=dt(s,{cwd:r,env:o});return new Promise((a,u)=>{let c=new Vl(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),l="",m="",p=!1,d,g=c.stdout===null,h=c.stderr===null,f=()=>{clearTimeout(T),e.signal?.removeEventListener("abort",w)},y=C=>{p||(p=!0,f(),u(C))},b=()=>{p||d===void 0||!g||!h||(p=!0,f(),a({stdout:l,stderr:m,exitCode:d}))},w=()=>{c.terminate(),y(So(e.signal))},T=setTimeout(()=>{c.terminate(),y(yo(e.timeoutMs))},e.timeoutMs??Un);c.stdin?.end(),c.stdout?.on("data",C=>{l+=C.toString()}),c.stdout?.on("end",()=>{g=!0,b()}),c.stderr?.on("data",C=>{m+=C.toString()}),c.stderr?.on("end",()=>{h=!0,b()}),c.once("error",y),c.once("exit",C=>{d=C,b()}),e.signal?.addEventListener("abort",w,{once:!0}),e.signal?.aborted&&w()})}function ho(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function Zl(n){if(!Wl(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function yo(n){return new Error(`qodercli subprocess timed out after ${n??Un}ms`)}function ed(n){if(n?.aborted)throw So(n)}function So(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function td(n){let e=["plugins","list","--json"];n?.orgId&&e.push("--org-id",n.orgId);let t=await je(e,n);return JSON.parse(t.stdout).map(r=>({id:r.id,name:r.name,source:r.source,path:r.installPath??r.path,version:r.version??"unknown",scope:r.scope,enabled:r.enabled,canDisable:r.canDisable,displayName:r.displayName,description:r.description,installedAt:r.installedAt,lastUpdated:r.lastUpdated,resources:r.resources}))}async function nd(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await je(t,e);s.exitCode!==0&&Ve(s)}async function sd(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await je(t,e);s.exitCode!==0&&Ve(s)}async function rd(n,e){let t=await je(["plugins","install",n,"--scope","user","--json"],e);t.exitCode!==0&&Ve(t);let s=JSON.parse(t.stdout);return{pluginId:s.pluginId,version:s.version??"local",path:s.path}}async function od(n,e){let t=["plugins","uninstall",n,"--scope","user","--json"];e?.keepData&&t.push("--keep-data");let s=await je(t,e);s.exitCode!==0&&Ve(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}async function id(n,e){let t;try{t=await je(["plugins","validate",n,"--json"],e)}catch(r){if(e?.signal?.aborted||r instanceof Error&&r.name==="AbortError")throw new F("Plugin validation was aborted");let o=r instanceof Error?r.message:String(r);throw se("plugin_validation_failed",`Failed to run qodercli plugin validation: ${o}`)}let s;try{s=JSON.parse(t.stdout)}catch{let r=ad(`${t.stderr}
35
+ ${t.stdout}`);throw se(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 se("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(cd(r))return r;throw se("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 se("plugin_validation_protocol_error","qodercli returned a malformed plugin validation error.");let o=r;throw se(o.code,o.message)}throw t.exitCode!==0&&Ve(t),se("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function ad(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var ud=3e4;function je(n,e){return go(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:ud})}function Ve(n){let e="plugin_operation_failed",t=n.stderr||n.stdout;try{let s=JSON.parse(n.stdout);s.error&&s.code?(e=s.code,t=s.message??t):s.ok===!1&&s.error&&(e=s.error.code??e,t=s.error.message??t)}catch{}throw se(e,t)}function se(n,e){let t=new Error(e);return t.code=n,t}function cd(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 ld}from"child_process";function dd(){return W()}async function pd(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??dd(),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=>{ld(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 bo={};Co(bo,{filterEscalatingDefaultMode:()=>wo,isBashToolBackgroundLaunchResult:()=>vo});var md=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function wo(n){let e=n.effective.permissions?.defaultMode;if(!e||!md.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 vo(n){if(n===null||typeof n!="object"||Array.isArray(n))return!1;let e=n,t=o=>o===void 0||typeof o=="string",s=o=>o===void 0||typeof o=="number"&&Number.isInteger(o)&&o>=0,r=e.backgroundReason;return e.kind==="backgrounded"&&typeof e.pid=="number"&&Number.isInteger(e.pid)&&e.pid>0&&typeof e.taskId=="string"&&typeof e.command=="string"&&typeof e.initialOutput=="string"&&t(e.outputFile)&&t(e.stdout)&&t(e.telemetryExecutionId)&&s(e.totalLines)&&s(e.totalBytes)&&(r===void 0||r==="user"||r==="model"||r==="timeout"||r==="auto")}export{F as AbortError,st as AuthAccessTokenEnvVarError,rt as AuthServiceAccountEnvVarError,Vn as DEFAULT_ACCESS_TOKEN_ENV_VAR,ue as DEFAULT_RUNTIME_TRANSPORT,nt as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,kr as DEFAULT_SESSION_STORE_MAX_PAYLOAD_BYTES,Ae as DaemonRpcError,Oo as EXIT_REASONS,Mo as HOOK_EVENTS,Fn as InMemorySessionStore,vt as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Ue as ModelPolicyTimeoutError,be as ProcessTransport,G as ProtocolVersionMismatchError,D as QoderCliProcessError,le as QoderWorkerRuntimeError,Z as UnsupportedCliCapabilityError,Qt as WIRE_PROTOCOL_VERSION,Re as WorkerTransport,jo as accessToken,qo as accessTokenFromEnv,bo as coreTypes,Dc as createSdkMcpServer,vl as deleteSession,sd as disablePlugin,nd as enablePlugin,wo as filterEscalatingDefaultMode,Il as forkSession,fl as getSessionInfo,gl as getSessionMessages,wl as getSubagentMessages,vs as hasResolvableQoderWorkerRuntime,Hl as importSessionToStore,rd as installPlugin,vo as isBashToolBackgroundLaunchResult,Ko as jobToken,td as listPlugins,ml as listSessions,Sl as listSubagents,Mu as measureSessionStoreEntryPayloadBytes,Fo as qodercliAuth,En as query,hl as renameSession,Y as resolveQoderWorkerRuntimePath,Ac as resolveSettings,Uo as serviceAccount,Lo as serviceAccountFromEnv,oc as startDaemon,Sc as startup,pd as submitFeedback,yl as tagSession,xc as tool,od as uninstallPlugin,id as validatePlugin};