@qoder-ai/qoder-agent-sdk 1.0.32 → 1.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +31 -31
- package/dist/protocol/common.d.ts +2 -2
- package/dist/protocol/control.d.ts +178 -1
- package/dist/protocol/hooks.d.ts +2 -0
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +1 -1
- package/dist/protocol/messages.d.ts +34 -2
- package/dist/protocol/version.d.ts +1 -1
- package/dist/query/goal-max-turns.d.ts +1 -0
- package/dist/query/query-runner.d.ts +22 -2
- package/dist/runtime-manifest.json +5 -5
- package/dist/types/byok.d.ts +5 -5
- package/dist/types/control.d.ts +1 -1
- package/dist/types/messages.d.ts +2 -1
- package/dist/types/options.d.ts +32 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
var Co=Object.defineProperty;var Mo=(n,e)=>{for(var t in e)Co(n,t,{get:e[t],enumerable:!0})};import{spawn as ui}from"child_process";import{createInterface as ci}from"readline";var Oo=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Ao=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],tt=2e3,Hn=5e3;var nt="1.0.32";var ae=41,Qn=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Jn=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Io="QODER_FEATURE_TASKS";function Gn(n){let e=n[Io];if(e!=="0"&&e!=="false")return[...Qn];let t=new Set(Jn);return Qn.flatMap(s=>s===Jn[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as es,mkdtemp as zo,rm as ts,writeFile as Bo}from"fs/promises";import{existsSync as it,mkdtempSync as Qo,readFileSync as Jo,rmSync as Ho,writeFileSync as Go}from"fs";import{homedir as Wo,tmpdir as ns}from"os";import{dirname as cs,join as $}from"path";import{fileURLToPath as Vo}from"url";var Do=/^[A-Za-z0-9_-]{1,64}$/,xo=new Set(["mcp_list","mcp_get","mcp_call"]);function jt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!Do.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(xo.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function qt(n,e){let t={};for(let s of e)jt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function Ft(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=qt(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Wn(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]=Ft(t,s,r)}return e}var No="global",Vn=No==="cn",jo=Vn?"QODERCN_":"QODER_",Ut=`${jo}VPC_ENDPOINT`,v=Vn?{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 Yn=v.accessTokenEnv,st=v.serviceAccountEnv;function qo(n){return{type:"accessToken",accessToken:n}}function Fo(n=Yn){return{type:"accessToken",accessToken:{envVar:n}}}function Uo(){return{type:"qodercli"}}function Lo(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 Ko(n=st){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function $o(n){return{type:"jobToken",fetchJobToken:n}}var Xn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function Zn(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Xn),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 Xn){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 ss="QODER_AGENT_SDK_ENTRYPOINT",rs="QODER_AGENT_SDK_VERSION",os="QODER_SDK_AUTH_PAYLOAD_FILE",Yo="sdk-ts",Xo=Vo(import.meta.url),is=cs(Xo),rt=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"}},ot=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 at(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function W(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=Zo();if(n)return n;let e=ei();if(it(e))return e;let t=ti();return t||v.cliCommands[0]}function Zo(){for(let n of ls())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,"dist","_bundled",t);if(it(s))return s}return null}function ei(){for(let n of ls())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(it(r))return r}return v.cliCommands[0]}function ti(){let n=process.env[v.cliHomeEnv]??Wo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=$(n,v.configDirName,"local",t);if(it(s))return s}return null}function ls(){let n=[$(is,".."),$(is,"..","..")];return[...new Set(n)]}function ni(){return{allow:[],ask:[],deny:[]}}function as(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function si(n,e){if(e.startsWith("mcp__"))return e;let t=as(n),s=e==="*"?"*":as(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function us(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 ri(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var H=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Ho(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=cs(this.authPayloadPath);try{await ts(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[ss],delete t[rs],delete t[os];for(let s of this.serviceAccountCredentialEnvVars())oi(t,s);if(t[ss]=Yo,t[rs]=nt,this.authPayloadPath&&(t[os]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Ut]=s:delete t[Ut]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[st];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??Gn(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?ri(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=Zn(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]:[];us(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]=Ft(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=ni(),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=si(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]]:[];us(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Jo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Qo($(ns(),"qoder-agent-sdk-settings-"));let t=$(this.generatedSettingsDir,"settings.json");return Go(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await zo($(ns(),"qoder-sdk-auth-"));try{await es(s,448);let r=$(s,"payload.json");return await Bo(r,JSON.stringify(t),{mode:384}),await es(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await ts(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 ot(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 rt(t);return s}};function oi(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 ut(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var ii=new Set(["--mcp-config","--proxy","--settings"]);function ct(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),ii.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as ai}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 ai{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
|
|
1
|
+
var Mo=Object.defineProperty;var Io=(n,e)=>{for(var t in e)Mo(n,t,{get:e[t],enumerable:!0})};import{spawn as li}from"child_process";import{createInterface as ci}from"readline";var Ao=["PreToolUse","PostToolUse","PostToolUseFailure","UserPromptSubmit","SessionStart","SessionEnd","Stop","SubagentStart","SubagentStop","PreCompact","PostCompact","CwdChanged","InstructionsLoaded","FileChanged","PermissionRequest","PermissionDenied","WorktreeCreate","WorktreeRemove"],Oo=["clear","resume","logout","prompt_input_exit","other","bypass_permissions_disabled"],nt=2e3,Hn=5e3;var st="1.0.34";var ae=41,Gn=["Agent","AskUserQuestion","Bash","Edit","Glob","Grep","ImageGen","ImageSearch","NotebookEdit","Read","Skill","TaskCreate","TaskGet","TaskUpdate","TaskList","UpdateGoal","WebFetch","WebSearch","Write"],Jn=["TaskCreate","TaskGet","TaskUpdate","TaskList"],Do="QODER_FEATURE_TASKS";function Wn(n){let e=n[Do];if(e!=="0"&&e!=="false")return[...Gn];let t=new Set(Jn);return Gn.flatMap(s=>s===Jn[0]?["TodoWrite"]:t.has(s)?[]:[s])}import{chmod as ts,mkdtemp as zo,rm as ns,writeFile as Qo}from"fs/promises";import{existsSync as at,mkdtempSync as Go,readFileSync as Jo,rmSync as Ho,writeFileSync as Wo}from"fs";import{homedir as Vo,tmpdir as ss}from"os";import{dirname as cs,join as B}from"path";import{fileURLToPath as Yo}from"url";var xo=/^[A-Za-z0-9_-]{1,64}$/,No=new Set(["mcp_list","mcp_get","mcp_call"]);function jt(n,e){if(e.exposedName!==void 0){if(e.alwaysLoad!==!0)throw new Error(`MCP tool "${n}/${e.name}" requires alwaysLoad: true when exposedName is set.`);if(!xo.test(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" has invalid exposedName "${e.exposedName}".`);if(No.has(e.exposedName))throw new Error(`MCP tool "${n}/${e.name}" cannot use reserved exposedName "${e.exposedName}".`)}}function Ft(n,e){let t={};for(let s of e)jt(n,s),(s.exposedName!==void 0||s.alwaysLoad===!0)&&(t[s.name]={...s.exposedName!==void 0?{exposedName:s.exposedName}:{},...s.alwaysLoad===!0?{alwaysLoad:!0}:{}});return Object.keys(t).length>0?t:void 0}function Ut(n,e,t=e.tools??[]){let{tools:s,...r}=e,o=Ft(n,t);return{...r,...o?{toolOverrides:o}:{}}}function Vn(n){let e={};for(let[t,s]of Object.entries(n)){if(s.type==="sdk")throw new Error(`MCP server "${t}" uses an in-process SDK transport and cannot be changed with setMcpServers().`);let r=s.tools??[],o=r.find(i=>i.permission_policy!==void 0);if(o)throw new Error(`MCP tool "${t}/${o.name}" cannot set permission_policy through setMcpServers(); configure it when creating the query.`);e[t]=Ut(t,s,r)}return e}var qo="global",Yn=qo==="cn",jo=Yn?"QODERCN_":"QODER_",Lt=`${jo}VPC_ENDPOINT`,v=Yn?{productName:"QoderCN",packageName:"@qodercn-ai/qodercn-agent-sdk",cliCommands:["qoderclicn","qodercn"],configDirName:".qoder-cn",projectConfigDirName:".qoder",configDirEnv:"QODERCN_CONFIG_DIR",configDirNameEnv:"QODERCN_CONFIG_DIR_NAME",cliHomeEnv:"QODERCN_CLI_HOME",accessTokenEnv:"QODERCN_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODERCN_SERVICE_ACCOUNT_KEY"}:{productName:"Qoder",packageName:"@qoder-ai/qoder-agent-sdk",cliCommands:["qodercli","qoder"],configDirName:".qoder",projectConfigDirName:".qoder",configDirEnv:"QODER_CONFIG_DIR",configDirNameEnv:"QODER_CONFIG_DIR_NAME",cliHomeEnv:"QODER_CLI_HOME",accessTokenEnv:"QODER_PERSONAL_ACCESS_TOKEN",serviceAccountEnv:"QODER_SERVICE_ACCOUNT_KEY"};var Xn=v.accessTokenEnv,rt=v.serviceAccountEnv;function Fo(n){return{type:"accessToken",accessToken:n}}function Uo(n=Xn){return{type:"accessToken",accessToken:{envVar:n}}}function Lo(){return{type:"qodercli"}}function Ko(n){let e=n.serviceAccountKey!==void 0,t=typeof n.fetchServiceAccountToken=="function";if(e===t)throw new TypeError("serviceAccount() requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return{type:"serviceAccount",...n}}function Bo(n=rt){return{type:"serviceAccount",serviceAccountKey:{envVar:n}}}function $o(n){return{type:"jobToken",fetchJobToken:n}}var Zn=["l1StaticCheck","l2LightweightScan","l3DeepScan"];function es(n){if(n===null||typeof n!="object"||Array.isArray(n))throw new TypeError("securityScan must be an object.");let e=new Set(Zn),t=Object.keys(n).filter(s=>!e.has(s));if(t.length>0)throw new TypeError(`securityScan contains unknown option${t.length===1?"":"s"}: ${t.join(", ")}.`);for(let s of Zn){let r=n[s];if(r!==void 0&&typeof r!="boolean")throw new TypeError(`securityScan.${s} must be a boolean.`)}return{l1StaticCheck:n.l1StaticCheck??!1,l2LightweightScan:n.l2LightweightScan??!1,l3DeepScan:n.l3DeepScan??!1}}var rs="QODER_AGENT_SDK_ENTRYPOINT",os="QODER_AGENT_SDK_VERSION",is="QODER_SDK_AUTH_PAYLOAD_FILE",Xo="sdk-ts",Zo=Yo(import.meta.url),as=cs(Zo),ot=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="AuthAccessTokenEnvVarError"}},it=class extends Error{code="auth_service_account_env_var_not_configured";constructor(e){super(`The Service Account key environment variable "${e}" is not set; set it or pass auth.serviceAccountKey directly.`),this.name="AuthServiceAccountEnvVarError"}};function ut(n){return/\.(js|mjs|tsx?|jsx)$/.test(n)}function V(){if(process.env.QODERCLI_PATH)return process.env.QODERCLI_PATH;let n=ei();if(n)return n;let e=ti();if(at(e))return e;let t=ni();return t||v.cliCommands[0]}function ei(){for(let n of ds())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=B(n,"dist","_bundled",t);if(at(s))return s}return null}function ti(){for(let n of ds())for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=[B(n,"node_modules",".bin",t),B(n,"..","..",".bin",t)];for(let r of s)if(at(r))return r}return v.cliCommands[0]}function ni(){let n=process.env[v.cliHomeEnv]??Vo();for(let e of v.cliCommands){let t=process.platform==="win32"?`${e}.exe`:e,s=B(n,v.configDirName,"local",t);if(at(s))return s}return null}function ds(){let n=[B(as,".."),B(as,"..","..")];return[...new Set(n)]}function si(){return{allow:[],ask:[],deny:[]}}function us(n){return n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}function ri(n,e){if(e.startsWith("mcp__"))return e;let t=us(n),s=e==="*"?"*":us(e);if(!t||!s)throw new Error(`Invalid MCP tool policy name for server "${n}" and tool "${e}"`);return`mcp__${t}__${s}`}function ls(n,e){if(e.length===0)return;let t=new Set(n);for(let s of e)t.has(s)||(n.push(s),t.add(s))}function oi(n){let e=n??{},t=e.general&&typeof e.general=="object"&&!Array.isArray(e.general)?e.general:{},s=t.fileCheckpointing&&typeof t.fileCheckpointing=="object"&&!Array.isArray(t.fileCheckpointing)?t.fileCheckpointing:{};return{...e,general:{...t,fileCheckpointing:{...s,enabled:!0}}}}var H=class{options;diagnostics;logPrefix;authPayloadPath=null;generatedSettingsDir;constructor(e,t,s="[RuntimeLaunch]"){this.options=e,this.diagnostics=t,this.logPrefix=s}async prepare(){return this.options.auth&&(this.authPayloadPath=await this.createAuthPayloadFile(this.options.auth)),{args:this.buildArgs(),env:this.buildEnv(),authPayloadPath:this.authPayloadPath??void 0}}cleanupGeneratedSettings(){if(this.generatedSettingsDir)try{Ho(this.generatedSettingsDir,{recursive:!0,force:!0})}catch{}finally{this.generatedSettingsDir=void 0}}async cleanupAuthPayload(){if(!this.authPayloadPath)return;let e=cs(this.authPayloadPath);try{await ns(e,{recursive:!0,force:!0}),this.diagnostics?.record(`${this.logPrefix} Auth payload cleaned up`)}catch{}this.authPayloadPath=null}buildEnv(){let e=this.options.env??{...process.env},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);delete t[rs],delete t[os],delete t[is];for(let s of this.serviceAccountCredentialEnvVars())ii(t,s);if(t[rs]=Xo,t[os]=st,this.authPayloadPath&&(t[is]=this.authPayloadPath),delete t.NODE_OPTIONS,this.options.vpcEndpoint!==void 0){let s=this.options.vpcEndpoint.trim();s?t[Lt]=s:delete t[Lt]}return t}serviceAccountCredentialEnvVars(){let e=this.options.auth;if(e?.type!=="serviceAccount")return[];let t=[rt];return e.serviceAccountKey&&typeof e.serviceAccountKey!="string"&&t.push(e.serviceAccountKey.envVar),t}buildArgs(){let e=[],t=this.options;if(t.extraArgs&&Object.hasOwn(t.extraArgs,"proxy"))throw new Error("extraArgs.proxy is reserved; use the dedicated proxy option instead.");if(e.push("--print"),e.push("--output-format","stream-json"),e.push("--input-format","stream-json"),t.sessionMirror&&e.push("--session-mirror"),t.persistSession===!1&&e.push("--no-session-persistence"),t.model&&e.push("--model",t.model),t.proxy!==void 0&&e.push("--proxy",t.proxy),t.agent&&e.push("--agent",t.agent),t.debug&&e.push("--debug"),t.resume?e.push("--resume",t.resume):t.continue&&e.push("--continue"),t.resumeSessionAt&&e.push(`--resume-session-at=${t.resumeSessionAt}`),t.resumeDropsTurn!==void 0&&e.push(`--resume-drops-turn=${t.resumeDropsTurn}`),t.sessionId&&e.push("--session-id",t.sessionId),t.permissionMode&&(t.permissionMode==="yolo"?e.push("--yolo"):e.push("--permission-mode",t.permissionMode)),t.allowDangerouslySkipPermissions&&t.permissionMode!=="yolo"&&e.push("--dangerously-skip-permissions"),t.includePartialMessages&&e.push("--include-partial-messages"),t.allowedTools&&t.allowedTools.length>0)for(let o of t.allowedTools)e.push("--allowed-tools",o);if(t.disallowedTools&&t.disallowedTools.length>0)for(let o of t.disallowedTools)e.push("--disallowed-tools",o);let s=t.tools??Wn(t.env??process.env);if(Array.isArray(s)?e.push("--tools",s.join(",")):e.push("--tools","default"),t.canUseTool){if(t.permissionPromptToolName)throw new Error("canUseTool callback cannot be used with permissionPromptToolName. Please use one or the other.");e.push("--permission-prompt-tool","stdio")}else t.permissionPromptToolName&&e.push("--permission-prompt-tool",t.permissionPromptToolName);if(t.extensions&&t.extensions.length>0)for(let o of t.extensions)e.push("--extensions",o);if(t.mcpServers&&Object.keys(t.mcpServers).length>0&&e.push("--mcp-config",JSON.stringify({mcpServers:this.buildCliMcpServers()})),t.allowedMcpServerNames&&t.allowedMcpServerNames.length>0)for(let o of t.allowedMcpServerNames)e.push("--allowed-mcp-server-names",o);t.strictMcpConfig&&e.push("--strict-mcp-config");let r=this.buildSettingsArg();if(r!==void 0&&e.push("--settings",r),t.settingSources!==void 0&&e.push("--setting-sources",t.settingSources.join(",")),e.push("--disable-builtin-skills"),t.additionalDirectories&&t.additionalDirectories.length>0)for(let o of t.additionalDirectories)e.push("--add-dir",o);if(t.maxTurns!==void 0&&e.push("--max-turns",String(t.maxTurns)),t.forkSession&&e.push("--fork-session"),t.plugins&&t.plugins.length>0)for(let o of t.plugins)o.type==="local"&&e.push("--plugin-dir",o.path);if(t.extraArgs)for(let[o,i]of Object.entries(t.extraArgs))e.push(`--${o}`),i!==null&&e.push(i);return e}buildSettingsArg(){let e=this.options.settings,t=this.collectMcpPolicyPermissionRules();if(typeof e=="string"){if(e.length===0)return;if(!this.hasMcpPolicyRules(t)&&!this.options.enableFileCheckpointing&&this.options.securityScan===void 0&&(!this.options.additionalDirectories||this.options.additionalDirectories.length===0))return e;let o=this.readSettingsFile(e);this.applySettingsCompatibility(o),this.applyAdditionalDirectories(o),this.applyMcpPolicyRules(o,t),this.applySecurityScanSetting(o);let i=this.applyFileCheckpointingSetting(o);return Object.keys(i).length>0?this.writeGeneratedSettingsFile(i):void 0}let s={...e??{}};this.applySettingsCompatibility(s),this.applyAdditionalDirectories(s),this.applyMcpPolicyRules(s,t),this.applySecurityScanSetting(s);let r=this.applyFileCheckpointingSetting(s);return Object.keys(r).length>0?JSON.stringify(r):void 0}applyFileCheckpointingSetting(e){return this.options.enableFileCheckpointing?oi(e):e}applySecurityScanSetting(e){let t=this.options.securityScan;t!==void 0&&(e.securityScan=es(t))}applySettingsCompatibility(e){let t=e.permissions;if(t?.defaultMode!==void 0){let s=e.general!==null&&typeof e.general=="object"?e.general:{},r=this.toQoderDefaultPermissionMode(t.defaultMode);r!==void 0&&s.defaultPermissionMode===void 0&&(s.defaultPermissionMode=r),e.general=s}t?.disableBypassPermissionsMode==="disable"&&(e.security={...e.security??{},disableYoloMode:!0})}toQoderDefaultPermissionMode(e){switch(e){case"acceptEdits":return"accept_edits";case"bypassPermissions":case"yolo":return"bypass_permissions";case"dontAsk":return"dont_ask";case"default":case"accept_edits":case"bypass_permissions":case"dont_ask":case"plan":case"auto":return e;default:return}}applyAdditionalDirectories(e){let t=this.options.additionalDirectories;if(!t||t.length===0)return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{},r=Array.isArray(s.additionalDirectories)?[...s.additionalDirectories]:[];ls(r,t),s.additionalDirectories=r,e.permissions=s}buildCliMcpServers(){let e=this.options.mcpServers;if(!e||Object.keys(e).length===0)return e;let t={};for(let[s,r]of Object.entries(e)){let o=this.options.mcpToolPolicies?.[s]??r.tools??[];t[s]=Ut(s,r,o)}return t}collectMcpPolicyPermissionRules(){let e=si(),t=new Map;for(let[s,r]of Object.entries(this.options.mcpToolPolicies??{}))r.length>0&&t.set(s,r);for(let[s,r]of Object.entries(this.options.mcpServers??{})){let o=r.tools;Array.isArray(o)&&o.length>0&&t.set(s,[...t.get(s)??[],...o])}for(let[s,r]of t)for(let o of r){let i=ri(s,o.name);switch(o.permission_policy){case"always_allow":e.allow.push(i);break;case"always_ask":e.ask.push(i);break;case"always_deny":e.deny.push(i);break;case void 0:break}}return e}hasMcpPolicyRules(e){return e.allow.length>0||e.ask.length>0||e.deny.length>0}applyMcpPolicyRules(e,t){if(!this.hasMcpPolicyRules(t))return;let s=e.permissions!==null&&typeof e.permissions=="object"?e.permissions:{};e.permissions=s;for(let r of["allow","ask","deny"]){let o=Array.isArray(s[r])?[...s[r]]:[];ls(o,t[r]),s[r]=o}}readSettingsFile(e){let t=Jo(e,"utf8").trim();if(!t)return{};let s=JSON.parse(t);if(s===null||typeof s!="object"||Array.isArray(s))throw new Error("Settings file must contain a JSON object.");return s}writeGeneratedSettingsFile(e){this.generatedSettingsDir=Go(B(ss(),"qoder-agent-sdk-settings-"));let t=B(this.generatedSettingsDir,"settings.json");return Wo(t,JSON.stringify(e),"utf8"),t}async createAuthPayloadFile(e){let t=this.buildAuthPayload(e),s=await zo(B(ss(),"qoder-sdk-auth-"));try{await ts(s,448);let r=B(s,"payload.json");return await Qo(r,JSON.stringify(t),{mode:384}),await ts(r,384),this.diagnostics?.record(`${this.logPrefix} Auth payload created: type=${t.type}, path=${r}`),r}catch(r){throw await ns(s,{recursive:!0,force:!0}).catch(()=>{}),r}}buildAuthPayload(e){switch(e.type){case"accessToken":return{type:"accessToken",accessToken:this.resolveAccessToken(e)};case"qodercli":return{type:"qodercli"};case"jobToken":return{type:"jobToken",jobTokenProvider:"host"};case"serviceAccount":{let t=e.serviceAccountKey!==void 0,s=typeof e.fetchServiceAccountToken=="function";if(t===s)throw new TypeError("Service Account auth requires exactly one credential source: serviceAccountKey or fetchServiceAccountToken");return s?{type:"serviceAccount",serviceAccountTokenProvider:"host"}:{type:"serviceAccount",serviceAccountKey:this.resolveServiceAccountKey(e)}}}}resolveServiceAccountKey(e){if(!e.serviceAccountKey)throw new Error("Service Account key authentication requires serviceAccountKey");if(typeof e.serviceAccountKey=="string")return e.serviceAccountKey;let t=e.serviceAccountKey.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new it(t);return s}resolveAccessToken(e){if(typeof e.accessToken=="string")return e.accessToken;let t=e.accessToken.envVar,s=this.options.env&&Object.hasOwn(this.options.env,t)?this.options.env[t]:process.env[t];if(!s)throw new ot(t);return s}};function ii(n,e){if(process.platform!=="win32"){delete n[e];return}let t=e.toLowerCase();for(let s of Object.keys(n))s.toLowerCase()===t&&delete n[s]}function lt(n,e){let t={...n};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}var ai=new Set(["--mcp-config","--proxy","--settings"]);function ct(n){let e=[];for(let t=0;t<n.length;t+=1){let s=n[t];e.push(s),ai.has(s)&&t+1<n.length&&(e.push("[redacted]"),t+=1)}return e.join(" ")}import{Transform as ui}from"node:stream";var $=16*1024*1024,Fe=class extends Error{constructor(t,s){super(`${t} exceeded the ${s}-byte frame limit`);this.direction=t;this.limit=s;this.name="FrameTooLargeError"}code="DAEMON_FRAME_TOO_LARGE"},Y=class extends ui{constructor(t=$,s="JSONL input"){super();this.maxLineBytes=t;this.direction=s;if(!Number.isSafeInteger(t)||t<=0)throw new Error("maxLineBytes must be a positive safe integer")}bytesSinceNewline=0;_transform(t,s,r){let o=Buffer.isBuffer(t)?t:Buffer.from(t,s),i=0;for(let a=0;a<o.length;a+=1)if(o[a]===10){if(this.bytesSinceNewline+=a-i,this.bytesSinceNewline>this.maxLineBytes){r(new Fe(this.direction,this.maxLineBytes));return}this.bytesSinceNewline=0,i=a+1}if(this.bytesSinceNewline+=o.length-i,this.bytesSinceNewline>this.maxLineBytes){r(new Fe(this.direction,this.maxLineBytes));return}r(void 0,o)}};function ve(n,e=$,t="JSONL output"){let s=n.endsWith(`
|
|
2
|
+
`)?n.slice(0,-1):n;if(Buffer.byteLength(s,"utf8")>e)throw new Fe(t,e)}var ps=8192,D=class extends Error{code="QODER_CLI_PROCESS_ERROR";exitCode;signal;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderCliProcessError",this.exitCode=t?.exitCode,this.signal=t?.signal,this.stderr=t?.stderr}},be=class n{static default=new n;process=null;customHandle=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;processExitError;stderrTail="";launchOptionsBuilder;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[ProcessTransport]")}create(e){return new n(lt(this.options,e))}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare(),t=e.args;if(this.closed){await this.cleanupAuthPayload();return}let s=e.env,{command:r,commandArgs:o}=this.resolveExecutable(t);if(this.diagnostics?.record(`[ProcessTransport] Spawning: ${r} ${ct(o)}`),this.diagnostics?.record(`[ProcessTransport] CWD: ${this.options.cwd??""}`),this.options.spawnQoderCLIProcess){let i=this.options.spawnQoderCLIProcess({command:r,args:o,cwd:this.options.cwd,env:s,signal:this.options.abortController?.signal??new AbortController().signal});this.customHandle=i,i.once("error",a=>{this.ready=!1,this.processExitError=this.createSpawnError(a),this.diagnostics?.record("[ProcessTransport] Process error:",a),this.cleanupAuthPayload().catch(()=>{})}),i.once("exit",(a,u)=>{this.ready=!1,a===ae&&this.fireAuthExpired();let l=this.createProcessExitError(a,u);l&&(this.processExitError=l),this.cleanupAuthPayload().catch(()=>{})})}else this.process=li(r,o,{cwd:this.options.cwd,env:s,stdio:["pipe","pipe",this.options.stderr??"pipe"]}),this.process.on("error",i=>{this.ready=!1,this.processExitError=this.createSpawnError(i),this.diagnostics?.record("[ProcessTransport] Process error:",i),this.cleanupAuthPayload().catch(()=>{})}),this.process.on("exit",(i,a)=>{this.ready=!1,this.diagnostics?.record(`[ProcessTransport] Process exited: code=${i}, signal=${a}`),i===ae&&this.fireAuthExpired();let u=this.createProcessExitError(i,a);u&&(this.processExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.process.stderr?.on("data",i=>{let a=i.toString();this.appendStderr(a),this.options.stderrHandler?.(a);let u=a.trim();u&&this.diagnostics?.record(`[ProcessTransport] STDERR: ${u}`)});this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.processExitError)throw this.processExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
3
3
|
`)?e:e+`
|
|
4
|
-
`;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=ci({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let s=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!s)return;let r=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??tt,i=setTimeout(()=>{if(r()){s("SIGTERM");let a=setTimeout(()=>{r()&&s("SIGKILL")},Hn);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>ds&&(this.stderrTail=this.stderrTail.slice(-ds))}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(at(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 li(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ue=li();function ps(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function lt(n,e){return n.create(e)}import{existsSync as Ni}from"fs";import{createInterface as ji}from"readline";import{Worker as qi}from"worker_threads";import{createHash as di}from"node:crypto";import{existsSync as pi}from"node:fs";import{chmod as mi,lstat as fi,mkdir as Fe,readFile as ms,readdir as gi,readlink as hi,rename as yi,rm as dt,stat as Si,symlink as wi,writeFile as fs}from"node:fs/promises";import{tmpdir as vi,userInfo as bi}from"node:os";import{basename as gs,dirname as _e,join as B,relative as _i}from"node:path";var ki="QODER_WORKER_RUNTIME_ASSET_ROOT",hs=/(^|[\\/])app\.asar([\\/]|$)/,Kt=".qoder-worker-runtime-ready";function ys(n){return hs.test(n)}function $t(n){return ys(n)?n.replace(hs,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ke(n,e={}){let t=$t(n);if(!e.forceMaterialize&&t){let u=_e(t);if(pi(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Lt(t,u,!1,_e(n))}if(!(e.forceMaterialize||ys(n))){let u=_e(n);return Lt(n,u,!1)}let r=_e(n),o=await Ri(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=_i(r,n)||gs(n),a=B(o,i);return Lt(a,o,!0,r)}function Lt(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[ki]:e}}}async function Ri(n,e,t){let s=await Ei(n,e),r=t.cacheDir??Ci(),o=B(r,s),i=B(o,Kt);if(await ws(i)===s)return o;let a=B(r,`.setup-${s}-${process.pid}-${Date.now()}`);await Fe(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 Fe(a,{recursive:!0,mode:448}),await Ss(n,a),await fs(B(a,Kt),s,{mode:384}),await Ti(a,o,s),o}catch(u){throw await dt(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Ei(n,e){let t=di("sha256");t.update("qoder-worker-runtime-v1\0");let s=await vs(B(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await Si(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function Ss(n,e){let t=await gi(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 Ss(r,o);continue}if(s.isSymbolicLink()){await Fe(_e(o),{recursive:!0,mode:448}),await wi(await hi(r),o);continue}if(!s.isFile())continue;let i=await Pi(r);await Fe(_e(o),{recursive:!0,mode:448}),await fs(o,await ms(r),{mode:i}),process.platform!=="win32"&&await mi(o,i)}}async function Pi(n){let e=((await fi(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=gs(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Ti(n,e,t){try{await yi(n,e)}catch(s){if(await ws(B(e,Kt))===t){await dt(n,{recursive:!0,force:!0});return}throw s}}async function ws(n){let e=await vs(n);return e?e.toString("utf8"):null}async function vs(n){try{return await ms(n)}catch{return null}}function Ci(){let n=Mi(bi().username||process.env.USER||process.env.USERNAME||"user");return B(vi(),`qoder-sdk-worker-runtime-${n}`)}function Mi(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Oi="QODER_WORKER_CWD";function pt(n,e){return{env:{...e.env,[Oi]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as zt}from"node:fs";import{dirname as Ai,join as ce}from"node:path";import{fileURLToPath as Ii}from"node:url";var Di=Ii(import.meta.url),Bt=Ai(Di);function Y(n){if(n)return n;let e=[];for(let t of xi())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(zt(t))return t;return e[0]??ce(Bt,"..","_worker","qoder-worker-runtime.obf.mjs")}function bs(n){let e=Y(n);if(zt(e))return!0;let t=$t(e);return t!==null&&zt(t)}function xi(){let n=[ce(Bt,".."),ce(Bt,"..","..")];return[...new Set(n)]}var _s=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 Qt(ut(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 le(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!Ni(r))throw new le(`Qoder worker runtime not found: ${r}`);let o=this.options.cwd??process.cwd(),i=pt(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${ct(e.args)}`),this.worker=new qi(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(`
|
|
4
|
+
`;if(ve(t,$,"SDK process input"),!this.ready){if(this.initializePromise){this.pendingInput.push({type:"write",line:t});return}throw new Error("Transport is not ready or has been closed")}this.writeReadyLine(t)}writeReadyLine(e){if(this.customHandle){let t=this.customHandle.stdin;if(t.destroyed||t.writableEnded)return;typeof t.write=="function"&&t.write(e)}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.write(e)}flushPendingInput(){if(this.pendingInput.length===0)return;let e=this.pendingInput;this.pendingInput=[];for(let t of e)t.type==="write"?this.writeReadyLine(t.line):this.endReadyInput()}isReady(){return this.ready&&!this.closed}endInput(){if(!this.ready&&!this.process&&!this.customHandle){this.initializePromise&&this.pendingInput.push({type:"end"});return}this.endReadyInput()}endReadyInput(){if(this.customHandle){let e=this.customHandle.stdin;if(e.destroyed||e.writableEnded)return;typeof e.end=="function"&&e.end()}else this.process?.stdin&&!this.process.stdin.destroyed&&!this.process.stdin.writableEnded&&this.process.stdin.end()}async*readMessages(){this.initializePromise&&await this.initializePromise;let e=this.getStdout();if(!e)return;let t=new Y($,"SDK process output");e.pipe(t);let s=ci({input:t,crlfDelay:1/0});try{for await(let r of s){if(this.closed)break;let o=r.trim();if(o)try{yield JSON.parse(o)}catch{}}this.closed||await this.waitForProcessExit()}finally{s.close(),e.unpipe(t),t.destroy()}}close(){if(this.closed)return;this.closed=!0,this.ready=!1,this.pendingInput=[],this.cleanupGeneratedSettings();let e=this.process,t=this.customHandle;if(this.cleanupAuthPayload().catch(()=>{}),!e&&!t)return;this.endInput();let s=e?a=>{try{e.kill(a)}catch{}}:t?a=>{try{t.kill(a)}catch{}}:void 0;if(!s)return;let r=()=>e?!e.killed&&e.exitCode===null:!0,o=this.options.closeGraceMs??nt,i=setTimeout(()=>{if(r()){s("SIGTERM");let a=setTimeout(()=>{r()&&s("SIGKILL")},Hn);typeof a=="object"&&"unref"in a&&a.unref()}},o);typeof i=="object"&&"unref"in i&&i.unref(),e?e.once("exit",()=>{clearTimeout(i)}):t?.once&&t.once("exit",()=>{clearTimeout(i)})}cleanupGeneratedSettings(){this.launchOptionsBuilder.cleanupGeneratedSettings()}get pid(){return this.process?.pid??void 0}getStdout(){return this.process?.stdout?this.process.stdout:this.customHandle?.stdout?this.customHandle.stdout:null}appendStderr(e){this.stderrTail+=e,this.stderrTail.length>ps&&(this.stderrTail=this.stderrTail.slice(-ps))}createSpawnError(e){let t=this.options.pathToQoderCLIExecutable??"qodercli",r=e.code==="ENOENT"?`Qoder CLI executable not found: ${t}`:`Failed to spawn Qoder CLI process: ${e.message}`;return new D(r,{stderr:this.getStderrTail(),cause:e})}createProcessExitError(e,t){if(e!==ae){if(e!==0&&e!==null)return new D(`Qoder CLI process exited with code ${e}`,{exitCode:e,signal:t,stderr:this.getStderrTail()});if(t)return new D(`Qoder CLI process terminated by signal ${t}`,{exitCode:e,signal:t,stderr:this.getStderrTail()})}}getStderrTail(){return this.stderrTail.trim()||void 0}async waitForProcessExit(){if(this.processExitError)throw this.processExitError;let e=this.process??this.customHandle;if(e){if(e.exitCode!==null||e.killed){let t=this.createProcessExitError(e.exitCode,null);if(t)throw this.processExitError=t,t;return}await new Promise((t,s)=>{let r=(i,a)=>{e.off("error",o);let u=this.createProcessExitError(i,a);u?(this.processExitError=u,s(u)):t()},o=i=>{e.off("exit",r);let a=this.createSpawnError(i);this.processExitError=a,s(a)};e.once("exit",r),e.once("error",o)})}}resolveExecutable(e){let t=this.options.pathToQoderCLIExecutable??V();if(ut(t)){let s=this.options.executable??"node",r=this.options.executableArgs??[];return{command:s,commandArgs:[...r,t,...e]}}return{command:t,commandArgs:e}}async cleanupAuthPayload(){await this.launchOptionsBuilder.cleanupAuthPayload()}fireAuthExpired(){if(!this.authExpiredFired){this.authExpiredFired=!0;try{this.options.onAuthExpired?.()}catch{}}}};function di(){switch("worker"){case"worker":return"worker";case"process":return"process"}return"process"}var ue=di();function ms(n){return typeof n=="object"&&n!==null&&typeof n.create=="function"}function dt(n,e){return n.create(e)}import{existsSync as qi}from"fs";import{createInterface as ji}from"readline";import{Worker as Fi}from"worker_threads";import{createHash as pi}from"node:crypto";import{existsSync as mi}from"node:fs";import{chmod as fi,lstat as gi,mkdir as Ue,readFile as fs,readdir as hi,readlink as yi,rename as Si,rm as pt,stat as wi,symlink as vi,writeFile as gs}from"node:fs/promises";import{tmpdir as bi,userInfo as _i}from"node:os";import{basename as hs,dirname as _e,join as z,relative as ki}from"node:path";var Ri="QODER_WORKER_RUNTIME_ASSET_ROOT",ys=/(^|[\\/])app\.asar([\\/]|$)/,Bt=".qoder-worker-runtime-ready";function Ss(n){return ys.test(n)}function $t(n){return Ss(n)?n.replace(ys,(e,t,s)=>`${t}app.asar.unpacked${s}`):null}async function ke(n,e={}){let t=$t(n);if(!e.forceMaterialize&&t){let u=_e(t);if(mi(t))return e.diagnostics?.record(`[WorkerTransport] Using asar-unpacked worker runtime: ${t}`),Kt(t,u,!1,_e(n))}if(!(e.forceMaterialize||Ss(n))){let u=_e(n);return Kt(n,u,!1)}let r=_e(n),o=await Ei(r,n,{cacheDir:e.cacheDir,diagnostics:e.diagnostics}),i=ki(r,n)||hs(n),a=z(o,i);return Kt(a,o,!0,r)}function Kt(n,e,t,s){return{runtimePath:n,runtimeRoot:e,materialized:t,sourceRuntimeRoot:s,env:{[Ri]:e}}}async function Ei(n,e,t){let s=await Ci(n,e),r=t.cacheDir??Mi(),o=z(r,s),i=z(o,Bt);if(await vs(i)===s)return o;let a=z(r,`.setup-${s}-${process.pid}-${Date.now()}`);await Ue(r,{recursive:!0,mode:448}),await pt(a,{recursive:!0,force:!0}),await pt(o,{recursive:!0,force:!0}),t.diagnostics?.record(`[WorkerTransport] Materializing worker runtime: ${n} -> ${o}`);try{return await Ue(a,{recursive:!0,mode:448}),await ws(n,a),await gs(z(a,Bt),s,{mode:384}),await Ti(a,o,s),o}catch(u){throw await pt(a,{recursive:!0,force:!0}).catch(()=>{}),u}}async function Ci(n,e){let t=pi("sha256");t.update("qoder-worker-runtime-v1\0");let s=await bs(z(n,"runtime-info.json"));if(s)t.update(s);else{t.update(e);let r=await wi(e).catch(()=>null);r&&t.update(`${r.size}\0${r.mtimeMs}`)}return`runtime-${t.digest("hex").slice(0,24)}`}async function ws(n,e){let t=await hi(n,{withFileTypes:!0});await Ue(e,{recursive:!0,mode:448});for(let s of t){let r=z(n,s.name),o=z(e,s.name);if(s.isDirectory()){await ws(r,o);continue}if(s.isSymbolicLink()){await Ue(_e(o),{recursive:!0,mode:448}),await vi(await yi(r),o);continue}if(!s.isFile())continue;let i=await Pi(r);await Ue(_e(o),{recursive:!0,mode:448}),await gs(o,await fs(r),{mode:i}),process.platform!=="win32"&&await fi(o,i)}}async function Pi(n){let e=((await gi(n)).mode||420)&511;if(process.platform==="win32")return e||420;let t=hs(n);return t==="rg"||t==="spawn-helper"||/\.(?:node|dylib|exe)$/.test(t)||/\.so(?:\.\d+)*$/.test(t)?493:e||420}async function Ti(n,e,t){try{await Si(n,e)}catch(s){if(await vs(z(e,Bt))===t){await pt(n,{recursive:!0,force:!0});return}throw s}}async function vs(n){let e=await bs(n);return e?e.toString("utf8"):null}async function bs(n){try{return await fs(n)}catch{return null}}function Mi(){let n=Ii(_i().username||process.env.USER||process.env.USERNAME||"user");return z(bi(),`qoder-sdk-worker-runtime-${n}`)}function Ii(n){return n.replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown"}var Ai="QODER_WORKER_CWD";function mt(n,e){return{env:{...e.env,[Ai]:e.cwd,...n.env},workerData:{...e.workerData??{},qoderWorkerRuntime:{cwd:e.cwd,runtimeRoot:n.runtimeRoot,materialized:n.materialized}}}}import{existsSync as zt}from"node:fs";import{dirname as Oi,join as le}from"node:path";import{fileURLToPath as Di}from"node:url";var xi=Di(import.meta.url),Qt=Oi(xi);function X(n){if(n)return n;let e=[];for(let t of Ni())e.push(le(t,"dist","_worker","qoder-worker-runtime.obf.mjs"),le(t,"dist","_worker","qoder-worker-runtime.mjs"),le(t,"_worker","qoder-worker-runtime.obf.mjs"),le(t,"_worker","qoder-worker-runtime.mjs"));for(let t of e)if(zt(t))return t;return e[0]??le(Qt,"..","_worker","qoder-worker-runtime.obf.mjs")}function _s(n){let e=X(n);if(zt(e))return!0;let t=$t(e);return t!==null&&zt(t)}function Ni(){let n=[le(Qt,".."),le(Qt,"..","..")];return[...new Set(n)]}var ks=8192,ce=class extends Error{code="QODER_WORKER_RUNTIME_ERROR";exitCode;stderr;constructor(e,t){super(e,t?.cause?{cause:t.cause}:void 0),this.name="QoderWorkerRuntimeError",this.exitCode=t?.exitCode,this.stderr=t?.stderr}},Re=class n{static default=new n;options;constructor(e={}){this.options={...e}}create(e){return new Gt(lt(this.options,e))}},Gt=class{worker=null;options;ready=!1;closed=!1;initializePromise=null;authExpiredFired=!1;pendingInput=[];diagnostics;workerExitError;stderrTail="";observedExitCode=null;launchOptionsBuilder;closeTimer=null;abortSignal;abortListener;constructor(e={}){this.options={...e},this.diagnostics=e.diagnostics,this.launchOptionsBuilder=new H(this.options,this.diagnostics,"[WorkerTransport]")}async initialize(){if(!this.ready)return this.initializePromise||(this.initializePromise=this._doInitialize()),this.initializePromise}async _doInitialize(){try{let e=await this.launchOptionsBuilder.prepare();if(this.closed){await this.cleanupAuthPayload();return}let t=X(this.options.pathToQoderWorkerRuntime),s;try{s=await ke(t,{diagnostics:this.diagnostics})}catch(a){throw new ce(`Failed to prepare Qoder worker runtime: ${t}`,{cause:a})}let r=s.runtimePath;if(!qi(r))throw new ce(`Qoder worker runtime not found: ${r}`);let o=this.options.cwd??process.cwd(),i=mt(s,{cwd:o,env:e.env,workerData:this.options.workerData});if(this.diagnostics?.record(`[WorkerTransport] Starting: ${r}`),this.diagnostics?.record(`[WorkerTransport] CWD: ${o}`),this.diagnostics?.record(`[WorkerTransport] Args: ${ct(e.args)}`),this.worker=new Fi(r,{argv:e.args,env:i.env,execArgv:this.options.execArgv??[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),this.worker.once("error",a=>{this.ready=!1,this.cleanupAbortListener(),this.closed||(this.workerExitError=this.createWorkerError(a)),this.diagnostics?.record("[WorkerTransport] Worker error:",a),this.destroyWorkerStreams(this.worker),this.cleanupAuthPayload().catch(()=>{})}),this.worker.once("exit",a=>{if(this.ready=!1,this.observedExitCode=a,this.cleanupAbortListener(),this.clearCloseTimer(),this.recordWorkerExit(a),this.destroyWorkerStreams(this.worker),this.closed){a!==0&&this.recordSuppressedWorkerExit(a),this.cleanupAuthPayload().catch(()=>{});return}a===ae&&this.fireAuthExpired();let u=this.createWorkerExitError(a);u&&(this.workerExitError=u),this.cleanupAuthPayload().catch(()=>{})}),this.worker.stderr?.on("data",a=>{let u=a.toString();this.appendStderr(u),this.options.stderr!=="ignore"&&this.options.stderrHandler?.(u),this.options.stderr==="inherit"&&process.stderr.write(u);let l=u.trim();l&&this.diagnostics?.record(`[WorkerTransport] STDERR: ${l}`)}),this.options.abortController){let a=this.options.abortController.signal;a.aborted?this.close():(this.abortSignal=a,this.abortListener=()=>this.close(),a.addEventListener("abort",this.abortListener,{once:!0}))}this.ready=!0,this.flushPendingInput()}catch(e){throw await this.cleanupAuthPayload(),e}}write(e){if(this.workerExitError)throw this.workerExitError;if(this.closed)throw new Error("Transport is not ready or has been closed");let t=e.endsWith(`
|
|
5
5
|
`)?e:e+`
|
|
6
|
-
`;if(ve(t
|
|
6
|
+
`;if(ve(t,$,"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 Y($,"SDK Worker output");e.pipe(t);let s=ji({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??nt;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>ks&&(this.stderrTail=this.stderrTail.slice(-ks))}createWorkerError(e){return new ce(`Failed to start Qoder worker runtime: ${e.message}`,{stderr:this.getStderrTail(),cause:e})}createWorkerExitError(e){if(!(e===0||e===ae))return new ce(`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 ft=class{constructor(e){this.bootstrap=e}transport;bootstrapPromise;pending=[];closed=!1;closePromise;cleanup;cleanupPromise;async initialize(){if(this.closed){await this.closePromise;return}try{let e=await this.getTransport();if(this.closed)return;if(await e.initialize(),this.closed){await e.close(),await this.runCleanup();return}for(let t of this.pending.splice(0))t.type==="write"?await e.write(t.data):e.endInput()}catch(e){throw await this.runCleanup(),e}}write(e){if(this.closed)throw new Error("Transport has been closed");if(this.transport?.isReady()){this.transport.write(e);return}this.pending.push({type:"write",data:e})}close(){return this.closePromise||(this.closed=!0,this.pending.length=0,this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return!this.closed&&(this.transport?.isReady()??!1)}async*readMessages(){try{if(await this.initialize(),this.closed)return;yield*(await this.getTransport()).readMessages()}finally{await this.runCleanup()}}endInput(){if(!this.closed){if(this.transport?.isReady()){this.transport.endInput();return}this.pending.push({type:"endInput"})}}async getTransport(){return this.bootstrapPromise||(this.bootstrapPromise=this.bootstrap().then(e=>(this.transport=e.transport,this.cleanup=e.cleanup,e.transport))),this.bootstrapPromise}async performClose(){let e=this.transport;if(!e&&this.bootstrapPromise)try{e=await this.bootstrapPromise}catch{await this.runCleanup();return}try{await e?.close()}finally{await this.runCleanup()}}runCleanup(){return this.cleanupPromise||(this.cleanupPromise=this.cleanup?.()??Promise.resolve()),this.cleanupPromise}};import{appendFileSync as Ui,mkdirSync as Li}from"fs";import{dirname as Ki}from"path";var Bi="QODER_AGENT_SDK_DEBUG";function $i(n){return n.debugFile?!0:n.debug===!0||Qi(process.env[Bi])}function zi(n){if(n.debugFile)return n.debugFile}function Qi(n){if(n===void 0)return!1;let e=n.trim().toLowerCase();return e!==""&&e!=="0"&&e!=="false"&&e!=="no"&&e!=="off"}var gt=class{enabled;debugFile;stderr;constructor(e={}){this.enabled=$i(e),this.debugFile=zi(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{Li(Ki(e),{recursive:!0}),Ui(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 na}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}},Le=class extends Error{requestId;code;retryable;details;constructor(e){super(e.message),this.name="ControlRequestError",this.requestId=e.requestId,this.code=e.code,this.retryable=e.retryable===!0,this.details=e.details}};var Jt="1.3.0";var Qi=new Set(["default","acceptEdits","auto","bypassPermissions"]);function Ke(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Qi.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 ks(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 Rs(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 Es(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 Ji}from"crypto";function Cs(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 Hi=500,Gi=1024*1024,Wi=6e4,gt=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Vi(e.filePath),s=Yi(e.entries);this.receivedEntryCount+=s.length;let r=Ts(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+=Zi(s),!this.holding&&(this.options.flushMode==="eager"||o.entries.length>=Hi||o.bytes>=Gi)&&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 ea(this.options.store,e.key,t,this.options.appendTimeoutMs??Wi)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${Ts(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:Ji(),session_id:e.key.sessionId})}})}};function Vi(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:Ps(o[1])};let i=Ps(s[1]),a=s.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let c=a.join("/");return Xi(c),{projectKey:r,sessionId:i,subpath:c}}function Yi(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 Ps(n){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n))throw new Error(`Invalid transcript session id: ${n}`);return n}function Xi(n){let e=n.split("/");if(!n||n.includes("\0")||/^[a-z]:/i.test(n)||e.some(t=>!t||t==="."||t===".."))throw new Error(`Invalid transcript subpath: ${n}`)}function Ts(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function Zi(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function ea(n,e,t,s){await ta(n.append({...e},structuredClone(t)),s)}async function ta(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Ht(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ht=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Ms(){return Math.random().toString(36).substring(2,15)}function Os(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 As(n,e){return{type:"control_response",response:{subtype:"success",request_id:n,response:e}}}function Is(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function Ds(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function xs(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function Ns(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 js(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function qs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function Fs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Us(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function Ls(n){return typeof n=="object"&&n!==null&&n.type==="result"}var sa="<synthetic>";function ra(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==sa?n:{...n,isApiErrorMessage:!0}}var $e=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 gt({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(Cs(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(Ds(t)){this.handleControlResponse(t);continue}if(xs(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(Ns(t)){this.handleControlCancelRequest(t);continue}if(js(t)||qs(t)||Fs(t)||Us(t))continue;if(Ls(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=ra(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=Ms(),r=Os(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=()=>{
|
|
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),
|
|
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}=ca(i),
|
|
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=Jt;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=Ks(t),o=Ks(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(ks(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=Ke(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:na(),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?Ke(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=ua(e?.usage),s=aa(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=Wn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(s){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",s)}this.closed=!0;for(let[,s]of this.pendingInboundRequests)s.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[s,r]of this.sdkMcpTransports){try{await r.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${s}":`,o)}Es(s,e,this.pendingMcpResponses)}let t;try{await this.transport.close()}catch(s){t={error:s}}try{await this.readLoopPromise}catch{}if(await this.flushTranscriptMirrorForLifecycle(),t)throw t.error}async[Symbol.asyncDispose](){await this.close()}};function $s(n){return new $e(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 Gt(n){return typeof n=="number"&&Number.isFinite(n)}function Wt(n){return Object.keys(n).length>0}function Q(n,e,t){let s=e[t];Gt(s)&&(n[t]=s)}function Pe(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function ht(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function zs(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"),Wt(e)?e:void 0}function oa(n){if(!de(n)||Array.isArray(n))return;let e=zs(n)??{};return Pe(e,n,"detailUrl"),Wt(e)?e:void 0}function ia(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"),ht(e,n,"available"),Pe(e,n,"unit"),Wt(e)?e:void 0}function aa(n){if(!de(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Gt(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;Gt(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function ua(n){if(!de(n)||Array.isArray(n))return null;let e={};Pe(e,n,"userId"),Pe(e,n,"userType"),Q(e,n,"totalUsagePercentage"),ht(e,n,"isHighestTier"),Q(e,n,"expiresAt"),Pe(e,n,"upgradeUrl"),ht(e,n,"isQuotaExceeded"),ht(e,n,"isPlanQuotaProrated");let t=zs(n.userQuota);t&&(e.userQuota=t);let s=oa(n.addOnQuota);s&&(e.addOnQuota=s);let r=ia(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function ca(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 Ks(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var yt=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 Bs}from"crypto";var la="QODER_CLOUD_AGENT_API_BASE",da="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"},pa=1024,Qs=1*1024*1024,Js=4*1024*1024,ma=8*1024,Yt=class extends Error{code="auth_access_token_env_var_not_configured";constructor(e){super(`The auth access token environment variable "${e}" is not set; set it or pass auth.accessToken directly.`),this.name="CloudAuthAccessTokenEnvVarError"}},St=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Xt=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}},fa=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Vs(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!fa.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 St;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Te(t)&&Vt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Te(s)&&Vt(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||!Vt(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 Vt(n){return"create"in n&&n.create!==void 0}function Ys(n){return new Zt(n)}var Zt=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Ma();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Ws();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=ga(e.options.auth,e.options.env),this.apiBase=ha(),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(Ta(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=Pa(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,...Sa(r)}});t=Hs(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:ya(e.create)});return Hs(t,"Cloud agent")}async readCloudEvents(){let{sessionId:e}=await this.sessionReadyPromise,t=0;for(;!this.closed;){let s=this.lastSseEventId;if(await this.readCloudEventStream(e),this.closed||this.resultEmitted)return;if(!this.shouldReconnectSse()||t>=3){this.finishAfterSseClosed();return}this.lastSseEventId!==s&&(t=0),t+=1,await Ca(250*t,this.abortController.signal)}}async readCloudEventStream(e){let t=new URL(`${this.apiBase}/sessions/${encodeURIComponent(e)}/events/stream`),s=this.lastSseEventId??this.experimentalCloudAgent.stream?.afterId;s&&t.searchParams.set("after_id",s),this.experimentalCloudAgent.stream?.deltaFlushIntervalMs!==void 0&&t.searchParams.set("delta_flush_interval_ms",String(this.experimentalCloudAgent.stream.deltaFlushIntervalMs));let r=await fetch(t.toString(),{headers:this.authHeaders({accept:"text/event-stream"}),signal:this.abortController.signal});if(!r.ok)throw this.handleAuthFailure(r.status),await Gs(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
|
|
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>Js){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Js} 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??
|
|
16
|
-
`):JSON.stringify(e)}function
|
|
17
|
-
`);await
|
|
18
|
-
`:"")}async function ur(n,e){await or(za(n),{recursive:!0,mode:448}),await La(n,e,{encoding:"utf8",mode:384}),await rr(n,384)}async function nn(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 tu=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function nu(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return tu.test(e)}function Me(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?nu(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 cr from"node:path";function Oe(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function Be(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function su(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(cr.posix.isAbsolute(r)||cr.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function ru(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 lr(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 Be(n.generation?.onResult,"options.memory.generation.onResult"),Be(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");su(s.roots),s.prompt!==void 0&&Oe(s.prompt,"options.memory.generation.prompt"),Be(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(Be(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(ru(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"');Be(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 bt=10;function ou(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function _t(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function dr(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 iu(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&&ou(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");_t(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=dr(n.turnComplete.reviewThreshold);if(_t(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 pr(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=dr(r?.reviewThreshold);return e?.enabled===!1?(_t(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(_t(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=iu(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as Zu}from"node:child_process";import{isDeepStrictEqual as ec}from"node:util";import{createInterface as fu}from"node:readline";var S=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function on(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":au(t);break;case"control_response":uu(t);break;case"event":I(t,["type","event","session_id","data"],"event frame"),E(t,"event"),Rt(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"),!lu(t.type))throw new S(`unknown daemon message type: ${String(t.type)}`);cu(t),Rt(t)}return t}function mr(n){let e=JSON.stringify(n);return on(e),e}function fr(n,e){let t=e.response.response;switch(n){case"initialize":{kt(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"),pu(s,"capabilities"),s}case"open_session":{let s=Qe(e,"open_session response");return rn(t,"open_session"),{session_id:s}}case"list_sessions":{kt(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())sn(R(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{Qe(e,"rename_session response");let s=R(t,"rename_session response");return I(s,["session"],"rename_session response"),sn(R(s.session,"rename_session session"),"rename_session session"),s}case"subscribe_session":{let s=Qe(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":{kt(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":{Qe(e,"update_session_metadata response");let s=R(t,"update_session_metadata response");return I(s,["session"],"update_session_metadata response"),sn(R(s.session,"update_session_metadata session"),"update_session_metadata session"),s}case"unsubscribe_session":case"close_session":return Qe(e,`${n} response`),rn(t,n),null;case"sync_session_registrations":case"disable_remote_control":case"delete_session":case"shutdown":return kt(e,`${n} response`),rn(t,n),null;default:throw new S(`unknown daemon command result method: ${String(n)}`)}}function au(n){I(n,["type","request_id","session_id","request"],"control_request frame"),E(n,"request_id"),Rt(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 uu(n){I(n,["type","session_id","response"],"control_response frame"),Rt(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&&du(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 sn(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 rn(n,e){if(n!==void 0)throw new S(`${e} success must omit response`)}function Qe(n,e){let t=n;try{return E(t,"session_id")}catch{throw new S(`${e} requires a valid session_id`)}}function kt(n,e){if(Object.hasOwn(n,"session_id"))throw new S(`${e} must not include session_id`)}function Rt(n){let e=n;e.session_id!==void 0&&E(e,"session_id")}function cu(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 lu(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 du(n,e){let t=n[e];if(typeof t!="boolean")throw new S(`${e} must be a boolean`);return t}function pu(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 Je=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;closePromise;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=mu(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=gr(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){return this.closePromise||(this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t;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=>gr(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.close().catch(()=>{})}async performClose(){this.closed||(this.closed=!0,this.cleanup());try{this.initializePromise&&await this.initializePromise.catch(()=>{}),this.releasePromise?await this.releasePromise:this.sessionId&&await this.releaseSessionOnce(this.sessionId),this.messages.done()}catch(e){throw this.messages.error(e),e}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function mu(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 gr(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 un="multi_session_v2",hr="remote_control_v1",yr="session_title_sync_v1",Sr="session_delete_v1",cn="session_store_file_checkpointing_v1",ln="session_store_fork_barrier_v1",gu=3e4,Et=3e4,hu=125e3,Pt=6e4,wr=12e4,yu=5e3,Su=1024,wu=64,vu=8*1024*1024,bu=256,_u=32*1024*1024,ku=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}},Tt=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=gu){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:[un,...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(un))throw new S(`daemon is missing required capability: ${un}`);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 Je(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 Je(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,wr)).session_id}subscribeSession(e,t){return this.request("subscribe_session",{remote_session_id:e},t,void 0,wr)}enableRemoteControl(e){return this.capabilities.has(hr)?this.request("enable_remote_control",e,void 0,void 0,Pt):Promise.reject(new S(`daemon is missing required capability: ${hr}`))}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,hu,"request")).sessions}renameSession(e,t){return this.capabilities.has(yr)?this.request("rename_session",{title:t},void 0,e,Et):Promise.reject(new S(`daemon is missing required capability: ${yr}`))}async disableRemoteControl(){await this.request("disable_remote_control",{},void 0,void 0,Pt)}async syncSessionRegistrations(e){await this.request("sync_session_registrations",{local_session_ids:e},void 0,void 0,Pt)}updateSessionMetadata(e,t){return this.request("update_session_metadata",{extra:t},void 0,e,Et)}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,Et)}async deleteSession(e){if(!this.capabilities.has(Sr))throw new S(`daemon is missing required capability: ${Sr}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,Pt)}async unsubscribeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("unsubscribe_session",{},void 0,e,Et)}async shutdown(e=yu){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=fu({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=Ru(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(on(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=Eu(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>=Su){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=fr(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>wu||o+r>vu||this.pendingSessionMessageFrameCount+1>bu||this.pendingSessionMessageByteCount+r>_u)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(Pu(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=`${mr(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 Ru(n){let e;try{e=JSON.parse(n)}catch{return}if(!vr(e)||!br(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(!(!vr(t)||!br(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 vr(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function br(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function Eu(n){let e=ku.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 Pu(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 Tu}from"node:crypto";function J(n,e="extra"){if(!_r(n))throw new TypeError(`${e} must be a JSON object`);return dn(n,e,new Set),structuredClone(n)}function dn(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)=>dn(s,`${e}[${r}]`,t));else{if(!_r(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))dn(r,`${e}.${s}`,t)}t.delete(n)}}function _r(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Cu=3e4,Mu=256,Rr=512*1024;function Ou(n){return fn([n])}var Ct=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 Er(n,e={}){let t=pn(e.callbackTimeoutMs??Cu,"callbackTimeoutMs"),s=pn(e.maxEntriesPerPage??Mu,"maxEntriesPerPage"),r=pn(e.maxPayloadBytes??Rr,"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 Au(n,c,t,s,r);case"daemon.session_store.load":return Iu(n,c,t,s,r);case"daemon.session_store.append":return Du(n,c,t,s,r);case"daemon.session_store.update_metadata":return Nu(n,c,t);case"daemon.session_store.delete":return xu(n,c,t);case"daemon.session_store.materialize":return ju(n,c,t,o);case"daemon.session_store.release_materialization":return qu(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=>Pr(c,t,o))).then(()=>{}),a.catch(()=>{a=void 0}),a)}})}async function Au(n,e,t,s,r){let o=fe(e,["cursor"]),i=Mr(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)=>Uu(Fu(l,`sessions[${m}]`))),c=Or(u,i,s,r,"list_all");return{sessions:c.items,next_cursor:c.nextCursor}}async function Iu(n,e,t,s,r){let o=fe(e,["key","cursor"]),i=Ie(o.key,"key"),a=Mr(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)=>Cr(m,`entries[${p}]`)),l=Or(c,a,s,r,"load");return{found:!0,entries:l.items,next_cursor:l.nextCursor}}async function Du(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 gn(`entries exceeds the ${s} entry batch limit`,{operation:"append",entryCount:o.entries.length,maxEntriesPerBatch:s});let a=o.entries.map((u,c)=>Cr(u,`entries[${c}]`));return Lu(a,r,{operation:"append"}),await ge("append",t,!1,()=>n.append(i,a)),null}async function xu(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 Nu(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=Tr(s.extra,"extra");return await ge("update_metadata",t,!1,()=>n.updateSessionMetadata(r,{extra:o})),null}async function ju(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=vt({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_${Tu()}`;return s.set(c,{materialized:u}),{lease_id:c,config_dir:u.configDir}}async function qu(n,e,t){let s=fe(n,["lease_id"]),r=me(s.lease_id,"lease_id");return await Pr(r,e,t),null}async function Pr(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=mn(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 Fu(n,e){let t=mn(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:Tr(t.extra,`${e}.extra`);return{key:i,title:kr(t.title,`${e}.title`),lastActiveAt:o,cwd:kr(t.cwd,`${e}.cwd`),...a===void 0?{}:{extra:a}}}function Uu(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 Tr(n,e){try{return J(n,e)}catch(t){throw P(t instanceof Error?t.message:`${e} must be a JSON object`)}}function Cr(n,e){let t=mn(n,e);me(t.type,`${e}.type`);try{return JSON.parse(JSON.stringify(t))}catch{throw P(`${e} must be JSON-safe`)}}function mn(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 kr(n,e){let t=me(n,e);if(t.trim().length===0)throw P(`${e} must be a non-empty string`);return t}function Mr(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 Or(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=fn(n[u]),l=c+(o.length?1:0),m=c+2;if(m>s&&o.length===0)throw gn("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 Lu(n,e,t){let s=fn(n);if(s>e)throw gn(`payload exceeds the ${e} byte limit`,{...t,serializedBytes:s,maxPayloadBytes:e})}function fn(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 Ct?o:q("SESSION_STORE_OPERATION_FAILED",o instanceof Error?o.message:String(o),t,n)}finally{r&&clearTimeout(r)}}function pn(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 gn(n,e){return q("SESSION_STORE_PAYLOAD_TOO_LARGE",n,!1,void 0,e)}function q(n,e,t=!1,s,r){return new Ct({code:n,message:e,retryable:t,operation:s,details:r})}var Ku=3e4;function $u(n,e=Ku){return Hu(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return zu(n,t,e);case"daemon.auth.fetch_service_account_token":return Bu(n,t,e);default:throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}function Ar(n){let e=$u(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 zu(n,e,t){if(n.type!=="jobToken")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Ir(e,["reason","session_id"]),r=Dr(s.reason),o=Qu(s.session_id,"session_id"),i=new AbortController;try{let a=await xr(()=>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 Bu(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=Ir(e,["reason","required_scopes"]);Dr(s.reason),Ju(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await xr(()=>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 Ir(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 Dr(n){if(n!=="initial"&&n!=="unauthorized")throw M("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function Qu(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 Ju(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 xr(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((r,o)=>{s=setTimeout(()=>{t.abort(),o(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function Hu(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function M(n,e,t=!1){return new j({code:n,message:e,retryable:t})}var Gu=3e4;function jr(n,e=Gu){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=Wu(t,["remote_session_id","extra"]),r=Nr(s.remote_session_id,"remote_session_id"),o=s.extra===void 0?void 0:Vu(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=Nr(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 Wu(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 Nr(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 Vu(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 Yu=[250,1e3,5e3];function qr(n,e){let t=new hn(e.sync,e.retryDelaysMs??Yu);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 hn=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 Xu(s)}}}};function Xu(n){return new Promise(e=>{setTimeout(e,n).unref?.()})}var tc="QODER_AGENT_SDK_DAEMON",nc="QODER_AGENT_SDK_DAEMON_CAPACITY",sc="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",rc="ELECTRON_RUN_AS_NODE",oc=3e5,Fr=2e3,Ur=8192,Lr=255,$r=new WeakMap;function kn(n){return $r.get(n)}async function ic(n){cc(n.capacity);let e=n.workerIdleTimeoutMs??oc;lc(e);let t=new H({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await fc(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[tc]:"1",[nc]:String(n.capacity),[sc]:String(e)},i,a,u;try{i=await _n.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let c;u=n.sessionStore?qr(n.sessionStore,{sync:d=>{if(!c)throw new Error("Daemon connection is not ready");return c.syncSessionRegistrations(d)}}):void 0,a=u?Er(u.store):void 0;let l=n.resolveRemoteSessionLaunch?jr(n.resolveRemoteSessionLaunch):void 0;c=new Tt({input:i.process.stdin,output:i.process.stdout,requestHandler:Ar({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?[cn,ln]:[]];await c.initialize(nt,m),await t.cleanupAuthPayload();let p=new Sn(c,i,a,u);return $r.set(p,{auth:n.auth,transportProvider:new vn(c,s.env,n.cwd),supportsSessionStoreFileCheckpointing:c.supportsCapability(cn),supportsSessionStoreForkBarrier:c.supportsCapability(ln),...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 Sn=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(){if(this.currentState!=="ready")throw new Error("Daemon is not ready");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,He(s));return e}async fetchSessions(){return(await this.connection.listSessions()).map(yn).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=ac(t),r=await this.connection.renameSession(e,s),o=yn(r.session);return this.acceptSessionSnapshot(o),He(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=yn(r.session);return this.knownSessions.has(e)&&this.acceptSessionSnapshot(o),He(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=pc(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 wn(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(),$s({transport:s,initialization:s.initializationResult(),...t.canUseTool?{canUseTool:t.canUseTool}:{},...t.onElicitation?{onElicitation:t.onElicitation}:{}})}catch(r){throw await s.close().catch(()=>{}),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(Rn(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"||!dc(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&&ec(t,e))return;let s=He(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(uc(e))}catch{}}};function He(n){return{...n,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function ac(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>Lr)throw new TypeError(`title must be at most ${Lr} characters`);return e}function yn(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 uc(n){return"session"in n?{...n,session:He(n.session)}:{...n}}var wn=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)}}},vn=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 cc(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError("capacity must be a positive integer")}function lc(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}function dc(n){return n==="pending"||n==="ready"||n==="inactive"||n==="failed"}function pc(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=mc(n.metadata);return{external_id:n.externalId,environment_type:n.environmentType,...n.name!==void 0?{name:n.name}:{},...e!==void 0?{metadata:e}:{}}}function mc(n){if(n!==void 0){if(!Rn(n))throw new TypeError("metadata must be a JSON object");return bn(n,"metadata",new Set),structuredClone(n)}}function bn(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)=>bn(s,`${e}[${r}]`,t));else{if(!Rn(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))bn(r,`${e}.${s}`,t)}t.delete(n)}}function Rn(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 fc(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 at(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[rc]:"1"}:{}}}:{command:t,args:[],env:s}}var _n=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>Ur&&(this.stderrTail=this.stderrTail.slice(-Ur))}),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=Zu(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await hc(t)}catch(s){throw new D(`Failed to spawn Qoder CLI daemon: ${gc(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 Kr(this.exited,Fr)&&(this.process.kill("SIGTERM"),!await Kr(this.exited,Fr)&&(this.process.kill("SIGKILL"),await this.exited))}getStderr(){return this.stderrTail.trim()||void 0}reportFailure(e){if(!(this.stopping||this.failure)){this.failure=e,this.connection?.fail(e);for(let t of this.failureListeners)t(e)}}};function gc(n){return n instanceof Error?n.message:String(n)}async function hc(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 Kr(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 En=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 yc(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=kn(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(ps(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 Pn(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;if(s)r=Sc(t);else if(t.extra!==void 0)throw new Error("options.extra requires options.daemon.");let o=s?kn(s):void 0,i=o?.sessionStore??t.sessionStore,a=t.sessionStoreFlush??(o?.sessionStore!==void 0?"eager":"batched"),u=yc(t,s),c=new ft({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 En;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 Vs(t),Ys({prompt:e,options:t,diagnostics:c});let p=lr(t.memory),d=pr(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 et=qt(k,ie);et&&(re[k]=et)}let Bn=new yt(et=>{Rs(k,et,w)});b.set(k,Bn),we.connect(Bn).catch(()=>{})}else T[k]=K}let _=Object.keys(T).length>0,oe=Object.keys(C).length>0,Xe=t.pathToQoderCLIExecutable,ko=t.env,Ro=l?.type==="jobToken"?l.fetchJobToken:void 0,Eo=l?.type==="serviceAccount"?l.fetchServiceAccountToken:void 0,Ze={pathToQoderCLIExecutable:Xe,executable:t.executable,executableArgs:t.executableArgs,env:ko,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},Kn=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new mt(async()=>{let k=await vt({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:lt(u,{...Ze,continue:!1})};try{return{transport:lt(u,{...Ze,env:{...Ze.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}}):lt(u,Ze);Kn.initialize().catch(()=>{});let Po=typeof e=="string",Se=t.systemPrompt,$n,zn;if(typeof Se=="string")$n=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)}`);zn=k.append}let To={systemPrompt:$n,appendSystemPrompt:zn,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}:{}},Nt=new $e(Kn,Po,t.canUseTool,t.hooks,t.abortController,y,To,t.onElicitation,c,f,t.controlRequestTimeoutMs,b,w,Ro,t.resolveModel,t.resolveModelTimeoutMs,i,a,re,Eo,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};Nt.streamInput(async function*(){yield k}())}else Nt.streamInput(e);return Nt}function Sc(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=Ke(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 Tn=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}}},Cn=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 wc(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 Tn,s=Pn({prompt:t,options:n.options}),r;try{return await Promise.race([s.initializationResult(),new Promise((o,i)=>{r=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new Cn(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as vc}from"node:fs/promises";import bc from"node:os";import L from"node:path";var _c=["user","project","local"],An=new Set(["__proto__","constructor","prototype"]),kc=/^[\p{L}\p{N}\p{M}._ -]+$/u,Rc=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Ec=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Pc=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Tc=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 Cc(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
|
-
`||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){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==="/"&&
|
|
22
|
-
`)){let s=t.trim();if(s)try{let r=JSON.parse(s);A(r)&&typeof r.uuid=="string"&&typeof r.type=="string"&&
|
|
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
|
|
24
|
-
`).filter(i=>i.startsWith("worktree ")).map(i=>i.substring(9).trim()).filter(i=>i!==t);for(let i of o)s.push(
|
|
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=
|
|
26
|
-
`).filter(Boolean))try{let m=JSON.parse(
|
|
27
|
-
`," ").trim();if(!i)continue;let a=
|
|
28
|
-
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function
|
|
29
|
-
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function
|
|
30
|
-
`))if(s.trim())try{t.push(JSON.parse(s))}catch{}return
|
|
31
|
-
`).trim();if(o)return o}}function
|
|
32
|
-
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=
|
|
8
|
+
${e.stack??e.message}`;try{return` ${JSON.stringify(e)}`}catch{return` ${String(e)}`}}};import{randomUUID as sa}from"node:crypto";var Z=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"}},Le=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}},W=class extends Error{cliProtocolVersion;sdkProtocolVersion;constructor(e,t){super(`Wire protocol major mismatch: CLI announced "${e}" but this SDK was built for "${t}". Upgrade either qodercli or @qoder-ai/qoder-agent-sdk so the major versions align.`),this.name="ProtocolVersionMismatchError",this.cliProtocolVersion=e,this.sdkProtocolVersion=t}},Q=class extends Error{capability;constructor(e){super(`The running qodercli does not advertise the required capability "${e}". Upgrade qodercli or use a matching bundled SDK runtime.`),this.name="UnsupportedCliCapabilityError",this.capability=e}},Ke=class extends Error{requestId;code;retryable;details;constructor(e){super(e.message),this.name="ControlRequestError",this.requestId=e.requestId,this.code=e.code,this.retryable=e.retryable===!0,this.details=e.details}};var Jt="1.4.0";var Gi=new Set(["default","acceptEdits","auto","bypassPermissions"]);function Be(n){if(n===void 0)return;if(n==="yolo")return"bypassPermissions";if(typeof n=="string"&&Gi.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 Ee(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`goalMaxTurns must be a positive safe integer, received ${String(n)}.`)}function Rs(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 Es(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 Cs(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 Ji}from"crypto";function Ms(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 Hi=500,Wi=1024*1024,Vi=6e4,ht=class{constructor(e){this.options=e;this.holding=e.holdUntilFlush===!0}states=new Map;failures=[];holding;receivedEntryCount=0;enqueue(e){let t=Yi(e.filePath),s=Xi(e.entries);this.receivedEntryCount+=s.length;let r=Ts(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+=ea(s),!this.holding&&(this.options.flushMode==="eager"||o.entries.length>=Hi||o.bytes>=Wi)&&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 ta(this.options.store,e.key,t,this.options.appendTimeoutMs??Vi)}catch(s){this.failures.push(s),this.options.diagnostics?.record(`[SessionStore] append failed for ${Ts(e.key)}`,s),this.options.onMirrorError({type:"system",subtype:"mirror_error",error:s instanceof Error?s.message:String(s),key:{...e.key},uuid:Ji(),session_id:e.key.sessionId})}})}};function Yi(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:Ps(o[1])};let i=Ps(s[1]),a=s.slice(2),u=a.at(-1);a[a.length-1]=u.endsWith(".jsonl")?u.slice(0,-6):u;let l=a.join("/");return Zi(l),{projectKey:r,sessionId:i,subpath:l}}function Xi(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 Ps(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 Zi(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 Ts(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}function ea(n){return n.reduce((e,t)=>e+Buffer.byteLength(JSON.stringify(t))+1,0)}async function ta(n,e,t,s){await na(n.append({...e},structuredClone(t)),s)}async function na(n,e){let t;n.catch(()=>{});try{await Promise.race([n,new Promise((s,r)=>{t=setTimeout(()=>r(new Ht(e)),e)})])}finally{t!==void 0&&clearTimeout(t)}}var Ht=class extends Error{constructor(e){super(`SessionStore append timed out after ${e}ms`),this.name="SessionStoreTimeoutError"}};function Is(){return Math.random().toString(36).substring(2,15)}function As(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 Ds(n,e,t){return{type:"control_response",response:{subtype:"error",request_id:n,error:e,...t?{code:t}:{}}}}function xs(n){return typeof n=="object"&&n!==null&&n.type==="control_response"}function Ns(n){return typeof n=="object"&&n!==null&&n.type==="control_request"}function qs(n){return typeof n=="object"&&n!==null&&(n.type==="control_cancel_request"||n.type==="control_cancel")}function Ce(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 js(n){if(typeof n!="object"||n===null)return!1;let e=n.type;return e==="keepalive"||e==="keep_alive"}function Fs(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_text"}function Us(n){return typeof n=="object"&&n!==null&&n.type==="streamlined_tool_use_summary"}function Ls(n){return typeof n=="object"&&n!==null&&n.type==="post_turn_summary"}function Ks(n){return typeof n=="object"&&n!==null&&n.type==="result"}var ra="<synthetic>";function oa(n){return n.type!=="assistant"||n.isApiErrorMessage===!0||n.message.model!==ra?n:{...n,isApiErrorMessage:!0}}var $e=class n{static CUSTOM_CONTEXT_CAPABILITY="custom_context_v1";static INITIALIZE_TIMEOUT_MS=12e4;static BACKGROUND_TASKS_CAPABILITY="background_tasks_v1";static SIDE_QUESTION_CAPABILITY="side_question_v1";static GOAL_CAPABILITY="goal_v1";static GOAL_MAX_TURNS_CAPABILITY="goal_max_turns_v1";static PLAN_MODE_CAPABILITY="plan_mode_v1";static BYOK_CONFIG_MANAGEMENT_CAPABILITY="byok_config_management_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;latestCommands=[];initializationPromise;resultMessage;pendingErrorResultExit=!1;readLoopPromise;closed=!1;authExpiredFired=!1;protocolHandshakeValidated=!1;cliCapabilities;customContextCapabilityWarningEmitted=!1;firstResultReceived=!1;firstResultReceivedResolve;memoryFlushPromise;endInputFlushPromise;skillEvolutionFlushPromise;closePromise;sessionStoreForkBarrierComplete=!1;constructor(e,t,s,r,o,i,a,u,l,c,m,p,d,g,h,f,y,_="batched",w,P,T,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=c,this.fetchJobToken=g,this.fetchServiceAccountToken=P,this.diagnostics=l,this.controlRequestTimeoutMs=m??6e4,this.resolveModel=h,this.resolveModelTimeoutMs=f??500,this.memoryCallbacks=T,this.skillEvolutionCallbacks=re,this.inputStream=new Z(()=>{this.close().catch(()=>{})}),y&&(this.transcriptMirrorBatcher=new ht({store:y,flushMode:_,holdUntilFlush:this.initConfig.requireSessionStoreForkBarrier===!0,diagnostics:l,onMirrorError:b=>this.inputStream.enqueue(b)})),this.readLoopPromise=this.readMessages().catch(b=>{this.inputStream.error(b)}),this.initializationPromise=this.initConfig.attachedInitialization?this.initConfig.attachedInitialization.then(async b=>(this.initResponse=b,this.replaceLatestCommands(b.commands),this.cliCapabilities=new Set(b.capabilities??[]),await this.applyAttachedGoalMaxTurns(),await this.completeSessionStoreForkBarrier(),b)):this.performInitialize(),this.initializationPromise.catch(()=>{}),this.abortController){let b=this.abortController.signal;b.aborted?this.close().catch(()=>{}):b.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(Ms(t)){try{this.transcriptMirrorBatcher?.enqueue(t)}catch(r){this.diagnostics?.record("[QueryRunner] invalid transcript_mirror frame ignored:",r)}continue}if(xs(t)){this.handleControlResponse(t);continue}if(Ns(t)){this.handleControlRequest(t).catch(r=>{this.diagnostics?.record("[QueryRunner] Error handling control request:",r)});continue}if(qs(t)){this.handleControlCancelRequest(t);continue}if(js(t)||Fs(t)||Us(t)||Ls(t))continue;if(Ks(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=oa(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}s.type==="system"&&s.subtype==="commands_changed"&&this.replaceLatestCommands(s.commands),this.dispatchMemoryCallbacks(s),this.dispatchSkillEvolutionCallbacks(s),this.notifyAuthExpiredIfNeeded(s),this.inputStream.enqueue(s)}}catch(t){this.isStructuredResultExit(t)?this.diagnostics?.record("[QueryRunner] exit code 1 accepted after the latest structured error result"):e=t}finally{await this.flushTranscriptMirrorForLifecycle();let t=e instanceof Error?e:new Error("Transport closed");this.firstResultReceivedResolve?.(),this.firstResultReceivedResolve=void 0;for(let[,s]of this.pendingRequests)s.reject(t);this.pendingRequests.clear(),e!==void 0?this.inputStream.error(e):this.inputStream.done()}}isStructuredResultExit(e){if(!this.pendingErrorResultExit||e===null||typeof e!="object")return!1;let t=e;return t.exitCode===1&&(t.signal===void 0||t.signal===null)}notifyAuthExpiredIfNeeded(e){if(!this.onAuthExpired||this.authExpiredFired)return;let s=e.type==="auth_status"&&!!e.error,r=e.type==="assistant"&&e.error==="authentication_failed";!s&&!r||(this.authExpiredFired=!0,Promise.resolve(this.onAuthExpired()).catch(o=>{this.diagnostics?.record("[QueryRunner] onAuthExpired callback threw:",o)}))}dispatchMemoryCallbacks(e){if(!(e.type!=="system"||!this.memoryCallbacks))try{let t;e.subtype==="memory_generation"?t=this.memoryCallbacks.onGenerationResult?.(e.result):e.subtype==="memory_consumption"&&(t=this.memoryCallbacks.onConsumptionResult?.(e.result)),t!==void 0&&Promise.resolve(t).catch(s=>{this.diagnostics?.record("[QueryRunner] memory callback threw:",s)})}catch(t){this.diagnostics?.record("[QueryRunner] memory callback threw:",t)}}dispatchSkillEvolutionCallbacks(e){if(!(e.type!=="system"||e.subtype!=="skill_evolution"||!this.skillEvolutionCallbacks))try{let t=this.skillEvolutionCallbacks.onResult?.(e.result);t!==void 0&&Promise.resolve(t).catch(s=>this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",s))}catch(t){this.diagnostics?.record("[QueryRunner] skill evolution callback threw:",t)}}flushBeforeEndInput(){return this.endInputFlushPromise||(this.endInputFlushPromise=this.performFlushBeforeEndInput()),this.endInputFlushPromise}async performFlushBeforeEndInput(){try{let e=[];this.initConfig.memory!==void 0&&e.push(this.flushMemory()),this.initConfig.evolution?.skill!==void 0&&e.push(this.flushSkillEvolution());let s=(await Promise.allSettled(e)).find(r=>r.status==="rejected");if(s)throw s.reason}catch(e){this.diagnostics?.record("[QueryRunner] post-turn flush before end input failed:",e)}finally{this.transport.endInput()}}async request(e,t){if(t?.signal?.aborted)throw new F;let s=Is(),r=As(s,e),o=t?.timeoutMs??this.controlRequestTimeoutMs,i=Ce(r.request)??"unknown",a=Date.now();return new Promise((u,l)=>{let c=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=()=>{c&&(clearTimeout(c),c=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(),l(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),l(g)}}),t?.signal?.addEventListener("abort",d,{once:!0}),o>0&&Number.isFinite(o)&&(c=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(),l(new Error(`Control request "${Ce(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),l(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 Ke({requestId:s,message:t.error,code:t.code,retryable:t.retryable,details:t.details});r.reject(o),this.processPendingPermissionRequests(t.pending_permission_requests)}}processPendingPermissionRequests(e){if(e)for(let t of e)Ce(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=Ce(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}=ca(i),l=Ds(t,a,u);this.transport.write(JSON.stringify(l)+`
|
|
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=Jt;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=Bs(t),o=Bs(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 W(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=Ce(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,l=await this.awaitAbortable(this.fetchJobToken({requestId:u,reason:i,sessionId:a},{signal:t}),t);if(!l?.token)throw new Error("job_token_unavailable: Host did not provide a Job Token");let c=l.expiresAt;if(c!==void 0&&(!Number.isFinite(c)||c<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:l.token,...c!==void 0?{expires_at:c}:{}}}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,l=o.permission_suggestions??o.suggestions,c=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:l,blockedPath:c,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(Rs(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)),l,c=new Promise((f,y)=>{l=setTimeout(()=>{y(new Le(a))},a)}),m;try{m=await this.awaitAbortable(Promise.race([u,c]),t)}finally{clearTimeout(l)}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,supportsCommandsChanged:!0,initializeTimeoutMs:n.INITIALIZE_TIMEOUT_MS},t={};for(let[r,o]of Object.entries(this.hooks)){if(!o||o.length===0)continue;let i=[];for(let a of o){let u=a.hooks.map(l=>{let c=`hook_${this.nextHookCallbackId++}`;return this.hookCallbacks.set(c,l),c});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.goalMaxTurns!==void 0&&(e.goalMaxTurns=this.initConfig.goalMaxTurns),this.initConfig.enableFileCheckpointing!==void 0&&(e.enableFileCheckpointing=this.initConfig.enableFileCheckpointing),this.initConfig.independentPlanModeControls===!0){e.independentPlanModeControls=!0;let r=Be(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.replaceLatestCommands(r.commands),this.cliCapabilities=new Set(r.capabilities??[])}if(!this.initResponse)throw new Error("Failed to receive initialization response");if(this.initConfig.goalMaxTurns!==void 0&&!this.cliCapabilities?.has(n.GOAL_MAX_TURNS_CAPABILITY))throw new Q(n.GOAL_MAX_TURNS_CAPABILITY);if(this.initConfig.planMode!==void 0){if(!this.cliCapabilities?.has(n.PLAN_MODE_CAPABILITY))throw new Q(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 Q(n.SESSION_STORE_FORK_BARRIER_CAPABILITY);let e=this.transcriptMirrorBatcher;if(!e)throw new Error("SessionStore Fork persistence barrier requires a transcript mirror.");await e.completeBarrier(),this.sessionStoreForkBarrierComplete=!0}async flushTranscriptMirrorForLifecycle(){if(this.initConfig.requireSessionStoreForkBarrier===!0&&!this.sessionStoreForkBarrierComplete){this.transcriptMirrorBatcher?.discardPending();return}await this.transcriptMirrorBatcher?.flush()}async invokeRegisteredHookCallback(e,t,s,r){let o=this.hookCallbacks.get(e);if(!o)throw new Error(`Unknown hook callback: ${e}`);return await this.awaitAbortable(o(t,s,{signal:r}),r)??{continue:!0}}async initializationResult(){return this.initialize()}replaceLatestCommands(e){this.latestCommands=(e??[]).map(t=>({...t}))}getLatestCommands(){return this.latestCommands.map(e=>({...e}))}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:sa(),a={...s,uuid:i,...o===void 0?{}:{custom_context:o}};this.pendingErrorResultExit=!1,o!==void 0&&!this.cliCapabilities?.has(n.CUSTOM_CONTEXT_CAPABILITY)&&!this.customContextCapabilityWarningEmitted&&(this.customContextCapabilityWarningEmitted=!0,this.diagnostics?.record("[QueryRunner] custom_context requested but paired CLI does not advertise custom_context_v1; the field may be ignored")),this.transport.write(JSON.stringify(a)+`
|
|
13
|
+
`),this.recordOutboundSessionMessage(a)}t>0&&await this.waitForFirstResult(),(!this.isSingleTurn||!this.firstResultReceived)&&await this.flushBeforeEndInput()}catch(t){this.diagnostics?.record("[QueryRunner] streamInput error:",t),this.inputStream.error(t instanceof Error?t:new Error(String(t))),this.transport.endInput()}})().catch(()=>{})}async interrupt(){let t=(await this.request({type:"interrupt"}))?.still_queued;if(Array.isArray(t))return{still_queued:t.filter(s=>typeof s=="string")}}async cancelAsyncMessage(e){return(await this.request({subtype:"cancel_async_message",message_uuid:e})).cancelled}async stopTask(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY),await this.request({subtype:"stop_task",task_id:e})}async backgroundTasks(e){await this.requireCliCapability(n.BACKGROUND_TASKS_CAPABILITY);let t=await this.request({subtype:"background_tasks",tool_use_id:e});return typeof t?.backgrounded=="boolean"?t.backgrounded:!0}async setGoal(e){await this.requireCliCapability(n.GOAL_CAPABILITY);let t={subtype:"set_goal"};return e.objective!==void 0&&(t.objective=e.objective),e.status!==void 0&&(t.status=e.status),e.creditsBudget!==void 0&&(t.credits_budget=e.creditsBudget),(await this.request(t))?.goal??null}async setGoalMaxTurns(e){e!==null&&Ee(e),await this.requireCliCapability(n.GOAL_MAX_TURNS_CAPABILITY);let t={subtype:"set_goal_max_turns",max_turns:e},s=await this.request(t);return Ee(s.goal_max_turns),s.goal_max_turns}async getGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"get_goal"};return(await this.request(e))?.goal??null}async clearGoal(){await this.requireCliCapability(n.GOAL_CAPABILITY);let e={subtype:"clear_goal"};return(await this.request(e))?.cleared===!0}async setPlanMode(e){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let t={subtype:"set_plan_mode",active:e};return(await this.request(t)).plan_mode}async getPlanMode(){await this.requireCliCapability(n.PLAN_MODE_CAPABILITY);let e={subtype:"get_plan_mode"};return(await this.request(e)).plan_mode}async requireCliCapability(e){if(await this.initializationResult(),!this.cliCapabilities?.has(e))throw new Q(e)}async applyAttachedGoalMaxTurns(){let e=this.initConfig.goalMaxTurns;if(e===void 0)return;if(!this.cliCapabilities?.has(n.GOAL_MAX_TURNS_CAPABILITY))throw new Q(n.GOAL_MAX_TURNS_CAPABILITY);let t=await this.request({subtype:"set_goal_max_turns",max_turns:e});Ee(t.goal_max_turns)}async setPermissionMode(e){let t=this.initConfig.independentPlanModeControls===!0?Be(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(),this.getLatestCommands()}async getAvailableModels(e){let t={subtype:"get_models",...e?.fetchStrategy?{fetchStrategy:e.fetchStrategy}:{},...e?.uid?{uid:e.uid}:{}};return(await this.request(t))?.models??[]}async listByokProviders(){try{return(await this.request({type:"get_byok_config"}))?.providers??null}catch{return null}}async validateByokModel(e){try{let t=await this.request({type:"validate_byok_model",provider:e.provider,model:e.model,api_key:e.api_key,...e.url!==void 0?{url:e.url}:{},...e.style!==void 0?{style:e.style}:{}});return typeof t?.success=="boolean"?t.success:null}catch{return null}}async listByokConfigs(){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"list_byok_configs"})).configs}async createByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),(await this.request({type:"create_byok_config",config:e})).config}async updateByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"update_byok_config",config:e})}async deleteByokConfig(e){await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"delete_byok_config",target:e})}async checkByokConfig(e){return await this.requireCliCapability(n.BYOK_CONFIG_MANAGEMENT_CAPABILITY),await this.request({type:"check_byok_config",config:e})}async supportedAgents(){return(await this.initializationResult()).agents??[]}async accountInfo(){try{let t=await this.request({type:"account_info"});if(t?.account&&Object.keys(t.account).length>0)return t.account}catch{}return(await this.initializationResult()).account??{}}async mcpServerStatus(){return(await this.request({type:"mcp_status"}))?.servers??[]}async getContextUsage(){return await this.request({type:"get_context_usage"})}async getUsageInfo(){try{let e=await this.request({type:"get_usage_info"}),t=la(e?.usage),s=ua(e?.session);return!t&&!s?null:{...t??{},...s?{session:s}:{}}}catch{return null}}async reloadPlugins(){let e=await this.request({type:"reload_plugins"});return this.replaceLatestCommands(e.commands),e}async reloadSkills(){return await this.requireCliCapability("reload_skills_v1"),await this.request({type:"reload_skills"})}async listPlugins(){return(await this.request({type:"list_plugins"})).plugins}async rewindFiles(e,t){let s={type:"rewind_files",user_message_id:e};t?.dryRun&&(s.dry_run=!0);let o=await this.request(s);if(!t?.dryRun&&o?.canRewind===!1)throw new Error(typeof o.error=="string"&&o.error.length>0?o.error:"Unable to rewind files.");return o}async rewind(e,t){if(!(await this.initializationResult()).capabilities?.includes("session_rewind_v1"))throw new Error("The connected qodercli does not support full session rewind (session_rewind_v1).");let r={type:"rewind",user_message_id:e,scope:t?.scope??"both"};return t?.dryRun&&(r.dry_run=!0),await this.request(r)}async seedReadState(e,t){await this.request({type:"seed_read_state",path:e,mtime:t})}async flushMemory(){return this.memoryFlushPromise||(this.memoryFlushPromise=this.performMemoryFlush().finally(()=>{this.memoryFlushPromise=void 0})),this.memoryFlushPromise}async flushSkillEvolution(){return this.skillEvolutionFlushPromise||(this.skillEvolutionFlushPromise=this.performSkillEvolutionFlush().finally(()=>{this.skillEvolutionFlushPromise=void 0})),this.skillEvolutionFlushPromise}async performSkillEvolutionFlush(){await this.requireSkillEvolutionEnabled(),await this.request({type:"flush_skill_evolution"})}async requireSkillEvolutionEnabled(){let e=await this.initializationResult();if(!this.cliCapabilities?.has("skill_evolution_v1"))throw new Q("skill_evolution_v1");if(e.evolution?.skill?.enabled!==!0||e.evolution.skill.requester!=="sdk")throw new Error("The connected CLI did not enable SDK skill evolution for this query")}async performMemoryFlush(){await this.requireSdkMemoryEnabled(),await this.request({type:"flush_memory"})}async refreshMemory(){await this.requireSdkMemoryEnabled(),await this.request({type:"refresh_memory"})}async requireSdkMemoryEnabled(){let e=await this.initializationResult();if(e.memory?.enabled!==!0||e.memory.requester!=="sdk")throw new Error("The connected CLI did not enable SDK memory for this query")}async reconnectMcpServer(e){await this.request({type:"mcp_reconnect",serverName:e})}async toggleMcpServer(e,t){await this.request({type:"mcp_toggle",serverName:e,enabled:t})}async setMcpServers(e){let t=Vn(e);return await this.request({type:"mcp_set_servers",servers:t})??{added:[],removed:[],errors:{}}}async injectMcpToken(e,t){await this.request({type:"mcp_inject_token",serverName:e,token:t})}async mcpAuthenticate(e,t){let s=await this.request({type:"mcp_authenticate",serverName:e,...t!==void 0?{redirectUri:t}:{}}),r=s?.requiresUserAction===!0,o=typeof s?.authUrl=="string"?s.authUrl:void 0;if(r&&o===void 0)throw new Error("mcp_authenticate response set requiresUserAction=true but did not include an authUrl");return r?{authUrl:o,requiresUserAction:!0}:{requiresUserAction:!1}}async mcpSubmitOAuthCallbackUrl(e,t){await this.request({type:"mcp_oauth_callback_url",serverName:e,callbackUrl:t})}async mcpClearAuth(e){await this.request({type:"mcp_clear_auth",serverName:e})}async close(){return this.closePromise||(this.closePromise=this.performClose()),this.closePromise}async performClose(){if(this.closed)return;if((this.initConfig.memory!==void 0||this.initConfig.evolution?.skill!==void 0)&&(this.initResponse?.memory?.enabled===!0||this.initResponse?.evolution?.skill?.enabled===!0)&&this.transport.isReady()&&this.abortController?.signal.aborted!==!0)try{await(this.endInputFlushPromise??this.flushBeforeEndInput())}catch(s){this.diagnostics?.record("[QueryRunner] post-turn flush during close failed:",s)}this.closed=!0;for(let[,s]of this.pendingInboundRequests)s.abortController.abort();this.pendingInboundRequests.clear(),this.hookCallbacks.clear();let e=new Error("SDK closing");for(let[s,r]of this.sdkMcpTransports){try{await r.close()}catch(o){this.diagnostics?.record(`[QueryRunner] error closing SDK MCP transport "${s}":`,o)}Cs(s,e,this.pendingMcpResponses)}let t;try{await this.transport.close()}catch(s){t={error:s}}try{await this.readLoopPromise}catch{}if(await this.flushTranscriptMirrorForLifecycle(),t)throw t.error}async[Symbol.asyncDispose](){await this.close()}};function $s(n){return new $e(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 Wt(n){return typeof n=="number"&&Number.isFinite(n)}function Vt(n){return Object.keys(n).length>0}function G(n,e,t){let s=e[t];Wt(s)&&(n[t]=s)}function Pe(n,e,t){let s=e[t];typeof s=="string"&&(n[t]=s)}function yt(n,e,t){let s=e[t];typeof s=="boolean"&&(n[t]=s)}function zs(n){if(!de(n)||Array.isArray(n))return;let e={};return G(e,n,"total"),G(e,n,"used"),G(e,n,"remaining"),G(e,n,"percentage"),Pe(e,n,"unit"),Vt(e)?e:void 0}function ia(n){if(!de(n)||Array.isArray(n))return;let e=zs(n)??{};return Pe(e,n,"detailUrl"),Vt(e)?e:void 0}function aa(n){if(!de(n)||Array.isArray(n))return;let e={};return G(e,n,"used"),G(e,n,"cap"),G(e,n,"remaining"),G(e,n,"percentage"),yt(e,n,"available"),Pe(e,n,"unit"),Vt(e)?e:void 0}function ua(n){if(!de(n)||Array.isArray(n))return;let e=n.total_credits,t=n.model_usage;if(!Wt(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;Wt(i)&&i>=0&&(s[r]={credits:i})}return{total_credits:e,model_usage:s}}function la(n){if(!de(n)||Array.isArray(n))return null;let e={};Pe(e,n,"userId"),Pe(e,n,"userType"),G(e,n,"totalUsagePercentage"),yt(e,n,"isHighestTier"),G(e,n,"expiresAt"),Pe(e,n,"upgradeUrl"),yt(e,n,"isQuotaExceeded"),yt(e,n,"isPlanQuotaProrated");let t=zs(n.userQuota);t&&(e.userQuota=t);let s=ia(n.addOnQuota);s&&(e.addOnQuota=s);let r=aa(n.orgResourcePackage);return r&&(e.orgResourcePackage=r),e}function ca(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 Bs(n){let e=/^(\d+)\.(\d+)(?:\.\d+)?(?:[-+].*)?$/.exec(n);return e?{major:Number(e[1]),minor:Number(e[2])}:null}var St=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 Qs}from"crypto";var da="QODER_CLOUD_AGENT_API_BASE",pa="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"},ma=1024,Gs=1*1024*1024,Js=4*1024*1024,fa=8*1024,Xt=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"}},wt=class extends Error{code="cloud_agent_auth_requires_access_token";constructor(){super("options.experimentalCloudAgent requires PAT authentication via accessToken() or accessTokenFromEnv()."),this.name="CloudAgentUnsupportedAuthError"}},Zt=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}},ga=new Set(["abortController","auth","experimentalCloudAgent","debug","debugFile","stderr","env","includePartialMessages","onAuthExpired"]);function Ys(n){if(!n.experimentalCloudAgent)return;let e=Object.keys(n).filter(o=>n[o]!==void 0&&!ga.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 wt;let{agent:t,session:s}=n.experimentalCloudAgent;if(t&&Te(t)&&Yt(t))throw new Error("options.experimentalCloudAgent.agent must specify either id or create, not both.");if(s&&Te(s)&&Yt(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||!Yt(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 Yt(n){return"create"in n&&n.create!==void 0}function Xs(n){return new en(n)}var en=class{experimentalCloudAgent;inputStream;abortController=new AbortController;accessToken;apiBase;diagnostics;onAuthExpired;sessionReadyPromise;readLoopPromise;sseConnected=Ia();startedAt=Date.now();closed=!1;authExpiredFired=!1;sessionId;assistantTextParts=[];currentTurnId;lastSseEventId;hasCurrentTurn=!1;pendingTurnEvents=[];latestUsage=Vs();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=ha(e.options.auth,e.options.env),this.apiBase=ya(),this.inputStream=new Z(()=>{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(Ta(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=Pa(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 listByokConfigs(){this.unsupported("listByokConfigs")}async createByokConfig(e){this.unsupported("createByokConfig")}async updateByokConfig(e){this.unsupported("updateByokConfig")}async deleteByokConfig(e){this.unsupported("deleteByokConfig")}async checkByokConfig(e){this.unsupported("checkByokConfig")}async supportedAgents(){this.unsupported("supportedAgents")}async mcpServerStatus(){this.unsupported("mcpServerStatus")}async getContextUsage(){this.unsupported("getContextUsage")}async getUsageInfo(){this.unsupported("getUsageInfo")}async reloadPlugins(){this.unsupported("reloadPlugins")}async reloadSkills(){this.unsupported("reloadSkills")}async listPlugins(){this.unsupported("listPlugins")}async accountInfo(){this.unsupported("accountInfo")}async rewindFiles(e,t){this.unsupported("rewindFiles")}async rewind(e,t){this.unsupported("rewind")}async seedReadState(e,t){this.unsupported("seedReadState")}async flushMemory(){this.unsupported("flushMemory")}async flushSkillEvolution(){this.unsupported("flushSkillEvolution")}async refreshMemory(){this.unsupported("refreshMemory")}async mcpAuthenticate(e,t){this.unsupported("mcpAuthenticate")}async mcpSubmitOAuthCallbackUrl(e,t){this.unsupported("mcpSubmitOAuthCallbackUrl")}async close(){this.finish();try{await this.readLoopPromise}catch{}}async[Symbol.asyncDispose](){await this.close()}async initializeCloudSession(){if(this.closed)throw new Error("Cloud Agent query is closed.");let{session:e}=this.experimentalCloudAgent,t;if(e&&Te(e))t=e.id;else{let s=await this.resolveAgentId(),r=e.create,o=await this.requestJson("/sessions",{method:"POST",body:{agent:s,...wa(r)}});t=Hs(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:Sa(e.create)});return Hs(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 Ma(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 Ws(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 l=r.slice(0,u);r=r.slice(u+1);let c=l.endsWith("\r")?l.slice(0,-1):l;if(this.consumeSseLine(c,o),this.closed)break}r.length>Gs&&(this.diagnostics?.record(`[cloud-agent] SSE line exceeded ${Gs} 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:_a(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>Js){this.diagnostics?.record(`[cloud-agent] SSE event data exceeded ${Js} 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??Qs(),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=Ra(ze(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=Vs(),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>=ma&&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(vt(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:Qs(),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 va(s)}captureUsage(e){let t=vt(e,"usage");if(!t)return;this.latestUsage=Ea(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]=Ca(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 Ws(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 ha(n,e){if(n?.type!=="accessToken")throw new wt;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 Xt(t);return s}function ya(){return process.env[da]?.replace(/\/+$/,"")??pa}function Sa(n){return tn({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 wa(n){return tn({title:n.title,environment_id:n.environment_id,resources:n.resources?.map(e=>tn({...e})),vault_ids:n.vault_ids,memory_store_ids:n.memory_store_ids})}function tn(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}function Hs(n,e){let t=U(n,"id");if(!t)throw new Error(`${e} response did not include an id.`);return t}function va(n){let e=ka(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 Ws(n){let e=await ba(n,fa);return new Zt(n.status,e||n.statusText||"unknown error")}async function ba(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 _a(n){if(n.length===0)return{};try{return JSON.parse(n)}catch{return n}}function vt(n,e){let t=ze(n,e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function ka(n,e){let t=ze(n,e);return Array.isArray(t)?t:void 0}function U(n,e){let t=ze(n,e);return typeof t=="string"?t:void 0}function x(n,e){let t=ze(n,e);return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ze(n,e){if(!(n===null||typeof n!="object"||Array.isArray(n)))return n[e]}function Ra(n){return typeof n=="string"?n:Array.isArray(n)&&n.map(t=>Zs(t)?t.text:"").filter(Boolean).join("")||void 0}function Ea(n,e){let t=vt(e,"cache_creation"),s=vt(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 Ca(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 Pa(n){let e=n.message.content;return typeof e=="string"?e:Array.isArray(e)?e.map(t=>Zs(t)?t.text:JSON.stringify(t)).join(`
|
|
16
|
+
`):JSON.stringify(e)}function Zs(n){return n!==null&&typeof n=="object"&&"type"in n&&n.type==="text"&&"text"in n&&typeof n.text=="string"}function Ta(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 Vs(){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 Ma(n,e){e.aborted||await new Promise(t=>{let s=setTimeout(t,n);e.addEventListener("abort",()=>{clearTimeout(s),t()},{once:!0})})}function Ia(){let n,e;return{promise:new Promise((s,r)=>{n=s,e=r}),resolve:n,reject:e}}import{access as Fa,chmod as or,cp as Ua,mkdtemp as La,mkdir as ir,realpath as ar,rm as nr,writeFile as Ka}from"fs/promises";import{homedir as Ba,tmpdir as $a}from"os";import{dirname as za,isAbsolute as ur,join as pe,relative as Qa,resolve as nn,sep as Ga}from"path";import{homedir as Aa}from"os";import{join as tr}from"path";var Oa=v.configDirName,Da=v.cliHomeEnv,xa=v.configDirEnv,er=200;function Na(){return process.env[Da]||Aa()}function qa(){let n=process.env[xa];return n||tr(Na(),Oa)}function Me(){return tr(qa(),"projects")}function ja(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<=er)return e;let t=Math.abs(ja(n)).toString(36);return`${e.slice(0,er)}-${t}`}var Ja=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ha=6e4;async function bt(n){if(n.resume===void 0&&!n.continue)return;let e=N(await Ya(n.cwd)),t=n.loadTimeoutMs??Ha,s=n.resume!==void 0?n.resume:await Xa(n.store,e,t);if(s===void 0||!Ja.test(s))return;let r={projectKey:e,sessionId:s},o=await sr(n.store,r,t);if(!o)return;let i=n.store.listSubkeys?await sn(n.store.listSubkeys(r),t,"listSubkeys"):[];if(!Array.isArray(i))throw new Error("SessionStore listSubkeys() must return an array");let a=[];for(let l of i){if(!eu(l)){console.warn(`[SessionStore] skipping unsafe subpath from listSubkeys: ${String(l)}`);continue}let c=await sr(n.store,{...r,subpath:l},t);c&&a.push({subpath:l,entries:c})}let u;try{u=await La(pe($a(),"qoder-session-store-")),await or(u,448),u=await ar(u),await Va(Wa(n.env),u);let l=pe(u,"projects",e),c=pe(l,s);await ir(l,{recursive:!0,mode:448}),await rr(pe(l,`${s}.jsonl`),o);for(let{subpath:p,entries:d}of a){let g=tu(c,`${p}.jsonl`),h=d.filter(y=>y.type==="agent_metadata"),f=d.filter(y=>y.type!=="agent_metadata");if(f.length>0&&await rr(g,f),h.length>0){let y={...h.at(-1)};delete y.type,await lr(g.slice(0,-6)+".meta.json",JSON.stringify(y))}}let m=u;return{configDir:m,projectKey:e,sessionId:s,cleanup:async()=>{await nr(m,{recursive:!0,force:!0})}}}catch(l){throw u!==void 0&&await nr(u,{recursive:!0,force:!0}),l}}function Wa(n){let e=n?.[v.cliHomeEnv]??process.env[v.cliHomeEnv]??Ba();return nn(n?.[v.configDirEnv]??process.env[v.configDirEnv]??pe(e,v.configDirName))}async function Va(n,e){for(let t of[".auth","oauth_creds.json"]){let s=pe(n,t);try{await Fa(s),await Ua(s,pe(e,t),{recursive:!0,force:!1,preserveTimestamps:!0})}catch(r){if(r.code!=="ENOENT")throw r}}}async function Ya(n){let e=nn(n??process.cwd());try{return await ar(e)}catch{return e}}async function Xa(n,e,t){if(!n.listSessions)throw new Error("sessionStore.listSessions() is required when options.continue is true");let s=await sn(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 sr(n,e,t){let s=await sn(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)=>Za(r,o))}}function Za(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 eu(n){return!(typeof n!="string"||!n||n.includes("\0")||n.includes("\\")||ur(n)||/^[a-z]:/i.test(n)||n.replaceAll("\\","/").split("/").some(e=>!e||e==="."||e===".."))}function tu(n,e){let t=nn(n,e),s=Qa(n,t);if(s===""||s===".."||s.startsWith(`..${Ga}`)||ur(s))throw new Error(`SessionStore subpath escapes the session: ${e}`);return t}async function rr(n,e){let t=e.map(s=>JSON.stringify(s)).join(`
|
|
17
|
+
`);await lr(n,t?`${t}
|
|
18
|
+
`:"")}async function lr(n,e){await ir(za(n),{recursive:!0,mode:448}),await Ka(n,e,{encoding:"utf8",mode:384}),await or(n,384)}async function sn(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 nu=/^(?:qoder(?:cli|clicn|cn)?-)?worker-runtime(?:\.obf)?\.mjs$/i;function su(n){let e=n.replace(/\\/g,"/").split("/").at(-1)??"";return nu.test(e)}function Ie(n,e,t=process.env){let s=n.pathToQoderCLIExecutable;return s?su(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 cr from"node:path";function Ae(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function Qe(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function ru(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(Ae(s.id,`options.memory.generation.roots[${t}].id`),Ae(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){Ae(s.indexFile,`options.memory.generation.roots[${t}].indexFile`);let r=s.indexFile.replaceAll("\\","/");if(cr.posix.isAbsolute(r)||cr.win32.isAbsolute(s.indexFile)||r.split("/").includes(".."))throw new TypeError(`options.memory.generation.roots[${t}].indexFile must stay within its root`)}}}function ou(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(Ae(s.id,`options.memory.consumption.files[${t}].id`),Ae(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 dr(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 Qe(n.generation?.onResult,"options.memory.generation.onResult"),Qe(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");ru(s.roots),s.prompt!==void 0&&Ae(s.prompt,"options.memory.generation.prompt"),Qe(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(Qe(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(ou(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"');Qe(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 _t=10;function iu(n,e){if(typeof n!="string"||n.trim()==="")throw new TypeError(`${e} must be a non-empty string`)}function kt(n,e){if(n!==void 0&&typeof n!="function")throw new TypeError(`${e} must be a function`)}function pr(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 au(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&&iu(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");kt(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=pr(n.turnComplete.reviewThreshold);if(kt(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 mr(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=pr(r?.reviewThreshold);return e?.enabled===!1?(kt(e?.onResult,"options.evolution.skill.generation.onResult"),{callbacks:{shouldReviewCallbacks:new Map,onResult:e?.onResult}}):(kt(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=au(e);return t.config?.enabled===!1?{callbacks:t.callbacks}:{config:{requester:"sdk",mode:"custom",generation:t.config},callbacks:t.callbacks}}import{spawn as el}from"node:child_process";import{isDeepStrictEqual as tl}from"node:util";import{createInterface as gu}from"node:readline";var S=class extends Error{code="DAEMON_PROTOCOL_ERROR";constructor(e){super(e),this.name="DaemonProtocolError"}};function an(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":uu(t);break;case"control_response":lu(t);break;case"event":O(t,["type","event","session_id","data"],"event frame"),E(t,"event"),Et(t),R(t.data,"event data");break;case"keep_alive":O(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"),!du(t.type))throw new S(`unknown daemon message type: ${String(t.type)}`);cu(t),Et(t)}return t}function fr(n){let e=JSON.stringify(n);return an(e),e}function gr(n,e){let t=e.response.response;switch(n){case"initialize":{Rt(e,"initialize response");let s=R(t,"initialize response");if(O(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"),mu(s,"capabilities"),s}case"open_session":{let s=Ge(e,"open_session response");return on(t,"open_session"),{session_id:s}}case"list_sessions":{Rt(e,"list_sessions response");let s=R(t,"list_sessions response");O(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())rn(R(i,`sessions[${o}]`),`sessions[${o}]`);return s}case"rename_session":{Ge(e,"rename_session response");let s=R(t,"rename_session response");return O(s,["session"],"rename_session response"),rn(R(s.session,"rename_session session"),"rename_session session"),s}case"subscribe_session":{let s=Ge(e,"subscribe_session response"),r=R(t,"subscribe_session response");O(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":{Rt(e,"enable_remote_control response");let s=R(t,"enable_remote_control response");return O(s,["environment_id"],"enable_remote_control response"),E(s,"environment_id"),s}case"update_session_metadata":{Ge(e,"update_session_metadata response");let s=R(t,"update_session_metadata response");return O(s,["session"],"update_session_metadata response"),rn(R(s.session,"update_session_metadata session"),"update_session_metadata session"),s}case"unsubscribe_session":case"close_session":return Ge(e,`${n} response`),on(t,n),null;case"sync_session_registrations":case"disable_remote_control":case"delete_session":case"shutdown":return Rt(e,`${n} response`),on(t,n),null;default:throw new S(`unknown daemon command result method: ${String(n)}`)}}function uu(n){O(n,["type","request_id","session_id","request"],"control_request frame"),E(n,"request_id"),Et(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 lu(n){O(n,["type","session_id","response"],"control_response frame"),Et(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");O(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(O(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&&pu(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 rn(n,e){O(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 on(n,e){if(n!==void 0)throw new S(`${e} success must omit response`)}function Ge(n,e){let t=n;try{return E(t,"session_id")}catch{throw new S(`${e} requires a valid session_id`)}}function Rt(n,e){if(Object.hasOwn(n,"session_id"))throw new S(`${e} must not include session_id`)}function Et(n){let e=n;e.session_id!==void 0&&E(e,"session_id")}function cu(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 du(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 pu(n,e){let t=n[e];if(typeof t!="boolean")throw new S(`${e} must be a boolean`);return t}function mu(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 O(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 Je=class{constructor(e,t){this.connection=e;this.options=t;this.remoteSessionId="remoteSessionId"in t?t.remoteSessionId:void 0}messages=new Z;pendingMessages=[];initializePromise;sessionId;flushingPendingMessages=!1;inputEnded=!1;resultReceived=!1;commandLifecycleSupported=!1;pendingCommandUuids=new Set;closed=!1;cleaned=!1;releasePromise;closePromise;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=fu(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=hr(t,this.sessionId)}catch(r){this.failAndRelease(r);return}this.connection.sendSessionMessage(s).catch(r=>this.failAndRelease(r))}async*readMessages(){await this.initialize();for await(let e of this.messages)yield e}endInput(){this.closed||(this.inputEnded=!0,this.maybeCloseAfterResult())}close(){return this.closePromise||(this.closePromise=this.performClose(),this.closePromise.catch(()=>{})),this.closePromise}isReady(){return this.sessionId!==void 0&&!this.closed}acceptOutput(e){this.closed||(this.observeCapabilities(e),this.messages.enqueue(e),this.observeCommandLifecycle(e),e.type==="result"&&(this.resultReceived=!0),this.maybeCloseAfterResult())}fail(e){this.closed||(this.closed=!0,this.cleanup(),this.messages.error(e instanceof Error?e:new Error(String(e))))}async open(){let e;try{let t;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=>hr(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.close().catch(()=>{})}async performClose(){this.closed||(this.closed=!0,this.cleanup());try{this.initializePromise&&await this.initializePromise.catch(()=>{}),this.releasePromise?await this.releasePromise:this.sessionId&&await this.releaseSessionOnce(this.sessionId),this.messages.done()}catch(e){throw this.messages.error(e),e}}cleanup(){this.cleaned||(this.cleaned=!0,this.options.cleanup?.())}};function fu(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 hr(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 ln="multi_session_v2",yr="remote_control_v1",Sr="session_title_sync_v1",wr="session_delete_v1",cn="session_store_file_checkpointing_v1",dn="session_store_fork_barrier_v1",hu=3e4,Ct=3e4,yu=125e3,Pt=6e4,vr=12e4,Su=5e3,wu=1024,vu=64,bu=8*1024*1024,_u=256,ku=32*1024*1024,Ru=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"]),Oe=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}},q=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}},Tt=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??$,!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=hu){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:[ln,...o]}),u=new Promise((c,m)=>{r=setTimeout(()=>{let p=new Error(`Qoder CLI daemon did not initialize within ${i}ms`);this.fail(p),m(p)},i)}),l;try{l=await Promise.race([a,u])}finally{this.initializing=!1,r&&clearTimeout(r)}if(!l.capabilities.includes(ln))throw new S(`daemon is missing required capability: ${ln}`);for(let c of l.capabilities)this.capabilities.add(c);this.initialized=!0}createSessionTransport(e){if(!this.initialized||this.stopping||this.failure)throw this.failure??new Error("Daemon connection is not ready");return new Je(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 Je(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,vr)).session_id}subscribeSession(e,t){return this.request("subscribe_session",{remote_session_id:e},t,void 0,vr)}enableRemoteControl(e){return this.capabilities.has(yr)?this.request("enable_remote_control",e,void 0,void 0,Pt):Promise.reject(new S(`daemon is missing required capability: ${yr}`))}async listSessions(){return(await this.request("list_sessions",{},void 0,void 0,yu,"request")).sessions}renameSession(e,t){return this.capabilities.has(Sr)?this.request("rename_session",{title:t},void 0,e,Ct):Promise.reject(new S(`daemon is missing required capability: ${Sr}`))}async disableRemoteControl(){await this.request("disable_remote_control",{},void 0,void 0,Pt)}async syncSessionRegistrations(e){await this.request("sync_session_registrations",{local_session_ids:e},void 0,void 0,Pt)}updateSessionMetadata(e,t){return this.request("update_session_metadata",{extra:t},void 0,e,Ct)}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,Ct)}async deleteSession(e){if(!this.capabilities.has(wr))throw new S(`daemon is missing required capability: ${wr}`);await this.request("delete_session",{local_session_id:e},void 0,void 0,Pt)}async unsubscribeSession(e){this.sessions.delete(e),this.closedSessionIds.add(e),await this.request("unsubscribe_session",{},void 0,e,Ct)}async shutdown(e=Su){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((l,c)=>{let m={method:e,resolve:p=>l(p),reject:c,...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),c(p),d?.sessionTransport&&this.failIfSessionMessagesAreOrphaned()})})}async readOutput(e){let t=new Y(this.maxFrameBytes,"SDK daemon output");e.pipe(t);let s=gu({input:t,crlfDelay:1/0,terminal:!1});try{for await(let r of s){if(!r.trim())continue;let o=Eu(r);o!==void 0&&this.rejectLegacyInitialize(o)||this.acceptFrame(an(r))}(!this.stopping||this.pendingRequests.size>0)&&this.fail(new Error("Daemon connection closed"),!1)}catch(r){this.fail(r)}finally{s.close(),e.unpipe(t),t.destroy()}}acceptFrame(e){let t=e;if(t.type!=="keep_alive"){if(t.type==="control_response"){let s=e,r=s.response.request_id;if(this.pendingRequests.has(r)){this.acceptControlResponse(s);return}if(this.timedOutRequestIds.delete(r))return;this.routeSessionMessage(t);return}if(t.type==="control_request"){let s=e,r=Cu(s);if(r==="valid"){this.acceptRequest(s);return}if(r==="contradictory")throw new 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>=wu){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 W("1","2"));return}s.reject(new Oe({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 W(String(o),String(2));let i=gr(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 l=this.failIfSessionMessagesAreOrphaned(`${s.method} response session_id does not match buffered output`);if(l)throw l;if(this.sessions.has(a)){let c=new S(`daemon returned duplicate session_id: ${a}`);throw this.fail(c),c}this.sessions.set(a,s.sessionTransport);for(let c of u)s.sessionTransport.acceptOutput(c)}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>vu||o+r>bu||this.pendingSessionMessageFrameCount+1>_u||this.pendingSessionMessageByteCount+r>ku)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 W("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 q?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 Oe({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(Pu(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 Oe({code:o,message:i,retryable:!1})})}writeFrame(e){let t;try{t=`${fr(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 Eu(n){let e;try{e=JSON.parse(n)}catch{return}if(!br(e)||!_r(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(!(!br(t)||!_r(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 br(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function _r(n,e){return Object.keys(n).length===e.length&&e.every(t=>Object.hasOwn(n,t))}function Cu(n){let e=Ru.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 Pu(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 Tu}from"node:crypto";function J(n,e="extra"){if(!kr(n))throw new TypeError(`${e} must be a JSON object`);return pn(n,e,new Set),structuredClone(n)}function pn(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)=>pn(s,`${e}[${r}]`,t));else{if(!kr(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))pn(r,`${e}.${s}`,t)}t.delete(n)}}function kr(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Mu=3e4,Iu=256,Er=512*1024;function Au(n){return gn([n])}var Mt=class extends q{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 Cr(n,e={}){let t=mn(e.callbackTimeoutMs??Mu,"callbackTimeoutMs"),s=mn(e.maxEntriesPerPage??Iu,"maxEntriesPerPage"),r=mn(e.maxPayloadBytes??Er,"maxPayloadBytes"),o=new Map,i=!1,a;return Object.assign(async l=>{if(i)throw j("SESSION_STORE_DISPOSED","SessionStore daemon connection is closed");switch(l.request.type){case"daemon.session_store.list_all":return Ou(n,l,t,s,r);case"daemon.session_store.load":return Du(n,l,t,s,r);case"daemon.session_store.append":return xu(n,l,t,s,r);case"daemon.session_store.update_metadata":return qu(n,l,t);case"daemon.session_store.delete":return Nu(n,l,t);case"daemon.session_store.materialize":return ju(n,l,t,o);case"daemon.session_store.release_materialization":return Fu(l,t,o);default:throw j("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${l.request.type}`)}},{dispose(){return a||(i=!0,a=Promise.all([...o.keys()].map(l=>Pr(l,t,o))).then(()=>{}),a.catch(()=>{a=void 0}),a)}})}async function Ou(n,e,t,s,r){let o=fe(e,["cursor"]),i=Ir(o.cursor),a=await ge("list_all",t,!0,()=>n.listAllSessions());if(!Array.isArray(a))throw j("SESSION_STORE_OPERATION_FAILED","SessionStore listAllSessions() must return an array",!0,"list_all");let u=a.map((c,m)=>Lu(Uu(c,`sessions[${m}]`))),l=Ar(u,i,s,r,"list_all");return{sessions:l.items,next_cursor:l.nextCursor}}async function Du(n,e,t,s,r){let o=fe(e,["key","cursor"]),i=De(o.key,"key"),a=Ir(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 j("SESSION_STORE_OPERATION_FAILED","SessionStore load() must return an array or null",!0,"load");let l=u.map((m,p)=>Mr(m,`entries[${p}]`)),c=Ar(l,a,s,r,"load");return{found:!0,entries:c.items,next_cursor:c.nextCursor}}async function xu(n,e,t,s,r){let o=fe(e,["key","entries"]),i=De(o.key,"key");if(!Array.isArray(o.entries))throw C("entries must be an array");if(o.entries.length>s)throw hn(`entries exceeds the ${s} entry batch limit`,{operation:"append",entryCount:o.entries.length,maxEntriesPerBatch:s});let a=o.entries.map((u,l)=>Mr(u,`entries[${l}]`));return Ku(a,r,{operation:"append"}),await ge("append",t,!1,()=>n.append(i,a)),null}async function Nu(n,e,t){let s=fe(e,["key"]),r=De(s.key,"key");if(!n.delete)throw j("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore delete() is not implemented",!1,"delete");return await ge("delete",t,!1,()=>n.delete(r)),null}async function qu(n,e,t){let s=fe(e,["key","extra"]),r=De(s.key,"key");if(r.subpath!==void 0)throw C("key.subpath is not allowed for Session metadata");if(!n.updateSessionMetadata)throw j("SESSION_STORE_OPERATION_UNSUPPORTED","SessionStore updateSessionMetadata() is not implemented",!1,"update_metadata");let o=Tr(s.extra,"extra");return await ge("update_metadata",t,!1,()=>n.updateSessionMetadata(r,{extra:o})),null}async function ju(n,e,t,s){let r=fe(e,["key","cwd"]),o=De(r.key,"key");if(o.subpath!==void 0)throw C("key.subpath is not allowed for materialization");let i=me(r.cwd,"cwd"),a,u;try{u=await ge("materialize",t,!0,()=>(a=bt({store:n,cwd:i,resume:o.sessionId,loadTimeoutMs:t}),a))}catch(c){throw a?.then(m=>m?.cleanup()).catch(()=>{}),c}if(!u)throw j("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(()=>{}),j("SESSION_STORE_KEY_MISMATCH","SessionStore key does not match the requested cwd",!1,"materialize");let l=`materialized_${Tu()}`;return s.set(l,{materialized:u}),{lease_id:l,config_dir:u.configDir}}async function Fu(n,e,t){let s=fe(n,["lease_id"]),r=me(s.lease_id,"lease_id");return await Pr(r,e,t),null}async function Pr(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 C(`request contains unknown field: ${s}`);return n.request}function De(n,e){let t=fn(n,e),s=["projectKey","sessionId","subpath"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw C(`${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 C(`${e}.subpath must be a non-empty string`);return{projectKey:o,sessionId:i,...typeof a=="string"?{subpath:a}:{}}}function Uu(n,e){let t=fn(n,e),s=["key","title","lastActiveAt","cwd","extra"],r=Object.keys(t).find(u=>!s.includes(u));if(r)throw C(`${e} contains unknown field: ${r}`);let o=me(t.lastActiveAt,`${e}.lastActiveAt`);if(!Number.isFinite(Date.parse(o)))throw C(`${e}.lastActiveAt must be an ISO timestamp`);let i=De(t.key,`${e}.key`);if(i.subpath!==void 0)throw C(`${e}.key must identify a main Session`);let a=t.extra===void 0?void 0:Tr(t.extra,`${e}.extra`);return{key:i,title:Rr(t.title,`${e}.title`),lastActiveAt:o,cwd:Rr(t.cwd,`${e}.cwd`),...a===void 0?{}:{extra:a}}}function Lu(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 Tr(n,e){try{return J(n,e)}catch(t){throw C(t instanceof Error?t.message:`${e} must be a JSON object`)}}function Mr(n,e){let t=fn(n,e);me(t.type,`${e}.type`);try{return JSON.parse(JSON.stringify(t))}catch{throw C(`${e} must be JSON-safe`)}}function fn(n,e){if(typeof n!="object"||n===null||Array.isArray(n))throw C(`${e} must be an object`);return n}function me(n,e){if(typeof n!="string"||n.length===0)throw C(`${e} must be a non-empty string`);return n}function Rr(n,e){let t=me(n,e);if(t.trim().length===0)throw C(`${e} must be a non-empty string`);return t}function Ir(n){if(n===void 0)return 0;if(typeof n!="string"||!/^(0|[1-9]\d*)$/.test(n))throw C("cursor must be a non-negative integer string");let e=Number(n);if(!Number.isSafeInteger(e))throw C("cursor exceeds the supported range");return e}function Ar(n,e,t,s,r){if(e>n.length)throw C("cursor is beyond the current result set");let o=[],i=2;for(let u=e;u<n.length;u+=1){let l=gn(n[u]),c=l+(o.length?1:0),m=l+2;if(m>s&&o.length===0)throw hn("one SessionStore item exceeds the payload limit",{operation:r,cursor:String(e),index:u,serializedBytes:m,maxPayloadBytes:s});if(o.length>=t||i+c>s)break;o.push(n[u]),i+=c}let a=e+o.length;return{items:o,nextCursor:a<n.length?String(a):null}}function Ku(n,e,t){let s=gn(n);if(s>e)throw hn(`payload exceeds the ${e} byte limit`,{...t,serializedBytes:s,maxPayloadBytes:e})}function gn(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(j("SESSION_STORE_TIMEOUT",`SessionStore ${n} timed out after ${e}ms`,t,n)),e)})])}catch(o){throw o instanceof Mt?o:j("SESSION_STORE_OPERATION_FAILED",o instanceof Error?o.message:String(o),t,n)}finally{r&&clearTimeout(r)}}function mn(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`);return n}function C(n){return j("SESSION_STORE_INVALID_REQUEST",n)}function hn(n,e){return j("SESSION_STORE_PAYLOAD_TOO_LARGE",n,!1,void 0,e)}function j(n,e,t=!1,s,r){return new Mt({code:n,message:e,retryable:t,operation:s,details:r})}var Bu=3e4;function $u(n,e=Bu){return Hu(e,"callbackTimeoutMs"),async t=>{switch(t.request.type){case"daemon.auth.fetch_job_token":return zu(n,t,e);case"daemon.auth.fetch_service_account_token":return Qu(n,t,e);default:throw M("METHOD_NOT_FOUND",`SDK has no handler for daemon method: ${t.request.type}`)}}}function Or(n){let e=$u(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 zu(n,e,t){if(n.type!=="jobToken")throw M("DAEMON_AUTH_CALLBACK_UNAVAILABLE","Host job token callback is not configured");let s=Dr(e,["reason","session_id"]),r=xr(s.reason),o=Gu(s.session_id,"session_id"),i=new AbortController;try{let a=await Nr(()=>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 q?a:M("DAEMON_AUTH_CALLBACK_FAILED","Host job token callback failed",!0)}}async function Qu(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=Dr(e,["reason","required_scopes"]);xr(s.reason),Ju(s.required_scopes,"required_scopes");let r=new AbortController;try{let o=await Nr(()=>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 q?o:M("DAEMON_AUTH_CALLBACK_FAILED","Host Service Account token callback failed",!0)}}function Dr(n,e){let t=Object.keys(n.request).find(s=>s!=="type"&&!e.includes(s));if(t)throw M("DAEMON_AUTH_INVALID_REQUEST",`request contains unknown field: ${t}`);return n.request}function xr(n){if(n!=="initial"&&n!=="unauthorized")throw M("DAEMON_AUTH_INVALID_REQUEST","reason must be initial or unauthorized");return n}function Gu(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 Ju(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 Nr(n,e,t){let s;try{return await Promise.race([Promise.resolve().then(n),new Promise((r,o)=>{s=setTimeout(()=>{t.abort(),o(new Error("daemon auth callback timed out"))},e),s.unref?.()})])}finally{s&&clearTimeout(s)}}function Hu(n,e){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError(`${e} must be a positive integer`)}function M(n,e,t=!1){return new q({code:n,message:e,retryable:t})}var Wu=3e4;function jr(n,e=Wu){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=Vu(t,["remote_session_id","extra"]),r=qr(s.remote_session_id,"remote_session_id"),o=s.extra===void 0?void 0:Yu(s.extra,"extra"),i;try{let a=await Promise.race([n({remoteSessionId:r,...o===void 0?{}:{extra:o}}),new Promise((c,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=qr(a.cwd,"cwd"),l=a.additionalDirectories;if(l!==void 0&&(!Array.isArray(l)||l.some(c=>typeof c!="string"||c.trim().length===0)))throw te("REMOTE_SESSION_LAUNCH_INVALID_RESULT","additionalDirectories must contain non-empty strings");return{cwd:u,...l===void 0?{}:{additional_directories:[...l]}}}catch(a){throw a instanceof q?a:te("REMOTE_SESSION_LAUNCH_FAILED",a instanceof Error?a.message:"resolveRemoteSessionLaunch() failed",!0)}finally{i&&clearTimeout(i)}}}function Vu(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 qr(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 Yu(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 q({code:n,message:e,retryable:t})}var Xu=[250,1e3,5e3];function Fr(n,e){let t=new yn(e.sync,e.retryDelaysMs??Xu);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 yn=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 Zu(s)}}}};function Zu(n){return new Promise(e=>{setTimeout(e,n).unref?.()})}var nl="QODER_AGENT_SDK_DAEMON",sl="QODER_AGENT_SDK_DAEMON_CAPACITY",rl="QODER_AGENT_SDK_DAEMON_IDLE_TIMEOUT_MS",ol="ELECTRON_RUN_AS_NODE",il=3e5,Ur=2e3,Lr=8192,Kr=255,$r=new WeakMap;function Rn(n){return $r.get(n)}async function al(n){cl(n.capacity);let e=n.workerIdleTimeoutMs??il;dl(e);let t=new H({auth:n.auth,env:n.env,proxy:n.proxy}),s=await t.prepare(),r=await gl(n.pathToQoderCLIExecutable),o={...s.env,...r.env,[nl]:"1",[sl]:String(n.capacity),[rl]:String(e)},i,a,u;try{i=await kn.spawn({command:r.command,args:r.args,cwd:n.cwd,env:o});let l;u=n.sessionStore?Fr(n.sessionStore,{sync:d=>{if(!l)throw new Error("Daemon connection is not ready");return l.syncSessionRegistrations(d)}}):void 0,a=u?Cr(u.store):void 0;let c=n.resolveRemoteSessionLaunch?jr(n.resolveRemoteSessionLaunch):void 0;l=new Tt({input:i.process.stdin,output:i.process.stdout,requestHandler:Or({auth:n.auth,...a?{sessionStoreHandler:a}:{},...c?{remoteSessionLaunchHandler:c}:{}})}),i.setConnection(l);let m=[...c?["remote_session_launch_v1"]:[],...!n.sessionStore||typeof n.sessionStore.delete=="function"?["session_delete_v1"]:[],...n.sessionStore?[cn,dn]:[]];await l.initialize(st,m),await t.cleanupAuthPayload();let p=new wn(l,i,a,u);return $r.set(p,{auth:n.auth,transportProvider:new bn(l,s.env,n.cwd),supportsSessionStoreFileCheckpointing:l.supportsCapability(cn),supportsSessionStoreForkBarrier:l.supportsCapability(dn),...u!==void 0?{sessionStore:u.store}:{}}),p}catch(l){throw await t.cleanupAuthPayload(),await i?.stop().catch(()=>{}),u?.dispose(),await a?.dispose().catch(()=>{}),l}}var wn=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(){if(this.currentState!=="ready")throw new Error("Daemon is not ready");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,He(s));return e}async fetchSessions(){return(await this.connection.listSessions()).map(Sn).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=ul(t),r=await this.connection.renameSession(e,s),o=Sn(r.session);return this.acceptSessionSnapshot(o),He(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=Sn(r.session);return this.knownSessions.has(e)&&this.acceptSessionSnapshot(o),He(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=ml(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 vn(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(),$s({transport:s,initialization:s.initializationResult(),...t.canUseTool?{canUseTool:t.canUseTool}:{},...t.onElicitation?{onElicitation:t.onElicitation}:{}})}catch(r){throw await s.close().catch(()=>{}),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(En(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"||!pl(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&&tl(t,e))return;let s=He(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(ll(e))}catch{}}};function He(n){return{...n,...n.extra===void 0?{}:{extra:structuredClone(n.extra)}}}function ul(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>Kr)throw new TypeError(`title must be at most ${Kr} characters`);return e}function Sn(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 ll(n){return"session"in n?{...n,session:He(n.session)}:{...n}}var vn=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)}}},bn=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 cl(n){if(!Number.isSafeInteger(n)||n<=0)throw new TypeError("capacity must be a positive integer")}function dl(n){if(!Number.isSafeInteger(n)||n<0)throw new TypeError("workerIdleTimeoutMs must be a non-negative integer")}function pl(n){return n==="pending"||n==="ready"||n==="inactive"||n==="failed"}function ml(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=fl(n.metadata);return{external_id:n.externalId,environment_type:n.environmentType,...n.name!==void 0?{name:n.name}:{},...e!==void 0?{metadata:e}:{}}}function fl(n){if(n!==void 0){if(!En(n))throw new TypeError("metadata must be a JSON object");return _n(n,"metadata",new Set),structuredClone(n)}}function _n(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)=>_n(s,`${e}[${r}]`,t));else{if(!En(n))throw new TypeError(`${e} must contain only JSON objects`);for(let[s,r]of Object.entries(n))_n(r,`${e}.${s}`,t)}t.delete(n)}}function En(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 gl(n){let e=Ie({pathToQoderCLIExecutable:n},ue),t,s={};if(e.transport==="worker"){let r=await ke(X(e.pathToQoderWorkerRuntime));t=r.runtimePath,s=r.env}else t=n??V();return ut(t)?{command:process.execPath,args:[t],env:{...s,...typeof process.versions.electron=="string"?{[ol]:"1"}:{}}}:{command:t,args:[],env:s}}var kn=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>Lr&&(this.stderrTail=this.stderrTail.slice(-Lr))}),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=el(e.command,e.args,{cwd:e.cwd,env:e.env,stdio:["pipe","pipe","pipe"]}),await yl(t)}catch(s){throw new D(`Failed to spawn Qoder CLI daemon: ${hl(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 Br(this.exited,Ur)&&(this.process.kill("SIGTERM"),!await Br(this.exited,Ur)&&(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 hl(n){return n instanceof Error?n.message:String(n)}async function yl(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 Br(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 Cn=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 Sl(n,e){if(e){if(n.transport!==void 0)throw new Error("options.transport cannot be combined with options.daemon.");let s=Rn(e);if(!s)throw new Error("options.daemon must be returned by startDaemon().");return s.transportProvider}if(n.transport!==void 0){if(ms(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=Ie(n,ue);return t.transport==="worker"?new Re({pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):be.default}function Pn(n){let{prompt:e,options:t={}}=n,s=t.daemon,r;if(s)r=wl(t);else if(t.extra!==void 0)throw new Error("options.extra requires options.daemon.");let o=s?Rn(s):void 0,i=o?.sessionStore??t.sessionStore,a=t.sessionStoreFlush??(o?.sessionStore!==void 0?"eager":"batched"),u=Sl(t,s),l=new gt({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");t.goalMaxTurns!==void 0&&Ee(t.goalMaxTurns);let c=o?.auth??t.auth;if(c==null)throw new Cn;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 Ys(t),Xs({prompt:e,options:t,diagnostics:l});let p=dr(t.memory),d=mr(t.evolution?.skill),g=t.onAuthExpired,h=!1,f=g?()=>{h||(h=!0,Promise.resolve(g()).catch(k=>{l.record("[query] onAuthExpired callback threw:",k)}))}:void 0,y=new Map,_=new Map,w=new Map,P={},T={},re={};if(t.mcpServers)for(let[k,K]of Object.entries(t.mcpServers)){let ie=K.tools;if(Array.isArray(ie)&&ie.length>0&&(T[k]=ie),K.type==="sdk"&&"instance"in K&&K.instance){let we=K.instance;if(y.set(k,we),ie){let tt=Ft(k,ie);tt&&(re[k]=tt)}let Qn=new St(tt=>{Es(k,tt,w)});_.set(k,Qn),we.connect(Qn).catch(()=>{})}else P[k]=K}let b=Object.keys(P).length>0,oe=Object.keys(T).length>0,Ze=t.pathToQoderCLIExecutable,Ro=t.env,Eo=c?.type==="jobToken"?c.fetchJobToken:void 0,Co=c?.type==="serviceAccount"?c.fetchServiceAccountToken:void 0,et={pathToQoderCLIExecutable:Ze,executable:t.executable,executableArgs:t.executableArgs,env:Ro,proxy:t.proxy,vpcEndpoint:t.vpcEndpoint,cwd:t.cwd,closeGraceMs:t.closeGraceMs,auth:s?void 0:c,model:t.model,agent:t.agent,debug:t.debug,diagnostics:l,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:b?P:void 0,mcpToolPolicies:oe?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:f},Bn=i!==void 0&&(t.resume!==void 0||t.continue===!0)?new ft(async()=>{let k=await bt({store:i,cwd:t.cwd,resume:t.resume,continue:t.continue,loadTimeoutMs:t.loadTimeoutMs,env:t.env});if(!k)return{transport:dt(u,{...et,continue:!1})};try{return{transport:dt(u,{...et,env:{...et.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}}):dt(u,et);Bn.initialize().catch(()=>{});let Po=typeof e=="string",Se=t.systemPrompt,$n,zn;if(typeof Se=="string")$n=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)}`);zn=k.append}let To={systemPrompt:$n,appendSystemPrompt:zn,modelRequestPatches:t.modelRequestPatches,agents:t.agents,skills:Array.isArray(t.skills)?t.skills:void 0,planMode:s!==void 0?t.planMode??!1:t.planMode,promptSuggestions:t.promptSuggestions,goalMaxTurns:t.goalMaxTurns,enableFileCheckpointing:t.enableFileCheckpointing,memory:p.config,evolution:d.config?{skill:d.config}:void 0,customContext:t.customContext,requireSessionStoreForkBarrier:m,...s!==void 0?{independentPlanModeControls:!0,permissionMode:r}:{}},qt=new $e(Bn,Po,t.canUseTool,t.hooks,t.abortController,y,To,t.onElicitation,l,f,t.controlRequestTimeoutMs,_,w,Eo,t.resolveModel,t.resolveModelTimeoutMs,i,a,re,Co,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};qt.streamInput(async function*(){yield k}())}else qt.streamInput(e);return qt}function wl(n){if(n.planMode!==void 0&&typeof n.planMode!="boolean")throw new TypeError("options.planMode must be a boolean.");let e=Be(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 Tn=class{resolvePrompt;prompt=new Promise(e=>{this.resolvePrompt=e});settled=!1;activate(e){if(this.settled)throw new Error("WarmQuery can only be queried once");this.settled=!0,this.resolvePrompt(e)}discard(){this.settled||(this.settled=!0,this.resolvePrompt(void 0))}async*[Symbol.asyncIterator](){let e=await this.prompt;if(e!==void 0){if(typeof e=="string"){yield{type:"user",message:{role:"user",content:[{type:"text",text:e}]},parent_tool_use_id:null};return}yield*e}}},Mn=class{constructor(e,t){this.session=e;this.gate=t}used=!1;closed=!1;query(e){if(this.closed)throw new Error("WarmQuery is closed");if(this.used)throw new Error("WarmQuery can only be queried once");return this.used=!0,this.gate.activate(e),this.session}close(){this.closed||(this.closed=!0,this.gate.discard(),this.session.close())}async[Symbol.asyncDispose](){this.closed||(this.closed=!0,this.gate.discard()),await this.session.close()}};async function vl(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 Tn,s=Pn({prompt:t,options:n.options}),r;try{return await Promise.race([s.initializationResult(),new Promise((o,i)=>{r=setTimeout(()=>{i(new Error(`Qoder Agent SDK startup timed out after ${e}ms while waiting for qodercli initialization. Check authentication and network connectivity, then retry.`))},e)})]),new Mn(s,t)}catch(o){throw t.discard(),await s.close(),o}finally{r!==void 0&&clearTimeout(r)}}import{readFile as bl}from"node:fs/promises";import _l from"node:os";import L from"node:path";var kl=["user","project","local"],On=new Set(["__proto__","constructor","prototype"]),Rl=/^[\p{L}\p{N}\p{M}._ -]+$/u,El=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu,Cl=new Set([".git",".svn",".hg",".vscode",".idea",".husky",".github","node_modules","bower_components"]),Pl=new Set(["mcpServers","providers","skillOverrides","enabledPlugins","extraKnownMarketplaces","pluginConfigs"]),Tl=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 Ml(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],l=e[a+1];if(o){u===`
|
|
20
|
+
`||u==="\r"?(o=!1,t+=u):t+=" ";continue}if(i){u==="*"&&l==="/"?(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==="/"&&l==="/"?(o=!0,t+=" ",a+=1):u==="/"&&l==="*"?(i=!0,t+=" ",a+=1):t+=u}return t}function Il(n,e){let t;try{t=JSON.parse(Ml(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 It(t)}function xe(n){return Array.isArray(n)?n.map(xe):he(n)?It(n):n}function It(n){let e={};for(let[t,s]of Object.entries(n))On.has(t)||s===void 0||(e[t]=xe(s));return e}function Al(n){let e=n.join(".");if(Pl.has(e)||n.length===2&&n[0]==="providers")return"shallow";if(Tl.has(e))return"union";if(n.length===2&&n[0]==="hooks")return"concat"}function An(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=Al(o);if(a==="shallow"&&i&&r){let u={};he(i)&&Object.assign(u,It(i)),he(r)&&Object.assign(u,It(r)),n[s]=u;continue}if(Array.isArray(i)){let u=Array.isArray(r)?r:[r];if(a==="concat"){n[s]=[...i.map(xe),...u.map(xe)];continue}if(a==="union"){n[s]=[...new Set([...i,...u])].map(xe);continue}}if(he(i)&&he(r))An(i,r,o);else if(he(r)){let u={};An(u,r,o),n[s]=u}else n[s]=xe(r)}}function Ol(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===".."||!Rl.test(t)||El.test(t))throw new Error(`${v.configDirNameEnv} must be a valid directory name`);if(Cl.has(t.toLowerCase()))throw new Error(`${v.configDirNameEnv} must not use a protected directory name`);return{user:t,project:t}}async function In(n,e){let t;try{t=await bl(e,"utf8")}catch(s){if(s.code==="ENOENT")return;throw s}return{source:n,path:L.resolve(e),settings:Il(t,L.resolve(e))}}async function Dl(n={}){let e=L.resolve(n.cwd??process.cwd()),t=process.env,s=Ol(t),r=t[v.cliHomeEnv]??t.GEMINI_CLI_HOME,o=r?L.resolve(e,r):_l.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??kl),l=L.resolve(o)===e,c=[];if(u.has("user")){let d=await In("user",L.join(i,"settings.json"));d&&c.push(d)}if(u.has("project")&&!l){let d=await In("project",L.join(a,"settings.json"));d&&c.push(d)}if(u.has("local")&&!l){let d=await In("local",L.join(a,"settings.local.json"));d&&c.push(d)}let m={},p={};for(let d of c){An(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:c}}import{McpServer as xl}from"@modelcontextprotocol/sdk/server/mcp.js";function Nl(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 xl({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.`);jt(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 ql(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 Dn,readFile as Ot,stat as Ne,appendFile as Vr,realpath as jl,rm as zr}from"fs/promises";import{basename as Fl,join as I,resolve as Qr}from"path";import{execFile as Ul}from"child_process";import{randomUUID as Yr}from"crypto";import{promisify as Ll}from"util";var Kl=Ll(Ul),Bl=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Xr=new Set(["user","assistant","system","progress","attachment"]);function A(n){return n!==null&&typeof n=="object"}function ye(n){return Bl.test(n)}function $l(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"&&Xr.has(r.type)&&e.push(r)}catch{}}return e}function zl(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 At(n){if(!A(n.message))return[];let e=n.message.content;return Array.isArray(e)?e:[]}var Ql=new Set(["user-rejected","permission-rule","automode-blocked","automode-unavailable","automode-parsing-error","interrupted","cancelled"]);function Gl(n){return typeof n=="string"&&Ql.has(n)?n:void 0}function xn(n){if(n.type!=="user")return;let e=At(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=Gl(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 We(n){if(n.type!=="assistant"||!A(n.message))return;let e=n.message.id;return typeof e=="string"&&e?e:void 0}function Zr(n){return n.type!=="user"||!n.parentUuid?!1:At(n).some(e=>A(e)&&e.type==="tool_result")}function Jl(n){if(!A(n.message))return null;let e=n.message.id;return typeof e=="string"&&e.length>0?e:null}function Hl(n,e){let t=new Map;for(let[s,r]of n){let o=Jl(r);if(o){let i=t.get(o);i?i.push(s):t.set(o,[s])}}for(let[s,r]of n){let o=Wl(r,r.parentUuid,n,t,e);o!==r.parentUuid&&n.set(s,{...r,parentUuid:o})}}function Wl(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]:Vl(n,o,t)??Yl(n,o,t,r)??e}function Vl(n,e,t){if(!Zr(n))return;let s=At(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?At(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 Yl(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 Xl(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 Gr(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 Zl(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=We(p);d&&i.set(d,p)}let a=new Map,u=new Map;for(let p of n.values()){let d=We(p);if(d){let g=a.get(d)??[];g.push(p),a.set(d,g);continue}if(Zr(p)&&p.parentUuid){let g=u.get(p.parentUuid)??[];g.push(p),u.set(p.parentUuid,g)}}let l=new Set,c=new Map;for(let p of s){let d=We(p);if(!d||l.has(d))continue;l.add(d);let g=a.get(d)??[p],h=g.filter(b=>!t.has(b.uuid)),f=[];for(let b of g){let oe=u.get(b.uuid)??[];for(let Ze of oe)t.has(Ze.uuid)||f.push(Ze)}if(h.length===0&&f.length===0)continue;let y=i.get(d);if(!y)continue;let _=[...g].sort((b,oe)=>Gr(b,oe,r));f.sort((b,oe)=>Gr(b,oe,r));let w=_.findIndex(b=>b.uuid===y.uuid),P=_.slice(0,Math.max(w,0)).filter(b=>!t.has(b.uuid)),T=_.slice(w+1).filter(b=>!t.has(b.uuid)),re=[...P,...T,...f];for(let b of re)t.add(b.uuid);c.set(y.uuid,re)}if(c.size===0)return e;let m=[];for(let p of e){let d=c.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"&&We(y)===We(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 eo(n,e,t="runtime"){if(n.length===0)return[];let s=new Map,r=new Map;for(let[c,m]of n.entries())s.set(m.uuid,m),r.set(m.uuid,c);t==="runtime"&&Xl(s),Hl(s,r);let o;if(e?.leafUuid===null)return[];if(e){let c=s.get(e.leafUuid),m=c?.sessionId??c?.session_id;c&&(m===void 0||m===e.sessionId)&&(o=c)}if(!o){let c=new Set;for(let h of s.values())h.parentUuid&&c.add(h.parentUuid);let m=Array.from(s.values()).filter(h=>!c.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 c=t==="historical"&&u.type==="system"&&u.subtype==="compact_boundary"?u.logicalParentUuid??u.parentUuid:u.parentUuid;u=c?s.get(c):void 0}i.reverse();let l=t==="runtime"?ec(i):i;return Zl(s,l,new Set(l.map(c=>c.uuid)))}function ec(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 tc(n){return n.isCompactSummary===!0||n.type==="system"&&n.subtype==="compact_boundary"}function Nn(n,e,t){let s=n.flatMap(o=>A(o)&&typeof o.uuid=="string"&&typeof o.type=="string"&&Xr.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 eo(s,r,t)}function Jr(n,e,t){if(t==="historical"&&tc(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 nc(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 qn(n){return n.type==="assistant"&&n.isApiErrorMessage===!0?{isApiErrorMessage:!0}:{}}function jn(n){return n.type==="user"&&n.toolUseResult!==void 0?{tool_use_result:n.toolUseResult}:{}}function Hr(n){let e=n.type==="system"?nc(n.compactMetadata):void 0,t=xn(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,...qn(n),...jn(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 Wr(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 Dt(n){try{return await jl(Qr(n))}catch{return Qr(n)}}async function sc(n){return N(await Dt(n))}async function ne(n){let e=Me();if(n?.dir){let t=await Dt(n.dir),s=[I(e,N(t))];if(n.includeWorktrees!==!1)try{let{stdout:r}=await Kl("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(I(e,await sc(i)))}catch{}return s}try{return(await Dn(e,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>I(e,s.name))}catch{return[]}}async function to(n){try{let[e,t]=await Promise.all([Ot(n,"utf-8"),Ne(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=Fl(n,".jsonl");return Fn(r,s,t.mtimeMs,{fileSize:t.size})??null}catch{return null}}function no(n,e){return I(n,e,"subagents")}function so(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 ro(n){let e=[];async function t(s){let r;try{r=await Dn(s,{withFileTypes:!0})}catch{return}for(let o of r){let i=I(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 rc(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 oo(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 oc(n,e,t){let[s,r]=await Promise.all([Ot(n,"utf-8"),rc(n)]),o=[];for(let c of s.trim().split(`
|
|
26
|
+
`).filter(Boolean))try{let m=JSON.parse(c);so(m)&&o.push(m)}catch{}let a=oo(o).map(c=>{let m=xn(c);return{type:c.type,uuid:c.uuid,session_id:c.sessionId??e,message:c.message,parent_tool_use_id:r.parentToolUseId,parent_agent_id:r.parentAgentId,...qn(c),...jn(c),...m?{tool_result_meta:m}:{}}}),u=t?.offset??0,l=t?.limit;return l!==void 0?a.slice(u,u+l):a.slice(u)}async function qe(n){return N(await Dt(n??process.cwd()))}function Ve(n,e){return{projectKey:n,sessionId:e}}function ic(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 ac(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 uc=/[\p{Cf}\p{Co}\p{Cn}\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff\ue000-\uf8ff]/gu;function lc(n){let e=n;for(let t=0;t<10;t+=1){let s=e.normalize("NFKC").replace(uc,"");if(s===e)return s;e=s}return e}var cc=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/,dc=/<command-name>(.*?)<\/command-name>/,pc=/<bash-input>([\s\S]*?)<\/bash-input>/;function mc(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 fc(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=dc.exec(i);if(a){e.commandFallback??=a[1];continue}let u=pc.exec(i);if(u)return`! ${u[1].trim()}`;if(!cc.test(i))return mc(i)}}function Fn(n,e,t,s={}){if(e.length===0)return;let r,o,i,a,u,l,c,m,p,d,g;for(let _ of e){let w=_;if(g??=w.isSidechain===!0,d===void 0&&typeof w.timestamp=="string"){let P=Date.parse(w.timestamp);Number.isFinite(P)&&(d=P)}if(!r){let P={commandFallback:o};r=fc(w,P),o=P.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"&&(l=w.summary),w.type==="tag"&&(p=typeof w.tag=="string"&&w.tag?w.tag:void 0),typeof w.gitBranch=="string"&&(c=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||l||h;if(y)return{sessionId:n,summary:y,lastModified:t??ic(e),fileSize:s.fileSize,customTitle:f,firstPrompt:h,gitBranch:c,cwd:m||s.defaultCwd,tag:p,createdAt:d}}async function io(n,e,t){let s=Ve(await qe(t),e),r=await n.load(s);return r?{key:s,entries:r}:void 0}async function gc(n){if(n?.sessionStore){let l=n.sessionStore;if(!l.listSessions)throw new Error("sessionStore.listSessions() is required by listSessions()");let c=await Dt(n.dir??process.cwd()),m=N(c),p=(await l.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 _=await l.load(Ve(m,f));return _?Fn(f,_,y,{defaultCwd:c}):void 0}))).flatMap((f,y)=>{if(f.status==="fulfilled")return f.value?[f.value]:[];let _=g[y];return[{sessionId:_.sessionId,summary:"",lastModified:_.mtime}]})}let e=await ne(n),s=(await Promise.all(e.map(async l=>{try{return(await Dn(l)).filter(m=>m.endsWith(".jsonl")).map(m=>I(l,m))}catch{return[]}}))).flat(),r=await Promise.all(s.map(to)),o=new Map;for(let l of r){if(!l)continue;let c=o.get(l.sessionId);(!c||l.lastModified>c.lastModified)&&o.set(l.sessionId,l)}let i=Array.from(o.values()).sort((l,c)=>c.lastModified-l.lastModified),a=n?.offset??0,u=n?.limit;return u!==void 0?i.slice(a,a+u):i.slice(a)}async function hc(n,e){if(e?.sessionStore){if(!ye(n))return;let s=await io(e.sessionStore,n,e.dir);return s?Fn(n,s.entries,ac(s.entries)):void 0}let t=await ne(e);for(let s of t){let r=I(s,`${n}.jsonl`),o=await to(r);if(o)return o}}async function yc(n,e){if(!ye(n))return[];let t=e?.includeSystemMessages===!0,s=e?.view??"runtime";if(e?.sessionStore){let o=await io(e.sessionStore,n,e.dir);if(!o)return[];let i=Nn(o.entries,n,s);return Wr(i.filter(a=>Jr(a,t,s)).map(Hr),e)}let r=await ne(e);for(let o of r){let i=I(o,`${n}.jsonl`);try{let a=await Ot(i,"utf-8"),l=eo($l(a),zl(a,n),s).filter(c=>Jr(c,t,s)).map(Hr);return Wr(l,e)}catch{continue}}return[]}async function Sc(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(Ve(await qe(t.dir),n),[{type:"custom-title",sessionId:n,customTitle:s,uuid:Yr(),timestamp:new Date().toISOString()}]);return}let r=await ne(t);for(let o of r){let i=I(o,`${n}.jsonl`);try{await Ne(i);let a=JSON.stringify({type:"custom-title",sessionId:n,customTitle:s,timestamp:new Date().toISOString()});await Vr(i,a+`
|
|
28
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function wc(n,e,t){if(!ye(n))throw new Error(`Invalid sessionId: ${n}`);let s=e===null?null:lc(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(Ve(await qe(t.dir),n),[{type:"tag",sessionId:n,tag:s??"",uuid:Yr(),timestamp:new Date().toISOString()}]);return}let r=await ne(t);for(let o of r){let i=I(o,`${n}.jsonl`);try{await Ne(i);let a=JSON.stringify({type:"tag",sessionId:n,tag:s??"",timestamp:new Date().toISOString()});await Vr(i,a+`
|
|
29
|
+
`);return}catch{continue}}throw new Error(`Session ${n} not found`)}async function vc(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 qe(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=I(s,`${n}.jsonl`);try{await Ne(r);let o=await ro(no(s,n));return Array.from(new Set(o.map(i=>i.agentId)))}catch{continue}}return[]}async function bc(n,e,t){if(t?.sessionStore){if(!ye(n)||!e)return[];let r=await qe(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(so),u=i.filter(d=>d.type==="agent_metadata").at(-1),l=typeof u?.toolUseId=="string"?u.toolUseId:null,c=typeof u?.parentAgentId=="string"?u.parentAgentId:null,m=oo(a).map(d=>{let g=xn(d);return{type:d.type,uuid:d.uuid,session_id:d.sessionId??n,message:d.message,parent_tool_use_id:l,parent_agent_id:c,...qn(d),...jn(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=I(r,`${n}.jsonl`);try{await Ne(o);let a=(await ro(no(r,n))).find(u=>u.agentId===e);return a?await oc(a.filePath,n,t):[]}catch{continue}}return[]}async function _c(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(Ve(await qe(e.dir),n));return}let t=await ne(e);for(let s of t){let r=I(s,`${n}.jsonl`);try{await Ne(r),await Promise.all([zr(r,{force:!0}),zr(I(s,n),{recursive:!0,force:!0})]);return}catch{continue}}throw new Error(`Session ${n} not found`)}import{randomUUID as xt}from"crypto";import{readdir as kc,readFile as Rc,realpath as Ec,stat as ao,writeFile as Cc}from"fs/promises";import{dirname as Pc,join as Un,resolve as Tc}from"path";var uo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Mc=new Set(["user","assistant","attachment","system","progress"]);async function co(n){let e=Tc(n);try{return await Ec(e)}catch{return e}}async function Ic(n,e){let t=Me();if(e){let r=N(await co(e)),o=Un(t,r,`${n}.jsonl`);try{if((await ao(o)).size>0)return o}catch{}return}let s;try{s=await kc(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=Un(t,r.name,`${n}.jsonl`);try{if((await ao(o)).size>0)return o}catch{}}}function po(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:Nn(n,e,"historical").filter(o=>Mc.has(o.type)),contentReplacements:t,relocatedCwd:s}}function Ac(n,e){let t=[];for(let s of n.split(`
|
|
30
|
+
`))if(s.trim())try{t.push(JSON.parse(s))}catch{}return po(t,e)}function Oc(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 Dc(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??Oc(n)}function lo(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,xt()])),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])),l=xt(),c=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,_={...d,...d.type==="system"&&d.subtype==="model_refusal_fallback"?{neutralizedByFork:!0}:{},uuid:i.get(d.uuid),parentUuid:h,logicalParentUuid:y,sessionId:l,timestamp:g===a.length-1?c:typeof d.timestamp=="string"?d.timestamp:c,isSidechain:!1,forkedFrom:{sessionId:e,messageUuid:d.uuid}};return delete _.teamName,delete _.agentName,delete _.sessionKind,delete _.slug,delete _.sourceToolAssistantUUID,_});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:l,replacements:d,uuid:xt(),timestamp:c})}n.relocatedCwd&&m.push({type:"relocated",sessionId:l,relocatedCwd:n.relocatedCwd});let p=t.title?.trim();return m.push({type:"custom-title",sessionId:l,customTitle:p||`${Dc(s)??"Forked session"} (fork)`,uuid:xt(),timestamp:c}),{sessionId:l,entries:m}}async function xc(n,e={}){if(!uo.test(n))throw new Error(`Invalid sessionId: ${n}`);if(e.upToMessageId&&!uo.test(e.upToMessageId))throw new Error(`Invalid upToMessageId: ${e.upToMessageId}`);if(e.sessionStore){let i=await co(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 l=lo(po(u,n),n,e,u);return await e.sessionStore.append({projectKey:a,sessionId:l.sessionId},l.entries),{sessionId:l.sessionId}}let t=await Ic(n,e.dir);if(!t)throw new Error(`Session ${n} not found`);let s=await Rc(t,"utf8"),r=s.split(`
|
|
32
|
+
`).filter(i=>i.trim()).flatMap(i=>{try{return[JSON.parse(i)]}catch{return[]}}),o=lo(Ac(s,n),n,e,r);return await Cc(Un(Pc(t),`${o.sessionId}.jsonl`),`${o.entries.map(i=>JSON.stringify(i)).join(`
|
|
33
33
|
`)}
|
|
34
|
-
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function
|
|
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(
|
|
34
|
+
`,{flag:"wx",mode:384}),{sessionId:o.sessionId}}function Nt(n){return JSON.stringify([n.projectKey,n.sessionId,n.subpath??null])}var Ln=class{entries=new Map;keys=new Map;modifiedAt=new Map;lastModifiedAt=0;async append(e,t){if(t.length===0)return;let s=Nt(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(Nt(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(Nt(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(Nt(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 Nc}from"fs";import{readdir as ho,readFile as qc,realpath as jc,stat as mo}from"fs/promises";import{basename as fo,dirname as Fc,join as Ye,relative as Uc,resolve as Lc,sep as Kc}from"path";import{createInterface as Bc}from"readline";var $c=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,zc=500,Qc=1024*1024;async function Gc(n){let e=Lc(n);try{return await jc(e)}catch{return e}}async function Jc(n,e){let t=Me();if(e){let r=N(await Gc(e)),o=Ye(t,r,`${n}.jsonl`);try{if((await mo(o)).size>0)return{filePath:o,projectKey:r}}catch{}return}let s;try{s=await ho(t,{withFileTypes:!0})}catch{return}for(let r of s){if(!r.isDirectory()&&!r.isSymbolicLink())continue;let o=Ye(t,r.name,`${n}.jsonl`);try{if((await mo(o)).size>0)return{filePath:o,projectKey:r.name}}catch{}}}async function Hc(n){let e=[];async function t(s){let r;try{r=await ho(s,{withFileTypes:!0})}catch{return}r.sort((o,i)=>o.name.localeCompare(i.name));for(let o of r){let i=Ye(s,o.name);o.isDirectory()?await t(i):o.isFile()&&o.name.endsWith(".jsonl")&&e.push(i)}}return await t(n),e}async function go(n,e,t,s){let r=Bc({input:Nc(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(l){console.warn(`importSessionToStore: skipping unparseable line in ${n}: ${String(l)}`);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>=Qc)&&(await t.append(e,o),o=[],i=0)}o.length>0&&await t.append(e,o)}async function Wc(n,e,t={}){if(!$c.test(n))throw new Error(`Invalid sessionId: ${n}`);let s=await Jc(n,t.dir);if(!s)throw new Error(`Session ${n} not found`);let r=t.batchSize!==void 0&&t.batchSize>0?t.batchSize:zc;if(await go(s.filePath,{projectKey:s.projectKey,sessionId:n},e,r),t.includeSubagents===!1)return;let o=s.filePath.replace(/\.jsonl$/,""),i=Ye(o,"subagents");for(let a of await Hc(i)){let l=Uc(o,a).split(Kc);l[l.length-1]=fo(l[l.length-1],".jsonl");let c={projectKey:s.projectKey,sessionId:n,subpath:l.join("/")};await go(a,c,e,r);let m=Ye(Fc(a),`${fo(a,".jsonl")}.meta.json`);try{let p=JSON.parse(await qc(m,"utf8"));await e.append(c,[{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 Vc}from"node:child_process";import{existsSync as Yc}from"node:fs";import{Worker as Xc}from"node:worker_threads";var Kn=3e4;async function yo(n,e={}){let t=Ie({pathToQoderCLIExecutable:e.pathToQoderCLIExecutable},ue);return t.transport==="worker"?ed(n,{...e,pathToQoderWorkerRuntime:t.pathToQoderWorkerRuntime}):Zc(n,{...e,pathToQoderCLIExecutable:e.pathToQoderCLIExecutable??V()})}function Zc(n,e){return new Promise((t,s)=>{let r=Vc(e.pathToQoderCLIExecutable,n,{cwd:e.cwd,env:So(e.env),stdio:["ignore","pipe","pipe"],signal:e.signal}),o="",i="",a=!1,u=setTimeout(()=>{a||(a=!0,r.kill("SIGTERM"),s(wo(e.timeoutMs)))},e.timeoutMs??Kn);r.stdout.on("data",l=>{o+=l.toString()}),r.stderr.on("data",l=>{i+=l.toString()}),r.on("error",l=>{a||(a=!0,clearTimeout(u),s(l))}),r.on("close",l=>{a||(a=!0,clearTimeout(u),t({stdout:o,stderr:i,exitCode:l??1}))})})}async function ed(n,e){nd(e.signal);let t=X(e.pathToQoderWorkerRuntime),s=await ke(t);td(s);let r=e.cwd??process.cwd(),o=So(e.env);delete o.NODE_OPTIONS;let i=mt(s,{cwd:r,env:o});return new Promise((a,u)=>{let l=new Xc(s.runtimePath,{argv:n,env:i.env,execArgv:[],stdin:!0,stdout:!0,stderr:!0,workerData:i.workerData}),c="",m="",p=!1,d,g=l.stdout===null,h=l.stderr===null,f=()=>{clearTimeout(P),e.signal?.removeEventListener("abort",w)},y=T=>{p||(p=!0,f(),u(T))},_=()=>{p||d===void 0||!g||!h||(p=!0,f(),a({stdout:c,stderr:m,exitCode:d}))},w=()=>{l.terminate(),y(vo(e.signal))},P=setTimeout(()=>{l.terminate(),y(wo(e.timeoutMs))},e.timeoutMs??Kn);l.stdin?.end(),l.stdout?.on("data",T=>{c+=T.toString()}),l.stdout?.on("end",()=>{g=!0,_()}),l.stderr?.on("data",T=>{m+=T.toString()}),l.stderr?.on("end",()=>{h=!0,_()}),l.once("error",y),l.once("exit",T=>{d=T,_()}),e.signal?.addEventListener("abort",w,{once:!0}),e.signal?.aborted&&w()})}function So(n){let e={...process.env,...n},t={};for(let[s,r]of Object.entries(e))r!==void 0&&(t[s]=r);return t}function td(n){if(!Yc(n.runtimePath))throw new Error(`Qoder worker runtime not found: ${n.runtimePath}`)}function wo(n){return new Error(`qodercli subprocess timed out after ${n??Kn}ms`)}function nd(n){if(n?.aborted)throw vo(n)}function vo(n){if(n?.reason instanceof Error)return n.reason;let e=new Error("The operation was aborted");return e.name="AbortError",e}async function sd(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 rd(n,e){let t=["plugins","enable",n];e?.scope&&t.push("--scope",e.scope);let s=await je(t,e);s.exitCode!==0&&Xe(s)}async function od(n,e){let t=["plugins","disable",n];e?.scope&&t.push("--scope",e.scope);let s=await je(t,e);s.exitCode!==0&&Xe(s)}async function id(n,e){let t=await je(["plugins","install",n,"--scope","user","--json"],e);t.exitCode!==0&&Xe(t);let s=JSON.parse(t.stdout);return{pluginId:s.pluginId,version:s.version??"local",path:s.path}}async function ad(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&&Xe(s);let r=JSON.parse(s.stdout);return{pluginId:r.pluginId,fullyRemoved:r.fullyRemoved,reverseDependents:r.reverseDependents??[]}}async function ud(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=ld(`${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(dd(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&&Xe(t),se("plugin_validation_protocol_error","qodercli returned an unrecognized plugin validation response.")}function ld(n){return/unknown option[^\n]*--json/i.test(n)||/unknown command[^\n]*validate/i.test(n)}var cd=3e4;function je(n,e){return yo(n,{pathToQoderCLIExecutable:e?.cliPath,cwd:e?.cwd,env:e?.env,signal:e?.signal,timeoutMs:cd})}function Xe(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 dd(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 pd}from"child_process";function md(){return V()}async function fd(n,e){if(!n.content)return{success:!1,message:"Feedback content is required"};let t=e?.cliPath??md(),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=>{pd(t,r,{env:e?.env??process.env,timeout:s,maxBuffer:1024*1024},(i,a)=>{let u=a.trim();if(u)try{let l=JSON.parse(u);o({success:!!l.success,message:l.success?l.message||"Feedback submitted successfully":l.error||l.message||"Failed to submit feedback",requestId:l.request_id});return}catch{}o(i?{success:!1,message:i.message||"Failed to submit feedback"}:{success:!0,message:u||"Feedback submitted successfully"})})})}var ko={};Io(ko,{filterEscalatingDefaultMode:()=>bo,isBashToolBackgroundLaunchResult:()=>_o});var gd=new Set(["bypassPermissions","yolo","auto","acceptEdits"]);function bo(n){let e=n.effective.permissions?.defaultMode;if(!e||!gd.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 _o(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,ot as AuthAccessTokenEnvVarError,it as AuthServiceAccountEnvVarError,Ke as ControlRequestError,Xn as DEFAULT_ACCESS_TOKEN_ENV_VAR,ue as DEFAULT_RUNTIME_TRANSPORT,rt as DEFAULT_SERVICE_ACCOUNT_ENV_VAR,Er as DEFAULT_SESSION_STORE_MAX_PAYLOAD_BYTES,Oe as DaemonRpcError,Oo as EXIT_REASONS,Ao as HOOK_EVENTS,Ln as InMemorySessionStore,_t as MAX_SKILL_EVOLUTION_REVIEW_THRESHOLD,Le as ModelPolicyTimeoutError,be as ProcessTransport,W as ProtocolVersionMismatchError,D as QoderCliProcessError,ce as QoderWorkerRuntimeError,Q as UnsupportedCliCapabilityError,Jt as WIRE_PROTOCOL_VERSION,Re as WorkerTransport,Fo as accessToken,Uo as accessTokenFromEnv,ko as coreTypes,Nl as createSdkMcpServer,_c as deleteSession,od as disablePlugin,rd as enablePlugin,bo as filterEscalatingDefaultMode,xc as forkSession,hc as getSessionInfo,yc as getSessionMessages,bc as getSubagentMessages,_s as hasResolvableQoderWorkerRuntime,Wc as importSessionToStore,id as installPlugin,_o as isBashToolBackgroundLaunchResult,$o as jobToken,sd as listPlugins,gc as listSessions,vc as listSubagents,Au as measureSessionStoreEntryPayloadBytes,Lo as qodercliAuth,Pn as query,Sc as renameSession,X as resolveQoderWorkerRuntimePath,Dl as resolveSettings,Ko as serviceAccount,Bo as serviceAccountFromEnv,al as startDaemon,vl as startup,fd as submitFeedback,wc as tagSession,ql as tool,ad as uninstallPlugin,ud as validatePlugin};
|